


imagem 

Temos a seguinte classe que representa um usuário no nosso sistema:

java

Para salvar um novo usuário, várias validações são feitas, como por exemplo: Ver se o nome só contém letras, [**o CPF só números**] e ver se o usuário possui no mínimo 18 anos. Veja o método que faz essa validação:

java 

Suponha agora que eu tenha outra classe, a classe `Produto`, que contém um atributo nome e eu quero fazer a mesma validação que fiz para o nome do usuário: Ver se só contém letras. E aí? Vou criar outro método para fazer a mesma validação? Ou criar uma interface ou uma classe que tanto `Usuario` quanto `Produto` estendem? Não faz muito sentido né? Como resolver esse caso sem repetir código?

## Anotações

No Java 5 um novo recurso foi introduzido à linguagem, as anotações. Elas permitem que metadados sejam escritos diretamente no código.

Metadados são, por definição, dados que fazem referência aos próprios dados.

Para nos ajudar a entender o conceito de metadados vou usar a definição feita pelo autor Eduardo Guerra no livro [**Componentes Reutilizáveis em Java com Reflexão e Anotações**]:

> "_No contexto da orientação a objetos, os metadados são informações sobre os_

_elementos do código. Essas informações podem ser definidas em qualquer meio,_

_bastando que o software ou componente as recupere e as utilize para agregar novas_

_informações nos elementos do código."_

Perceba que, por si só, anotações não fazem nada. Elas precisam que a aplicação as recupere e as utilize, para que, só assim, elas consigam nos fornecer algo que possamos usar para realizar alguma tarefa.

Voltando ao nosso problema, vamos criar uma anotação para validar a idade mínina do usuário. Para isso, vamos anotar nossa classe:

java

Se olharmos nosso código perceberemos que ele não compila, pois falta implementarmos a anotação `@IdadeMinina`. Logo, precisamos criar uma nova classe com o nome IdadeMinima:

java 

Mas, pensando bem, estamos criando uma classe? Não estamos! Portanto, a nomenclatura é diferente para uma anotação. A forma correta seria:

java 

Estranho, né? Mas foi o jeito que o pessoal do Java fez para falar que esse arquivo se trata de uma anotação.

Agora temos que anotar nossa interface com algumas anotações obrigatórias para que o Java entenda onde e quando sua anotação pode ser utilizada, sendo elas:

- @Retention - Aqui nós falaremos para a nossa aplicação até quando nossa anotação estará disponível.
    
- @Target - Aqui passaremos os elementos que podem ser anotados com essa anotação.
    

Até onde nossa anotação estará disponível? Precisamos que ela seja executada quando o usuário enviar os seus dados, e isso acontece quando nossa aplicação está rodando, logo precisamos dela em tempo de execução, _Runtime_:

java 

E quem será anotado? Que elemento faz sentido ser anotado com uma anotação que verifica se o usuário tem idade suficiente? Um atributo, certo? Logo, um _Field:_

java 

Agora que já especificamos o contexto da nossa anotação, precisamos falar qual a idade mínima que a nossa anotação deve usar para validar a idade do usuário, para isso, vamos criar uma propriedade na nossa anotação chamada `valor`

java 

Nossa anotação está completa, vamos agora anotar o atributo `dataNascimento` da classe `Usuário` com ela:

java

Fazendo apenas isso, receberemos um erro de compilação. Precisamos passar a idade mínima para a nossa anotação, logo:

java

Para validar essa anotação vamos criar um usuário e passar para um método `validador()`:

java

Agora vamos criar o método `validador()` que retornará um `boolean`

java 

O problema de criar nosso método dessa forma é que novamente estamos nos limitando a validar apenas usuários, só que nossa meta é validar qualquer objeto.

Para isso, podemos fazer uso de [**Generics**] que, no nosso caso, irá permitir receber um objeto de qualquer tipo:

java 

Agora estamos falando que iremos receber um objeto de tipo genérico `T`. Mas fazer isso não é suficiente, precisamos validar esse objeto. E como validamos um objeto que não sabemos o tipo?

Precisamos descobrir, em tempo de execução, informações a respeito do objeto que irá chegar no nosso método, logo, podemos usar [**reflexão**]. Com reflexão podemos descobrir e operar dados da classe. Então, primeiramente, vamos pegar a classe desse objeto:

java 

Com isso conseguimos operar sob a classe referente ao tipo do objeto recebido. Primeiro, vamos descobrir qual atributo da nossa classe está anotado com o `@IdadeMinima`.

Para descobrir isso, vamos iterar sobre os atributos da classe usando o método [getDeclaredFields()]:

java

Agora estamos iterando por todos os atributos da classe do nosso objeto. O próximo passo é descobrir qual campo está anotado com a nossa anotação.

Vamos usar o método [**isAnnotationPresent()**]. Esse método verifica se o campo contém a anotação passada e retorna um `boolean`.

java

Caso entre no `if` saberemos que o campo possui a anotação `IdadeMinima`. Só falta compararmos a idade mínima que atribuímos na nossa anotação com a idade passada. Para fazer isso vamos pegar a nossa anotação.

Para conseguir pegar a nossa anotação usaremos o método [**getAnnotation()**] passando a nossa anotação:

java 

Temos um objeto do tipo da nossa anotação, com ele conseguimos pegar a idade mínima que setamos. Agora precisamos, também, da idade passada pelo usuário.

Para acessar o valor de um atributo `private` precisamos falar que esse atributo está acessível, desta forma:

java

Mas perceba que não recebemos a idade do usuário, recebemos a data de nascimento dele. Precisamos pegar esta data e descobrir a idade do usuário. Para pegar o valor do atributo anotado com `@IdadeMinima` vamos usar o método [**get()**] da classe `Field`:

java 

Perceba que fizemos um cast para `LocalDate`, pois o método `get()` nos retorna um `Object`.

Para finalizar, vamos comparar para ver se o período entre `dataNascimento` e a data atual é maior ou igual ao valor que colocamos como idade mínima na nossa anotação:

Na comparação iremos usar o método [between()] que recebe como parâmetro duas datas para serem comparadas, o método [now()] para obtermos a data atual e o método [getYears()] para conseguirmos saber o valor do período em anos:

java

Perceba que pegamos o período em anos e comparamos para ver se o valor é maior ou igual a `idadeMinina.valor()` que nada mais é do que aquele valor que colocamos na nossa anotação. Além disso, no final retornamos falso, pois caso nenhum campo do objeto possua a anotação `@IdadeMinima` ele não pode ser validado.

Agora, para testar, vamos criar um usuário e printar o retorno do nosso método validador:

java

A data de nascimento do usuário criado é 13/01/2005, logo, comparado com a data atual resultará em `false`. Vamos ver:

imagem` consegue validar qualquer classe que tenha nossa anotação.

## Conclusão

Neste post conseguimos descobrir o poder da reflexão, realmente ela nos ajuda e muito quando precisamos operar sobre a classe dos objetos dinâmicamente.

Com anotações fomos capazes de marcar os elementos da nossa aplicação para que nosso método que usa reflexão consiga captar informações úteis para que fosse possível executar nossa lógica de validação.

Usar [reflexão] é muito útil quando queremos criar algo mais genérico, mas precisamos ter cautela pois com reflexão, operamos sobre os tipos dos objetos dinamicamente e isso faz com que algumas otimizações da máquina virtual não sejam executadas. Então temos que tomar cuidado para ver onde é realmente necessário o uso de reflexão.

Para saber mais a respeito de reflexão e metadados, a Alura possui o curso [**Curso Java Reflection: mágica e meta programação**], onde é mostrado várias outras funcionalidades legais que o Java nos traz para trabalhar com reflexão.




Algo bem comum no Android é que queremos manter o estado atual quando fazemos a rotação do celular, como vimos [**nesse artigo**] !

Quando precisamos armazenar muitos objetos no momento que viramos a tela, por exemplo :

- uma lista; 
- três fotos que foram tiradas e ainda não salvamos o seu caminho; 
- o tempo que o usuário está naquela activity.

Vamos ver como ficaria o código para armazenarmos tudo isso :

Java

Nada muito díficil, agora temos que restaurar tudo isso :

Java

Ah, está bem tranquilo até agora, mas vamos dificultar um pouquinho, pense que estamos numa tela um pouco mais complexa, que estamos tratando com muitas informações, nosso código ficaria muito grande, tanto para salvar o estado quanto para restaurar.

Para facilitar esse processo todo vamos utilizar uma API que vai resolver nosso problema, chamada **[Icepick]**.

Vamos traze-la para o nosso projeto, para isso iremos mexer no nosso `gradle` :

java

Legal, já trazemos a API agora vamos utiliza-la.

Precisamos informar quais são os objetos que queremos que sejam armazenados e restaurados, para isso usaremos uma `Annotation` em cada objeto que será necessário persistir para aquela `Activity` :

Java

Mas só anotar não é necessário, precisamos ter certeza que serão salvos e restaurados para isso temos que invocar alguns métodos que realizam esse procedimento :

java

Através desses métodos todo aquele procedimento de colocar ou retirar o objeto do `bundle` fica bem mais simples, pois quando anotamos os objetos, a própria API cria um identificador e utiliza no momento que salvamos e restauramos esses objetos.

Já imaginou que teríamos de fazer linha por linha para cada objeto que precisávamos guardar ? Dessa forma, todo aquele trabalho que teríamos para cada objeto, estamos substituindo em apenas uma única linha :)

Quer conhecer mais sobre Android ? Aqui na Alura temos [**vários cursos**] bem bacanas!




Nos dias 25 e 26 de agosto em Porto Alegre e nos dias 01 e 02 de setembro em Fortaleza, rolou a maior conferência de JavaScript do universo, a BrazilJS. 

No episódio de hoje do Alura Live, convidamos Erick Krominski, apresentador do Shark Tank Brasil, que foi o host do evento e o Artur Adam, que faz parte dos times da Alura e Caelum e que deu uma palestra super bacana lá.

https://www.youtube.com/watch?v=EdDTBEXni_E

Quer saber mais sobre o que rolou? Assista essa [live completa.]

Conheça alguns cursos e carreiras do mundo web:

- Quer dar seus primeiros passos com JavaScript? [**Lógica de programação I:**] Os primeiros programas com Javascript e HTML.
    
- Avance e evolua com JavaScript e Typescript: [**JavaScript avançado I:**] ES6, orientação a objetos e padrões de projetos. [**TypeScript parte 1:**] Evoluindo seu Javascript.
    
- Quer aprender novos fundamentos? [Meteor:] Crie single page applications com JavaScript. [React Native parte 1:] Criando apps nativas com JavaScript e React.
    
- Quer seguir uma carreira JavaScript na web? Aqui na **Alura** temos uma [**Formação JavaScript.**]
    

Não deixe de nos seguir twitter: [Gabriel Ferreira], [Erick Krominski], [Artur Adam] e a [Alurinha]! :D




Como formatar uma moeda utilizando o Python? 

Sou programador de uma loja online brasileira e, recentemente, decidimos implementar a venda de produtos para Portugal, com o intuito de aumentar nossa clientela. Para isso, precisamos converter os preços de Real para Euro.

Temos uma função já implementada para realizar a conversão, que toma como parâmetro o valor em Real como float e retorna o valor em Euro, também float:

python

Vamos testar nosso código:

python

A função funciona bem! Mas esse resultado basta? Afinal, o que significa todo esse número solto?

Repare que temos um valor com 7 casas decimais (o que atrapalha a legibilidade), sem indicação nenhuma do que estamos nos referindo, do significado dele. Qual o sentido desse número?

Precisamos tornar o valor convertido mais legível, formatá-lo. Queremos transformar todo esse número em **12,46 €**, o padrão de Portugal. Como podemos fazer isso?

## Arredondando um número com a função `round()`

O primeiro passo para formatar o número é arredondá-lo, afinal não podemos deixar um valor com 7 casas decimais para nossos clientes.

Uma simples solução para isso é obtida através da função nativa do Python **[round()]**, que toma como parâmetro o número a ser arredondado e a quantidade de casas decimais que queremos:

python 

E já temos o valor arredondado em 2 casas decimais:

python

## Substituindo um caractere de uma string com o método `replace()`

Precisamos, agora, transformar o `.` em `,`, para seguir o padrão. Para isso, podemos usar o método `replace()` dos objetos string, especificando **o que** e **para que** queremos substituir nos parâmetros, dessa forma:

python

Vamos testar o `replace()`:

python

Opa! Recebemos uma exceção!

A exceção, de tipo `AttributeError`, indica que o tipo float não tem nenhum atributo ou método `replace`. Isso é porque o `replace()` é um método da classe string, ou seja, temos de transformar nosso valor convertido de float para string. Vamos de novo:

python

E o resultado:

python 

Agora sim! Enfim, precisamos apenas adicionar o símbolo do Euro, o que pode ser feito com uma simples formatação de string:

python

Vamos ver como fica nosso valor agora:

python

Ótimo! Realmente conseguimos formatar nosso valor no padrão português de moeda.

## Suportando mais de uma moeda e seguindo padrões diferentes

Se tivéssemos um número maior, como **1000.50**, e quiséssemos agrupar o número pelos milhares, transformando em **1.000,50 €**, o que faríamos?

Além de um cuidado extra para não substituir o `.` do agrupamento por uma `,` com o `replace()`, precisamos de um código que saiba onde o agrupamento deve ser feito.

Outro problema é que estamos restritos ao padrão português. E se, por exemplo, quiséssemos abrir as portas para clientes estadunidenses?

O padrão não seria mais **12,46 €**, mas sim **$12.46**. Um outro caso seria voltar o valor em Real, portanto, o padrão seria **R$ 12,46**...

Será que precisamos implementar uma maneira diferente de formatar moeda para cada país?

## Conhecendo o módulo `locale`

O Python nos oferece um módulo inteiro dedicado a serviços de internacionalização - permitindo que nós, programadores, consigamos lidar facilmente com possíveis problemas culturais em uma aplicação - o módulo **[locale]**.

A partir desse módulo temos diversas funções que podem nos auxiliar na conversão de formatações de certas especificidades, como tempo e dinheiro.

No nosso caso, podemos usar a função `locale.currency()`, passando o nosso valor que queremos formatar como parâmetro:

python

Vamos testar:

python 

Epa! Novamente uma exceção, dessa vez do tipo `ValueError`, indicando que formatação de moeda não é possível usando o `locale` padrão, que é o `C`.

O `C` é o `locale` mais simples, sem as definições específicas para realizarmos a operação que queremos.

## Definindo um _locale_ específico com a função `setlocale()`

Precisamos, então, definir um `locale` em nosso programa, para passar por cima do padrão. Para isso, usaremos a função `locale.setlocale()`, que necessita de dois argumentos:

- `category`: A categoria que define o tipo de operação que será alterado para o `locale` especificado
    
- `locale`: Uma string que representa o _locale_ que queremos
    

Vamos dar uma olhada nas possibilidades de uso desses dois parâmetros. Em primeiro lugar, as categorias permitidas são:

- `locale.LC_CTYPE` - Funções relacionadas a caracteres
    
- `locale.LC_COLLATE` - Ordenação de strings
    
- `locale.LC_TIME` - Formatação de tempo
    
- `locale.LC_MONETARY` - Formatação de valores monetários
    
- `locale.LC_MESSAGES` - Exibição de mensagens
    
- `locale.LC_NUMERIC` - Formatação de números
    
- `locale.LC_ALL` - Combinação de todas as categorias
    

Como estamos tratando de formatação de moedas, usaremos a categoria `LC_MONETARY`.

No caso do parâmetro `locale`, as strings aceitas dependem do sistema em que o código está rodando. Por exemplo, em sistemas baseados em UNIX, podemos ver uma lista dos _locales_ registrados em nossa máquina com o seguinte comando no Terminal:

python

No Windows, a coisa complica um pouco. Podemos até ver uma **[lista de locales publicada pela Microsoft]**, mas possivelmente existem elementos nessa lista que não funcionem em seu sistema e, ainda, _locales_ no seu sistema que não estão na lista.

Como estou trabalhando no Linux e quero converter para Dólar americano, usarei o _locale_ **en_US.UTF-8**:

python

O método `setlocale()` retorna uma string nos mostrando o _locale_ que escolhemos:

python 

## Formatando moeda com a função `currency()`

Agora sim, basta usarmos a função `currency()`:

python

E temos como retorno:

python 

Tudo resolvido! Repare que a função `currency()` chegou até a arredondar o valor pra gente, tirando nossa necessidade de usar a função `round()`! Vamos testar com um valor mais alto, para ver como fica:

python 

O resultado:

python 

Tudo bem, mas queríamos que, na formatação, os milhares ficassem agrupados, lembra? Para isso, além de enviar o valor, também podemos passar um outro argumento pro método `currency`: o `grouping`.

O parâmetro `grouping` espera receber um boolean, que, por padrão, é **False**. Para agruparmos, então, basta indicar como **True**:

python

Dessa vez:

python 

Exatamente como o padrão estadunidense!

> Outros parâmetros que podemos definir são **_symbol_**, que define se queremos o símbolo da moeda (como por exemplo o **$**) e é **True** por padrão, e **_international_**, que define se queremos usar o símbolo internacional da moeda (como por exemplo **USD**) e é por padrão **False**.

## Conclusão

Nesse post, começamos com a necessidade de formatar uma moeda em Euro usando os padrões corretos.

Tentamos, em primeiro lugar, funções como `round()`, para arredondar o valor, e métodos como `replace()` e `format()`, para ajustarmos a string do valor em Euro formatado, e confirmamos que é possível até um certo ponto - funciona, mas podemos encontrar dificuldades.

Conhecemos, por fim, o módulo `locale`, que consegue solucionar os problemas de internacionalização sem exigir muito do programador. No nosso caso, usamos a função `currency()` definida nesse módulo.

## Para saber mais

Quer saber mais sobre o poder do módulo `locale` no Python? É sempre uma boa ler a **[documentação]** para sabermos o que podemos fazer!

E aí? Ficou mais simples formatar uma moeda agora, não é? E ainda sabemos onde pesquisar caso precisemos de um código que leva em consideração aspectos culturais! Quer aprender mais sobre Python? Dê uma olhada em **[nossos cursos na Alura]** e continue estudando!





imagem 

Fomos chamados para implementar um sistema em uma loja de produtos eletrônicos que ajudasse no controle das quantidades de produto que temos em loja.

Começamos alinhando quais eram as operações que o cliente esperava poder realizar nesse controle de produtos.

Segundo ele, era preciso primeiro **inserir um produto**, depois precisavam poder sempre **ver quantos produtos haviam lá**.

Então começamos desenvolvendo esse código para adicionar produto.

java

Neste caso, usamos **Servlets**, porém percebemos que o código acabou ficando muito grande e não fizemos nem metade das coisas que o cliente pediu. Resolvemos apenas a parte de inserção de produtos, mas ainda faltam as features de ver, atualizar e remover.

Se considerarmos isso, ao final teríamos um código imenso e, consequentemente, prejudicaríamos a legibilidade e manutenção.

E como poderíamos resolver esse problema?

## Utilizando Spring Framework

Uma forma mais elegante de resolver esse problema de códigos compridos e pouco legíveis pode ser utilizando o Spring.

O Spring é um [**framework**] que facilita bastante o desenvolvimento, ou seja com ele nós temos a legibilidade de código maior, implementações com menos código, facilidade na manutenção de código. Com isso teremos uma **entrega mais rápida** também.

Para começar, precisamos antes de mais nada criar um projeto.

## Criando o projeto

Para criar o nosso projeto temos que acessar [o site do spring] e colocar as dependências  que queremos, mas quais queremos?

Nossa aplicação tem que ser **web**, para ser um acesso mais dinâmico, ou seja podemos acessar de qualquer dispositivo.

Como toda a aplicação web ela tem dados, e esses **dados** precisam ser guardados em algum lugar então precisamos de um **banco de dados**.

Tem que fazer o mapeamento das classes para o banco, para agilizando o processo em relação ao banco.

Então vamos usar a dependência **Web** para ser uma aplicação web que contenha o tomcat já incluso para que a gente não tenha que fazer toda a configuração.

**Mysql** vai ser o banco de dados que vamos utilizar nesta aplicação, pois tenho que salvar em algum lugar os dados. Com isso além de salvar, podemos alterar, remover, ou pesquisar por dados que estão dentro do banco.

**JPA** para persistir nossas classes no banco de dados, pois assim vamos fazer o mapeamento das nossas classes e fazer a criação de maneira automática.

imagem** que incrementa de um em um, assim o id não se repete.

Sabendo disso tudo, precisamos alguma coisa para mapear os atributos de **Nome** e **Quantidade**, como nome e quantidade estão ligados a um produto, então vamos criar um pacote chamado modelo. Dentro desse pacote também criaremos uma classe produto com esses atributos e mapear como uma entidade.

java

Agora criamos esses atributos no banco de dados, mas ainda não inserimos, pesquisamos ou alteramos nada até o momento. E como isso pode ser feito? Será que dá para fazer direto na Entidade?

## Repositório

Quando pensamos em inserir, pesquisar, alterar dados, logo pensamos em **DAOS** ou até mesmo em comandos SQL, isto é muito trabalhoso. Mas então como vamos fazer a persistência dos dados? Na classe de entidade?

Iremos fazer isto nós [**repositórios**], pois facilita demais o processo do **CRUD.** Por boas práticas não vamos fazer dentro da classe entidade.

O repositório tem uma interface chamada [**CrudRepository**] que nos permite fazer um CRUD dos nossos dados, sem que a gente escreva uma linha de código.

Precisamos criar um pacote chamado repositório e uma interface chamada ProdutosRepository.

Nesta interface o que precisamos para fazer ela fazer essa persistência de dados ? Temos que estender a interface **CrudRepository** e passar a entidade que queremos e o tipo do ID dela. Com isto o nosso **CRUD** está pronto.

java

Porém como vamos controlar a aplicação para saber o que vamos fazer?

## Controle

Os controles são o intermediário da nossa aplicação, ou seja ele fazem a comunicação com a parte frontal da nossa aplicação e com o banco de dados. Então ele pode fazer a inserção no banco de dados. Fazemos o controle da aplicação conforme o protocolo [http]. Como podemos ver o **http tem os métodos: POST, GET.** Vamos usar eles como para controlar nossa aplicação?

Nós vamos fazer esse controle por meio de [anotações], mapeando com **@GetMapping, @PostMapping** para seguir o protocolo http. Beleza, agora fazemos para que serve essas anotações e o protocolo http. Mas como podemos fazer isto na aplicação ?

Bem podemos criar um pacote chamado **controller** e uma classe chamada ProdutoController para controlar o fluxo da nossa aplicação. Mas se usamos a anotação @Entity para dizer que a classe Produto é uma entidade, temos que usar alguma anotação para o controle?

Podemos fazer duas anotações **@Controller e o @RestController**.  O @Controller é usado para sinalizar que é uma classe do **Spring MVC** e bastante usado para redirecionar views. Já o @RestController faz automaticamente tudo o que o @Controller faz é retornar tudo em JSON e não precisamos utilizar a anotação **@ResponseBody**, pois, já está contido nele, então vamos usar o @RestController.

Temos que mapear a nossa classe com o @RestController ficando dessa maneira.

java

Se rodarmos o projeto nada acontece ainda, pois não mapeamos a url do controller, precisamos fazer isto, de qual maneira?

Se você pensou em uma anotação acertou, temos que usar uma anotação para fazer isto, está anotação vai ser a @RequestMapping(“url que queremos”).

No nosso caso vamos fazer o na url (/api/produto) ficando da seguinte maneira:

java

Bem fazendo dessa maneira ainda não vai nos retornar nada, pois não fizemos nenhum tipo de mapeamento de retorno. Como fazer este mapeamento? Utilizando o http ao nosso favor e fazendo o mapeamento com as anotações @GetMapping, @PostMapping.

java

Mas assim como o RequestMapping temos que passar um caminho para cada anotação, só que elas tem um coisa de diferente que é ao invés de passar direto temos que utilizar o parâmetro **value** e o mapeamento delas.

java

Com isto feito percebemos que temos erros :

![]

Este erro dá, pois não temos um alguma coisa que faça uso dessas anotações, o que podemos fazer para utilizar elas?

Uma boa ideia seria utilizar métodos com retornos para ficar mais simples de se utilizar, bem se temos que listar usuários é criar um método que contenha um retorno de uma lista de usuários.

java

Mas o que o que vamos retornar? Bem lembra do nosso repositório lá temos bastante métodos e um deles é o findAll que busca todos os elementos que estão no banco.

Temos que fazer a injeção de dependência do repositório, podemos fazer está injeção pelo construtor, mas vamos optar por fazer com uma anotação chamada **@Autowired**  e utilizar os métodos do repositório.

java

Bem vamos testar isto vamos utilizar o **método findAll** para ver se ele nos retorna os registros do banco de dados.

java

Bem mas na hora que formos testar queremos que nosso retorno um **JSON**, mas como pode ser feito isto ?

Existe o produces que é o valor que a gente vai produzir, e o consumes que é o valor que a gente vai consumir. Para o GetMapping nosso vamos produzir o valor em JSON, dessa maneira.

java

Agora que sabemos disso no nosso @PostMapping como seria?  Com o PostMapping seria diferente, pois, nele nós teríamos consumir os dados da parte frontal para fazer a inserção no banco de dados, mas para enviar esses dados da parte frontal da aplicação pro controle, temos que fazer de qual maneira?

Temos uma anotação chamada @RequestBody para enviar pelo o corpo da requisição isso os dados e nós vamos utilizar ela.

Mas qual o tipo de método que eu crio para isso? Bem vamos criar um ResponseEntity para retornar as respostas conforme [**http status code**] que é uma das boas práticas que devemos seguir.

java

## Conclusão

Tivemos o problema em relação aos **DAOS** serem muito longos e resolvemos utilizar o Spring de outra maneira.

Quando utilizamos o Spring temos as vantagens do framework e conseguimos fazer um **CRUD** de maneira rápida.

E aí, o que achou do post? Fica até mais fácil trabalhar com o spring agora, não acha? Se quiser continuar estudando sobre o assunto. Temos uma [**formação Java**] que fala mais sobre o spring continue aprendendo!




Surgiu a necessidade de implementar uma funcionalidade de envio de arquivos para o **servidor**, mas como podemos implementar o **recurso de upload** em nosso sistema?

imagem 


Nosso primeiro passo será criar uma classe para representar qualquer tipo de arquivo, logo podemos ver que um bom nome para a mesma seria `Arquivo`:

java

## Criando o método upload

Após criar e definir o nome de nossa classe estamos pronto para o próximo passo, vamos começar a implementação do método `upload`:

java

Bacana, temos o nosso método para realizar o upload, mas por onde podemos começar? Inicialmente sabemos que um **arquivo** possui o nome e o lugar ao qual ele será **gravado**, portanto, podemos receber esses 2 parâmetros no nosso método:

java

Quando fazemos upload de um arquivo, além de pegar o nome e o local, precisamos também pegar o próprio arquivo em si, ou melhor, precisamos pegar os seus **bytes** que o representa de verdade dentro do computador. Sendo assim, veremos passo a passo como podemos fazer isso.

## Implementando o método Upload

Temos o caminho e nome do nosso arquivo, porém, como podemos representar um arquivo em Java? Fazemos isso por meio classe [**File**] passando o nome do arquivo completo em sua construção.

java

Agora já temos também a representação do nosso arquivo, portanto, o nosso próximo passo é entender como realmente funciona o upload de arquivos.

## Transferindo arquivos em Java

No processo de upload é realizado a **transferência** do arquivo local em nossa máquina para o navegador, assim que o navegador termina de carregá-lo já somos capazes de pegar uma "representação" desse arquivo, com a representação desse arquivo precisamos agora de fato salvá-lo em nosso servidor.

Nesse momento você deve estar imaginando:

> "Basta apenas pegar o arquivo passado pelo navegador e de uma forma mágica salvá-lo no servidor."

Mas as coisas não são tão simples assim, o que realmente é feito durante o processo de um upload é a **leitura byte** a byte do arquivo carregado e depois criado um novo arquivo passando os bytes lidos.

## Copiando um arquivo byte a byte

Para realizar a **cópia do arquivo** enviado pelo usuário e posteriormante carregado pelo navegador devemos seguir alguns passos, o primeiro nada mais é do que criar nosso método responsável por tal operação:

java

Beleza, já temos nosso método declarado, mas por onde devemos começar sua implementação? Como mencionado anteriormente sabemos que para realizar uma cópia precisamos de **origem** e **destino**, logo são dois fortes candidatos á serem parâmetros para nosso método:

java

Repare que declaramos a origem do tipo [**InputStream**] pois é o objeto responsável por leituras de arquivos em Java, logo podemos ver que [**OutputStream**] é o responsável pela escrita, ambos pertencem ao pacote `java.io`.

Sabemos também que iremos ter que ler os bytes do arquivo origem para escrevê-lo no arquivo destino, podemos fazer isso através de uma variável:

java

Como a palavra `byte` é reservada da linguagem Java criei a variável como **bite**, também precisamos definir um tamanho máximo do arquivo, fazemos isso através de um `array`:

java

Agora precisamos ler os bytes da origem um por um e ir copiando para o arquivo destino, enquanto os mesmos forem existentes, logo vemos a necessidade de realizar um loop:

java

Quando estamos trabalhando com operações de leitura e escrita devemos tratar algumas possíveis exceções, podemos fazer isso através de um **try catch**:

java

Agora que já sabemos como é feito realmente um upload de arquivo e já criamos o método para realizar a leitura e cópia do mesmo, devemos utilizá-lo no momento de realizar o upload para de fato copiar o arquivo carregado pelo navegador para nosso servidor.

Mas até agora não temos uma forma de ler o arquivo carregado pelo navegador, como resolver o problema? Podemos passar o arquivo via parâmetro para nosso método `upload`:

java

Definimos o parâmetro do tipo `InputStream` pois sabemos que o mesmo trata-se de uma leitura, além disso também sabemos que nosso método `copiar` precisa de um segundo parâmetro, onde será gravado o arquivo. Já temos a representação do nosso arquivo, precisamos apenas criar um `OutputStream` para realizar a escrita:

java

Com isso já temos tudo o que é preciso para de fato chamar nosso método `copiar`:

java

Com a nossa classe `Arquivo` pronta, já devemos ser capazes de realizar o upload do arquivo, o próximo passo será mexer em nosso **front-end**, ou seja, criar um formulário para enviar o arquivo para nosso **back-end**:

## Buscando arquivos com HTML

O primeiro passo seria criarmos um form, para que sejamos capazes de realizar a busca do arquivo em nossa máquina:

html

Mas somente a tag form não é capaz de realizar tal necessidade sozinha, precisamos de alguma forma conseguir buscar um arquivo em nossa máquina e enviá-lo ao navegador, mas como podemos criar tal recurso?

### Conhecendo o input file

Entre os vários tipos de input's existentes para nosso formulário, um deles é do tipo **file**, com ele conseguimos buscar e carregar arquivos locais de nossa máquina para a web:

html

Para finalizar, devemos criar um botão para conseguirmos realizar a submissão do form:

html

Com isso, teremos o seguinte resultado:

 Enviar

Porém se tentarmos realizar o upload do arquivo ainda não iremos ser capazes de lê-lo em nosso código Java, por que isso está acontecendo?

Por padrão todas as informações são decodificadas ao serem submetidas por um formulário, isso é definido através da tag [**enctype**] que, quando não definida, tem seu valor padrão como `application/x-www-form-urlencoded`.

Para mudarmos esse comportamente padrão precisamos deixar explícito o valor do enctype para `multipart/form-data`:

html

## Enviando arquivo do navegador para o servidor

Para fazer o uso da nossa classe `Arquivo`, precisamos de alguma forma realizar uma requisição para nosso código Java, pegar a representação do arquivo e posteriormente fazer uso de nossos métodos,

Para maior facilidade no exemplo irei utilizar o framework [**VRaptor**], capaz de realizar a comunicação web e Java, você pode estar utilizando o framework de sua preferência:

java

Com isso já devemos ser capazes de carregar e enviar nosso arquivo para o servidor.

Caso fique um pouco confuso sobre os objetos utilizados para gravar, ler ou criar arquivos, na alura temos [**uma formação Java**] que fala sobre o pacote java.io e várias outras particularidades da linguagem.




Como os consumidores gastam cada vez mais tempo usando a internet e menos em outros canais, os anunciantes também são forçados a seguir essa tendência. Os anúncios devem estar onde as pessoas estão.

O marketing digital não é tão simples e direto quanto o marketing tradicional. Ele é mais bem produzido em casa e não deveria ser terceirizado para uma agência de marketing digital por várias razões práticas. 

Quando feito em casa, marcas têm maior controle de suas ações e podem ajustá-las com a velocidade que o meio exige. Por esse motivo, o profissional de marketing digital é cada vez mais procurado, e essa demanda só tende a crescer no futuro.

**A melhor maneira de se tornar um especialista em marketing digital é começar a praticá-lo hoje. E a melhor característica do marketing digital é que você pode começar a fazê-lo em uma escala muito pequena.**

Tudo que é preciso é um computador, uma conexão com a internet e uma pequena quantia de dinheiro para experimentar. Você pode aprender marketing digital aplicando seus conceitos em seu próprio miniprojeto agora mesmo! 

## **1\. Tornando-se um profissional de marketing digital**

A indústria do marketing digital está crescendo rapidamente e é incrivelmente competitiva. É fácil para as empresas diferenciarem entre os candidatos que têm vontade de aprender e aqueles que não estão tão engajados assim.

Essa indústria exige paixão e um desejo pelo sucesso. Você precisa se manter sempre atualizado, já que empresas como Google, Facebook e Twitter ajustam regularmente suas plataformas de publicidade e mudam com frequência suas regras.

### **O que devo ler para me tornar um profissional de marketing digital?**

Acompanhar blogs como o [**SEOGadget**], o [Social Media Examiner]  e o [**Hubspot**] vai ajudá-lo bastante na sua caminhada pelo marketing digital. Ter um bom inglês é fundamental, já que a maior parte do conteúdo de aprendizado no setor está nessa língua, mas você pode também seguir o blog do [Marketing de Conteúdo], uma excelente fonte de conhecimento em português.

Procurar conhecer uma rede de suporte, participar de encontros da indústria e conferências para nutrir relacionamentos com outros profissionais de marketing digital será essencial.

Experimentar suas próprias ideias e desenvolver projetos pessoais é uma ótima maneira de aprender e ter o que mostrar numa futura entrevista de emprego.

### **Quais são os conceitos básicos do marketing digital?**

Para trabalhar com marketing digital, você precisa também estar confortável com as siglas do mercado, como PPC, SEM e SEO. Todas elas representam termos muito diferentes, e um mal-entendido pode ser um sinal claro de que você ainda precisa de mais treinamento.

A capacidade de analisar campanhas de marketing digital e entender quais elementos funcionaram ou não depende bastante da sua capacidade de entender o jargão da indústria. Por isso, vamos começar com um pequeno glossário:

- API — Application Programming Interface: conjunto de funções disponíveis para utilizar um software sem conhecer sua implementação
- AdWords: a tecnologia que impulsiona a publicidade PPC (pay per click) do Google.
- A/B Testing: método para testar uma nova técnica de marketing (A) contra um grupo de controle (B), para verificar sua eficácia.
- CRO — Conversion Rate Optimization ou otimização da taxa de conversão: a taxa de conversão é o número de pessoas que começam apenas navegando e, depois, tornam-se clientes, ou seja, fazem uma compra.
- Campanha: mensagens de marketing com um objetivo específico, como aumentar a conscientização com relação a uma marca ou as vendas de um produto.
- CPA — Cost Per Action, ou custo por ação. O anunciante paga por uma ação do usuário — como um download, por exemplo.
- CPC — Cost Per Click, ou custo por clique. O anunciante paga este valor por cada clique recebido em seu anúncio.
- Google Analytics: uma ferramenta gratuita que permite rastrear diferentes estatísticas a respeito de um site
- Google Trends: uma ferramenta que mostra a densidade de pesquisas por palavra-chave, seja em comparação com outras ou com relação a um período.
- Influenciador: um especialista em determinado campo que detém grande poder em comunicar suas opiniões aos seus seguidores, afetando seu comportamento.
- Link building: o processo pelo qual você aumenta a quantidade de links para seu site. É um dos objetivos de SEO.
- Listagens orgânicas: são os resultados de uma pesquisa na web que não foram pagos.
- Palavra-chave: um termo ou frase que um usuário procurará por meio de um mecanismo de pesquisa — como o Google.
- Palavra negativa: o oposto de uma palavra-chave, se um usuário pesquisar usando essas palavras seus resultados não serão exibidos.
- PR — Page Rank: uma pontuação que indica o quão confiável é um determinado site de acordo com o algoritmo do Google.
- PPC — Pay Per Click, ou pago por clique. Modalidade em que o anunciante paga por cada clique recebido em seu anúncio.
- ROI — Retorno Sobre Investimento: o que toda pessoa de negócios gosta de ver. É todo resultado gerado acima do investimento inicial.
- SEO — Search Engine Optimization, ou otimização do motor de buscas: quando um site é otimizado para busca, maiores são as chances de ele subir na página de resultados. Isso torna possível que eles sejam encontrados organicamente.
- SEM — Search Engine Marketing, ou seja, investir dinheiro para se posicionar melhor nos motores de busca.
- SMO — Social Media Optimization, ou otimização de mídia social: o ato de dirigir tráfego por canais de mídias sociais para atingir um determinado objetivo.

Você sabe diferenciar seu CPC do seu CPA? Se quiser se destacar em uma entrevista, fale sobre o ROI de publicidade de uma campanha que já executou.

É fácil falar sobre conceitos criativos e excitantes que você ajudou a desenvolver, mas o dinheiro fala mais alto. Para conquistar uma vaga como profissional de marketing digital, será preciso mostrar que você domina as métricas e a linguagem do mercado.

### **Quais são os principais componentes?**

Os componentes do marketing digital incluem:

- Marketing de conteúdo.
- SEO.
- Pesquisa paga (pay per click).
- Marketing de e-mail.
- Marketing de mídias sociais.
- Marketing de display digital.
- Web analytics.
- Marketing móvel.

É indispensável que você conheça bem cada um deles e saiba qual seu propósito.

O marketing de conteúdo é a estratégia de criar conteúdos interessantes para auxiliar no processo de compra e atrair de forma orgânica novos consumidores. O SEO é a otimização de sites e páginas para potencializar esses resultados em motores de busca.

A pesquisa paga é um dos recursos que o profissional de marketing digital possui para atrair atenção para as marcas com que trabalha, dando lances em palavras-chave de interesse do seu público-alvo e pagando pela quantidade de cliques em sua página.

O e-mail marketing e o marketing de mídias sociais, por sua vez, são recursos para nutrir e cativar leads. Cursos de [**marketing digital**] podem ajudá-lo melhor a esclarecer cada conceito, aprender suas funções e orientá-lo, de forma prática, a fazer cada uma dessas estratégias funcionar no mundo real.

### **Por onde começar a aprender marketing digital?**

Existem programas de MBA e especializações em marketing digital, além de exames de certificação, como o [Hubspot Inbound Marketing Certification Program] e a certificação do [**Google AdWords**], que serão essenciais para que você consiga se destacar nessas carreiras. Entretanto, assistir a esses cursos e obter os certificados não tornam você um especialista em marketing digital.

Eles ensinam [**fundamentos**], e alguns dos conceitos avançados da prática, mas conhecimento de verdade vem com a experiência. A melhor maneira de se tornar um especialista é criando um grande projeto agora mesmo.

Com o passo a passo a seguir você conseguirá aprender o básico e terá o que mostrar, aplicando o marketing digital em pequena escala.

#### **1\. Crie um blog**

- Escolha um tema pelo qual você é apaixonado e comece um blog sobre isso.
- Aprenda um pouco sobre SEO e escreva artigos otimizados em seu blog.
- Instale o código de acompanhamento do Google Analytics e veja se você está recebendo algum tráfego para o seu blog.

#### **2\. Aprenda a ler dados e identificar oportunidades**

- Explore as múltiplas possibilidades do Google Analytics.
- Abra uma conta no Google AdWords e faça alguma pesquisa de palavras-chave para ver o que as pessoas estão pesquisando no Google, para encontrar informações sobre o tópico do seu blog.

#### **3\. Mantenha suas páginas e redes sociais atualizadas**

- Escreva mais artigos e publique-os.
- Abra uma página do Facebook dedicada ao seu blog e compartilhe os artigos que escreve em sua página.

#### **4\. Experimente criar pequenas campanhas de publicidade**

- Promova sua página com publicidade no Facebook.
- Incorpore botões de compartilhamento social em seus artigos usando plugins do WordPress.
- Promova seu blog via AdWords, começando com lances de CPC muito baixos.

#### **5\. Crie uma newsletter para seu blog**

- Inscreva-se para um serviço de e-mail marketing como o MailChimp.
- Incorpore formulários de inscrição de e-mail em seu blog para coletar assinantes.
- Envie um e-mail a seus assinantes sempre que publicar algo em seu blog.
- Promova sua página do Facebook por e-mail marketing e ganhe novos assinantes a partir do Facebook, num ciclo contínuo.

#### **6\. Monetize seu conteúdo**

- Cadastre-se no Google AdSense e use a publicidade para monetizar seu blog.
- Garanta que seu blog é completamente funcional no mobile.

## **2\. As cinco competências fundamentais do profissional de marketing digital**

Um especialista em marketing digital é aquele que pode construir uma campanha de publicidade online efetiva, real e conectada com o objetivo de uma organização.

Tarefas comuns que l, pesquisa de comportamento online, exame de tendências e dos movimentos da concorrência.

Alguns profissionais do marketing digital também [constroem websites], produzem vídeos e fazem gráficos para usar nas suas operações de publicidade online. Aqui estão algumas das habilidades necessárias para chegar lá.

### **Um excelente texto e as certificações adequadas**

Você precisará de excelência em habilidades de escrita e deverá, além disso, ser um comerciante ativo e eficaz. Ter habilidades para utilizar aplicativos de computador e sites adequados é outra das necessidades. Um diploma universitário com foco em comunicação ou marketing pode ajudar.

Alguns locais de trabalho podem exigir um nível de graduação que enfatize as habilidades de escrita, publicidade ou [**tecnologia**]. Se você tem experiência substancial em mídias sociais, pode ser que consiga um emprego sem precisar de um grau acadêmico. Mas certificações, como a da Hubspot, são uma forma de provar suas habilidades.

### **Familiaridade com softwares e automação de marketing**

Você deve ter habilidades com softwares relevantes para a criação de planilhas, relatórios e documentos. Habilidades com a gravação e edição de vídeo também podem ser úteis ao profissional de marketing digital.

Uma das dicas importantes para qualquer profissional de social media é aprender a arte da automação. Algumas tarefas que podem ser automatizadas são o RT automático, a menção automática, os posts automatizados, dentre outros.

Familiaridade com o digital, como o conhecimento de softwares de automação de marketing, vai ajudar bastante na hora de se tornar um guru das mídias sociais.

### **Muita criatividade e um olho atento para as tendências de mercado**

Um estudo da Fractl e do Buzzstream descobriu que [**21% dos usuários**] de mídias sociais não seguiriam uma marca se seu conteúdo fosse muito repetitivo ou chato.

Para manter seus seguidores envolvidos e ser um profissional de marketing digital eficaz, você deve consistentemente chegar a novas e criativas campanhas. A criatividade é uma das características fundamentais desse profissional.

### **Capacidade de entender os números e fazer com que os outros entendam também**

Para se tornar um grande profissional do marketing digital, você precisa saber como traduzir dados até que eles se tornem histórias. A maioria das empresas está pronta para tomar decisões sobre métricas, e o profissional de marketing digital precisa conhecer aquelas que são mais importantes e as metodologias certas para transmiti-las a seus superiores.

### **Habilidades para gerenciar projetos e equipes**

**Habilidades organizacionais e o talento para gerir projetos são outras necessidades que um profissional do marketing digital não pode deixar de lado.**

Pode ser difícil gerenciar vários projetos com muitos colaboradores, mas essa é uma habilidade que você precisa desenvolver se quiser se dar bem nessa carreira.

## **3\. Os maiores problemas**

Já reparou que ultimamente somos cada vez mais bombardeados com ebooks, promoções e conteúdos que pretendem ser a solução dos seus problemas?

Não é preciso fazer um grande esforço para comparar essa situação com a que vivemos offline, com marcas e publicitários tentando de tudo para conquistar a sua atenção. Agora, no mundo digital, vivemos quase que os mesmos problemas.

Embora [74% dos brasileiros] nunca tenha feito uma compra pela internet, muitas vezes o marketing digital dá a entender outra coisa. Para atuar de forma efetiva como profissional de marketing digital, é preciso estar atento às seguintes questões.

### **As redes sociais não são apenas um canal de promoção, mas também de atendimento**

**Boa parte das interações que os clientes terão com uma marca na internet são de atendimento ou solução de dúvidas. Não adianta nada dar início à presença online de uma marca sem compreender essa função essencial do canal e, como profissional de marketing digital, seu papel é desenvolver estratégias que tornem esse atendimento o melhor possível.**

As redes sociais muitas vezes são menos um canal de promoção e mais um canal de atendimento, mas não é por isso que o profissional de marketing digital deve se tornar um profissional de help desk. Um bom atendimento, afinal, é uma das maneiras mais eficientes que uma marca tem para divulgar a excelência de seus produtos e serviços, por isso, nunca negligencie essa vocação do marketing digital.

### **A internet nivela a concorrência, mas é preciso criatividade**

Pode parecer surreal, mas um e-commerce pequeno e uma grande loja varejista têm à disposição os mesmos recursos online. Ainda que o orçamento de uma empresa maior seja mais gordo, pagar por cliques nem sempre significa conseguir alavancar sua consciência de marca online.

**Os profissionais de marketing digital aprendem muito cedo que uma presença de marca valiosa não tem a ver com dinheiro, e sim com encontrar a sua voz e conseguir realizar conexões com seu público-alvo.**

### **Online, marcas têm uma chance única de conhecer seus consumidores**

Um dos maiores riscos que um profissional de marketing digital corre é achar que conhece bem demais seu público. Isso pode gerar grandes problemas de planejamento, estratégia e execução em suas campanhas, e acabar prejudicando os clientes atendidos por ele. Aproveite a internet para conhecer cada vez mais o público-alvo de suas ações.

## **4\. O mercado de trabalho**

Se você pretende se tornar um profissional de marketing digital, não há melhor momento que agora. A economia online está crescendo até [dez vezes mais rápido] do que a economia tradicional, o que resultará em um déficit de vagas na maioria dos países.

Existem três posições principais que você pode assumir no mercado de trabalho como profissional de marketing digital. Analista, gestor e consultor. Confira o que cada um desses profissionais faz no seu dia a dia.

### **Analistas de marketing digital**

Os analistas de marketing digital fazem o planejamento e a criação de campanhas, e auxiliam na sua implementação, trabalhando em conjunto com outros profissionais para tornar forte a presença das marcas para as quais prestam seus serviços.

Essa posição é a primeira que você deve ocupar em sua carreira, sendo um pouco mais operacional e uma excelente oportunidade de aprender e ganhar experiência nesse mercado.

### **Gerente de marketing digital**

O gestor, ou gerente de marketing digital, é o responsável pelo planejamento, controle de metas e pelos relatórios de campanha, que devem ser entregues à diretoria de marketing ou ao departamento comercial de sua empresa.

**Esse tipo de profissional já costuma ter mais experiência no mercado e passa boa parte do seu tempo gerindo projetos e lidando com pessoas.**

### **Consultor de marketing digital**

O consultor de marketing digital é um profissional que trabalha por conta própria ou associado a uma consultoria, e ajuda as empresas a desenvolverem um planejamento de marketing digital.

Esse profissional é mais independente que os demais e deve ter uma forte veia empreendedora, pois, além de executar planejamentos, precisa vender seus serviços.

Em constante atualização, deve possuir uma disciplina que os outros dois cargos não exigem e desenvolver uma metodologia de trabalho própria. O consultor de marketing digital lida com vários clientes e projetos ao mesmo tempo, o que demanda jogo de cintura e atualização constante.

### **Como um profissional de marketing digital pode ingressar no mercado de trabalho?**

Para entrar no mercado de trabalho, uma boa tática é começar a estudar. Durante um curso de marketing você vai conhecer pessoas que já trabalham na área e outros estudantes, dando início ao networking necessário para encontrar uma colocação.

Um bom currículo no Linkedin e um projeto pessoal de sucesso são excelentes cartões de visita para uma futura entrevista de emprego, mas conhecer pessoas é imprescindível para ficar a par das oportunidades em sua cidade.

### **As tendências e oportunidades do marketing digital**

O Brasil, apesar da crise econômica, passa por um momento interessante no marketing digital, já que cada vez mais empresas buscam na internet um canal para gerar vendas e leads.

O crescimento do número de usuários de internet no Brasil e do acesso a dispositivos móveis coloca o marketing digital como uma obrigação para empresas de todos os tamanhos, e uma das tendências que parece forte no ano de 2017 é o aumento da presença de pequenas e médias empresas no universo online.

Existe um interesse cada vez maior dos empresários de PMEs pelo marketing digital, o que significa que é um excelente momento para se tornar um profissional dessa área, principalmente se você pretende atuar como consultor.

Outra tendência de mercado para a qual devemos estar atentos é o uso de dispositivos móveis e a criação e estruturação de campanhas de marketing digital que os suportem. Websites responsivos e melhorias no SEO que levem em consideração esse mercado, devem fazer parte dos planos de quem quer se destacar no marketing digital em 2017.

Para quem trabalha com marketing digital, o ano será de grandes oportunidades. A carreira nunca esteve tão valorizada e um número crescente de negócios busca formar suas próprias equipes para fugir do custo alto das agências digitais. Tornar-se [**mão de obra qualificada**] vai ajudar você a conseguir uma oportunidade nessa área.

Agora que você já sabe como se tornar um profissional de marketing digital e que tipo de talentos são precisos, aproveite para assinar a newsletter da Alura! Receba o melhor do conteúdo aqui do blog direto em seu e-mail e não perca nossas mais importantes atualizações!

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Acertou se a sua resposta é tecnologia! Esse setor tem algum tipo de novidade quase que diariamente seja em _softwares_, _hardwares_, linguagens, entre muitos outros recursos.

Essa agilidade é necessária para trazer melhores processos e produtos ao mercado. Porém, essa alta velocidade de transformação evidencia a importância da capacitação profissional para todos que atuam com tecnologia, ou seja, buscar conhecimento constantemente.

Quem deseja conseguir as melhores vagas ou alavancar sua carreira precisa ficar atento às tendências do mercado, para dessa forma oferecer um trabalho otimizado e que possa suprir as necessidades da empresa.

Ficou interessado? Então confira todas as dicas e sugestões espertas que preparamos!

## Aumento da produtividade

Não é segredo para ninguém que as empresas desejam profissionais com boa produtividade. Para conseguir esse nível de excelência é preciso buscar formas novas, atuais e otimizadas de executar as tarefas e desenvolver os projetos. Pode ser um novo recurso de um programa, como o _Photoshop_ e _lllustrator_, ou mesmo entender sobre arquitetura da informação e [**experiência do usuário**].

Com isso, além de adquirir conhecimento, você conseguirá melhorar o seu tempo de execução das tarefas, pois as atualizações da área de tecnologia surgem para resolver problemas e apresentar soluções, objetivando o aperfeiçoamento do trabalho. O resultado é o desenvolvimento dos processos de maneira mais rápida, consequentemente atendendo a mais demandas.

Isso é muito importante para aqueles que trabalham em empresas, para atender às expectativas dos gestores em [**produzir com mais agilidade**]. Há também outro grupo beneficiado: os profissionais autônomos, que conseguem atender mais projetos e, com isso, aumentar seus ganhos.

## Elevação do nível de empregabilidade

A área de [**tecnologia é uma das que mais têm vagas de emprego em aberto**], mesmo em tempos de crise econômica. Isso é uma ótima notícia para quem segue a profissão. Porém, um dos motivos para a grande oferta é a dificuldade em encontrar profissionais qualificados para ocupar os cargos disponíveis.

E esse é mais um dos motivos para se investir em capacitação profissional. Ao buscar mais conhecimento aumentam significativamente os níveis de empregabilidade. Isso é ótimo para quem está buscando o seu lugar ao sol no mercado de trabalho.

Mas talvez nesse momento você se pergunte: e no meu caso, que já tenho emprego, também é importante? Com toda a certeza! Para conseguir se desenvolver no posto atual ou conseguir a sonhada promoção.

Vamos a uma dica que vale para todos: faça uma pesquisa para entender quais são as demandas da sua área. Isto é, quais programas, linguagens e recursos são importantes e buscados pelos empregadores. Ao encontrar as respostas, invista em cursos exatamente nesses pontos. Qual é a ideia disso? Tornar-se o profissional que o mercado necessita.

Aproveite a oportunidade de fazer [**cursos online**] para aprender e desenvolver mais na sua área. Lembre-se: um bom profissional mantém-se constantemente atualizado.

## Participação em projetos mais ousados

Qual é o profissional que não sonha em participar de um projeto ousado e importante da empresa? Ter uma chance de se destacar, alcançar uma promoção, aumentar o salário, ganhar um prêmio e conseguir uma grande experiência profissional.

É algo realmente [positivo para a carreira], não é mesmo? Mas antes de chegar a esse ponto, há alguns passos a percorrer — dentre eles, estudar para aprender mais e ficar antenado nas tendências e novidades do mercado.

Para esse ponto, vale a boa e velha conversa com o seu gestor. Mostre-se interessado em entender os planos da empresa, para verificar quais são as suas condições de participar dos projetos mais ousados.

A partir daí, trace um plano pessoal e busque a capacitação necessária para estar afinado com os objetivos da empresa. Se essa é sua meta, trabalhe dia e noite até atingi-la.

Por fim, tenha em mente que isso não deve ser negligenciado. Afinal, ninguém quer perder a grande chance da vida no trabalho por não estar preparado para assumir uma nova responsabilidade, concorda?

## Apresentação de soluções na hora certa

Imagine a cena: ocorreu um problema no desenvolvimento do site, que compromete a experiência do usuário. Todos da área estão buscando entender o que ocorreu. E então, você, um profissional que buscou conhecimento e agora está capacitado, apresenta a solução. A partir daí, seguramente, ganhará mais respeito e confiança dos seus gestores.

Esse é apenas um caso fictício, mas que poderia muito bem ocorrer no dia a dia de qualquer equipe. Por isso, um profissional precisa ficar atento às tendências, necessidades e atualizações do mercado.

Com isso conseguirá sugerir soluções na hora certa, ou seja, no momento que surge um problema. Isso é proatividade e senso de urgência. Essas são duas competências muito valorizadas no mercado de trabalho.

Porém, para conseguir ser prestativo a esse ponto, é preciso entender bem da sua área de atuação e das tecnologias envolvidas no processo. Portanto, para se destacar e ajudar a resolver problemas, a melhor forma é investindo em conhecimento constantemente.

## Aumento das chances de receber melhores remunerações

Já apresentamos alguns bons motivos sobre a importância da capacitação profissional para a área de tecnologia. Provavelmente, você já está bem convencido, mas um ponto merece mais destaque: os salários.

Todos trabalham porque gostam da sua área de atuação, aprendem, participam de projetos interessantes e ganham respeito; mas também porque precisam receber uma remuneração. E se for atraente, melhor ainda, não é mesmo?

A área de tecnologia é conhecida por oferecer altas remunerações aos profissionais. Quem nunca ouviu falar, mesmo que seja pela internet, de um jovem que ganha algo semelhante a um diretor de empresa? Apesar de não ser a regra, essa possibilidade existe realmente.

Mas mesmo que o salário não seja nesse patamar que comentamos, é possível ter uma boa remuneração ao final do mês. Porém, para atingir esse nível, é preciso ter efetivo conhecimento, ou seja, estudar e se dedicar com afinco.

Como você faz para conseguir isso? Bom, fazer cursos, como já mencionamos é um bom começo. Mas as possibilidades não se esgotam por aí. Ler bastante, fazer pesquisas, testes e conversar com profissionais experientes também ajuda — e muito — no seu desenvolvimento profissional. Com todo o esforço envolvido, um dos resultados é a possibilidade de receber um salário mais elevado. O que é ótimo, certo?

O que achou da importância da capacitação de um profissional na área de tecnologia? Compartilhe conosco seu ponto de vista! Aproveite também e deixe seu comentário falando um pouco da sua experiência como profissional ;)

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!





imagem 

No [primeiro curso de Kotlin da Alura], vimos que o Kotlin nos permite realizar a sobrecarga de construtores de uma maneira simples e poderosa. Um exemplo de implementação seria para a classe `Produto`:

java

Com cada property sendo inicializada, somos capazes de criar um produto das seguintes maneiras:

java

Repare que criamos diversos produtos com características peculiares:

1. Um produto com os valores padrões;
2. Uma TV sem descrição ou quantidade;
3. Uma camiseta de cor preta mas sem quantidade;
4. Um refrigerante sabor guaraná e com 10 quantidades

Até o momento nenhuma novidade, mas suponhamos que é necessário criar um produto que tenha apenas um nome e quantidade, com a nossa amostra inicial, teríamos o seguinte resultado:

java

Repare que o nosso produto não tem nenhuma descrição, mas, ao mesmo tempo, não somos capazes de criar 50 chocolates da seguinte maneira:

java 

Pois, como segundo parâmetro, precisamos enviar uma descrição! E agora?

## Utilizando o named parameter para sobrecarga

No Kotlin, além da abordagem de mandar os parâmetros de acordo com a ordem na qual foram declarados, somos capazes de identificar qual parâmetro enviamos por meio de uma label, por exemplo, queremos enviar apenas o **nome** e a **quantidade**, logo, podemos indicar da seguinte maneira:

java 

Desta maneira, conseguimos enviar os parâmetros com a ordem que desejarmos, portanto, podemos até mesmo declarar esse mesmo produto da seguinte maneira:

java 

Esse recurso é conhecido como **_Named Parameter_**, como podemos ver, a ideia dele é permitir uma melhor legibilidade no envio de parâmetros, seja via construtor ou funções, e também, possibilitar uma sobrecarga de construtor bem poderosa que nos permite enviar parâmetros sem se preocupar com a ordem.

## Para saber mais

No exemplo inicial, utilizamos valores padrões apenas nas properties do construtor primário, porém, esse recurso é disponível para parâmetros de funções também!

Isso significa que podemos criar funções com parâmetro opcionais! Por exemplo:

java

Se chamarmos essa função da seguinte maneira:

java 

Chamando a função desta maneira, temos o seguinte resultado `Total da soma: 37`. Porém, se enviarmos o parâmetro de mensagem, podemos modificar a saída padrão:

java 

Com essa chamada a saída desta função fica da seguinte maneira `"Resultado: 37”`. É válido lembrar que essa foi uma amostra simples, porém, abre portas para diversas possibilidades que deixarei a sua imaginação tomar conta ;)

## Conclusão

Neste post vimos que além de utilizarmos valores padrões nos parâmetros, somos capazes de identificar o valor que desejamos enviar por meio do **_Named Parameter_** que também possibilita mais opções de sobrecarga, como por exemplo, enviando os parâmetro na ordem que desejar.

E que tal aprender mais sobre Kotlin? Na Alura temos cursos [**Desenvolvimento mobile com Kotlin**], onde você vai aprender desde o princípio da linguagem, como declarar classes, variáveis e funções, como também, assunto mais avançados como Higher-Order Functions, Delegated Properties e muito mais!




**Os principais browsers do mercado hoje são: Chrome, Firefox, Safari, Opera e Internet Explorer/Edge. E cada um desses navegadores usa uma engine de renderização diferente.**

O Internet Explorer usa o [Trident]) e Edge o EdgeHTML(que é um fork do Trident). Firefox o [Gecko], Safari o [Webkit] e Chrome e Opera usam o [Blink]. Vale lembrar que o Opera Mini e o Opera Classic não usam Blink, mas o Presto, que ainda é bem importante.

Mas afinal, **o que é** uma engine de renderização? Basicamente, é apenas das partes da [estrutura de um navegador.]

Várias coisas: Imagens, botões, links, etc. Só que quando o navegador faz uma requisição para o servidor, ele não recebe esse conteúdo todo bonitinho e simplesmente joga na tela. 

Não, ele recebe uma mistura de código HTML, CSS, XML e imagens e precisa de alguma forma lidar com isso. É aí que entra a engine de renderização: é ela que é responsável por pegar todo esse conteúdo, interpretar ele e **desenhar** o site para a gente no navegador.

Esse processo de leitura e renderização é feito em várias fases. [Esse artigo] explica muito bem como os navegadores modernos funcionam e como todo esse processo acontece (:

E aí, gostou? Quer aprender mais? Dá uma olhada na nossa [**Formação Front End**!]




Precisa fazer um insert rápido pra testar algo?

sql

Maravilha. Mas e se forem dois clientes? Dois inserts?

sql

Tão claro quanto, mas mais bonito:

sql

Rápido e eficaz.






imagem 

Ultimamente, a modalidade de trabalho remoto tem sido uma ótima alternativa para profissionais que desejam trabalhar em casa e ter mais liberdade e flexibilidade na sua rotina. Apesar disso, é preciso que haja dedicação, organização e uma rotina de trabalho bem estruturada, por parte daqueles que o exercem.

Por não ser necessário comparecer a um escritório físico, nessa modalidade é possível trabalhar em qualquer lugar do mundo, desde que se tenha acesso à internet.

Mesmo com essa rotina diferente dos padrões que conhecemos, é possível ser um funcionário convencional, com carteira assinada em uma empresa, ter um contrato de trabalho por determinado período de tempo ou, também, ser um [**profissional freelancer**].

Entretanto, é importante lembrar que, para ser produtivo no home office e alcançar o resultado esperado, o profissional precisa de bastante disciplina e equilíbrio, além de evitar distrações.

Sendo assim, confira a seguir algumas dicas que separamos para que você saiba como iniciar seu trabalho em casa da melhor forma possível. Vamos lá?

## 1\. Crie um local de trabalho na sua casa

Sabemos que o home office torna bastante tentadora a ideia de trabalhar na cama ou no sofá, usando seu pijama e, quem sabe, com o notebook apoiado em alguma superfície aleatória. Porém, essa pode não ser uma boa ideia.

Esse tipo de atitude provavelmente impactará de forma negativa o seu desempenho, fazendo com que haja uma queda na produtividade.

Ainda que não exista um escritório na sua casa, é fundamental criar um local de trabalho personalizado exclusivamente para você e já com tudo que você poderá precisar na sua jornada de trabalho.

Pode ser num quarto, no canto de uma sala ou até mesmo na cozinha. O importante é que seja um local exclusivo para seu trabalho.

### 2\. Vista-se para o trabalho

É muito mais confortável andar com seu pijama do que com roupa social. Pensando assim, parece uma ótima ideia usar a roupa de dormir como uniforme para o trabalho em casa.

Apesar disso, ficar com o roupão o dia inteiro enquanto trabalha também é uma atitude prejudicial para a rotina de trabalho, pois dá um ar de casualidade às suas tarefas.

A melhor saída, nesse caso, é se vestir como se fosse sair de casa — para visitar uma loja, por exemplo. Tome um banho, vista-se e tome um café da manhã, da mesma forma que faria se estivesse se preparando para ir para o escritório de uma empresa.

## 3\. Defina uma agenda para o seu dia

Quando você [**mantém o hábito**] de acordar e ir diretamente para o PC para ler as notícias do dia ou checar seus e-mails enquanto decide o que vai fazer, a tendência é ter um dia com uma produtividade muito baixa.

O ideal é que você utilize uma agenda onde estejam anotadas, desde o dia anterior, as suas tarefas daquele dia, organizadas por ordem de importância.

Dessa forma, não haverá procrastinação enquanto você define o que será feito. A partir daí, será apenas uma questão de colocar a mão na massa e ir riscando as tarefas da lista à medida que concluí-las.

## 4\. Separe o pessoal do profissional

É muito comum ver pessoas que trabalham em casa misturarem atividades da rotina pessoal com as tarefas do trabalho. Isso ocorre com mais frequência quando se trata de fazer compras online, ver e-mails, fazer ligações e navegar na internet. Essa última, principalmente.

Isso é algo que com certeza atrapalha o ritmo e níveis de produtividade, sobretudo se você fizer essas atividades com muita frequência durante o dia.

A partir do momento em que iniciar o trabalho, procure focar apenas nas tarefas dele, deixando assuntos pessoais para serem tratados em momentos de pausa, como no almoço ou no fim do expediente, por exemplo. Agindo com essa disciplina, o ganho na produtividade será altamente perceptível.

## 5\. Esqueça que está na sua casa

Essa é uma daquelas máximas em que você diz que “falar é fácil”.

A verdade é que, se você ficar pensando nas atividades domésticas, como arrumar a cama, lavar a louça ou limpar a cozinha, elas poderão se tornar as desculpas perfeitas para se convencer a adiar as tarefas do trabalho, como concluir uma planilha complexa ou iniciar um novo projeto.

Além disso, quem trabalha em casa também tem a tendência de utilizar momentos de pausa para cuidar das tarefas domésticas pendentes. Essa não é uma boa ideia, já que atividades desse tipo sempre demoram mais do que o planejado.

## 6\. Estabeleça metas sólidas e recorrentes

Se você busca garantir o sucesso profissional com o home office, é essencial que se tenha objetivos definidos, sejam semanais ou mensais.

Esses objetivos a serem atingidos definidos por você ou pela empresa para a qual trabalha são uma ótima forma de direcionar o seu foco e certificar-se de que está mantendo o ritmo necessário para alcançar o sucesso esperado. Trabalhar sem metas ou direção pode custar caro, portanto, tenha objetivos, sempre!

## 7\. Cuidado com a ideia de recomeçar no dia seguinte

Tenha cuidado com as pausas quando não estiver tendo um dia tão produtivo. Alguns pensam que pode ser melhor, por exemplo, pausar a tarefa e retornar no dia seguinte, mas esse é um erro grave e pode se tornar uma bola de neve.

A verdade é que, ao fazer isso, o profissional terá prejuízos ainda maiores com sua rotina. Além de atrasar as atividades mais do que o esperado, será mais difícil retomar o ritmo no dia seguinte e isso abrirá margem para que o problema se repita.

Portanto, procure treinar seu cérebro a não abandonar as atividades tão rapidamente. Se bater aquela falta de inspiração, faça tarefas secundárias, organize papéis ou objetos no escritório, [**busque inspiração**] online ou dê uma volta para refrescar a mente. Assim, será muito mais fácil se recuperar e retomar a rotina.

## 8\. Lembre-se do networking

Trabalhar em casa normalmente permite ter paz e concentração absoluta para a execução das tarefas. Um ponto negativo é que também é muito fácil se isolar do restante do mundo, o que pode não ser uma ideia muito saudável..

Para os profissionais que são freelancers, é importante manter uma rede de contatos crescente, além de buscar frequentar eventos relacionados à sua área. Essa costuma ser uma ótima oportunidade para ampliar sua rede, conseguir novos projetos e [**aprender cada vez mais**].

Seguindo todas essas dicas, você certamente conseguirá manter uma rotina produtiva, tendendo a alcançar os resultados esperados.

E se quiser entender um pouco mais a fundo de como criar [**Hábitos Produtios**], temos um curso na alura que passar um pouco dessas ideias com base em conceitos muito interessantes! Dá uma olhada lá ;)




Vou criar uma aplicação Web! Ou seja, uma aplicação que eu consiga rodar em qualquer plataforma, seja computador, celular ou qualquer dispositivo que rode um navegador qualquer... Para rodar uma aplicação web nós precisamos de um servidor de aplicação que será responsável em manter a nossa aplicação funcionando!

Atualmente, existem diversos servidores de aplicação e linguagens de programação que podemos utilizar para a nossa aplicação, porém, iremos criar uma aplicação **Java Web** e o nosso **servidor** de aplicação será o [**Tomcat**].

Para desenvolver essa aplicação utilizaremos o [**eclipse IDE**] que facilitará a nossa vida durante o desenvolvimento! Caso não tenha o eclipse, faça o [**download da versão para Java EE**], descompacte o arquivo .zip e execute o eclipse:

imagem**:

java

Criamos a nossa primeira Servlet! Vamos rodar a nossa aplicação? Clique com o botão direito em cima do projeto "Run as > 1 Run On Server":

imagem que significa que estamos acessando uma URL via HTTP em localhost (sua própria máquina) e na porta 8080. Por fim, aperte Enter para fazer a chamada para a aplicação:

imagem:

java

o nosso XML fica assim:

xml

Vamos testar novamente a nossa aplicação? Mas antes, vamos adicionar uma mensagem para que seja impressa no momento que for executada:

java

Clique com o botão direito em cima do projeto "Run as > 1 Run on Server", agora que o Tomcat já estava iniciado, o eclipse vai perguntar se você deseja reiniciá-lo, marque a opção para reiniciar para garantir que todas as nossas alterações funcionem. Agora, se testarmos a URL `http://localhost:8080/minha-biblioteca/`:

imagem` o `HttpServletRequest req` e o `HttpServletResponse resp`:

- **HttpServletRequest** é o parâmetro que representa as requisições à nossa aplicação, ou seja, tudo que o cliente manda será recebido por meio desse parâmetro
- **HttpServletResponse** é o parâmetro que representa as respostas da nossa aplicação, ou seja, tudo que mandamos para o cliente será enviado por meio desse parâmetro

Isso significa que podemos o `HttpServletResponse` para mandar uma mensagem! E faremos isso utilizando o método `getWriter()` que devolve um objeto do tipo `PrintWriter`:

java

Agora basta apenas imprimir utilizando o método `print()`:

java

Vamos testar novamente! Clique com o botão direto em cima do Tomcat e escolha a opção "Restart" para reiniciá-lo, então teste novamente o link `http://localhost:8080/minha-biblioteca/`:

imagem`, por exemplo, para listar os meus livros:

java

imagem` e registrar a nossa Servlet no arquivo web.xml que será responsável em descrever todas as informações de deploy da nossa aplicação! Por fim, vimos como enviar uma resposta em texto ou em **HTML** todas as vezes que alguém faz uma requisição à nossa aplicação.

E aí, o que achou da API de Servlet? Quer aprender mais sobre Servlets? Na **Alura** temos uma [**formação Java**], onde é abordado diversos assuntos sobre Servlets e os principais fundamentos sobre a programação de aplicações para Java Web!





imagem 

Você precisa comprar um botijão de gás e escolhe o app [Chama] para fazer seu pedido. Quando abre o app, suponha, hipoteticamente, que se depara com algo mais ou menos assim:

<iframe class="aligncenter" src="https://streamable.com/s/sbik1/azqpme?autoplay=1" width="340" height="582" frameborder="0" allowfullscreen></iframe>

Agora, se analisarmos em paralelo essa interação hipotética com o app real, teríamos algo assim:

<iframe class="alignnone" src="https://streamable.com/s/sbik1/azqpme?autoplay=1" width="280" height="479" frameborder="0" allowfullscreen></iframe>

 

<iframe class="alignnone" src="https://streamable.com/s/0eyac/gesrcx" width="280" height="479" frameborder="0" allowfullscreen></iframe>

Note que, no primeiro caso, temos uma mudança muito brusca de uma atividade para outra. A tela parece piscar toda vez que interagimos com algum botão diferente, tornando as transições pouco fluidas.

Já no segundo, **temos transições mais suaves, que ajudam a identificar quando acionamos alguma nova função**. Além disso, temos a inclusão de animações que auxiliam na compreensão de que algo está carregando, fazendo buscas, etc.

Consegue notar a diferença? Estes pequenos detalhes em animações trabalhados na UI (user interface) do app real, deram uma experiência completamente diferente da primeira que vivenciamos. Este recurso é conhecido como **Motion Design**.

## O que é Motion Design em UX?

O termo **Motion Design** é utilizado para nos referirmos à toda produção gráfica em movimento. Isto é, podemos citar os vídeos infográficos, os efeitos em filmes e, no nosso caso, pensando em UX, nas animações que encontramos ao interagirmos com diferentes interfaces.

Podemos usar isso para diferentes casos em nossos projetos, dependendo do propósito que queremos alcançar. Vamos ver algumas das possibilidades que encontramos por aí! :)

## As diferentes funções do motion design

No app da Chama, temos alguns outros tipos de uso o motion design, como a animação que busca os revendedores:

imagem com a ação que o público teria em um contexto real.

Depois, precisamos iniciar nossas [**pesquisas por referências**] do que já foi feito e definir nosso passo a passo para cada animação:

imagem, ou mesmo de **reforçar a marca**.

Existem diversas possibilidades para incluir animações em sua UI, **realçando alguma funcionalidade** ou simplesmente adicionando pequenos detalhes que tornam seu sistema muito **mais leve e agradável de interagir**.

Em consequência, conseguimos gerar uma experiência de usuário muito melhor, assim como notamos no exemplo do app Chama com as animações já inseridas.

Não se esqueça de sempre mensurar o impacto que o motion design tem em seu público fazendo pesquisas estratégicas para levantar esses dados. Na Alura temos um curso sobre [**Monitoramento de produto em UX**] muito bom para entender melhor sobre essa prática. :)




Fiz a leitura de um arquivo CSV com as informações de nome, e-mail e pontos de um aluno. Essas informações estão dentro de uma única `String`:

java

Agora preciso enviar essas informações para ele:

java

## Pegando um pedaço da String

E agora? Como eu posso pegar um pedaço dessa `String` e settar no meu aluno? Podemos usar o método da `substring()`, da classe `String`, que pega um pedaço dela por meio de 2 parâmetros:

java

Testando o código:

```
 Alex

```

Ótimo, funcionou!

O método `substring()` pegou justamente o nome do aluno Alex, pois o nome Alex inicia no começo (posição 0) e termina no 4º caractere dessa `String`, ou seja, para pegar o e-mail eu terei que usar o `substring()` de novo. Então, vamos verificar qual posição o e-mail está...

O começo é 6, agora o final... 7, 8, 9, 10, 11, 12, 15, 17, 20... Perdi a conta! Que chato! Todas as vezes eu vou precisar ficar contando a **dedo a posição do texto**?

E se o aluno fosse o Guilherme? Ele não terminaria na 4º posição... Com certeza isso vai dar um problema gigante!

## Separando palavras com o split

Além do método `substring()` a classe `String` possui o método `split()` que **separa o texto em linhas** de acordo com uma regra, por exemplo, quero que meu texto seja separado cada vez que aparecer um ";":

java

Visualizando o array:

```
 [Alex, alex.vieira@caelum.com.br, 15000]

```

Conseguimos separar as informações do aluno! Note que o `split()` devolveu um _array_ de `String`, isso acontece pois ele **separa cada linha em _Strings_ diferentes**, por essa razão é devolvido o _array_ de `String`. Agora podemos atribuir cada valor ao meu objeto aluno:

java

Verificando as informações do aluno:

```
 Exception in thread "main" java.lang.NumberFormatException: For input string: " 15000"

```

## Cuidados ao usar o split

Parece que a nossa conversão para `int` não deu certo... Apareceu a _exception_ pois em nossa `String` temos um espaço (_backspace_) entre o ";" e as informações, ou seja, em vez de receber apenas o número, foi recebido o espaço junto com o número, por isso não foi possível converter. Se imprimíssemos apenas o e-mail ele também viria com o espaço:

java

Imprimindo o email apenas:

```
 alex.vieira@caelum.com.br

```

## Aplicando expressão regular no split

Precisamos informar o `split()` para que ele tire os espaços também. O `split()` trabalha em cima de [expressão regular], ou seja, podemos especificar as regras utilizando expressão regular. Nesse caso eu irei usar a expressão "\\s" que significa espaço em branco:

java

Rodando o código novamente:

```
 Alex - alex.vieira@caelum.com.br - 15000

```

Funcionou! Porém tem um pequeno detalhe...a expressão regular ";\\s" significa que vai ser **sempre** que tiver ";" e um espaço juntos, ou seja, se a `String` fosse:

java

O resultado seria:

java

Com certeza meu sistema quebraria...

## Adicionando mais de uma regra com pipe

Para fazer com que o `split` lide tanto com o caso do ";" ou ";\\s" utilizamos o pipe (|):

java

Testando novamente aquela mesma `String`:

java

Excelente!

Agora conseguimos pegar todas as informações do aluno que vieram da `String`. É importante verificar que foram utilizadas duas "\\", pois é necessário "escapar" a barra para ser reconhecida dentro da `String`.

Vimos que quando precisamos separar textos em Java, nós temos o método `split()` da classe `String` que tem a capacidade de separar o texto em linhas de acordo com uma regra. No nosso exemplo foi separado em todas as vezes que apareciam ";" ou quando apareciam ";" e espaços juntos. Poderia também ser uma "," ou ":".

O importante é saber que o `split()` funciona em cima de expressão regular, então qualquer uma delas se aplica.

**O que achou dessa dica? Bacana, né? A gente fala bastante sobre manipulação de Strings [nos cursos de Java aqui na Alura].**




A resposta simples é que **não**. Esse tipo de variação não afeta muito a performance final.

Mas tem a resposta ultranerd que apareceu no [**fórum da Alura**] a partir da pergunta do Julio Cesar.

## Entendendo o GZIP

Na prática, nossos arquivos CSS são servidos com GZIP, um algoritmo de compressão que compacta o arquivo no servidor antes de ser transmitido pro navegador.

E acontece que **o GZIP é muito bom com textos repetitivos**. Pense naquela lousa do Bart Simpson com a mesma frase dezenas de vezes: o GZIP adora isso, a compressão é ótima, porque ele basicamente manda a frase 1x só e manda repetir as demais.

## O que isso tem a ver com CSS?

Bom, quanto mais repetições você tiver no seu CSS, melhor o GZIP vai trabalhar.

Imagine 2 classes:

css

Eu rodei o GZIP em linha de comando (`gzip -c file.css | wc -c`) nesse arquivo CSS simples pra ter uma ideia do tamanho final: **82 bytes.**

Coloquei em ordem alfabética as propriedades:

css

E rodei de novo: **77 bytes**.

Ambos tem as mesmas propriedades mas como não estão na mesma ordem, diminuem a eficiência do GZIP ao comprimir isso.

## O que devo considerar para melhorar a otimização do GZIP?

A ideia é que quanto maior for a intersecção de texto entre diferentes partes do arquivo, melhor pro GZIP comprimir.

Colocar em ordem alfabética vai melhorar a probabilidade de mais texto se repetir dentro do arquivo. Na verdade, qualquer ordenação lógica que não seja aleatória, _provavelmente_ vai aumentar essa chance.

> Se você fizer uma ordenação alfabética reversa, por exemplo, vai dar 77 bytes também

## Conclusão

Então a resposta super nerd é que ordenar seu CSS com alguma lógica consistente aumenta as chances do GZIP comprimir melhor seu CSS e, logo, menos bytes serem transmitidos pela Internet. Então aumentaria um pouco a performance.

Mas em geral essa "melhoria" é bem pequena, e eu não acho que valha a pena escrever seu CSS assim só por causa disso. Prefiro um CSS que siga o padrão que você julgar mais legível pra você. Até porque [existem ferramentas de build] que podem pegar seu CSS e fazer essa ordenação depois pra você.




Lidar com datas é sempre uma tarefa complicada, nesse artigo vamos resolver um dia e hora de uma empresa de estacionamento.

Essa empresa registra o dia e a hora de entrada e saída dos carros manualmente, inserindo no sistema cada informação em um campo separado:

go

Tendo como saída o seguinte resultado:
go

Atualmente, o valor recebido de data e hora está contido em uma `string`. Com isto podemos colocar qualquer valor nela, ou seja, ela pode receber tanto um texto quanto um número e isso pode ser um problema.

Geralmente, as linguagem de programação tem suas próprias libs para auxiliar este trabalho, como `DateTime` no C#, ou `Date` do Python e no Golang não é diferente.

# Formatação de data e hora
No Golang temos o pacote `Time`, que contém algumas funções para trabalhar com data e hora, além de facilitar a nossa vida durante formatação que vai ser exibida para o usuário.

go
Agora que importamos o pacote `time` dentro do nosso código, podemos fazer uso de suas funções.
# Utilizando o time Now()
No lugar de escrever a data e a hora em uma string, vamos utilizar a função `time.Now()`:

go
E temos como resultado:

go
Observe que temos informações demais aqui e este não é o resultado que nós gostaríamos. 
 
# Formatando datas com Golang
 
Quando queremos formatar em Golang, utilizamos a palavra format, seguido de algo bem diferente de outras linguagens de programação. Isso porque os formatos de data e hora parecem com a data e hora reais e não `Y-m-d H:i:s` como no PHP, por exemplo.
 
Vejamos então o que queremos editar e o em código Go:


| O que queremos editar     | código  |
|---------------------------|---------|
| dia (com zero)            | 02      |
| dia (sem o zero)          | 2       |
| dia da semana (inteiro)   | Monday  |
| dia da semana abreviado   | Mon     |
| mês com número (com zero) | 01      |
| mês com número (sem zero) | 1       |
| mês (nome inteiro)        | January |
| mês (nome abreviado)      | Jan     |
| ano (inteiro)             | 2006    |
| ano (abreviado)           | 06      |
| hora (com zero)           | 03      |
| hora (sem zero)           | 3       |
| hora (formato 24 horas)   | 15      |
| minutos (com zero)        | 04      |
| minutos (sem zero)        | 4       |
| segundos (com zero)       | 05      |
| segundos (sem zero)       | 5       |

Certo, mas como fica o nosso código?

go

E nosso resultado será:

go
Você pode acessar ver este código neste [link]:

Para deixar claro a diferença de trabalhar com data utilizando Golang e outras linguagens, comparamos com as linguagens Java e C:

GO:
go
Java:
java
C:
c

# Encontrar o formato de data e tempo 

Neste [link], você pode montar a formatação ideal e ver também outros tipos como segundos, milissegundos, entre outros.

# Conclusão.
Não precisamos manipular nossas datas usando o tipo String. Podemos usar um tipo preparado para trabalhar com datas e tempo no Golang: Time,, que formata nossa lista de uma maneira mais padronizada e de fácil compreensão.

E aí, o que achou do artigo? Fica até mais fácil trabalhar com datas no Golang agora, não acha? Se quiser continuar estudando sobre o assunto, dê uma olhada em nosso curso na Alura de [**GO lang**] continue aprendendo ainda mais!




No [**post anterior**], havíamos criado uma lista de cursos e por fim, fizemos com que a lista fosse uma lista personalizada, e o resultado foi o seguinte:

imagem`:

java

Agora precisamos fazer a implementação desse listener a partir da interface [AdapterView.OnItemClickListener]:

java

Para pegarmos um item da lista, nesse caso um curso, podemos utilizar o parâmetro `parent`, e então, chamarmos o método `getItemAtPosition()` passando o parâmetro `position` que é justamente a posição que se encontra o curso tocado!

java

Vamos testar a nossa App e verificar se está funcionando:

java

Funcionando conforme o esperado! Então agora só falta implementarmos a ação para que abra o navegador com a url do curso. Mas como podemos fazer isso? No Android, todas as vezes que queremos nos comunicar com alguma App externa, nesse caso o navegador, precisamos utilizar a classe `[Intent]`:

java

Porém, precisamos falar qual é a **nossa intenção** ao chamar a `Intent`, nesse caso, queremos fazer com que alguém, que saiba lidar com URL do site do curso, seja chamado pelo Android e resolva essa URL para nós.

Para indicarmos essa intenção, utilizamos as categorias da própria classe `Intent` que são constantes que permite verificar se alguma App instalada no dispositivo atende à categoria especificada, nesse caso usaremos a constante `ACTION_VIEW` da própria `Intent`:

java

Mas perceba que ainda não passamos a URL que precisa ser tratada, e como faremos isso? Simples! Basta apenas utilizar o método estático `parse` da classe `Uri` enviando a URL do curso, e então, mandamos como segundo parâmetro da instância da `Intent`:

java

Por fim, pedimos para que uma `Activity` que saiba resolver essa nossa intenção (`Intent`) seja iniciada com o método `startActivity()`:

java

Testando a nossa App, ao clicar no curso de Java que contém a URL: https://www.alura.com.br/curso-online-primeiros-passos-com-java, temos o seguinte resultado:

![lista-de-apps]

Perceba que ele lista todas as Apps que resolvem essa URL, pois utilizamos a categoria `ACTION_VIEW` que é uma categoria genérica que chama qualquer tipo de App que saiba lidar com a intenção que estamos enviando, nesse caso, foi uma URL com o protocolo HTTP.

Escolhendo uma das Apps sugeridas, nesse caso o Google Chrome, podemos verificar o resultado para essa `Intent`:

![abrindo-pagina]

Excelente! Agora eu posso verificar o conteúdo do curso que eu fiz apenas com um único toque!

Vimos que, quando precisamos nos comunicar com outras Apps do Android, podemos utilizar a classe `Intent` que nos permite utilizar uma categoria e a informação que queremos que seja resolvida, nesse caso, utilizamos a categoria `ACTION_VIEW` que é uma categoria mais genérica que vai chamar todas as Apps capazes de resolver a URL que enviamos por meio da classe `Uri`.

E aí, o que achou da forma que nos comunicamos com outras Apps no Android? Quer aprender mais sobre Android? Que tal dar uma olhada nos nossos [**cursos de Android**] na Alura? Além de `Intent`s, são abordados diversos assuntos para que você crie sua própria App Android!




Essa é uma grande dúvida. Para trabalhar com tecnologia, em especial programação, a resposta curta é **não**. O trabalho do dia a dia é bastante técnico e há muito espaço se você estuda, pratica e se dedica. Obviamente, com o tempo, alguma profundidade em diversos assuntos costumam ser necessários para dar um salto na carreira, e aí os ensinamentos, ambiente e aprendizado dentro de uma faculdade podem ajudar bastante.

Nesse vídeo, Paulo Silveira, que fez bacharelado e mestrado em computação na USP, conversa comigo, que acabei não me formando, e mostra essas e outras opiniões:

https://www.youtube.com/watch?v=jw06H8esyzQ&list=PLh2Y_pKOa4Ufs_KwjTdGBFH6b65ChApyD

Vale lembrar: a nossa opinião é de que **sim**, a faculdade  agrega muito, por mais que desconfiemos de algumas disciplinas e conteúdo. Seu objetivo não é apenas fornecer o conteúdo que o mercado pede, e sim ir muito além na formação de um profissional.

# Ciência da Computação ou Sistemas de informação?

Você pode aproveitar e ouvir esse podcast sobre as diferenças entre Ciência da Computação e Sistemas de informação

<iframe src="https://open.spotify.com/embed-podcast/episode/2T7pFgrwsF24Pl6uZoBU7m" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>




Quando estamos começando em PHP, normalmente, uma das primeiras coisas que aprendemos é a incluir um script dentro do outro:

php

Assim a gente evita muita repetição de código e consegue fazer os scripts interagirem entre si. E, com isso, surge na nossa vida o famoso `include`.

Entretanto, nem só de script é feito um bom desenvolvedor. E quando começamos a nos aventurar em orientação a objetos surge o `namespace`! E com ele vem a necessidade de utilizar o use:

php

Mas, muitas vezes, os porquês desse processo acabam ficando meio obscuros.

## Trabalhando sem namespace

Vamos supor que precisamos realizar o login do nosso sistema PHP. Um dos conceitos mais básicos da orientação a objetos é que se precisamos representar algo, criamos uma classe.

Logo, para resolver nosso problema, precisaremos criar uma classe de Login. Algo como, dentro de um arquivo Login.php:

php

Perfeito! Com nossa classe login conseguimos modelar uma forma para nosso usuário passar pela validação do sistema. Portanto, no nosso sistema, se quisermos realizar um login podemos usá-la:

php

Aqui, incluímos nosso arquivo Login.php no `Sistema` para que pudéssemos criar um novo `Login` e usar nossa classe.

Porém, em softwares modernos, temos apenas uma forma de login? É muito comum nos dias de hoje um sistema ter diversas formas de login por API, certo? Um exemplo disso são os logins pelo facebook, google plus, etc.

Se a gente teve a necessidade de criar uma classe Login para modelar a nossa forma de passar pela validação, é bem possível que essas APIs tenham feito a mesma coisa e também criaram seu arquivo Login.php, para descrever como o login deles funciona. Algo como:

php

Repare que temos uma class Login.php para nosso sistema, outra para a conexão de API. Será que até aqui já temos algum problema? Se pararmos para analisar, temos duas classes com o mesmo nome! Mas, isso resolvemos fácil. Basta trocar elas de pasta, deixando nossa estrutura parecida com:

php

Mas, no nosso sistema, precisariamos criar nosso login e o login da api, certo? Algo como:

php

Agora temos que dar new em 2 Login. Para isso, incluimos nossa classes de Login e a classe de Login da API. Mas, como o PHP vai saber de qual Login estamos falando quando demos `new`? Ambas as classes têm o mesmo nome!

Uma solução era mudar o nome de uma delas. Como normalmente não mexemos nos arquivos externos, mudaríamos nossa classe Login para algo como LoginInterno.

php

O que não faz sentido algum já que se a classe de Login está dentro do nosso projeto, é evidente que esse Login é interno!

Nesse caso estaríamos perdendo a semântica do nosso código por um problema de estrutura: não temos como diferenciar classes com o mesmo nome.

## Agora com namespace

Podemos dizer para o PHP que queremos diferenciar nossas classes da mesma forma que colocamos os arquivos em pastas no nosso sistema operacional. Mas, agora, ao invés de separar nossos arquivos em pastas, separamos em namespaces!

Como a estrutura de pastas de um sistema costuma ser bem organizada é muito comum a gente utilizar a própria estrutura de pastas para declarar nosso `namespace`. Algo como:

php

Como a classe Login está dentro da pasta class, colocamos ela no `namespace` class.

## Mas, e os nomes iguais?

Perfeito, nosso problema está resolvido! Colocamos nossas classes em namespaces diferentes e podemos usá-los, mas ainda temos um pequeno problema:

php

Ainda estamos tentando dar new nas classes com o mesmo nome. Por isso, quando usamos namespaces podemos dar apelidos ([alias]) para nossas classes! Algo como:

php

Agora sabemos exatamente que a classe LoginApi está relacionada ao namespace **api** sem mexer em nenhuma outra linha de código. Tornamos nosso código muito mais semântico, flexível, evitamos conflitos e ainda conseguimos organizar na mesma estrutura das pastas!

Algo que jamais conseguiríamos apenas com o include, afinal ele apenas inclui o conteúdo do arquivo. O conceito de namespace é algo extremamente importante de se entender para mantermos um código bem organizado e orientado a objetos.

Com o use, não estamos mais presos a uma string com o diretório do arquivo, o que evita problemas com o diretório exato. Temos uma forma elegante de lidar com a duplicidade das classes!

Claro que, isso não exclui completamente a utilidade dos includes. Ainda temos a necessidade de carregar os arquivos que vamos utilizar, porém podemos fazer isso com um único arquivo de [**autoload**] que carrega tudo pra gente.

Qualquer projeto grande, inclusive frameworks como laravel e symfony, trabalham com namespaces e utilizam autoload para incluir os arquivos. Para facilitar essa inclusão, surgiram alguns padrões de desenvolvimento mais conhecido como Php Standard Recommendation (PSR). 

**Se você quiser saber mais sobre PSRs, tem um outro [post aqui no blog] sobre boas práticas em PHP e PSRs.**

Aqui na alura, a gente sempre se preocupa com boas práticas. Se você quiser saber mais sobre boas práticas em PHP, da uma olhada no [**curso de design patterns**] =)






Se a resposta foi sim, e se você tem certa preferência por artes digitais ante as tradicionais pela simples conveniência de poder gastar tinta à vontade sem se sujar - deve considerar o ingresso na carreira de 3d e Animação.

Mas enfim, por que usar pixels e ferramentas digitais, se é do lápis e papel que as idéias tomam forma? Um dos atrativos das artes digitais, além da flexibilidade de edições posteriores, é que elas podem ser programadas para simulações, imersões e realidades virtuais singulares, direcionáveis a diversos propósitos além da simples - mas não menor apreciação estética.

Inicialmente escolhi o 3d pelo prazer de criar sem me sujar de tinta mesmo, e só depois de algum tempo visumbrei [inúmeras outras aplicações].

### O mergulho

Por mais que alguém te descreva um salto de paraquedas ou um mergulho submarino, você só terá idéia daquela sensação se tiver tido alguma experiência semelhante, e mesmo assim ainda será uma tradução subjetiva feita a partir das suas próprias.

Acontece o mesmo com qualquer experiência profissional específica, mas vou assinalar aqui o que foi importante no meu percurso - que começou no século passado, lá atrás em 1996 e poderá vir a ser útil no seu percurso, que começa hoje, na crista da onda da computação gráfica.

Antigamente precisávamos criar um cubo com quadrados, e uma esfera com linhas, mas hoje em dia, com apenas um clique você transfere uma idéia de sua cabeça por neuroimagem transcraniana; com outro clique manda um protótipo pra impressora 3d portátil; e com mais outro clique faz tudo se tornar interativo numa realidade virtual 'inacreditível'. Uau! Já tá fácil assim? Na verdade, não. 

Quem dera... Os carros ainda não estão voando, e a gente também tem que suar um pouco pra construir nossas imagens e filmes em 3d, mas garanto que está bem mais fácil do que no século passado. Porém, como o mercado de trabalho não mudou tanto quanto a tecnologia à disposição, vamos à pergunta simples de resposta complexa: por onde começar?

### Algumas acrobacias

O começo de qualquer novo caminho coincide com o medo e com a esperança, traduzido em perguntas que fazemos a nós mesmos: será que conseguirei aprender? 

Será que é muito complicado? Trabalharei num grande estúdio como um especialista numa longa linha de produção? Preferirei um estúdio pequeno, porém generalista e com mais liberdade artística? 

Ou farei as coisas do meu jeito, ao meu tempo, e serei um tranquilo freelancer eremita? Só posso adiantar que a resposta pra todas estas perguntas não é importante agora.

Como um antigo filósofo estóico lhe aconselharia para lidar com o futuro: [liberte-se do medo e da esperança]. 

Foque no presente, que é o mesmo pra todos, independente de qualquer um destes futuros concretizáveis, e comece a estudar hoje mesmo, colocando a mão na massa. Garanto que a massa de pixels é mais limpinha que a de argila do escultor ou as tintas a óleo do pintor. 

Os atores virtuais também são mais flexíveis e menos sujeitos aos delírios da fama, que os atores reais. Logo, se está decidido a aprender mais e crescer na carreira, melhor dar um passo de cada vez. 

Se quer aprender culinária, começar por fazer um ovo cozido pode ser mais difícil do que parece. Mas se quer entrar na carreira de 3d e Animação, que tal começar agora mesmo, [**aprendendo a fazer um ovo cozido mutante?**]

Uma vez firme e decidido(a), seu primeiro objetivo será montar um portfolio (do latim, literalmente, um 'carrega-folhas') que nada mais é do que um site ou galeria de imagens com seus melhores (ou únicos) trabalhos. 

Mas como vou produzir trabalhos se ainda não tenho experiência alguma? Ora, os projetos que você executar em nossos cursos do Alura podem fazer parte de seu primeiro portfolio, pois afinal, foi você quem fez. Outra dica é se propor a executar algo dentro do seu potencial ou conhecimento adquirido, como se executasse um projeto para um cliente fictício.

Meu primeiro portfolio continha uma vinheta animada para o dinossáurico serviço de música Napster, uma cena inspirada no filme Matrix, uma moto copiada descaradamente do desenho Akira, e um 'mech' animado também plagiado do filme Robocop.

Confesso que não fui nada original, o acabamento não era lá o melhor do mundo, e os respectivos autores nunca chegaram a ver minhas homenagens às obras deles, mas meu primeiro contratante viu e gostou bastante, e assim embarquei profissionalmente nessa jornada.

A dedicação diária aos estudos é essencial para construir um bom portfolio, então não hesite em sanar todas as suas dúvidas nos fóruns dos cursos enquanto prossegue. Perguntar muito e se colocar desafios também te faz progredir com mais segurança. 

Se você acha que não consegue realizar algo que está imaginando, tente começar por uma versão simplificada da mesma idéia, e vá do começo ao final da execução. Termine o que se propôs primeiro, e só então pule para a próxima idéia. 

Começar e não terminar algo, para seus futuros clientes ou contratantes, é o mesmo que não ter feito nada - por mais que você tenha aprendido um pouco no processo.

Mesmo que o resultado dos seus primeiros trabalhos fique aquém de sua expectativa, o importante é concluir e publicar. O feedback dos amigos e da família também é importante nessa fase só o da mãe-coruja que não vale.

Procure publicar suas imagens em comunidades de artistas iniciantes e experientes, como o [CGSociety] e o [DeviantArt], buscando a opinião de estranhos e anônimos isentos da necessidade de elogio por mera camaradagem. 

Lembre-se: você pode melhorar seu porfolio com o tempo, mas se não finalizar cada pequeno projeto que se propuser, não terá sequer um portfolio.

As críticas de outros artistas e até de leigos ou iniciantes, o ajudarão a se aperfeiçoar, e seguindo a máxima do 'fazer e terminar', em breve você terá qualidade apresentável para conseguir sua primeira participação em uma equipe ou um projeto alheio. Repetindo: comece e termine, várias e várias vezes. 

Que seja simples, mas esteja feito, publicado, e comentado. E se não sabe como organizar,publicar e atualizar um portfolio que seja comentável, que tal começar dando os [primeiros passos com o wordpress]?

### A aterrisagem

Aos poucos você incluirá trabalhos realizados como freelancer ou contratado fixo ao seu portfolio, mas isto é só o começo. Talvez surjam oportunidades na publicidade, na arquitetura, no cinema, na pré-visualização aeroespacial, quem sabe? Tudo dependerá do direcionamento que você der aos seus projetos iniciais e às ofertas de trabalho posteriores. 

Uma ilustração científica pode dividir espaço com um motion design completamente abstrato no mesmo portfolio? Sem problema. Se esta versatilidade te agrada, siga por ela. Só não suponha que por ter se safado de uma árdua e longa carreira em medicina - que seus pais ou avós tanto sonhavam, por exemplo - estará livre de constantes atualizações por toda a carreira.

Assim como o médico ou qualquer outro profissional sujeito a criteriosas exigências, o artista de 3d também está em constante aprendizado, pois as ferramentas evoluem, surgem novos métodos para resolver antigos problemas de maneira mais eficiente, e portanto, não podemos parar nunca de aprender se quisermos responder às necessidades sempre novas dessa caixa de pandora que é a era da informação.

Estamos nos aproximando rapidamente de um novo ciclo da experiência audiovisual (e tátil!). O desenho e a pintura um dia ganharam uma caixa escura, e surgiu a fotografia. Essa foi colocada em movimento pelo rotoscópio, e surgiu o cinema.

O cinema era preto e branco (e mudo!) Com o tempo vieram as vozes e também as cores. Os videogames começaram como um ping-pong de quadradinhos preto-e-branco, e hoje praticamente estamos interagindo com um filme de cinema. Enfim, já desponta comercialmente a tão prometida realidade virtual.

As aplicações para essa míriade de possibilidades do 3d e da Animação, vão do tratamento de fobias à simulação de treinamento cirúrgico, passando por telepresença e simuladores para 'n' fins. A narrativa artística também já ganha uma nova modalidade: a de filmes imersivos. 

E neste turbilhão de possibilidades audiovisuais interativas, estão os artistas de 3d, animadores, roteiristas, programadores, e outros tipos de profissionais que não se contam numa mão só, dando fôlego e forma a esta nova etapa da representação artística e científica. 

As evoluções neste meio não param, e não desacelerarão tão cedo. E você, vai ficar aí assistindo e esperando, ou vai tomar coragem e pôr o pé na estrada e a mão na massa, seguindo nossas trilhas de design, UX, photoshop, ilustração, video, [**3d e Animação; com novos cursos todo mês?**]

Comece um curso hoje mesmo: foque no presente, que o futuro dele depende.




A empresa AirTravellers, uma agência de viagens, solicitou um banner e chegaram ao seguinte resultado:

imagem** não causa estranhamento:

imagem

## Indo mais além

Além destas técnicas, há outros exemplos muito interessantes que podemos encontrar por aí. Desde as soluções mais simples até as mais elaboradas, mas que são igualmente válidas.

No site da [**Hipster.tech**], por exemplo, foram usadas transparências coloridas sobre as fotos. Além de ajudar na legibilidade do texto, essa solução deixou o visual descontraído, bem como a hipsters.tech se representa.

![]

Outra opção muito sutil é a usada no [**JovemNerd**], um site que apresenta muitas imagens logo de cara e, para não perder o impacto dessas fotos nem a legibilidade, foi adicionado um efeito gradiente muito suave, quase imperceptível. O suficiente para resolver o problema.

![]

Olhando mais de perto podemos notar a diferença:

![]

Como você pôde ver, essas são algumas das saídas que encontramos por aí, pensadas de acordo com a característica e a proposta de cada situação.

E que tal aprender a tratar imagens no Photoshop? Na Alura temos o [**Curso de Photoshop: Tratamento de imagens**], onde você vai aprender algumas técnicas de uma das ferramentas mais famosas no mundo de Design.




**SQL** é uma linguagem padrão para trabalhar com **bancos de dados relacionais**. Ela é uma linguagem declarativa e que não necessita de profundos conhecimentos de programação para que alguém possa começar a escrever **queries**, as consultas e pedidps, que trazem resultados de acordo com o que você está buscando. **SQL** significa **Standard Query Language**, literalmente a linguagem padrão para realizar queries.

A **linguagem SQL** é utilizada de maneira relativamente parecida entre os principais bancos de dados relacionais do mercado: Oracle, MySQL, MariaDB, PostgreSQL, Microsoft SQL Server, entre muitos outros. Cada um tem suas características, sendo o **MySQL** e o **PostgreSQL** extremamente populares por possuírem versões gratuitas e de código aberto.

É também uma linguagem que muitos profissionais acabam precisando aprender: seja quem usa Excel de forma pesada e acaba migrando as informações para um banco de dados, seja um cientista de dados que usa Python para agregar os dados das diferentes fontes de informações.

# SELECT: uma query de consulta a um banco

Imagine que você tem uma tabela de banco de dados, que realmente pode ser feito uma analogia com uma **planilha de Excel**, para guardar as informações das suas notas fiscais:

```
+----+----------------------------+------------+-------+
| id | titulo                     | pagamento  | valor |
+----+----------------------------+------------+-------+
|  1 | canetas                    | 2019-07-05 |   150 |
|  2 | notebook                   | 2019-07-01 |  1200 |
|  3 | macbook                    | 2019-07-02 |  2100 |
|  4 | microfone                  | 2019-07-05 |    90 |
|  5 | matricula alura            | 2019-07-09 |   900 |
|  6 | gasolina reembolso diretor | 2019-06-10 |   200 |
+----+----------------------------+------------+-------+
```

Se você quer buscar todas as notas fiscais que tem valores acima de mil reais, a query que você deve rodar é uma que vai selecionar (`SELECT`) todos os campos (`*`) onde (`WHERE`) o valor da nota seja maior que mil (`valor > 1000`):

```
SELECT * FROM notas_fiscais WHERE valor > 1000
```

E o resultado será algo como:

```
mysql> SELECT * FROM notas_fiscais WHERE valor > 1000;
+----+----------+------------+-------+
| id | titulo   | pagamento  | valor |
+----+----------+------------+-------+
|  2 | notebook | 2019-07-01 |  1200 |
|  3 | macbook  | 2019-07-02 |  2100 |
+----+----------+------------+-------+
2 rows in set (0.00 sec)
```

Com você pode ver, é bastante simples e direto. Quase uma sentança escrita em inglês. Esse caso foi no mysql mas essa query é padrão em todos os bancos de dados.

Poderíamos ainda apenas listar todos os campos ordenando pela data de pagamento, usando `ORDER BY pagamento`:

```
mysql> SELECT * FROM notas_fiscais ORDER BY pagamento;
+----+----------------------------+------------+-------+
| id | titulo                     | pagamento  | valor |
+----+----------------------------+------------+-------+
|  6 | gasolina reembolso diretor | 2019-06-10 |   200 |
|  2 | notebook                   | 2019-07-01 |  1200 |
|  3 | macbook                    | 2019-07-02 |  2100 |
|  1 | canetas                    | 2019-07-05 |   150 |
|  4 | microfone                  | 2019-07-05 |    90 |
|  5 | matricula alura            | 2019-07-09 |   900 |
+----+----------------------------+------------+-------+
6 rows in set (0.00 sec)
```

# Quais são os principais comandos SQL?

Os **principais comandos SQL** são:

- `SELECT`: busca linhas em tabelas de acordo com um critério definido dentro da chamada cláusula de `WHERE`
- `INSERT`: insere novas linhas na tabela. no nosso caso, colocaria novas notas fiscais dado os argumentos que são passados para o `INSERT`.  Por exemplo, no nosso caso: `INSERT INTO nf (titulo, pagamento, valor) VALUES 'canetas', '2019-07-15', 150`.
- `UPDATE`: atualiza linhas do banco de dados de acordo com um critério de `WHERE`, como mudar o CPF 
- `DELETE`: remove linhas da tabela de acordo com um critério.

Há ainda uma infinidade de subcomandos para fazer buscas melhores e mais elaboradas, como `JOIN`, `LIKE`, `HAVING` e `GROUP BY`.

Não se assuste! O trabalho básico com tabelas, linhas, colunas, relacionamentos e chaves não demanda um conhecimento extenso de SQL. Ele vai se fazer necessário para otimizar consultas e tomar decisões de como modelar esses dados.

# Modelagem de banco de dados.

imagem

Além desses comandos, você será exposto a formas de criação de tabelas e de colunas, como `CREATE TABLE` e `ALTER TABLE`. A **modelagem de banco de dados** é a forma que definimos com as tabelas vão armazenar e relacionar os nossos dados, isso é, como estruturar esse relacionamentos para que não fique algo difícil de dar manutenção e validação como acaba sendo com planilhas.

Por exemplo, a tabela acima criamos usando:

 

# Como posso aprender a trabalhar com SQL?

O ideal é começar trabalhando com uma base bastante simples, com uma única tabela, que tenha o modelo de dados próximo do que você conhece e busca. Aconselho que utilize o **MySQL** ou o **PostreSQL**.

Nos [**cursos de SQL**] da Alura você encontra desde a instalação e modelagem de banco até os primeiros comandos SQL, tanto no MySQL e PostgreSQL quanto no SQLServer e Oracle. E conheça mais dos [**comandos básicos de SQL**] nesse outro artigo.





Neste post nós batemos um papo com uma aluna nossa que tem um perfil um pouquinho diferente da maioria: ela é designer e música! Toca ukulele, violão, piano, violino, cavaquinho e também canta 😮 Vamos ver como foi essa conversa!

imagem, eu estou produzindo uma webserie de vários curtas (a Alura tem me ajudado nessa também).

### Gosta de estudar o que na Alura? Sempre fez cursos online?

[**Design UX**] é minha paixão, mas eu realmente não tenho limites quando se trata de vocês.

Posso começar assistindo uma aula sobre [**design thinking**] e lá pelas 3 da manhã eu percebo que estou aprendendo a fazer uma [**animação no Cinema 4D nos cursos**]. É bem doido hahaha.

Eu não costumava fazer cursos online, por sempre achar o curso que queria, mas não da maneira que queria. Da maneira que vocês fazem!

### Tem dificuldades pra estudar assim? Tem alguma dica?

Eu tenho uma maneira bem particular de assistir as aulas. Primeiro tem que estar na velocidade máxima. Sim, sou bem acelerada haha. E as vezes, aqueles "resumos-pós-vídeo" me ajudam 10x mais!

Sabendo que existem váaaarias maneiras de absorção de informação, a minha é mais visual, por leitura. Então aqueles resuminhos sempre me salvam.

Acho que não tenho alguma dica específica, vocês são bem completos!

### Já desenvolveu algum projeto usando algo que aprendeu na Alura?

Sim! Depois de estudar bastante sobre o [After Effects], aprendi a fazer animações, e agora estou aplicando isso no meu TCC e em alguns projetos de audiovisual que estou montando.

Também estou aprendendo a desenvolver o [**front-end**], e agora posso sair só das telas desenhadas no photoshop e finalmente fazer com que elas funcionem!




Criado em 1990 pelos irmãos Thomas e John Knoll, o Photoshop mudou a história da fotografia e do design. Na época, Thomas estudava na Universidade de Michigan e elaborava um projeto de um programa para manipulação de fotos. 

Um ano depois, o software foi vendido para a Adobe e, desde então, não parou de crescer e receber novas funcionalidades.

Hoje, sem sombra de dúvidas, esse software é indispensável para os profissionais da área, e já se tornou referência até para quem não trabalha com edição de imagens ou mesmo com computadores. 

De fato, trabalhar com Photoshop é poder criar novas possibilidades para suas imagens, e dar asas a sua imaginação. 

## 1\. Limpeza de pele

As ferramentas carimbo _(clone stamp)_ e pincel de recuperação _(healing brush)_ são excelentes para eliminar defeitos de pele em fotografias.

Ambas têm a mesma forma de utilização, mas com finalidades um pouco diferentes. A primeira faz uma clonagem da área selecionada. Já a segunda reproduz a cor e os meios tons de forma mais suave.

A seguir, veja como usá-las corretamente:

1. crie uma nova camada em “Camada” _(“Layer”)_ > “Nova” _(“New”)_ > “Camada” _(“Layer”);_
2. selecione o carimbo (ou o pincel de recuperação) na paleta de ferramentas e escolha o tamanho e o tipo do pincel adequados. A opção de opacidade _(opacity)_ indica a intensidade do carimbo. O ideal é que ela fique entre 20% e 50% para tratamento de pele;
3. clique com o botão esquerdo do mouse, enquanto mantém a tecla alt pressionada. Esse comando aciona um ícone em formato de alvo. Solte a tecla alt e movimente o mouse até a área que você quer retocar;
4. clique com o botão esquerdo na área.

imagem_ e selecione os dentes. Nesse momento, não se preocupe com tanta precisão;
2. no menu “Camada” _(“Layer”)_, selecione: “Nova Camada de Ajuste” _(“New Adjustment Layer”)_ > “Matiz/Saturação” _(“Hue/Saturation”)_. Escolha os “Amarelos” _(“Yellows”)_ no menu de cores;
3. altere o valor da saturação para clarear os dentes. Esse número varia conforme a fotografia; o importante é buscar o branco mais natural possível;
4. seguindo no painel “Matiz/Saturação”, clique em “Máscaras” _(“Masks”)_ e aumente um pouco o valor da “Difusão” _(“Feather”)_ para evitar que a seleção criada fique com uma borda muito evidente.

imagem_. Para isso, clique duas vezes na camada e, na caixa de diálogo que será aberta, clique em “OK”;
2. na caixa de ferramentas, clique na opção “Retângulo Arredondado” _(“Rounded Rectangle Tool”)_ e defina o raio _(radius)_ para 30 pixels;
3. desenhe o retângulo por cima da imagem. Você pode movê-lo até encontrar o posicionamento desejado;
4. na janela de camadas, clique e arraste a camada da foto em cima da “Forma 1”;
5. ainda com a camada da foto selecionada, clique na seta localizada no canto superior direito da janela e depois em "Criar Máscara de Corte" _(“Create Clipping Mask”)_.

imagem_. imagem_ > “Desfoque” _(“Blur”)_ > “Desfoque Gaussiano” _(“Gaussian Blur”);_
imagem_ > “Ajustes” _(“Adjustments”)_ > “Brilho/Contraste” _(“Brightness/Contrast”)_ e faça os ajustes necessários para deixar a imagem com mais luminosidade;
imagem_ > “Ajustes” _(“Adjustments”)_ > “Curvas” _(“Curves”_).
imagem_ e de plano de fundo _(background)_ para #ff0000 (vermelho) e #00ff00 (verde), respectivamente;
- duplique a camada: “Camada” _(“Layer”)_ > “Duplicar Camada” _(“Duplicate Layer”);_
- nessa nova camada, aplique o mapa de degradê: “Imagem” _(“Image”)_ > “Ajustes” (_“Adjustments”)_ > “Mapa de Degradê” _(“Gradient Map”);_
- ainda nessa camada, use as opções de mesclagem: “Camada” _(“Layer”)_ > “Estilo de Camada” _(“Layer Style”)_ > “Opções de Mesclagem” _(“Blending Options”);_
- na caixa de opções, selecione o modo de mesclagem _(blend mode)_ para “cor” _(color)_ e a opacidade _(opacity)_ para 50%;
- achate a imagem: “Camada” _(“Layer”)_ > “Achatar Imagem” _(“Flatten Image”);_
- aplique um filtro de ruído: “Filtro” _(“Filter”)_ > “Ruído” _(“Noise”)_ > “Adicionar Ruído _(“Add Noise”)_ com 2% de intensidade _(intensity)_ e distribuição gaussiana _(gaussian)_. Acione também a opção “monocromático” _(“monochromatic”)_.

imagem_ > “Duplicar Camada” _(“Duplicate Layer”);_
- aumente o zoom para 100% de visualização. Para isso, clique duas vezes na ferramenta de zoom;
- clique em “Filtro” _(“Filter”)_ > “Outros” _(“Other”)_ > “Alta Frequência” _(“High Pass”)_. O valor a ser usado nesse filtro varia conforme a foto, portanto, é preciso fazer alguns testes para ver qual fica melhor em sua imagem;
- para que o efeito seja colocado apenas nos olhos, crie uma máscara nessa região: “Camada” _(“Layer”)_ > “Máscara de Camada” _(“Layer Mask”)_ > “Ocultar Todas” _(“Hide all”);_
- com a máscara criada, use um pincel suave de cor branca e pinte toda a área dos olhos;
- mude o blend mode dessa camada para a opção “sobrepor” _(“overlay”)_. Essa alteração pode ser feita na própria janela de camadas, em substituição à opção “normal” definida como padrão.

imagem_ > “Scripts” _(“Scripts”)_ > “Processador de Imagens” _(“Image Processor”);_
imagem e as dimensões (largura e altura) para as novas imagens;
imagem_ para guardar essas configurações para uso posterior;
imagem_ para iniciar o trabalho de redimensionamento das imagens.
![]

Bem, essas foram as dicas de hoje! Esperamos que você tenha gostado, e que elas possam te ajudar a trabalhar com Photoshop. Agora, aproveite para conferir também algumas [**dicas do illustrator que você precisa conhecer!**]




Um dos nossos desafios diários é casar o tempo com os estudos. E com tantas informações como mídia sociais, sites com streaming de séries e filmes, além da falta de incentivo para o auto investimento entre outras coisas, acabam afetando nossa motivação e deixam aquela dúvida: **Como se manter motivado para estar aprendendo coisas novas? Que carreira seguir? Como saber no que posso investir para meu próprio futuro?**

Neste episódio do Alura Live, o host Gabs Ferreira está de volta conversando sobre aprendizado, carreira, hábitos de estudo e a vontade de aprender com Guilherme Silveira, Head de Educação e um dos fundadores da Alura e Carlos Felício, Diretor Admnistrativo da Caelum.

Quer saber um pouco melhor sobre hábitos e que carreira seguir?

https://www.youtube.com/watch?v=a84Hd9c1_sw

Ainda ficou afim de saber ainda mais sobre esse tema? Assista a [live completa!]

Algumas carreiras da Alura:

- Comece agora a programar: [Iniciante em Programação]
    
- Quer aprender a criar aplicativos? [Desenvolvedor Android]
    
- Não quer programar e quer saber editar seus vídeos? [Editor de Vídeo]
    
- Ainda sim pensa em algo diferente, como ranquear sua página no Google? [SEO Expert]
    

Não deixe de nos seguir twitter: [Gabriel Ferreira], [Guilherme Silveira], Carlos Felicio não tem twitter gente :/ e a [Alurinha]! :D




Chegou a hora de se preparar para prestar concurso público. Afinal, bons salários, estabilidade no emprego e chances de crescimento na empresa são mais que ótimos argumentos, não é? Pode parecer muito bom para ser possível, mas se preparar é mais fácil do que você imagina.

Neste post daremos uma visão geral do que costuma cair nas provas de concurso público para a área de TI: conteúdos básicos, exclusivos, gerenciais e da própria área de TI. Além disso, apresentaremos também algumas dicas e métodos de estudo, que podem ajudá-lo, já que eles facilitam a forma de lidar com todo esse conteúdo.

Ficou interessado? Confira!

## Conteúdos e temas recorrentes nas provas

De fato, quase sempre há concurso público aberto para a área de TI e, geralmente, eles oferecem [**bons salários**].

Apesar da complexidade e crescente especialização da área, eles costumam ter alguns conteúdos e temas em comuns, que nós podemos adiantar aqui:

### 1 Conteúdos básicos

Em geral, esses conteúdos não são de TI, mas estão presentes em uma vasta gama de concursos por isso os chamamos de básicos.

Grosso modo, consistem em Português, Matemática, Raciocínio Lógico, Inglês, e conteúdos administrativos-legislativos (Direito Constitucional, Administração Pública, etc.). Alguns exemplos de conteúdos nessas áreas:

- [Português]: acentuação gráfica (crase, acentos, etc.), ortografia (emprego de palavras como porque/ porquê, etc.), morfologia (uso de substantivos, pronomes, preposições, etc.), dentre outros;
- [Matemática]: conjuntos numéricos (naturais, inteiros, etc.), equações de 1º e 2º graus (situações problema, análise de gráfico, etc.), logaritmos, geometria analítica e plana, dentre outros;
- [Administração]: teoria geral da administração, recursos humanos (cargos e salários, etc.), qualidade e produtividade (5S, 6 Sigma, etc.), controle (auditoria, fiscalização), dentre outros.

Um dos maiores erros de concurseiros é ignorar o valor desses conteúdos. Eles podem ter até um peso mais baixo, mas ainda valem pontos. E quem quer perder pontos?

Se você não estuda nada para eles, corre o risco de zerar as questões — nesse caso, pode ser eliminado pelo conteúdo mais simples. Melhor não se arriscar, correto?

### 2 Conteúdos exclusivos

Também não-TI, esses são conteúdos vinculados às leis e regimentos que regulam as empresas e organismos das vagas. São as normas e instruções legais que, por exemplo, estabelecem a criação do órgão ou falam das responsabilidades dos funcionários.

Dentre eles, temos:

- Regimentos internos (regimentos da Câmara, [regimentos de tribunais], etc.);
- Leis orgânicas (da Polícia Civil, do Tribunal de Contas da União, etc.);
- Direitos específicos (Tributário, Ambiental, Autoral, etc.).

É um conteúdo difícil de se estudar, mas que pode ser dividido em pequenas partes e estudado aos poucos. Desse modo, ele fica mais compreensível e fácil de lembrar.

É muito comum os candidatos errarem ou mesmo ignorarem esses conteúdos. Em geral, acham impossível decorar tudo. Logo, você tem aqui uma oportunidade. Eles podem ser um diferencial para aprovação.

### 3 Conteúdos gerenciais

Esse é um conteúdo que pode parecer maçante. Faz sentido, afinal de contas, é muito papel e pouco teclado quando o assunto é gerência e planejamento.

Apesar disso, é um conteúdo que pode ser bem memorizado, já que é bem lógico. Como não é algo comum no dia a dia, pode ser privilegiado nos seus estudos. Por quê?

Porque, digamos que você já programe em alguma linguagem. Tendo facilidade nela, você não precisa se dedicar a essa mesma linguagem de programação da mesma forma que a um conteúdo que não domina.

Esses conteúdos estão muito presentes em concursos para cargos como o de Analista, o de Consultor e outros. Ele tratam de Gestão, Planejamento e Governança de TI. Alguns itens que provavelmente cairão são:

- PMBOK - Project Management Body of Knowledge;
- COBIT - Control Objectives for Information and related Technology;
- ITIL - Information Technology Infrastructure Library;
- Redes de Computadores — Protocolos TCP/IP, HTTP, etc.

### 4\. Conteúdos de TI

São os conteúdos mais técnicos e abarcam tanto sua [dimensão infraestrutural] como desenvolvimento. Conteúdos comuns são:

- [Segurança da Informação];
- Arquitetura de Computadores;
- Paradigmas de Programação (Orientada a Objetos, por exemplo);
- Linguagens de Programação (Java, PHP, etc.);
- Banco de Dados;
- Engenharia de Software;
- Arquitetura de Sistemas.

Bem, pode parecer extenso, mas saiba que há práticas para trabalhar esse conteúdo de maneira viável. Vejamos, então, algumas dicas para potencializar seu estudo!

## Recursos e formas de estudar

Um bom começo sempre é planejar o estudo. E, para isso, [**a técnica SWOT**] pode ser uma bela ajuda.

Sigla de Strengths, Weaknesses, Opportunities e Threats (forças, fraquezas, oportunidades e ameaças, respectivamente), essa técnica mapeia o que você sabe, além do que deve saber e tem facilidade ou dificuldade. E, é claro, [**elimina distrações e procrastinação**].

Além de ler, resumir e anotar o conteúdo planejado, exercitar é vital. Quanto a isso, os [**simulados de prova**] são uma das melhores opções.

Você viu que entre os conteúdos e temas das provas existem links para questões? Experimente testar seu conhecimento através delas. Faça provas inteiras — assim você sai da teoria e se obriga a lembrar do conteúdo.

Recomendamos estes simulados: [Analista de TI do CODEMIG], de 2013; [Analista de TI do INSS], de 2014; e [Técnico de TI da PRODABEL], de 2010. Mas não fique só nesses, busque e faça [outros simulados] também!

Complemente esses exercícios e a leitura com outros conteúdos. Você pode buscar as [videoaulas], por exemplo. E, por fim, não ignore que você ainda é humano, e não um computador.

Seu [corpo precisa de descanso], lazer e atividade física. Sem eles, o cérebro tem dificuldade de reter memórias de curta duração, necessárias para transformarem-nas em conhecimento. Por isso, busque dormir as oito horas de sono recomendadas e tenha atenção com a sua alimentação!

Ser aprovado em um concurso público é algo muito desejado em qualquer área. E a [**Alura**] pode ajudá-lo nessa jornada! Com profissionais atuantes na área, nós desenvolvemos cursos que dão uma visão completa do conhecimento necessário, seja para já trabalhar, atualizar suas habilidades ou passar no concurso. 




Imagina que você tá usando o seu aplicativo bacana pra tirar fotos e aplicar uns filtros marotos. Você vira o celular de lado para enquadrar melhor a foto e quando vai ver o resultado percebe que a foto saiu desse jeito:

![Por que a orientação está incorreta?]

Mas por que será que isso aconteceu?

Isso acontece porque o sensor da câmera é fixo e não sabe como o dispositivo está posicionado quando a foto é tirada. O papel dele é simplesmente capturar a imagem. Ah, mas quando tiramos uma foto com o celular virado de lado e abrimos a foto na galeria ela tá com a orientação correta!

Verdade! Isso mostra pra gente que tem alguém no meio do caminho fazendo algum tipo de correção pra mostrar a foto direitinho. Bom, o sensor da câmera é fixo mas sabemos que as câmeras digitais e também nossos smartphones tem aqueles sensores de orientação pra saber quando devem virar a tela. O que eles fazem então é salvar a imagem juntamente com essa informação da orientação justamente pra que a gente consiga corrigir depois.

Pra salvar essas informações extras, praticamente toda câmera digital salva as imagens no formato **Exif** que permite armazenar algumas tags com informações como data, hora, geolocalização e também a orientação da câmera no momento da captura. Isso significa que para mostrar uma foto no seu aplicativo com a orientação correta, você só precisa conseguir ler esses dados extras e descobrir qual correção aplicar antes de exibir a foto!

Mãos à obra então! Vamos criar uma classe que consiga devolver pra gente um `Bitmap` corrigido a partir do caminho de uma foto. Usaremos a classe `ExifInterface` para acessar as informações extras da imagem e descobrir a orientação da foto:

java

Agora que temos a orientação, só precisamos descobrir qual rotação devemos aplicar ao abrir o `Bitmap`. Para isso, vamos comparar a orientação que obtivemos da `ExifInterface` com algumas constantes que já estão prontas. Como essas constantes são do tipo inteiro, vamos ter que converter a orientação que pegamos da `ExifInterface` pra inteiro antes de fazer a comparação:

java

Agora só precisamos criar mais um método que abra a imagem como um `Bitmap` e faça a rotação de acordo com a correção a ser aplicada.

java

Pronto! Agora só precisamos utilizar esse método na nossa classe que carrega as fotos. Veja como fica o código completo:

java

Legal! Então agora só precisamos usar essa classe toda vez que formos carregar uma imagem. Então se a gente tiver uma `Activity` com uma `ImageView` pra mostrar uma foto, poderíamos usar nossa classe assim:

java

Agora sim já podemos mostrar nossas fotos sem se preocupar se elas foram tiradas com o celular de pé ou de lado!

O que você achou dessa dica? Também já passou por esse problema e resolveu de outro jeito? Conta pra gente! Se quiser aprender mais sobre desenvolvimento pra mobile, dá uma olhadinha nos [**cursos mobile do Alura**] ou nos [cursos presenciais da Caelum]!




imagem

Você tem uma campanha de lançamento de um novo produto, aplicativo ou plataforma, mas não sabe a melhor maneira de impactar seus clientes no Facebook?

Quer impactar as pessoas que já se relacionam com sua marca, reforçando os brandlovers, mas não sabe como encontrá-los e como atingi-los de maneira assertiva para potencializar a ação?

E se eu te contar que você pode encontrá-los dentro da plataforma de uma maneira fácil, assertiva, com grande potencial, e ainda reforçar mais um ponto de impacto? Será que isso é possível?

Poucos sabem (e reconheço que fica até um pouco escondido hahaha) mas o quanto é escondido lhe garanto que é eficaz, dentro de nosso glorioso [**Power Editor**] no Facebook, conseguimos trabalhar com lista de e-mails!

E como isso pode beneficiar em suas estratégias? (Pode estar se perguntando aí agora). Você pode subir sua base já fidelizada, seja captada por leads de seu blog, ou mesmo campanhas de vendas de **e-mail marketing** que você trabalha, e ele automaticamente cruza as informações dentro da ferramenta e encontra seus clientes pra você limpo, claro e rápido sem pestanejar. ( E aí é legal ou não é?)

E o mais interessante é que ele não te limita a nada, não há restrição de número de bases, você possui total liberdade de criar e ter uma segmentação própria para cada assunto, por exemplo, de cada seção de seu site, cada tipo de produto e trabalhar com cada interesse individualmente em seus anúncios.

> _Opa! Show de bola, mas onde encontro esse tal de **Públicos** que tanto fala no Facebook?_

Mole, dentro do nosso famoso Power Editor, procure a seção **Ativos**, e lá terá **Públicos**.

imagem_





imagem 

Ao desenvolver um app de e-commerce, a tela inicial ficou mais ou menos assim:

imagem

Alguns podem ainda confundir esse recurso com uma **pesquisa dinâmica**, mas existem pontos que deixam clara essa diferença.

## Pesquisa dinâmica

Em uma pesquisa dinâmica, também começamos digitando o item que esperamos encontrar:

![]

Contudo, as sugestões apresentadas não são apenas de termos que eu possivelmente estou buscando, mas sim de itens que já estavam sendo apresentados na página e, ao digitar na busca, eles foram "filtrados" como possíveis sugestões do que eu buscava nessa página.

Só que, se estamos falando de uma grande base de dados, talvez esse recurso não funcione tão bem.

Para contextos maiores, uma saída melhor para a busca poderia ser a **pesquisa avançada**.

## Pesquisa avançada

Em uma **pesquisa avançada**, estamos tratando com critérios e um refinamento muito maior para a busca que o usuário quer fazer:

![]

Nesse caso, o usuário entrará com diversos inputs mais específicos, afunilando a pesquisa de acordo com o que ele busca.

Esse recurso é mais utilizado em buscas complexas, porém podemos incluir uma outra forma de afunilar uma busca através de uma **pesquisa categorizada**.

## Pesquisa categorizada

Nesse tipo de pesquisa, podemos simplesmente incluir um filtro de poucas categorias:

![]

Nesse caso conseguimos dividir os resultados em "todos", “apenas notícias”, “apenas imagens”, etc...

Ao fazermos isso, diminuímos o escopo da pesquisa, isto é, assim como na divisão em categorias que o autocomplete pode oferecer, com essa "pré categorização", direcionamos melhor o que o usuário busca.

## Alguns pontos importantes

No caso do app que criamos, o autocomplete com categorização foi suficiente. Porém, existem alguns detalhes a considerar:

Quando fazemos uma ferramenta de busca, não podemos nos esquecer de oferecer ao usuário o feedback necessário para compreender que a ação está ocorrendo, **portanto inclua um elemento de carregamento ou progresso, que sugira a ação acontecendo**.

![]

Ou ainda, se eu errei o que estou digitando ou desisti de procurar pelo que coloquei no campo de busca, posso deletar tudo o que escrevi, ou oferecer ao usuário a opção de deletar tudo o que fora escrito de uma vez, isto é, **um botão que limpa todo o campo de uma vez**.

![]

Por fim, não podemos nos esquecer das lacunas que eventualmente podem virar "becos sem saída" ao usuário como, por exemplo, realizar uma busca que não tem nenhum resultado encontrado.

Nesse momento, podemos diminuir a frustração do usuário oferecendo novas possibilidades de itens ou de termos de busca que o direcione a alguma nova ação ou opção.

![]

Trabalhando bem uma ferramenta de busca conseguimos tornar a experiência do usuário muito mais focada e rápida, levando esse usuário diretamente para o que procura e aumentando a satisfação com a interação que realizou.

Assim como qualquer feature que implementamos, é importante monitorar como anda a aceitação dos usuários, se realmente tem sido utilizado e considerado útil pelos usuários.

Na Alura temos um curso de [**UX Produto**] que traz exatamente esses pontos, trabalhando com as métricas que precisamos considerar para validar nossas features.




Sente falta de tempo e não consegue programar uma rotina de estudo? Então conheça o calendário de estudo de um profissional de tecnologia.

Esses dias têm sido corridos demais... já passou por isso? Sensação de que faltou tempo para estudar o que eu queria, e para praticar o que eu precisava.

Às vezes tenho a ilusão de que é um dia da minha vida que fez a diferença na minha carreira. Que um dia bem estudado vai permitir um grande novo salto.

Mas, paro pra pensar... hoje não consegui estudar nada... tudo bem... eu tenho mais um ano inteiro pela frente para estudar quase todos os dias, crescer quase todos os dias.

## A técnica de estudo

Em vez de estudar muito durante um único dia, prefiro estudar um pouco quase todos os dias. **Espaçar e repetir é uma técnica comprovada de estudo e crescimento profissional. Mas como estudar quase todo dia sendo que quase sempre "falta tempo"?**

Todo ano compro um calendário, aquelas agendas de papelaria mesmo, em que anoto o que estudarei cada um dos dias. Tenho sempre um mês à frente anotadinho, dia a dia, o que estudarei em uma única hora que tenho em cada dia útil, cada dia algo diferente. Tem até nome esse tipo de estudo: **interleaving**.

A consistência é o que me faz crescer. Porém, para isso, preciso de uma oportunidade para estudar todos os dias. Preciso de muito conteúdo disponível para mim, e de um guia, de alguém que faça a curadoria do que devo e o que não devo estudar para não perder meu tempo.

Foi por isso que criei o **Alura**: tenho conteúdo de colegas instrutores o qual posso estudar. E existe a necessidade de estudar muito para eu criar meus cursos na plataforma. É por isso que gosto da **Casa do Código:** tenho livros curados pelo meu colega Adriano para estudar todos os dias no próximo ano.

## Preparando o calendário de estudo

Queria fazer um convite para você... entre agora em um site de cursos como o Alura, ou em uma site de livros como a Casa do Código. Escreva o nome de 5 cursos ou livros, compre uma agenda e anote cada um em um dia da semana nas próximas 4 semanas.

Por exemplo, se hoje é segunda-feira, dia 4:

java

### Seguindo as regras do calendário

Pronto. Todo dia útil, no mesmo horário, foque uma única hora para estudar aquilo que se comprometeu. Não precisa terminar hoje, afinal você terá semana que vem (**spaced repetition**) e, até lá, estará conectando outros assuntos também (**interleaving**), para não ficar viciado e com uma visão unilateral.

Não tenha dúvida também: todo dia você se pergunta "devo estudar A ou B?". Já está escrito em sua agenda: é A, ponto final! Assim como eu, se tirar essas dúvidas do caminho, você senta e aproveita aquela uma hora estudando do começo ao fim.

### Resultados obtidos

Em um mês você terá lido dois livros e estudado três cursos. Isso no seu primeiro mês, quando ainda não aplica outras técnicas que eu uso!

Está feito o meu convite, compre sua agenda agora mesmo, deixe ela na frente do seu monitor em sua casa, para não esquecer da uma hora diária.

Passe os próximos 12 meses estudando comigo e crescendo junto nas mais diversas áreas de [**programação**] e [**design**], usando esta e outras técnicas que compartilharei.

E meu convite vai mais longe: daqui 12 meses, vamos ver o quanto aprendemos e onde chegamos, fico curioso para saber tanto o quanto você aprendeu como o que achou dessa experiência de foco de um ano de crescimento na carreira.

O que acha?

Sugestões de passos para agora mesmo:

- Comprar uma agenda e deixar na frente do monitor
- Separar uma hora por dia
- Preencher o próximo mês
- Me contar quando terminar o primeiro curso!

Como você deve ter percebido, o mais legal é que você consegue usar essa técnica para qualquer tipo de aprendizado. Seja por um curso online, como é o nosso caso aqui [**na Alura**] ou um dos nossos cursos presenciais [**na Caelum**] ou através de um livro, como os [**da Casa do Código**]. É só uma questão de se organizar.

E você, já começou a montar o seu calendário? 




Criei algumas [**imagens no Docker**]e queria compartilhá-las com os outros desenvolvedores da empresa. Para isso, consigo usar os próprios repositórios do Docker, como o [**Docker Hub**], ou o [**Docker Store**]. Lá nós colocamos nossas imagens e elas ficam disponíveis para download.

Porém se eu colocar minha imagens nesses repositórios, só vou conseguir baixá-las se estiver com internet. Quero que essas imagens fiquem sempre disponíveis na minha rede local. Dessa forma mesmo sem internet terei acesso a elas.

Mas como posso criar um repositórios de imagens local?

## Criando o repositório

O Docker trabalha com containers. Então, nada mais justo, que seu repositório de imagens também seja um container. Então para criarmos nosso repositório local basta iniciarmos um container.

No Docker, esse repositório local se chama **Registry**. Então para criarmos nosso repositório local, basta ir até o servidor e digitar:

`docker run registry`

Mas dessa maneira travamos o terminal com a execução desse container, ou seja, não podemos utilizar esse terminal enquanto nosso container estiver rodando. Para que isso não ocorra, basta falar para o Docker rodar nosso container no background (`-d`).

`docker run -d registry`

Nosso Registry está rodando, mas como vamos acessá-lo? Quando nós acessamos um serviço na rede, por exemplo o site da Alura, precisamos ter acesso a esse serviço. Ou seja, precisamos de uma [porta de acesso]).

No caso de sites, a porta padrão é a porta `80`. Já o nosso registry utiliza por padrão a porta `5000`.

Então vamos dizer ao Docker para ele iniciar nosso repositório mapeando a porta (`-p`) **5000** do nosso host para a porta \*\*5000 \*\*do nosso container.

`docker run -d -p 5000:5000 registry`

Uma boa prática quando criamos containers é dar nomes para eles. Isso facilita sua administração. Como estamos criando um repositório de imagens, podemos dar o nome (`--name`) `repositorio`.

`docker run -d -p 5000:5000 --name repositorio registry`

Se nosso container do Registry cair, será um problema? Precisamos garantir que mesmo se o container caia, outro suba em seu lugar. Ou seja, queremos reiniciar (`--restart`) nosso container sempre que ele cair:

`docker run -d -p 5000:5000 --restart=always --name repositorio registry`

imagem adicionar uma regra, que no nosso caso pode ser permanente (`--permanent`), e adicionar a porta (`--add-port`) que queremos liberar. Também precisamos dizer qual o protocolo de comunicação que, neste caso, é o protocolo `tcp`

`firewall-cmd --permanent --add-port=5000/tcp`

Agora temos que reiniciar o firewall para que nossa alteração fique válida:

`firewall-cmd --reload`

imagem da imagem do `wordpress` com o nosso repositório. Neste caso, vou utilizar o endereço IP do nosso registry, que no meu caso é o `192.168.0.10`, na porta `5000`. E o nome dessa imagem no repositório também será `wordpress`.

`docker tag wordpress 192.168.0.10:5000/wordpress`

imagem e em baixo vamos realizar nossa configuração.

Vamos dizer que quando o Docker iniciar (`ExecStart`) o daemon do Docker (`/usr/bin/dockerd`) vai adicionar um repositório considerado inseguro (`--insecure-registry`):

`ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.10:5000`

imagem reiniciar o daemon (`daemon-reload`) para que nossas configurações passem a valer. Como essas são as configurações do Docker, vamos reiniciar (`restart`) esse serviço também:

`systemctl daemon-reload`

`systemctl restart docker`

![]

Agora se tentarmos enviar nossa imagem para o servidor, obteremos sucesso:

`docker push 192.168.0.10:5000/wordpress`

![]

## Para saber mais

Colocar um repositório inseguro não é uma boa prática de segurança. Neste caso, só utilizamos para entender como funciona o registry.

Para aumentar a segurança do nosso repositório, podemos criar sistemas de autenticação e utilizar certificados de segurança. Um exemplo de como faz essas configurações, está na [**documentação do Docker**].

Perceba que as imagens ficam no container `repositorio` que está no servidor. Ou seja, se esse container for excluído as imagens se perderão.

Por isso, uma boa prática é criar volumes entre o container e a máquina host. Pois, mesmo se o container for excluído, temos uma cópia das imagens na máquina.

Neste caso utilizamos o endereço IP para se comunicar com o repositório. Porém, podemos utilizar um nome como uma URI. Para isso, temos que configurar um [**serviço de DNS**].

Docker e containers são um dos assuntos mais comentados nos dias de hoje. Muitas coisas foram facilitadas pelos containers, tanto na parte de infraestrutura, quanto na parte do desenvolvimento.

Por isso aqui na Alura temos um [**curso de Docker**]. Nele você aprenderá sobre como o Docker funciona, como utilizar e criar containers, como criar suas próprias imagens e muito mais.

Como os containers estão sendo muito utilizados, algumas ferramentas foram criadas para facilitar sua administração. Uma ferramenta muito utilizada é o Kubernetes.

Com ele conseguimos gerenciar nossos containers, criar balanceamento de cargas entre nossos container e realizar sua comunicação de uma forma mais simples.

No [**curso de Kubernetes**] você vê algumas dessas técnicas e, no final, consegue realizar o deploy da aplicação na nuvem.




Você já deve ter visto websites que possuem em sua URL o símbolo de um cadeado e o nome HTTPS logo ao lado. 

imagem 

Para entender essa diferença, vamos considerar a seguinte aplicação web na qual um usuário de uma empresa (vamos chamá-lo de João), está usando apenas o protocolo HTTP, ou seja, o modo “Não seguro”:

imagem. Mas como foi possível conseguir essas informações??

## Entendendo o princípio do protocolo HTTP

As comunicações em uma rede são feitas por um conjunto de regras e procedimentos chamadas de protocolo [**Link**]). O protocolo HTTP, Hypertext Transfer Protocol, foi inicialmente desenvolvido para permitir a comunicação com um servidor web, a princípio, o método existente era apenas o de “pegar” (GET) o conteúdo de um servidor.

Com o passar do tempo, surgiu a necessidade de não somente pedir informações do servidor, mas também de passar as informações. Atualmente sabemos que na Web, não apenas pedimos como também mandamos informações, certo? Como é o caso de uma compra na internet. Mas o que acontece se esse for um dado sensível como os dados e senha do cartão de crédito?

Analisando o nome do protocolo HTTP, vemos que se trata de um protocolo para transferência de texto, dessa forma, os dados e senha do cartão de crédito são passados como um texto para o servidor também!

Isso significa que, se caso alguém analisar essas informações será capaz de ver quais são os dados e senha do cartão de crédito. Portanto, quaisquer aplicações web que usam o protocolo HTTP e precisam passar dados sensíveis, possuem uma vulnerabilidade para o cliente final.

Tendo ciência de todo esse problema, todo o site que opera no protocolo HTTP, precisa, de alguma forma, encontrar algum meio de se proteger, certo? É nesse momento que o HTTPS entra como um grande aliado! Mas o que o protocolo HTTPS faz para resolver essa vulnerabilidade?

## Conhecendo o protocolo HTTPS

Agora, ao invés de analisar um site “Não seguro”, isto é com o protocolo HTTP, faremos a análise em um site “Seguro” que trabalha com o HTTPS.

Nesse nosso exemplo, consideraremos a página de login da Alura usando os mesmos dados que usamos na aplicação que estava usando o HTTP. Vejamos o resultado:

imagem e destrancar a caixa (descriptografar). Quando temos a mesma chave utilizada para criptografar e descriptografar um dado, chamamos esse processo de criptografia de **chave simétrica**. Exemplos de alguns algoritmos que utilizam esse sistema de chave simétrica:

- **DES (Data Encryption Standard)**
- **AES (Advanced Encryption Standard)**

Uma vez que a mesma chave é usada para realizar a criptografia e a descriptografia, é necessário encontrar uma forma de enviar essa chave ao destinatário (caso ele ainda não tenha) para que ele possa assim destrancar a caixa e ler o conteúdo da carta (descriptografar).

Mas veja só o que temos, se a mesma chave é usada para trancar (criptografar) e destrancar (descriptografar), o que aconteceria se alguém conseguisse interceptar essa chave? Essa pessoa conseguiria utilizá-la para poder ver as informações passadas e continuaríamos tendo o mesmo problema não é mesmo? E agora?

Desse modo, somente a utilização desse processo de chaves simétricas durante as etapas de comunicação pode não resolver completamente o problema e por isso uma nova forma de criptografia também foi desenvolvida para complementar a utilização das chaves simétricas. Vamos voltar ao exemplo anterior.

### Processo de chaves assimétricas

Nós temos o Roberto e a Luísa, o Roberto deseja enviar uma carta com conteúdo confidencial para a Luísa. A ideia agora é que o Roberto utilizará um cadeado especial e tal cadeado terá 3 posições:

1 - trancado 2 - destrancado 3 - trancado

imagem e a outra chave só poderá ser usada na posição decrescente (posição 3, 2 e 1).

O Roberto decide trancar a caixa com a primeira chave, a que consegue operar o cadeado na ordem crescente. Dessa forma, para poder trancar a caixa, ela estará agora na posição 3. Essa chave o Roberto não enviará para ninguém, é a chave exclusiva dele, chamaremos essa chave de **chave privada.**

A segunda chave que opera na ordem decrescente (posição 3, 2 e 1), será usada para enviar para a Luísa, como estamos enviando essa segunda chave para outra pessoa, a chamaremos de **chave pública.**

Quando a caixa chegar até a Luísa, ela estará trancada na posição 3. Com a chave pública que a Luísa recebeu, ela consegue operar na ordem decrescente e voltar o cadeado para a posição 2 (posição destrancada) e abrir a caixa, lendo assim o conteúdo da carta.

A Luísa ao responder a mensagem irá trancar com a chave pública. Lembre-se que a chave pública só funciona no sentido decrescente, dessa forma, como ela está na posição 2 (destrancada), ela só poderá ir para a posição 1 para trancá-la novamente. Uma vez que o Roberto receber a caixa, ele poderá usar sua chave privada (aquela que ele guardou para si e não distribui para ninguém e só funciona na ordem crescente) para voltar o cadeado para a posição 2 (destrancada) e poder assim abrir o conteúdo da mensagem.

imagem a outra chave é usada para destrancar a caixa (descriptografar). Quando temos duas chaves, chamamos esse processo de criptografia de **chave assimétrica**. Exemplos de alguns algoritmos que utilizam esse sistema de chave assimétrica:

- RSA (Sendo as iniciais dos sobrenomes de seus desenvolvedores: Ron Rivest, Adi Shamir, e Leonard Adleman)
- DSA (Digital Signature Algorithm)

## Implementação do protocolo de segurança do HTTPS

Os princípios de chaves simétricas e assimétricas serão usados pelo HTTPS durante o processo de comunicação. Dentro do HTTPS existe um protocolo responsável por inserir essa camada de criptografia, vamos conhecer algum deles:

### SSL

O primeiro protocolo desenvolvido para esse fim foi de autoria da empresa Netscape e recebeu o nome de **Secure Sockets Layer 1.0**, ou mais popularmente conhecido como SSL v1.0. O protocolo **SSL** sofreu modificações e melhorias até chegar na sua última versão, SSL v3.0.

Porém ao longo dos anos foram descobertas algumas vulnerabilidades nesse protocolo, uma dessas vulnerabilidades poderia expor informações criptografadas e acabou sendo chamada de Poodle (Padding Oracle on Downgraded Legacy Encryption) , para mais detalhes segue link do governo norte-americano alertando sobre tal [**vulnerabilidade descoberta no protocolo SSL**].

### TLS

Uma vez que o protocolo SSL v3.0 apresentou essas vulnerabilidades foi necessário o desenvolvimento de um novo tipo de protocolo para atribuir essa camada de criptografia de uma maneira mais segura.

Esse novo protocolo recebeu o nome de Transport Layer Security, TLS 1.0 sofrendo adaptações e melhorias ao passar do tempo chegando na versão mais atual até o momento de escrita desse post, a versão TLS 1.2

O principio de utilização do TLS é unir as forças das chaves assimétricas e simétricas durante o processo de comunicação. Uma vez que as chaves assimétricas possuem um processo de criptografia envolvendo duas chaves distintas, consequentemente há um maior tempo de processamento. Por isso o TLS utiliza esse processo na fase de autenticação entre o cliente e o servidor.

Em seguida, ele faz uso das chaves simétricas que possuem um processo de criptografia com apenas uma chave, logo, necessita de menos tempo para seu processamento.

Uma vez que podemos ter uma grande quantidade de dados sendo transmitidos, as chaves simétricas serão mais rápidas para processar toda essa informação e será utilizado na fase de transporte dos dados, também conhecido como **bulk**.


Caso tenha mais interesse nesse mundo de protocolos e segurança, não deixe de ver nossos cursos sobre [**HTTP: Entendendo a web por baixo dos panos**], [**Segurança Web: Vulnerabilidades do seu sistema e OWASP**] e [**Segurança de redes: Conheça as vulnerabilidades de servidores e clientes**]





imagem 

Um grande erro é o famoso “atirar para todos os lados”. Quem faz isso, encontra mais resistência e, provavelmente, vai se desanimar ao ouvir um “não” seguido de outro. Além disso, a atividade se torna mais desgastante e trabalhosa.

Por isso, antes de tentar aprender na base da tentativa e erro, leia e aplique as dicas deste post. Vamos trazer as principais informações sobre o assunto. Acompanhe!

## Você conhece o seu público e o mercado?

Antes de começar, vamos combinar que, sempre que usarmos o termo “produto”, estaremos falando de produto ou serviço. Assim, conseguimos ser mais objetivos. Então vamos lá!

A primeira coisa que você precisa fazer é achar o cliente certo: aquele que mais pode ser beneficiado com o seu produto ou serviço. Por isso, você deve se perguntar que tipo de problema ele tem que o seu produto resolve.

A partir disso, fica mais fácil para você identificar o perfil de pessoa que convive com essa dificuldade e, portanto, tem uma necessidade maior de adquirir sua oferta.

Depois disso, você deve se dedicar a 3 informações essenciais para sua prospecção. São elas:

### O mercado

Já reparou como são as entrevistas com presidentes de grandes empresas? Sobre o quanto eles falam do mercado? A quantidade de dados e informações que eles possuem? Você pode achar que não precisa disso, mas não é bem assim!

Sem [**conhecer o mercado**], você não tem como saber se existem clientes em número suficiente para prospectar, onde eles estão concentrados, qual o potencial de compra deles, como a concorrência faz... E assim por diante.

Mas não se preocupe! Essa não é uma tarefa difícil. Com a internet é muito fácil levantar esse tipo de informação. Aliás, algumas entidades como o [**Sebrae**] fazem levantamentos o tempo todo e os disponibilizam na rede.

### A persona

Hoje em dia falamos mais em persona do que em público-alvo. A diferença é que ela é como se fosse um personagem: tem preferências pessoais, uma maneira de falar (mais formal ou descontraída), objetivos, problemas definidos e um perfil determinado.

Mas você não deve supor essas características do perfil de sua persona. O que funciona é pesquisar a respeito analisando seus clientes atuais. Depois disso, basta identificar os detalhes que são comuns entre eles e considerar esses pontos como os que definem o seu cliente ideal. Dessa maneira, você consegue determinar a linguagem adequada e se aproximar dele com mais facilidade.

### A jornada de compra

**Conhecendo o mercado e a persona, você já tem grande parte do que precisa, mas ainda faltam alguns detalhes importantes.** Para uma boa prospecção, você precisa conhecer como seus clientes compram. Em outras palavras, estamos falando dos passos que eles trilham para comprar seu produto.

Você deve investigar, por exemplo, como ele pesquisa a respeito de sua oferta, como usa a internet, se considera a opinião de outras pessoas, ou o que for necessário para direcionar seu usuário chega ao seu produto.

## Você tem suas etapas definidas?

As informações da jornada de compra são importantes para que você possa desenvolver o seu processo de prospecção alinhado aos passos da sua persona. Imagine se ela usa aplicativos de ofertas e você não está presente em nenhuma dessas ferramentas. Sua ação vai ficar mais difícil, não é mesmo?

Mas se você elabora suas etapas do processo de vendas de acordo com o mercado que pesquisou, os hábitos da jornada e o perfil da persona, o encontro entre vocês ocorre mais naturalmente e a busca de novos clientes não é tão desgastante como se estivesse “atirando para todo lado”.

## Sua conversa de vendas é persuasiva?

Se a sua conversa de vendas não for convincente, elas não vão te dar muita atenção. Além disso, o maior erro que você pode cometer nos primeiros contatos é sair falando do seu produto ou promoção. Não faça isso!

Primeiro é preciso vender a ideia, ou seja, despertar o interesse em te ouvir.

Quantas vezes alguém te abordou oferecendo um produto e o que disse entrou por um ouvido e saiu pelo outro? Isso ocorre quando não quebramos a barreira inicial.

É por isso que, conhecendo os problemas de sua persona, você deve elaborar uma conversa de vendas que rapidamente desperte o interesse.

Por exemplo, digamos que você trabalhe com criação publicitária e seu possível cliente seja um empresário do setor de alimentos, de 45 anos, com formação universitária e dificuldade de tornar sua marca conhecida.

Você poderia dizer: “O senhor já conhece os pontos-chave que têm garantido resultado para grande parte das empresas de alimentação na divulgação de suas marcas?” Funcionaria muito melhor do que simplesmente oferecer um serviço de criação de identidade visual, não acha?

## Você usa os canais certos para prospectar clientes?

Outro ponto determinante é a definição dos canais que você vai utilizar. Como vimos, ela deve se basear nos hábitos do seu cliente que foram identificados quando você conheceu a jornada de compra dele. Então, confira alguns dos canais de prospecção que você deve considerar:

- indicações: conseguir indicações dos seus clientes atuais, de parceiros ou conhecidos do seu cliente ajuda muito na atividade, pois o nível de confiança é bem mais alto;
- participação em eventos: eventos setoriais como feiras de negócios, premiações, congressos e encontros entre empresários são ótimos para levantar prospects que, nesses momentos, estão mais descontraídos e abertos para um contato;
- networking: manter sua rede de relacionamento ativa é importante para que você seja lembrado, o que sempre gera oportunidades;
- [**produção de conteúdo**]: publicar conteúdo em redes sociais, no seu blog ou para enviar por e-mail é outra opção. Ao fornecer informações relevantes de forma a estimular que seu prospect se aproxime, ele pode se tornar um grande fã até antes de virar um cliente;
- associações e outras entidades: se a sua persona participa como associada em alguma entidade, você deve se aproximar e, conforme o caso, até oferecer um convênio com condições especiais para os associados;

Para concluir, a tarefa de prospectar clientes é uma das que mais exige um bom acompanhamento de resultados. É preciso estar atendo aos indicadores de desempenho para encontrar gargalos e, com base neles, desenvolver ações de correção e aprimoramento.

No que diz respeito ao meio digital, na Alura temos um curso de Marketing digital voltado para [**análise de resultados do site**], uma boa forma de começar a medir o retorno do que foi investido. ;)




**Fala Vinicius, beleza? Diz pra gente o seu nome completo, por favor.** Vinicius Brito de Paulo.

**Mora em qual cidade atualmente?** Bauru, SP.

**Estuda? Qual instituição e curso?** Sim, Fatec-Bauru, no curso de Banco de Dados.

**Trabalha atualmente? Qual o seu cargo?** Pode se dizer que sim rsrs, pois estou afastado. Mas trabalho como desenvolvedor Front-End.

**Como foi seu contato com a área de TI?** Meu primeiro contato foi quando consegui meu primeiro computador quando eu tinha meus 14 anos. Lembro que era um Celeron D(básico), já bastante curioso queria saber como funcionava e fui logo abrindo o PC. Depois conheci as paginas web e queria saber como isso funcionava. Que felicidade quando conseguir fazer aquele primeiro alert(“Hello Word !!”).

**E porque começou a desenvolver em Front-End?** Me adaptei melhor ao Front, não que eu não saiba de back. Antes do desenvolvimento eu trabalhava como Suporte de TI e sempre queria ir para equipe de desenvolvimento como qualquer estagiário, mas certo dia pintou uma oportunidade> um grande amigo Zé(@J_Zes) me chamou para trabalhar com ele.

Meio inseguro demorei para dar a resposta com aquele pensamento “Nossa será que sou realmente capaz de trabalhar como programador ?”. E sim, qualquer pessoa é capaz basta ter força de vontade e acreditar no seu potencial. Hoje no meu trabalho temos uma equipe de 4 pessoas e são os melhores desenvolvedores, já deixo o meu abraço ao (Eloi, Zé e Kennedy)

**Seu objetivos no Front-End quais são?** Não só o Front-End mais também Back-End. Venho correndo atrás bastante para sempre aprender mais. Meus principais objetivos são melhorar meus conhecimentos em Front-End com programação funcional, sempre tentando fazer o melhor Html, Css, JavaScript e utilizando as melhores ferramentas.

**Quais linguagens você utiliza?** No meu trabalho a linguagem utilizada é Java e banco é Postgres. Então conhecimento em Java, JSF, Primefaces e outros derivados é necessário. Também faço alguns freelas utilizando PHP, Angular. Mas o que realmente estou gostando é a pegada do NodeJs e as distribuições hibridas (PhoneGap e Ionic), e outras coisas como por exemplo MongoDB, Firebase, Android.

**Quais foram as maiores dificuldades que você teve durante toda a sua trajetória?** Acho que a maior dificuldade está acontecendo agora, pois recentemente descobri que estou com câncer e venho lutando contra isso. No dia que descobri foi complicado, mais no outro dia pegue meu notbook e fique desenvolvendo no hospital mesmo, não queria nem saber rsrsrs.

**Quais são seus planos para o futuro?** Melhorar meus conhecimentos e terminar minha plataforma que comecei fazendo no hospital(internado). Ainda está em desenvolvimento mais está disponível para testes em http://freelafree.kinghost.net.

**Existem outros projetos que você está desenvolvendo ou pretende desenvolver atualmente?** Sim. Além do freelafree, estou desenvolvendo uma aplicação de slide em tempo real feito em NodeJs, um aplicativo de localização de pessoas com PhoneGap, um gerenciador de arquivos e também meu TCC que será um sistema de replicação de dados entre Mysql e MongoDB feito em Python.

**Para quem quer começar a programar, o que você sugeriria?** A primeira coisa é não desistir dos seus objetivos!

Busque a cada dia aprender mais, o meu amigo Zé(@J_Zes) uma vez me disse: nunca faça do jeito mais fácil, mais sim da melhor maneira, busque conhecimento e o diferencial.

**A Alura é um ótimo lugar para quem quer começar e tem um ótimo suporte.**




O Angular fez bastante barulho quando foi lançado em 2010 e ganhou o coração de muitos desenvolvedores e empresas.

Mas a web mudou de lá pra cá. E mudou bastante.

O Angular 2 tem várias features novas e é bem diferente do 1. Os destaques vão para o maior suporte ao mobile e os recursos mais modernos dos browsers. E mais uma novidade: a recomendação do time do Google é que os desenvolvedores usem [**TypeScript**] com Angular 2. O Typescript foi desenvolvido pela Microsoft e é uma versão de Javascript que suporta funcionalidades como classes no estilo da Orientação a Objetos, bem parecido com o que temos em Java e C#.

Você pode baixar a versão 2 e ver todas as funcionalidades novas e documentação [aqui].

> _Quer dizer então que o Angular 1 morreu, paro de estudar e não encosto mais um dedo nisso?_

Não necessariamente, depende muito do seu caso. O Angular 1 é um framework que está há muitos anos no mercado e muitos desenvolvedores e empresas ainda o utilizam e continuarão utilizando. As linguagens e ferramentas não simplesmente morrem assim.

Mas, a tendência é que os projetos novos de hoje sejam criados na versão 2. Então, se você vai começar um projeto novo hoje, **é recomendado que você vá com o 2 mesmo** :)

E aqui na Alura os alunos já vem pedindo curso de Angular 2 há um boooom tempo. Nós estávamos esperando essa versão final para começar a trabalhar em algo concreto.

Esperem novidades para um futuro não tão distante!

Enquanto isso, porque não estuda a [versão 1] com a gente? :)




Você está buscando maneiras de melhorar as suas chances para destacar a sua carreira e encontrar o trabalho dos seus sonhos? Então esse artigo é para você.

As redes sociais podem exercer diversos papéis: **socialização, compartilhamento de nossas ideias e opiniões.** Além disso ela também é considerada como um espaço para marcas e clientes interagirem e empresas buscarem pelo candidato ideal.

> Empresas buscarem pelo candidato ideal?

Sim! Já foi o tempo em que as redes sociais era considerada apenas como uma opção de entretenimento.

O [**LinkedIn**] é conhecido como a rede social dos profissionais, então saber utilizar seus recursos, aproveitar-se da visibilidade que ele pode gerar e se relacionar com pessoas chaves que estão nessa importante rede social pode fazer toda diferença na sua carreira profissional. Ficou curioso? Então continue lendo :)

## A análise feita pela equipe do LinkedIn

Para descobrir o que exatamente os empregadores estão procurando e o que é preciso para conseguir um emprego com sucesso, o LinkedIn olhou para bilhões de pontos de dados e analisou toda a contratação e recrutamento atividade que ocorreu em seu site até o final de 2016 para identificar os perfis profissionais e habilidades mais procurados.

[**Durante essa análise**], eles descobriram as 10 principais habilidades que você pode desenvolver durante esse ano.

_"Enquanto vemos as aplicações de trabalho aumentarem no LinkedIn, sabemos que as empresas não estão contratando na mesma proporção"_, diz Catherine Fisher, especialista em carreira do LinkedIn, em um comunicado à imprensa:

> "Embora algumas habilidades expirem a cada dois anos, nossos dados sugerem fortemente que as habilidades tecnológicas ainda serão necessárias nos próximos anos, em todas as indústrias. Agora é um grande momento para os profissionais desenvolverem as habilidades que precisam para se tornarem mais relevantes no mercado.”

Como a ideia desse artigo é despertar o seu interesse e curiosidade para aprimorar a sua carreira, aqui estão as habilidades mais quentes e mais demandadas em todo o mundo:

1. Computação em nuvem e distribuída
2. [Desenvolvedor Java]
3. [Design da interface do usuário]
4. [Segurança das Redes e da Informação]
5. [Desenvolvimento Móvel]
6. [SEO] / SEM Marketing

Em um post no LinkedIn, Fisher explica que a lista de "melhores habilidades" revela várias tendências sobre o mercado de trabalho global, incluindo:

## 1 Demanda para os comerciantes está ficando mais leve

Embora as habilidades de marketing estivessem em alta demanda em 2015, _"as coisas mudaram"_, escreve ela.

> "Este ano, SEO / SEM caiu cinco pontos de N º 4 para N º 9 e gestão da campanha de marketing caiu completamente fora da lista.La demanda por habilidades de marketing está diminuindo porque o fornecimento de pessoas com habilidades de marketing tem apanhado com a demanda dos empregadores para Pessoas com habilidades de marketing."

## 2 Dados e nuvem reinam suprema

_"Eu cheiro uma dinastia em construção!"_ Fisher escreve.

> "Nuvem e computação distribuída tem permanecido no primeiro lugar nos últimos dois anos ... Seguindo de perto os seus passos é a análise estatística e mineração de dados, que veio em n º 2 no ano passado, e n º 1 em 2014."

Essas habilidades estão em uma demanda tão alta porque estão na vanguarda da tecnologia. Os empregadores precisam de funcionários com computação em nuvem e computação distribuída, análise estatística e habilidades de mineração de dados para se manter competitivo.

## 3 Design de interface do usuário é o que está quente agora

_"O design da interface do usuário (nº 5), que está projetando a parte de produtos com os quais as pessoas interagem, é cada vez mais demandado pelos empregadores"_, escreve Fisher.

> "Os dados se tornaram centrais para muitos produtos, o que criou uma necessidade para pessoas com habilidades de design de interface de usuário que podem tornar esses produtos fáceis para os clientes usarem".

[Clique aqui] para ver o relatório completo e detalhamento das habilidades em demanda por país.

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




O curso mais popular do mundo tem [**taxa de conclusão de cerca de 20%**]. E os outros 80%? Desistem no meio.

No começo dos cursos de Harvard online, [**entre 5 e 20% dos alunos concluem o curso**]. O resto? Desiste bem antes de chegar na metade dele.

Estimativas dizem que, em média, [**menos de 10% dos estudantes de MOOCs terminam o curso**].

Terminar um curso está ligado com diversos fatores.: o curso é bom? O curso é útil? O professor é bom? A didática é boa? O conteúdo é interessante? O tamanho é ideal? São centenas de detalhes que tentamos atacar nos diversos treinamentos internos que o **Guilherme Silveira** criou para nossos instrutores aqui da Alura. Não é a toa que ele é o chato que cobra todo mundo (:

E qual o resultado desses treinamentos para os nossos professores e alunos? Altas taxas de conclusão. 85% de nossos alunos concluem pelo menos um curso, com uma média de 8 cursos concluídos por aluno - média!

### Quais os cursos com a maior % de conclusão?

Entre os cursos de Java, por exemplo, sem dúvida alguma o de [Primeiros passos] e [Orientação a Objetos] se destacam bastante nesse critério. Assim como o de [Fundamentos da linguagem] e [Orientação a objetos] em C# e o de [JQuery] no JavaScript.

Aqui vai um exemplo de 10 cursos na Alura:

- [Java II: Orientação a Objetos] - 59%
- [HTTP: Entendendo a web por baixo dos panos] - 59%
- [Certificação Java SE 7 Programmer I: Laços] - 57%
- [jQuery I: Introdução à biblioteca campeã de JavaScript] - 57%
- [Lógica de Programação II: Funções, Desenhos e um Jogo] - 56%
- [Identidade Visual I: do briefing ao papel] - 53%
- [JavaScript: Programando na linguagem da web] - 51%

Legal, não é?

Agora a pergunta é: o que pode significar uma taxa de conclusão?

A explicação é simples: alguns alunos estão preocupados em terminar o curso para receber o certificado. Justo, neste caso esperamos e desejamos que ele conclua. Outros alunos querem aprender o conteúdo e passar para a frente. 

**Também é justo, e nem sempre eles precisam ir até o fim do curso, ele pode parar quando sentiu que foi o suficiente e partir para o próximo, também ficamos felizes.**

**De qualquer maneira, não deixamos que a peteca caia, queremos taxas de conclusão altas e que os alunos saiam satisfeitos, prontos para um próximo aprendizado. Acompanhar e entender essas estatísticas é muito importante para nós, o mais importante é manter o aluno crescendo sempre em sua carreira.**





Sabemos como o Django, framework web escrito em Python, pode ser bom para aplicações web. Mas ao final de todo o desenvolvimento, o que fazemos com todo o projeto? 

Recentemente, desenvolvi um [simples projeto de agenda de contatos] utilizando o framework [**Django**], e resolvi compartilhar pela Internet. É uma aplicação web, então o ideal seria que fosse possível acessá-la como acessamos qualquer outro site, digitando seu endereço em um navegador qualquer, em um computador qualquer.

Assim, me preparei aluguei um [**VPS**] com Linux e registrei um domínio estilo `dominio.com.br`. O serviço do servidor possuía diversos tutoriais ensinando a colocar projetos em PHP e Java de pé, mas não de Django… E aí, como podemos rodar nossa aplicação?

## Enviando os arquivos locais para o servidor remoto

A primeira coisa que precisamos fazer é, realmente, mandar nossa aplicação para o servidor que eu aluguei. Afinal, atualmente tenho todos os meus arquivos aqui no meu computador, mas não vou rodar a aplicação por ele.

Para esse primeiro passo, temos várias opções, como [**FTP**], [**SFTP**], ou o **[Git]**. Por conta da simplicidade, vou optar pelo Git, aproveitando que meu projeto já está no [GitHub].

Em minha pasta de usuário (`home`), quero clonar (`clone`) o repositório que está lá no GitHub para um diretório chamado `agenda`. Um simples comando faz o trabalho:

 

Rapidamente, podemos ver que uma pasta `agenda` (como especificamos no final do comando) foi criada em nosso diretório `home`, contendo os arquivos do projeto - a aplicação Django em si:

imagem, onde cada ambiente terá sua própria versão dos pacotes. Mas como podemos criá-los?

No Python, temos o **_[virtualenv]_**, que cria ambientes Python isolados, nos quais podemos aplicar as configurações que desejarmos.

Podemos instalá-lo através do **[pip]**, com o seguinte comando no terminal:

 

> Dependendo da configuração do seu sistema, será necessária permissão `sudo` para rodar esse comando

Com o _virtualenv_ instalado, podemos criar um novo ambiente com um simples comando, especificando o nome que queremos definir:

 

Rodando esse comando, um diretório deve ser criado:

imagem nossa aplicação para o diretório do ambiente virtual, apenas para manter uma melhor organização:

 

Certo! Entrei (`cd`) no diretório da aplicação para testar:

 

Coloquei o servidor do Django para rodar, com o clássico comando `runserver`:

python 

Mas… novamente um erro! Dessa vez, direto no terminal:

sql 

A longa exceção que recebemos indicou um erro de configuração, nos questionando se instalamos o driver conector do MySQL com o Python. De fato, não instalamos. Na verdade, nem ao menos instalamos o MySQL em si! Vamos cuidar disso, então.

## Instalando o MySQL (MariaDB)

Antes de tudo, precisamos apertar **CTRL-C** para sair do `runserver` falho. Feito isso, agora precisamos instalar o banco de dados.

No caso, usarei o [**MariaDB**], que é um _fork_ do MySQL, porque é como está configurado em minha máquina local. Caso quiséssemos usar outro serviço, como o PostgreSQL, ou o SQLite, essa parte de configuração seria diferente.

A instalação também depende da distribuição Linux e gerenciador de pacotes que estamos usando. No nosso caso, vamos focar na instalação com o **[apt]**, padrão de distribuições derivadas do Debian, como o Ubuntu, por ser o mais conhecido.

Apesar disso, é importante que fique claro que não é a única possibilidade! Bastaria um pouco de pesquisa para descobrir os nomes dos pacotes relativos ao que instalaremos pelo apt.

Antes de começar a instalação, vamos sair do nosso ambiente virtual, pois não precisamos dele agora. Para isso, basta usar o comando `deactivate` no terminal:

imagem

Temos o banco de dados e suas dependências instaladas, mas ele ainda está completamente vazio, sem configuração alguma.

Assim, antes de qualquer coisa, é importante que criemos nossa database (`CREATE DATABASE`) `agenda` e nosso usuário (`CREATE USER`), que vou chamar de `yan`. Também temos que dar os privilégios necessários (`GRANT ALL PRIVILEGES`) para nosso usuário.

> Caso SQL ainda seja um tópico confuso, temos uma [apostila disponível gratuitamente] que trata da linguagem e de bancos de dados relacionais, além dos diversos [cursos na Alura]! ;)

Note que ainda não criamos a tabela de contatos que meu projeto usa, e é porque fazer isso manualmente é desnecessário! Já já vamos ver como o Django pode nos ajudar nisso.

Com o básico do banco configurado, precisamos passar para o próprio Django essas configurações. Para isso, vamos alterar algumas coisas no arquivo `setttings.py`, dentro da pasta `agenda`, de nossa aplicação `agenda`. Vamos entrar em nosso ambiente virtual e editar o arquivo com o `nano`:

python 

E agora, o que devemos mexer nele?

## Configurando o banco de dados no Django

Com o arquivo `settings.py` aberto, vamos procurar a parte que trata do banco de dados, localizada no dicionário `DATABASES`. Dentro dele, há outro dicionário, `'default'`, com as configurações padrões - é nele que queremos mexer.

A primeira variável, `'ENGINE'`, diz respeito ao tipo de banco de dados que estamos usando. Como estamos com o MariaDB, que é um fork do MySQL, devemos colocar o valor `'django.db.backends.mysql'`. `'NAME'` trata do nome da _database_, e `USER` e `PASSWORD` das informações do usuário. Podemos deixar `'HOST'` e `'PORT'` vazios, já que o banco está rodando no próprio [localhost] do servidor. Ao final, esse bloco do código ficou assim:

sql 

Com essa estrutura definida, podemos fazer a migração com o Django:

python 

Algumas mensagens devem aparecer indicando que tudo deu certo:

imagem:

imagem nossa _virtualenv_. Instalar o pacote é fácil com o `apt`:

```

sudo apt-get install nginx

```

> Em sistemas que não utilizam do `apt`, esse processo também não deve ser nada difícil, provavelmente apenas usando um comando diferente.

Com o Nginx instalado, podemos logo inicializá-lo, como fizemos com o MySQL:

python 

Agora podemos passar para a parte de configuração. Precisamos explicar para o Nginx como queremos que ele lide com as requisições.

Para isso, vamos criar um arquivo de configuração específica para nosso projeto no diretório `sites-available` do Nginx. Vamos nos mover para esse diretório com o comando `cd`:

python 

Utilizando o apt, provavelmente conseguimos entrar no diretório que queríamos, porque o pacote do Nginx mantido por lá automaticamente vem com as pastas `sites-available` e `sites-enabled`. Entretanto, em outros sistemas é possível que isso resulte em um erro indicando que essa pasta não existe. Se for o caso, a resolução é simples - podemos criar esses dois diretórios manualmente:

python

Com as duas pastas criadas, precisamos abrir o arquivo de configuração geral do Nginx:

python 

Agora basta adicionar uma linha **dentro do bloco `http { }`**:

python 

Agora sim (caso essas pastas não tenham sido criadas automaticamente), podemos entrar na pasta sem problemas:

python 

Vamos criar nosso arquivo de configuração do projeto, então:

python 

Nosso arquivo de configuração de projeto do Nginx, que será incluído dentro do bloco `http { }` nas configurações gerais, tem uma estrutura básica, com um bloco `server {}`. Dentro desse bloco, vamos definir a variável `server_name` para especificar a que sites estamos tratando:

sql 

> `meudominio` deve ser alterado para o domínio que registramos e/ou o IP do servidor

Além disso, vamos adicionar um bloco `location { }` **dentro do nosso bloco `server { }`**, especificando como o Nginx deve responder para requisições em localizações específicas. No nosso caso, queremos que para qualquer localização a partir da raiz `/`, a requisição seja encaminhada para o Gunicorn.

Ainda não configuramos o Gunicorn, mas podemos definir agora mesmo que queremos que ele rode no próprio localhost (`127.0.0.1`) na porta **8000**. Assim, adicionamos o seguinte ao bloco `server { }`:

sql 

Legal! O único problema é que quando o Nginx enviar a requisição para o Gunicorn, o endereço de IP e o hostname específicos dessa requisição se tornarão o localhost e o hostname do nosso servidor. Para resolver isso, basta adicionar algumas linhas no bloco `location / { }`. Ao final, o arquivo fica assim:

sql

Certo! Temos a configuração de nosso site disponível. Precisamos avisar o Nginx que este site não só está disponível, como também ativo, e para isso vamos para o diretório `sites-enabled`:

python 

Dentro da pasta, vamos criar um link com a configuração que acabamos de criar, usando o comando `ln` no terminal:

python 

Se nosso Nginx já veio com a pasta `sites-enabled`, provavelmente há um arquivo padrão que não queremos no diretório. Para removê-lo, basta o comando `rm`:

python 

Ao final, podemos reiniciar o Nginx, para aplicar as mudanças, com o comando:

python 

Agora, podemos partir para o Gunicorn.

## Instalando e configurando o Gunicorn

Com o Gunicorn, as coisas ficam bem mais simples. Primeiramente, por ser um pacote Python, podemos ir lá para o diretório de nossa aplicação e ativar o _virtualenv_:

python 

Para instalar o Gunicorn, basta usar o pip:

python 

Agora já podemos iniciá-lo. É importante que lembremos de usar o mesmo endereço de IP e a mesma porta que especificamos lá para o Nginx:

python 

Finalmente, podemos acessar nosso site pelo navegador, através da porta padrão do HTTP. Para testar nossa aplicação de agenda de contatos, resolvi tentar adicionar alguns contatos através da página de **admin** (`http://meudominio.com.br/admin`):

imagem, muito menos nessas URLs. E agora?

## Coletando e configurando os arquivos estáticos

O Django tem, por padrão, alguns arquivos estáticos que melhoram a usabilidade padrão do framework. Coletá-los é simples, podemos fazer com apenas um comando com o `manage.py`. Vamos fechar o Gunicorn com **CTRL-C** e cuidar disso, então.

Antes, porém, o Django precisa saber onde queremos guardar esses nossos arquivos. Eu decidi deixar em uma pasta `static/`, fora da aplicação Django, mas dentro do ambiente virtual.

Além disso, quero que qualquer arquivo dentro desta página apareça como na URL `meudominio.com.br/static/`. Assim, modifiquei as últimas linhas do meu arquivo `agenda/settings.py` e deixei da seguinte forma:

python 

Agora sim, podemos simplesmente rodar o comando no terminal:

python 

Rapidamente, os arquivos vão ser todos copiados:

python 

Certo! Agora já temos os arquivos que precisamos. Mas espera… como o Nginx vai saber que quando a requisição for para a URL `meudominio.com.br/static/*` ele deve buscar nessa pasta que criamos? Precisamos avisá-lo!

Vamos voltar para a edição de nosso arquivo de configuração do projeto do Nginx:

python 

Agora, dentro do bloco `server { }`, vamos precisar de mais um bloco `location { }` específico para as URLs `/static/`, e que funcione como um atalho para nossa pasta lá no ambiente virtual. Assim, podemos adicionar isso no arquivo:

sql 

Feito! Podemos reiniciar o Nginx e executar novamente o Gunicorn:

python 

Dessa vez, olha como ficou a página de admin:

imagem pode ser uma ótima opção para o seu projeto!

Após toda a programação, chega sempre um dos momentos mais temidos para os desenvolvedores - o deploy. Apesar dos mitos, hoje aprendemos passo a passo como colocar no ar nossa aplicação Django, de forma simples e eficiente. Daqui para frente não teremos mais esse problema!

Além disso que aprendemos hoje, é bacana saber que temos mais opções que podem nos ajudar com o deploy de aplicações, como o [**Docker**].

Se quiser continuar estudando sobre o assunto, dê uma olhada em nossos cursos na Alura de [**Django**] e [**Python**] e continue aprendendo!





imagem 

Estou configurando um servidor e preciso configurar um serviço de **DNS**. Para esse serviço funcionar eu preciso editar alguns arquivos. Só que o servidor não possui modo gráfico, apenas o terminal.

Ou seja, não consigo abrir o bloco de notas, o Notepad++, Sublime, nem nenhum outro editor de texto visual.

Como posso editar esse arquivo? Será que existe algum editor de textos para ser utilizado no terminal?

## Começando com o Vim

Existem diversos editores de texto para terminais, cada um com suas singularidades e modos de utilização.

No mundo **Linux**, um bem conhecido é o Vim, um editor de texto simples e poderoso. Mas como podemos usá-lo para editar nossos arquivos?

O Vim é um editor de texto que funciona via terminal, isto é, sem interface gráfica como o bloco de notas, nem conta com o auxílio do mouse. E, como praticamente tudo no terminal, ele funciona por meio de comandos.

Como queremos configurar um serviço de DNS, ou seja, queremos configurar o serviço que traduz os nomes das URIs em endereços IPs. Logo, vamos abrir o arquivo `named.conf` que contém as informações sobre nossos domínios.

Esse arquivo fica dentro da pasta `etc`. Para abri-lo com o `vim` podemos entrar na pasta e depois abrir o arquivo, ou então, simplesmente passar o caminho até ele:

`vim /etc/named.conf`

imagem.

Então vamos ter que copiar linha por linha?

Não necessariamente. Apesar do Vim ser um editor de textos pelo terminal, existe nele um modo chamado **visual**. Nesse modo conseguimos selecionar uma área do texto para copiá-lo, recortá-lo ou excluí-lo. Para acessar o modo visual é basta apertarmos a tecla `v` (visual).

imagem Podemos salvar e sair do arquivo. Mas como eu consigo sair desse arquivo? Não podemos dar um `Ctrl + s` para salvar o arquivo, nem um `Alt + F4` para sair.

Bem, queremos salvar esse arquivo. Ou seja, queremos escrever as mudanças que fizemos. Para isso, no modo normal, podemos utilizar o comando `:w` (write) que escreve (salva) as mudanças no arquivo. Já para sair do arquivo podemos utilizar o comando `:q` (quit).

## Para saber mais

Além do Vim, existem outros editores de texto para terminal como o Nano, Emacs, entre muitos outros.

O Vim é **case-sensitive**, ou seja, ele diferencia as letras maiúsculas de minúsculas. Por isso, ao digitarmos nossos comandos, é importante sempre notar se ele é feito com letras maiúsculas ou minúsculas.

O comando `:w` salva o arquivo, já o comando `:q` saí do arquivo. Logo, se desejamos salvar e sair do arquivo podemos unir esses dois comandos e digitar `:wq`, ou simplesmente `:x`.

Se quiser saber mais sobre o poder do Vim, você pode digitar o comando `:help` no modo normal do editor, ou ainda no terminal utilizar o comando `vimtutor`:

imagem


 

Além dos gráficos, história e jogabilidade, um outro aspecto que marca **jogos** de todas as épocas são as **trilhas sonoras**. Quem tem o costume de jogar com frequência, consegue lembrar facilmente de alguma música que toca em momentos específicos de uma fase, ou até mesmo de quase toda a trilha sonora de algum jogo em especial.

Hoje, os games triplo A utilizam de orquestras, estúdios e centenas de artistas para produzir suas músicas... Mas nem sempre foi assim. Por muito tempo, ao decidir incluir uma música em um jogo, era necessário transcrevê-la em código e usar **samples** das maneiras mais criativas possíveis.

Aqui tem uma lista com alguns jogos que revolucionaram com suas trilhas sonoras, cada qual em sua época:

# Revenge of Shinobi

https://www.youtube.com/watch?v=HiOhzHrj2qs

Yuzo Koshiro, compositor e produtor de músicas para vídeo-games, foi o primeiro artista a ter seu nome estampado na capa de um jogo com créditos por sua música. Ele se tornou uma das pessoas mais influentes e respeitadas da história das músicas de vídeo-games.

# Donkey Kong

https://www.youtube.com/watch?v=-5rAjOjTGtc

Aquatic Ambiance é uma música que levou o Super Nintendo aos seus limites na época.  O _nerdwriter_ tem um vídeo documentando as grandes mágicas feitas com o chip SPC700:

https://www.youtube.com/watch?v=jvIzIAgRWV0

Para poder caber nos 64kb de limites, foi necessário, literalmente, programar as músicas dentro do código do jogo!

# Zelda Ocarina of Time

Koji Kondo ficou mundialmente conhecido por suas músicas em The Legend of Zelda e também em Super Mario Bros. No famoso livro *Koji Kondo's Super Mario Bros. Soundtrack*, Andrew Schartmann dá bastante destaque a criação da trilha sonora de todos os Zeldas:

https://www.youtube.com/watch?v=qXRRpSiOAV0

# Street Fighter 2

Essa é a única obra da compositora Yoko Shimomura em Street Fighter antes de ir para a Square. O icônico tema do Guile é dela:

https://www.youtube.com/watch?v=4qwKCQ4M2Nw

O [Yamaha YM2151] também foi levado aos seus limites para poder trazer vida as músicas compostas por Yoko.

Aproveitando, você pode estudar e praticar [**programação**](/cursos-online-programacao) e [**desenvolvimento de jogos**](/cursos-online-programacao/jogos) com a gente! E, se você quiser conhecer como funcionam os jogos, pode descobrir [neste **Nerdologia**].










imagem 

Um amigo meu me pediu para criar um programinha que leia os dados que ele gerou (em JSON)sobre a pontuação dos países em uma competição e faça algumas manipulações.

Como eu já tenho bastante experiência com PHP, decidir utilizá-lo como linguagem para essa tarefa.

O primeiro passo foi, claro, pedir os dados para meu amigo, e foi esse JSON que ele me enviou:

json 

Com isso, sabemos que temos uma lista de [**objetos literais**] em JavaScript, mas e em PHP? Como esses dados seriam representados?

## Lendo JSON

Bom, a primeira coisa a fazermos é ler esse arquivo em JSON e transformá-lo em algum dado que a gente possa maniuplar em PHP.

Felizmente isso é muito fácil e tudo que precisamos fazer é chamar uma função chamada `json_decode`.

php

Executando este código, temos a seguinte saída:

 php

Podemos notar que recebemos como retorno um array de objetos do tipo `stdClass`. Isso é como se fosse um objeto literal do JavaScript. É um tipo de **objeto sem forma onde podemos adicionar quaisquer propriedades** que quisermos.

Se nós adicionássemos um segundo atributo à função `json_decode`, poderíamos informar que ao invés de objetos do tipo `stdClass` nós gostaríamos de receber [**arrays associativos**]. Então basta mudar nosso código para:

php

E desta forma todos aqueles objetos se tornam arrays associativos.

Bom, agora que já lemos os dados para um formato conhecido em PHP, vamos ver o que meu amigo me pediu pra fazer:

- Listar o número de países participantes;
- Fazer com que seus nomes fiquem em letras maiúsculas;
- Ordenar:
    - Pelo país que tiver mais medalhas de ouro
    - Em caso de empate, pelo país que tiver mais medalhas de prata
    - Em caso de empate, pelo país que tiver mais medalhas de bronze
- Listar o número de medalhas distribuídas na competição

## Número de itens em um array

A primeira tarefa é fácil. Temos um array, então basta realizarmos um `foreach` por ele, e a cada iteração, incrementar um contador.

Mas, espera... Isso parece bem complexo pra uma tarefa tão simples. Antes mesmo de digitar esse código fui dar uma pesquisada em alguma solução melhor e encontrei a função [**count**].

Esta função faz exatamente o que queremos: **Conta o número de itens em um array PHP**. Então para entregarmos a primeira solicitação, basta fazer o seguinte:

php

E a saída será:

php

## Alterando os dados de um array

A segunda tarefa também parece fácil. É só fazer um foreach e deixar o índice `pais` de cada item na lista em letra maiúscula, não é?

Testei aqui e vi que não. Quando a gente usa o `foreach`, uma cópia de cada item é criada para realizar a iteração. Então aqui nós temos 3 soluções:

- Realizar o **foreach** utilizando referências (consulte [aqui]);
- Realizar um `for` normal e editar cada chave;
- Mapear o nosso array para um novo com os valores modificados.

Bom, parece que a terceira opção é interessante e a função que mapeia um array para um novo com valores modificados se chama **array_map**.

Ela recebe um array por parâmetro e aplica uma função em cada item para que as alterações sejam realizadas e retorna o item modificado. É exatamente o que queremos e o código utilizando ela fica assim:

php

Agora se executarmos `var_dump($dadosEmJson);` de novo, veremos que todos os países estão com letra maiúscula.

## Ordenando um array

Bom, agora vamos à parte de ordenar. Eu aprendi na faculdade alguns algoritmos de ordenação, mas honestamente não me lembro muito bem deles. Então dei uma pesquisada rápida sobre como ordenar um array e achei a função `sort` do PHP.

Com ela, se passarmos um array por parâmetro o próprio PHP ordena pra gente. Basicamente assim:

php

Beleza, parece uma boa solução, mas como o PHP vai saber que nossa regra de ordenação é pela quantidade de medalhas? Seria legal eu poder fazer como no `array_map` e passar uma função dizendo como quero ordenar.

O PHP não me desaponta nunca e pesquisando encontrei rapidinho a função pra isso. É a `usort`. Essa função funciona igualzinho à `sort`, mas podemos passar uma função informando a regra de ordenação.

Funciona assim: 

Passamos uma função que recebe 2 parâmetros, que são 2 itens do nosso array. Se segundo nossa regra, o primeiro item passado deve vir primeiro, nós devemos retornar um número negativo (-1 por exemplo). 

Se o segundo item passado por parâmetro deve vir primeiro na nossa ordenação, retornamos um número positivo (1, por exemplo). Se pela nossa regra for um empate e o PHP não precisar fazer nda, basta retornar 0.

Sei que parece um pouco complicado, mas no código vai ficar mais fácil de entender. Dá uma olhada:

php

Com isso, já conseguimos ordenar pelo país que mais tem medalhas de ouro, mas essa não era nossa única regra. Pensando um pouco, dá pra ver que nosso código ia ficar cheio de `if`s dessa forma, então fiz uma otimização no código e ficou assim:

php

Agora parece que nosso código não vai ficar tão grande. Conseguiu entender essa lógica? Faz alguns testes aí e vamos continuar implementando a regra.

Falta agora verificar, se as medalhas de ouro forem iguais, ordenar por prata. Se forem iguais ainda, ordenar por bronze. No final, fica parecido com isso:

php

Essa parte do código é meio complicadinha de ler, então se você preferir, pode fazer suas refatorações, criar outras funções para auxiliar ou ler com mais calma e realizar seus testes, mas com ela, conseguimos implementar a ordenação desejada. :-D

## Reduzindo um array a apenas um dado

Agora nós chegamos na última tarefa. Precisamos pegar todo esse array, realizar os cálculos e retornar o número de medalhas distribuídos nessa competição.

Falando de outra forma, precisamos reduzir um array ao número de medalhas.

Aqui a gente poderia de novo fazer um `foreach` e ir somando cada dado, mas seria um pouco mais trabalhoso do que precisa, já que mais uma vez o PHP nos dá uma bela de uma mãozinha com a função **array_reduce**.

Com ela nós passamos uma função que irá acumulando os valores desejados de cada item em um array, e no final reduz isso tudo a um valor.

Um exemplo mais simples de uso dessa função é somar os dados de um array que contenha números. Ex.:

php

E com isso nós teríamos em `$soma` o valor de `15`.

Agora que já ficou um pouco mais claro, vamos aplicar para o nosso caso. Basta somarmos todos os valores das medalhas assim:

php

E este código exibirá:

php

## Filtrando um array

Bom, foi trabalhoso mas conseguimos implementar tudo o que meu amigo pediu. Acho que seria legal até pra gente praticar um pouco mais, entregar também uma função que filtra desses países apenas os que não tiverem espaço em seu nome.

No PHP temos uma função exatamente para isso, o **array_filter**. Essa função recebe um array e uma função que retorna se cada item deve ou não fazer parte do novo array filtrado.

Para isso, basta retornarmos `true` apenas se não encontrarmos nenhum espaço no nome do país. Com isso nosso código pode ficar assim:

php

E executando `var_dump($paisesComNomeSemEspaco);` vemos que funciona, e temos apenas o Brasil. :-D

## Resumindo...

Bom, foi bastante coisa que fizemos aqui, então dando uma recapitulada, o que nós fizemos foi:

1. Ler uma string em json para um formato conhecido pelo PHP;
2. Contar os itens de um array;
3. Mapear um array para outro com alterações;
4. Ordenar um array com regras complexas;
5. Reduzir um array a um único valor (a soma, por exemplo);
6. Filtrar um array baseado em algum critério que definirmos;
7. Como colocar uma string em letras maiúsuclas com [mb_convert_case];
8. Procurar uma string dentro de outra com [strpos].

## Conclusão

Ufa... Quanta coisa, né!? Arrays em PHP são muito poderosos e nos dão muitas facilidades. Ainda há muitas outras funções que você pode conferir [na documentação do PHP], mas já deixo aqui uma dica: 

> Arrays no PHP são otimizados para tudo e para nada ao mesmo tempo, ou seja, você pode fazer o que quiser com eles, mas se precisar de muita performance, é melhor procurar alternativas como as [Estruturas de Dados] ou dar uma olhada no [**Curso de Collections**] aqui da Alura.






Quando fazemos uma análise de dados, é muito comum utilizarmos dados provenientes de um banco de dados, arquivos de texto, como `.csv`, arquivos de log, entre outros. Além desses, existem outros locais que podemos obter dados para serem analisados.

Por exemplo, quando estamos querendo saber sobre alguma tecnologia. Nós podemos procurar em blogs, fóruns, redes sociais, na documentação da tecnologia… Todos esses locais contém que podem nos ajudar com a nossa busca.

Na análise de dados também! Podemos, por exemplo, varrer sites em busca de informações, ou então, utilizar as redes sociais para entender melhor nossos clientes. Podemos utilizar essas informações para melhorar nossos produtos, ou então sugerir o produto que melhor atenda as necessidades do cliente.

Existem vários sites e redes sociais que podemos utilizar para obter informações, o Twitter é um exemplo. Nós lemos os tweets e obtemos as informações, mas temos que ler cada tweet? Isto é, precisamos ler um tweet por vez e fazer a análise nós mesmos?

Podemos fazer dessa maneira, contudo é um pouco trabalhoso, não acha?

Nós poderíamos criar um **script** que busca os tweets para a gente com base em uma palavra, por exemplo. E, então, criamos outro script para classificá-los.

Mas como conseguimos captar os tweets?

## Buscando tweets

Para buscar os tweets, nós precisamos nos comunicar com a [**API do Twitter**]. Existem algumas bibliotecas em Python que podemos utilizar para isso. Uma muito utilizada é a [Tweepy]. Com ela, conseguimos, entre outras coisas, buscar tweets.

Como estamos utilizando o Python, uma maneira de instalar essa biblioteca é utilizar o `pip`. Portanto: `pip install tweepy`.

imagem**, temos as informações que vamos usar para nos conectar no Twitter. Isto é, a chave do consumidor (Consumer key), o segredo do consumidor (Consumer secret), os token de acesso (Access token) e seu segredo (Access token secret).

A chave de consumidor e seu segredo são como nosso "usuário", enquanto os tokens são como nossa “senha". Logo, não podemos ficar compartilhando essas informações.

Como essas chaves são muito grandes, vamos guardá-las em variáveis ficar mais fácil de manipulá-las:

py 

Mas nós ainda não nos autenticamos nossa aplicação Twitter, apenas pegamos as credenciais. Como vamos acessar pelo Tweepy, podemos dizer para o `tweepy` se encarregar dos nossos dados de autenticação.

Então, podemos falar para o Tweepy nos autenticar utilizando nossa chaves de acesso:

py 

A classe **OAuthHandler** é responsável por nos autenticar no Twitter. Veja que no construtor só passamos a chave do consumidor e seu segredo. Mas e os tokens?

Podemos falar quais são os tokens da nossa autenticação. Isto é, nós podemos atribuir um valor para o token de acesso:

py 

Legal! Já temos todos os dados para nos autenticar. Então vamos para para o `tweepy` se conectar com a `API` do Twitter com esses dados de `autenticacao`:

py 

Já estamos conectados com o Twitter, agora podemos buscar (search) nossos tweets.

py 

Mas o que vamos buscar? Isto é, qual nossa consulta (`q`)? Na [documentação do Twitter], ele diz que devemos passar um parâmetro de busca chamado `q`. Por exemplo, se queremos pesquisar sobre os tweets da Alura ou que citam ela, podemos passar como parâmetro seu nome:

py 

Vamos rodar o código e ver se temos algum resultado:

imagem que fez o tweet e a mensagem do tweet (`text`).

py 

imagem.

py 

![]

Agora sim! Temos uma visualização mais limpa dos tweets.

## Para saber mais

Além do Tweepy, temos outras bibliotecas que podemos utilizar para nos comunicar com a API do Twitter. Uma delas é o [Twython]. A sua utilização é similar com a Tweepy.

Neste caso, como não utilizamos uma conta paga para fazer a busca dos tweets, não temos acesso a todos os tweets postados, porém, conseguimos um valor bom para começarmos uma análise.

Além de buscar tweets, essas bibliotecas nos permitem buscar usuários, descobrir o número de seguidores e até tuitar alguma mensagem como se estivéssemos utilizando o site ou o aplicativo.

Conseguimos captar os tweets. Agora podemos salvá-los em uma lista, ou em um arquivo e fazer nossas análises. Aqui na Alura, temos uma [**formação de machine learning**] onde você aprenderá a criar algoritmos que processam textos e classificá-los. Por exemplo, se o tweet é ou não um spam.







imagem 

Uma noção importante para o designer é a de psicologia das cores, um estudo focado na interação das tonalidades com o interlocutor, ou seja, o entendimento de como uma determinada cor pode afetar a percepção de uma pessoa sobre um produto ou serviço.

Continue a leitura e saiba como o uso correto das cores pode alavancar os seus projetos de design, destacando-os da concorrência. Vamos lá?

## O que é psicologia das cores?

Como seres sensoriais, desvendamos o mundo através de nossos sentidos; um som, um gosto ou um cheiro trazem reações instantâneas para nossa mente. E com as cores, não é diferente. Um matiz pode ter inúmeras interpretações e trazer à tona muitos sentimentos. Entender como a cor de um projeto para web pode transmitir segurança é essencial para um designer.

Por meio de experimentos e estudos, podemos determinar a eficácia de tons específicos para cada tipo de necessidade de comunicação. Existem cores capazes de indicar o segmento de uma empresa, se ela é arrojada ou conservadora, se ela quer transmitir diversão ou mais seriedade etc.

A cor exata pode encurtar a distância entre a marca e o cliente, tornando-a de fácil reconhecimento. Também é capaz de comunicar sentimentos e ressaltar noções já existentes de um determinado produto ou serviço.

## Como as cores sao usadas no Design?

A cor tornou-se uma forma de expressão, o que trouxe ao mundo moderno um novo problema: como se destacar em meio a um ambiente tão colorido? Transmitir de maneira correta uma mensagem por meio da cor pode ser a diferença entre o sucesso e o fracasso de um projeto.

A Coca-Cola é um ótimo exemplo de como a cor afeta a percepção do público. O [**vermelho da marca**], junto da sua forma, pode ser reconhecido facilmente ao redor do mundo.

Outras empresas também utilizam a psicologia das cores, criando tons exclusivos que se tornam sinônimos de seus serviços e produtos. Muitas possuem pantones patenteados que podem ser somente utilizados pela empresa que os registrou, mas isso não significa que é necessário o uso dessa modalidade de cor para obter sucesso.

O designer pode utilizar uma grande variedade de tons e significados que vêm atrelados a cada um deles. A seguir vamos apresentar alguns e mostrar de que maneira afetam o público.

## Qual o significado das cores?

Ao utilizar a cor certa para um projeto, o designer cria uma ponte cognitiva entre consumidor e produto. Dominar o que cada uma transmite é essencial.

**Amarelo**: otimismo, felicidade, desenvolvimento e clareza. O amarelo estimula os processos mentais e o sistema nervoso, ativa a memória e encoraja a comunicação.

**Verde**: riqueza, natureza, crescimento e saúde. Essa cor acalma, traz harmonia e renovação, relaxa o corpo e ajuda a aliviar a ansiedade.

**Azul**: confiança, força, credibilidade e profissionalismo. A cor mais utilizada em projeto de UI e UX, está carregada de um senso de inovação e segurança.

**Roxo**: imaginação, sabedoria, realeza e misticismo. O roxo é empolgante, ao mesmo tempo em que acalma a mente e os nervos, encoraja a criação e inspira.

**Rosa**: romantismo, diversão e jovialidade. Esse tom excitante pode aumentar a pressão sanguínea, a respiração, a pulsação e os batimentos cardíacos. Estimula a energia, ação e confiança.

**Vermelho**: coragem, foco, excitação e energia. Assim como o rosa, o vermelho também altera propriedades físicas de nosso corpo, desde a pressão sanguínea até os batimentos cardíacos. Por estimular a ação e a confiança, essa cor é muito utilizada em promoções.

**Laranja**: alegria, confiança e agressividade. Essa cor estimula a atividade, o apetite e a socialização. Uma escolha divertida, cheia de calor e energia.

**Branco**: pureza, neutralidade e limpeza. O branco simboliza novos começos, encoraja a organização e auxilia na clareza mental.

**Preto**: autoridade, poder e suavidade. A falta de cor representa o vazio e evoca o mistério.

Essas são apenas algumas opções entre as várias tonalidades que o designer pode escolher. Como podemos ver, existe uma grande variedade de significados em cada cor. Mas como escolher a ideal?

## Como escolher a cor de um projeto?

Cada projeto de design tem necessidades distintas, por isso é impossível garantir que uma cor será sempre exata para todo tipo de demanda. No entanto, existem alguns casos em que uma cor prevalece sobre outras, como é no design de interfaces e experiência do usuário, conhecidos também pelas siglas [**UI e UX**].

Presente em sites importantes como [**Facebook**] e Twitter, o azul é uma unanimidade quando se trata de UI e UX. Mas por que tamanha aceitação?

Como já vimos anteriormente, azul é uma cor ligada à inovação e tecnologia. Outras cores,como o vermelho, o laranja ou o verde possuem uma ligação simbólica mais forte com erro, atenção ou sucesso, o que torna o azul excelente alternativa para designers.

Ele é bem-aceito por homens e mulheres ao redor do mundo, transmite segurança e confiabilidade. Grandes empresas de tecnologia como PayPal, Dell, IBM e Intel utilizam o azul em suas interfaces de usuário. Repleto de calma, inteligência e equilíbrio, o azul também é uma excelente escolha quando o assunto é acessibilidade. Mesmo nos tipos mais comuns de [**daltonismo**], uma deficiência visual que dificulta a percepção de cores, existe a detecção da cor azul.

Porém, é preciso ressaltar mais uma vez que cada projeto pode (e deve) possuir características únicas. Nem sempre o tom mais utilizado pelo mercado será o correto para seu cliente. Por isso, quando necessário, utilize [**ferramentas para auxiliar**] em suas escolhas cromáticas.

Por fim, não deixe de realizar [**testes A/B**] constantes em seu projeto, acompanhe o fluxo de visitas com auxílio dos Heat Maps e não tenha medo de ousar em cores inusitadas e contrastantes.

Agora você já está por dentro da importância que a psicologia das cores tem no design e sabe que sua aplicação vai destacar seus projetos e trazer reconhecimento para você e seus clientes.

Quando trabalhamos em um projeto de identidade visual, as cores escolhidas são muito importantes, mas não são as únicas coisas a se preocupar.

Tipografia, estrutura, composição e muitas outras coisas fazem parte do projeto. Aqui na alura temos um [**curso de identidade visual**]. Nele você aprenderá essas técnicas para compor a identidade visual desde o briefing até a validação.

Quer saber mais dicas e informações sobre design? Siga o Alura nas redes sociais e compartilhe com a gente suas dúvidas e seus êxitos. Esperamos por você!





imagem 

Alguma vez você, que se interessa em tecnologia, pensou em como é ser parte de um time de devs em empresas com crescimento rápido e que usam as mais novas tecnologias e métodos de trabalhar?

Se você está curioso, continue lendo: **nós batemos um papo bem legal com quatro pessoas que desenvolvem na Movile, na Alura e na iFood**. Alexis, Esdras, Joviane e Yuri falam sobre a rotina deles, linguagens e ferramentas que usam e como foi o processo de chegada na empresa.

E, atenção aqui! Eles também compartilham **dicas para quem quiser começar na área** ou se candidatar para alguma vaga dentro das próprias equipes deles.

imagem é a_ **_diversidade de tarefas_**_. Aqui já dei aulas presenciais de Java e de front-end, depois quis experimentar como era falar na frente da câmera e gravei alguns cursos para a Alura e, agora, faz uns 6 meses que voltei a ser dev. É uma trajetória muito legal.”_

imagem.

**Yuri**: _Entrei na Caelum 4 anos atrás como estagiário, quando estudava Sistemas de Informação na USP. O pessoal da faculdade advertia que quem trabalha em uma empresa acaba largando a faculdade por não ter tempo suficiente. Mas,_ **_era bem flexível e, sempre que precisava estudar, meu chefe entendia_** _e até me incentivava a ir para a facul. O único problema era o sono_ (risada)_. No primeiro mês, fiquei bem cansado por estudar de manhã e trabalhar de tarde._

**Joviane**: _Estava fazendo a_ [_Formação Java_] _na Caelum e, no segundo curso,_ _me falaram:_ **_você está mandando muito bem nas aulas, quer vir trabalhar aqui com a gente como dev e instrutora_**? _E como sempre acreditei na educação em tecnologia, aceitei e comecei a programar e a dar aulas_.

imagem

Nós fizemos um material bem bacana que mostra a trajetória dos quatro protagonistas desta entrevista, falando sobre **o começo da carreira** de cada um, **o que aprenderam nas empresas onde trabalham** e também comentando o que mais gostam na programação.

**Bora conhecer as histórias inteiras desse pessoal e ver mais dicas para programadores e programadoras**? [Baixe aqui] o whitepaper _Como é trabalhar com programação na Movile, na Alura  e na iFood__!_





imagem 

Na editora de livros na qual trabalho, estamos tentando implementar o marketing de conteúdo. Depois de descobrir mais sobre o [**marketing de conteúdo**] e analisarmos nosso público-alvo e de que [forma queríamos nos comunicar com ele], passamos a pensar em como aconteceria essa comunicação.

Começamos a nos questionar onde poderíamos postar os conteúdos e como as pessoas os receberiam.

Nisso, vimos que existem diversos canais para fazermos isso, como blog, redes sociais, podcast, entre outras e fomos pesquisar mais sobre elas para definirmos qual ou quais dela usaremos.

## Cada canal e suas características

### **Redes sociais**

Existem diversas redes sociais, cada uma com a sua característica. Pensamos que seria um ótimo espaço para ter uma comunicação mais direta com nossos clientes, além de fornecer as informações básicas a respeito da editora.

**Twitter:** Pensamos em utilizar o miniblog como uma forma de contato instantâneo. Porém, como ele só aceita textos pequenos, de até 280 caracteres, e, segundo a empresa, [a maior parte de seu público são jovens de 15 a 24 anos], pensamos em criar conteúdos curtos e diretos.

Usar fotos e vídeos curtos para abordar os assuntos e curiosidades da editora e dos livros, criar enquetes sobre próximos lançamentos, realizar sorteios e também sempre fazer uma interação, como, por exemplo, perguntar qual a leitura atual dos seguidores.

**Facebook:** Além de aceitar textos maiores que o Twitter, esta rede social é uma das mais usadas pelos brasileiros [eles são 127 milhões dos seus usuários].

Como há uma maior diversidade de pessoas, com idades distintas, analisamos que a abordagem deveria ser diferente do que a do Twitter. Por também ser possível vídeos e postagens maiores, queremos criar posts um pouco mais completos, que terão de cinco a dez linhas, com imagens ou vídeos sobre os livros, suas histórias e curiosidades.

**Instagram:** Com um foco maior em imagens, e agora vídeos com o IGTV - que é uma plataforma de vídeos na vertical -, pensamos em postar imagens de novidades. Além disso, a rede social, que [possui, mensalmente, um bilhão de usuários ativos].

Se tornou famosa pelos stories, pequenos vídeos que podem ser visto por um dia e achamos que seria legal usarmos esse espaço para mostrar os livros sendo feitos e recém-impressos ou visitas e eventos e estão acontecendo ou irão acontecer.

Em todas as redes sociais pensamos em fazer coberturas de eventos de lançamentos, como stories das pessoas comprando o livro, fotos no facebook e no twitter. Além de em todas também compartilharmos fotos dos leitores com seus livros, incentivando uma interação com os clientes.

**Linkedin:** A rede social que tem um foco maior no perfil profissional das pessoas e das empresas, [possui mais de 500 milhões de usuários], e conecta empresas e candidatos.

Com um foco maior no profissional, a editora poderia usar para criar esse contato com os autores e, até mesmo, dar a aparência de empresa mesmo, mostrando todos os setores da mesma e como ela funciona. Também, poderiam ser feitos vídeos e artigos dos autores que fecharam com a editora, todo o processo, a vida e a importância dos livros na vida deles.

### **Blogs**

Como essa é uma das formas de passar conteúdos mais completos a respeito de assuntos relacionados a sua empresa, avaliamos que seria legal apresentarmos novidades, com mais informações, entrevistas com os autores, tutoriais de como manter o livro limpo e como novo, curiosidades da editora e, também, da história do livro.

### **Podcasts**

Esses são formas de conteúdo como o do blog, mas em áudio. Assim, pensamos em criar um podcast voltado para o conteúdo editorial de livros falando como funciona, para mudar dos assuntos já abordados no blog.

Os primeiros episódios poderiam ser a respeito de como acontece a publicação de um livro até mesmo a falar sobre a decisão de publicar um livro enviado por um autor, por exemplo.

### **Plataformas de vídeos**

A equipe também pensou nas plataformas de vídeo, que são sites ondes as pessoas podem postar ou assistir a vídeos. Por mais que existem diversas opções, como o Vimeo, a mais usada é o Youtube que, de acordo com a empresa, eles possuem [mais de um bilhão de usuários], tendo a maioria de 18 a 34 anos, que assistem a um bilhão de horas assistidas por dia.

Assim, pensamos em trazer vídeos de entrevista com os autores, além de resenhas dos livros da editora feitas por booktubers, influenciadores do Youtube que falam somente sobre livros, dos quais poderíamos tentar fazer uma parceria.

### **Newsletter**

Lembramos de um resuminho mensal que recebíamos de diversas empresas sobre o que tinha acontecido durante aquele período.

Pensamos em fazer o mesmo, enviando tudo que havia acontecido durante o período: os livros lançados, o livro mais vendido e uma dica de leitura. Além disso, atrelamos os outros canais, colocando o post mais lido, e as fotos de leitores com as publicações, que eles haviam nos enviado pelas redes sociais.

### **Ebooks**

Eles são livros online onde um assunto pode ser mais aprofundado. No Marketing de Conteúdo, eles são muito usados como uma forma de adquirir o contato da pessoa. A empresa fornece o conteúdo mais completo gratuitamente para download, mas para isso, a pessoa precisa fornecer um e-mail. Assim, a empresa consegue o contato de uma pessoa interessada naquele assunto em específico.

## Qual canal escolher?

Analisamos todos os canais e como poderíamos atuar em cada um deles. Porém, ainda tínhamos dúvidas de qual escolher.

Nossa equipe é grande e possui pessoas que editam vídeo, áudio, gravam, escrevem, gostam de criar conteúdo e que possam se dedicar exclusivamente para cada uma dessas coisas. Então, pensamos, por que não usar todas ou quase todas?

Como já publicamos livros, acreditamos que não precisamos desenvolver e-books. Mas, avaliamos que seria legal termos um blog a respeito de novidades e curiosidades dos livros e lançamentos da editora. Um podcast, focado somente na editoração de livros, que ainda é bem desconhecida para a maioria das pessoas.

A ideia é com as duas plataformas pudéssemos trazer conteúdos relevantes, interessantes e inexplorados ainda.

Por mais que as pessoas tenham ideia do que acontece em uma editora, a intenção é contar e detalhar cada processo que as pessoas não conhecem.

Nas redes sociais, deixamos um grupo da equipe pronto para criar conteúdo e responder prontamente as pessoas, pois, lá queremos criar esse contato direto e pessoal com cada um deles como se nas redes sociais eles encontrassem respostas e informações em tempo real.

Combinamos para que todos os grupos conversassem entre si, do blog, podcast e redes sociais.

Sempre que houvesse uma novidade no blog e no podcast, seria postado nas redes sociais. Além deles responderem, prontamente, qualquer dúvida ou interação do público e cobrirem os eventos que aconteceriam, relacionados aos lançamentos dos livros ou encontro de fãs.

## Canais no marketing de conteúdo

O lado bom do marketing digital são as diversas formas pelas quais podemos chegar ao público e o mesmo acontece com o marketing de conteúdo.

Para saber quais canais pode usar, deve ser analisado, primeiro, em quais deles o seu público-alvo está mais presente, e depois, a quantidade de pessoas disponíveis e que saibam realizar a tarefa, principalmente, para o caso de vídeos, podcasts e newsletters.

Saiba também de que maneira vocês querem atuar em cada uma. Além de transmitir conteúdo, tenha uma relação com os clientes e lembre-se que o foco, sempre, são eles.

Também, saiba como integrar todos os canais entre si. Por exemplo, sempre que postar algo no blog da empresa, divulgue nas redes sociais com o link do post, para que as pessoas que seguem lá, mas não acompanham o blog, possam visitá-lo.

A mesma coisa pode ser feita com vídeos no youtube, como publicar um vídeo menor e convidar as pessoas para assistir o completo na plataforma.

Por fim pense em maneiras de passar os conteúdos em cada canal. Nas redes sociais, além das postagens que trazem posts do blog, pode-se também utilizar infográficos, imagens e vídeos curtos a respeito da empresa ou um resumo da novidade. Caso sejam mais informações ainda, pode ser uma boa também criar um ebook.

Se você quiser aprofundar mais ainda seu conhecimento sobre os canais de marketing de conteúdo, que tal dar uma conferida no nosso [**curso de Marketing de Conteúdo**]?

Além disso, também pode conferir mais informações no livro da Casa do Código [**Marketing de Conteúdo: Estratégias para entregar o que seu público quer consumir**].

E, caso queira ouvir já, confira esse episódio do nosso podcast Hipsters Ponto Tech que fala sobre[**como a Nubank atua com o marketing de conteúdo nas redes sociais**].





imagem 

A Caelum irá fazer um Outdoor e recebemos uma arte em jpeg com as dimensões de: `640x200px`.

Tentaram utilizar a mesma imagem para o Outdoor e o painel ficou assim:

imagem forma-se um bitmap.

Os arquivos **Bitmaps**, por serem formados pixel a pixel, se tiverem seu tamanho aumentado sofrem distorções consideráveis, pois cada ponto é transformado em blocos maiores, preenchidos com mais pixels de cores intermediárias, que consequentemente deixam a imagem meio deformada. Isso é chamado de [**interpolação**].

imagem.

A boa notícia é que temos ferramentas que fazem isso para gente!

imagem.

Faça o teste você mesmo e diga ai nos comentários!

## Concluindo…

Conseguimos entender melhor para quais situações é uma boa opção a vetorização, como no caso de imagens em grandes dimensões. Mas também poderíamos utilizá-las em diversas outras situações, como em: identidade visual, ilustrações, em motion design, animações, entre outros.

Tento em mente tudo isso, uma "regrinha" que você pode levar considerar é que: sempre que tivermos que fazer um logotipo ou imagens que iremos querer escalar, já produzir em vetorial para evitar retrabalho e problemas futuros.

Seguindo essa linha de raciocínio podemos ter uma noção de qual tipo de imagem iremos precisar em trabalhos futuros.

Caso você tenha interesse em aprender ainda mais sobre [**estruturas e composições utilizando o Illustrator**], temos cursos na Alura sobre esses temas!





Entenda um pouco mais das diversas formas para gerar a data atual, utilizando algumas das funções da linguagem Java de programação.

Quando um aluno inicia um curso é gerada uma matrícula para ele no meu sistema:


java

Mas como faço para adicionar a data atual no momento em que o aluno se matricula em um curso? É simples! Precisamos apenas fazer uma instância para a classe `Date`:


java


Testando o método `geraDataDeInscricao()`, qual será o resultado?

java

Resultado:

```
 > Wed Nov 25 10:16:55 BRST 2015

```

Ótimo, funcionou! Quando fazemos uma instância da classe `Date`, ela coleta as informações de: dia, mês, ano, horas, minutos e segundos de acordo com o Time Zone configurado na máquina com precisão de milissegundos, ou seja, ele vai pegar todas essas informações naquele instante!

Embora a classe `Date` funcione, não é recomendado fazer instâncias dela para gerar a data atual, pois é considerada uma solução _Deprecated_, ou seja, uma solução obsoleta. Sugerimos utilizar a classe `Date` apenas para questões de compatibilidade. Para outras situações, é recomendado o uso da classe `Calendar`, utilizamos o seu método estático `getInstance()` para pegar a data atual:

java

Se testarmos novamente a classe `Matricula`:

java

Resultado:

```
 > Wed Nov 25 10:55:14 BRST 2015

```

Funcionou como o esperado. Existe também a [**classe GregorianCalendar**],que é uma subclasse de `Calendar`, ou seja, uma classe mais específica que abstrai as necessidades para casos em que o seu calendário seja gregoriano. Para alterar o calendário só precisa mudar de `Calendar` para `GregorianCalendar` e, em vez de usar o método estático `getInstance(),` precisamos fazer a instância da classe `GregorianCalendar`:

java

Testando novamente a classe `Matricula`:

java

Resultado:

```
 > Wed Nov 25 10:58:17 BRST 2015

```

A data é impressa com sucesso! Mas, além do `Date` e do `Calendar`, é possível utilizar a classe `LocalDateTime` disponível a partir do _Java 8_, por meio do seu método estático `now(),` que coleta a informação de data atual de acordo com as informações do relógio do sistema operacional.


java

Testando novamente:


java

Resultado

```
> 2015-11-25T11:05:36.693 

```
 

Funcionou como esperado! Como podemos ver, a impressão do `LocalDateTime` é mais sofisticada e apresenta um formato mais legível.

Vimos diversas formas para gerar a data atual utilizando Java, porém algumas são consideradas _Deprecated_ e só são utilizadas apenas para compatibilidade, como é o caso da classe `Date` e também soluções mais sofisticadas como é o caso da `LocalDateTime` disponível a partir do Java 8. E aí, qual solução você gostou mais?

**Há um post da Caelum que detalha essa nova [API do Java 8]. Pensando nisso tudo, o criador da Caelum, Paulo Silveira, resolveu criar um [curso de Java 8] e suas bibliotecas com mais 1500 alunos e 99% de recomendação.**




Esses dias me deparei com o seguinte `select` quando tentavam buscar um livro pelo nome e ano de lançamento:

sql

Por que há um `1=1`dentro de um `where`? Podemos tirar esse `true` daí, já que é equivalente? Claro! Ele é totalmente desnecessário em nosso SQL.

Mas por que escreveram isso? Se olharmos o código que gerou essa query, teremos a resposta:

java

O que eu fiz? Se preencheu o campo nome, adiciona ele na query:

java

Se preencheu o campo ano, adiciona ele na busca:

java

Isto é, nosso formulário de busca permite que o usuário final preencha os campos que bem entender. Se ele não  preenche nenhum, funciona, se preenche qualquer um funciona, se preenche ambos, funciona.

Ao colocar o `where 1=1` fazemos com que cada parte opcional da nossa query use sempre um `and`, e fica fácil de escrever o código.

Por isso é comum ver algumas queries rodando com o where 1=1: **são queries dinamicas onde o programador desejou fazer uma sequência de ands e ficar de boa na hora de concatená-los**!

Consegue imaginar outras variações de como implementar esse código sem fazer where 1=1? Sem ifs extras?

Queria aproveitar para indicar o curso do meu amigo e professor comigo na Alura, o Maurício Aniche:

No [**MySQL I: Iniciando suas consultas**] passamos por diversos pepinos do dia a dia ao usar um banco de dados relacional, resolvendo nossos problemas com o MySQL.





Temos um cadastro que recebe dados como CPF e o CEP do usuário, mas estamos tendo certos problemas no nosso sistema, pois todos os usuários cadastrados estão inserindo seus dados de forma diferente, como mostrado na tabela abaixo:

java

O CPF de cada usuário está sendo enviado em vários formatos e nosso sistema está programado para receber apenas os dígitos do documento, sem nenhum "." ou “-”.

Alguns endereços não estão sendo encontrados, pois para buscar o endereço do usuário é necessário que o CEP esteja sem formatação alguma, ou seja, só possua os dígitos.

Precisamos padronizar isso para que todos sejam salvos da mesma forma.

Para isso, vamos criar um método que pega os dados do usuário e os formata, retirando tudo o que for desnecessário, antes dos mesmos serem enviados para alguma lógica de negócio.

Todos os dados que receberemos serão do tipo `String`, portanto vamos criar um método que recebe uma `String`, formata e a retorna:


java

Vamos começar pelo CPF. Um CPF é composto por 11 dígitos, que podem estar separados, tanto por "." quanto por “-”. E aí, como removeremos esses caracteres indesejados?

## Método replaceAll()

Precisamos sumir com os caracteres indesejados sem remover nenhum dígito ou mudar a ordem dos caracteres da nossa `String`. Para isso podemos usar o método [replaceAll()] da classe `String`.

Este método nos permite substituir todas as ocorrências do caractere que passarmos por outro caractere.

Então primeiro vamos remover todos os ".". Dessa forma temos:

java

Perceba que o primeiro argumento que passamos foi ".", pois ele é o caractere que queremos substituir. Logo em seguida passamos uma `String` vazia representada pelas aspas duplas juntas.

Com isso estamos dizendo que qualquer ponto que ele ache na nossa `String` será substituído por nada, logo, será removido.

Para testar, vamos chamar este método passando um CPF qualquer:

java 

Como resultado temos:

imagem` também aceita [expressões regulares (regex)].

Neste caso, ele considerou o ponto como uma expressão regular. Este regex representa qualquer caractere menos `\n` que representa uma nova linha. Com isso todos os caracteres da nossa `String` foram removidos.

Precisamos fazer o Java interpretar o ponto como apenas um ponto e não um regex, para isso vamos adicionar duas barras invertidas antes do ponto, isso indica para o compilador que o ponto tem um significado diferente do padrão, que naquele caso, é um regex. Logo ele vai considerar o ponto como um caractere normal, desta forma:

java 

Vamos testar novamente e ver o que acontece:

imagem`:

java 

Vamos testar com o mesmo CPF:

imagem` o hífen será removido.

Vamos testar essa teoria passando um CEP verdadeiro:

java 

E no nosso console:

imagem`? Com isso ele eliminaria tudo que fosse desnecessário ou inválido.

Pensando em um CPF ou em um CEP, o que eles permitem ter? Apenas dígitos, correto? Logo, vamos falar para o `replaceAll()` que queremos substituir tudo o que não for dígito por nada, ou seja, queremos remover tudo que não for dígito:

java 

Esse regex representa tudo o que não for um número de 0 a 9. Para testar, vamos passar um CPF cheio de erros, com ".", ”-”, ”/” e letras:

java 

Nosso método nos devolve:

![]

Funcionou! Conseguimos fazer nosso método formatar de forma correta.

## Conclusão

Formatar dados é algo muito comum. É preciso tomar cuidado ao lidar com dados vindos do usuário, pois nunca se sabe o que o usuário está mandando. Também, ao se envolver em um problema desses, onde está ficando cada vez mais difícil criar ou dar manutenção em uma funcionalidade, é muito válido parar e ver o problema por outro ângulo, como foi o nosso caso.

É muito importante saber construir um código limpo e conseguir perceber um problema no nosso próprio código. Para nos ajudar nisso a Alura possui o [**Curso Design Patterns Java I: Boas práticas de programação**]. Lá você aprenderá muito sobre design patterns e boas práticas em Java.




Usando o `:after` ou o `:before`. E sempre acabamos colocando certas delarações CSS nesses elementos, como no código abaixo:

css

Na maioria dos casos, usamos essas declarações, meio chato ficar repetindo código, não?

Repetição de código no CSS é um trabalho que o Sass tira de letra, usando o recurso de _mixins_. Pense em um mixin como uma espécie de função, um trecho de código que você pode repetir em vários lugares apenas o invocando.

css

Esse código depois de compilado no Sass, resulta no seguinte CSS:

css

> Você pode testar esses códigos Sass facilmente no [SassMesteir] ou no [Codepen].

Bacana, mas será que todos os pseudo-elementos que vou criar terão exatamente o mesmo conteúdo? O mesmo `display`? Talvez sim, talvez não. Melhor preparar para o pior caso, certo? É com esse cenário em mente que podemos passar **parâmetros** na criação do mixins. Analisemos o código da criação de um mixin com essa ideia:

css

Agora basta que, ao incluírmos esse mixin em uma regra CSS, passarmos esses parâmetros, como por exemplo:

css

O código acima depois de compilado resulta no seguinte código CSS:

css

Maravilha, não? Um exemplo real seria para fazer um sub-menu, para criar aquela setinha que fica do lado:

<p data-height="265" data-theme-id="0" data-slug-hash="AXdBOY" data-default-tab="css,result" data-user="designernatan" data-embed-version="2" class="codepen">See the Pen <a href="https://codepen.io/designernatan/pen/AXdBOY/">AXdBOY</a> by Natan Souza (<a href="http://codepen.io/designernatan">@designernatan</a>) on <a href="http://codepen.io">CodePen</a>.</p>

<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

E se esses valores do `content` e do `display` forem repetidos muitas vezes, podemos facilitar (mais) a nossa vida, passando valores _default_ nesses parâmetros:

<p data-height="265" data-theme-id="0" data-slug-hash="XKYmov" data-default-tab="css,result" data-user="designernatan" data-embed-version="2" class="codepen">See the Pen <a href="https://codepen.io/designernatan/pen/XKYmov/">pseudo-elemento-com-mixin-parametros</a> by Natan Souza (<a href="http://codepen.io/designernatan">@designernatan</a>) on <a href="http://codepen.io">CodePen</a>.</p>

<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

Eu mostro diversas dessas features com um projeto na prática para você **aprender pré-processadores CSS** no meu [livro de Sass], da Casa do Código:

![Livro Sass - Aprendendo pré-processadores CSS - Natan Souza]

E clicando na imagem ou aqui [nesse link você ganha 10% de desconto], e vale para qualquer livro!

Se você for aluno na Alura, o conteúdo do livro está no meu [**curso online de Sass**] também.





Será que devemos realmente mudar nossas carreiras? Estudamos e dedicamos tanto tempo na profissão que estamos agora para, de repente, mudar?

Como a [Marcela Santos] conta em seu blog "_[A Jornada de Tchellita]_" no post "_[#1 mas pq você resolveu estudar inglês\*?]_" que quando decidiu mudar de carreira várias perguntas surgiram:

> "_... e aí bateu o pânico: por onde começar? o que fazer? o que não fazer?_"

Aos trinta e quatro anos, Marcela, formada em Engenharia da Computação e com um mestrado em Engenharia Elétrica decidiu viver a experiência de mudar de carreira.

Segundo ela, o planejamento é essencial para quem busca a mudança - "..._O planejamento pode e deve ser a maior arma para quem quer fazer essa mudança de carreira...._".

O planejamento é importante, pois, com ele, conseguimos traçar melhor os passos para atingir nosso objetivo.

> "_Dito isso o primeiro passo do meu planejamento foi: o que eu sei e o que eu preciso aprender para alcançar o meu objetivo. No meu caso, me tornar uma desenvolvedora e ter uma carreira nessa área fora do Brasil._"

Sempre que traçamos um objetivo, seja uma viagem, ou a troca de carreira, temos que pensar nos passos, no caminho que teremos que percorrer para alcançá-lo. Algumas vezes, teremos que nos testar e enfrentar nossos medos para alcançar o objetivo final.

No caso de Marcela, ela quer se tornar desenvolvedora e ir para fora do país. Por isso, o seu primeiro passo foi aprender uma nova língua:

> "_Então a primeira coisa que eu decidi que eu precisava aprender urgentemente era o tal do inglês. Para trabalhar em uma empresa fora do Brasil eu preciso me sentir confortável para participar de uma reunião de trabalho e conseguir expor minhas opiniões. Em outras palavras, teria que encarar esse meu medo/vergonha de falar em outra língua._"

Já para o segundo objetivo, Marcela [**assinou os cursos da Alura**] e começou a participar de bootcamps no Canadá - país no qual está fazendo intercâmbio.

> _"Como ainda estou decidindo qual caminho seguir: front ou back end, resolvi começar com os cursos mais básico para entender a plataforma._ _Fiz o curso **[Lógica de programação I: Os primeiros programas com Javascript e HTML]**. 

**Apesar de já ter o conhecimento de lógica o curso foi bom para que eu pudesse me acostumar com o ambiente._ _Em seguida fiz o curso: **[HTTP: Entendendo a web por baixo dos panos]**, que me ajudou a reorganizar conhecimentos que eu já tinha, pois como Engenheira de Computação eu já tinha estudado protocolos de comunicação mas o curso me trouxe uma visão mais direcionada para o desenvolvimento._ 

**Agora estou finalizando os cursos: **[HTML5 e CSS3 I: Suas primeiras páginas da Web]** e Curso **[JavaScript: Programando na linguagem da web]**.

**_Como eu tenho conhecimento de hardware, estou desenvolvendo alguns projetos que possuem um hardware que vai ser controlado via Web, assim eu consolido meu conhecimento fazendo coisas legais como um Robô ou uma luminária que muda de cor, ambos controlados via Web._"**

[Planejar os estudos] é algo muito importante do processo. Dedicar uma parte do dia para estudar é essencial, tanto para criar um hábito, quanto para se ir se aprofundando no neste novo mundo. E o que estudar?

Em áreas como tecnologia, temos diversos campos de atuação. E quando estamos mudando de carreira, podemos pensar: [que área seguir?] Programação, redes, talvez [**algo mais voltado ao design**]?

Não existe uma resposta certa ou errada para essas questões. O bacana é experimentar um pouquinho de tudo. Ler posts, livros, falar com pessoas das áreas, fazer cursos. Criar mini-projetos, participar de eventos.

Aqui na [**Alura temos as formações. Uma série de cursos, podcasts, posts**] que te ensinará as tecnologias que o mercado precisa. No final, você fará um projeto que usará as tecnologias aprendidas durante o processo que será avaliado pelos nossos instrutores.

Gostou de saber sobre a jornada da Marcela? Você pode acompanhar a jornada dela seguindo seu [Twitter], o [Instagram] e seu [blog, A jornada de Tchellita]. :)

E você já pensou em mudar de carreira? Que tal dar uma conferida nas formações na Alura? 





imagem 

O React é um dos assuntos que mais estão em alta no mercado e nas comunidades de tecnologia. **E muito desse “hype” é por grandes empresas como Facebook, Netflix, Instagram e outras, dizerem publicamente que a utilizam o que trouxe muito mais credibilidade pra ferramenta.**

É bom investir em React? É claro que temos outros famosíssimos [frameworks javascript], como Angular, Vue e [Svelte], mas, será que algumas dessas tecnologias bate o React?

Neste episódio do Alura Live, recebi Christiano Milfont, engenheiro de software na Rivendel para falar sobre React, front-end e as tendências do mercado neste momento de turbulência com tantas novidades!

Quer saber mais do mundo React? Confere aí que tá bem legal o conteúdo! :)

https://www.youtube.com/watch?v=TlmYkKQJOQA

Achou bacana o vídeo? Você pode assistir o nosso [episódio completo aqui.]

Conheça nossos cursos de React! Eles estão divididos em 3 partes:

- [Parte 1]: Componentes reutilizáveis para sua webapp.
- [Parte 2]: Container components e o ciclo da vida do React.
- [Parte 3]: A arquitetura flux, implementação do Redux e server side rendering.

Outros cursos e carreiras na [Alura]!

Não deixe de seguir: [Christiano Milfont], a [Alura] e [euzinho] no Twitter! 😀





imagem 

A Caelum Travel está fazendo uma campanha de um sorteio com alguns clientes para passar o fim de semana fora com tudo pago. E recebemos algumas fotos para editá-las. Vamos dar uma olhada em uma das imagens:

imagem:

imagem novamente.

Mas por que precisamos desfazer a ação? pelo simples fato de que não é essa parte da imagem que foi pedida, o cliente gostaria de mostrar ambos os barcos e não apenas um. E como só fizemos um passo, utilizar o **CTRL + Z** (Command Z no Mac) é mais simples e prático.

## Rotacionando a imagem

Um jeito simples para conseguirmos rotacionar a imagem é, ao invés de clicar dentro ou nas setinhas da borda de corte, podemos clicar fora da imagem e arrastar para direita ou para esquerda:

imagem ativada.

![]

O que isso significa? Com a opção marcada o photoshop irá deletar todos os pixels que foram cortados e nós iremos perder essas informações.

Não conseguimos recuperar as informações das imagens. Se não fizer diferença para você, tudo bem. Mas o recomendável é manter a imagem original, afinal, caso você ou o cliente queira fazer futuras alterações que necessitam daquelas informações, podemos recuperá-las sem nenhum problema.

Então se desmarcarmos essa opção e tentarmos aumentar a imagem, podemos recuperar as informações.

![]

Além de chegar no resultado desejado também podemos fazer futuras alterações sem se preocupar com perda de informações.

## Para saber mais: aplicando máscaras

Vimos um caso simples que apenas uma rotação e recorte resolveria, mas para casos mais complexos podemos utilizar outras ferramentas, como a Mask, que nos possibilita fazermos trabalhos mais complexos, que você pode ver [aqui]

## Conclusão

Aprendemos algumas funcionalidades da Crop tool: como recortar, rotacionar. Também descobrimos que podemos escolher entre manter ou não as informações após fazer o recorte.

Além disso, vimos que é bem fácil e prático utilizar essa ferramenta quando precisamos fazer algo simples como um recorte ou rotação.

Porém, um ponto negativo é que você não irá saber se contém alguma imagem oculta ali ou não. Ou seja, se outra pessoa for editar essa foto, dificilmente ela irá descobrir sozinha que há partes ocultas nessa imagem.

Gostou deste post? Aproveite e compartilhe com seus amigos, pode ser útil para eles também 🙂

Quer aprender mais sobre o photoshop? Temos diversos cursos na nossa plataforma da Alura como este de tratamento de imagens com [Photoshop para iniciantes]!

Aproveite para nos seguir nas redes sociais para ter acesso a outros conteúdos como este! Estamos no [Facebook], no [LinkedIn], no [Youtube], e no [Twitter].




Hoje temos um post do nosso aluno Thiago Abreu contando um pouco sobre o seu projeto. 

Aproveitamos esse contato e fizemos uma entrevista com ele para saber mais do projeto, ou seja, o que ele estudou e os desafios que aconteceram no meio do caminho. Tá interessado em saber mais? Então continue a leitura!

imagem que permite às pessoas com necessidades de doação de sangue realizem pedidos, assim a plataforma cruza as informações e notifica os doadores aptos a realizar a doação. Além da plataforma somos extremamente ativos nas redes sociais como [Facebook], trabalhando sempre a conscientização das pessoas sobre o tema para a captação de novos doadores. 

> Além disso a plataforma permite aos doadores gerenciar suas doações, obter informações sobre doação, locais para doação e participar de campanhas. Estas campanhas podem ser realizadas por instituições públicas ou privadas que apoiam a causa. Com tudo, acreditamos que os hemocentros também precisam de um apoio maior para captar doadores de forma mais simplificada, assim disponibilizamos também para os hemocentros uma área administrativa para facilitar esta captação.

## Durante o desenvolvimento do projeto, quais tecnologias estudou e por que?

> Além de ser um projeto muito gratificante pelo seu objetivo, este projeto possibilitou um grande aprendizado e aperfeiçoamento dos meus conhecimentos na área de desenvolvimento. Eu tinha um bom conhecimento com a linguagem [Python] juntamente com o [Framework Django], apenas com estes conhecimentos observei que não conseguiria fazer uma plataforma do nível que imaginava como ideal. Foi então que tomei a decisão de utilizar o Django apenas como backend e servir minhas funcionalidades através de APIs Rest. 

> Com isso, foi possível criar uma certa flexibilidade para possíveis integrações com sistemas legados de possíveis instituições parceiras. Após esta etapa foi necessário escolher qual tecnologia implementar para o frontend, foi neste momento que eu escolhi o [Angular] por ser uma tecnologia de ampla utilização e fácil curva de aprendizado. Esta decisão foi muito assertiva, pois permitiu um aumento significativo na produtividade e a possibilidade de liberar o projeto em menor tempo de desenvolvimento. 

> Isto se deu pela escolha da tecnologia utilizada para implementar o aplicativo móvel. Como utilizei o Angular na implementação do front, resolvi então conhecer e utilizar o [Ionic]. 

> Além de ser híbrido permitindo a criação do aplicativo para várias plataformas utilizando um único código, este tem como principal forma de implementação o Angular JS. Isso facilitou bastante a implementação pois várias regras e serviços que foram implementados no front, eu pude aproveitar no desenvolvimento do app.

## Quais foram os maiores desafios durante o desenvolvimento?

> O maior desafio foi sair da zona de conforto. Até o desenvolvimento desta plataforma, eu me considerava um desenvolvedor backend e muito limitado apenas aos conhecimentos em Python. Hoje me considero um [desenvolvedor full-stack], pois consigo lidar bem tanto no back quanto no front.

## Algum curso da Alura em específico foi essencial para o desenvolvimento?

> Sou fã dos cursos da Alura, fiz 2 cursos de Iônic que foram essenciais para o desenvolvimento deste projeto. Outro curso que me ajudou bastante e não envolve muito a área de desenvolvimento foi o curso de [Lean Startup], pois adoro empreender e sou fã dos conceitos e forma de trabalhar das startups.

## Tem algum objetivo futuro em mente com o seu projeto atual?

> Através da evolução deste projeto foi possível conhecer outras pessoas, como o meu amigo Adriano que agora faz parte do nosso time e vem contribuindo imensuravelmente para o nosso projeto. Ele nos mostrou outros projetos magníficos que possuem o mesmo objetivo de salvar vidas como o [#LeucemiaZero], [#DoeSangue], [#DoarMedula] entre outros. Com isso nosso objetivo é poder cada vez mais ajudar a salvar vidas, contando sempre com o apoio da população e com organizações que visam sempre o melhor para as pessoas. Quanto aos aspectos tecnológicos, novas implementações na plataforma estão a caminho e em breve serão disponibilizadas. Ainda existe muito a ser feito.

E que tal publicarmos também a sua história aqui no blog da Alura? Gostou da ideia? Então entre em contato conosco por e-mail no **contato@alura.com.br** :)




Nesse mundo de [**Mobile, Web e Resposivo**], temos muito termos chiques para ditar como fazer nossos sites. **Mobile-first** é um famoso - pense primeiro no mobile, depois no desktop. Há quem fale agora de **Touch-first** - pense em touch screens primeiro. Tirando a buzzword em si, há muita coisa interessante nesse conceito.

A ideia de Touch-first é priorizamos o código para a interatividade de touchscreen. Hoje em dia não apenas os smartphones e os tablets possuem tal recurso. **O touchscreen vem ganhando espaço entre os desktops.**

Como o touchscreen traz algumas dificuldades. Pensemos, desde o início da escrita do código, na possibilidade de implementá-lo com as ferramentas necessárias para o funcionamento do recurso.

Uma questão importante é a **otimização da área de toque**: devemos estar antentos para o tamanho e a disposição dos botões, eles devem ser grandes e espaçados o suficiente para que o dedo consiga tocar. Temos o mesmo tipo de problema com os links: um tamanho recomendado, pela Apple, é 6,8mm. Pela Mozilla, 5,9 a 9mm, e assim por diante. Perceba que é muito mais plausível apresentar esses números em milímetros, uma vez que os links têm interação com o mundo externo, não com um ponteiro de mouse.

Desses dados sobre o tamanho dos links, se destaca a documentação da Microsoft - que recomenda 9mm -, a qual é baseada em um estudo prático sobre a largura média do dedo dos usuários:

![]

Os desenvolvedores da Microsoft perceberam que o ideal de tamanho é de 9mm para mais, pois com essa medida a taxa de erro é de 0,5%:

![]

Já em relação ao espaçamento entre os botões, a Microsoft indica que o mínimo seja de 2mm.

Porém, na prática, quantos pixeis equivalem aos 9mm? Fazendo a conversão e deixando de lado algum erro, os botões devem ter, em média, 50px.

* * *

Quer mais **boas práticas de sites responsivos**? Aprender Design Responsivo do zero? Conheça o [Curso Online de Web Design Responsivo] do Alura.





imagem 

Photoshop, Axure e Figma. Essas acho que foram as ferramentas que mais mexi na última década como UX Designer. Com a Adobe perdendo terreno para o Sketch e softwares similares, nasceu o Project Comet, que mais tarde se tornaria o fantástico Adobe XD (_eXperience Design_).

imagem;
- Curva de aprendizado tranquila;
- Gera especificações de design;
- Publica protótipo navegável;
- [Atualizações mensais.]

## Um vídeo rápido mostrando a ferramenta

https://www.youtube.com/embed/Wwoq8HQpL0M

Acabei não comentando no vídeo, mas aquela linha azul que fica quando eu aumento a altura da _artboard_ é o limite da altura do dispositivo escolhido. Então na hora de ver a simulação do protótipo daria para _scrollar_ a página.

![Mostrando a linha que define a altura da artboard]

Recomendo seguir o [Twitter do Adobe XD] para ficar de olho em spoilers novidades que o time posta diariamente.

E se você se interessou e quer aprender na prática sobre prototipação, UX e o Adobe XD, dá uma conferida no nosso [**curso de prototipagem com Adobe XD**] na Alura e comece a validar suas mágicas por aí também!





imagem 

Existem algumas maneiras de se recuperar a **senha do usuário administrador (ou do super usuário) no Linux**. Uma muito comum é alterar o modo que o sistema inicia, ou seja, quando realiza o [**boot**]. Dessa forma, acessamos o sistema como superusuário e alterar a senha.

Para isso, precisamos antes entender melhor o que seria o boot!

## Entendendo o boot

Boot nada mais é do que o momento em que sua máquina está sendo ligada. Nesse momento, um programa chamado [**BIOS**] carrega algumas informações sobre o hardware do computador e o checa. Após esse processo ela chama o gerenciador de boot **(boot loader)** que carrega o sistema operacional.

Existem diversos gerenciadores disponíveis. No caso do Linux, esse gerenciador mais comum é o [**GRUB**], porém existem [outros].

Utilizando o GRUB nós conseguimos acessar o sistema como superusuário executar alguns comando, como trocar a senhas de usuários.

Mas como consigo acessar o GRUB?

## Acessando o GRUB

Conseguimos acessar o GRUB no momento em que a máquina está ligando. Basta apertar a tecla Esc, ou Shift. Após um tempo, uma tela parecida com está deve aparecer:

imagem para editar essas informações:

imagem para o [**kernel**]), isto é, o núcleo do sistema operacional. Algumas dessas informações são: o sistemas de arquivos do root, o tipo de montagem de uma partição, entre outros.

Queremos entrar como super usuário no momento em que o Linux é carregado. Logo, vamos até a linha `linux` para colocar essa configuração:

imagem, em **modo de leitura** (`ro`, read only), sem escrever na tela (`quiet`), apresentando uma tela de carregamento (`splash`) e o modo gráfico (`$vt_randoff`).

Mas eu quero poder alterar a senha do meu usuário quando o sistema iniciar. Isto é, quero poder escrever as configurações, então vamos alterar a opção **`ro` (read only) para `rw` (read and write)**.

O sistema será acessado via o terminal. Então podemos retirar essas opções que mostram a tela de carregamento e o modo gráfico:

imagem um [**Shell**], como o [**Bash**], um shell muito comum para os sistemas Linux, que está localizado na pasta `bin`:

imagem do usuário `yuri`":

`passwd yuri`

imagem o comando `init`, que está localizado na pasta `/sbin/init`, passando como parâmetro o nível 6 (reiniciar):

imagem.

Essas mudanças feitas no GRUB são temporárias. Isto é, só valem na vez que foram configuradas no boot. Caso queira que as mudanças sejam permanentes é necessário alterar o arquivo do GRUB.

Esse é apenas um dos muitos jeitos de recuperar a senha do usuário administrador ou do usuário root no Linux. Além desse, outro muito utilizado é usando um **pendrive inicializável com um sistema operacional**. Dessa forma conseguimos montar uma partição e utilizá-la para alterar as senhas.

Veja que conseguimos acessar o sistema como root apenas com uma configuração no gerenciador de boot. Isso pode ser muito perigoso caso alguém com más intenções tenha acesso a máquina. Por isso existem algumas formas de [**proteger**] o GRUB desse tipo de ataque.

Nós acessamos o sistema como super usuário, por isso, **cuidado!** Caso não tenha certeza do que um comando faz, não o execute.

## Senhas recuperadas

Um problema comum que pode acabar gerando muitas dificuldades é esquecer senhas de usuário administrador. No caso do **Linux**, percebemos que isso pode ser revertido utilizando o gerenciador de boot para iniciar o sistema como super usuário e realizar essa alteração.

Para isso, precisamos antes de mais nada, entender como funciona o **boot no sistema** e como configurar o boot loader para carregar o sistema como root.

Só então acessamos o terminal e alteramos a senha do nosso usuário. Porém, não podemos esquecer que isso também é muito perigoso, pois um usuário com más intenções conseguiria acesso ao sistema. Por isso existem algumas formas de proteger o GRUB desse tipo de ataque.

Gosta de Linux? Aqui na **Alura** temos uma [**formação completa**] nesse sistema. Nela você aprenderá sobre os comandos do sistema, sobre sua estrutura de diretórios, gerenciar usuários, grupos, além de muitas outras coisas.




Para quem busca uma colocação profissional na área de Tecnologia da Informação e Desenvolvimento de Software, saber o que é **ITIL é fundamental**. Esse framework é amplamente utilizado no setor de TI e é, também, um dos padrões de mercado da área.

Nascido na década de 80 no Reino Unido, ITIL é uma sigla para o inglês “Information Technology Infrastructure Library”, que pode ser traduzido livremente como ‘Biblioteca de Infraestrutura para a Tecnologia da Informação’. Efetivamente, o ITIL é um conjunto de boas práticas e modelo de gestão de TI.

Neste artigo, vamos explicar melhor o que é o ITIL e porque você deve usá-lo.

## Mas, afinal, o que é o ITIL?

O ITIL é um conjunto extenso de publicações com as melhores práticas para o gerenciamento de serviços de Tecnologia da Informação. Apesar de ter sido originalmente criado na década de 80 pela agência governamental de TI do Reino Unido, a biblioteca foi recebendo atualizações constantes ao longo dos anos e, atualmente na versão ITIL V3 2011, continua sendo um padrão de mercado.

Ele é composto por [cinco volumes] que listam 26 processos e funciona como uma referência de caminhos e boas práticas para o gerenciamento de serviços, dando uma estrutura para que essas rotinas sejam aplicadas e que exista um ciclo constante de melhoria nesses serviços.

Algumas vezes, é confundido como uma metodologia de projetos. Mas não, o ITIL não serve para a criação de coisas novas, mas sim em práticas de rotina. Mas ainda assim, algumas pessoas confundem o propósito do ITIL e imaginam que ele possa ser, por exemplo, um concorrente dos **métodos ágeis**.

## Agile é melhor que o ITIL?

Quando um especialista em TI escuta esse tipo de pergunta, já sabe que ela parte de alguém que não é da área. Praticamente não existe sobreposição do ITIL em relação aos vários métodos ágeis. Uma coisa não tem muita relação com a outra e um setor de TI pode utilizar ambos sem problemas.

Por ser antigo, muita gente imagina que o ITIL é algo ultrapassado. Mas, na verdade, não: além das [**atualizações frequentes**], o ITIL é uma biblioteca de conceitos de gestão e boas práticas, que não ficam obsoletas com tanta velocidade como um computador.

Um fato é que, apesar de ser um padrão de mercado, o ITIL é adotado com mais intensidade em grandes empresas de tecnologia ou companhias que tenham um setor de TI robusto e bem estruturado: [nessa lista], é possível verificar que a biblioteca é usada por boa parte das maiores empresas norte-americanas, além de muitos órgãos governamentais.

Em micro empresas e startups, a biblioteca ainda é valiosa, mas não tão utilizada como nos exemplos anteriores. E, claro, existem companhias que não contam com setor de TI bem estabelecidos e não usam o ITIL, ao custo de muito desperdício, falhas evitáveis em serviços e uma gestão desorganizada.

Independentemente disso, um conselho para quem vislumbra uma [**carreira na área de TI**] é conhecer mais do ITIL e entender a sua importância. E se está querendo se colocar entre as melhores empresas do mundo, precisa investir em [**certificações e cursos**] sobre ele.

## Como ITIL é utilizado na prática?

Os cinco volumes do ITIL são conteúdos extremamente técnicos e muito densos, concebidos para funcionar como uma espécie de manual.

Ler tudo é uma recomendação, mas não exatamente uma obrigatoriedade. Para quem está [**iniciando na área**] é mais interessante buscar guias e cursos sobre a biblioteca para entender melhor como os volumes podem ser usados como referência na condução do ciclo de vida dos serviços de TI.

E claro, quem quer se destacar como gestor e se especializar nisso, pode fazer uma leitura linear dos volumes para uma compreensão mais aprimorada, mas ainda assim terá o ITIL como uma referência, que será regularmente consultada.

## Quais são os volumes do ITIL?

Cada um dos volumes do ITIL lista boas práticas relacionadas a um estágio específico do serviço de TI. Conheça quais são eles:

### Estratégia de Serviço (ITIL Service Strategy)

Esse é o primeiro volume e que relaciona processos e orientações para a priorização de investimentos e direcionamento de recursos na organização. Ele abrange, por exemplo, a gestão do portfólio de serviços e o gerenciamento da demanda, processos que integram a TI com a parte de negócios da empresa.

### Desenho de Serviço (ITIL Service Design)

Voltado para os processos referentes à criação de um novo serviço ou modificação de um já existente, com base em requisitos que foram levantados no estágio anterior, da estratégia de serviço. O gerenciamento de fornecedores, a coordenação do design e o gerenciamento de disponibilidade e capacidade são alguns dos exemplos de processos desse volume, todos voltados para o planejamento.

### Transição de Serviço (ITIL Service Transition)

Na sequência, chegamos no terceiro volume. Ele compreende o estágio de transição de um serviço, quando os requisitos demandados na estratégia e elaborados no design são executados na prática. Além disso, mudanças no serviço também estão no escopo deste volume, que inclui processos como o gerenciamento de mudanças e o planejamento e suporte da transição.

### Operação de Serviço (ITIL Service Operation)

Esse é o quarto volume do ITIL e que, muitas vezes, é enxergado como o mais importante, já que trata das atividades e processos de rotina do setor de TI. Nesse estágio, o serviço já é consumido pelo usuário final. Com isso, a percepção do valor é aprimorada e tudo se torna mais delicado. Alguns dos processos desse volume são o gerenciamento de incidentes, o cumprimento de problemas e o gerenciamento de acesso.

### Melhoria de Serviço Continuada (ITIL Continual Service Improvement)

Por fim, temos o quinto volume. Esse encadernado trata da evolução constante do serviço de TI de acordo com as demandas impostas. O conteúdo dele usa conceitos do [**ciclo PDCA**] (Plan, Do, Check, Adjust), também chamado de roda de Deming. O objetivo aqui é identificar e incorporar melhorias constantes ao serviço.

## Por que eu devo aprender o que é ITIL?

O ITIL é um padrão aprovado pelo mercado e largamente utilizado em todo o mundo. Isso faz com que quem se capacite em seus conceitos esteja apto a trabalhar em empresas de TI de qualquer país.

Para a empresa e o setor de TI, a adoção do ITIL traz benefícios palpáveis, como um aprimoramento da qualidade e confiança dos serviços oferecidos. Em um setor tão complexo como a Tecnologia da Informação, em que lógica e criatividade se misturam, ter um padrão de boas práticas forjadas pela experiência de outras empresas é uma grande vantagem.

E claro, outro incentivo para saber o que é ITIL e [**fazer cursos na área**] é que profissionais certificados ganham um salário maior que colegas sem a certificação em cargos equivalentes.

Agora que você já sabe o que é ITIL e qual a importância dessa biblioteca, aproveite para seguir a Alura no [Twitter], [Facebook] e [LinkedIn] para ficar por dentro dos melhores conteúdos de TI!




Escrevi sobre uma [**análise de dados inicial que fizemos de nossas notas**] na Alura, o que levou à decisão de utilizarmos uma normalização do NPS para nossos alunos e alunas. Já usamos o NPS tem muitos anos internamente portanto é possível analisarmos o histórico de nossos cursos através do uso dele.

Começando com os NPSs mais recentes do banco (usando `pandas` e uma conexão ao banco), mostramos os primeiros N elementos de um grupo de cursosque selecionei para analisarmos:

python 

imagem e a aproximação de uma distribuição (o KDE).

É curioso notar a assimetria da distribuição, repara como o lado direito cai mais rapidamente. As caudas também tem pequenos "bumps". Será que nossa distribuição não se comporta como uma normal?

Mas estamos analisando um tipo de medida que se assemelha uma média, e a estatística clássica diz que tais médias (sob determinadas situações) distribuem como uma normal, o que será que está acontecendo com essas caudas?

Vamos pensar. É basicamente impossível tirar somente notas 10 ou 0 eternamente. Nada no mundo costuma ser perfeito, ainda mais nada no mundo costuma ser perfeito para os olhos de todo mundo que olha - ou estuda - aquele curso.

Em algum momento da história alguém vai dar uma nota que não é 10. Mesmo que seja 9.99, não será 10. Por isso é impossível a longo prazo manter uma nota 10, como discuti no post anterior. Ter somente nota 10 indica, portanto, uma de duas coisas:

1. o curso não teve alunos/as suficientes ainda, e não chegou alguém ainda que não foi tão fã do curso
    
2. houve uma filtragem prévia, expulsando quem não daria nota máxima
    

Portanto os cursos próximos ao 100 são na verdade cursos com poucos votos, que em um momento ou outro no futuro terão pelo menos uma nota 9. O mesmo vale para um curso que teve só duas avaliações, uma primeira nota 10 e depois nota 6: a fórmula para essas duas notas dá um **NPS** 0.

Um NPS 0 costuma indicar um produto ruim ou, como no nosso caso, simplemente que não teve alunos suficientes e foi azar de que a pessoa que daria nota 6 foi a segunda estudante do curso. (é possível analisar a distribuiçnao de notas possíveis e esperadas e entender o quão comum é o efeito das duas pontas, e é super comum, uma vez que o NPS esperado é alto).

Levando em conta esses pontos, é interessante considerar somente cursos com mais de, por exemplo, 50 notas, já fugindo dessas anomalias:

sql

imagem e replotamos esses dados, já focados onde estão basicamente todas as notas normalizadas:

python 

imagem

O próximo passo? Usar outra biblioteca para plotar nosso histograma. Vamos testar agora a `altair`. Criamos um gráfico (chart) em cima de nossos dados `nps` e queremos desenhar barras (`mark_bar`).

python 

O que colocaremos dentro do gráfico? No eixo x virá o campo `nps` que é uma variável quantitativa (`Q`), e vamos agrupar em `20 bins`, como em um histograma. Já no eixo y usaremos a contagem de elementos em cada `bin`:

python

Por fim, vamos dizer que estamos interessados no intervalo 7 a 9.6, cortando (`clamp`) o resto:

python

imagem ajuda a manter o código a longo prazo.

[**Com essa abordagem e linha de pensamento chegamos a fórmula de normalização citada que utilizamos para distribuir "melhor" (melhor = notas mais espalhadas) as notas de nossos cursos.**] Na Alura temos [**diversos cursos que abordam a análise exploratória de dados**].




Já criou algum objeto próprio em Javascript? Tipo:

javascript

O objeto anterior tem várias propriedades: `nome` é uma string, `idade` é um number, `endereco` é um outro objeto com suas propriedades, `telefones` é um array e `calcula-ano-nascimento` é uma function. Tudo bonito!

Mas esse objeto é um _JSON_?

A sigla JSON significa _JavaScript Object Notation_ ou Notação de Objetos JavaScript, em inglês. Pelo nome da coisa, parece que sim...

Parece mas **não é**. Um JSON é um formato de transferência de dados muito usado em chamadas AJAX entre o navegador e um servidor. Você está interessado nos dados, apenas nos dados...

Um JSON tem algumas restrições:

- não pode ter funções
- não pode ter comentários
- todo texto sempre tem aspas duplas
- as propriedades sempre tem aspas duplas

Aquele objeto é um JSON? Não, porque viola alguma dessas restrições. Estamos interessados só em dados, afinal de contas. Teríamos que tirar a function, os comentários e colocar aspas duplas.

O JSON baseado naquele objeto seria:

javascript

Portanto, um JSON é mais restrito que um objeto JavaScript.

**Interessante, não? Aprofunde seus conhecimentos com nossos [**cursos Javascript**] da Alura.




Você está procurando [**emprego na área de tecnologia**]? Então é muito provável que já tenha preenchido cadastros para empresas e agências, certo? Nos dados solicitados tinha um campo escrito portfólio?

Pois, cada vez mais, esse documento tem se mostrado obrigatório para a participação em processos seletivos, além de ser fundamental para quem já está no mercado mas deseja estar sempre aberto a novas oportunidades. 

E não apenas isso: se bem feito, o portfólio pode ser decisivo entre um “a vaga é sua” e um menos entusiasmado “vamos guardar seu currículo para uma próxima oportunidade”.

Até aqui, temos certeza que você já entendeu sua importância, mas, só para não restar dúvidas, vai uma explicação direta sobre o que o portfólio é: uma coletânea de todos os principais trabalhos realizados por um profissional. 

Trata-se de uma espécie de resumo do que você já fez ao longo da carreira. É a vitrine para programadores, designers, profissionais de marketing digital e muitos outros se apresentarem para o mundo.

A seguir, apresentamos um guia completo para construir um portfólio na área de tecnologia. Confira tudo com atenção e não perca mais tempo para criar o seu e alavancar sua carreira!

## 1\. Qual é a melhor opção: físico ou online?

Um dos primeiros passos é pensar no formato como ele será divulgado e apresentado a recrutadores e clientes. Até alguns anos atrás, era comum preparar uma pasta caprichada, incluindo imagens e informações de seus principais trabalhos.

Mas, vamos falar a verdade, apesar de todo o cuidado envolvido nesse método, não é algo exatamente funcional. Imagine a situação: a cada entrevista ou reunião, ter que levar uma pasta; a cada processo seletivo, preparar cópias para deixar com o entrevistador. Nada prático, concorda?

Portanto, para tornar a vida do candidato e do recrutador mais fácil, a solução indicada é o portfólio online. Além da praticidade de apresentação, esse formato é mais simples para atualizar, incluir ou retirar trabalhos, mais barato do que mandar imprimir, acessível de qualquer lugar 24 horas por dia, e permite uma divulgação mais ampla.

Mas fique atento: quando for solicitada a apresentação do seu portfólio no momento da entrevista de emprego, não conte apenas com o virtual — a internet pode falhar ou pode não haver rede na sala em que a conversa ocorrerá.

Por isso, leve consigo um pen drive ou HD externo com os trabalhos que deseja apresentar. Assim, não é por falta de internet que você ficará sem exibir seus projetos.

## 2\. Quais são as ferramentas para criar um portfólio na área de tecnologia?

Escolher a ferramenta ideal para criar o seu portfólio é um passo que exige paciência e persistência até achar aquela com a qual você se entende e se adapta melhor. O fundamental é fazer testes com algumas e não desistir de primeira.

Faça seu cadastro, busque entender melhor a plataforma e peça ajuda e opinião dos amigos antes de se dar por satisfeito. Fora isso, escolha uma ferramenta que consiga atualizar com facilidade e que ofereça um design funcional, bonito e profissional, de acordo com sua área de atuação.

Para ajudar nessa missão, listamos a seguir algumas ferramentas que são usadas por muitos profissionais para criar um portfólio na área de tecnologia.

### 2.1 Carbonmade

Outra plataforma interessante para criar um portfólio na área de tecnologia. A exemplo do Behance, o [**Carbonmade**] também permite organizar os trabalhos por meio de álbuns, divididos por temas e com descrições específicas.

O seu uso é muito fácil: basta fazer um cadastro e escolher um layout preferido. Há diversos prontos; determine aquele que mais tem a ver com seu estilo e área de atuação.

Os templates não são muito customizáveis, ou seja, é indicado para quem não quer ter muito trabalho pensando em layout e deseja concluir seu portfólio o mais rápido possível. Além disso, a versão gratuita só permite o upload de imagens. Se tiver vídeos e áudios, é necessário usar a versão paga, que é mais completa e com mais opções de layout.

Se quiser essa opção, sai 6 dólares por mês para até 10 projetos, 12 dólares para até 50 e 18 dólares na versão ilimitada.

### 2.2 Cargo Collective

Você tem conhecimentos técnicos e deseja usá-los na criação de seu portfólio? Então o [**Cargo Collective**] é para você!

A ferramenta conta com boas opções de customização para quem entende de CSS e HTML, ou seja, para deixar sua página do jeitinho que você quiser, completamente exclusiva.

Mas, se você não tiver o básico de programação, fique tranquilo, o Cargo também é para você. A plataforma tem mais de quarenta opções de templates à disposição dos usuários, que permitem uma apresentação dos trabalhos de forma bonita e funcional. Basta escolher aquele que mais gosta e seguir em frente.

Em poucos passos, e sem muito trabalho, a sua página profissional estará pronta para ser divulgada a quem interessar. Tudo simples e de graça!

### 2.3 DevianArt

O [DevianArt] não é assim tão conhecido como o Behance, mas tem orgulho em ostentar o título de maior comunidade do mundo para divulgação de trabalhos artísticos. E, realmente, é muita gente que o utiliza — são mais de 20 milhões de usuários.

Os templates disponibilizados têm aparência profissional e são fáceis de usar. No plano gratuito, é permitido apenas o upload de até cem imagens por usuário. Porém, veja pelo lado positivo: a comunidade é grande, então mesmo com essa quantidade há boas chances de conseguir visualizações.

Mas se desejar uma opção mais completa, existem planos pagos com mais funcionalidades e possibilidades de personalização. Por fim, se tiver um domínio próprio, pode usá-lo para criar um site com seu próprio nome.

### 2.4 Wordpress

O [**Wordpress**], apesar de não ser exatamente uma ferramenta específica para a criação de portfólios online, atende muito bem a essa demanda. Ele é uma das maiores plataformas para criação de sites e blogs do mundo.

A plataforma oferece uma [grande quantidade de temas], basta escolher aquele que está de acordo com sua área e estilo. Alguns deles com mais de 700 mil instalações ativas, como o tema Twenty Seventeen, mas como o layout é customizável cada site fica completamente diferente do outro.

O Wordpress permite incluir diversas extensões e widgets, que deixam a página mais completa e repleta de funcionalidades. Como a comunidade que trabalha na plataforma é muito ampla, sempre tem atualizações e correções de bugs.

Além disso, em seu site é possível postar fotos, vídeos e textos de forma prática e organizada, ou seja, é uma ferramenta que ser usadas por programadores, designers e profissionais de marketing, entre outros. Se tiver um domínio próprio e desejar usá-lo nesse projeto, será muito bem-vindo.

### 2.5 Github

O [**Github**] é uma plataforma usada por programadores para compartilhar e divulgar códigos, projetos, programas com a comunidade, formada, principalmente, por entusiastas do open source. Utilizada desde os mais novatos até os profissionais experientes da área, permite que várias pessoas trabalhem conjuntamente no mesmo projeto.

Como o portfólio, é uma ferramenta importante, já que empresas e clientes podem conhecer os seus trabalhos feitos pelos desenvolvedores. Além disso, é possível interagir com outros usuários, fazer networking e receber contatos profissionais.

**Os projetos no Github são organizados por pastas, que comportam um grande variedade de arquivos, tais como: html,documentos de texto, php, css, pdf, jpeg, gráficos, entre vários outros.**

Para usá-lo não há limite de upload de arquivos, porém na conta gratuita todos os arquivos das pastas serão públicos, sendo acessados por qualquer pessoa. Quem deseja manter privado e acessível apenas a um grupo específico, precisa fazer um upgrade para a conta paga.

### 2.6 LinkedIn

Uma ferramenta que não é exatamente para criação de portfólio online, mas que atende muito bem a necessidade de divulgação de jobs e projetos, e o melhor, para todas as áreas. O [**LinkedIn**] é considerado a maior rede social do mundo direcionada para assuntos profissionais.

Na plataforma, é possível relatar toda a sua experiência e receber recomendações de colegas e ex-chefes. Além disso, é permitido divulgar links, vídeos, fotos e documentos. Por fim, há a opção de escrever artigos e publicar na rede, sendo um excelente portfólio para demonstrar suas ideias e opiniões, principalmente para quem atua com diretamente com texto, como os profissionais de marketing digital.

## 3\. O que incluir em seu portfólio?

Escolhida a plataforma, vem a parte mais importante: o conteúdo. É hora de mostrar realmente o seu trabalho e vender seu peixe, afinal, não basta um layout bonito em uma ferramenta incrível se não tiver algo bacana para mostrar, certo?

Veja, a seguir, como escolher os trabalhos que devem entrar no seu portfólio para a área de tecnologia:

### 3.1 Variedade

A primeira dica é a variedade de projetos. Ao selecionar o que será exposto, busque um pouco de tudo. Se puder, escolha materiais que envolvam diferentes tipos de público. Além disso, diversifique os clientes o máximo possível, tais como lojas, agências, escritórios, fábricas e o que mais tiver em sua carreira.

A ideia é mostrar sua versatilidade para possíveis recrutadores e clientes, garantindo que você é capaz de trabalhar com diferentes temas e necessidades.

Para ilustrar melhor a situação vamos imaginar um [**designer**] que já fez trabalhos relacionados à música e essa é sua área preferida. Ótimo! Ele tem que mostrar essas criações no seu portfólio, mas não só elas: é preciso diversificar.

Isso significa incluir projetos de áreas diversas, como produções voltadas para crianças, outra para o ramo de viagens e turismos, outra para um escritório de advocacia… Isto é, de ramos completamente distintos e que tenham suas próprias exigências, linguagens e particularidades.

**Dessa forma, é possível demonstrar a versatilidade do profissional, conhecimento e interesse sobre grande variedade de temas, além de flexibilidade,  algo muito valorizado pelo mercado.**  

Por isso, por mais que você tenha atuado durante muito tempo no mesmo segmento, busque produzir peças diferentes. A dica aqui é fazer alguns trabalhos como um exercício, que, apesar de não serem divulgados, são úteis para demonstrar suas habilidades. Incluir projetos da faculdade também é uma boa opção.

### 3.2 Ordem de apresentação

Pense na ordem de apresentação dos trabalhos. Aqui vale a máxima a primeira impressão é a que fica, por isso dê destaque a algo realmente incrível, seja na primeira página ou nos primeiros álbuns. A ideia é impressionar no ato e gerar um sentimento positivo.

### 3.3 Qualidade

Escolha apenas peças de alta qualidade. Afinal, essa é sua vitrine profissional e deve constar só o que tem de melhor. É muito comum que os profissionais tenham em sua carreira algo que não ficou muito bacana ou que não tem mais nada a ver com os dias atuais. Esse tipo de trabalho pode ficar de fora.

### 3.4 Cuidado com os direitos autorais

**Será que posso colocar tudo que já fiz na vida? Essa é uma dúvida comum e há algumas considerações a respeito. Antes de alimentar seu portfólio, é preciso ponderar sobre as questões dos direitos autorais.**

Há empresas e agências que estabelecem em seus contratos que o material criado por colaboradores é de propriedade delas. Isso inviabiliza sua publicação em qualquer outro meio, mesmo que não tenha fins comerciais e publicitários. Nesse caso, o trabalho não poderá ser exposto em sua página na internet, sob o risco de gerar um processo judicial.

Mas se você criou tudo e não há nada formalizado em contrato sobre a exclusividade de veiculação, poderá incluir sem problemas. Anote essa dica: mantenha as portas abertas e a boa educação com as empresas, agências e clientes a quem prestou atendimento. Informe-os sobre a publicação e inclua as respectivas informações sobre nome da empresa, ano de realização etc.

### 3.5 Quem está em começo de carreira, como faz?

Para quem já tem anos de estrada é muito fácil preencher um portfólio. Mas e quem está no começo da carreira? Nesse caso, a única solução é produzir muito, não de maneira comercial, mas sim para aprender técnicas, desenvolver métodos e ganhar experiência.

Vale criar programas, aplicativos e sites que não serão publicados, mas que poderão ser um terreno fértil para muitas ideias. Busque referências na web para suas criações.

Aqui também vale o critério da diversificação: construa projetos com diferentes propostas para ampliar seu conhecimento. Além disso, os trabalhos do período da faculdade são muito bem-vindos. Os melhores devem compor a página.

O fundamental é ter atitude e não ter preguiça para desenvolver. Lembre-se de que isso pode ajudar a conseguir um bom emprego na área de tecnologia!

## 4\. O que evitar no portfólio?

**Se existe o que deve ser incluído, também há o que deve ser terminantemente evitado. Nesse momento, autocrítica é fundamental e muito valorizada no mercado.**

Como mencionamos, a qualidade dos projetos é essencial, então não inclua nada só para encher espaços e aparentar volume e grande produção. O efeito disso será justamente o contrário: qualquer recrutador ou gestor experiente perceberá que algo ali não está legal.

Alguns outros trabalhos, pelos quais talvez você tenha um carinho especial, devem ficar longe do seu portfólio, como materiais que você produziu para familiares, seguindo o gosto deles.

A ideia não é censurar, porém esse tipo de trabalho costuma ter um aspecto amador, e não é exatamente essa a imagem que se deseja passar para um possível chefe ou empresa, não é mesmo?

Se, em algum momento, você participou de um projeto que gerou polêmica e que pode ser mal interpretado na atualidade, é melhor não divulgá-lo também. A ideia é mostrar tudo o que tem de melhor.

## 5\. Pode ser ousado na criação do portfólio?

Já apresentamos algumas [**ferramentas**] que ajudam na construção de um bom portfólio, algumas mais customizáveis, outras menos. No geral, todas atendem satisfatoriamente a essa necessidade.

Porém, existem profissionais que desejam ir muito além e criar algo completamente diferente do que todos estão acostumados. Isso é ótimo, pois um pouco de ousadia e criatividade são extremamente valorizadas na vida profissional.

Há quem já tenha criado portfólio em formato de [passaporte] ou em versão [Super Mario Bros.] Foram ao extremo da ousadia e, nesses casos, o resultado final ficou surpreendente.

No entanto, é preciso ter cautela antes de sair por aí esbanjando criatividade. Buscar algo não convencional é bacana, mas é necessário discernimento. Você tem certeza que conseguiria fazer algo nesse estilo com qualidade ou ficaria amador? 

Para sua área de atuação, isso contaria positivamente? Trabalhar com algo diferenciado assim combina mesmo com você ou só fez porque achou divertido?

Tudo isso tem a ver com autoconhecimento, saber o seu estilo e perceber o quanto realmente deseja ousar. Crie algo que surpreenda, mas vá com calma para não gerar má impressão.

## 6\. Dicas extras para criar o seu portfólio na área de tecnologia

Para que você possa criar o seu portfólio, selecionamos mais algumas dicas que serão importantes no decorrer de processo de desenvolvimento. Veja a seguir!

### 6.1 Cuide da sua marca pessoal

Pense que a apresentação do seu portfólio é uma espécie de vitrine sobre sua trajetória. Você é o criador, então cuidar da sua marca pessoal será indispensável.

Diante disso, é preciso selecionar uma foto com aspecto profissional (deixe aquela com uma peruca e óculos engraçados longe disso), escrever sua biografia de forma correta e interessante, e ter atenção ao e-mail para contato se o seu é algo como lindinha7534@hotmail, é melhor criar outro mais sério. Ter um domínio próprio é também um elemento que demonstra profissionalismo.

Um outro ponto especial é o seu nome. Evite usar apelidos, termos estrangeiros, siglas ou abreviações que não querem dizer muito. O seu nome é a sua marca! Mantenha-o o mais claro e direto possível: isso ajudará no contato com futuros clientes e empregadores.

### 6.2 Seja formal e informal na medida certa

**A área de tecnologia é bastante conhecida pela informalidade, seja no processo de criação de projetos ou na flexibilidade de horários e dresscode muitos do setor trabalham de bermuda e chinelo, por exemplo.**

Não há problema nenhum nisso, na verdade é bem interessante. Só que o portfólio precisa dosar bem o formal e o informal. Sendo sério demais, fica descaracterizado, mas se for informal demais corre o risco de parecer imaturo. Por isso, a dica é ser sutil, preferir a elegância e o bom gosto, sem exageros. Dessa forma, agradará a uma gama maior de pessoas e possíveis empregadores e clientes.

### 6.3 Mantenha a atualização

Entenda o seu portfólio como um organismo vivo, que precisa ser alimentado, cuidado e bem tratado para crescer e dar frutos. Pode ser que a primeira versão não tenha ficado tão boa, por isso atualizar constantemente ajudará na conquista do alto nível de qualidade desejado.

Além disso, a ideia é que haja produção constante, de acordo com as novas tecnologias, funcionalidades e necessidades de mercado. Isso demanda a inclusão de novos trabalhos com certa frequência.

### 6.4 Trabalhe a divulgação do seu portfólio

Já que você criou um material rico, repleto de bons conteúdos, que contam um pouco do seu conhecimento e de sua trajetória como [**profissional de tecnologia**],por que não divulgá-lo?

As mídias sociais estão aí para isso. Compartilhe com seus amigos e familiares na sua página pessoal do Facebook e, se desejar, faça até mesmo uma fanpage. Crie um perfil no Instagram, tenha um blog e mantenha-o sempre atualizado: isso aumenta as chances de aparecer seu trabalho em resultados de pesquisa do Google. 

E, claro, [**não se esqueça do LinkedIn**], a rede social mais indicada para incluir um link da sua página.

Neste post, buscamos contribuir com o processo de produção de seu portfólio na área de tecnologia. Como você pode perceber, é preciso dedicação para encontrar a melhor ferramenta, produzir peças novas quando não há muita experiência profissional, e também boa organização para manter a atualização constante.

Por isso, enfatizamos: tenha noção de que esse documento é realmente importante e pode ser a diferença entre o sim e o não para uma vaga de emprego.

**Trate-o com carinho e atenção, faça revisões e, sempre que puder, peça a opinião de outros. Às vezes, um olhar que não está acostumado com essa produção é capaz de dar ideias ou ter sacadas brilhantes, que só vão acrescentar ao seu material. Agora, mãos à obra e comece já a construir sua página!**





imagem 

Depois de algum tempo na faculdade escrevendo código e programas que funcionavam via terminal, ficava sempre com a impressão de que faltava algo.

Comecei escrevendo programas onde o usuário respondia via terminal, mas enquanto isso o mundo já usa o navegador e sites para interagir com sistemas. Essa casca final de interação com o usuário é a porta da frente de programas na web, e por isso mesmo chamamos de **front-end**.

Partindo do princípio que praticamente todas as empresas estão na web hoje em dia. É cada vez mais importante a **criação de interfaces amigáveis e acessíveis** a [todas as pessoas], e o papel da pessoa desenvolvedora **Front-end** torna-se cada vez mais importante nesses cenários.

Então quais os passos para aprender o Front-end e conquistar uma vaga no mercado de trabalho ?

## A base do desenvolvimento web

Para criar as páginas que eu queria, comecei com o [**básico de HTML5 e CSS3**], com essas tecnologias somos capazes de indicar ao navegador **o quê** mostrar e **como** mostrar.
Ah, já que estamos falando de HTML5 e CSS3, que são a base do Desenvolvimento Front-end, tem um conteúdo super bacana da [GeekHunter] que apresenta uma linha do tempo do [Mercado Front-end]. Você vai ler sobre o surgimento do Flash, até tecnologias em voga, como PWA e EcmaScript!

Após algumas semanas [**estudando**] aprendi a estruturar páginas de maneira semântica, para que os buscadores e leitores de tela conseguissem tornar o nosso conteúdo mais acessível ao usuário final. Aprendi o básico sobre posicionamento e também sobre a [**importância de escrever um código CSS**] limpo, flexível e reaproveitável.

O próximo passo foi aprofundar mais no meus estudo, aprendendo sobre alguns [**tópicos mais avançados**] como pseudoclasses, pseudoelementos, transições, animações, como criar formulários e tabelas semânticas e como utilizar alguns seletores mais avançados.

Depois de mais algumas semanas estudando, foi a vez de aprender sobre a [**diferença**] entre medida relativa e absoluta, e onde e como devemos utilizar cada unidade de medida, como **em**, **rm** e o famoso **pixel** e como [**organizar o meu código CSS**].

Por último, estudei [**as vantagens e desvantagens**] de se utilizar frameworks CSS, como o famoso [**BootStrap**]. Foi então que percebi que o [**CSS tinha deixado de ser simples**] e poderia ser utilizado o para realizar várias outras funções, e não apenas estilizar texto.

Agora que já somos capazes de estilizar nossas páginas e estruturar nosso HTML, vamos aprender a dar vida a nossa página, deixando ela com comportamento dinâmico e interativo.

## Deixando nossas páginas dinâmicas

Hoje em dia uma das linguagens mais populares e comentadas do mundo é o [**JavaScript**], e é com a ajuda dela que iremos dinamizar e criar interatividade nas nossas páginas.

O meu plano para conhecer [o reino encantado do JavaScript] foi focar em tópicos base da linguagem como **variáveis**, **operadores**, **arrays, laços e estilos**. Para praticar essa parte fiz vários exercícios de lógica.

Após algum tempo comecei estudar os tópicos relacionados a [**interação com o usuário**] como criação de eventos, manipulação de elementos, criação de filtros, validação de formulários, até como utilizar o [**AJAX**] para preencher automaticamente formulários HTML.

Como eu já estava escrevendo muito código, percebi que estava na hora de [aprender] como organizar meu código JavaScript de maneira fácil.

Depois de estudar JavaScript puro foi a vez de aprender um pouco sobre [**JQuery**], uma das bibliotecas mais conhecidas no mundo front-end. Além possuir diversas funções e plugins criadas para auxiliar nosso desenvolvimento no dia a dia, durante meus estudos aprendi que o [JQuery facilita nosso trabalho com AJAX] e como fazer requisições HTTP como **GET e POST** e animações.

Por fim aprendi a usar [outras técnicas] com o JavaScript para contornar a difícil tarefa de agradar as diversas versões e tipos de navegadores, ao mesmo tempo que usamos os recursos mais modernos do HTML5 e CSS3.

Como já aprendemos muita coisa sobre a base do front-end, chegou a hora de estudar técnicas mais avançadas para refinar nosso desenvolvimento.

## Evoluindo nosso Front-end UI

Agora que já criamos uma boa base nos fundamentos da web, chegou a hora de estudar sobre tópicos mais avançados do desenvolvimento front-end.

Comecei entendendo o que são [**pré-processadores**] e como [**descomplicar o CSS**]. Também aprendi o que são e quais os [**10 mixins em Saas**] que eu deveria usar em meus projetos.

Uma das minhas maiores dificuldade durante meu aprendizado foi sobre posicionamento e aprender sobre [**Flexbox**] facilitou muito esse processo. Assim como estudar o [**CSS Grid Layout**] me ajudou a criar layouts de forma mais rápida e eficiente. Uma dica que eu deixo para fugir da sobrescrita de estilos é criar componentes CSS utilizando o padrão [**BEM**].

Por fim vamos estudar alguns dos tópicos mais importantes hoje em dia como, desenvolver [páginas que se adaptam] a qualquer tipo de aparelho, como lidamos com os [limites de resolução] em sites responsivos e porque usar [**‘em’ no CSS**].

Agora que já descomplicamos nosso CSS com a ajuda de pré-processadores e já sabemos deixar nossa página responsiva, vamo voltar ao JavaScript e ver o que as novas especificações trouxeram de novidade.

## JavaScript Moderno

Ao longo dos anos nossa linguagem favorita passou por várias mudanças e como engenheiros front-end, não podemos deixar de acompanhar a evolução e especificação do [**JavaScript moderno**].

A nova especificação do JavaScript simplificou nosso trabalho com programação orientada a objetos e [trouxe recursos] como arrow functions, spread operator, template strings e funções como **map** e **reduce**. Além de estudar os novos recursos, também aprendi mais sobre alguns padrões de projetos como o [**Proxy e Factory**].

Até agora aprendemos a usar boas práticas durante o desenvolvimento das nossas páginas, mas inevitavelmente elas vão crescer, então precisamos conhecer algumas técnicas e ferramentas que vão nos auxiliar a lidar com essa complexidade, sem afetar o usuário.

## SPA e React

Uma arquitetura muito famosa e utilizada hoje em dia é a [**Single Page Application**], com ela criamos uma única página que passa a sensação ao usuário de estar em uma aplicação.

Temos algumas opções de frameworks para a criação de SPA, como por exemplo o **Vue.js** e o **Angular.js**. Porém eu optei por escolher o [React] tanto pela facilidade que ele oferece para manipular e atualizar o estado da nossa aplicação, como pela sua grande adoção no [mercado de de trabalho].

Para ter uma melhor entendimento desse framework, primeiro vamos estudar como o React realiza a [navegação e a comunicação] entre os componentes, depois como funciona a criação dos container components e o [ciclo de vida do React] , até chegar na [arquitetura flux], implementação do Redux e o server side rendering.

## Conhecendo a formação Engenheiro Front-end

Uma formação nada mais é do que uma trilha de cursos onde podemos nos tornar proficiente em uma tecnologia. No caso, criamos a [**Formação Front-end**]. Nela, você começará desde o básico com HTML,CSS e JavaScript, até tópicos mais avançados como design responsivo e utilização de frameworks.

A formação não é formada apenas por cursos, mas sim por diversos outros conteúdos, [como podcasts, posts e lives]. Cada conteúdo tem uma parte no aprendizado e eles vão se complementando e integrando conforme avançamos na formação. Ao final da formação, você realizará um projeto.

Isto é, irá colocar em prática tudo que aprendeu nos cursos que estudou. Esse projeto será revisado por um instrutor ou instrutora aqui da Alura que te passará um feedback sobre o código que escreveu.




Quando nosso projeto começa a crescer e ter uma quantidade significativa de páginas diferentes, a gente precisa encontrar uma maneira de organizar o nosso código, e começamos a ver um cenário muito comum de:

- Código duplicado
- Conflitos de nomes de classes
- Falta de padrão nos nomes das classes

A gente aqui na **Alura** já pensou e repensou sobre como resolver esses problemas na hora de organizar nosso **CSS**. Nesse post vou trazer aqui um pouco desse processo pra vocês!

Vamos pegar um componente que representa um curso da Alura, por exemplo:

html 

Esse HTML representa um link de curso da Alura. Ele contém uma **imagem e um título**, e visualmente deve ficar assim:

imagem
- Layout é o estilo específico de cada página ( courses.css, carreiras.css, etc )
- Module é o estilo de componentes que se repetem em várias páginas ( box.css )

E calma lá, vamos entrar agora no state!

**State**, mais conhecido em pt-br como estado, se relaciona com os estados dos nossos componentes. Pense no seguinte componente de menu de navegação.

html 

Digamos que o usuário clica no link **Cursos** do menu, o que deveria acontecer?

 1. O usuário é redirecionado para a página courses. 
 2. O item do menu fica pintado de uma cor diferente, normalmente uma cor mais forte para indicar em que página o usuário está.

Quando o item do menu fica nesse estado diferente após clicado, dizemos que ele está agora no estado ativo.

E oras, como podemos fazer esse item mudar de estado? Perceba que mudar sua cor é basicamente código CSS, ou seja, para alterar estado do item podemos simplesmente colocar uma classe nele com a cor diferente!

Se clicamos no item do menu, o nosso javascript deve colocar nesse elemento a classe

`.active {}`

Bam! Mudamos o estado dele, agora ele fica de uma cor diferente!

Legal, então temos esse outro mandamento do SMACSS, crie uma classe para seu estado, coloque ou tire ela do elemento conforme você precisar modificar o estado.

Por fim, antes de falar do Theme que é o último mandamento do SMACSS, vamos fazer um exercício aqui:

Dado que o menu é usado em algumas páginas, mas não todas, como ele é classificado no SMACSS pelo que a gente viu até agora?

1. Base
2. Layout
3. Module

Se você optou por C você acertou! Ele é um module (pode chamar de componente). Aonde quisermos usar o menu importamos o CSS dele no HTML!

Agora falando sobre o Theme do SMACSS, eles mesmos na documentação citam que é pouco usado,e sinceramente não usamos na Alura.

Essa parte é basicamente para organizar CSS quando lidamos com projetos que podem ter toda a sua interface visual modificada rapidamente por outra. Imagina sites que você pode alterar uma opção e mudar para o tema DARK do site, que muda todo o visual.

Legal gente, agradeço quem leu até aqui, conseguimos organizar a estrutura dos nossos arquivos CSS para não ficar repetindo código e etc mas ainda temos uns problemas que precisamos enfrentar.






Esses dias estava fazendo uns testes com o projeto da [**curso de ASP.NET MVC do Alura**] e me deparei com a necessidade de ter que buscar um autor por Id ou Nome.

Eu teria então, duas rotas exatamente iguais, mas com tipos de parâmetros diferentes: uma receberia um **int** e a outra, **string**:

csharp

Isso quer dizer então que se eu tentar acessar o endereço _/autor/busca/5_ o framework deve me direcionar para o primeiro método. E para o endereço _/autor/busca/gabriel_, o segundo método, certo? Errado! Se tentarmos acessar qualquer um destes endereços, vai acontecer um erro parecido com esse:

csharp

Neste erro, o framework está te dizendo: _cara, você me passou uma url que bate com duas rotas aqui. Eu não sei qual chamar._

### Indicando o tipo do parâmetro na rota

csharp

Consegue enxergar a diferença? Na rota do método que recebe um inteiro, adicionamos :int na frente do nome do parâmetro.

**Agora, se tentarmos acessar a URL _/autor/busca/5_ o ASP.NET MVC irá direcionar para o primeiro método, que eu especifiquei que recebe um inteiro, adicionando o **:int** na frente do nome do parâmetro. Se passarmos qualquer outro valor que não seja um número inteiro(como _/busca/autor/gabriel_, _/autor/busca/123123testando_ e /autor/busca/!@autor$%¨$%¨&&) será o outro.**

Legal, né? Confira nosso curso [**Projeto Completo: Controle Financeiro com Asp.NET MVC 5**] :)




A melhor forma de atrair público para o seu blog é criando conteúdo relevante e de qualidade. Ao oferecer materiais que ajudam, educam e entretêm, você cria um vínculo instantâneo com cada visitante, e essa relação é fundamental para o sucesso do blog!

## Produza conteúdo relevante

Você já reparou a quantidade enorme de conteúdo que você consome todos os dias? São notícias, vídeos engraçados, posts de opinião nas redes sociais, músicas, videoclipes, imagens, GIFs, fotografias, etc. Mas, quanto disso realmente é relevante?

Se você passar agora pela sua timeline em qualquer rede social, quais produtores de conteúdo vão cativar sua atenção e ganhar seu clique?

Esse é o pensamento que precisa nortear a sua produção de conteúdo. Nós somos atingidos por conteúdo o tempo inteiro, e o que define se ele é bom é a relevância que tem para o público. Ao criar conteúdo para o seu blog, procure fazê-lo seguindo esses dois princípios:

### 1\. Conheça seu público

O primeiro passo da produção de conteúdo é traçar bem a sua [**persona**]. A persona é uma representação do seu público ideal, com as características e problemas que você deseja atingir e solucionar.

Ao definir sua persona, você consegue entender melhor como cada conteúdo vai se encaixar dentro da sua estratégia. Se ela gosta de textos longos, você não precisa perder tempo produzindo conteúdos menores; se ela não tem tempo para ler, você pode investir em criar vídeos ou um podcast.

Conhecer seu público é fundamental para produzir conteúdo relevante, e, com uma persona bem definida, o processo de criação se torna muito mais tranquilo!

Utilizar personas é uma dica que pode facilitar bastante a sua vida caso você deseje atuar como redator [**freelancer**], uma vez que ajuda você a conhecer melhor quem seus clientes desejam atingir com conteúdo.

### 2\. Planeje cada conteúdo

O planejamento é a alma do conteúdo de qualidade. Ao ter uma ideia, coloque-a no papel e faça uma pauta bem detalhada do que será produzido. Defina:

- formato: será um e-mail marketing ou conteúdo para o blog? Post, e-book, infográfico, vídeo?
- tamanho e linguagem: curto, médio ou mais denso? Linguagem mais técnica ou mais acessível?
- Call To Action (CTA): qual será o objetivo do seu conteúdo? Pedir que o visitante compartilhe nas redes sociais, baixe um e-book, acesse outro artigo ou vídeo, assine a newsletter?

Lembre-se de adequar cada um desses pontos aos objetivos e interesses da sua persona. Uma pauta bem estruturada funciona tão bem porque permite que você ou qualquer outra pessoa produza o conteúdo, sem prejuízos.

## Aposte em formatos diferentes

Além de um tema relevante, o formato também é importantíssimo para o sucesso do conteúdo. A internet oferece muita liberdade nesse sentido, e a vantagem está ao lado daqueles que sabem aproveitar todas as oportunidades. Confira os formatos mais utilizados atualmente:

### Post

O bom e velho post de blog. Escrito em texto corrido, com imagens apenas ilustrando o conteúdo, o post é o formato mais conhecido e produzido internet afora. Pode ser curto ou longo, informativo ou educativo, tutorial, lista, guia e até mesmo um texto opinativo.

Esse é um formato muito bacana de trabalhar, e a sua eficácia vai depender de cada persona. Como falamos anteriormente, a linguagem, a extensão e até mesmo o estilo de formatação do post vão depender das preferências da sua persona.

Entretanto, algumas dicas são universais:

- lembre-se de que poucas pessoas utilizam apenas o computador para ler posts. Adapte seus textos para serem lidos em smartphones e tablets, utilizando fontes de fácil leitura, cores contrastantes e tamanhos confortáveis. Um [**site responsivo**] é fundamental;

- a internet é bastante flexível quando o assunto é Português. Gírias, abreviações e até mesmo alguns errinhos de ortografia são aceitos nas redes sociais, mas nos posts podem gerar uma má impressão. Não é preciso escrever como em uma tese de doutorado, mas o básico da concordância, acentuação e gramática precisa ser respeitado;

- textos bem escritos são aqueles que o leitor consegue ler e entender sem dificuldades. Não se preocupe em enfeitar demais o post com citações, exemplos e explicações. Na maioria das vezes, ser objetivo é a chave para o sucesso;

### Infográfico

Os infográficos são ótimos para fazer listas, mostrar números e estatísticas ou explicar um assunto um pouco mais complicado. São materiais relevantes e ricos e podem ser disponibilizados como conteúdo exclusivo (mediante cadastro, por exemplo).

Assim, você conquista e-mails para a sua [**base de leads**] e recompensa o visitante com um material rico. Para os e-mails cadastrados, você pode criar uma newsletter semanal ou mensal, fazer e-mail marketing e muito mais.

A dica para criar bons infográficos é apostar em imagens e cores fortes, chamativas, mas sem sobrecarregar o visual. Cores contrastantes e pouco texto tornam a leitura mais fácil, ainda mais se você estiver trabalhando com números e porcentagens, por exemplo.

### Áudio e vídeo

Os formatos audiovisuais fazem muito sucesso aonde quer que apareçam. Mais dinâmicos, dão a sensação de conversa, de proximidade, muito mais do que um texto ou imagem.

Existem várias formas de consumir esses conteúdos, o que os tornam uma alternativa viável para os mais diferentes tipos de persona. Hoje, qualquer smartphone reproduz vídeos com boa qualidade, e se não possui ferramentas próprias para executar áudios, permite pelo menos a reprodução em navegadores.

Além disso, esses formatos podem ser consumidos em qualquer ambiente — basta que o usuário esteja com seus fones de ouvido. Você pode levar conteúdo relevante para o seu público enquanto seus leitores estão na academia, pegam ônibus ou metrô ou, até mesmo, durante as pausas no trabalho.

Veja algumas dicas:

- não importa se você vai gravar um vídeo para o Youtube ou um áudio para podcast, qualidade é fundamental. Escolha uma câmera com boa resolução (pode ser até a do seu celular), um ambiente organizado, bem iluminado e silencioso e mande ver na gravação;

- sobre edições: na maioria das vezes, menos é mais. Grandes produções demandam investimento em equipamento de alta qualidade e tratamento pós-produção. É possível criar produtos audiovisuais de boa qualidade [**sem gastar muito**]. Basta manter a simplicidade e a objetividade, fazendo edições pontuais apenas para lapidar o produto;

- você pode adaptar alguns conteúdos para formatos audiovisuais, como aulas e tutoriais, e até transformar seus posts em vlogs. Estude sua persona e faça testes, até encontrar o melhor formato para cada conteúdo.

E aí, já está preparado para produzir materiais irresistíveis para o seu blog? Compartilhe este post nas suas redes sociais e ajude outros blogueiros a darem o primeiro passo na produção de conteúdo relevante!




Em JavaScript o `String replace` é utilizado com frequência para fazer desde simples **substituições em Strings** até complexas mudanças com **expressões regulares**. Seu uso é simples como `variavel.replace('valor', 'substituicao')`. Eu tenho certeza que alguma vez você já precisou pegar um trecho de texto no final de um HTML, ou remover uma palavra específica de um código. 

Nos formulários da web é  comum termos de lidar com o **campo de CPF**. O que realmente importa  quando colocamos um campo desses são os números, mas construindo interfaces para o usuário final é super importante  mostrar para o usuário a formatação como ele está acostumado a ver nos documentos. Vamos ver como poderiamos resolver esse problema com os poderes do **JavaScript** e sua biblioteca padrão.  

imagem

# Substituindo palavras com String replace

Se queremos pegar os números brutos do usuário e converter para a versão com a formatação, ou mascara de campo. Uma solução ultra direta para resolver o problema, pode ser pegarmos o valor que queremos modificar e aplicar a função `.replace` das strings em cima dele.

Caso tenhamos interesse de manipular um CPF por exemplo, podemos pegar o valor do CPF puro, e falarmos que queremos convertê-lo para a sua versão amigável para o usuário:

js

A função `.replace` recebe como parâmetros o padrão que estamos procurando e como segundo parâmetro o que queremos colocar no lugar

Nesse caso, nós estamos prevendo o futuro e criando um código assumindo que o usuário possui detereminado valor de CPF. Para esse uso o replace pode soar bem estranho, mas caso nosso objetivo seja restringir alguma palavra, como um palavrão, o uso acima cai como uma luva:

js

Caso você queira visualizar esses exemplos dentro do VSCode de uma forma bem legal, eu super indico esse plugin: https://quokkajs.com/

## Substituindo todas as ocorrências com o apoio das Regex

A ideia anterior de excluir palavras de um texto funciona super bem, mas se a palavra aparecer duas vezes no texto, começaremos a ter problemas:


js

Repare que na segunda ocorrência da palavra que queremos remover da frase a função replace não fez nada. Isso ocorre porque quando o primeiro parâmetro da função replace é uma string, ela sempre busca a primeira ocorrência no texto base para o valor buscado. Para ter algo mais dinâmico vamos precisar recorrer ao poder das Expressões Regulares, que em resumo nos ajudam a encontrar padrões em texto de uma forma muito mais completa.

Para resolver nosso problema anterior, basta trocarmos o primeiro parâmetro passado para o replace de `'palavra-feia'` para `/palavra-feia/g`.  O `g` no final da regex indica que queremos buscar de forma global no texto base.

js

# Regex: expressões regulares

Muitos desenvolvedores, quando precisam trabalhar com Regex (*regular expressions*), costumam pensar "_Eu sempre aprendo quando vou usar e esqueço logo em seguida_". No dia a dia realmente na maioria dos casos nós não usamos Regex e se formos utilizar talvez valha mais a pena uma lib de validação como a [Yup] ou [Joi]. De todo caso, vamos dar uma relembrada que irá ser essencial para conseguirmos lidar com o caso do CPF aqui do post:

As Regex procuram padrões, a forma mais direta é escrever a própria `palavra` que você deseja encontrar:

> [/palavra/]

o mesmo funciona para números:

> [/12345679810/]

Porém, se você quiser algo mais abrangente com caracteres especiais e tudo mais, onde a ordem não importe, será necessário definir um range de caracteres: 

> [[A-Z0-9\!\-]]

E ainda no exemplo anterior, para pegar mais de um caracter é necessário declarar quantas ocorrências você procura:

> [[A-Z0-9\!\-]{3}]


Também é possível simplificar, para capturar somente caracteres alfa numéricos você pode usar:

> [\w]

Já para capturar caracteres referentes a digitos você pode usar:

> [\d]

E caso você queira capturar grupos dentro de um match de regex para poder trabalhar melhor como veremos nos próximos exemplos, podemos utilizar os parenteses: 

> [(\d{4})-(\d{4})]

Existem outros casos como utilizar a "?" para alguma parte da regex ser opcional, os marcadores de começo "^" e fim "$", mas isso tudo renderia uma série de posts ou mesmo um curso.

Caso queira ir mais a fundo, vou deixar esse [guia de bolso que eu sempre uso] e se quiser aprender pra valer do 0 mesmo como trabalhar com expressões regulares, vou deixar como dica esse [curso de regex]. 


# Resgatando group matches com a função replace 

Agora que relembramos um pouco mais sobre as expressões regulares, podemos usar a ideia de procurar padrões encaixando em grupos e usar no segundo parâmetro do `.replace` o "`$`" seguido do número correspondente ao grupo na ordem em que a Regex foi escrita:

js

<iframe height="265" style="width: 100%;" scrolling="no" title="WNezRPX" src="//codepen.io/omariosouto/embed/WNezRPX/?height=265&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/omariosouto/pen/WNezRPX/'>WNezRPX</a> by Mario Souto
  (<a href='https://codepen.io/omariosouto'>@omariosouto</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>


Caso você queira fazer algo mais complexo e somente passar uma string resgatando os grupos não seja o suficiente, você também pode passar uma função no lugar da string no segundo parâmetro: 

js

# Dúvidas comuns em manipulação de strings com Regex

- [Capturando conteúdo entre abertura e fechamento de uma tag]. Tome cuidado, nesses casos. [O HTML é uma estrutura que é impossível de ser parseada de forma perfeita via regex], sempre prefira usar a API do DOM para manipular HTML ou uma lib como o [JSDOM] para converter um texto para a estrutura de arvore e facilitar a extração de conteúdo.
- [Dando match em slugs]
- [Lidando com hexadecimais]
- [Trabalhando com URLs]

# Métodos de String

Há muitos [métodos essenciais na String], alguns outros interessantes:

- [split]: É ultra útil quando você quer quebrar uma string em uma ou mais partes agrupadas em um array.
- [trim]: É muito usada ao receber um input do usuário para remover espaços em branco antes do começo da string e após o último caracter que não seja um espaço em branco.
- [includes]: Essa é minha função favorita das strings, ela retorna `true` ou `false` se houver ou não, respectivamente, na string base o valor que você passa como argumento para o `.includes()`.

# Bibliotecas para manipulação de Strings

- Existe uma lib muito popular para lidar com datas chamada MommentJS https://momentjs.com/, é necessário ter alguns cuidados quando for utiliza-la então deixo a dica desse outro link que talvez tenha alguma alternativa que possa lhe atender tão bem quanto https://github.com/you-dont-need/You-Dont-Need-Momentjs;
- Se você quiser lidar com mascaras e formatação (ajuda no cpf, telefone, cnpj...), deixo essa lib aqui https://www.npmjs.com/package/mask-js;
- Libs super bacanas para lidar com validação por schema: [Yup] ou [Joi];
- Não é o foco do post, mas lidar com formatação e operações em cima de dinheiro pode ser algo bem complicado https://sarahdayan.github.io/dinero.js/;
- Caso você queira garantir que um input do usuário esteja realmente seguro para ser salvo na sua base de dados, é importante usar uma lib que faça o papel de remover possíveis conteúdos que gerariam injeção de scripts como essa aqui https://github.com/apostrophecms/sanitize-html

Se você for curioso como eu, deixo a dica para ver como [manipular Strings em Python](manipulacao-de-strings-no-pandas-lower-replace-startswith-e-contains), e de quebra esse site super maneiro https://regex101.com que eu tenho certeza que vai ti ajudar bastante a criar regex de um jeito rápido e fácil de testar.

Nesse post nós abordamos uma série de tópicos  importantes com relação a manipulação strings. Vimos os poderes do `replace`, casos comuns de tratamento de strings e espero que esse post ajude tanto você, quanto algum amigo seu que pode estar agora sofrendo querendo **validar um CPF** ou algum dos exemplos que vimos anteriormente.

Se você curtiu, não deixe de [seguir minhas redes sociais] e dar uma olhadinha no [meu site] que toda semana está saindo algo novo por lá. Até a próxima :)





Normalmente quando pensamos em melhorar a UX de nossos projetos pensamos automaticamente em itens como fonte, cor, [**microinteractions**], etc. Mas como estão os textos desses projetos? E os microcopies?

Todo conteúdo, seja ele visual ou textual, é importante ser pensado quando queremos criar uma experiência completa e agradável ao usuário. Para começar, podemos antes entender melhor do que se tratam os microcopies, ou micro-textos.

# O que é micro-texto?

Microcopy são textos curtos e objetivos, bem escritos, que compõem a interface com alguma proposta de interação ou explicação, seja isso um place holder, um subtítulo explicativo ou label de botão, mas visando apelar para as esferas emocionais do usuário, criando um vínculo de alguma forma.

Peguei a [**Alura Línguas**] para fazer alguns exemplos simulados, vamos dar uma olhada:

imagem

Podemos nos perguntar e reparar algumas coisas nesses textos principais, por exemplo:

1. O curso é presencial ou online?;

2. Qualquer escola vai me falar que com eles aprenderei inglês, faz sentido dizer “Curso de inglês. Aqui você aprende inglês”?;

3. O label “Comprar” do botão não parece “seco” demais para um site que quer me convencer a virar um assinante?;

Primeiramente, perceba que modificando o título para “Curso online de inglês” podemos evitar possíveis alunos que procuram um curso presencial de assinarem a plataforma e se frustrarem ao perceber que aquilo não era o que buscavam.

>“Mas Natan, não é ruim perder uma conversão aí?”

Pensando no lado do negócio, será melhor convertemos esse usuário e ele, inevitavelmente ficar com uma má impressão de nossa brand ou focarmos em potenciais usuários que realmente pagariam para aprender inglês online? Perceba que apenas uma palavra pode mudar totalmente a experiência de uma pessoa numa plataforma.

Agora, com relação ao **item 2**, como poderíamos nos vender ali naquela frase? “Aqui você aprende inglês” em qualquer “Juquinha Línguas” eu aprendo (segundo a própria Juquinha, claro).

Aí chega um momento que devemos tentar vender nosso produto/serviço de alguma forma diferenciada. E se alterarmos a frase para “Aqui você aprende inglês **de verdade**“? Muda um pouco nossa percepção, mas ainda parece que um vendedor está tentando me empurrar esse curso.

Como podemos apelar para o emocional da pessoa? Mexendo com seus sentimentos! Uma outra alternativa para o texto seria “Inglês para não passar vergonha lá fora”. Bacana, porém possui uma carga meio negativa. Podemos mudar a frase para “Reforce e aprimore seu inglês, conecte-se com um mundo novo.” ou simplesmente “Conecte-se com um mundo novo, em inglês.”

# Melhorando o call to action

Último passo agora é tirar essa carga sales do botão, como fazer isso mantendo a ação que o usuário fará?

De “Comprar” podemos mudar para “Adquirir plano”, mas não estaríamos falando muito a linguagem do usuário aí, afinal quem chega em casa falando “Amor, cheguei! Adquiri um novo jogo de pratos hoje!”?

Que tal, em vez de “Comprar” um “Comece agora!”. Um pouco imperativo por conta da exclamação talvez? Mesmo sem ela parece que estamos impondo uma ordem para nosso usuário. Que tal “Aprender inglês”? Estou dando a dica que ao clicar no botão ele vai começar a aprender inglês (emocional) e de fato esse seria o primeiro passo para ele começar a aprender! Se ainda quiséssemos deixar algo mais imperativo poderíamos colocar “Aprenda inglês”, por exemplo.

Por fim, com as alterações ficaria assim:

imagem

# Qual o melhor jeito?

Da mesma forma que não temos receita de bolo na UX, com microcopy não poderia ser diferente.

Sempre devemos nos perguntar duas coisas:

* Qual o sentimento que quero transmitir para o leitor;
* Quem é esse leitor?

Respondendo essas duas perguntas, você consegue trabalhar muito melhor quando o assunto é microtexto/microcopy!

O que eu faço atualmente é ir escrevendo em um bloco de notas tudo que me surge na cabeça, mesmo que eu não vá usar. Depois vou mudando palavras, contextos e tons. Buscar referências de grandes players do mercado pode te ajudar, mas lembre-se: são apenas **referências**, o negócio e o usuário deles não são o mesmo que o da sua empresa.

# Bacana, tem alguns cases e outros exemplos?

Sim!

## O botão de $300 bilhões

Esse case não temos nomes de empresas, mas [Jared Spool publicou um artigo] sobre um botão de um e-commerce que depois que os usuários escolhiam um produto, encaravam um botão de “Registrar”. O ponto é que a taxa de abandono do carrinho era alta. E eles descobriram que um dos motivos disso é que os usuários não queriam criar um vínculo com a empresa, só queriam… fazer suas compras!

Nisso o texto do botão foi alterado para “Continuar”, e adicionado um microtexto informando que não era necessário cadastrar para fazer o checkout no site deles. Com isso, **a conversão aumentou em 45%**, e talvez esse seja um dos motivos que hoje os grandes e-commerces oferecem a opção de compra sem cadastro.

## Tumblr

O [Tumblr] é um serviço de blog que, para cadastrarmos, pedia apenas email, senha e a URL do quase-criado blog. Eles perceberam que muitas pessoas ficavam muito tempo nesse terceiro campo pois acreditavam que a plataforma não oferecia a opção de alteração depois de criado, o que na realidade era uma funcionalidade já presente na ferramenta.

Então eles colocaram um microtexto acima do campo dando essa informação, algo como “Você pode mudar isso a qualquer hora”. Com isso eles conseguiram diminuir o tempo que as pessoas passavam nesse formulário.

imagem

## Porto seguro

A Porto Seguro tinha uma parte no site para fazer cotação de seguros online, mas era imprescindível que, para agilizar todo o contato inicial do corretor com o cliente, o nome inserido no formulário deveria ser 100% igual ao do CPF.

Vários chamados abertos pois a alteração não era simples de ser feita, eis que eles colocaram justamente essa informação sobre o CPF junto com o campo. Vitória, diminuíram os chamados e o processo continuou rápido.

## Apple

Na página do Apple Watch, ao clicar em “Comprar”, o usuário precisava escolher entre dois tamanhos do relógio. Como sugerir que o tamanho é basicamente uma questão de gosto? Colocando essa informação lá!

imagem

Hoje na página temos esse link de “Qual é o tamanho de caixa ideal para você?” que abre uma modal contendo essa informação, além de coisas como os textos serem maiores e a tela ser maior.

Não tenho os números, mas com certeza a quantidade de de pessoas falando no chat deles “não sei qual tamanho comprar” deve ter diminuído.

Eu comento de alguns **cases de microcopy** e usabilidade em geral nos [**cursos de UX na Alura**].






Afinal de contas, quando devemos ou não usar o **operador identico (===)**? Pra que serve esse operador de comparação? Qual a diferença entre eles?

Ao trabalhar com formulários, é comum a necessidade de validar um email e não existe uma forma padrão de fazer isso. Existem diversas regras de , por exemplo, que haja algo escrito antes do `@`. Uma forma de verificar isso é usando a função [**strpos**] que verifica a posição da primeira ocorrencia de uma string:

php

Mas, caso o usuario não digite nem o `@` precisamos, também, dizer que aquele campo é especifico para email! No caso de não haver ocorrencia de string, a função `strpos()` retorna `null`. Portanto, para validar, também, este caso teriamos:

php

Beleza, nossa lógica faz todo sentido! se o `@` estiver na posição `0` da string `$email` falamos que faltou a conta. Se não houver `@` na variavel `$email` exibimos outra mensagem dizendo que nosso usuario preencheu o campo errado!

Mas, se rodarmos esse código, as duas menssagens serão exibidas!

Isso acontece porque, na [**tabela de comparação de tipos do php**] o valor `0` é igual a `null`! Precisamos, de alguma forma, comparar valores de uma forma mais especifica onde o tipo faça diferença. Neste caso, `0` seria apenas um inteiro qualquer, não outra representação de `null`.

E é aqui que devemos usar o operador identico `===`! Com este operador, diferente do `==`, levamos em conta não só o valor mas também o tipo na hora da comparação.

Então, nossa validação de email deve ser escrita um pouco diferente:

php

Agora sim somente uma menssagem será exibida. Se a posição for zero, mostramos a menssagem dizendo que faltou a conta. Se não houver `@` mostramos a menssagem dizendo que o campo é especifico para email.

Uma pequena diferença de tipos, pode causar um grande impacto nas funcionalidades do nosso sistema.

E você? O que achou do operador identico? Compartilhe com a gente sua opinião!

Para saber mais conceitos em PHP, aqui na [**Alura temos uma formação focada no desenvolvimento PHP**]





imagem 

Quer armazenar **seus LIVRO** no banco? Ou quer buscar **um PRODUTOS** no banco?

Minha orelha já dói e a sua?

Quando juntamos um monte de livro... temos livros, portanto tabelas levam o nome no plural:

sql

Quando colocamos um livro entre os que já existem, colocamos um livro nos... livros. Removemos um livro dentre os... livros:

sql

Fica um padrão pra todo mundo na empresa, e não fica aquele sofrimento para relembrar... nesse projeto foi singular ou plural?

**Regra geral**, nome da tabela vai no **plural**.

Desafio para a próxima: qual a ordem dos meus usuarios?

sql

E que tal começar aprender sobre banco de dados hoje mesmo? Gostou? Então dê uma olhada nos nossos cursos de [**SQL e NoSQL**]




Talvez o erro mais comum que os desenvolvedores enfrentam, principalmente quando estão dando os primeiros passos no universo da programação, é o famoso [NullPointerException] (NPE para os íntimos).

Entretanto, com alguns cuidados, que podemos chamar de programação defensiva, conseguimos nos prevenir de tomar essa exceção.

Para nos ajudar a entender melhor como prevenir um NPE, vamos tomar como exemplo uma aplicação que realiza pagamentos. Nela, temos uma classe que é a responsável por salvar o cartão de crédito do usuário:

java

Também temos uma classe que representa o usuário desse sistema:

java 

Vocês acreditariam se eu dissesse que este código já está propenso a receber um NPE? Antes de explicar o porquê, vamos entender melhor essa exceção.

## NullPointerException

`NullPointerException` é uma exceção que indica que a aplicação tentou usar uma referência de um objeto que estava com valor nulo.

Extende a classe [**RuntimeException**], que, por sua vez, engloba exceções que são disparadas em tempo de execução. Além disso, NPE é uma _unchecked exception_, logo, ela não precisa ser tratada e o compilador não acusa erro em tempo de compilação.

As _unchecked exceptions_ representam falhas no código feitas pelo programador, (sim, a culpa é nossa). Normalmente são bugs da aplicação que poderiam ter sido evitados caso o desenvolvedor tomasse mais cuidado na hora de programar.

> > Mas por que tomamos NPE’s? Quais as causas? O que deixa o código propenso a essa exceção?

Se fossemos listar as ações que causam `NullPointerException` teríamos algo assim:

- Chamar um método de uma referência de objeto que esteja com valor nulo
- Acessar ou modificar um atributo de uma referência de objeto nula
- Em caso de array ou coleções, usar métodos de elementos nulos
- Lançar um `NullPointerException`
- Fazer uso de unboxing em um objeto de valor nulo
- Tentar pegar o tamanho de uma array nula

Voltando ao código mostrado no começo, vou provar para vocês, que aquele código já está muito propenso a receber um NPE.

Bom, temos um método que, dado um novo cartão que o usuário está tentando cadastrar, verifica pelo número se aquele cartão já consta cadastrado na lista de cartões do usuário. Podemos ver o código do método logo abaixo:

java

Para mostrar para vocês esse método funcionando, vou criar um usuário novo e tentar validar um novo cartão de crédito.

Como acabamos de criar o usuário, em teoria o resultado deveria ser `true` pois não temos nenhum cartão cadastrado ainda. Para o teste, iremos usar o seguinte código:

java

Ao executar este código, temos o seguinte resultado:

imagem` que devolve o valor do atributo `numero` que, no caso, está nulo. Portanto, quem está chamando o método `equals()` está nulo e, por sua vez, iremos receber um NPE.

Para evitar isso podemos validar as informações vindas de fonte externa. Beleza, podemos, mas também podemos ao invés de chamar o `equals()` pelo objeto preenchido pelo usuário, chamá-lo pelo cartão iterado pelo `for`. Dessa forma:

java

Pronto, não tomaremos mais NPE pelo motivo que estávamos tomando, pois, sabemos que o atributo `numero` dos cartões que já estão na lista do usuário estão preenchidos, logo, o método `equals()` não será chamado por um objeto nulo.

## A classe Optional

Com o Java 8 veio uma nova classe chamada [**Optional**], que por sua vez, traz um conjunto de métodos para tratar blocos de código críticos. O `Optional` pode ser pensado como algo que pode ou não ter valor. Se não tiver, dizemos que ele está vazio.

Para explicar essa classe de forma consistente, eu teria que escrever um post completo, pois o assunto não é pequeno. [**Existem diversas vantagens no bom uso de Optional dentre elas a proteção contra NPE**], mas também, é mais difícil entender seu uso logo de primeira, portanto um estudo aprofundado dessa classe é necessário.

Para aprender mais sobre exceções, inclusive NPE, a Alura possui o curso [**Curso Java II: Orientação a Objetos**]. E, também, se você ficou interessado pelo Optional, tem o [**Curso Java 8: Tire proveito dos novos recursos da linguagem**], que além de falar sobre esta classe, também mostra outras funcionalidades que o Java 8 trouxe.




Operações com **ponto flutuante** podem ser uma grande dor de cabeça em diversas linguagens, e não é diferente no PHP. Um simples 0.1 + 0.2 pode dar uma resposta inesperada. **Como ter uma precisão que queremos?**

Recentemente estive trabalhando em um programa para que eu possa gerenciar o dinheiro que entra e sai da minha conta bancária, guardando informações sobre cada transação de débito e crédito.

Para armazenarmos estas informações, vamos iniciar criando um arquivo **PHP** com um array que armazenará o débito e o crédito:

php

Agora, como realizei um pagamento de R$0,10, adicionamos a seguinte linha no programa, para adicionar o valor no array de débitos:

php

E mais tarde, realizei outro pagamento de R$0,20, então adicionamos também mais uma linha:

php

No final do dia eu recebi um pagamento de R$0,30, então adicionei um valor no array de créditos do programa:

php

Por enquanto, o nosso código ficou assim:

php

Agora, preciso consultar o meu saldo e exibí-lo na tela, vamos criar uma função para calcular isso, adicionamos no final do programa:

php

Para consultarmos o saldo, vamos imprimir na tela o resultado da função. Chamamos a função e passamos os arrays de débito e crédito como argumento:

php
E se executarmos o programa, tanto pelo terminal quanto pela web, vamos ver que a saída do programa ficou:

imagem é diferente da que o computador utiliza (base 2), e a conversão entre elas pode causar erros de precisão.

Em números de base 2, com um dígito, podemos representar dois números (0 e 1). Com dois dígitos 2² podemos representar 4 números (0 a 3), com três dígitos, 2³ = 8 (0 a 7) e por assim vai.

Em números de base 10, com um dígito, podemos representar 10 números (0 a 9), com dois dígitos podemos representar 10² = 100 números (0 a 99). Com a base 10, representamos mais números com menos dígitos, tendo uma precisão melhor.

Como o computador só entende números binários (base 2), tudo que digitamos nele vira uma sequência de 0 e 1 para que o processador possa interpretar.

Para exemplificar a diferença entre um número em binário e decimal (base 10), vamos pegar por exemplo o número 1025 que em binário, fica 10000000001, precisando de onze dígitos, mas em decimal, seriam utilizados apenas quatro dígitos (1, 0, 2 e 5).

Normalmente não percebemos este erro por acabarmos não utilizando toda esta precisão para representar números mais simples. Mas quando obtemos algo como uma dízima periódica, ou usamos operadores de comparação, vemos que o arredondamento acontece e causa problemas pois ela é infinita, e a **memória do computador é finita**, então o arredondamento tem que acontecer em um ponto por questões de arquitetura do processador.

imagem e armazenamos ele no programa como tipo `Int`, e fazemos todas as operações nessa unidade, pois o tipo `nt` não tem arredondamento que nem o Float, portanto não estará sujeito a perda de precisão devido ao arredondamento.

Utilizando o programa que construímos como exemplo, o código dele ficaria assim:

php
Mas como estamos tratando como centavos, assim que quisermos representar ele como real, tratamos somente na saída.

php

Podemos utilizar a função **number_format** do PHP para exibir os centavos armazenados internamente de uma maneira correta na tela.

imagem e se for 64-bit, o valor máximo é de R$ 92.233.720.368.547.758,07 (92 quatrilhões de reais).

Vale lembrar que o PHP não suporta tipos inteiros unsigned (onde só existem números positivos), ou seja, esse máximo vale tanto para um valor positivo quanto negativo. Você pode descobrir qual o limite na sua instalação do PHP imprimindo a constante PHP_INT_MAX.

imagem:

php

Agora, para que o PHP consiga visualizar a extensão Decimal, precisamos colocar nesse arquivo que criamos, o nome da extensão e a prioridade:

php
Agora podemos utilizar o tipo Decimal! Ele está dentro do namespace com o nome de Decimal. Então para utilizá-lo, precisaremos adicionar a seguinte linha no começo do programa:

php

Então, podemos instanciar a classe Decimal com uma string contendo o valor que queremos representar, por exemplo:

php

Utilizando o nosso primeiro exemplo e adaptando ele para utilizar o tipo Decimal, ficaria assim:

php

E se executarmos, podemos ver que a saída será exibida corretamente:

imagem, que mantém um guia sobre tudo que um programador precisa saber sobre precisão numérica.

Outro site interessante para quem quiser saber mais sobre como essas coisas funcionam no PHP específicamente é a documentação oficial do PHP na parte de [**floats**].

Vimos que, para obtermos uma maior precisão numérica, o Float não é um tipo de dado recomendado por ele arredondar valores.

Vimos também que o tipo **Int** não possui arredondamento, e que ele é uma solução preferível ao **Float**, mas ele possui limitações em seu tamanho máximo.

Além disso, sabemos agora que o tipo Decimal, instalável através de uma extensão, é o tipo recomendado para tratar com valores de uma maneira mais precisa.

Você gostou do que leu? Aqui na **Alura** temos uma [**formação PHP**],você vai aprender desde os fundamentos da linguagem junto com as boas práticas e o essencial conhecimento de uma boa modelagem orientada a objetos.! 





imagem 

Mais uma vez temos o depoimento de um aluno nosso! Eduardo Branquinho conta um pouco como a Alura ajudou ele a conseguir seu atual emprego como desenvolvedor.

imagem e resolvi a integração! =D

## Em que empresa conseguiu seu novo emprego

No [**Hipsters.jobs**] consegui um emprego em uma empresa de desenvolvimento chamada [**Bluesoft**]. Tanto no desafio técnico quanto na entrevista usei diversas coisas que aprendi na Alura, como Spring, JPA,Git, Java 8 e tudo mais.

Já aproveitando o gancho, tirei uma certificação da Oracle de Java 8 no ano passado só estudando pela Alura na carreira de certificação que aposto que ajudou meu CV a ganhar uma visibilidade melhor ainda.

## Alguma dica para seus colegas desenvolvedores?

Crie o hábito de estudo! Não pense que "poxa, só tenho 15 minutos, nem compensa estudar, pouco tempo". Uma aula de cinco minutos já pode te passar um conhecimento bem bacana.

Outra dica seria para você se jogar na sua profissão. O que que quero dizer com isso? Se você é um programador PHP, não apenas programe em PHP no trabalho.

Veja uma aula de PHP a noite, faça um programinha de final de semana, leia blogs sobre o assunto, vá a palestras, leia livros no ônibus. Entre de cabeça na área. Isso ajuda muito, você realmente se sente no meio, integrado com a programação. Claro que este exemplo serve para qualquer outra área, seja de devops, front-end, ux e tudo mais. :)

**Curtiu o relato do Eduardo? Você pode compartilhar o seu também! Entre em contato conosco através do contato@alura.com.br**





imagem 

Trabalhamos em um ecommerce e fomos incubidos de cuidar de um bug que está ocorrendo no software da nossa empresa.

Para realizar a compra de algum produto é necessário fazer um cadastro no site. Nele pedimos algumas informações para o usuário, como por exemplo: Nome, email, endereço, telefone, CPF, entre outros.

O problema está ocorrendo exatamente no cadastro, alguns usuários estão colocando qualquer valor no campo de CPF e nosso software está permitindo isso. Nossa missão é conseguir capturar o CPF digitado e validá-lo.

**Mas, e aí? Como se valida um CPF? Não faço a menor ideia!** Para isso que existe o Google, certo? Vamos pesquisar:

- CPF possui 11 dígitos
    
- Multiplica-se os 9 primeiros dígitos pela sequência decrescente de números de 10 à 2 e soma os resultados obtidos
    
- Multiplica-se o resultado acima por 10 e divide por 11, o resto da divisão é o penúltimo número do CPF (caso o resto seja 10, o resultado se torna 0). Logo se o número calculado for diferente do penúltimo número, o CPF é inválido.
    
- Caso o primeiro dígito seja igual, multiplica-se os 10 primeiros dígitos pela sequência decrescente de números de 11
    
- Multiplica-se a soma feita acima por 10
    
- Verificamos se o resto da divisão da multiplicação acima por 11 é igual ao segundo dígito, se for, o CPF é válido.
    

> Ah não, assim não dá, eu já me perdi na terceira regra. Validar CPF é algo muito complexo.

Parando para pensar, fazer esse tipo de validação deve ser uma tarefa comum para programadores, pois muitos sistemas necessitam dessa funcionalidade, logo, será que já não tem algo pronto?

## Caelum Stella

Vendo esse tipo de funcionalidade sendo bastante requisitada por empresas e, consequentemente, pelos seus desenvolvedores, a [**Caelum**] decidiu criar o [**Stella**], uma [**API**] que já traz todas as ferramentas necessárias para que possamos concluir nossa tarefa, ou seja, validar um cpf, de forma fácil e rápida.

O primeiro passo é instalar o Stella no nosso projeto. Para esse post, usaremos apenas o Stella Core, que já traz as funcionalidades principais dessa API.

Para instalar o Stella temos duas opções:

Podemos importar a dependência dele, caso o projeto use [**maven**]:

java
Ou apenas [**fazer o download do caelum-stella-core**] e importar o jar para o projeto.

## Validando o CPF

Pronto, agora que acabamos de instalar só precisamos usar suas classes.

Bom, precisamos validar um CPF, certo? Então, primeiro vamos criar um método que nos devolve um `boolean`. Caso o CPF seja válido, nosso método irá retornar `true`, caso contrário, `false`. Vamos meter a mão na massa:

java

Agora, precisamos instanciar a classe do Stella que cuida da validação do CPF. A classe que faz isso é a `CPFValidator`. Ficando assim:

java

Boa, agora só precisamos usar o objeto criado e chamar seu método `assertValid()`, que recebe como parâmetro um CPF para ser validado:

java

Para conseguir o CPF que o método `valida()` requer, precisamos usar o `getPessoaCpf()` que nos devolve o CPF da pessoa que está se cadastrando. Com isso temos o seguinte código:

java

Boa, mas perceba que nosso método `valida()`está gerando um erro. No caso, ele está reclamando a falta de um retorno para esse método, pois declaramos que nosso método retorna um `boolean` e, por enquanto, não retornamos nada. E agora?

Poderíamos tentar retornar o método `assertValid()` mas olha o resultado:

imagem` que, por sua vez, vê se o CPF tem erros e no final adiciona todos os erros encontrados em uma lista e a retorna. Se a lista não estiver vazia, ou seja, conter algum erro, uma exceção é lançada.

Então caso tenha erro na lista, o método lança uma exceção. Logo, vamos envolver nosso código em um `try`/`catch`, se não tiver erro retornaremos `true`, caso tenha, `false`. Vamos lá:

java

Para testar, ao invés de mandar o CPF retornado do método `getCpfProduto` vamos criar uma variável do tipo `String` e colocar nós mesmos valores para o CPF, assim:

java

Esse CPF é válido, logo nossa implementação, em teoria, tem que nos retornar `true`. Além disso, vamos imprimir o `boolean` resultante do método para ver se nossa implementação está funcionando adequadamente:

java

Agora vamos testar:

![]

Muito bom, por enquanto tudo certo, mas e se o CPF fosse falso? Como seria? Vamos trocar alguns números e ver o que acontece:

![]

Eita! Além de retornar false, ele lançou uma [**Exception**]. Se traduzirmos, basicamente ela diz: "Dígitos verificados inválidos", mas o programa continuou funcionando perfeitamente.

O problema é que usar um `try`/`catch` nesse caso é algo inapropriado, devemos usar `try`/`catch` para tratar erros que não estamos esperando, para que, assim, possamos nos recuperar do erro obtido e, também, jogar regra de negócio dentro do bloco `catch`, não é nada legal.

O que seria o ideal? O ideal seria apenas retornarmos `true` caso não tenha erros e `false` caso tenha. Para isso vamos usar outro método do Stella.

Vocês se lembram do `invalidMessagesFor`? Que verifica se o CPF possui erros e devolve uma lista contendo esses erros, caso exista. Ele se adequa bem as nossas necessidades.

Se ele devolve uma lista vazia caso não tenha erros então vamos fazer uma condição que, caso a lista esteja vazia, retornará `true`,ou seja, cpf válido, caso não esteja, `false`, inválido.

Primeiro, vamos substituir todo o nosso `try`/`catch` por esse método e atribuí-lo a uma lista, assim:

java

Nos resta criar nossa condição que verifica se a lista possui erros:

java

Pronto, para dar um toque final, além de retornar `false`, vamos imprimir os erros que aquele CPF possui, desse jeito:

java

Ainda usando um CPF inválido vamos rodar esse código para ver o que acontece:

![]

Boa, não temos mais aquela exception lançada na nossa cara. Além disso, deixamos de utilizar o `try`/`catch`, muito bom! Para finalizar vamos só arrumar o código que estamos usando para migrar dos testes para os métodos reais que nosso programa utiliza:

java

Parabéns, conseguimos completar nossa missão! Validamos o CPF de forma fácil e rápida, agora quero ver os engraçadinhos tentarem comprar algum produto nosso passando um CPF falso.

## Conclusão

Atualmente existem milhares de `features` prontas que resolvem muitos problemas encontrados por nós, programadores. Imaginem só se tivéssemos que escrever esse código de validação na mão? Pensa no trabalho que ia dar.

Antes de começar a programar coisas desse tipo, ou seja, funcionalidades comuns, pesquise na internet se já existe alguma que se encaixe com a sua necessidade, com certeza você vai ser muito mais produtivo.

## Para saber mais

O Stella é muito maior do que apenas validação de CPF, com ele podemos gerar boletos customizados, calcular frete, formatar CPF e CNPJ e mais outras funcionalidades bem interessantes.

Na Alura temos o curso [**Java Brasil**]. Nele, outras funcionalidades muito úteis do Stella, como as citadas acima, são apresentadas. Para quem tem interesse em saber mais sobre essa linda API, vale a pena dar uma conferida.

E se você não programa em Java, existe, também, o Stella para C#. Na Alura, temos o curso [**C# Brasil**]. Neste curso você pode aprender diversas funcionalidades do Stella, usando a linguagem de programação C#.





imagem 

Estou trabalhando em um programa Python para conversão de valores monetários de Real para Dólar que usa uma API externa que encontrei na Internet.

Através de [**requisições GET**] com os parâmetros de valor, a API nos devolve o valor convertido. Se integrando ao Python, temos uma função `converte_real_para_dolar()` que toma como parâmetro o valor em Real que queremos converter:

py 

Num dia específico de julho, o resultado foi exatamente `5.19` - a função funciona bem! No geral, para fazer os relatórios que preciso tenho uma grande lista de valores em Real (`valores_real`) a serem convertidos para valores em Dólar. Como é bem direto, uma simples [**compreensão de lista**] resolve:

py 

Entretanto, para melhorar a organização dos meus dados, precisava dispensar os valores menores que 5 dólares.

A melhor forma de [**filtrar valores em uma lista**] é justamente através de uma compreensão de lista, como já vimos em outro post. Podemos simplesmente adicionar uma verificação à expressão:

py

O código estava correto. Porém, quando eu fui rodá-lo, acabei me deparando com um grande problema - ele estava demorando muito!

O resultado, que antes estava chegando super rápido, agora estava tomando bastante tempo para aparecer. O que essa simples verificação fez com todo nosso programa?

Fui olhar na documentação da API e de cara percebi o problema para evitar [**ataques de negação de serviço**], a API que eu estava utilizando restringia um mesmo cliente a uma única requisição igual a cada 30 segundos. Ou seja, conseguimos fazer várias requisições diferentes rapidamente, como antes, mas temos que esperar 30 segundos para repetir uma mesma.

Nessa nossa compreensão de lista, estamos fazendo a mesma requisição duas vezes - na verificação `if` e no item da lista, por isso estamos tendo esse problema. Como será que podemos resolver?

## Usando um `for` padrão

Intuitivamente, podemos pensar em uma solução usando um loop `for` padrão:

py 

Dessa forma, guardamos o resultado da função `converte_real_para_dolar()` em uma variável (`valor_em_dolar`) e podemos usar essa própria variável na verificação `if`, sem a necessidade de computar o valor novamente. Legal, funciona, mas fomos de uma linha para cinco…

Muitas vezes, é até vantajoso que se use mais linhas, para a **legibilidade e clareza do programa**. Entretanto, compreensões de lista já são claras o suficiente para evitarem tudo isso. Será que realmente não poderemos usá-las?

## _Assignment expressions_ e a PEP 572

O legal seria se pudéssemos reutilizar um valor dentro da própria compreensão de lista, sem precisar calculá-lo novamente, como se declarássemos uma variável dentro da própria expressão:

py 

Esse código, que não funciona em Python, resolveria nossos problemas de uma forma clara. A questão é que, **até agora**, o Python não suporta atribuições de valor a uma variável dentro de uma expressão (diferentemente de linguagens como JavaScript e PHP). Por enquanto, só podemos fazer isso através de _[statements]_ em linhas próprias.

Espera… **até agora**? Sim! Recentemente, tivemos a [PEP 572] aceita, uma PEP que propõe a adesão das chamadas _assignment expressions_ no Python - uma forma de definir variáveis no meio de expressões.

Na próxima versão do Python (3.8) já teremos essa funcionalidade incluída nativamente na linguagem. A sintaxe é parecida com a que exemplificamos, mas o `=` é substituído por um `:=`, para maior clareza:

py 

Logo isso funcionará sem problemas!

## Polêmicas da novidade

Como toda novidade, essa já está causando bastante polêmica no universo pythônico. Muitos usuários da linguagem alegam que essa nova implementação quebra o princípio de código pythônico, indo contra o próprio [**Zen do Python**] em si.

Por outro lado, muita gente também defendeu arduamente a mudança, por conta das facilidades e comodidades que ela trará. O embate é complicado e não acaba aqui.

Na verdade, [**toda a polêmica que veio junto com esse PEP foi um dos motivos**] para o criador da linguagem Python, Guido van Rossum, se dar umas férias de seu posto de [**BDFL**], o que deixou bastante gente chateada.

E aí, o que você acha dessa mudança? Se quiser aprender mais sobre Python, não deixe de dar uma olhada em [**nossos cursos na Alura**]!





imagem 

O desenvolvedor de um projeto de aplicativo recebeu a tarefa de adicionar as novas microinterações planejadas para o app da marca, porém a única orientação que recebeu foi:

> Adicionar botão intuitivo para verificar notificações.

Porém, quando o desenvolvedor ia começar a elaborar a nova feature algumas dúvidas surgiram:

- Esse botão abre uma nova página, um modal ou será um [menu flyout]?
    
- Haverá um aviso de novas notificações de tempos em tempos? Se sim, qual será esse intervalo?
    
- Como o usuário saberá que há novas notificações?
    
- O que acontece depois de acionar a microinteração?
    

Ao tentar desenvolver a ideia, mesmo com as dúvidas, chegou a este resultado:

imagem]?
    
- Qual a sequência de ações e o momento (timing) para acontecer?
    
- Existem informações nas quais se baseia? Localização, hora, clima, etc… E de onde esta informação será retirada?
    
- Quais as configurações e parâmetros do algoritmo da ação?
    
- Qual feedback será apresentado e quando?
    
- A microinteração se repete? Com que frequência?
    

Seguindo mais ou menos essa ideia conseguimos preparar regras mais bem elaboradas que facilitarão o trabalho do desenvolvedor ou mesmo a manutenção de cada um das microinterações já existentes.

Para desenvolver suas próprias regras, é preciso seguir algumas considerações importantes. Vamos ver um pouco mais sobre elas!

## Crie regras claras

Como já notamos, criar regras claras e de fácil compreensão é fundamental para auxiliar em todo o processo de desenvolvimento de uma microinteração. Então, como seria se alterássemos aquele exemplo inicial para algo como:

> Adicionar botão no menu principal para facilitar a visualização de notificações não lidas. Ao receber novas notificações, apresentar uma indicação sobre o botão com a quantidade de novas notificações não lidas. Após clicado, o botão abre um menu flyout com as novas informações e retira a indicação de notificações não lidas do botão. A cada nova atualização de notificações não lidas, o processo se repete. Após clicar em uma das notificações, o menu fecha e volta ao estado default, sem indicações de notificação.

Agora temos uma descrição muito mais detalhada do que precisamos, certo? Percebe que, logo no início da descrição, temos determinado o objetivo da microinteração?

> _"Adicionar botão no menu principal para facilitar a visualização de notificações não lidas."_

Antes de determinar as regras da interação, precisamos deixar claro o que pretendemos realizar com aquilo para depois desenvolver as demais especificações. Isto é, o objetivo será a base para desenvolver cada etapa da microinteração, por isso a importância de tê-lo claro.

Mas, será que a apresentação das regras dessa forma, em um texto corrido, é a melhor forma de apresentar nossas regras?

## Apresentando suas regras de microinterações

Que tal apresentar as orientações anteriores dessa forma:

![]

Note que temos uma visão completamente diferente da que tivemos com a apresentação em um texto corrido. Agora conseguimos visualizar com mais clareza o que pretendiam realizar e diminuímos ainda mais as chances de ambiguidade e erros.

O formato de texto corrido pode servir em algumas situações, mas **a representação visual como base para as orientações ajuda muito na compreensão da ideia**.

E, como representação visual, podemos usar tanto um fluxo de telas, diagramas, imagens ou qualquer outro apoio que seja relevante para tornar entendimento mais claro.

Para orientar o que adicionar nessas representações, podemos considerar os seguintes pontos:

- **O estado default:** Como será o estado inicial do objeto, como o usuário encontrará em sua primeira interação?
    
- **Estado ativo:** O que acontece com o objeto enquanto a microinteração ocorre?
    
- **Estado atualizado:** O que acontece quando o usuário termina a interação?
    

Representando em algo visual a microinteração criada no projeto, teríamos um resultado mais ou menos assim:

![]

Veja que agora deixamos nossa representação mais linear e fácil de entender!

Tenha em mente que a ideia é definir as regras de forma a ajudar tanto o desenvolvedor a compreender bem a ideia antes de começar a executá-la, quanto a própria equipe durante o planejamento das regras.

## Analisar e reajustar

Existem alguns tópicos muito relevantes a refletir enquanto desenvolvemos as regras, para evitar que hajam lacunas que prejudiquem a experiência do usuário.

Um bom exemplo seria, ao terminar de desenvolver as regras, fazermos uma primeira observação do geral elaborado e, a partir daí, começar a pensar os possíveis erros e falhas no qual o usuário pode cair.

Essa é uma boa prática para **prevenção de erros**. Nesse momento sentimos o quanto uma boa apresentação das regras da microinteração faz diferença! Quer dizer, tendo uma definição clara é muito mais fácil de fazer análises críticas.

É importante sempre repassar as regras e realizar testes para analisar se o que definimos faz sentido para o usuário.

## Definindo regras para microinterações

Assim como afirmou Dan Saffer em seu livro [Microinterações: Desenhando com detalhes]:

> "As regras deveriam gentilmente guiar os usuários através da ‘interação’ com a microinteração".

Ou seja, devemos ter um cuidado extra ao desenvolver as orientações para nossas microinterações para que a experiência do usuário seja o mais natural e intuitiva possível.

O mais importante, antes de mais nada, é definir o objetivo da microinteração e, a partir disso, analisar todo o conteúdo e informações que poderão ser relevantes para o seu desenvolvimento.




Quando estamos programando é bem comum termos listas de dados, listas de tarefas, de produtos, de clientes... No dia a dia nós fazemos muitas operações que envolvem listas.

Em uma parte de um programa que estou trabalhando, preciso pegar o nome e o sobrenome de alguns alunos cadastrados no banco de dados. Para isso, existe uma função que nos retorna o nome e o sobrenome de um aluno dado um id:

python 

Eu quero mostrar para o usuário uma mensagem de bem-vindo quando ele acessar o sistema:

python 

Legal! Conseguimos imprimir nossa mensagem! Mas o que significa `aluno[0]`? O login? O nome do usuário? O sobrenome?

Veja que o nosso código não tem muita semântica, isto é, quando alguém for ler nosso código, ou nós mesmos no futuro, não saberemos o que `aluno[0]` significa só de olhar o código. Claro, nós podemos atribuir `aluno[0]` a uma variável:

python 

Mas, mesmo assim, a legibilidade do código fica um pouco prejudicada. O que tem dentro da lista `aluno`? Um nome e sobrenome, uma lista de nome de vários alunos e estamos pegando só o primeiro’?

Veja que mesmo nesse caso, nós precisamos parar e interpretar o código, já que a leitura não está tão fluida. Hoje sabemos que a função `busca_aluno` nos retorna o nome e o sobrenome, mas e amanhã? Talvez, quando nós, ou outra pessoa, no futuro olhar a variável `aluno` não vai saber o que ela significa de fato.

Como nós podemos resolver isso já que nossa função `busca_aluno` nos retorna uma lista com o nome e sobrenome do aluno?

## Desembrulhando nossa lista

Nossa função `busca_aluno` já nos retorna o nome e o sobrenome de um aluno. Então se fizermos algo assim será que funciona?

python 

Em muitas linguagens de programação, esse código não funciona, mas em Python sim! Com esse código, estamos querendo dizer para o Python pegar o primeiro valor da lista e colocar na nossa variável `nome` e o segundo valor na variável `sobrenome`:

python 

Nossa função retorna uma lista com dois elementos, nome e sobrenome, mas e se tivéssemos uma lista com mais valores? Por exemplo, se tivéssemos uma lista com dez números e queremos pegar os dois primeiros, precisaríamos declarar dez variáveis? Uma para cada elemento da lista?

Bem, nós só queremos os dois primeiros números então talvez nós possamos declarar só duas variáveis.

python 

E quando nós executarmos nosso código, teremos um erro:

imagem segundo valor da lista, isto é, ignorar o sobrenome?

python 

Com o operador `_` estamos falando para o Python ignorar o segundo valor da lista. Com isso temos apenas a variável nome. Esse operador pode ser usado em conjunto com a starred expression:

python 

E aí, o que achou dessa forma de desempacotar dados com o Python?

O Python se tornou uma linguagem muito utilizada pelos desenvolvedores. Por ter uma curva de aprendizado baixa e uma sintaxe amigável, ela ganhou muito espaço tanto com as pessoas que estão começando a programar quanto com os programadores mais experientes.

Aqui na Alura, temos uma [**vários cursos sobre Python**], nela você aprenderá a sintaxe da linguagem, como criar funções e classes, conceitos como encapsulamento, até padrões de projeto, e frameworks web, como Flask e Django.





imagem 

Ao fazer uns testes de layout, a equipe de design avaliou esta primeira versão:

imagem.

Permanecemos um bom tempo utilizando essa mesma tendência em quase tudo, fugindo à regra vez ou outra para incrementar um pouco mais aqui ou ali, e deixar as coisas um pouco mais interessantes.

Agora, com o surgimento do Material Design, continuamos na linhagem do flat, reaproveitando as qualidades dessa tendência ainda bastante forte, mas com o incremento de alguns fatores.

Para termos uma visão melhor, vamos dar uma olhada neste comparativo prático feito pela [Cleveroad]:

imagem

Leve (performance),Animações elegantes (motion design)

Responsivo, [**Guidelines**] muito bem definidos \[/table\]

Estes são os pontos básicos. No Material Design temos algumas características do Flat, mas agora com novidades que buscam facilitar a interação do usuário.

Com a noção de **profundidade** conseguimos deixar mais clara a hierarquia de camadas nos elementos da página, facilitando a compreensão do usuário.

Já as **animações**, assim como a própria Google define nos guidelines, vieram para incrementar a experiência do usuário com melhor noção das relações espaciais, funcionalidades e intenções, baseado em animações fluidas e elegantes. Veja o exemplo de Jovie Brett:

imagem indicando a profundidade dos elementos;
    
- A característica do menu ativado, que deixa de ser um hover com o background inteiro verde para apenas uma fita indicativa abaixo, típico do Material Design;
    
- Os blocos de cursos com o botão "Saiba mais" dentro dos padrões apresentados no guideline.
    
Além disso, podemos inserir animações de interação para enriquecer ainda mais essa experiência, tornando-a mais elegante e intuitiva.

## Então o Material Design é a solução?

Não podemos afirmar que as tendências serão sempre a melhor solução, justamente porque são uma tendência.

Mas, além disso, temos alguns pontos a considerar, em contrapartida, antes de implementar a mudança:

- As animações adicionadas podem acabar [consumindo um pouco mais da bateria] dos dispositivos móveis.
    
- Não precisamos seguir os conceitos do Material Design _à risca_, mas precisamos ter cuidado ao aplicar novas características ao design, para que, nem a linguagem do Material Design, nem a linguagem do próprio projeto se perca nesse processo.
    
- Tanto o Material Design quanto o Flat Design são formas populares de criar um design de layout, **mas será que essa é a melhor abordagem para o seu projeto**?
    

É importante que todos tenham clara a ideia de que o Material Design pode **nem sempre ser bem aplicado** dentro do conceito de alguns projetos. Vejamos um exemplo:

imagem

E aí? O que você achou? Curtiu a ideia do Material Design da Google? Comente ali em baixo e compartilhe sua opinião com a gente!

Para validar a utilização do Material Design, nada melhor do que um briefing bem elaborado do projeto, certo? Então dá uma olhada nesse curso de [Identidade visual] da Alura para aprender algumas boas técnicas! ;)





imagem 

Agora que você sabe as principais partes para produzir um bom marketing de conteúdo, você começou a desenvolver diversos textos e publicações nas redes sociais com informações de qualidade e relevantes.

Porém, ainda não está vendendo os produtos da empresa na qual trabalha da maneira que queria.

Como, então, alinhar o marketing de conteúdo com a venda, efetivamente?

Uma das pessoas da equipe de marketing da editora na qual trabalhamos teve a ideia de, ao fim de um post sobre a adaptação cinematográfica que será feita baseada em um livro que foi publicado pela empresa, colocar uma frase como:

> "Gostaria de saber essa história antes do lançamento do filme? Compre o livro aqui" e colocar o link do produto na frase.

Então, as pessoas que se interessarem pela história e pela curiosidade podem comprar o livro e, assim, as vendas dele aumentarão.

Sem querer, essa pessoa utilizou uma das maiores técnicas do marketing de conteúdo que é o [**Call-to-Action (CTA)**], na qual, depois de passar o conteúdo ou as principais informações a respeito, você chama o cliente para realizar uma ação, como saber mais informações, se cadastrar ou, como nesse caso, comprar.

## Tipos de Call-to-Action

Existem diversos tipos de Call-to-Action que podem ser utilizados nos posts do blog da empresa, em posts de redes sociais, entre outros. Os tipos e modos em que são usados mudam de acordo com o conteúdo passado e o intuito daquelas informações.

O principal, e mais conhecido, é o de venda, no qual coloca-se um link direto para a página de compra do produto relacionado ao assunto.

Como o que a integrante da nossa equipe fez de, ao fim de um post no blog, já colocou o link de venda do livro citado no texto para que a pessoa que ler o conteúdo já possa comprá-lo, caso tenha se interessado.

Outro tipo é o de receber um contato da pessoa. Isso pode acontecer de diversas maneiras, como fornecer um conteúdo mais completo, exclusivo e gratuito, em troca de uma forma de contato, como o e-mail.

Com esse contato, a empresa pode passar a se comunicar mais diretamente com ela, oferecendo ofertas e conteúdos que interessam aquela pessoa, já que sabem o que a interessa.

No fim de um conteúdo, também pode haver um CTA para que a pessoa se inscreva na newsletter da empresa e, assim, sempre receba conteúdos como aquele.

Um CTA pode ser feito para a questão de compartilhar o conteúdo, nas redes sociais ou até mesmo por mensagens e e-mail. Assim, a própria pessoa faz a divulgação de informações que ela gostou.

## Como colocar o CTA no seu post

Normalmente, o CTA vêm depois de todo o conteúdo. Após a pessoa ler todas as informações a respeito de determinado assunto, cria-se um parágrafo adicional no qual você pergunta se a pessoa quer realizar algo, como se fosse uma dica.

No caso do CTA que colocamos da venda do livro acrescentamos ao fim do texto mais uma parte que dizia:

> "Que tal conhecer completamente a história lendo o livro? Você pode achá-lo aqui"

A palavra aqui fornecia um link que direcionava a pessoa até a página em que o livro era vendido. A oferta veio por meio de uma pergunta, como uma sugestão e/ou dica para a pessoa.

A mesma abordagem pode ser usada para adicionar os outros tipos de CTA. Como uma pergunta que se a pessoa gostou do conteúdo, se ela gostaria de recebê-lo diretamente em seu e-mail assinando a newsletter.

Ou se gostaria de se aprofundar mais ainda no assunto e fazer o download de um e-book exclusivo desenvolvido pela empresa. Ou, até mesmo, seguir a empresa nas redes sociais para sempre saber as novidades.

O CTA, inclusive, auxilia no SEO do produto ou link que será linkado no post do blog. Alguns buscadores, como o Google, acreditam que quanto mais pessoas, relevantes, citam aquele link, melhor ele é. Então, melhor será sua posição nos resultados acerca daquele assunto.

Por exemplo, quanto mais textos tiverem o link de um livro da editora, melhor o link para a venda daquele livro ficará no ranking de resultados de pesquisa.

Caso queira saber mais sobre criação de posts para o blog da sua empresa, faça o nosso curso Blog do seu Negócio, ele é dividido em duas partes: a [primeira] que fala sobre geração de lead e entrega de valor e a [segunda] que é sobre métricas e SEO.

Caso também tenha interesse, pode fazer nosso [**curso de Marketing de Conteúdo**] ou comprar o [**livro sobre Marketing de Conteúdo, da Casa do Código**].




Você está de olho nas atualizações do Google, não é mesmo? A sua maior vontade é conseguir entender quais são os desejos da empresa para poder adequar suas páginas.

Ao final do artigo, você entenderá quais são os principais desejos da empresa para que suas produções possam se adaptar a ela.

Boa leitura!

## 1\. Panda

O [Google Panda] foi criado pela empresa para melhorar a avaliação sobre a relevância e qualidade das páginas na internet.

### Panda 1.0

Essa atualização visava encontrar sites que contratavam redatores que criavam conteúdos fracos.

O único objetivo existente era posicionar o site entre os dez primeiros. A ação, que foi pensada primeiramente para os EUA, afetou cerca de 12% dos resultados de busca.

O problema não estava na contratação de redatores, mas não na qualidade do conteúdo entregue.

### Panda 3.0

Essa atualização, utilizada a partir de outubro de 2011, [ajudou grandes sites, como a FoxNews], a melhorar seu posicionamento nas buscas.

Nessa etapa, algumas recomendações feitas para auxiliar [**os profissionais**] foram:

- dar força aos conteúdos antigos e permanecer com tudo quanto é valioso;
- adicionar sistematicamente novo conteúdo. Prezar principalmente pela originalidade e evitar duplicar material já existente;
- utilizar dados com fontes confiáveis;
- prezar pela escrita fluída e gramaticalmente correta.

### Panda 4.2

Após o lançamento dessa atualização, a empresa confirmou que 2 a 3% das buscas realizadas em inglês foram afetadas.

De acordo com o Google, as mudanças foram pequenas, porém as principais ressaltaram algumas modificações importantes. Podemos citar a necessidade de atualização frequente do blog.

O mais importante é que aqueles que sofreram impacto com a atualização puderam recuperar o tempo perdido e voltar a se posicionar como antes.

## 2\. Payday Loan

Lançada em 2013, [a versão Payday Loan] teria inicialmente um impacto próximo a 0,3% nas buscas efetuadas nos EUA.

O principal objetivo era deixar as buscas mais limpas em mercados que tradicionalmente eram conhecidos pelo uso de spam, como pornografia e empréstimo bancário.

Assim, os principais impactados com a Payday Loan foram os sites que estavam ranqueados em buscas com alto volume, mas possuíam conteúdo com spam e recebiam links de práticas não naturais.

A principal ação para [**profissionais**] de SEO e blogueiros era (e ainda é) conseguir links de forma natural. Além disso, preparar conteúdo para auxiliar, de fato, seus usuários.

## 3\. RankBrain

Podemos dizer que o [RankBrain] é uma experiência de inteligência artificial, para ajudar tanto o processamento de buscas quanto o ranqueamento das páginas.

O grande diferencial dele é a possibilidade de aprender sobre o comportamento de páginas e diferenciar as formas com que lida com os resultados de forma dinâmica.

Isso significa que o RankBrain é capaz de identificar sinônimos, plurais e coletivos dos termos utilizados pelos usuários na ferramenta de busca.

Além disso, ele consegue entender melhor o funcionamento de buscas com mais de uma palavra-chave (palavra-chave de cauda longa).

Dessa maneira, podemos dizer que com esse algoritmo o Google consegue interpretar melhor os termos buscados.

Também entende de forma mais eficaz qual foi a intenção do internauta para fazer a busca. Assim, os resultados podem ser refinados para o usuário.

Diferentemente do que se pode imaginar, o RankBrain não substitui os sistemas anteriores, mas auxilia na interpretação das intenções de busca do usuário, obtendo a eficiência.

Para os blogueiros ou aqueles que trabalham com SEO, um ponto positivo é a possibilidade de utilizar variações das palavras-chave sem ser penalizado na classificação.

## 4\. Quality Update

O [Quality Uptade] modifica a forma como a empresa identifica quais são as páginas com maior qualidade quando comparadas a concorrentes.

A principal mudança está nos sinais que identificam qualidade em uma página. [De acordo com testes], a atualização proporcionou maior credibilidade às páginas e aos blogs informativos, tutoriais e páginas de passo a passo.

Destaca-se que apenas a forma como o Quality Uptade entende que o conteúdo de qualidade sofreu modificações.

Assim, todos os produtores ainda devem focar na criação de conteúdo útil para o público-alvo.

## 5\. Mobile Update (Mobilegeddon)

Diferentemente das outras atualizações que eram mais pontuais, a [**Mobile Update**] proporcionou mudanças na forma de ranquear os sites.

A principal diferença estava na preferência do algoritmo por páginas amigáveis a dispositivos móveis.

Assim, sites que proporcionam uma experiência agradável para seus usuários (como utilizar a responsividade) teriam maiores benefícios na classificação.

Embora a expectativa geral dos profissionais e donos de blogs fosse de uma grande reviravolta, os resultados gerados não trouxeram o impacto esperado.

A principal preocupação do Google com o Mobile Update está em trazer uma melhor experiência para os usuários de dispositivos móveis. Dessa maneira, os internautas não se frustram com os resultados das buscas efetuadas.

O maior problema das páginas que não estão otimizadas para essas tecnologias são para leituras e navegação: os visitantes não conseguem acessar a informação desejada com facilidade.

Melhorar a forma com que esse usuário navega em seu site é muito mais do que utilizar um tema responsivo.

Pense em criar um site considerando essas plataformas, ou aprimore seus conteúdos, chamadas, slides, etc.

Se você tem dúvidas se sua página está adequada, o Google possui um [**teste para ajudá-lo a encontrar pontos negativos**] e aponta eventuais mudanças e ajustes.

## Para não ter medo de nenhuma atualização

Provavelmente você tem medo de que alguma atualização mine todo trabalho que você teve até aqui.

Para a sua alegria, temos boas notícias! Se você deseja melhorar a forma por meio da qual seu site é compreendido pelos buscadores, pense nas ambições e desejos de quem está fazendo as pesquisas em que você deseja aparecer.

As principais modificações nos algoritmos visam melhorar a experiência dos usuários. E o objetivo é bem simples: levá-lo ao encontro do que ele busca.

Dessa maneira, as suas principais ações devem ser melhorar seu conteúdo e a usabilidade do site como um todo.

Caso você seguir essas instruções, fique tranquilo! As atualizações do Google serão tomadas para que os sites como o seu sejam mais bem classificados e recebam maior tráfego.

Por outro lado, se você sempre procura alguma forma de obter visitas sem melhorar o que é entregue para os visitantes, a qualquer momento, uma nova atualização pode diminuir drasticamente suas visitas.





Certamente você já sabe que trabalhar com [**diagramação usando o Adobe InDesign**] é uma das melhores alternativas para a criação de livros, revistas, folhetos, e-books, aplicativos e outros tipos de documentos com altíssima qualidade. 

No post de hoje, apresentaremos 7 hacks que podem ser aplicados no InDesign para aperfeiçoar os seus conhecimentos práticos e realizar projetos ainda melhores. Vamos começar?

## 1\. Criando o seu próprio ambiente de trabalho

A interface padrão do Adobe InDesign, assim como em outros produtos da linha, pode ser customizada definitivamente pelo usuário.

Todos os elementos — painel, barra de controle, caixa de ferramentas, etc. — são distribuídos no ambiente de trabalho de forma a torná-lo compatível com sua rotina de trabalho.

### Como fazer?

O procedimento é simples: basta modificar o ambiente conforme a sua preferência. Em seguida, vá em Window > Workspace > New Workspace; crie um nome para o seu novo ambiente e dê OK. Pronto!

## 2\. Aplicando a cor preta corretamente

Esse hack pode parecer um pouco confuso, porém, temos certeza que até quem é menos detalhista ou nem mesmo trabalha com imagens já notou o impacto que a escolha certa do preto causa.

Imaginemos um cartaz com uma grande área de preto e que está exposto ao ar livre. O seu fundo já está desvanecido, com uma cor mais próxima do cinza (preto fosco), indicando que algo no pôster está inadequado.

Ao ler o conteúdo do cartaz, percebemos que há um outro problema: os textos adquiriram uma mistura de cores além do próprio preto. Assim como o problema no background, isso também se deve à má escolha do preto.

### Como resolver?

O preto que preenche os fundos ou a própria imagem deve ser aplicado em sua configuração composta (preto chapado), usando o sistema de cores subtrativas (CMYK – Cyan, Magenta, Yellow & Black (Key)). Um exemplo de como formar a cor é usando Cyano (30%) e Black (100%).

No caso do texto, é imprescindível usar o preto puro (K 100%) para evitar que o problema aconteça e assim preservar a integridade das cores impressas.

## 3\. Usando os recursos Find / Change

Trabalhar com uma significativa quantidade de texto é algo comum para muitos profissionais que usam o InDesign. Editar manualmente um livro com centenas de páginas, incluindo notas de rodapé, glossários e tudo mais, é um compromisso bastante ingrato, porém, com uso do **Find Change** ele é simplificado.

### Como usar?

Pressione o atalho “Ctrl + F” (Edit > Find) e digite o termo que pretende editar. Em seguida, digite o trecho a modificar ou dê o famoso “Ctrl + C” seguido do “Ctrl + V” e, logo abaixo, faça a alteração — ela se aplicará a todas as repetições do mesmo termo.

Para atualizar nomes, termos e palavras em decorrência de erros ortográficos ou adaptação para uma nova norma vigente, o Find Change presta um auxílio e tanto!

## 4\. Visualizando as impressões

O InDesign não tem por padrão a funcionalidade “disponibilizar a visualização da impressão” (preview). Ter uma perspectiva de como o layout ficará após o conteúdo ser impresso é fundamental para evitar falhas e desperdício de tempo / material.

### O que devo fazer?

Acesse o menu View > Extras > Hide Frame Edges ou digite a tecla “W”. Simples!

## 5\. Criando camadas (layers)

Imaginemos que você ficou responsável pela elaboração de folhetos promocionais que serão distribuídos em três diferentes regiões do país. Em cada região o folheto deve anunciar diferentes conteúdos — preços e condições de pagamento, por exemplo.

Como o layout será o mesmo, em vez de tratar cada imagem isoladamente, você poderá usar camadas para economizar tempo construindo em um só arquivo.

Para trabalhar com camadas, acesse o menu “Window” e selecione “Layers” ou simplesmente use o F7.

## 6\. Conhecendo o Story Editor

Editar parágrafos quando o conteúdo de várias páginas já se encontra formatado pode ser inconveniente, principalmente quando se precisa mexer em um bloco de texto que está posicionado verticalmente ou alterar a cor da fonte não é possível pré visualizar a alteração da cor quando o procedimento é feito convencionalmente.

**O Story Editor é um excelente utilitário do InDesign para realizar edições desse tipo, pois ele permite que o texto seja aberto em uma nova caixa e editado com segurança.** Além disso, toda alteração feita é aplicada automaticamente e pode ser rapidamente desfeita.

Dentre outras funcionalidades, o Story Editor facilita a inserção de comentários, hyperlinks, notas, variáveis, referências e muito mais.

Para abrir o editor, basta teclar Ctrl + Y.

## 7\. Trabalhando com layouts dinâmicos

Quando se trabalha com textos e imagens no InDesign, é natural que o usuário queira que as fotos / vetores acompanhem o texto conforme o mesmo seja ampliado ou reduzido. Com isso é gerada uma frustração, pois, por padrão, as coisas não funcionam assim na prática.

Usar layouts dinâmicos é uma das InDesign hacks mais úteis para esses casos e pode ser a solução para a sua dor de cabeça. Por meio de um layout dinâmico, todas as imagens “descem” na medida que cresce o número de linhas do texto e “sobem” quando esse número decresce.

### Como fazer?

Vamos supor que as imagens, localizadas abaixo de um bloco de texto tenham que acompanhar o parágrafo.

O primeiro passo será acessar o menu “Object” e selecionar a opção “Text Frame Options” (ou usar o atalho Ctrl + 3). Clique na aba “Auto-Size” e você identificará uma barra indicando que a função está desabilitada (Off). **Nessa mesma barra, selecione a opção “Height Only”.**

Observação: existe um pequeno quadro desenhado logo abaixo da barra de opções, contendo nove ângulos e posicionamentos. Selecione o topo no caso, os pontos superiores no centro do quadro. Feito isso, clique em “Ok”.

Em seguida, use a ferramenta de seleção e selecione as imagens, localize o quadrado preenchido em azul e arraste-o para a região do texto que será o “ponto de partida” para a nova regra de posicionamento.

Clique com o botão direito do mouse sobre o conteúdo que selecionou, vá em “Anchored Objects” e a seguir em “Options”. Na tela que acabou de abrir, localize o recurso “Reference Point”, em “Anchored Object”, e selecione o ponto no canto superior esquerdo.

Para finalizar, localize na mesma tela o “Anchored Point” > “X Relative To” > “X Offset” e reduza o valor para “0”. Em “Y Relative To”, selecione (na barra de menu) a opção “Text Frame” e, na caixa “Y Offset”, reduza o valor para “3p”. Marque a caixa “Prevent Manual Positioning” e dê “Ok”. Pronto!

## Pronto para usar os InDesign hacks que aprendeu?

Os InDesign hacks facilitarão a sua rotina profissional em diversas ocasiões, portanto, aproveite o momento para começar a praticar e explorar a fundo suas funcionalidades. Dessa forma você [**reforçará o aprendizado**] e adquirirá uma experiência mais rica.

Curtiu as dicas? Mostre o que você aprendeu para seus amigos ou ao seu chefe (por que não?), compartilhe este conteúdo nas redes sociais!




Começar uma carreira não é nada fácil, especialmente no mundo dos negócios. Todos os dias há empresas dando o seu pontapé inicial. Então, para conseguir se [**destacar em meio a tanta competitividade**], além dos recursos financeiros, muitos fatores são indispensáveis.

As startups não fogem a essa regra. É preciso apresentar boas ideias para conquistar investidores e trabalhar muito para tirá-las do papel, transformando-as em um produto que tenha valor no mercado.

Com a expansão dessas empresas de tecnologia nas últimas décadas e a necessidade de impulsioná-las, surgiu um modelo de negócios inovador, capaz de acelerar os resultados e,ao mesmo tempo, produzir com baixo custo: **o lean startup**.

Contudo, apesar de ser simplificada, visando associar a eficiência na produção com a escassez de recursos, essa metodologia também conhecida como startup enxuta requer bastante atenção para que não seja aplicada equivocadamente.

Por isso, neste post mostraremos como, mesmo com um método poderoso, ainda existe o risco de fracassar. Continue lendo e confira os 5 maiores erros que podem ser cometidos ao se aplicar o lean startup e saiba como evitá-los!

## 1\. Focar exclusivamente no plano de negócios

O plano de negócios é uma peça fundamental à concepção e desenvolvimento de uma empresa. Contudo, ele engloba situações abstratas. Não há como prever se todos aqueles fatores funcionarão da maneira esperada quando colocados em prática.

Segundo o renomado empreendedor [**Steve Blank**], nenhum plano de negócios resiste à primeira interação com os clientes. Isso talvez explique o porquê de o método lean startup vir sendo tão difundido no meio empresarial.

Por se tratar de um modelo democrático e dinâmico, as falhas são corrigidas com base em informações concretas do público-alvo. **O propósito é simples: crescer com o seu produto, à medida que as necessidades e dificuldades surgem.**

## 2\. Desenvolver um produto mínimo viável de baixa qualidade

Um aspecto que influencia diretamente no sucesso de qualquer produto é o feedback obtido dos clientes. Afinal, qual opinião é mais importante senão a dos usuários, das pessoas que realmente exploram de vários ângulos daquilo que estão consumindo?

No processo de criação, algumas hipóteses são levantadas para que se possa chegar à conclusão de que o produto está apto a cumprir com o prometido. A intenção do lean startup se baseia no conceito de que a maneira mais rápida e eficiente de encontrar essas respostas é por meio do produto mínimo viável [**MVP**].

Entretanto, um erro fatal que o empreendedor pode cometer é acreditar que obterá as respostas que precisa com um protótipo mal feito, que não expressa a real necessidade daquele produto. Nesses casos, o intuito é economizar ao extrair o máximo dos recursos.

## 3\. Fazer uma leitura equivocada sobre os indicadores do MVP

Quais cifras preciso alcançar para saber que o meu produto está comprovadamente aceito?

Trata-se de um assunto para o qual não há uma resposta unânime. O que, para uns, pode ser muito, talvez represente algo insignificante para outros. Tudo dependerá de quais metas foram estabelecidas para a empresa, e quais objetivos ela pretende alcançar.

Por esse motivo, ao lançar o projeto de teste, o empreendedor deve analisar os seus resultados de forma cautelosa, tendo em vista que eles é que demonstrarão se você está percorrendo o caminho certo, ou não. Em outras palavras, eles funcionarão como um termômetro do seu produto no mercado.

## 4\. Desistir de forma precipitada não se enquadra ao lean startup

No momento em que as pessoas decidem empreender e começar um negócio, além de buscarem por uma melhor [**capacitação profissional**], é natural que elas se inspirem em outra trajetória de sucesso e queiram trazer alguns conceitos para o seu caso concreto.

Só que não existe uma única fórmula a ser seguida por todas as empresas. Até porque, essa é uma atividade que envolve riscos e, mesmo com uma estrutura bem planejada, sempre haverá dificuldades a serem superadas.

Logo, a perseverança é uma qualidade essencial para quem deseja ser bem-sucedido.

Muitos têm a ideia equivocada de que, frente a primeira dificuldade, seja melhor abandonar o projeto e partir para uma nova direção, a fim de evitar mais prejuízos. Mas será que as grandes organizações ocupariam o lugar em que se encontram caso tivessem desistido diante de um obstáculo?

De fato, aprender com os próprios erros faz parte do crescimento dos empresários. E, nesse sentido, a utilização correta do lean startup lhe ajudará a encontrar o melhor caminho. Com um MVP bem planejado fica muito mais fácil mapear suas hipóteses e identificar eventuais falhas.

Portanto, em vez de abandonar o seu projeto porque algo deu errado, dedique-se ao seu processo de elaboração, cumprindo todas as etapas do lean. Assim, suas chances de conquistar as metas e, consequentemente, diminuir os riscos de prejuízo serão bem maiores.

## 5\. Deixar de verificar continuamente a satisfação dos clientes

Por fim, outro descuido fatal na [**carreira de empreendedor**] é pensar que a fase de desenvolvimento do seu produto com o cliente se restringe tão somente ao início do negócio.

Vivemos em uma sociedade que está em constante transformação, e nenhuma criação é perfeita o suficiente que não precise ser atualizada. A exemplo disso, temos a história da startup [**Iridium**], criada pela empresa Motorola e alguns sócios, em 1991.

Baseada em um plano de negócios revolucionário, a proposta da empresa era desenvolver um sistema de telefonia que tivesse cobertura até nos lugares mais remotos do planeta terra.

O que aconteceu em seguida foi um investimento pesado em equipamentos capazes de alimentar essa ideia e a falência da empresa, poucos meses após a realização da primeira ligação. De fato, o grande erro cometido foi subestimar a interação com os verdadeiros interessados.

Àquela época, a comunicação entre as pessoas em pequenas distâncias já era complicada. O serviço, por sua vez, era caro e nem todos poderiam ter acesso a ele. Logo, será que eles teriam necessidade de fazer uma ligação para alguém que estivesse na selva, por exemplo? Os resultados falam por si só.

Bom, com tudo isso, podemos concluir que o crescimento de uma [**empresa de tecnologia**] depende muito mais das experiências práticas vividas no dia a dia do que da proposição de grandes ideias.

Nesse sentido, o empreendedor que conseguir captar a verdadeira essência do lean startup e empregá-lo corretamente terá, sem dúvida, as maiores chances de sucesso.

Enfim, gostou do nosso post? Aprendeu um pouco sobre quais erros devemos evitar ao aplicar o método de lean startup? Então, aproveite agora para compartilhar essas informações nas suas redes sociais!





Na Alura, eu preciso do nome e da data de lançamento de um curso:

java

Porém, quando eu recebo a informação `dataDeLancamento` ela é passada em **`String`**:

java 

## Especificando o formatador

Para converter essa `dataRecebida` para a classe **`Date`** precisamos [definir o formato esperado utilizando a classe `SimpleDateFormat`]:

java 

Essa definição está especificando que esperamos uma data que contenha dia/mês/ano.

## Usando o formatador para converter para Date

Mas e para **converter de `String` para `Date`**? Utilizaremos o método **`parse()`** do objeto `formato`:

java 

Agora basta adicionar a data formatada para o objeto da classe `Curso`:

java

E se eu imprimir essa data? Qual resultado aparece?

java 

Resultado:

java 

## Imprimindo a data no formato desejado

Calma aí, não era isso que eu queria… Mesmo conseguindo converter uma `String` com um formato específico para `Date` o resultado esperado será de um tipo `Date`. Para que seja impresso o objeto data no formato dd/MM/yyyy usaremos o método `format()` do objeto `formato`!

java 

Resultado:

java 

## Convertendo com a API Calendar

Ótimo! Conseguimos o resultado esperado. Para manter a compatibilidade com bibliotecas antigas, e converter para `Calendar,` é fácil:

java

Resultado:

java 

Mesmo sendo mais antigo, é importante compreender a existência da compatibilidade.

## Conheça as APIs do Java mais recentes para datas

A partir do **Java 8**, foi introduzida a classe **`LocalDate`** do pacote **"java.time"**, o qual possui uma melhor abstração no tratamento de datas. Mas como posso converter *String* para `LocalDate`?

java

Resultado:

java 

Ops! Vamos lembrar que a impressão ainda é a padrão da classe, ou seja, da `LocalDate`. Da mesma forma que fizemos com a classe `Date`, temos que utilizar o objeto responsável pelo formato para imprimir a data conforme o esperado:

java 

Resultado:

java 

Como vimos, para lidar com a tarefa de conversão de datas, precisamos utilizar uma classe responsável pelo formato que desejamos. 

Pensando nisso tudo, o criador da Caelum, Paulo Silveira, resolveu criar um [**curso de java 8**] e suas bibliotecas. Além disso, esse é um assunto amplamente coberto nos cursos [presenciais de Java da Caelum] e na [**formação Java**] aqui na Alura.




Você é um dos [**29 milhões de brasileiros que estão no LinkedIn**]? Se a sua resposta é positiva, excelente! Temos boas dicas para você. Caso a sua resposta seja negativa, acompanhe o conteúdo de hoje com o dobro de atenção.

Não é exagero: ter um perfil de alta qualidade no LinkedIn pode ser decisivo para conseguir um emprego. Hoje em dia, muitas empresas nem olham mais para o currículo tradicional, indo direto para essa rede social.

Sendo assim, é melhor criar um perfil turbinado, não é? Para ajudá-lo, preparamos algumas dicas. Confira!

## Tenha uma boa foto de perfil no LinkedIn

Talvez você tenha o costume de tirar selfies e divulgar pelo mundo digital. Isso é bom, porque dá a você uma certa intimidade com a câmera. Mas, para o LinkedIn, a história é um pouco diferente.

A ideia é que, para uma rede social de trabalho, sua foto demonstre profissionalismo. Para isso, evite retratos com elementos como perucas, óculos engraçados ou caretas. Busque um fundo mais neutro e mostre mais o rosto — não é necessária uma foto de corpo.

Não se esqueça de um detalhe muito importante: um belo sorriso, que seja sincero e cativante. Nada de sorrisos amarelos e forçados, certo?

## Decida qual é o seu título profissional

Logo abaixo da foto, estará o seu título profissional. O que isso significa? Que ali, no topo do perfil, estará descrito o seu cargo atual ou, então, a posição que deseja ocupar.

Para isso, o importante é ser direto e usar palavras-chave relacionadas ao cargo. Essa informação será fundamental para que possíveis contratantes o identifiquem como a pessoa que estão procurando.

A propósito, para quem está trabalhando, é válido colocar no título o nome da empresa. Portanto, a estrutura básica é a seguinte: cargo mais empresa.

Já para quem não está com um emprego no momento, a dica é evitar termos como “desempregado” ou “em busca de uma oportunidade”, pois são verdadeiros repelentes de contatos. Opte por incluir seu último cargo ou a área que [**estuda na faculdade**].

## Faça um resumo primoroso

Na área de resumo você pode vender o seu peixe. Portanto, use esse espaço com sabedoria e dedicação. Mas, o que escrever?

Trata-se de uma seção para se apresentar e contar um pouco sobre interesses, conhecimentos, áreas de atuação e trabalhos. Você tem até 2 mil caracteres para isso — ou seja, espaço suficiente.

Vale lembrar, porém, que autoelogios e excesso de adjetivos não pegam nada bem. Busque originalidade e criatividade, mas não perca a humildade de vista.

Ainda temos mais uma dica, já que a ideia é que você seja encontrado por empresas e outros contatos: use palavras-chave estrategicamente. Se a sua área é design, por exemplo, empregue termos relacionados, como design web, [**UX design**], entre outras.

## Relate com detalhes suas experiências

Essa é uma parte do perfil do LinkedIn que deixa muita gente com os cabelos em pé. Isso porque paira uma dúvida quanto a ser mais objetivo ou detalhar mais as experiências.

Já que a ideia é que você se mostre para a comunidade, quanto mais rico for o conteúdo, melhor será. Logo, procure detalhar cada experiência profissional — sem ser prolixo — com atividades realizadas, resultados alcançados, conhecimentos e tudo o que ocorreu no período.

Para quem está em início de carreira, a dica é relatar sobre os estágios. Cite, inclusive, os acadêmicos e voluntários, pois, para essa fase, tudo é importante.

## Adicione competências

Uma das áreas mais interessantes e simples do LinkedIn é a dedicada às competências. Nessa parte, você deve adicionar diversas habilidades e, depois, suas conexões poderão recomendar você por elas.

A dinâmica é muito simples: basta digitar uma palavra relacionada à sua área de atuação no campo escrito “adicionar competência nova”. Ao digitar esse termo, aparecerão outros relacionados.

Escolha aqueles que têm tudo a ver com sua pretensão (cerca de 10 opções). Pronto, suas habilidades já estarão listadas! Legal, não é?

## Customize sua URL de perfil

Outra funcionalidade do LinkedIn que contribui para a criação de um perfil de alta qualidade é a customização da URL. Isso mesmo: a plataforma permite que você tenha um endereço próprio de perfil com o seu nome.

Essa possibilidade demonstra mais profissionalismo e deixa a sua página completa. A alteração é simples — basta acessar a área de edição e criar a sua [**URL amigável**].

## Participe de grupos do seu interesse

Há grupos para todas as áreas de interesse no LinkedIn. Participar deles é uma forma de fazer networking, acompanhar atualizações de mercado e adquirir conhecimento.

Procure pelos mais interessantes e faça parte. Procure interagir com os participantes, envie perguntas e ajude os demais quando houver oportunidade. Além dos benefícios já citados, pode ser que um recrutador o encontre por ali, o que seria muito bom, concorda?

## Siga empresas e personalidades

Uma das vantagens do LinkedIn é a possibilidade de se conectar com organizações e personalidades, como grandes empresários e especialistas de diversas áreas. Quanto às empresas, essa é uma oportunidade de acompanhar suas novidades e, até mesmo, a publicação de vagas que, em diversos casos, só ocorre nessa rede social.

Já em relação aos demais, é interessante seguir suas postagens, suas ideias e seus pensamentos. Afinal, acompanhar quem é líder de mercado é sempre proveitoso, não é mesmo?

## Atualize com frequência seu perfil no LinkedIn

Uma das vantagens de ter um currículo na internet é a agilidade na divulgação de seus dados. Com apenas alguns cliques, todo mundo pode conhecer o seu perfil profissional e, a partir daí, há a chance de boas oportunidades de trabalho surgirem.

Mas, para que isso realmente aconteça, é preciso ficar de olho na atualização frequente (não exatamente todos os dias, mas sempre que houver alguma alteração). Informe qualquer mudança de cargo ou empresa, uma nova competência adquirida, um curso recente e tudo o que possa acrescentar valor ao seu perfil.

Além disso, você pode postar atualizações, artigos interessantes, infográficos e até mesmo o [**link do seu portfólio**] para manter mais proximidade com seus seguidores. Lembre-se daquela máxima: quem não é visto não é lembrado. Pois é, aparecer por lá de vez em quando ajudará na sua visibilidade.

Entretanto, tenha cuidado com as postagens, já que essa é uma rede profissional. Nem cogite piadinhas ou assuntos que não acrescentam valor ao seu público. Tenha muito cuidado com o que o vai postar. Entendido?

Gostou das nossas dicas para fazer o seu perfil no LinkedIn? Compartilhe este conteúdo nas redes sociais inclusive no próprio LinkedIn e ajude seus amigos a melhorarem a página deles!




No mercado de design, em 2016, muitas tendências apareceram e se fortaleceram: o uso de gestures, o aumento da conectividade entre plataformas, uma preocupação ainda maior com o UX e a interação, além de muitas influências do design no marketing digital.

Mas 2016 já acabou. Bem, muita coisa está por vir. Algumas tendências que se fortaleceram no último ano, continuarão ganhando força e, claro, muitas novidades estão nesse novo horizonte! Neste artigo, vamos apresentar algumas previsões do design que vão te ajudar a sair na frente neste novo ano.

## Cores para 2017

Desde 2000, a empresa [Pantone], mundialmente famosa pelo seu sistema de escala de cores, anuncia qual será a cor do ano. Esse anúncio é muito importante, pois ele, de certa forma, dita os tons a serem usados em várias áreas do design, como a moda, o web design etc.

A cor de 2017 é a Verde Folhagem (Greenary, 15-0343). Essa cor foi escolhida devido ao fortalecimento de movimentos relacionados ao meio ambiente, práticas naturais e incentivos a hábitos saudáveis.

Juntamente com a Greenary, a tendência para este ano é uma paleta de cores com tons da natureza, do verão e da primavera. Esses tons de cor são vivos e geram destaque, sendo comumente utilizados na aplicação em layouts de flat ou material design. Uma boa [**combinação dessas cores**] pode garantir uma atmosfera vibrante às composições.

## Design responsivo categorizado

Atualmente, o [**design responsivo**] é uma técnica utilizada para que um mesmo conteúdo possa ser exibido em diferentes tamanhos de tela sem que haja perda no layout, desorganização do conteúdo e a necessidade de uma folha de estilo (CSS) para cada resolução diferente. Um exemplo de design responsivo são os sites que se adaptam automaticamente de acordo com a tela, como é o caso de computadores e smartphones.

Porém, a tendência que está emergindo no mercado de design atualmente é outro tipo de design responsivo. Além de responder a diferentes tipos de telas, o design irá responder ao perfil do usuário. Baseado na idade, hábitos e preferências desse usuário, os conteúdos serão mostrados da forma que lhe é mais atrativa. Atualmente isso já acontece em relação a anúncios publicitários e algumas interfaces famosas (como a do Netflix), mas agora se pensa em extrapolar essa área e fazer com que diversos outros conteúdos sejam adaptáveis ao usuário.

## Design de interação

Em 2017, algumas práticas de design de interação que emergiram nos últimos anos ganharão ainda mais força. Uma dessas práticas são as de micro e mini interações em apps. Essas interações são pequenas ações que o usuário pode executar, ou que são executadas como resposta a outras, dentro de aplicativos.

Hoje, aplicativos como Facebook e Instagram possuem uma extensa lista de recursos que permitem uma grande quantidade de interações por parte do usuário. Sendo que cada vez mais os apps conversam entre si, tais pequenas interações podem possibilitar que o usuário leve uma ação de um programa ao ambiente de outro de maneira natural.

Outra prática que vai se fortalecer neste ano são os gestures. Eles são interações feitas através de gestos, em touch screens, que funcionam como um gatilho (ou atalho) para alguma função específica, tanto dos sistemas operacionais quanto de apps. Para a UX, estes gestos podem contribuir muito positivamente, pois permitem que o usuário gaste menos tempo para acessar determinada função, além de tornar a utilização de elementos, como menus e transições, mais intuitiva.

## Haptic feedback

O haptic feedback, apesar do nome um pouco complicado, já está presente em diversos aparelhos eletrônicos há alguns anos e será ainda mais presente em 2017. Um exemplo usual do haptic feedback são os controles de videogame, que vibram conforme certa situação de jogo. Essa resposta por meio de vibração é uma maneira de o design de UX e de interação permitirem uma maior imersão no conteúdo,simular ou até intensificar uma sensação, o que pode trazer um grande diferencial para seu projeto.

Para entender um pouco melhor, existem dois tipos de haptic feedback:

### **Feedback tátil**

Esse tipo de resposta utiliza do tato do usuário para que, através do contato com uma superfície, ele possa ter sensações de vibração, pressão, toque ou até textura. Atualmente, vários aplicativos de teclado para celular permitem que o usuário configure se ele deseja, e em qual intensidade, uma resposta por vibração ao tocar em uma letra. Isso permite com que usuário tenha certeza de que ele acertou uma letra, permitindo que ele possa digitar mais facilmente sem ter que olhar para o teclado.

### **Feedback cinestésico**

Esse tipo de resposta utiliza de vários sentidos do usuário em conjunto para simular uma sensação de peso ou tamanho. No mercado de design atual, onde as tecnologias de VR também estão em ascensão, esse tipo de resposta é extremamente funcional, pois permite que a imersão seja muito mais profunda.

## Design no marketing digital

Uma das formas mais efetivas de empresas conseguirem atingir seus públicos-alvo é através do [marketing digital]. Hoje em dia, com o massivo uso das redes sociais e smartphones, essa área do marketing ganha cada vez mais espaço, pois consegue direcionar o conteúdo a determinado tipo de usuário.

Agora você pode estar se perguntando: “Ah, mas como o design entra nisso?”, e a resposta é a seguinte: o design é um agente de diferenciação. Na seleção natural do mercado, as empresas que investem mais no design aplicado ao marketing digital obtêm mais resultados, pois conseguem atrair a atenção do usuário para seu anúncio.

Veja algumas formas de como um designer pode atuar nesse mercado:

### Identidade visual

Apesar de soar como básico, muitas empresas não entendem a importância da identidade visual para o seu sucesso. Ela faz com que o usuário perceba uma marca de forma individual, facilitando a associação de produtos e serviços à mesma. Quando for projetar uma identidade visual, lembre-se sempre de que ela deve remeter a valores que a empresa possua, condizendo com seu posicionamento no mercado.

### Web design

É essencial que uma empresa que invista em marketing digital tenha algum meio de comunicação online. Apesar da ascensão das redes sociais, o principal deles ainda é possuir um site independente.

Em conjunto com a identidade visual, o site de uma empresa é uma maneira rápida e efetiva de um possível cliente saber mais sobre uma marca ou produto, até mesmo podendo ser um canal de vendas da empresa. Nesse projeto o designer é peça essencial, pois é o profissional mais hábil para transformar tais informações em conteúdo visualmente adequado.

### Conteúdo para redes sociais

O gigantesco número de usuários em redes sociais atualmente as torna um ótimo canal de marketing para as empresas, além de possibilitar um contato um pouco mais pessoal com seus clientes. Porém, em redes sociais como Facebook e Twitter, o feed possui uma grande quantidade de informações, e (novamente) o grande diferencial que pode fazer um possível cliente parar seu scroll para ler um post é o [**conteúdo visual**].

Capas para páginas, avatares e imagens para posts são apenas alguns dos conteúdos que um designer pode atuar para promover o marketing digital nesse ambiente, e a demanda das empresas por uma maior qualidade cresce diariamente.

### E-mail marketing

Apesar de ser uma ferramenta antiga de marketing digital, o e-mail marketing está voltando com tudo. O aprimoramento das ferramentas de análise de conteúdo atualmente permite com que uma empresa saiba qual foi a efetividade que um e-mail marketing teve em uma determinada campanha.

O designer desenvolve dois tipos de e-mail para mesma campanha, com elementos visuais diferentes, e, ao fim da campanha, poderá saber qual obteve mais retorno, assim podendo moldar a próxima geração de conteúdo.

## Mãos à obra, designer!

Com essas dicas sobre o mercado de design em 2017, você pode capacitar-se ainda mais para sua atuação. Se você quer começar a trabalhar como freelancer nessa área ainda esse ano, dê uma olhada [**neste artigo**] para saber sobre onde conseguir jobs, além de muitas outras dicas.

Não deixe de nos seguir nas redes sociais para manter-se atualizado sobre as tendências do design neste ano!




Estou realizando os testes de uma aplicação de loja virtual. Os testes, garantem o funcionamento do carrinho de compras

Os métodos de testes estão dentro da classe `TestCarrinhoDeCompras` e cada método testa um caso das regras de negócios relacionadas às compras. A classe está disposta dessa forma:

python 

Os testes estão passando, mas o que tem de estranho nessa classe? Temos muito código repetido!

## Copiou e colou, copiou e colou, isolou

Aqui na Caelum, tenho uma amiga que sempre fala: Copiou e colou, copiou e colou, isolou! O mesmo trecho de código espalhado pelo sistema prejudica a manutenção do código.

Caso o maneira de criar um carrinho de compras mude, ou então a maneira de se criar usuário, precisaremos alterar todos os testes que criam o usuário. Sabemos que isolar os trechos repetidos é uma forma de evitar essa repetição:

python 

Dessa forma, podemos invocar essa função cada vez que precisarmos de um usuário:

python 

Os testes continuam passando, mas, para quem está acostumado com testes, ou já usou outros frameworks de testes, sabe que existe outra forma de criar os cenários para os testes.

## Conhecendo as fixtures

Podemos dividir os testes em, basicamente, três partes: o cenário - aquilo que o teste precisa para ser executado -, a parte da execução do caso de uso e a asserção - a validação do resultado da execução e do resultado esperado.

Em muitos testes, o cenário é o mesmo! Ou seja, grande parte dos testes utilizam o mesmo cenário para rodar. No nosso caso, o `CarrinhoDeCompras`, o `Usuario` e os itens são utilizados em todos os testes.

Podemos isolar a criação desses objetos. Dessa forma, reutilizamos eles em outros pontos da aplicação.

Na biblioteca `unittest`, já deve conhecer o método `setUp()`. Este método, que é herdado da classe `TestCase`, permite que criemos cenários de testes.

No caso, estamos utilizando a `pytest` e não herdamos de nenhuma classe, ou seja, não temos um método para sobrescrever. O que podemos fazer então?

Vamos quebrar esse problema em partes. A primeira coisa que queremos é isolar a criação de um objeto, por exemplo, de um usuário:

python 

Bacana! Já temos a função que cria um usuário para os testes. Como fazer a `pytest` invocar essa função para rodar os testes?

O cenário de um testes, também é conhecido como `fixture`. Logo, precisamos falar que esse trecho de código é uma fixture da `pytest`

python 

Legal! Agora só precisamos falar quais os testes que precisa desse objeto, fazemos isso passando o nome da função como parâmetro do método de teste:

python 

Os testes continuam passando. Vamos criar as `fixtures` para os outros objetos também:

python 

Agora, só precisamos receber como parâmetro dos métodos:

python 

Os testes continuam passando, mas o que exatamente está acontecendo?

## Entendendo as fixtures

Quando decoramos uma função, ou método, com `@pytest.fixture`, por padrão, essa função é executada antes de cada método de teste que precise dela. Ou seja, para cada vez que o teste é rodado, um novo objeto é instanciado na memória e é utilizado por aquele teste.

Esse comportamento é declarado pelo parâmetro `scope` que por padrão recebe o valor `’function’`, indicando que antes de cada função de teste, essa fixure é executada. Logo, decorar o método com `@pytest.fixture` é a mesma coisa de `@pytest.fixture(scope=’function’)`:

python 

Em alguns casos, na maioria deles na verdade, é legal que as fixtures sejam executadas antes de cada teste. Assim, temos um cenário limpo, sem efeitos colaterais de outros testes.

Porém, algumas vezes criar as fixtures podem ser custosas para o sistema. Vamos imaginar que temos uma conexão com o banco de dados. Abrir a conexão antes de cada teste é custoso. Neste caso, o que podemos fazer é abrir a conexão no começo do módulo de testes e só fechá-la ao final.

Conexão com o banco de dados, com um serviço de e-mails, com um serviço externo, ou até mesmo, um objeto que tem um valor imutável. São exemplos de objetos que podemos criar uma única vez e ir reutilizando nos testes.

Por exemplo, o objeto `usuario` não altera estado, ele é apenas passado no construtor do carrinho de compras. Ou seja, se quisermos, podemos alterar seu escopo, mas qual escopo colocar?

Existem diversos escopos que a `pytest` disponibiliza para nós utilizarmos. Nesse caso, temos apenas uma classe de teste no módulo, o que é bem comum, logo, podemos fazer que esse objeto seja instanciado apenas uma vez na classe, podemos fazer isso, alterando o escopo para `class`:

python 

Dessa forma, o objeto é instanciado uma única vez, logo que a classe de testes é instanciada, e sua instância é compartilhada com os métodos.

É importante notar que como a instância é compartilhada entre os métodos, é importante **tomar cuidado com efeitos colaterais**. Por exemplo, se colocarmos o escopo do carrinho como `class`, apenas o primeiro teste que é executado passa, já que o carrinho está vazio, enquanto os outros testes falham.

imagem e de classe (`‘class’`), existem também os escopos de módulo (`’module’`), sessão (`’session’`) e pacote (`’package’`) - este último, até a data de escrita desse post, é considerado experimental.

Cada um deles carrega o objeto em alguma fase. O escopo de módulo instancia um objeto no começo do módulo de testes, ou seja, no arquivo de testes.

O de sessão se encarrega de instanciar o objeto no começo da sessão de testes (mais de um módulo de testes, por exemplo), já o de pacote, instancia o objeto quando o pacote de testes - o diretório -, ou um subpacote, é carregado.

Além de criar objetos, quando trabalhamos com escopos é comum termos que nos preocupar sobre como esses objetos são destruídos. Quando abrimos a conexão com o banco, ou com um serviço de e-mail, temos que assegurar que a fecharemos. Isso é chamado de `tear_down` no mundo de testes.

Conseguimos realizar isso com a `pytest` da seguinte forma. Vamos pegar um código que realiza uma conexão com um serviço de e-mail:

python 

Podemos falar para o Python que não queremos retornar a conexão imediatamente, mas só quando ela for realmente necessária, ou seja, podemos transformar essa função em uma [**função geradora**].

python

Após gerar esse objeto, podemos falar para a função fechar a conexão:

python 

As fixtures são um dos recursos mais importantes que existem na `pytest`. Para cada situação, podemos utilizar uma estratégia diferente. Por isso, uma coisa que é sempre bacana a gente fazer é [**dar uma olhada na documentação**] para ver como a biblioteca pode melhor nos atender.

Se você quiser [**saber mais sobre Python, aqui na Alura temos diversos cursos sobre a linguagem**]. Desde o básico, até recursos **avançados de orientação a objetos, sistemas para a web com Django ou Flask, padrões de projeto e muito mais**.



Vamos entender como implementar desde o design à lógica por de trás dos panos da criação de uma **tela de abertura no Android (Splash Screen)** de uma App que eu estou desenvolvendo para a Alura.

imagem 


Recentemente, adicionei uma tela para autenticação nessa App, onde armazeno os cursos que realizei:

imagem`**, e por fim, chamamos a **`LoginActivity`** que representa a tela de login.

Então vamos implementar o código:

java

Rodando a App temos o seguinte resultado:

imagem**]) que recebe dois parâmetros:

- **1º parâmetro**: uma interface `Runnable` que é justamente a `Thread` que será executada após o tempo de delay.
- **2º parâmetro**: tempo de delay em millisegundos.

Então o nosso código fica da seguinte forma:

java

Pronto! Criamos a nossa thread que rodará com um delay. Portanto, vamos executar a App novamente e verificar o resultado:

![splash_com_delay]

Maravilha! Agora está funcionando conforme esperado. Entretanto, observe que a nossa splash screen ainda exibe o horário, notificações e am[**ActionBar**]. Em outras palavras, seria legal se a nossa splash screen fosse full screen, ou seja, tela cheia, por exemplo:

![splash_fullscreen]

Como será que podemos fazer isso?

## Ajustando o tema para tela cheia

No arquivo **`AndroidManifest.xml`**, podemos definir temas para cada `Activity` por meio do atributo **`android:theme`**. Existem diversos temas disponíveis, porém, nesse caso, utilizaremos um **tema existente** chamado `Theme.AppCompat.NoActionBar`:

xml

Poderíamos utilizar outros temas para tirar a `ActionBar`, mas porque utilizamos esse em específico? É justamente pelo motivo de estarmos estendendo da classe `AppCompatActivity`

Vejamos o resultado:

![splash_sem_actionbar]

## Melhorando o visual da Splash Screen

Já melhorou bastante comparando com o resultado anterior, porém, ainda não está em full screen... E agora? Como podemos fazer isso mantendo a `AppCompatActivity`? Podemos criar um tema personalizado no arquivo `res > values > styles.xml`:

xml

Então vamos criar um tema nosso chamado `AppCompat.TelaCheia` :

xml

Criamos o tema, mas e agora? O que podemos fazer?

Precisamos utilizar as mesmas propriedades do tema `Theme.AppCompat.NoActionBar`, porém, com uma configuração extra para deixar full screen. Será que é possível?

Da mesma forma que fazemos com as classes do Java, podemos estender de temas já existentes! Como, por exemplo, fazer com que o nosso `AppCompat.TelaCheia` herde do `Theme.AppCompat.NoActionBar` a partir do atributo `parent`:

xml

Então, adicionamos o item necessário para deixar full screen, que é o `android:windowFullscreen`:

xml

Por fim, basta apenas utilizarmos esse tema para a nossa `SplashScreenActivity`:

xml

Vamos rodar a nossa App e verificar o resultado:

![splash_full_screen]

Bem mais bonito né? E aí? Gostou de criar uma splash screen? 

Que tal aprender a desenvolver a sua App Android desde o zero? Aqui na Alura, temos uma [**formação Android**] onde ensinamos você a desenvolver sua primeira App com os principais conceitos do início ao fim.





imagem 

Se te perguntassem hoje todas as mulheres ícone que você conhece na história da humanidade, quantas conseguiria lembrar? E dentro da sua área profissional?

Muitas pessoas (até mesmo eu) poderiam acabar lembrando de alguns poucos nomes…

Ao longo da história acabamos dando pouca evidência às grandes conquistas femininas e passamos batido por uma série de eventos muito interessantes.

Por isso, dia 8 de março homenageamos as mulheres de todo o mundo, trazendo algumas informações bem legais.

Mas, já se perguntou por que celebramos esse dia?

## O Dia Internacional da Mulher

Existem algumas hipóteses sobre a origem da escolha para o dia 8 de março como Dia Internacional da Mulher, mas, basicamente, podemos dizer que esse dia foi um marco instituído pelas diversas reivindicações feitas por mulheres no século XX.

Esse foi um período de intensa industrialização e as mulheres começaram a participar ativamente dessas novas atividades, trabalhando em grandes indústrias com intensas jornadas e péssimas condições de trabalho.

Passaram então a reivindicar seus direitos trabalhistas, assim como diversos outros movimentos na época, através de greves e outras manifestações.

Só na década de 1970 a ONU oficializou a data e, dali pra frente, diversas celebrações começaram a acontecer anualmente.

E, se formos olhar a fundo pelas diversas coisas que encontramos da participação feminina na história, podemos destacar algumas pessoas que marcaram grandes feitos.

## Personalidades femininas na história

Nas diversas áreas temos a participação de mulheres que trouxeram sua presença de forma muito significativa.

Especialmente hoje, [**a Alura preparou um visual diferente para a página inicial**] da plataforma, com algumas dessas mulheres que revolucionaram na área de TI.

Temos, por exemplo, alguns nomes como **Margareth Hamilton**, que desenvolveu o programa de voo usado no projeto Apollo 11, software que impediu que o pouso na Lua fosse abortado por falha humana, assim como **Dorothy Vaughan**, liderando a seção de programação da Divisão de Análise e Computação do Langley Research Center (NASA).

imagem

Mas ainda podemos falar um pouco de alguns nomes muito relevantes em outras áreas, como em UX, com **Elizabeth Churchill**, diretora de User Experience na Google, trabalhando com HCI (Human-Computer Interaction), **Paula Scher**, na parte de Design Gráfico, uma das mais influentes designers no mundo atualmente, especializada em tipografia.

imagem

E veja também outras homenagens super legais que tivemos por aí, como a websérie [**Vida de programadora**], com o primeiro episódio aqui:

https://www.youtube.com/watch?v=Usnp2ht_Upg




É muito comum no nosso dia a dia, como desenvolvedores, lidarmos com códigos escritos por outros desenvolvedores, seja para compreender uma regra de negócio como também para a evolução do programa de modo geral.

Para compreendermos melhor essa situação, vamos considerar uma aplicação Java para um estoque de produtos. Nessa aplicação temos o seguinte código:

java

Observe que se trata de uma classe [**DAO**] para produtos. Para esclarecer mais o exemplo, vamos considerar o seguinte model para a classe `Produto`:

java

Ao executarmos o método `produtosResumido()` temos o seguinte resultado:

java

Observando o resultado, temos um resumo dos produtos salvos no estoque. Porém, olhando rapidamente a implementação do método `produtosResumido()` é fácil compreender que esse resultado seria apresentado? A princípio, não...

## Entendendo a refatoração de código

Em outras palavras, observe que entramos em uma situação na qual faz todo o sentido parar e pensar em maneiras para melhorar o nosso código atual, certo?

Esse processo de melhoria de código é conhecido tecnicamente como _code refactoring_, ou em português, refatoração de código.

Essa técnica, de modo geral, é constituída por diversas práticas que visam a melhoria no código nos seguintes pontos:

- **Simplicidade**: minimizar a quantidade do código.
- **Legibilidade**: melhorar a leitura do código para nós humanos.
- **Performance**: aumentar a velocidade de execução.

A princípio você pode estar pensando:

> **_"Refatoração é bem bacana, mas se eu fizer isso estarei modificando o comportamento da minha aplicação!"_**

A primeira impressão que temos durante esse tipo de processo é imaginar que a nossa aplicação vai ser modificada e vai apresentar comportamentos diferentes!

Isso é bem comum mesmo, porém, a ideia da refatoração é **aplicar técnicas que modificam apenas o aspecto visual do código**, ou seja, o comportamento inicial ainda é mantido!

Parece muito bom pra ser verdade, né? Sendo assim, vamos aplicar algumas técnicas de refatoração no código que vimos inicialmente e veremos a mágica acontecer!

## Renomeando variáveis

A primeira das técnicas que iremos aplicar será a renomeação das variáveis. A princípio parece besteira, porém, vamos dar uma olhada em um trecho do nosso código:

java

Pra você, `psr`, `p`, `dse` possuem algum significado? Pra mim e para qualquer pessoa que vai ver esse código pela primeira vez, não tem significado algum olhando à primeira vista, então que tal fazermos a seguinte modificação:

java

Veja que agora é nítido que estamos lidando com umas lista de `produtos`, e para cada `produto` de `produtos` estamos pegando uma `descricaoSemEspaco`.

Note que até pra ler fica mais fácil! Em outras palavras, durante o processo de refatoração, renomear variáveis facilita a leitura do código. Portanto, quanto mais significativo for o nome da variável, mais fácil será a leitura. Vamos ajustar nos demais pontos:

java

Observe que ainda foi mantida a variável `sb` referente à instância da classe `StringBuilder`. Por ser uma instância de uma classe compreendida pela maioria dos desenvolvedores e por não ter um nome tão enxuto, não há problema em deixar como `sb`.

Em outras palavras, para casos em que estamos fazendo uma instância de uma classe com um nome grande podemos usar uma abreviação. Nesse caso do `StringBuilder` poderíamos até mesmo usar o `builder` que ele teria significado o suficiente.

> **Lembre-se**: Durante esse processo de renomear as variáveis, o mais importante é que no momento que for ler o código seja feita uma leitura fácil e objetiva, ou seja, mesmo para quem não conheça tanto da implementação compreenda apenas lendo.

## Extração de método

Embora o nosso código tenha melhorado significamente a leitura, isto é, com nomes mais claros para nós humanos, ainda sim ele está um tanto quanto complexo. Se observarmos, temos uma boa quantidade de linhas dentro de apenas um único método!

Levando em conta essa situação, o que podemos fazer para resolver esse detalhe? Para esse tipo de cenário, podemos aplicar a técnica conhecida como extração de código. Agora você deve estar pensando:

> **_"Legal, mas como funciona essa técnica?"_**

Basicamente, durante a leitura do código, fazemos uma análise e verificamos o que um conjunto de código faz, como por exemplo esse trecho:

java

Se observarmos com bastante atenção, todo esse código tem como objetivo **ajustar uma descrição de um produto**, certo? Então, que tal transformarmos todo esse código nesse método aqui?

java

Então basta apenas realizarmos a seguinte chamada dentro do nosso código anterior:

java

Veja como o nosso método diminuiu! Fica até mais fácil de ler dessa maneira, podemos até mesmo fazer isso para outros pontos do código. Por exemplo este aqui:

java

Basicamente o código à direita formata o valor de acordo com a moeda, certo? Nesse caso nada nos impede de extrair um método aqui também, que tal deixarmos assim:

java

Aproveitando, podemos também aplicar o mesmo conceito no trecho de código em seguida:

java

Vamos extrair para:

java

Agora vamos ver como fica aquele nosso método inicial:

java

Bem mais fácil de ler, certo? Podemos facilitar mais ainda, ou seja, ao invés de enviar 3 parâmetros para criar a descrição final, podemos enviar apenas o produto e chamar os demais método dentro do método `resumeDescricao()`:

java

Veja o quanto o nosso código modificou:

java

Agora o nosso método `produtosResumidos()` ficou bem mais fácil de compreender, sabemos logo de cara que ele passa por cada um dos produtos, pega uma `descricaoFinal` e faz uma impressão da mesma.

## Conclusão

Veja que mesmo o código parecendo complexo apenas aplicando algumas técnicas de refatoração fomos capazes de melhorar e muito o aspecto de leitura e compreensão do nosso código, no caso, vimos a técnica de extração de método e renomeação de variáveis para nomes mais amigáveis.

Quer aprender mais técnicas de refatoração? Então dê uma olhada no nosso curso de [**refatoração na prática com Java**] no qual aborda tanto as técnicas que vimos no post como também algumas outras que fazem uma grande diferença nesse processo de melhoria de código.





imagem 

Dê uns tempos para cá, fazer testes em software se tornou popular e trouxe uma série de benefícios que evitam erros bobos para quem está desenvolvendo projetos e não quer deixar passar nada que atrase a entrega.

Neste episódio do Alura Live, o host Gabs Ferreira recebeu Fernando Daciuk, uma fera do desenvolvimento JavaScript pra falar mais sobre esses testes e que benefícios podem te trazer.

https://www.youtube.com/watch?v=r1rndQwFLMY

Tá afim de saber um pouco mais sobre o assunto? Assista esta [live completa!]

- Dê seus primeiros passos com JavaScript: [**Lógica de programação I**]: Os primeiros programas com JavaScript e HTML.

- Faça testes automatizados com Jasmine: [**Jasmine:**] Testes automatizados em JavaScript.

- Veja outros cursos do mundo web: [Meteor:] Crie single page applications com JavaScript. [React Native parte 1:] Criando apps nativas com JavaScript e React.

- Faça [**Formação Front-End**]

Não deixe de nos seguir Twitter: [Gabriel Ferreira], [Fernando Daciuk] e a [Alurinha]! ;)




Com o desenvolvimento das técnicas de administração e gestão, quem começa uma startup pode ficar perdido em meio a tantas inovações. No entanto, com tantas teorias, é essencial [**separar o joio do trigo**], uma vez que algumas ideias são simplesmente estéreis. Isto é, carecem de qualquer aplicação ou benefício comprovados na prática. Felizmente, esse não é o caso do lean startup!

Seus princípios são bastante simples: o excesso de desenvolvimento leva à desmotivação da equipe e a produtos caros, ao passo que um **desenvolvimento rápido e simples** pode lançá-los rapidamente para alguns consumidores. Desse modo, você obtém informações reais sobre a aplicabilidade do seu conceito. 

Acima de tudo, substitui-se o excesso de gestão que tem atingido a todas as empresas pelo aprendizado consolidado pela experiência. Se você quer entender mais sobre esse assunto, então nosso texto será uma excelente introdução, confira:

## Entendendo o lean startup

**A Lean startup é uma metodologia para o desenvolvimento de negócios e produtos. Assim, ela visa encurtar os ciclos de desenvolvimento de produtos**. Para isso, adota uma combinação de experimentação e inovação embasada em hipóteses empresariais, lançamentos de produtos iterativos e aprendizado consolidado nas experiências.

A hipótese central é que, se as empresas iniciantes investem tempo em produtos ou serviços de forma iterativa para atender às necessidades dos clientes iniciais, são reduzidos os riscos de mercado, não havendo a necessidade de grandes montantes de financiamento inicial e de lançamento de produtos caros e pouco competitivos. 

Para atingir esse objetivo, ela utiliza as seguintes estratégias:

### Produto mínimo viável

**Um produto mínimo viável MVP (do inglês, Minimum Viable Product)** é um protótipo de um novo produto cujo objetivo é auxiliar a equipe a coletar o máximo de aprendizado sobre a reação dos clientes com o menor esforço possível. Então, em vez de ficar anos elaborando um projeto complexo e de difícil implementação, a empresa deve criar um produto que:

- contenha os conceitos básicos do produto final imaginado pelos empreendedores;
- esteja dentro dos princípios e da mudança que eles desejam criar no mundo;
- tenha resultados testáveis;
- tenha o mínimo de custo para que o foco seja dado no desenvolvimento dos conceitos ao longo dos testes;
- não exija um esforço que desgaste e desanime a equipe antes de o produto começar a sair do papel.

Como exemplo, o inventor desse conceito, Ries, observou o fundador da [Zappos], Nick Swinmurn. Ele queria testar a hipótese de que os clientes estavam prontos e dispostos a comprar sapatos online, o que hoje é óbvio — mas na década de 1990 nem tanto.

Para isso, em vez de construir um site e um grande banco de dados de calçados, Swinmurn aproximou-se de lojas de sapatos locais, tirou fotos de seu inventário, postou elas em um site. Então, comprou os sapatos das lojas a preço de varejo e, depois de fazer uma venda, os enviou diretamente para os clientes.

Com isso, Swinmurn deduziu que seu conceito hipotético estava correto — havia demanda dos clientes. Desse modo, a Zappos acabaria crescendo em um negócio bilionário baseado no modelo de venda de sapatos online nos EUA. 

### Teste A/B

**Um teste split ou A/B** é um experimento em que diferentes versões de um produto são oferecidas a dois grupos de clientes ao mesmo tempo. O objetivo é observar diferenças de comportamento entre os dois grupos e medir o impacto de cada versão em uma métrica de impacto para o negócio.

Os testes A/B também podem ser realizados em sequência: um grupo de usuários, em uma semana, pode ver uma versão do produto ao passo que, na semana seguinte, os mesmos usuários veem outro.

Essa última metodologia, apesar de mais simples, pode ser menos eficaz pois há circunstâncias em que eventos externos podem influenciar o comportamento do usuário em um período de tempo, mas, em outro, não.

### Métricas úteis

As métricas úteis ​​podem levar a decisões de negócios mais bem informadas uma vez que utilizam informações que realmente são estratégicas para a startup, aumentando a chance de sucesso das ações subsequentes.  

Elas se contrapõem às métricas de vaidade — cujo objetivo é florear a imagem do negócio, mas que, na verdade, não refletem com precisão os principais fatores que mensuram o êxito da startup.

Um exemplo típico de uma métrica de vaidade é "o número de novos usuários ganhos por dia". Embora um número elevado de usuários ganhos por dia pareça benéfico para qualquer empresa, sua utilidade real pode variar. 

Por exemplo, em uma empresa cujos lucros vêm dos anúncios publicitários, essa métrica é muito útil visto que aumenta a visibilidade dos anúncios.

Por outro lado, em uma empresa de varejo que necessita da conversão desses usuários em clientes, a métrica pode ser inadequada. Essa startup precisaria de uma métrica útil, como "taxa de conversão de visitantes do website em clientes".

Então, neste caso, se nos preocuparmos somente com o número de novos visitantes, estamos nos apegando à vaidade. Afinal, a startup pode ter uma ótima estratégia de atração de usuários, mas uma péssima estratégia de conversão de clientes. 

Portanto, tudo depende da empresa e da situação. Não existe preto e branco nesses casos. O valor de uma métrica pode parecer muito bom, mas, se ela não traz benefícios claros para uma empresa, é melhor abandoná-la. 

### Pivô

Um pivô é uma correção de curso estruturada para testar uma nova hipótese fundamental sobre o produto, estratégia e mecanismo de crescimento. Um exemplo notável de uma empresa que emprega o pivô é o [**Groupon**]: quando a empresa começou, era uma plataforma de ativismo social online chamada The Point.

Depois de receber quase nenhum impacto, os fundadores abriram um blog WordPress e lançaram sua primeira promoção de cupom para uma pizzaria localizada no edifício em que mantinham seu escritório. Embora só tenham sido feitas 20 compras, os fundadores perceberam que a ideia era boa e capaz de mobilizar grupos de pessoas para as promoções. Três anos mais tarde, o Groupon se tornou um negócio de bilhões de dólares.

Steve Blank — um dos expoentes do lean startup — define um pivô como mudar o plano em vez do executivo (o executivo de vendas, [**marketing**] ou mesmo o CEO). Assim, em vez de atribuir culpas, olhamos para o projeto e definimos se há realmente alguma falha de conceito.

### Contabilidade da inovação

Esse ponto enfoca como os empreendedores podem manter a responsabilidade empresarial e maximizar os resultados, medindo constantemente o progresso e os marcos de planejamento. Com isso, é possível investir no que realmente traz retorno para a empresa, seja do ponto de vista financeiro, seja do pessoal.

### Construa – mensure – aprenda

**O construa – mensure – aprenda** enfatiza a velocidade de um ingrediente crítico para o desenvolvimento de produtos. A eficácia da equipe ou da empresa é determinada pela sua capacidade de idealizar, construir rapidamente um produto minimamente viável, medir sua eficácia no mercado e aprender com essa experiência.

Em outras palavras, é um ciclo criado para transformar ideias em produtos, medir as reações e os comportamentos dos clientes contra e, em seguida, decidir se deseja insistir ou descarta a ideia. Esse ciclo se repete quantas vezes forem necessárias, sempre com os seguintes passos:

**Ideias → Construir → Produto → Medir → Dados → Aprender**

Essa rápida iteração permite que as equipes descubram um caminho viável para o ajuste do produto/mercado e continuem a otimizar e a aperfeiçoar o modelo de negócios depois de alcançar o sucesso.

### Business Model Canvas

O [**Business Model Canvas**] é um modelo de gestão estratégica inventado para desenvolver novos modelos de negócios e também para documentar e otimizar os já existentes. É um gráfico visual com elementos que descrevem o valor real da empresa: infraestrutura, oferta, clientes, finanças e recursos. 

Mais detalhes podem ser obtidos no [**excelente modelo desenvolvido pelo SEBRAE**].

## Lean startup e design thinking

Entre os especialistas nesses dois modelos de produção para startup, há sempre a contraposição do [**design thinking**] com o lean startup. Essa "rivalidade", no entanto, pode criar algo bastante negativo: presa aos dogmas de uma delas, as startups podem acabar perdendo as vantagens que a outra apresenta.

Por isso, vamos mostrar como cada uma pode complementar a outra:

### Corrigindo os excessos do pivô

A prática do lean startup pode ser mal interpretada, de modo que os empreendedores que a adotam percam o foco do seu negócio. Desse modo, no meio do processo de crescimento da empresa, foram tomadas tantas correções de rumo que os envolvidos começam a se perguntar: foi por isso que eu comecei esse negócio?

Tendo isso em vista, pode ser muito útil usar o Design Thinking para elaborar minimamente o caminho que a startup vai tomar. Diante de um desafio realmente interessante para a empresa, em vez de mudar de rumos, que tal todo mundo se reunir em uma sessão de brainstorm moldada pelo Design Thinking?

Nela, não colocamos amarras na nossa imaginação! Qualquer ideia — por mais maluca que seja — pode ser sugerida. Depois de um tempo, é só reunir todas essas informações e extrair o que tem de interessante em cada uma das ideias da equipe. Se uma solução inteligente surgir, talvez não seja necessário adotar o "pivô" nesse momento.

### Desenvolvendo um pensamento voltado a soluções de problemas

Frequentemente, reuniões têm se tornado um espaço de criação de problemas em vez de soluções. Com o Design Thinking, a tomada de decisão pode ser melhor orientada: sua equipe vai tentar pensar criativamente em soluções para os problemas atuais. Sobretudo, não é hora de pensar em limitações.

Assim, todos os colaboradores e envolvidos se sentirão constantemente instigados a pensar cada vez mais fora da caixa.

### Trazendo empatia para o lean startup

Um dos principais pontos do Design Thinking é o desenvolvimento da empatia. Durante cada etapa do processo, a equipe se desafiará a pensar: como meu cliente deve se sentir? O que ele vai pensar do produto? Como atingirei as suas dores?

O foco sai do produto e é direcionado para o próprio usuário. Afinal, não importa se você incorporou a última tecnologia disponível, sendo que ela não melhora algum aspecto importante da vida das pessoas para quem as suas soluções são voltadas.

## Vantagens do uso do lean startup

Com as estratégias citadas acima, sua startup pode ser elevada a um outro patamar e assim, destacar-se da concorrência. Infelizmente, no mercado de startups brasileiras, muitas têm começado sem adotar o modelo rápido e eficiente das startups. São simplesmente empresas tradicionais iniciantes que se autointitulam "startups". 

Para realmente ser uma startup, é preciso adotar as estratégias e o modelo que explicamos ao longo deste conteúdo. Desse modo, você pode otimizar ao máximo o capital e o tempo, diferenciando-se dos seus concorrentes. Por isso, fizemos um breve resumo das maiores vantagens do uso da metodologia do _lean startup_:

### Você está mais perto de seus clientes

Como uma startup, você tem as enormes vantagens de ter acesso mais direto à entrada de seus clientes, tendo ainda a capacidade de implementar mudanças muito mais rápida e eficientemente.

Essa é uma vantagem que a maioria das grandes empresas gostariam de ter, pois não estão mais na fase inicial. Nesse sentido, veja a seguir algumas maneiras de aproveitar ao máximo a proximidade com os seus clientes:

- exponha todos os seus funcionários aos seus clientes;
- estabeleça laços de feedback entre o setor de vendas e o resto de suas equipes;
- estude suas interações com o serviço de atendimento ao cliente;
- monitore as interações sociais;
- entre em contato com seus clientes (ou melhor ainda, conheça-os pessoalmente);
- faça a mineração de seus dados na web;
- incorpore a coleta de dados diretamente a seu produto;
- torne os comentários dos clientes altamente visíveis em toda a organização.

### Qualquer ganho é extremamente excitante

Agilidade não é uma característica muito comum de grandes empresas. Normalmente, quanto maior a organização, mais dependente e burocrática ela se torna em relação às estruturas e aos processos previamente estabelecidos.

Há mais etapas em cada decisão, as linhas de comunicação se tornam cada vez menos diretas e eficientes, e o pior de tudo: há uma dose maciça de uma das maiores inimigas da produtividade — as reuniões. Como resultado, horizontes de planejamento tendem a se estender por anos, em vez de dias, semanas ou meses, como felizmente acontece na sua startup. 

Confira, então, quais são as dicas para explorar essa vantagem:

- escolha um mercado de produtos que esteja evoluindo rapidamente ou tenha necessidades ou gostos dinâmicos;
- escolha um mercado de produtos que tenha um potencial de inovação significativo a longo prazo;
- construa seu mercado antes que as grandes empresas saibam o que as atingiu;
- use tecnologias novas e inovadoras assim como modelos de negócios modernos;
- evolua rapidamente todos os aspectos do seu negócio.

### Você pode iniciar com um foco intenso em determinado nicho de mercado

Grandes empresas têm um problema complicado com o foco. Geralmente, elas têm de aumentar seu escopo para sustentar o crescimento, desenvolvendo produtos voltados para inúmeros segmentos de clientes e usando muitas abordagens de divulgação. Portanto, mesmo que elas tenham mais recursos, elas precisam distribuir esses recursos por uma variedade maior de mercados.

Em comparação, você pode dedicar tudo o que você tem para focar em um segmento-alvo muito específico. Isso lhe dá uma vantagem poderosa. Não só você pode desenvolver uma compreensão mais rica em profundidade dos seus clientes — suas dores, necessidades e processos de compra, como realmente eles usam e percebem o valor do seu produto). 

Com isso, você também pode obter uma imagem no mercado incrivelmente precisa e concisa. Portanto:

- vá atrás de um nicho;
- mantenha todos na empresa focados nesse nicho;
- reforce esse foco a cada chance que você tiver — do topo à base da hierarquia;
- mantenha suas equipes tão pequenas quanto possível.

### Você pode ir atrás de pequenas oportunidades

As grandes empresas precisam ir atrás de grandes oportunidades de mercado. Por isso, não podem se dar ao luxo de explorar pequenos mercados — especialmente se eles têm necessidades especiais. Isso deixa um número significativo de oportunidades, que você pode atacar.

A chave para empreendedores de startups que adotam a filosofia _lean_ é identificar e atacar mercados que podem ser pequenos agora, mas estão em uma trajetória ascendente e têm o potencial para o crescimento. Um exemplo claro vem das startups de turismo econômico como o [**Airnb**] — que focou no público universitário, oferecendo vagas de hospedagem mais baratas e alternativas.

A grande vantagem de focar nesses mercados é muito simples: demorará muito tempo para que as grandes empresas percebam você. Com isso, quando elas tentarem entrar na disputa, você já vai ter uma startup consolidada no mercado.

Foi assim, por exemplo, o caso da startup de marketing de conteúdo [**RockContent**].

Para explorar plenamente esta vantagem:

- olhe para os mercados que são muito pequenos para grandes empresas ou que estejam fora do radar delas;
- procure segmentos de clientes com necessidades especiais que não sejam totalmente atendidas pelas grandes empresas;
- identifique um mercado pequeno ou em potencial, que outras startups estão apenas começando a atacar.

Com essa estratégia e a metodologia lean startup nas mãos, o crescimento rápido é garantido.

### Você pode inovar de maneira muito mais rápida e eficaz

A mudança é algo contra o qual qualquer grande negócio com sistemas e processos rígidos inevitavelmente luta.  A mesma lógica vale para abraçar o risco com estratégias arrojadas. Não só é somente extremamente difícil coordenar mudanças e novas iniciativas de um ponto de vista logístico, mas também pode haver resistência significativa dos funcionários e da gestão.

Para os grandes negócios, o pensamento criativo e a resolução rápida de problemas são muitas vezes limitados à realização de pequenos ajustes e iterações nos processos e estruturas já existentes. Em outras palavras, eles ficam presos em uma mentalidade "é assim que sempre fizemos".

Como uma_ lean startup,_ você não tem essas limitações. Na verdade, quanto mais inovador e perturbador você puder fazer o seu negócio, mais difícil será para as grandes empresas copiarem ou competirem com o que você está fazendo. Para garantir o êxito dessa estratégia, você pode:

- ser corajoso e correr riscos;
- desenvolver tecnologia que os concorrentes teriam dificuldade em construir com sua plataforma atual;
- executar uma abordagem que seria muito prejudicial para uma empresa maior tentar replicar;
- capacitar equipes e funcionários individuais em testar, iterar e adotar abordagens inovadoras.

### Você pode conduzir seu negócio com a eficiência máxima

No_ lean startup_, sua missão é operar como uma máquina de lucro de alta eficiência. Em outras palavras, a ideia básica é fazer tudo o que você faz — seu produto, preços, atendimento ao cliente, etc — tão convincentemente, que você consiga converter seus clientes-alvo com pouca ou nenhuma despesa de vendas e marketing de sua parte.

Ou então, reduzir seus custos às estratégias mais eficientes, como o [marketing digital.] Para isso, você precisa:

- ter o foco na [**experiência do usuário**];
- criar recursos de compartilhamento social diretamente em seu produto;
- fazer seu processo de subscrição e compra tão simples quanto possível;
- melhorar constantemente o seu produto e incorporar o feedback dos clientes com ciclos de desenvolvimento rápido;
- aproveitar as versões beta e de teste gratuitas do seu produto para precificá-las a preços extremamente competitivos;
- manter as despesas de vendas e de marketing tão baixas quanto possível. 

Portanto, se você deseja se diferenciar das demais startups, aplique uma metodologia inteligente e inovadora, cujo objetivo seja fazer com que o seu produto seja lançado o quanto antes no mercado.

Com isso, você pode começar a influenciar seus potenciais clientes desde cedo e testar efetivamente o conceito do seu produto sem ter gasto um grande volume de capital com o desenvolvimento. Por esses motivos, a metodologia ideal tem sido a lean startup! Somente ela tem aliado um crescimento rápido com a sustentabilidade econômica ideais para o modelo inteligente e eficiente das startups.






imagem 

Veja como utilizar o terminal para criar, excluir, renomear arquivos e diretórios.

Quando estamos programando, é bem comum nos depararmos com situações na qual temos que utilizar o terminal.

Seja para dar um commit nas alterações, fazer uma consulta no banco de dados, ou simplesmente [**procurar por um arquivo**], o terminal está presente. Apesar de muitos não gostarem, ou terem medo de usar o terminal, este pode ser uma ferramenta poderosa.

> _"Mas se hoje em dia possuem interfaces gráficas, por que utilizar o terminal?"_

Algumas interfaces gráficas, apesar de ajudarem muito, não são muito intuitivas, ou são muito lentas, seja para iniciar, carregar módulos, ou outras coisas. Ou então, queremos aprender como as coisas funcionam no seu core.

Com o terminal temos um resultado mais direto e, algumas vezes, mais rápido do que pela interface gráfica, apesar de não ser tão bela a apresentação. Além disso, podemos realizar algumas tarefas com poucos comandos, ou, até mesmo, criar os nossos próprios.

Quando falamos em terminal, logo já vem uma imagem de alguma distribuição Linux na cabeça, porém podemos utilizar o terminal no Mac também, alguns comandos são idênticos entre esses sistemas.

No Windows, também temos a possibilidade de utilizar o terminal, nele é chamado de **cmd**, ou **prompt de comando**, porém no Linux e no Mac essa prática é mais comum. Por isso, os comando que veremos pelo terminal poderão ser usados no Linux e no Mac, mas não são compatíveis com o Windows.

Mas então, como começar a utilizar o terminal?

## O primeiro passo…

A primeira coisa que devemos saber sobre o terminal é que podemos fazer tudo que fazemos no ambiente gráfico. Desde buscar, criar e editar arquivos e diretórios, obter informações do sistema, criar usuários e grupos, a até mesmo acessar um site na web.

É importante saber onde estamos, isto é, em qual diretório estamos. Quando abrimos o terminal, na maioria das distribuições Linux, vamos estar na pasta `home` do usuário que estamos utilizando.

imagem:

`pwd`

imagem absoluto até o diretório que estamos. Já sabemos onde estamos, mas qual será o conteúdo do nosso diretório? Podemos falar para o terminal listar (`ls`, list) o seu conteúdo:

`ls`

imagem:

`cd Docker/`

imagem, até os arquivos ocultos .

`ls -a`

imagem onde podemos colocar nossos arquivos de estudos:

`mkdir Estudos`

imagem o nosso arquivo `estudos.py` para dentro do diretório `Estudos`, assim não precisamos criar outro arquivo:

`mv estudos.py Estudos/`

imagem e pedir para o terminal renomear (`mv`) meu arquivo de `estudos.py` para `coletando_dados.py`:

`mv estudos.py coletando_dados.py`

imagem um arquivo:

`rm coletando_dados.py`

imagem.

imagem.

`cat wordpress.yaml`

imagem o terminal.

`clear`

![]

![]

Existem diversos outros comandos e usos para o terminal. Podemos copiar arquivos e diretórios, acessar outros [computadores remotamente], [editar] e [procurar arquivos], atualizar o sistema, particionar e formatar HDs e pendrives, entre diversas outras coisas.

Se interessou em descobrir o poder do terminal? Aqui na Alura temos um [**curso sobre Linux**] onde você aprenderá sobre esses e muitos outros comandos para utilizar o terminal.

Se você quiser se aprofundar um pouco mais no terminal, temos a [**formação sobre a certificação LPI Linux Essentials**]. Nela, você aprenderá sobre a filosofia open source, sobre como utilizar o terminal para realizar diversas tarefas, como buscar ajuda pelo terminal, como trabalhar com arquivos e diretórios, permissões e segurança, entre outras coisas.




Aqui eu converso com a Roberta Arcoverde, engenheira da Stackoverflow, sobre o que é trabalhar remoto, como isso funciona, como ficam as reuniões, as relações humanas e outros detalhes do **trabalho remoto**:

https://www.youtube.com/watch?v=V0FuAukFSzc

Abordamos desde assuntos simples como comemorações e a necessidade do cara a cara, até problemas de fuso horário e produtividade. E temos uma discussão mais aprofundada nesse podcast, juntamente com Mauricio Linhares, que trabalha da Philadelphia para uma empresa que tem sede em New York:

<iframe src="https://open.spotify.com/embed-podcast/episode/0VFli4ZGxINwtOfWgYLUBZ" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>




imagem 

Durante nossos estudos não é incomum que tenhamos dúvidas e encontremos problemas durante o processo de aprendizado. Não temos um professor do nosso lado olhando nosso código ou observando o design que estamos criando. Como tirar dúvidas e encontrar soluções nestes casos? Recorremos aos fóruns e comunidades.

A comunidade de tecnologia com certeza é um lugar onde temos muitas pessoas que gostam de contribuir com o crescimento das demais. É com certeza um de nossos orgulhos na Alura.

A comunidade que se formou dentro do nosso fórum tem crescido e se tornado cada vez mais forte conforme o tempo vai passando. Porém, temos algumas dicas na manga pra você conseguir obter o melhor que essa comunidade pode oferecer. Vamos a elas?

## **1\. Seja específico.**

É muito fácil esquecer de descrever o problema que acontece com a gente especificamente. Mensagens do tipo "meu código parou de funcionar" sem muita especificidade do que é o problema dificulta a solução que já pode ser conhecida por alguém que está passando pelo tópico. O que podemos fazer para ser específico? Vejamos um exemplo:

> ### **Não consigo iniciar o projeto do curso de Spring MVC**
> 
> Olá, estou com problemas ao iniciar meu projeto como está no curso. Ao tentar iniciar o projeto, estou com erros.

No exemplo acima, estou sendo específico sobre qual passo estou tentando fazer e estou tendo problemas. Quero criar um projeto e estou com erros. O título descreve o que estou tentando fazer e em que tecnologia. O primeiro parágrafo fala mais um pouco, porém ainda sem muita descrição. Aqui entra nossa dica número 2.

## **2\. Seja descritivo, exponha os detalhes.**

Aqui a idéia é descrever tudo que está relacionado ao que estamos tentando fazer. Muitas vezes o problema está em algo que achamos não está relacionado. Usando o mesmo exemplo anterior, podemos melhorar a mensagem, incluindo as mensagens de erro e descrevendo nossas configurações.

> ### **Não consigo iniciar o projeto do curso de Spring MVC**
> 
> Olá, estou com problemas ao iniciar meu projeto como está no curso. Ao tentar iniciar o projeto, estou com os seguintes erros.
> 
> // mensagens de erro.
> 
> Atualmente estou usando Java 11 no Windows 10 com o Eclipse Juno, O Spring está na versão 5.0 e meu pom.xml está assim:
> 
> // código no pom.xml

Agora, além de ser específico sobre o que estou tentando fazer, ainda estou informando detalhes tanto sobre minhas configurações pessoais quando configurações do meu projeto.

Essas informações são ouro para alguém mais experiente, ele vai olhar a mensagem de erro e saber rapidamente como te ajudar, explicar os erros e apontar soluções.

## **3\. Se necessário, disponibilize seu projeto.**

Às vezes o problema precisa ser testado. Dependendo da linguagem de programação usada ou qualquer outro empecilho, a mensagem de erro pode não ajudar tanto e será preciso que a outra pessoa que pretende te ajudar tente executar o projeto.

Para isso, use o [**GitHub**] ou mesmo disponha um zip no [**Dropbox**] ou [**Google Drive**]. Poder baixar e executar seu projeto para tentar entender o problema é algo que pode facilitar muito. Não é um passo essencial como os dois primeiros, mas pode complementar.

Nos cursos de Design e Vídeos, esse passo é especialmente destacado, visto que alguém vai precisar ver o resultado do seu trabalho para tentar ajudar.

## **4\. Se fizer sentido, anexe imagens.**

Sites como [**pasteboard.co**] e [**imgur.com**] podem ser usados para fazer upload das imagens e seus links anexados no conteúdo da mensagem no tópico. Lembra do Dropbox e do Google Drive? Vale usar eles também.

## **5\. Verifique as respostas com atenção.**

Leia com atenção a resposta da outra pessoa, às vezes elas perguntam coisas que já resolvem o problema. Não é raro encontrar casos em que recebemos respostas pela metade, alongando o tempo para solução do problema.

Extra: Acha que essas dicas valem apenas para o fórum? De forma alguma. Valem para os emails que enviamos para o atendimento. Valem para outros fóruns e conversas com os amigos.

O que achou das dicas? Já se consegue ver usando elas para tirar suas dúvidas? Aproveite as dicas para tirar dúvidas agora mesmo abrindo um novo tópico em [**nosso fórum.**]




O GNU Image Manipulation Program, mais conhecido pela sigla [**GIMP**], é uma livre e poderosa ferramenta gráfica de manipulação _open source_ que pode ser usada para tudo, desde a manipulação de fotos à pintura digital. Em desenvolvimento desde 1995, é uma espécie de "Photoshop livre", com a vantagem de ser mais leve e conter atualizações e plugins feitos pelos próprios usuários que podem tornar o programa muito mais versátil.

Claro, como qualquer ferramenta poderosa, leva tempo para aprender suas funções. Foi pensando nisso que trouxemos neste artigo 10 dicas de GIMP para que você amplie seus conhecimentos sobre este software maravilhoso e gratuito.

## 1\. Camadas

imagem, configurá-las em grupos (a partir da v2.8), mexer com a opacidade ou transparência e muito mais!

## 2\. Mesclar a uma nova camada (e manter as originais)

imagem. Uma vez feito isso, vá em _**Filtro**_ ➢_** Melhorar**_, selecione _**Remoção de olhos vermelhos**_, e será disponibilizado um controle deslizante e um painel de visualização. Deslize o controle até que a descoloração seja removida, e pronto! Você está livre de olhos vermelhos em sua imagem.

## 4\. Criar marca d'água

imagem; digite seu texto (configure fonte, tamanho e cor como você desejar). Uma vez posicionada ao seu gosto, basta selecionar a camada de texto na barra lateral **_Camadas_** e controlar o nível de _**Opacidade**_ até a marca d'água se misturar bem com a imagem.

Caso queira um logotipo como marca d'água, vá em **_Arquivo_** ➢**_ Abrir como Camadas_** para inserir o logotipo à cena como uma outra camada, onde é possível redimensionar e reposicionar. Para finalizar, basta trabalhar o nível de opacidade pelas barras laterais novamente.

## 5\. Personalizar pincéis

O GIMP já vem com um conjunto predefinições de pincel, mas usuários também podem criar pincéis personalizados para seu próprio uso. A barra lateral na parte inferior esquerda da tela permite que você crie um novo pincel com base em formas geométricas, por meio de uma interface baseada em controles deslizantes e, em seguida, guarde-o para uso posterior.

Os usuários mais confiantes podem criar uma imagem em tons de cinza (com branco tratado como transparente e preto sendo a cor completa) e guardá-la como um arquivo de extensão .gbr.

## 6\. Remover cores

imagem. Isso cria uma camada virtual que controla transparência (preto na máscara) e opacidade (branco). Agora selecione a máscara (que deve aparecer como uma caixa ao lado de sua camada cinza), a ferramenta de pintura na cor preta e depois pinte sobre o elemento que deseja colorir a fim de revelar a camada de cor abaixo!

## 7\. Arredondar cantos

imagem e selecionar se deseja ou não adicionar algum plano de fundo atrás dos cantos curvos - a cor de fundo atual é usada para isso. Clique em OK para arredondar os cantos da imagem.

## 8\. Reatribuir atalhos

No GIMP você pode remapear seus atalhos de teclado selecionando _**Editar**_ ➢_** Atalhos de teclado**_. Por exemplo, para mapear a combinação de teclas Ctrl + D para a opção _Selecionar ➢ Nenhum_, clique para abrir o menu _Selecionar_, localize a opção _Nenhum_ e clique nela para que as palavras Novo Acelerador apareçam na coluna Atalho.

Em seguida, pressione a tecla para usar – por exemplo Ctrl + D, que é o equivalente no Photoshop. Uma vez que esta combinação de teclas já esteja sendo utilizada, um aviso aparecerá. Se estiver satisfeito com a substituição do atalho, proceda à atribuição da nova tecla.

## 9\. Plugins do GIMP

Como muitos outros programas, o GIMP é projetado para ser capaz de aceitar plugins, ou seja, extensões do programa que podem adicionar funcionalidades extras. O [**GIMP Plugin Registry**] é uma coleção gigantesca de extensões, tais como filtros, scripts e etc.

Precisa de um plugin para executar operações em lote através de um conjunto de imagens? Procurando por efeitos de filtro, variantes de pincel, scripts automatizados, e muito mais? O GIMP Plugin Registry é um bom lugar para começar.

## 10\. Recursos adicionais: GIMP portátil

O [GIMP portátil] é perfeito para uso em uma unidade USB, permitindo levar este ótimo editor de imagens para qualquer lugar. Pode até mesmo manter seus plugins e pincéis favoritos, tendo à disposição toda a suíte de ferramentas de manipulação de imagens com você.

Com essas 10 dicas de GIMP, você viu que é possível atuar na área de [**tecnologia**] e/ou [**design**] sem a necessidade de uma ferramenta como o Photoshop que é paga. Em outras palavras, vimos uma amostra do que esse pacote versátil de manipulação de gráficos é capaz mesmo sendo gratuito.






Não importa se você quer investir numa [**carreira como freelancer**] ou está procurando um trampo fixo, se trabalha nas áreas de fotografia e design, construir um bom portfólio online pode render muitas oportunidades de trabalho. 

No artigo de hoje, você vai saber como expor o seu trabalho nas plataformas mais tradicionais e também vai conhecer algumas que ainda não fazem tanto sucesso por aqui, mas que valem a pena para acompanhar o que o que os gringos estão produzindo na sua área. Então, vamos lá!

## Se você quer divulgar suas fotos, use:

### Flickr

Essa é uma das primeiras redes sociais voltadas para a exposição de fotografia profissional. É uma ótima opção para quem quer criar um portfólio online, já que ela permite a divisão por assuntos, temas e pastas, além de apresentar detalhes como, por exemplo, qual o equipamento e as configurações utilizadas para fazer a imagem.

É interessante dizer que o [Flickr] apresenta várias possibilidades de licenças de uso para compartilhamento de uma foto. Inclusive, não faz muito tempo que o site incluiu dois novos tipos: a licença de domínio público e a licença sem nenhum direito reservado (ou [CC0]).

### 500px

Mais recente e menos popular que o Flickr, a plataforma [500px] (lê-se 500 pixels em português) nasceu em 2009 com a promessa de se tornar uma rede social para fotografia “de verdade”, em resposta ao Instagram.

De qualquer forma, ela conta com uma grande quantidade de usuários que compartilham suas melhores fotos no intuito de divulgar trabalhos, fazer parcerias e também de vender fotografia. Sim! É possível comercializar fotos por lá como se fosse um [banco de imagens]. É legal ir a fundo e pesquisar tudo sobre a plataforma, que tem funções gratuitas e outras pagas.

### Instagram

Ninguém duvida que o [Instagram] nasceu para o compartilhamento de fotografias, certo? Pois bem. A rede social, que hoje pertence ao Facebook, é uma ótima opção para divulgar seu trabalho ao público final. O aplicativo também oferece a alternativa de criar uma conta empresarial, facilitando acompanhar o engajamento dos seus seguidores.

No começo, era vista como uma rede social para fotografia amadora. Porém, com o passar do tempo, fotógrafos profissionais também começaram a tirar proveito da plataforma para divulgar seu estilo de trabalho usando as hashtags.

## Se você quer divulgar seus jobs de design, use:

### DeviantART

Conhecido como um dos sites com o maior número de imagens voltadas para designers, o [DevianART] permite o compartilhamento de trabalhos em uma rede composta por milhares de pessoas, que participam votando nos materiais enviados para a plataforma.

Existe uma espécie de [comunidade brasileira] formada por artistas e estudantes dentro da rede social. Para que seu trabalho seja aceito pelo grupo e exibido na plataforma, é preciso conquistar pelo menos três votos. O site também aceita fotografias, mas ele está mais difundido entre os profissionais do design.

### Behance

Também muito difundida entre os designers, a [Behance] é uma rede social extremamente voltada à composição de portfólio. Em diversos sites de jobs e [**freelas**] dessa área ela é indicada para essa finalidade.

Além disso, permite acompanhar o trabalho de outros artistas, curtir, comentar, entrar em contato e compartilhar as imagens em outras redes como Facebook e Pinterest. Conhecido como o [**LinkedIn**] dos criativos, o site na verdade possui uma parceria com essa outra plataforma, permitindo a publicação simultânea de conteúdo.

### Cargo

Outra rede social voltada para os designers é a [Cargo]. Para publicar imagens na plataforma é necessário passar por uma avaliação, mas o acesso aos jobs de colegas é totalmente free.

Uma vantagem em relação aos outros sites é que neste você terá uma URL exclusiva para divulgar o conteúdo que produz. A plataforma promete ainda uma boa variedade de templates personalizáveis para ajudar quem quer divulgar seus trabalhos.

## Se quiser divulgar os dois tipos de trabalhos, use:

### Tumblr

O [Tumblr] é conhecido como uma rede social de microblogs. O foco aqui são conteúdos multimídias, já que a plataforma permite a inserção de texto, imagens, vídeos, GIFs etc. Ao fazer a sua inscrição, você terá um endereço assim: “onomeescolhido.tumblr.com”.

O legal é que é possível personalizar os temas disponíveis de acordo com o seu gosto (alguns são pagos). Algumas pessoas usam o Tumblr para divulgar projetos específicos, que vão sendo desenvolvidos ao longo do tempo. Outras, usam como portfólio ou blog.

### Pinterest

O [Pinterest] é como um mar de referências. Usado tanto por fotógrafos quanto por designers e outros profissionais, essa rede social tem crescido nos últimos anos. A cultura do DIY (faça você mesmo) alavancou as inscrições de pessoas em busca de dicas.

Também oferece a possibilidade de organizar o material em painéis e inserir palavras-chave para direcionar as buscas. Os usuários do Pinterest podem guardar os “pins” que mais gostam para vê-los mais tarde. É a oportunidade de tornar o seu trabalho referência para outras pessoas e profissionais.

### Facebook

Deixamos por último a rede social mais popular que existe, o [Facebook]. Essa é uma das melhores ferramentas de divulgação de trabalhos, seja qual for. As fanpages são utilizadas tanto por empresas, quanto por artistas e profissionais liberais para atrair curtidas.

Com foco em imagens e acessada diariamente por milhões de pessoas, essa rede social merece a sua atenção. Embora tenha um mercado de anúncios pagos funcionando dentro da plataforma, é possível usufruir das ferramentas orgânicas de divulgação: publicar, curtir, compartilhar e marcar seus clientes, por exemplo.

Por fim, podemos afirmar que a associação entre imagens e redes sociais é fundamental para quem trabalha com fotografia e design. Sem dúvida, esses meios de comunicação surgiram para estreitar as relações e abrir novos caminhos profissionais.

Não precisa se engajar em todas as redes que citamos aqui, mas entenda o funcionamento de cada uma e escolha aquela que se encaixa no seu perfil.

Já que estamos falando de imagens e redes sociais, fique à vontade para compartilhar o nosso artigo. Assim, os seus colegas de profissão também poderão entender a importância de expor os trabalhos nesse universo cheio de possibilidades que é a internet!

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Quando estamos desenvolvendo um sistema web, eventualmente nos deparamos com os dados de autenticação dos nossos usuários: normalmente login e senha. Vamos fazer um pequeno exercício mental para verificar o quão seguros esses dados estão.

Pense por um instante nas informações mais importantes que **você** tem em um serviço online. Talvez seja seu email, talvez uma conta na sua rede social preferida, talvez alguma aplicação bancária. Pense na senha que você utiliza para esse serviço e, em seguida, lembre todos os outros serviços nos quais você utiliza essa mesma senha. O que aconteceria hoje se as informações guardadas em qualquer um desses bancos de dados vazassem? Muito possivelmente seus dados de login e senha do serviço principal também estariam comprometidos.

Vemos sempre por aí notícias de alguns sites famosos que sofreram algum vazamento de informações, como [**Dropbox**], [**Patreon**], etc..

> Inclusive, você já checou se você foi vítima de algum vazamento de informações? Dê uma olhada no site "[Have I been pwned?]" e descubra.

Para resolver esse problema, temos uma solução que funciona como no mundo real. Você utiliza chaves diferentes para abrir a sua casa, o seu carro, o seu armário, etc. No mundo virtual, temos a mesma solução disponível: um chaveiro eletrônico. Um software que gerencia senhas aleatórias e seguras e, mais importante, diferentes para cada um dos serviços que você queira utilizar. O meu chaveiro favorito é o [**KeePassX**], mas também existem vários outros por aí.

Pronto. Problema resolvido. Nossas senhas já estão guardadas em um chaveiro. Então discussão encerrada, certo?

Hmmmm, vamos com calma... Apesar da solução do chaveiro ser definitivamente superior, sabemos que a esmagadora maioria dos usuários nunca nem ouviu falar dela. Alguns até ouviram falar mas não utilizam. Usuários esses que utilizarão nossos serviços com a mesma senha que utilizam nos serviços que consideram mais importantes. Quem sabe o serviço mais importante de um usuário não seja exatamente o seu!

Para garantir que o seu serviço tenha uma ótima qualidade e seja confiável, precisamos garantir que os dados dos usuários estejam muito bem protegidos. Além disso, se grandes empresas como Patreon e Dropbox tem seus dados roubados, temos motivos o suficiente para acreditar que nenhum sistema é impenetrável.

Então como podemos fazer para nos assegurar de que, mesmo que os dados de autenticação dos nossos usuários sejam acessados, não seja possível que algum atacante os utilize?

Imagine que os dados do seu usuário, ao invés de serem guardados assim:

imagem possa ler.

Vamos ver um exemplo de uma técnica bem simples, aplicada sobre a senha `password`:

imagem mas ficou muito mais difícil. Ele vai precisar do mesmo dicionário que você está utilizando e daí sair procurando palavra por palavra até encontrar uma que gere esse "código".

Essa é a ideia que chamamos de **função de espalhamento** (também chamado de função de _hash_). É um procedimento que recebe uma entrada e gera uma saída com algumas propriedades específicas: cada entrada gera sempre a mesma saída e, dado uma saída, é muito, mas muito difícil (vamos considerar que é impossível) descobrir qual foi a entrada dada.

Nas funções de espalhamento que vamos utilizar, ainda temos outras propriedades que nos ajudam mais ainda, por exemplo, a propriedade do **caos**. Ou seja, uma pequena alteração na entrada gera uma alteração muito grande na saída, o que dificulta mais ainda o trabalho do atacante.

Um exemplo de função de espalhamento é o algoritmo [**MD5**], que transforma o texto `Ola, mundo.` nesse hash: `fda090a568170fdc553dc4223ca9e367` e o texto `Ola, Mundo.` nesse outro hash: `e372160d7e067a6c4b917e459a70a2e9`. Como podemos ver, a diferença entre os dois hashes gerados é muito grande, apesar da pequena mudança na entrada de apenas 1 bit (Note que mudamos a letra `m` para `M`).

### Adicionando um tempero ao Hash

Qual será que é a senha equivalente ao hash `6fd720fb42d209f576ca23d5e437a7bb`?

Se você tentar algumas das [**senhas mais usadas**], vai eventualmente descobrir que utilizamos a string `senha` e o MD5 para calcular esse hash. Ou seja, se um atacante tiver acesso ao seu banco de dados e descobrir que você está usando o MD5, logo vai fazer um catálogo das senhas mais famosas hasheadas em MD5 e fazer uma busca no seu banco de dados.

Assim, novamente, o atacante conseguiu identificar as senhas dos usuários. Mais do que isso, já existem grandes tabelas relacionando senhas e hashes pela internet. Elas se chamam _Rainbow Tables_. É fácil encontrar uma tabela de gigabytes de senhas e hashes que facilitam a busca de qualquer atacante com acesso ao seu banco de dados.

Poxa, mas agora complicou. Como fazemos para evitar esse tipo de tabelas?

A solução é adicionar um certo "tempero" à nossa string original, ou também "**sal**", como é conhecido. A ideia aqui é jogar uma pitada de aleatoriedade à senha do usuário, para que ela não apareça numa _Rainbow Table_. Por exemplo, se a senha original era `senha`, nós sorteamos uma string `JBjGSJKcVf` e concatenamos à string original, tendo `JBjGSJKcVfsenha` como string final. Assim, a propriedade do caos da função de espalhamento garante que essa nova string terá um hash completamente diferente da string original.

No caso, utilizando o MD5 e a senha sem sal, temos:

`senha` -> `6fd720fb42d209f576ca23d5e437a7bb`

Já com o sal, temos:

`JBjGSJKcVfsenha` -> `af34077cca67787a67faf84d044285e7`

### Melhorando o tempero

Olhando a imagem do nosso banco em texto aberto, vemos que a Maria tem duas contas com a mesma senha: `login: "maria"` `senha: “senha”` e `login: “outraContaDaMaria”` `senha: “senha”` porém no banco criptografado, temos dois hashes diferentes:

`login: "maria"` `senha: “$2a$10$OTPxoxsAf18ZSQMD/EOwkeub7TKjNduBn5sY/tSd1SmkUhc54ap9.”`

e

`login: "outraContaDaMaria"` `senha: “$2a$10$C3aGfh2ZRVf7d64jJgS36e90Gz.xxg/GkB8WwNFFSd0WeHhSX9Zb.”`

Isso é uma outra técnica que podemos utilizar para atrapalhar mais ainda o atacante do nosso banco de dados. Agora, mesmo se ele conseguir decodificar uma senha comum, ele não terá acesso às outras contas que utilizam essa mesma senha. Como os usuários tem o péssimo hábito de usar senhas comuns e repetidas, isso é um grande avanço no nosso sistema.

Isso é feito utilizando um **sal diferente** para cada senha, o que acaba criando hashes completamente diferentes para duas senhas iguais temperadas com um **sal diferente**. No caso do nosso banco, esse sal é guardado junto com o hash.

Bom, ganhamos bastante segurança mas agora precisamos desenvolver uma função de espalhamento, guardar o sal de cada uma das senhas e escrever os métodos que fazem tanto o hash da senha quanto a autenticação de um usuário. Aí vem a pergunta...

### Como usar isso no meu projeto?

Escrever o nosso módulo de segurança do zero, que inclui uma função de hash, um jeito de inserir um usuário novo e um jeito de autenticar um usuário existente é muito complicado e muito propenso a erros, então é recomendável utilizar uma biblioteca já existente para fazer esse trabalho.

O padrão BCrypt é um ótimo método e existem implementações dele nas mais variadas linguagens.

Em Java, por exemplo, você pode adicionar a biblioteca jBCrypt e utilizá-la com um código bem simples, que utiliza as funções `BCrypt.gensalt`, `BCrypt.hashpw` e `BCrypt.checkpw` para gerar o sal, gerar o hash e checar uma senha candidata, respectivamente. A biblioteca é livre e pode ser baixada diretamente em seu código fonte no [**site oficial do projeto**]. Um exemplo de como ficaria o código é o seguinte:

java

### Agora é hora de deixar o seu projeto mais seguro!

Nesse post vimos alguns casos em que a segurança dos dados dos usuários, apesar de ter uma importância muito grande, foi deixada de lado causando alguns problemas para os próprios usuários e também para as empresas envolvidas.

Aprendemos como funciona a criptografia de mão-única, utilizando um sal aleatório e individual para cada senha e como ela protege a senha dos nossos usuários. Note que nem mesmo o desenvolvedor do sistema tem acesso à senha uma vez que ela está no banco!

Por fim, vimos o padrão BCrypt e a biblioteca jBCrypt que facilita o nosso trabalho e está disponível para várias linguagens de programação.

Para aprender mais sobre autenticação de usuários e segurança de informação no geral, a Alura tem vários cursos que vão desde a explicação de como ser [**seguro na web**] até a implementação na tecnologia específica, como o [**Java**], o [**Spring Framework**], o [**Play Framework**] e também utilizando o [**ASP.NET**] para você que utiliza o C#.




Esse é o primeiro codigo Java!

java

Compile com:

```
javac Xpto.java
```

E rode com:

```
java Xpto
```




Quando todos esses requisitos são cumpridos, nós conseguimos facilmente utilizar os sons gravados, editá-los, aplicar efeitos e obter um bom resultado com a mixagem do audio. Porém, se um desses fatores atrapalhar a gravação, devemos jogar fora o audio e iniciar o processo novamente. Mas e quando regravar não é uma opção? Quando precisamos obter o melhor resultado possivel com um audio que não foi captado corretamente?

Algumas semanas atrás, passei por isso, gravei em um estudio uma locução para um de nossos cursos da Alura, porém, esqueci de desligar o ar condicionado. Agora tenho um audio com um ruído de fundo, que além de ser incomodo, deixa minha produção pouco profissional.

Para tentar solucionar o meu problema vou abrir esse audio no Adobe Audition, assim que abro esse audio com o software aparecem uns rabiscos de verdes no que parece ser uma linha do tempo. Arrastando meu mouse consigo perceber que esses rabiscos são a representação do meu som, mas o que exatamente eles significam?

![image00]

Para analisar melhor vamos expandir essa visualização. Chegando mais perto já conseguimos perceber que esse rabisco na verdade é uma onda, que vai pra cima e volta pra baixo. Mas porque uma onda? Não existia uma maneira mais simples de representar um audio?

![image01]

**Na verdade essa é uma representação bem fiel de como um audio funciona. Todo som que ouvimos é uma onda viajando pelas moleculas de ar, água ou materiais sólidos e chegando aos nossos ouvidos. A a distância entre os picos vai dizer se esse som é agúdo ou grave e a altura das ondas vai definir o volume do nosso som.**

Para remover o ruído precisamos identificar as ondas de ruído, e então remove-lo das outras ondas. Vamos selecionar a parte do audio em que temos apenas ruído do ar condicionado, clicando e arrastando esse pedaço. 

**Depois precisamos garantir que o software salvou esse pedaço na memória, para fazer a comparação. Então clicamos com o botão direito e selecionamos "Capture noise print". Pronto, temos esse trechinho de audio salvo, precisamos agora comparar com o restante do audio para remover esse ruído.**

![image02]

O que quero fazer é comparar com o audio todo não apenas com um trecho, então vou selecionar o audio todo. Agora que tenho meu trecho selecionado, preciso navegar até a aba Effects, e como preciso reduzir o ruído a opção que vou selecionar tem esse nome mesmo redução de ruído, só que em inglês "Noise Reduction", e de novo Noise reduction process.

![image03]

Agora uma nova janela foi aberta onde o processo de remoção do ruido já foi iniciado, se você pressionar o play no canto inferior direito vai notar uma mudança no som, o ruído foi retirado e com ele alguns pedaços da voz, para conseguir notar essa diferença melhor ligue a opção "Output noise only"

![image04]

O que acontece é a comparação das ondas ruído que captamos com as ondas desse audio todo,após essa comparação o software extrai as ondas de ruído de todo o restante. Por isso o efeito em nosso audio principal pode ser uma distorção, dependendo da quantidade de redução que selecionarmos e o quanto gostariamos de abaixar o volume desse ruído.

**Para conseguirmos refinar essa redução e diminuir os efeitos negativos em nosso audio podemos utilizar os recursos Noise Reduction e Reduce By da ferramenta. Aproveite para mover os seletores das ferramentas e notar as diferenças que são causadas no som. O recomendado é sempre mantermos um pouco do ruído neste audio, com uma limpeza completa o audio vai soar "falso" e incomodo.**

Um bom audio é fundamental para um vídeo de qualidade, e com a redução de ruídos conseguimos recuperar materiais que poderiam ser descartados na edição. Se você deseja aprender mais sobre edição de vídeo, motion graphics e edição de audios para video confira a [**Formação Edição de Vídeos**] da Alura.




Construir uma carreira na área de tecnologia é o sonho de muitos jovens. Existem diversos motivos para essa escolha, tais como, habilidades em lidar com códigos, computadores e redes. Além disso, o [mercado de TI é um dos que continuam em crescimento], mesmo em tempos de crise econômica.

Outro ponto a destacar da área diz respeito às [remunerações], como há carência de profissionais especializados, a tendência é sempre existirem vagas em aberto e, consequentemente, salários mais elevados.

Porém, para conseguir ocupar uma das vagas disponíveis é preciso capacitação, muita vontade de aprender e atualização contínua. 

## Invista em capacitação para seguir carreira na área de tecnologia

**A área de tecnologia está em constante mudança e evolução. Sempre há alguma atualização em um processo, software ou linguagem de programação utilizada. Os profissionais que desejam encontrar uma boa oportunidade de emprego precisam estar em sintonia com as demandas do mercado e saber falar a linguagem das empresas.**

Para suprir essa necessidade, a melhor forma é investir em cursos de capacitação, que apresentam um panorama completo e atualizado sobre a área que pretende atuar. Logo, a maneira mais prática de estudar é por meio dos cursos on-line. Com a facilidade de estudar de casa ou de onde preferir, é possível conseguir a formação em diferentes segmentos e adquirir o conhecimento necessário para atuar profissionalmente em vários projetos.

Por exemplo, para quem pretende trabalhar com [**programação**] há uma gama de opções de cursos para aprender as linguagens exigidas pelo mercado e conseguir as certificações necessárias. Outra área que merece destaque é [**Design e UX**], que exige conhecimento de diversos softwares e ferramentas para executar os projetos.

Como a atuação desses profissionais será em meio digital, buscar a capacitação com os cursos on-line favorecerá a intimidade e a experiência com as ferramentas necessárias para o dia a dia no trabalho. Portanto, os jovens que pretendem encontrar o trabalho dos sonhos precisam investir em capacitação para sair à frente e conquistar os melhores postos.

## Busque experiência profissional

A experiência profissional é um ponto muito importante para conseguir um bom emprego na área de tecnologia. Mas é exatamente nesse ponto que muitos jovens, principalmente em início de carreira, ficam inseguros.

É preciso ter calma e pensar em todas as possibilidades para adquirir experiência. A primeira a destacar é a realização de estágios durante a fase universitária. O período de estudos será mais bem aproveitado se for aliado a prática profissional. Isso ajudará a obter mais conhecimento e noções sobre o mercado de trabalho, além da possibilidade de atuar lado a lado com profissionais experientes.

Além da atuação em empresas e agências, dentro da própria universidade é possível participar de diversas iniciativas e já conseguir atuar em projetos. Fora isso, há a possibilidade de estágios voluntários, que podem ser em ONG (Organização não governamental), associações assistenciais, entre várias outras. Essa é uma forma de enriquecer o currículo pelo conhecimento técnico e atuação solidária.

Fora o estágio, uma maneira de conseguir experiência e implementar o conhecimento adquirido na universidade e em cursos extras é desenvolver um projeto próprio. Nesse caso, não é necessário ser algo comercial. A proposta é que seja um piloto para demonstrar as suas habilidades.

As possibilidades para obter experiência não se esgotam por ai. Outra maneira é criar um site. Isso é bastante útil para [**programadores**], que podem demonstrar a habilidade e conhecimento das linguagens que domina. Os designers também pode se beneficiar ao criar uma página na internet.

Essa é uma forma de mostrar o domínio das regras de usabilidade, arquitetura da informação e beleza estética que os sites necessitam. Ainda há a possibilidade de criar um aplicativo mobile, que é uma área em franca ascensão.

Fazer um projeto particular, além de contribuir para a experiência profissional, conta como uma demonstração de proatividade, boa organização e disposição para aprender e desenvolver.

## Desenvolva um portfólio on-line poderoso

Outro fator importante para construir uma carreira na área de tecnologia é desenvolver um portfólio on-line poderoso. É nessa página que estarão relacionados todos os projetos executados ao longo da carreira, mesmo que sejam apenas trabalhos universitários e estágios.

Para ter uma ideia da importância do portfólio, algumas empresas só aceitam inscrição para as vagas de empregos se houver link para o seu perfil on-line, ou seja, é algo realmente fundamental.

Para que você possa criar o seu portfólio on-line, a seguir relacionamos algumas ferramentas que são muito úteis nesse processo:

- [Behance:] uma das ferramentas mais usadas por profissionais, principalmente, os designers. A plataforma é bastante simples de usar e é gratuita. Os trabalhos são separados por projetos e em cada um deles é possível incluir todo o material relacionado. A interface é limpa, organizada e bonita. Além disso, cada usuário pode ter um pequeno currículo com as informações básicas sobre a sua trajetória profissional.

- [Clippings.me]: apesar de a plataforma ter sido criada originalmente para jornalistas, atualmente, ela pode facilmente ser usada por profissionais da área de TI. Para criar o portfólio é possível incluir links para os trabalhos já feitos, sendo bastante útil para programadores e designers que podem indicar os projetos que desenvolveram. Além disso, os usuários podem escrever uma apresentação sobre as suas experiências na plataforma.

- [Coroflot]: essa é uma ferramenta especialmente indicada para designers. Com interface bastante simples de usar, possibilita o armazenamento de um número ilimitado de trabalhos. Além disso, os usuários podem obter dados sobre o tráfego de visitas nas páginas e acompanhar qual delas é a mais popular. Outra vantagem é que empresas como o Google e Apple usam o Coroflot para buscar profissionais de design.

## Mantenha uma presença on-line

Todo profissional da área de TI precisa manter uma presença on-line, mas isso não é apenas para fazer amigos ou conversar amenidades. Trata-se de formar networking e adquirir conhecimento.

**As redes sociais são grandes aliadas nesse ponto. Participar dos grupos de discussão é uma forma de acompanhar o que profissionais experientes estão falando, as suas recomendações, entender as demandas de mercado e também ficar atualizado sobre as vagas de emprego em aberto.**

Além disso, é uma maneira de conhecer pessoas que podem contribuir para encontrar um bom emprego ou mesmo indicá-lo para vagas. Outra maneira de manter a presença online efetiva é com um perfil de [**LinkedIn atualizado**], diversas empresas trocam o tradicional currículo pelo link dessa rede social.





Nesse artigo, aprenderemos a implementar uma solução mais adequada para a implantação de um sistema de notificação utilizando o [**FCM (Firebase Cloud Messaging)**].

Lembrando que estarei utilizando o [**projeto (de teste) para a casa do código**].

**O pré-requisito para configurarmos o firebase é pelo menos ter uma conta do Google para entrar no sistema. Caso não tenha, [crie uma conta].**

Nosso primeiro passo é entrar no [**console do Firebase**], pois é a partir dele que criaremos o nosso projeto:

imagem`:

groovy

Agora, vamos alterar o arquivo `build.gradle (Module: app)` do módulo, adicionando o plugin `'com.google.gms.google-services'`:

groovy

O **próprio Firebase** indica que adicionemos o plugin na parte de baixo do arquivo. Portanto, manteremos o plugin no final do arquivo. Por fim, clique em "Sync now" para sincronizar a configuração que realizamos.

Após a sincronização, no console do Firebase, clique em "FINALIZAR":

imagem`:

java

Esse método pode ser chamado a partir das seguintes ações.

- Deletando o [Instance ID].
- Restaurando a App em um novo dispositivo.
- Usuário deletando ou reinstalando a App.
- Usuário limpando os dados da App.

A próxima classe que criaremos é a `CDCMessasingService` que estenderá da classe `FirebaseMessagingService`:

java

Essa é a classe que ficará responsável em receber as mensagens do Firebase, ou seja, a partir dela, a nossa App ficará escutando qualquer requisição referente às mensagens vindas do FCM.

Por fim, precisamos informar ao Android que essas duas classes que criamos, serão [**Services**], ou seja, elas ficarão funcionando em background sem nenhuma intervenção do usuário em interface gráfica! Mas como fazemos isso? Simples! basta adicionar no `AndroidManifest.xml`:

xml

Agora sim podemos testar a nossa App. Ao abrir o emulador, ou então, no seu próprio celular, desinstale a App para garantir que Firebase gere o token sem nenhum problema. Então rode a App:

imagem

Além de enviar notificações via console, podemos também enviar via [**HTTP**] ou [XMPP].

No próximo post veremos como podemos [**receber e exibir uma notificação também em foreground**], isto é, com a App aberta.

E aí, o que achou do Firebase? Pretende utilizá-lo nos seus projetos atuais ou futuros? Deixe seu comentário sobre o que achou ou sua experiência durante a implementação.

Curtiu essa dica? Quer aprender mais ou iniciar sua carreira como um dev Android? na Alura, agora temos [**uma formação Android**], onde você aprenderá a criar a sua App do início ao fim com muita prática!





imagem 

Estava jogando RPG com uns amigos outro dia. Era um RPG clássico de mesa. Nesse jogo, éramos personagens em uma época medieval, cavaleiros, magos, entre outros personagens.

Como estou estudando Scratch, resolvi começar a criar uma animação contando uma parte da história que vivemos, mas como podemos criar nossa história?

## Era uma vez…

Como começar uma história? "Era uma vez em uma terra muito distante…", ou então, “Em uma galáxia muito distante...”. Essas são algumas das formas que temos para começar um conto.

Toda narrativa se passa em um lugar, um bosque, um castelo, em uma galáxia, numa escola de magia e bruxaria… São tantos os lugares que podemos ambientar nossa história. No meu caso, essa história se passará em um acampamento.

Então, temos que falar para o Scratch que o `palco` de nossa história será esse acampamento:

![]

![]

Já temos um palco para a nossa história. Mas onde estão os personagens dessa história? Precisamos dizer ao Scratch quem são os atores:

![]

![]

Nessa parte do jogo, estávamos conversando sobre a nossa próxima missão. Os personagens ainda estão calados, precisamos fazer eles se dizerem alguma coisa quando o jogo começar. Vamos começar falando para a fada falar alguma coisa:

![]

![]

Nossa personagem está falando, mas o balão de diálogo não está sumindo… Precisamos que essa mensagem apareça só quando necessária e depois desapareça. Podemos adicionar um tempo específico para isso, então, dois segundos, por exemplo:

![]

Legal, agora ela diz sua fala e depois de um tempo o balão some. Mas só um personagem está falando. Como será que podemos fazer um diálogo entre eles?

Vimos que podemos adicionar o bloco `diga <alguma coisa> por <alguns> segundos` para fazer os atores falarem:

![]

Os personagens estão falando todos ao mesmo tempo, as suas falas se sobrescrevem.

Se fosse uma revista em quadrinhos, ou uma situação que quiséssemos simular confusão, faria sentido deixar todos os balões de falas aparecendo. Contudo, estamos desenvolvendo uma animação.

O legal é que cada balão apareça somente quando a outro balão sumir. Dessa forma, estamos criando uma progressão na conversa. Mas como podemos causar essa progressão?

## Luz, câmera e ação

Quando atores estão fazendo um filme, eles têm suas falas no roteiro. Quando um para de falar o outro começa. Isto é, um ator espera pelo tempo da fala do outro personagem para começar a falar.

Como o diálogo é uma sequência de falas, podemos falar para o Scratch que a fada começa a falar assim que o jogo começar.

Enquanto isso o outro ator fica parado, esperando a hora de sua fala:

![]

![]

Bacana! Conseguimos causar uma sensação de um diálogo, mas o que acontece se aumentarmos um pouco o tempo de fala da personagem que começa a cena?

![]

O outro personagem começa a falar antes do balão desaparecer. Como nós alteramos o tempo de fala do primeiro ator, temos que falar para o mago esperar um pouco mais:

![]

![]

Nesse caso temos apenas dois atores, mas o que aconteceria se tivéssemos dez personagens na cena com diálogos maiores?

Cada vez que alteramos o tempo de fala de um personagem, temos que alterar o tempo de espera de todos os outros atores, senão uma fala sobrescreverá a outra.

Se tivéssemos 100 personagens, imagine ter que repetir essa ação manualmente 100 vezes. Daria muito trabalho!

Então, o que nós podemos fazer para alterar o tempo que um personagem leva para falar sem ter que modificar o tempo dos outros atores?

## As falas que falam

Dizer para um ator esperar a fala do outro terminar para começar a sua é um pouco trabalhoso. Como vimos, se alterarmos o tempo de fala de um ator, temos que alterar de todos os outros.

O ator sabe o tempo de sua fala. E se conseguíssemos que a fala de um ator fosse o gatilho para a fala do outro? Por exemplo, se quando a fada parasse de falar ela enviasse uma `mensagem` para o mago dizendo que ele deve começar a falar.

Dessa forma, não importa se o tempo de fala da fada mude, pois ela só enviará a mensagem quando terminar seu diálogo.

Podemos falar para o Scratch que quando essa atriz parar de falar, envie uma mensagem para todos na cena dizendo que eles podem tomar alguma ação:

![]

O mago espera até receber essa mensagem e somente quando ele receber sua fala:

![]

![]

Dessa forma, se alterarmos o tempo de diálogo de um personagem, não precisamos alterar o tempo de espera dos outros.

Com mensagem, não deixamos as ações de um personagem tão dependentes das ações de outros. Isto é, dizemos que as ações dos personagem tem um baixo acoplamento.

## Para saber mais

Começamos a criar a cena com os nossos atores, porém ainda precisamos trabalhar em outros elementos. Podemos, por exemplo, mudar nosso cenário para passar uma sensação diferente aos espectadores. Como definimos um tempo para as falas sumirem, algumas pessoas podem não conseguir ler todo o texto antes disso acontecer.

Para evitar isso, nós podemos [**capturar um evento**] que altera as falas ou até mesmo que muda o placo. Além de histórias, o Scratch nos permite criar jogos, aprender lógica de programação, matemática e muitas outras coisas.

Aqui na [**Alura Start**], temos diversos cursos que utilizam Scratch. Neles, vocês vão aprender a como [criar um jogo 2d de naves espaciais], ou então um [jogo de cobrança de pênaltis]. Aprenderá sobre [**storytelling e técnicas de criar e contar uma boa história**], e muito mais. Gostou dessas técnicas de criar diálogos com Scratch? Não se esqueça de compartilhar conosco nos comentários. :D




Como melhorar a nossa produtividade de desenvolvimento de apps no Android ?

Durante o desenvolvimento da nossa [**lista de cursos**], vimos diversos assuntos sobre Android, como por exemplo, criação e personalização de uma lista e até nos comunicamos com apps externas... Porém, vamos verificar a quantidade de código que utilizamos para construir essa app simples. Começaremos pela nossa activity:

java

Agora o nosso adapter:

java

Vamos dar uma olhada nesse trecho de código:

java

Olha o tanto de código que escrevemos apenas para buscar uma referência de uma `ListView`. Agora vejamos esse outro trecho:

java

Perceba que para tarefas que são bem comuns como, por exemplo, pegar a referência de uma `View` ou criar um _listener_ para implementar um clique, estamos escrevendo muito código!

Será que não existe alguma biblioteca que nos ajude com esse tipo de tarefa? Pensando justamente nesse detalhe, o [**Jake Wharton**] desenvolveu a biblioteca [**Butter Knife**] capaz de facilitar todos esses procedimentos de pegar referência de `View` ou até mesmo implementar um _listener_.

Mas como podemos adicioná-la no nosso projeto? Vá em "File > Project Structure". Vá até o menu "app" e depois na aba "Dependencies":

imagem` da classe `ButterKnife` que recebe a `Activity` que ele precisa associar às `View`s, então podemos enviar a nossa própria `Activity`, ou seja, o `this`:

java

Agora precisamos modificar todas as nossas referências de `View` de variável local, para variável membro, ou seja, um atributo da nossa `Activity`:

java

Mas porque tivemos que fazer essa alteração? É justamente pela questão do Butter Knife utilizar [**annotations**] para associar as `View`s. Mas e agora? O que fazemos? Simples! Basta apenas adicionarmos a anotação `@Bind` passando por parâmetro o _id_ dessa `View`:

java

Só isso? Sim! Apenas isso já faz todo aquele código que escrevíamos por de traz dos panos! Podemos até apagar aquele trecho do nosso código. Vejamos o resultado da nossa `Activity`:

java

Você pode estar se perguntando sobre o motivo de um atributo não ser `private` e é justamente pelo motivo do Butter Knife não funcionar com o modificador de acesso `private`, ou seja, é aquele famoso "Trade Off": "ganhamos em um lado, porém perdemos em outro...".

O nosso código já melhorou um pouco, vamos verificar esse outro trecho de código:

java

Como será que podemos melhorar essa implementação toda? Vamos criar um método que descreve o que esse listener representa:

java

E agora? O que faremos? Da mesma forma que usamos uma anotação para pegar a referência de uma `View`, usaremos a `@OnItemClick` para representar o clique de um elemento de uma lista passando o id dessa lista por parâmetro:

java

Por fim, basta apenas transferirmos o mesmo código dentro do antigo listener para dentro do método `acessarUrl()`:

java

Pronto! Já podemos até apagar o listener antigo. Se testarmos nossa app novamente:

![tela-lista-personalizada2]

![abrindo-pagina]

A nossa app funciona normalmente! Porém agora vamos ver como ficou a nossa `Activity`:

java

O que achou? Bem mais elegante e de fácil compreensão! **O Butter Knife é uma biblioteca que faz a "injeção" de `View` que é justamente pegar todas as referências das `View`s de uma `Activity` e permitir o acesso por meio de anotações** que facilitam, e tanto, a nossa vida!

**O que você achou do Butter Knife? Gostaria de aprender mais sobre android? Que tal dar uma na [formação Android] aqui da Alura?**




imagem 

Como desenvolvedor Python, é possível que você já tenha se deparado com esse trecho de código, mas você sabe o que ele significa? 

Achei um programa em Python na internet com várias funções relacionadas a dados e taxas de moedas, que podem me ajudar no meu projeto pessoal de criar um conversor de moedas.

Baixei, então, o arquivo `info_moedas.py`, para utilizá-lo em meu projeto, especialmente uma função que pega a taxa atual de conversão entre duas moedas (`get_taxa_conversao()`). O arquivo principal do meu programa ficou assim:

python

Fui testar o programa e logo quando eu o abri, olha o que apareceu:

python 

Mas o quê? Apareceram dezenas de linhas com informações de muitas moedas, mas eu não pedi por isso! Apesar disso tudo, no final ainda apareceu o que a gente colocou… que estranho!

Resolvi checar o código que baixei da internet, então, e lá pro final encontrei uma linha solta bem curta:

python 

Essa linha executa uma função declarada lá no `info_moedas.py` mesmo, cheia de instruções, incluindo as de imprimir toda essa informação que a gente recebeu. Tudo bem, achamos o código que faz isso, mas por que ele está sendo executado em nosso programa?

A questão está no funcionamento do `import` no Python. Quando importamos um arquivo Python, estamos de fato executando o código dentro dele.

Assim, a instrução `import info_moedas` executa a linha `main()` do arquivo que eu baixei, fazendo aparecer tudo isso em nosso programa. Mas como podemos evitar isso?

Uma solução mais intuitiva seria simplesmente apagar a chamada da função `main()` do arquivo `info_moedas.py`. Isso aparentemente resolveria nosso problema, mas quebraria o código original que eu encontrei, o que pode acabar nos trazendo mais outras complicações no futuro.

O ideal seria simplesmente dizer para o Python, ao importar o arquivo, não executar aquilo ali. Será que é possível fazer isso?

## A variável __name__

No Python, arquivos `.py` são chamados de **módulos**. Cada módulo pode ser executado diretamente, como um programa em si, ou importado por outro módulo.

Precisamos, de alguma maneira, identificar essa diferença. Para isso, temos uma variável nativa que pode nos auxiliar nisso - a `__name__`, que nos indica o nome do contexto em que o módulo está rodando.

Resumindo, a variável `__name__` representa o nome do módulo. Entretanto, quando o módulo é executado por si só como um programa, `__name__` é definido para `’__main__’`, diferente de quando o módulo é importado, no qual o valor fica de fato igual ao nome do módulo.

Vamos testar isso fazendo um simples programa que apenas imprime essa variável. Chamaremos de `teste_name.py`:

python 

Ao executarmos esse programa com `python teste_name.py` na linha de comando, olha o resultado:

python 

Agora, se abrirmos o console do Python e importamos esse módulo, olha como fica:

imagem` dentro do bloco dessa condição:

python 

Fui rodar o meu conversor de moedas e, dessa vez:

python 

Toda aquela informação sumiu! Conseguimos o que queríamos ;).

Nesse caso esse condicional foi bastante útil pra gente, já que o código que estava rodando nem era nosso. Mas será que devemos usá-lo sempre? Quando e até que ponto ele pode ser bom?

## Quando usar a checagem de escopo de execução?

Agora que já conhecemos essa técnica, como sabemos quando usá-la? Um impulso inicial pode ser de colocar em todos os nossos programas, afinal uma verificação nunca vai fazer muito mal, mas isso nem sempre é o ideal.

Normalmente, conseguimos atingir um maior nível de organização de nosso programa se dividirmos em módulos diferentes o código que faz as definições e o código que executa o que foi definido.

Muitas vezes, então, a melhor abordagem acaba sendo ter um módulo em que apenas se define algumas funções, mas não se executa nada fora delas, para então ser importado pelos módulos que as executarão.

Nem sempre, entretanto, isso é vantajoso para nosso programa, o que nos traz de volta para o começo. Nesse caso, a convenção que vimos pode ser muito útil, seja por simples garantia de que um código não executará em um `import`, seja porque de fato queremos um comportamento diferente para diferentes tipos de execução do programa.

Ainda há casos mais específicos em que este teste é de fato necessário, como no [**caso do módulo multiprocessing**], que pode resultar em um `RuntimeError`.

Além disso, em testes simples e rápidos, essa única linha pode nos poupar bastante dor de cabeça!

## Conclusão

Nesse post, aprendemos um pouco mais de como o **import** funciona no Python e um de seus possíveis problemas. Assim, vimos qual a solução comumente usada pelos desenvolvedores, e quando devemos usá-la.

E aí? Já conhecia essa técnica? Se quiser se aprofundar mais em Python, dê uma olhada nos nossos [**cursos da Alura sobre a linguagem**] e continue estudando!




Bom... é verdade. Se alguém clica em **unsubscribe,** ele não está mais satisfeito com o conteúdo que está enviando... pode ser que você esteja enviando um conteúdo que não faz sentido nenhum, ai bobeou né, é hora de começar a melhorar seu conteúdo.

Pode ser também que ele clicou por engano... ou ele está tão animado que deu **forward** para um amigo, e este amigo clicou em _unsubscribe_. Ops! Ele nem queria dar _unsubscribe_!

Pode ser também que o momento da vida do assinante mudou. Antes ele se interessava por este conteúdo, agora ele se interessa por outro, e aí?

## O que devo fazer considerando todos esses cenários?

A sacada está em ter mais de um tipo de conteúdo disponível para seus **leads**. Ele deixou de se interessar por conteúdo básico de otimização de sites? Que tal oferecer o conteúdo de otimização de comunicação em redes sociais?

Ele deixou de se interessar por conteúdo básico de Java? Que tal oferecer uma assinatura de conteúdo de certificação Java?

Não tem ideia de como abordá-los? Então veja algumas dicas.

## Algumas técnicas para o e-mail de despedida

- seja curto.
- dê algum conteúdo novo.
- inclua um link para **resubscribe**, afinal pode ter sido um erro.

E escolha uma ou mais opções, sempre curtas:

- dê a opção para que ele siga seu blog.
- dê a opção de outra lista.
- peça para explicar o que fez ele parar de consumir seu conteúdo.

Veja o exemplo da lista de novidades do Alura, ao se descadastrar você recebe um e-mail de "tchau, muito obrigado e, se quiser mais informações, você tem outras opções":

![Unsubscribe]

Como vimos, existem diversas técnicas e boas práticas em uma ação de _mailing_, seja ela manual ou automatizada... e no dia-a-dia de criar os **mailings** do Alura e nossos cursos de boas práticas de e-mail marketing online, juntei diversas para você.

E aí, o que você escreverá no seu **goodbye e-mail**? E o que gostaria de ler nele? 





imagem 

No app Imagly a primeira versão da navegação utilizava apenas o side menu:

imagem.

imagem e o [Human Interface Guidelines] (Apple), uma das especificações que diverge em cada opção é a scrolllagem, que, para Android, pode existir, enquanto para iOS não.

No caso do iOS, recomenda-se que, para casos em que o menu precisar de mais itens a serem apresentados, inclui-se um dos ícones como "more" (mais), para mais opções.

imagem tem um bom aproveitamento de espaço do conteúdo e não ocultam a Tab Bar mesmo após a scrollagem.

Além disso, no Material Design temos as tabs e o bottom navigation, que comportam-se de formas diferentes. No caso das tabs, permanecem visíveis, porém o "cabeçalho" do menu é oculto, enquanto no bottom navigation temos o componente inteiro ocultado.

Essas são algumas das considerações e pontos sobre as Tab Bars que devemos prestar atenção quando decidimos desenvolver um UI utilizando esse recurso.

Ficar atento à utilização desse UI Design Pattern em cada tipo de SO é muito importante para aqueles que planejam utilizar componentes nativos de cada um, respeitando seus guidelines.

Também não podemos esquecer que a prototipação desses elementos contribui muito para compreender como faremos a composição de todo o layout do app.

Na Alura temos um curso que ensina justamente como trabalhar [**protótipos mobile no Axure**], que poderá te auxiliar na produção de protótipos navegáveis e dinâmicos.



Aprenda a solucionar essa questão, congelando um arquivo Python em um simples executável,com o **cx_Freeze** e compartilhe suas aplicações com mais gente!"

imagem 


Recentemente, andei trabalhando em um simples projeto em **Python** para cálculo de IMC. Meu código simplesmente pega o input de altura e peso do usuário e imprime o IMC com a fórmula **Peso / Altura²**:

python

O programa funciona bem, podemos até testar:

python 

Certo! Gostei do resultado e resolvi mostrar para alguns amigos. O problema é que, como eles não são programadores, não tinham **Python** instalado na máquina deles.

E agora? Vou ter que pedir para eles instalarem o interpretador Python, ou uma IDE, apenas para rodar meu pequeno programa? Ou pior, será que eu mesmo vou ter que instalar no computador deles, já que eles não entendem muito disso?

Dando uma olhada no meu computador, percebi que tenho vários programas instalados que executam arquivos sem a necessidade de eu instalar um interpretador ou algo do tipo. Como eles fazem isso? E se a gente fizesse o mesmo?

O ideal seria se conseguíssemos transformar nosso arquivo

`imc.py` em um executável mais genérico (como é qualquer executável no Linux, ou os `.exe` no Windows), que pudesse rodar sem problemas. Felizmente, isso é até que bem simples!

## Congelando nosso programa Python com o `cx_Freeze`

A ideia de transformar um programa`.py` em um executável comum não começou com a gente, como você deve imaginar.

Assim, hoje em dia já existem diversas ferramentas e scripts que podem fazer todo esse processo de conversão para gente, como o [**PyInstaller**], o [py2exe] e o **[cx_Freeze]**.

Usaremos o **cx_Freeze**, por ser multi-plataforma e de simples usabilidade. O primeiro passo, como sempre, é instalar esse pacote Python. Para isso, usamos o [pip], no terminal:

python 

> Em sistemas baseados em UNIX, é possível que esse comando necessite de permissão sudo para funcionar

Instalado o pacote, com um simples comando no terminal podemos já criar nosso executável. O comando base é simplesmente `cxfreeze`, mas, como queremos organizar um pouco melhor, usaremos a _flag_ `--target-dir` para indicar a pasta onde queremos que fique nossos arquivos:

python 

Depois de um longo _output_, a pasta `calculadora-imc` é criada. Dentro dela, temos a seguinte organização:

imagem é o executável.

Podemos até testá-lo:

imagem, ou até mesmo com pessoas que têm instalada apenas uma versão diferente da que trabalhamos em nosso código.

Por conta disso, vários scripts foram criados para converter um arquivo `.py` em um simples executável que poderia funcionar sem a instalação do Python. Hoje, abordamos o **cx_Freeze**, que é multiplataforma e bem simples de usar!





No [**artigo sobre arrow functions**] criamos um módulo para imprimir o código da turma e o nome dos funcionários da escola. Agora o back-end precisa utilizar esse mesmo módulo, mas por enquanto o nosso código só funciona no lado do navegador.

O back-end possui um único arquivo chamado `app.js` e o que queremos é encontrar uma maneira de reutilizar nosso módulo dentro desse arquivo sem precisar reescrever a classe novamente. Como podemos fazer isso?

## Importando nosso código

Como o back-end é escrito em [**node.js**], podemos fazer uso de uma função chamada **require** que vai ser responsável por chamar o nosso módulo `moduloDeImpressao.js` para dentro do nosso `app.js`. É essa função que vai ler e interpretar nosso módulo. Assim podemos reutilizar o nosso código sem precisar reescrever a nossa classe.

js

![imagem do terminal com erro] 

Como podemos ver, algo de errado aconteceu. Se o **require** é o responsável por chamar o nosso módulo para a aplicação principal, por que então não conseguimos utilizar o método `imprime` para imprimir os nomes dos funcionários e o código da turma?

## Exportando nosso código

O **require** é responsável por interpretar e retornar o conteúdo do código para que possamos utilizar na aplicação principal, porém o que está acontecendo é que ele não está encontrado nada exportável dentro do arquivo, ou seja, nada está publico.

Para que o nosso código funcione na aplicação principal além de importar temos que lembrar de exportar também, ou seja, deixar o nosso código visível para a aplicação principal. Para fazermos isso utilizamos o [**module.export**], com isso nosso código fica da seguinte maneira:

js 

Agora conseguimos ver a saída:

![image alt text]

Com a utilização do `module.export` conseguimos atingir nosso objetivo que era tornar nosso código reutilizável sem precisar reescrever dentro da aplicação principal, mas como o `module.exports` funciona?

## Exports

O sistema de módulos do `Node.js` é responsável por criar o objeto `module.export` e o **export** aponta para esse objeto, podendo ser usado para **retornar funções e objetos** bastando somente adicioná-los ao export.

js

Como o exports é uma referência para o `module.exports` utilizamos essa sintaxe apenas para adicionar objetos e funções, se precisarmos exportar algo como uma classe vamos precisar utilizar o `module.exports`

Se ficou interessado em como o Node.js funciona e como você pode utilizá-lo melhor, aqui na **Alura** temos uma [formação desenvolvedor Node.js]. Nela, você verá **como criar um servidor web, trabalhar com persistência de dados, utilizar middlewares**, dentre outras muitas coisas.




Estou me preparando para a certificação da Oracle e tive que lidar com a seguinte situação:

Como pegar uma parte de uma `String`? Vamos verificar a classe `Livro`:

java

Adicionando um livro novo:

java

E essa descrição gigantesca? Vamos imprimir o livro e ver o que acontece:

java

Se apenas um livro já está ocupando todo esse espaço imagina uma lista com vários! Não vai ser nada legal... Que tal, no momento da impressão, **pegarmos apenas os 30 primeiros caracteres**? Podemos fazer isso utilizando o método `substring()` da classe `String`. Então vamos sobrescrever o método `toString()` da classe Livro:

java

Imprimindo novamente o livro:

java

Muito bom! Mas o que significa os parâmetros 0 e 30? O método `substring()` tem a seguinte assinatura: `substring(int beginIndex, int endIndex)`. O índice inicial começa no 0, por isso coloquei o 0 como primeiro parâmetro, mas e o segundo parâmetro? Vai até a casa 30? Vejamos:

imagem` também recebe apenas o índice inicial:

java

Imprimindo o livro novamente:

java

Ué, o que aconteceu??? Como podemos ver está faltando uma parte da descrição, ou seja, quando utilizamos o `substring()` com apenas um parâmetro, informamos que queremos que ele pegue o pedaço da `String` a partir do índice informado, ou seja, a partir do índice 30 até o final.

Legal, vimos que o `substring()` tem a capacidade de pegar um pedaço da `String` de acordo com o índice, mas por que eu devo sempre começar por 0? Vamos **supor** que precisamos fazer uma paginação pegando os 30 próximos caracteres de um texto e que agora o **índice inicial comece pelo 1** e o **índice final é incluso**:

java

Aparentemente melhorou, mas vamos verificar a segunda página:

java

E aí? Ele vai pegar 30 ou 29 caracteres? Agora vamos verificar com o padrão atual:

java

Veja que é bem mais natural entender que serão devolvidos os próximos 30 caracteres em cada uma das páginas. Devido a essa situação o padrão de iniciar pelo 0 e não incluir o último índice foi adotado!

Gostou do `substring()`? Quer aprender mais detalhes da linguagem Java e se preparar para a certificação da Oracle? Pensando nisso, o instrutor Guilherme Silveira criou a [**formação de certificação Java**] com 9 cursos preparatórios para a certificação da Oracle!




Uma empresa que vende roupas e acessórios criou dois novos modelos de saia e a equipe de marketing deles decidiu realizar uma campanha de um mês no Facebook Ads e Anúncios do Instagram com o objetivo de vender esses modelos.

Após o fim da campanha, a empresa queria saber qual retorno obteve dessas campanhas, ou seja, quantas saias, efetivamente venderam. Ou seja, descobrir quanto desse investimento retornou para eles.

Dentro do Marketing, existe uma maneira de calcular esse retorno, utilizando os dados investidos e o quanto a empresa adquiriu depois de uma campanha. A fórmula é a seguinte:

imagem. Além do investimento em hospedagem do site e domínio.

imagem, dá 5,66, o que significa que a cada 1 real investido, a empresa obteve R$ 5,60 reais de retorno. Como é um resultado positivo, a campanha gerou lucro para a empresa.

Por fim, para o cálculo do ROI no Marketing Digital é só utilizar a mesma fórmula do Marketing tradicional, porém, focando em um período ou campanha específica, e colocar no investimento tudo que foi gasto em plataformas digitais, o total gasto com anúncios nas redes sociais, em domínio e hospedagem de site. E o retorno obtido após durante o período ou campanha escolhido.

Se quiser saber um pouco mais de ROI e como ele pode ser aplicado em outros investimentos, este post te ensina a [**como calcular o ROI dos treinamentos online realizados na sua empresa**].

Caso também queira saber mais sobre como divulgar sua empresa nas redes sociais, aqui na **Alura** temos uma [**Formação em Social Media**]. Nela você vai ver como trabalhar, divulgar e impulsionar sua marcas nas redes sociais.




Ao pensar em uma carreira que envolva as redes sociais, você certamente se informa sobre a formação e os conhecimentos técnicos que ela demanda, não é mesmo? Mas e as habilidades que você precisa ter como [**profissional de social media**] para atuar nesse mercado? Isso porque, em uma área sempre em evolução, são elas que vão fazer você crescer, destacar-se e, claro, ter um bom retorno financeiro.

Neste post, apresentamos 7 habilidades do profissional de social media que vão te deixar por dentro de tudo o que é necessário para seguir essa profissão. Confira:

## 1 Ser heavy user de redes sociais

Pode parecer óbvio, mas ser um profissional de social media requer que você seja um **heavy user**, isto é, um usuário assíduo de redes sociais no seu dia a dia. Afinal, não se trata apenas de ter algumas contas no Facebook, no Twitter e no Instagram e monitorá-las no trabalho. Pelo contrário, é preciso passar boa parte do seu tempo em frente ao computador trabalhando, pesquisando, criando novas ideias e buscando na sua principal fonte, no caso a internet.

A cada dia, novas comunidades e aplicativos surgem e podem ganhar bastante popularidade o que certamente vai atrair potenciais consumidores da marca da qual você gerencia os perfis.

Logo, estar atento e ser proativo na sua rotina enquanto usuário dessas redes é o que vai lhe permitir se destacar frente a concorrência. Em outras palavras: é preciso saber explorar as mais diferentes ferramentas para se comunicar, interagir e conhecer melhor os seus seguidores e o que eles desejam.

## 2 Saber mexer em programas de edição

Além do exemplo anterior, é importante que você tenha familiaridade com programas de edição, especialmente os da Adobe (como o [**Photoshop**], o [**Illustrator**] e até mesmo o [**Premiere**]).

Isso porque, em situações como coberturas de evento e **ações de marketing** durante períodos sazonais como o Natal, pode ser necessário que você mesmo faça algumas edições em imagens ou pequenos vídeos, seja para corrigir a cor, tratar a luminosidade ou acrescentar legendas e ilustrações.

E isso não é válido apenas para quem trabalha em empresa ou como freelancer, mas também para quem atua em agência de publicidade e está acostumado em contar com o suporte de um ou mais designers para essas funções. Quanto mais conhecimento e capacidade de adaptação, melhor.

## 3 Dominar a língua portuguesa

Outra habilidade requerida para ser um profissional de social media é ter domínio sobre a língua portuguesa. E não se deixe enganar: isso não significa que você vai usar a norma culta ao publicar nas redes sociais.

O motivo disso é que você vai escrever posts, gerenciar campanhas online e, principalmente, interagir com os seguidores dos perfis em nome de uma marca, representando-a. Ou seja, qualquer equívoco cometido recai sobre a empresa, e não sobre você.

Por essa razão, é fundamental ter habilidade com o português para saber se expressar, não ser prolixo e evitar erros ortográficos e gramaticais que comprometam a imagem da empresa ou da figura pública que você maneja diariamente online.

## 4 Ter noções de marketing

Um aspecto muito presente na rotina do profissional de social media são os conceitos de marketing, especialmente o de [**marketing de conteúdo**] que serão aplicados desde o planejamento do material que será veiculado online até o controle de desempenho de cada ação pensada para as redes sociais.

Por esse motivo, você precisa ter noção dos conceitos e da aplicação dessa vertente para tirar o melhor proveito de cada ferramenta virtual ao interagir com os seus seguidores.

Dessa forma, é possível cativá-los com assuntos que sejam interessantes para eles e que fujam do modelo tradicional de fazer publicidade (muitas vezes considerado maçante e invasivo).

## 5 Atender e monitorar os clientes online

Outra habilidade indispensável é saber como monitorar o cliente, estando atento àquilo que o satisfaz ou não, e interagindo com os consumidores que querem ser ouvidos, especialmente quando eles têm dúvidas, sugestões ou reclamações.

Existe um conceito chamado **SAC 2.0**, que aborda justamente isso: estar presente online e analisar como a marca se comunica com os seus seguidores, não apenas vendendo produtos ou serviços, mas sim:

- criando laços e identificação;
- remediando crises de imagem;
- prestando um atendimento diferenciado que gere engajamento;
- e coletando o feedback das pessoas.

A partir disso, é possível utilizar todas essas informações obtidas diariamente em futuras estratégias de marketing que têm como objetivo fidelizar e conquistar esse público virtual.

## 6 Gerar e compreender relatórios

Gerenciar perfis nas redes sociais não se resume apenas à interação com consumidores e potenciais clientes ou publicar conteúdo diariamente.

Isso porque, por trás da gestão de qualquer página ou afim, há uma estratégia que busca alcançar algo — seja geração de leads, promoção de um produto/serviço ou criação de uma identidade, por exemplo.

Para tanto, é necessário checar se o planejamento e o conteúdo elaborados estão surtindo o efeito desejado. E a forma de conferir isso é por meio de relatórios gerados nos analytics das redes e dos programas vinculados a elas para programar posts e outros materiais.

A partir desses informes, você acompanhará o desempenho de diversas métricas, tanto do conteúdo orgânico quanto do pago (incluindo promoções e campanhas), como:

- alcance;
- cliques;
- curtidas;
- engajamento;
- menções;
- visualizações;
- e muito mais.

## 7 Ser um profissional de social media criativo e antenado

Por fim, ser um profissional de social media requer criatividade e estar sempre antenado, afinal, você vai trabalhar com criação de conteúdo. Portanto, é necessário que você não fique engessado ou sem material relevante para publicar, pois os seguidores podem perder o interesse e deixar de interagir com a marca.

Isso se torna mais grave graças:

- à efervescência de assuntos;
- à diversidade de postagens diárias no feed de notícias de cada pessoa;
- e à pressa em consumir que os usuários de redes sociais alimentam constantemente.

Ou seja, ser criativo é indispensável para se tornar relevante e gerar engajamento. Logo, essa habilidade envolve desde questões de produção, seja escrita ou visual, até o timing, isto é, aquela capacidade intuitiva de aproveitar assuntos virais e usar a isso a seu favor.

Como você leu, ser um profissional de [**social media**] significa estar antenado às novidades, disposto a se adaptar, ser proativo e dinâmico para representar uma marca online e garantir que não apenas a visibilidade dela, mas também o engajamento e a conversão sejam **métricas** sempre crescentes.

E, se você gostou deste artigo, não deixe de compartilhá-lo com os seus amigos que também estão interessados nessa área de atuação!




A primeira vez que um usuário entra no app Imagly, se depara com essa tela:

imagem

Trabalhando bem esse primeiro processo de onboarding (primeira experiência de navegação do usuário), conseguimos melhorar a UX. Para lapidar ainda mais a usabilidade do seu app, a Alura tem um curso de [**UX Usability**] muito interessante com mais orientações sobre essa etapa!





imagem 

Uma escola precisa imprimir uma lista de todos os funcionarios e o código da turma, e para realizar essa ação temos a seguinte classe:

js 

O problema é que após o teste inicial:

js

Está sendo mostrado no console o seguinte erro:

imagem =>`.

Mas a Arrow Function não é só uma maneira menos verbosa de escrever uma função, ela tem uma característica em particular que vai nos auxiliar em nosso problema: **o escopo léxico**. Mas como assim o **escopo léxico**?

## Escopo Léxico

Escopo léxico, significa que podemos acessar a propriedade **código** dentro do nosso forEach. O `this` não irá variar de acordo com o **contexto**. Agora o como o contexto\*\* \*\*do `this._codigo` é o da classe `MóduloDeImpressão` temos acesso a propriedade código:

js 

Agora que sabemos como funciona o`this` e a arrow function, vamos aplicar no nosso problema.

## Resolvendo o problema

Agora utilizando uma arrow function em nossa classe, temos acesso ao construtor no momento em que entrarmos no laço do`forEach`, porque o `this._codigo` vai estar sempre no contexto da classe `ModuloDeImpressao`.

Depois de aplicar a técnica da arrow function, nosso código ficou assim:

js 

Quando instanciamos um novo`ModuloDeImpressao`:

js

Temos como resultado no console:

![]

Ótimo, conseguimos resolver nosso problema com relação ao contexto do `this`! Agora já temos o código da turma e o nome dos professores.

## Outra solução

Além das arrow functions, outra maneira que podemos solucionar esse problema é através do método [**bind**], que vai fixar um valor para o `this`, assim ele não irá variar de acordo com o contexto em que está inserido.

js 

Como podemos ver, o `bind` vai passar um contexto para um função que não é dela, ou seja, o `this._codigo` dentro do `forEach` vai ter o contexto da classe `ModuloDeImpressao`.

## Para saber mais

As [**Arrow functions**] tem outras propriedades interessantes como:

- **Retorno:** Não precisamos declarar explicitamente o retorno quando temos um bloco apenas de código, a última expressão realizada vai ser o retorno da arrow function.

js 

- **Nome:** As Arrows functions ganham nome da variável atribuida quando da criação

js

- **Construtor:** Não é possível criar construtores com Arrow function

js

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação em desenvolvimento Javascript**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, dentre outras muitas coisas.




Na App que estou desenvolvendo para armazenar meus cursos realizados na Alura, fiz uma lista de cursos e listei alguns que realizei:

imagem` que nos permite criar um context menu para a `ListView`:

java

Porém, da mesma forma como vemos nos demais listener do Android, precisamos implementar a interface `View.OnCreateContextMenuListener()`. Portanto, faremos a implementação utilizando o recurso de classe anônima:

java

A partir do parâmetro `contextMenu` podemos criar opções para o nosso context menu utilizando o método `add`:

java

Note que enviamos 4 parâmetros:

- **1º parâmetro:** Refere-se ao `groupId`.
- **2º parâmetro:** Nesse parâmetro enviamos o `ItemId` que é justamente o **id do menu**, ou seja, é por meio dele que identificaremos esse menu.
- **3º parâmetro:** Nele informamos o `order`, ou seja, a posição que queremos ordenar o menu.
- **4º parâmetro:** Indica o nome que será exibido para o menu.

Note que tanto no `groupId` quanto no `order` colocamos o valor `Menu.NONE`. Essa constante equivale a 0 e significa que não queremos atribuir esses parâmetros. Em outras palavras, no código acima, criamos um menu com `id` 1 e nome `"deletar"`. Vamos testá-lo?

Se rodarmos a nossa App, a princípio, nada mudou. Mas, se pressionarmos um item da lista:

imagem` que equivale ao valor `true`. Mas o que isso significa? Quando retornamos `true`, informamos que o click para esse menu, será consumido apenas por ele.

Qual é o nosso próximo passo? Precisamos verificar se a opção "deletar" foi escolhida, porém, como podemos fazer isso? O parâmetro `item` corresponde ao item que foi clicado, ou seja, a partir dele podemos verificar o `id` e, se for igual a 1, saberemos que é o menu deletar.

Podemos utilizar `if`s e `else`s, porém, já que sabemos o que esperamos, isto é, o `id` 1, utilizaremos o `switch case`:

java

Agora precisamos implementar a funcionalidade para deletar o curso. Porém, qual curso deletaremos? Em outras palavras, precisamos pegar primeiro a posição do curso que queremos deletar. Para pegarmos informações do item que chamou o context menu, precisamos utilizar o método `getMenuInfo()` do objeto `item`:

java

Então atribuímos o retorno desse método para um objeto do tipo `AdapterView.AdapterContextMenuInfo`:

java

A partir do objeto `menuInfo` podemos pegar a posição do item que chamou o context menu por meio do atributo `position`:

java

Agora que temos a posição desejada, podemos deletar o curso! Porém, antes de implementar o código, criaremos o método `deletar()` enviando a `position`:

java

Para deletar um item da lista, basta apenas usarmos o `remove()` da `listaDeCursos` enviando a `position`:

java

E então, notificamos o `adapter` dizendo que a lista foi modificada por meio do método `notifyDataSetChanged()`:

java

Vamos testar o nosso código? Vejamos o resultado:

imagem

Que tal aprender a desenvolver a sua App Android desde o zero? Aqui na Alura, temos diversos [**cursos online de Android**] onde ensinamos você a desenvolver a sua primeira App com os principais conceitos do início ao fim.




Ao desenvolver o layout de um site o designer entregou apenas a versão para desktop e, no momento de realizar os testes em diferentes dispositivos chegou-se a esta situação medonha/preocupante/esquisita:

imagem de layout para entregar, em diferentes tamanhos de tela e dimensões. Isso facilitará na visualização e compreensão das mudanças que deverão acontecer.

Podemos escolher, por exemplo, trabalhar com a largura de 1920px, uma intermediária de 1024px, e uma bem menor de 360px, já que são tamanhos bastante utilizados hoje em dia, segundo o gráfico anterior.

E então, teríamos algo assim:

imagem no momento de redimensionar o layout para outros tamanhos, uma vez que seguiremos sempre um guia de proporções iguais. Estes são os famosos grids.

**Mas, atenção! O conceito de grid, neste momento, não é o mesmo que aquele aplicado em diagramação de revistas e jornais.**

Agora estamos falando de grids fluídos, isto é, grids flexíveis que ajudarão a orientar as adaptações proporcionalmente para cada tamanho de tela.

## Preparando o grid

Certo, agora sabemos da necessidade de aplicar os grids fluídos no layout. Mas como definir a quantidade de colunas e espaçamentos ideais?

No exemplo anterior aplicamos 3 colunas ao layout e conseguimos um resultado legal, mas e se tivéssemos que mudar nosso layout para uma divisão em quatro colunas?

imagem, como 24, 36, 48... E, claro, é importante lembrar que, quanto mais colunas, mais trabalhoso será lidar com essas adaptações.

Além disso, devemos sempre analisar como faremos essa organização dos elementos pensando na experiência que cada dispositivo oferece.

Em telas maiores podemos dividir nosso layout em um maior número de colunas sem sobrecarregar o visual da página, enquanto, em telas menores, menos colunas garantem uma melhor visualização de textos e imagens.

![]

![]

Note que, além da diminuição de colunas, fizemos o reposicionamento dos elementos seguindo uma ordem de prioridades, como as imagens que já não estão dispostas lado a lado, mas sim, uma abaixo da outra.

Com isso, garantimos que o nosso layout não seja prejudicado visualmente e o usuário possa interagir com a página sem perder a qualidade da visualização e da experiência com a nossa interface.

## Recapitulando...

No início do post apresentamos um problema muito comum entre os designers: definir as dimensões do layout que será entregue ao cliente.

A partir daí, vimos que esse problema fica ainda mais complexo quando nos damos conta da quantidade de dispositivos e de diferentes tamanhos de que tela existem atualmente.

Para isso, definimos que uma boa ideia seria escolher as 3 dimensões mais utilizadas pelos usuários, um maior, um intermediário e um menor.

Em cima dessa escolha, desenvolvemos nosso layout em 3 versões diferentes e, para garantir um layout bem adaptado para cada tamanho de tela, utilizamos os [**grid flexíveis e reposicionamos os elementos**] convenientemente para melhorar a visualização da página em cada dispositivo.

Por fim, podemos concluir que não existe um tamanho padrão de dimensões para desenvolver o layout de um site, mas existem meios de estabelecermos essas dimensões segundo as estatísticas que levantamos e das características do nosso projeto.

Na Alura temos também um curso de **[Photoshop para web]** com dicas e tópicos muito interessantes para quem aproveitar o máximo possível da ferramenta para o desenvolvimento de layouts de sites.





imagem 

Enfim, depois de muito pensar nos prós e nos contras, você resolveu fazer um site ou blog para o seu projeto. No entanto, algo está errado: as pessoas simplesmente não estão acessando a página. Pode ser algum erro de **SEO ou de divulgação**, como também é possível que você esteja cometendo alguns erros de design.

Felizmente, existem maneiras para você tornar o seu site mais simples e mais atraente para os visitantes. Continue a leitura deste post para identificar os problemas mais comuns e aprender a resolvê-los:

## 1\. Falta de informações na página inicial

Existem muitos sites que não publicam as suas principais informações na página inicial, e isso pode prejudicar [**a experiência do usuário**]. Por mais que isso não seja um erro, o recomendado é facilitar o acesso para esse tipo de dado, a fim de que o seu possível cliente entre em contato.

Além disso, o visitante pode achar cansativo ter que clicar diversas vezes para encontrar as informações sobre sua empresa. Lembre-se: busque sempre priorizar o que o usuário precisa, de forma simples e eficaz, por exemplo: seu e-mail, telefone ou outra forma de contato. Assim, você aumenta as chances de conversão e evita a perda de um possível consumidor.

## 2\. Poluição visual

Sabe quando você entra em um site e parece que você ficou sem ar? Tudo querendo chamar sua atenção de alguma forma e você não tem nenhum descanso visual ali.

Atente-se se o seu site está visualmente poluído. Esteticamente falando, ter uma página com vários pop-ups, anúncios e propagandas não agrada a ninguém e prejudica a experiência do usuário.

Quem visita o seu site e observa esse monte de informações pode se perder em relação ao que realmente procurava. Em geral, pessoas que entram na internet para pesquisar estão em busca de algo que seja rápido e simples. Uma ótima solução para esse tipo de erro de design é diminuir a quantidade de links que devem ser clicados.

## 3\. Qualidade das imagens

Além da poluição visual, você deve se atentar à [**qualidade das imagens**] que anexou ao site. Outra questão é se todas estão visíveis principalmente em lojas virtuais.

Por exemplo: no seu portal são vendidos porta-retratos customizados, mas as imagens que você postou aparecem como indisponíveis. Quem passar por essa imagem e ler o que está escrito pode pensar que não há produto à venda.

## 4\. Sites que não se adaptam aos dispositivos móveis

Cada vez mais, as pessoas estão se sentindo confortáveis em acessar os sites por meio do aparelho celular. Mas, para isso acontecer de maneira eficiente com a sua página na web, é necessário que você adapte o layout, tornando o seu [**site responsivo**] ou criando uma versão mobile.

Você já entrou em algum blog algum blog que precisava dar zoom para enxergar o texto? Ou com tudo desconfigurado na tela quando acessa via smartphone? Se sim, você provavelmente ficou muito frustrado.

Pois é exatamente isso o que acontece com os seus clientes e com os seus possíveis clientes quando não conseguem acessar o seu site no smartphone, tablet ou outro dispositivo móvel.

## 5\. Cores que não combinam com a identidade visual

Imagine que o banco que você tem conta resolve mudar a cor do internet banking de roxo para laranja ou de vermelho para verde, provavelmente você vai ficar assustado.

Por isso tome sempre cuidado com as cores utilizadas no seu projeto. É preciso que elas estejam de acordo com a identidade visual da marca.

Além disso, seria interessante criar uma paleta para que os tons combinem entre si, sem causar poluição visual. Melhor dos mundos seria a criação de um manual da marca, um Manual de Identidade Visual

Também é recomendado utilizar a psicologia das cores, fazendo com que tudo no [**design**] do seu site funcione a favor do seu negócio.

## 6\. Erros nos links

Links quebrados em qualquer plataforma web é um tanto desesperador. Será que é o site, o computador ou a conexão que deu pau? É preciso tomar muito cuidado na hora de linkar as páginas e artigos do seu site ou blog.

Qualquer usuário que esteja navegando na sua página certamente desistirá e sairá do seu site ao encontrar um link que não leva a lugar nenhum.

**Então, tome cuidado seja com a linkagem interna (para outras partes do seu próprio site),seja com a linkagem externa (quando você faz um hiperlink para um site ou blog parceiro).**

Além disso, quando for atualizar qualquer parte do seu site, verifique se haverá alguma mudança e confira se o hiperlink já inserido continua correto. **Google Analytics** pode ser seu amigo nessa.

## 7\. Falta de cuidado com as fontes

Quando for criar a identidade visual do seu site, você também deve se preocupar com a fonte escolhida. Busque algo fácil de ler e que não torne o site cansativo.

Sobre o tamanho, [**o ideal é acima de 16 pixels, pois esse é o padrão recomendado para os navegadores**]. Os usuários poderão ajustar a fonte de acordo com o que mais gostam. Mas lembre-se: nem todas as pessoas sabem fazer isso.

Por isso, mantenha a letra de forma que a maioria possa ler com tranquilidade as informações.

## 8\. Excesso de publicidade

Imagine que você entrou em um site para buscar uma simples receita de bolo e, ao clicar, 2 abas com publicidade foram abertas. Isso é muito incômodo!

Por mais que você queira divulgar o trabalho de um patrocinador, não é preciso fazê-lo de forma tão invasiva.

O excesso de propaganda interrompe a leitura do usuário e incomoda bastante, gerando uma rejeição ou fazendo com que ele nunca mais queira acessar o seu site.

## 9\. Problemas visuais nos textos

Nada pior do que clicar em um artigo e ver que ele é um texto que parece um bloco, sem nenhuma divisão de parágrafos. Fazer o texto com trechos breves torna a leitura mais fácil e menos cansativa.

Busque, também, criar subtítulos e dispor os textos de forma que o usuário consiga “escanear” as partes mais interessantes para aumentar o seu envolvimento com o conteúdo e a sua permanência no site.

Os erros que acontecem em sites e blogs, definitivamente, são muito comuns. Mas, com o devido cuidado e com a ajuda de profissionais de confiança para criar ou para atualizar o portal de sua marca, é possível ter um lugar impecável na web. Isso, com certeza, vai fazer o seu negócio se destacar!

Gostou deste conteúdo sobre os erros de design mais comuns em sites e blogs? Então compartilhe-o nas suas redes sociais para ajudar mais pessoas!




Já sabemos que quando se trata de SQL, [**nulo é nulo e vazio é vazio**]. Nosso sistema permite o campo nulo, então temos alguns nulos no banco:

sql

Agora, queria trazer também a empresa(que é um campo opcional). Mas se ela fosse _null_, gostaria que trouxesse algo mais significativo, como "Não informada". O que quero então é trazer um valor padrão na hora de executar a query:

sql

O **coalesce** traz o primeiro valor não nulo do que passamos pra ele. Isto é: se a empresa for nula, ele devolve "Não informada". Também podemos usar com números: coalesce(valor, 0).

Dica do Rafael Dipold!




Uma floricultura me pediu pra criar uma funcionalidade em que **a cor de fundo do site mudasse de acordo com as horas do dia**. Vamos ver como podemos encontrar as horas do dia e **alterar o CSS** tudo isso usando JavaScript.

## Trabalhando com datas e horas

O **JavaScript** possui a classe `Date` que nos permite trabalhar com datas e horários. Se chamarmos o construtor `Date` sem parâmetros:

js 

Conseguimos obter a data e o horário atual:

`Thu Nov 01 2018 13:51:03 GMT-0300 (Brasília Standard Time)`

Ótimo, resolvemos uma pequena parte do problema que era descobrir como pegar a data e hora, agora vamos tentar ser mais específico e encontrar somentes as horas do dia.

## Encontrando as horas

Como `Date` é um classe, ela possui um método para nos auxiliar a encontrar as horas como o método `.getUTCHours()`

js 

Conseguimos ser bem específicos e encontrar as somente as horas, o problema foi que o número que tivemos de retorno foi 15 e no dia em eu rodei esse código eram exatas 13:00 horas, logo o retorno deveria ter sido 13 e não 15. O que ocorreu ?

## Resolvendo o problema das horas

Conseguimos pegar a hora do dia, mas ela está vindo errada!. O problema da hora encontrada não ser a hora real aconteceu por que o método `getUTCHours()`está trazendo a hora UTC (**Tempo Universal Coordenado)** Para resolver essa situação vamos utilizar o método `getHours` da classe `Date`

js 

Ambos os métodos trazem apenas as horas, a diferença é que `getHours()` retorna o horário local.

No momento em que eu rodei o script a hora retornada foi `13` , Uma parte do problema foi resolvido, agora vamos ver como alterar a cor do fundo do site usando JavaScript.

## Alterando as cores de acordo com as horas

Atualmente a cor de fundo do site é amarelo, o que eu quero é deixar ele azul a partir das 16:00. Com o JavaScript nós conseguimos alterar a cor do fundo da página utilizando os seletores CSS.

js 

## Alterando CSS com JavaScript

Agora que já sabemos como pegar a hora do dia, e como alterar a cor de fundo de uma página, vamos criar um script com a ajuda do `if` para fazer a mudança de horário

js 

## Para saber mais

Além de invocar o construtor sem parâmetro, existem outras maneiras para encontrar data e hora usando o objeto `Date`

Passando o valor da data em milisegundos. De acordo com a documentação do [developer mozilla], a **data do JavaScript** é baseada no valor de tempo em milissegundos desde a meia noite de [01 de Janeiro de 1970, UTC].

Com um dia correspondendo a 86.400,000 milissegundos.( essa parte é do texto da mozilla)

js 

Obtemos como resposta:

`2128-06-11T08:53:20.000Z`

Passando dia, mês e ano como parâmetro, lembrando que, nessa notação, o mês de janeiro é o 0:

js 

Obtemos como resposta:

`2015-11-01T02:00:00.000Z`

Passando como parâmetro do construtor uma string:

js 

Obtemos como resposta:

`2015-10-01T03:00:00.000Z`

# Métodos e funções úteis em JavaScript

É importante conhecer bem as funções básicas do JavaScript, como o [replace e outros métodos da String](/artigos/javascript-replace-manipulando-strings-e-regex), [conversão de String para número](/artigos/convertendo-string-para-numero-em-javascript) e a [formação de números em JavaScript](/artigos/formatando-numeros-no-javascript). 

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação front-end**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, entre outras coisas.





imagem 

Neste episódio do Alura Live, Gabs Ferreira recebe Jeferson Sensei pra falar sobre Lua: uma linguagem de programação brasileira que se tornou muito popular entre os desenvolvedores de jogos no Brasil e no mundo.

Conheça mais dessa área que tem crescido cada vez mais!

https://www.youtube.com/watch?v=WowR7qOygRw

Quer saber mais? [Assista essa live completa!]

[**Conheça a linguagem Lua**]. :)

- Que tal utilizar Unity para tirar suas idéias do papel?

[**Unity**]: Criação de um jogo de sobrevivência à zumbis para Web. [Jogos mobile com Unity:] Diversão com a Game Engine.

- Quer algo diferente para aprender a modelar e animar personagens?

[Maya:] Modele e anime um personagem com motion capture.

- E que tal algo totalmente fora do comum e que vem virando tendência, como jogos em Realidade Virtual?

[Unreal Engine parte 1]: Crie um ambiente em VR para arquitetura.

Siga a gente no Twitter: [Gabriel Ferreira], [Jeferson Silva] e a [Alurinha]! ;)




Na internet, você já se beneficiou do trabalho de um Social Media hoje. Duvida? Então responda a estas perguntas:

- Já entrou no Facebook desde que acordou?
- Viu algum vídeo engraçado ou informativo na sua timeline, postado por uma das páginas que você curte?
- Clicou no link de algum tweet que levou para um artigo de blog?

Se fez qualquer coisa parecida com isso, apareceu no radar de um profissional de mídias sociais. Ele criou conteúdo pensando em gente como você, e agora analisará o seu engajamento para melhorar esse conteúdo.

Vamos também dar dicas sobre sua rotina, responsabilidades e ferramentas úteis para quem começará no ramo. Acompanhe.

# O que é Social Media?

A profissão de Social Media é algo relativamente recente, mas ninguém que a conheça minimamente tem dúvidas de que veio para ficar e [**ditar tendências**].

O Social Media publica conteúdo em páginas empresariais, interage com os seguidores dessas páginas, mede os resultados desse trabalho e faz os ajustes necessários para melhorar o seu desempenho. E tudo isso levando em conta a imagem da empresa e sua interação com o público, seja ele consumidor ou não.

O fato de haver tantos nomes diferentes para a profissão vem de uma confusão comum aqui no Brasil aquela entre mídias sociais e redes sociais.

## Qual a diferença entre mídias sociais e redes sociais?

Quase todo mundo usa essas expressões como sinônimos, mas, se formos levar ao pé da letra, há uma diferença importante que tem a ver com duas das principais tarefas do Social Media: criação de conteúdo e relacionamento com clientes.

São consideradas mídias sociais plataformas como o Twitter, onde o conteúdo é a parte mais importante. Quem lê e tuíta por lá quase sempre está interessado em se informar e divulgar informação.

Aliás, o Twitter é considerado uma das melhores formas de ficar por dentro das tendências. Ou, como são chamados por lá, os trending topics, marcados pelas famosas hashtags, que são listas que reúnem os assuntos do momento.

Uma possível explicação para isso é o fato de que a rede social dos 140 caracteres é dinâmica e sua estrutura de pouco texto favorece o compartilhamento de links, vídeos e outras formas de conteúdo externo.

Já as redes sociais são focadas em relacionamento. Quando começaram no Brasil, elas eram conhecidas como “sites de relacionamento”, aliás. A essa categoria pertencem Facebook, Instagram e tantas outras plataformas em que você se relaciona com amigos e conhecidos.

## Como é a formação do Social Media?

Se você se interessou por essa atividade, saiba que o perfil do Social Media é o de uma pessoa bem informada, dinâmica e proativa. Habilidades, aliás, que são [**requisitos para qualquer bom profissional**] hoje em dia, não é mesmo?

Grande parte dos profissionais da área vem do Jornalismo ou Comunicação Social, embora não seja necessária uma formação acadêmica para atuar no mercado.

É claro que ser graduado é um grande diferencial para qualquer área em que se vá trabalhar relacionada ou não à sua graduação. No Brasil, porém, não há curso superior direcionado ao Social Media.

Mas já temos [**boas opções de especialização**], principalmente online, que abordam as questões mais importantes da rotina desse profissional.

Tem também muita gente brilhante da área que aprendeu pelo caminho mais duro, isto é, cometendo erros, experimentando e aprendendo com os resultados.

## Por que ser autêntico é importante nessa profissão?

Por outro lado, há muitos profissionais que não são tão voluntariosos assim. Eles costumam copiar sem pensar estratégias prontas de empresas que são destaque no Facebook ou Twitter.

Isso é péssimo para o trabalho do Social Media, já que um dos requisitos mais importantes e empolgantes do seu trabalho é criar um diálogo entre empresa e cliente que seja único e adaptado às necessidades das duas partes.

Então, esse é um erro que você não deve cometer. É muito válido aprender com experiências bem-sucedidas (e também com as malsucedidas) de outras pessoas e empresas. Mas seja criterioso ao utilizá-las fora do contexto original.

As empresas que contratam esse profissional só vão se destacar realmente se aquilo que publicam em suas páginas for autêntico. Fora disso, tudo será sucesso de momento.

# O que faz um profissional de Social Media

Se é como a maioria das pessoas, você tem mais de mil amigos no Facebook e curte dezenas de páginas. Pode ser que tenha uma conta no Twitter e, quase com certeza, já criou um perfil no Instagram.

Assim, é nas redes sociais que você se informa, interage com amigos, se diverte e até mesmo trabalha. Quem é que nunca fez uma reunião de escritório pelo messenger do Facebook, não é mesmo?

E as empresas sabem que, hoje em dia, todo mundo precisa das redes sociais para todas essas tarefas. E também que todas essas pessoas são potenciais consumidoras dos produtos e serviços delas.

Mas como elas vão fazer para selecionar o público certo para isso? Não adianta passar o dia todo pagando anúncios. Você clicaria numa propaganda de algo que não tem nada a ver com você?

Essa seleção da pessoa perfeita para o produto perfeito nas redes sociais é feita, de certa forma, pelo Social Media.

## Ele cria conteúdo

Tire um tempinho e entre em algumas das suas páginas favoritas do Facebook. Há grandes chances de elas serem de empresas. Aí, você se dá conta de que segue a página de uma organização que vende produtos e, bem, não são só anúncios que chegam até você.

Isso tem um motivo. Se essas empresas passassem o dia todo postando coisas do tipo “compre o meu produto”, você já teria se cansado e descurtido as páginas delas há muito tempo.

Toda empresa que sabe disso já contratou um Social Media para entender o gosto dos seguidores e criar conteúdo do interesse deles. Ou seja, manter uma relação baseada no interesse mútuo, e não apenas em propaganda.

Aí você pensou em alguém sentado à frente do computador, tomando café e postando várias vezes ao dia na página das empresas que o contrataram.

De uma coisa você pode ter certeza, o trabalho do Social Media não tem nada de aleatório. Qualquer mídia ou rede social mede o desempenho de cada postagem e, a partir desses números, é possível saber exatamente quais tipos dão mais resultado.

Quando existem números ou “métricas”, como os profissionais de marketing e mídias sociais gostam de chamar todo o trabalho adquire um sentido.

## E estabelece uma rotina

Dá para entender melhor o gosto do público-alvo e começar a criar conteúdo que realmente tenha a ver com ele. E, como tudo isso só funciona com planejamento, experimentação, análise de resultados e modificações, o Social Media precisa de uma [**rotina**].

A maior parte deles começa o expediente respondendo aos comentários de clientes e de todo tipo de gente que interagiu com a marca.

As pessoas valorizam as empresas que fazem isso. Todo mundo se sente mais importante quando é ouvido. E não importa se o que comunicam é uma reclamação, um elogio, uma crítica ou uma sugestão.

Depois, é hora de se informar sobre o que anda “bombando” na internet e ver, dentre todas essas possibilidades, o que tem mais a ver com as empresas que são clientes do Social Media.

A ideia é criar posts relacionados às discussões mais badaladas e que façam sentido para os seguidores da página e o público-alvo da empresa.

Para nortear a prática de todas essas tarefas, o Social Media se reúne com o setor de comunicação ou diretamente com os donos das empresas. Lá, uma estratégia é definida ou modificada, tendo como base os números.

# Exemplos de boas práticas em Social Media

As redes sociais são um fenômeno que veio para ficar, com certeza. Só para você ter uma ideia da importância delas, segundo um estudo, [**55% dos internautas brasileiros acreditam que a internet se resume ao Facebook**].

Ou seja, muita, mas muita gente mesmo nem ao menos pensa em outra forma de se conectar que não seja pela rede social de Mark Zuckerberg.

Imagine, num contexto desses, o tamanho da importância de um Social Media? Uma falha grave em alguma das mídias sociais pode significar muito prejuízo para a imagem de um negócio.

Hoje, todas as grandes empresas — e uma quantidade enorme de pequenos e médios empreendimentos constroem a identidade da sua marca nas redes sociais.

E, como o consumidor também mudou muito por causa delas, é muito raro que uma empresa se destaque em vendas e faturamento se seus clientes não tiverem algum tipo de identificação com ela.

Um profissional com tantas responsabilidades precisa saber as “regras de etiqueta” da internet a fundo. Mas, também, como é lá que as empresas se destacam, ele terá que arriscar para entrar no gosto dos clientes.

Por isso, é muito importante conhecer, dominar e aplicar as boas práticas de um Social Media. Muitas delas você só conhecerá colocando a mão na massa. Mas algumas das principais a gente lista para você:

## Planeje tudo

Não há a menor chance de uma estratégia de redes sociais dar certo se você ficar o dia todo tendo ideias aleatórias e postando nas páginas dos seus clientes.

As tarefas do Social Media são organizadas de forma esquemática e detalhista. Ele cria calendários de publicação e estuda os melhores horários para as postagens. Tudo isso deve estar pronto muito antes de postar pela primeira vez.

Aliás, boa parte das postagens deve ser programada antecipadamente. Você pode usar alguns aplicativos para isso. Assim, alivia aquele problema de dormir tarde todo dia porque tem um cliente que tem engajamento alto nas redes sociais depois da meia-noite. E, acredite, isso existe.

Além do mais, posts só dão resultados se estiverem dentro de uma estratégia. Qual o objetivo do seu cliente com a página do Facebook?

Pode ser divulgar a marca, conseguir vendas ou simplesmente manter um canal aberto para comunicação com os clientes. Cada postagem da página dele deve estar de acordo com esse objetivo.

## Entre na mente do seu público

Existe uma concepção de público do marketing digital que é preciosa para quem trabalha com redes e mídias sociais. É o conceito de buyer persona.

Muito mais complexo do que uma definição simples de público-alvo, esse conceito leva em consideração aspectos muito mais detalhados da vida das pessoas que interagem com uma marca.

Ele compreende as necessidades específicas de um consumidor ideal que podem ser preenchidas com um produto. Isso é conhecido pelos profissionais de marketing como “as dores da persona”.

Quem lê posts que foram criados levando essas técnicas em consideração fica com aquela sensação de “uau, isso foi escrito pra mim”, o que gera identificação imediata com a marca e resulta em maior alcance, engajamento e curtidas.

## Crie textos curtos e entenda de experiência do usuário

As redes sociais são muito diferentes de blogs. Embora muita gente goste de publicar os famosos “textões” nos seus perfis, o ideal para empresas é manter o conteúdo dos posts bem curto. [Pesquisas] sugerem que o tamanho ideal é de cerca de 250 caracteres.

Toda a lógica do conteúdo produzido e consumido na internet atende a um tipo de experiência do usuário específico do ambiente virtual.

São peças e textos que devem ser muito escaneáveis isto é, toda a sua proposta deve poder ser assimilada num correr de olhos, em alguns segundos.

Mais uma vez, o conhecimento do público-alvo ou, numa hipótese melhor, da persona — ajudará a criar conteúdo escaneável.

Seu público é impaciente? Tem o hábito da leitura? É ligado em design ou prefere que os aspectos visuais sejam bem resumidos, apenas colaborando para a transmissão da mensagem? Responder a essas perguntas é o primeiro passo para uma boa prática de produção de conteúdo nas redes sociais.

## Evite polêmicas

Não dá para negar que polêmicas geram visualizações. Tanto que muitas das ditas “celebridades da internet” vivem criando conteúdo sobre os assuntos mais controversos do momento.

Fazer isso é uma estratégia de altíssimo risco para empresas. Se procurar em qualquer guia de boas práticas das redes sociais na internet, você ouvirá que a postura esperada das páginas de negócios é a neutralidade.

Isso é verdade em 90% dos casos. Mas há certas situações em que uma postura indiferente incomodará de verdade o seu público. Logo, é preciso saber a hora de se posicionar também.

Na maior parte do tempo, você deve evitar escolher assuntos polêmicos como tema das suas postagens. Ninguém está por dentro de tudo o tempo todo, e o maior risco é abordar esses assuntos de uma forma superficial e acabar perdendo credibilidade.

Ou, pior, tocar em assuntos sérios de uma forma oportunista e provocar a ira dos seus seguidores. Foi o que fez o Catraca Livre, [**ao postar sobre o acidente aéreo**] que resultou na morte dos jogadores da Associação Chapecoense de Futebol.

## Saiba lidar com crises

E já que tocamos nesse assunto, tenha em mente que, por mais que você evite assuntos espinhosos, crises acabam acontecendo uma hora ou outra.

Esteja preparado para elas. Quando acontecerem, respire fundo, converse com a equipe de marketing — se a empresa em que trabalha tem uma — ou com o seu cliente. A partir daí, crie uma estratégia para solucionar o problema.

Evite tomar decisões impulsivas. Isso é uma ótima maneira de gerar mais instabilidade.

## Meça tudo

As mídias e redes sociais fazem parte do marketing digital.

E esse novo modelo de marketing ainda tem muito de Ciências Humanas, mas incorpora mais elementos da Matemática e Estatística a cada dia. Cada vez mais, os profissionais de marketing estão interessados em medir suas estratégias.

Isso tem muito a ver com as facilidades do ambiente digital. Por exemplo, o próprio Facebook gera todos os números que você precisa para saber se uma postagem deu certo ou não.

Ele te fala quanta gente curtiu, comentou e compartilhou uma publicação. Além disso, numa página empresarial, dá para verificar outras métricas bem mais complexas, como o envolvimento com as publicações, alcance orgânico e pago e muitos outros.

Twitter, [LinkedIn] e Instagram não possuem mecanismos de mensuração tão profundos. Mas há ferramentas que podem ajudar nisso. Mais adiante, vamos falar um pouco sobre como usá-las.

O fundamental é que haja sempre números que mostrem onde e como o Social Media deve agir e que as estratégias levem essas métricas em consideração.

# Ferramentas de Social Media

Se chegou até aqui, é bem possível que você esteja [considerando seriamente a profissão de Social Media].

E pode até já estar se perguntando como um profissional desses consegue criar uma rotina de trabalho em que seja possível postar várias vezes ao dia em páginas de vários clientes diferentes.

E, ainda, medir resultados e usá-los para refazer as estratégias, aprimorar a linguagem e alcançar melhor o público da marca.

Para dinamizar o seu trabalho, você precisará recorrer a ferramentas online. Como sabemos disso, listamos as principais para iniciar:

## Hootsuite

Não dá para começar por outro ponto. O [Hootsuite] te ajuda a gerenciar todas as suas contas e postagens de uma forma mais organizada e, principalmente, rápida.

Com ele, você agenda posts de inúmeras redes sociais (na versão gratuita, o máximo são 3). Além disso, pode responder a comentários com um clique, visualizar tudo que é importante na mesma tela, lado a lado, e muito mais.

Uma solução que otimizará o seu trabalho, permitindo o gerenciamento de conteúdo em diversas redes sociais, medindo os resultados e interagindo de forma mais prática.

## Facebook Insights

Como dissemos, o Facebook disponibiliza uma [ferramenta nativa] para medir tudo da sua estratégia nessa rede social.

Para isso, basta clicar na guia “Informações” da página que deseja medir. Lá, você encontrará ótimas métricas e ainda pode optar por fazer a integração com o Google Analytics, o poderoso sistema de métricas do Google.

## Social Mention

Uma forma simples de usar, gratuita e eficiente de acompanhar e medir as menções de um produto ou marca nas redes sociais e na internet de forma geral.

Para aproveitar as funcionalidades do [Social Mention], você só precisa entrar no site, digitar o termo que quer acompanhar e ele retornará com uma análise detalhada e os links dos sites em que ele é mencionado.

Se você precisa ficar por dentro do que andam dizendo sobre um produto de um dos seus clientes, mas não tem tempo de fazer buscas todos os dias, não tem problema. É possível programar alertas para cada nova menção.

## Pocket

Boa parte do trabalho do Social Media é ter ideias. Ideias de links para postar, ideias de textos para ler e que vão te ajudar a ter ideias de postagens, GIFs, fotos e memes.

O [Pocket] é um aplicativo disponível para desktop e dispositivos móveis, como celulares e tablets. Ele permite, basicamente, que você salve conteúdo para ler mais tarde.

Pode parecer meio banal, mas é incrível a diferença que faz na sua produtividade guardar coisas e ler com uma certa regularidade. Você para de interromper o trabalho para não perder uma referência e ainda lembra de algo que podia ter se perdido pra sempre.

Muito bem! Pode ser que este texto te ajude a seguir uma profissão antenada, nova e dinâmica. O mundo e o Brasil, especialmente se organiza cada vez mais em torno das redes sociais.

E como tudo no ambiente da internet, o mundo desse profissional muda muito rápido. Ao que tudo indica, são mudanças para melhor, já que o trabalho fica otimizado e, para quem consegue uma rotina bem estabelecida, bem mais fluido.

Da próxima vez que olhar para a sua linha do tempo no Facebook, Twitter ou Instagram, pense nesse profissional que está por ali, dando duro para reunir os seus interesses ao de uma empresa. Você já está no radar dele há um bom tempo.

Quem sabe você não será o próximo gestor de mídias sociais e ajudar a tornar o Twitter, Facebook e Instagram mais alegres, informativos e propícios para os negócios?





Concluindo mais um curso eu irei alcançar o top 3 do Alura!

java

Para computar as informações dos pontos usamos a classe `Aluno`:

java

Então vamos criar nossos alunos:

java

Agora precisamos de uma **List** para armazenar esses alunos:

java

Testando a nossa lista:

java

Resultado:

```
 \[Alex Felipe - 13450, Maurício Aniche - 19930, Guilherme Silveira - 23143, Rodrigo Turini - 13500\]

```

Pronto! Tenho minha `List` com os alunos. Agora vamos ordenar com o método estático `sort()` da classe **Collections()**:

java

Espere um pouco... O meu código não compila!? O problema é que o método **sort()** não sabe como ordenar um aluno, ou seja, ele não sabe qual parâmetro ou critério deve usar para comparar alunos. Porém, nós podemos informá-lo implementando a interface **Comparable** na classe `Aluno`:

java

Quando implementamos a interface `Comparable`, precisamos preencher o campo do [**generics**]_ com o tipo de objeto que queremos comparar, nesse caso queremos comparar com Aluno mesmo. Por fim, precisamos implementar o método **compareTo().**

A regra de ordenação usando o método `compareTo()` compara dois objetos (alunos) e funciona da seguinte maneira:

- Para alocar o aluno mais a esquerda da lista, retornamos -1.
- Para alocar o aluno mais a direita da lista, retornamos 1.
- quando retornamos 0 significa que os alunos comparados são iguais e não alteram suas posições.

No nosso exemplo:

java

Estamos indicando que se os pontos do aluno forem maior, mande ele mais para esquerda (-1), se for menor, mande para a direita (1) e se os alunos forem iguais não faça nada (0).

Após a implementação do `Comparable`, o nosso código compila! Vamos testá-lo:

java

Resultado:

java

Veja que agora os nossos alunos estão ordenados!

Diferente da ordenação de números, para ordenar lista de objetos específicos, como é o caso do objeto aluno, é necessário informar como o objeto precisa ser ordenado implementando a interface `Comparable` e implementando o seu método `compareTo()`. Há um post da **Caelum** que explica com mais detalhes essa e outras formas de [ordenação de coleções].

O que achou da técnica para ordenar uma lista em Java? Dê uma olhada na nossa [**Formação Java**] que tem o foco de apresentar em geral o mundo Java, bacana né? ;)



Talvez tenhamos errado novamente nos nomes das áreas que temos na tecnologia, ou muito provavelmente, esteja eu errado em escrever tudo que vem a seguir. E se estiver, tudo bem, me avisem :)

O termo design ficou fortemente associado a interfaces/ambiente. Justo por que ao pensarmos em design de interiores e /ou web design, temos aquela impressão de que quem tem esse título, não só sabe deixar as coisas muito bem organizadas, como também, bonitas. O que não é totalmente verdade.

Algo que pode deixar essa característica mais evidente é o processo de arquitetura de informação. Onde o resultado pode ser um diagrama em preto e branco, organizado, mas que não é bonito.

**Outro exemplo? Card Sorting. Onde agrupamos elementos que fazem sentido estarem juntos e separamos aqueles que achamos que devem estar em outro grupo.**


imagem


O maior engano das pessoas está no termo design. Termo que tem mais de uma tradução e que pode confundir bastante. Quem é desenvolvedor, com certeza já cometeu gafes com o termo pattern, achando que era a mesma coisa que default. Sim, eu também já errei nisso.

**Design tá mais ligado a projeto ou concepção (desenho também)do que realmente a aparência (diga-se boniteza). Justo por que quem diz se está bonito ou não, é quem está vendo, com outros olhos, em outro contexto. Não necessariamente quem desenhou a interface. :)**

A interface na UX, é um dos resultados de um processo anterior. Antes de bonita, ela precisa ser útil, fácil de usar e comunicativa. Precisa entregar o que o usuário precisa de uma forma simples. Ela precisa ser intuitiva, ou seja, um botão precisa parecer um botão.

Então, antes de pensar em uma interface muito atrativa em estética. Considere as seguintes questões:

1. Ela é útil, fácil de entender e informativa?
2. É preciso pensar muito para interagir com ela? 
3. Os elementos acionáveis, parecem acionáveis mesmo?
4. É confortável de interagir? Os botões são grandes o suficientes?
5. Os espaçamentos e alinhamentos estão bem definidos?

**Ótimo! Segue em frente com as cores e demais itens estéticos para dar aquele plus de brilhar os olhos, sem prejudicar os itens anteriores. :)**



Conheça algumas ferramentas que podem ser boas alternativas ao photoshop, tanto em custo benefício, como também, usabilidade e features.

O Adobe Photoshop é o aplicativo dominante no mercado de edição de imagens há mais de 25 anos. Mas, de uns tempos para cá, já surgiram muitos bons concorrentes, que se apresentam como opções tão funcionais quanto ele — mas muito mais econômicas.

Afinal, hoje, o custo individual de adquirir a última versão do premiado editor é R$85,00 mensais, o que pode deter muitos iniciantes na aquisição do software original.

Assim, para ser uma alternativa ao Photoshop, um software precisa ter excelente usabilidade, ferramentas poderosas, compatibilidade com as principais plataformas disponíveis no mercado e um preço inferior ao praticado pela Adobe.

Então, se você se interessou em saber quais são as principais ferramentas gratuitas que pode utilizar no lugar do Photoshop, continue lendo este post!

## 1\. Gimp

Plataformas: Windows, Mac e Linux

Preço: grátis

Conhecido pelo acrônimo GIMP, o GNU Manipulation Program é um dos mais completos e gratuitos editores de código aberto disponível para todas as plataformas. Com ferramentas robustas, é provavelmente a melhor escolha que você pode fazer sem colocar a mão no bolso.

Com uma comunidade ampla de entusiastas, o GIMP oferece os principais recursos do Photoshop, embora não tenha uma usabilidade tão simples quanto a do aplicativo mais conhecido da Adobe.

O software conta com a edição em camadas, uma excelente ferramenta de seleção e retoques, recursos para [**correção de cores**] e o suporte a múltiplos plugins, que vão deixar seu trabalho ainda mais fácil.

Quanto aos formatos, ele suporta a criação de GIFs, BMPs, JPEGs, PNGs e ainda oferece compatibilidade com o formato original do Photoshop, o PSD. Com certeza, [vale a pena fazer o download] e testar!

## 2\. Pixlr

Plataformas: online

Preço: grátis

Para quem prefere fazer tudo direto do browser ou possui uma máquina mais lenta, que demande a utilização de recursos externos, a opção ideal é o Pixlr. Com ele, é possível editar imagens direto da aba do seu navegador, com naturalidade, e utilizando os mesmos atalhos do Photoshop.

Sua interface é simples, e ele também permite a edição de camadas, além de possuir ferramentas de seleção, edição de textos e um recurso automatizado para correção de olhos vermelhos.

Além disso, os filtros e efeitos tornam o Pixlr um dos melhores editores online que você pode imaginar. Ele suporta arquivos BMP, JPEG, GIF, TIFF e também PNGs. [Acesse-o e confira!]

## 3\. Paint.NET

Plataformas: Windows

Preço: grátis

Já brincou alguma vez de desenhar no Paint? Então, pense no Paint.NET como uma evolução do editor nativo do Windows. A ferramenta foi desenvolvida para ocupar justamente esse papel, e herda muito de sua interface e funcionalidade do aplicativo que você já conhece.

É um pouco menos complexa que o GIMP, mas conta com todos os recursos que você precisa para começar a editar imagens agora mesmo. E garante melhores resultados com o uso de plugins, o que torna os recursos básicos desse software ainda melhores.

Se quiser uma alternativa ao Photoshop por uma usabilidade simples de se entender e usar,o Paint.NET é a escolha para você! Além dos típicos BMPs, JPEGs, GIFs, TIFFs e PNGs, o aplicativo também oferece suporte a arquivos RAW e é completamente gratuito. [Basta baixar e testar]!

## 4\. PicMonkey

Plataformas: online

Preço: grátis

Quando a Google adquiriu o Picnik, muitos designers ficaram desolados pois isso significaria o fim do excelente editor de imagens criado por Justin Huff e Brian Terry. Os engenheiros, porém, se reorganizaram para lançar uma nova alternativa, completamente online e que consegue atingir o difícil equilíbrio entre uma interface de usuário intuitiva e um conjunto avançado de recursos.

Começar a editar suas fotos com PicMonkey é simples e adicionar texturas, formas e texto em suas imagens pode ser feito em poucos cliques. Há também alguns filtros automáticos, semelhantes aos do Instagram, com os quais você pode se divertir.

Como o PicMonkey funciona do seu navegador é possível acessá-lo de qualquer lugar. Para quem precisa de ferramentas ainda mais avançadas, existe uma versão premium do software que remove os anúncios da parte inferior da tela e inclui alguns recursos extra.

Quer experimentar? Então [clique aqui.] O PicMonkey oferece um trial gratuito de suas funções de retoque profissionais.

## 5\. Canva

Plataformas: Windows, Mac e Linux

Preço: grátis

Que tal um editor de fotos simples, conhecido como o programa de design mais fácil de usar no mundo? O Canva permite que qualquer um crie imagens incríveis, precisando apenas se registrar na plataforma o que pode ser feito com um e-mail, sua conta do Facebook ou do Google.

Ele possui efeitos de edição, corte e enquadramento que vão tornar suas imagens ainda melhores, sem dúvida! Aproveite e adicione textos, ícones e edite imagens com fundos transparentes, sem precisar sair de seu browser.

E use também os filtros automáticos disponibilizados pelo aplicativo para aprimorar as cores, brilho e contraste de suas fotos, e empregue os ícones gratuitos para criar imagens de impacto!

Além disso, de todas as ferramentas online citadas até aqui, este é o único que possui os recursos que você precisa para criar layouts web — um diferencial e tanto! Então, para começar a editar fotos agora mesmo, [visite o site.]

## 6\. CinePaint

Plataformas: Linux e Mac

Preço: grátis

Não esquecemos, é claro, dos usuários de Linux que consideram o GIMP um pouco limitado. Para eles, o CinePaint pode ser a solução.

Afinal, essa não é uma ferramenta de edição de imagens comum. Possibilitando retoques poderosos e uma alta-fidelidade de cor, ele permite que você saiba exatamente como suas fotos ficarão quando impressas.

Vale ressaltar que esse editor gratuito foi utilizado por grandes estúdios de Hollywood na criação de animações no passado. Só de saber isso, você já consegue imaginar o tamanho potencial da ferramenta, certo? E, além de trabalhar com imagens, o CinePaint ainda [cria e edita vídeos]!

Com suporte para arquivos BMP, CIN, DPX, EXR, GIF, JPEG, OpenEXR, PNG, TIFF e XCF, ele funciona em qualquer sistema operacional baseado no Unix — portanto, é também compatível com o Mac. Para baixá-lo, [basta acessar o site.]

## 7\. Seashore

Plataformas: Mac

Preço: grátis

Por fim, você usa Mac e não achou um aplicativo com a sua cara nessa lista? Não se preocupe! O Seashore é uma ferramenta de edição de imagens de código aberto baseada no framework Cocoa — o que significa que ele funciona perfeitamente no Macbook.

Utilizando a mesma formatação de arquivos do GIMP, o software oferece recursos semelhantes, mas com uma interface muito mais simples.

Com vários pincéis, uma excelente ferramenta de gradientes e a possibilidade de editar imagens em camadas, esse é um dos editores de imagem mais intuitivos da nossa lista. Para [**começar a se aventurar**] pelo software, você pode fazer o download [clicando aqui.]

**Enfim, substituir o Photoshop não é uma tarefa fácil. Afinal, se o software ganhou o espaço que tem hoje no mercado, foi graças à sua usabilidade, aliada a ferramentas de edição de imagem incomparáveis.**




[**Configurando VLans para segmentar nossa rede**], podemos ter várias redes lógicas, com endereços IPs diferentes.

imagem 


Sabendo disso, quando fui contratado por uma empresa para arrumar a rede em um novo prédio me deparei com o seguinte cenário: No Prédio funcionam quatro departamentos: Financeiro, Comercial, RH e Jurídic e cada departamento tem, em média, 50 hosts.

O departamento comercial envia muitas propostas técnicas que são arquivos bem pesados, por isso a rede de todos os departamentos está ficando lenta e instável.

Além disso, como todos os departamentos estão na mesma rede, ou seja, caso algum departamento tenha um problema, todos os departamentos serão atingidos.

Então, vamos atribuir os endereços de cada departamento. Nós podemos utilizar qualquer [**IP privado**] para isso, como são poucos **hosts**. Vou utilizar os [**endereços de classe C**] (192.168.x.x).

Podemos atribuir por exemplo uma departamento com o endereço de rede `192.168.0.0`, outro com `192.168.1.0` e assim por diante.

Essa é uma opção totalmente válida, porém se pararmos para analisar, com esse tipo de configuração, vamos estar desperdiçando endereços IPs.

# Mas como podemos diminuir esse número de endereços IPs na rede para evitar esse desperdício?

Nós podemos dividir nossa rede em parte menores, cada uma representando um departamento, ou seja, dividimos nossa rede em [**sub-redes**].

# O que é sub-rede

Toda endereço IP tem uma **máscara** correspondente. Essa máscara que identifica qual parte do endereço pertence a rede e qual parte ao host.

Por exemplo, o endereço `192.168.0.50` com uma máscara `255.255.255.0`, identifica como parte da rede o endereço `192.168.0` e o host como `50`:
java
Para dividir essa rede, nós podemos “dividir” essa máscara. Para isso, podemos usar valores diferentes entre `0` ou `255`. Quando fazemos isso, damos o nome de [**sub-rede**].

Mas quais valores podemos colocar?

## Calculando as máscaras de sub-rede

Cada três dígitos na máscara, correspondem a uma parte do endereço IP do host. Essas partes são formadas por oito bits, por isso recebem o nome de octetos.

Cada bit no octeto, possui um valor em decimal correspondente a sua posição.

Por serem bits, só possuem dois estados, ou 0, representando o host, ou 1, representando a rede.

No caso, essa máscara (`255.255.255.0`), pode ser representada em binário como: `11111111.11111111.11111111.0000000`.

java
Caso todos os oito bits da máscara de sub-rede possuir valor `1`, o valor em decimal `255`, caso todos os bits forem `0`, possui o valor `0` em decimal.

Mas por que quando todos os bits são `1`, o valor em decimal fica é `255`?

Isso é por causa da [**conversão de binário para decimal**][l].

## Criando sub-redes

Vimos que os bits `1` na máscara específica a porção da rede e que os bits `0` especificam o host no endereço IP. Para criar nossas redes, podemos pegar alguns **bits** `0` e transformá-los em `1`.

Por exemplo, se pegarmos o primeiro bit `0` na máscara e transformá-lo em bit `1`, teríamos a seguinte máscara em binário: `11111111.11111111.11111111.1000000`

Mas como fica o valor dela em decimal?

Sabemos que os três primeiros octetos têm o valor em decimal de `255`. Já para saber o valor do último, basta realizar a conversão:

java

Ou seja, temos: **1 x 2^7 + 0 x 2^6 + 0 x 2^5 + 0 x 2^4 + 0 x 2^3 + 0 x 2^2 + 0 x 2^1 + 0 x 2^0**. Que nos deixa com `128`.

Logo, a máscara dessa rede é: `255.255.255.128`.

Mas quantas redes temos com essa máscara?

Para saber quantas redes temos com essa nova máscara basta elevar o número **2**, que são o número de bits possíveis,\*\* \*\*ao número de bits emprestados da porção do host.

Neste caso pegamos um bit da porção do host, portanto temos \*\*2^1 \*\*redes. Ou seja, temos duas redes.

Mas quantos hosts cada rede comporta?

Os hosts são definidos como bits `0` na máscara de sub-rede, certo? Então para saber quantos hosts nossa rede comporta basta elevar `2` ao número de bits `0` na máscara.

Neste caso temos sete bits `0` (`10000000`), logo, 2^7, que nos dá 128.

Então cada uma de nossas redes comportam 128 hosts?

Dentre os endereços IPs, dois precisam ser reservados. Um para especificar a rede e outro para especificar o [**domínio de broadcast**]. Então, na verdade temos **128 - 2** hosts, logo temos `126` hosts em cada sub-rede.

Mas quais são esses endereços reservados?

O endereço que especifica a rede é sempre o primeiro endereço IP, já o de broadcast é o último endereço IP da rede.

Em uma rede classe C com máscara padrão, o endereço da rede é `192.168.0.0` e o de broadcast é `192.168.0.255`. Só que no nosso caso são duas sub-redes, cada uma com um endereço de rede e de broadcast.

A primeira rede possui o endereço de rede `192.168.0.0`, já o endereço de broadcast nós descobrimos somando `1` ao número de hosts, que neste caso são `126`, mais o endereço de rede. Ou seja, temos \*\*1 + 126 + 0. \*\*Dessa forma temos que o endereço de broadcast da primeira sub-rede é `192.168.0.127`.

Já o endereço de rede da segunda sub-rede é o endereço de **broadcast** da primeira sub-rede mais `1`. Ou seja, temos como endereço de rede da segunda sub-rede `192.168.0.128`. O endereço de broadcast conseguimos obter da mesma forma.

Somamos `1` ao número de hosts, mais o endereço de rede. Portanto, **1 + 126 + 128**, isso nos dá o endereço de broadcast `192.168.0.255`.

Bom, calculamos as sub-redes, mas com essa máscara temos apenas duas sub-redes. Porém, temos quatro departamentos e queremos colocar cada um em uma sub-rede. Como podemos fazer isso?

Se nós pegamos um bit a mais na máscara de sub-rede como no exemplo, nós temos duas sub-redes. Então, se nós pegarmos dois bits, teremos dois elevado a dois, que é número de bits que pegamos na porção do host, isso nos deixa com quatro que é o número de sub-redes que queremos.

Ou seja, nossa máscara ficará em binário: `11111111.11111111.11111111.1100000`. Realizando a conversão:
java
Logo: **1 x 2^7 + 1 x 2^6 + 0 x 2^5 + 0 x 2^4 + 0 x 2^3 + 0 x 2^2 + 0 x 2^1 + 0 x 2^0**. Que nos deixa com `192`.

Ou seja nossa máscara de sub-rede será `255.255.255.192`. Mas quantos hosts cada sub-rede comportará?

Para saber isso, basta elevar `2` ao número de bits `0` na máscara, menos os dois bits reservados de cada rede, ou seja, como temos seis bits zero nossa conta fica **2^6 - 2**, isso nos deixa com 62 hosts para cada rede.

Se quisermos saber qual é o endereço de cada sub rede, basta realizar os mesmos passos de antes.

O endereço de rede primeira sub-rede será `192.168.0.0`, já o seu endereço de broadcast será um mais o número de hosts mais o endereço de rede. Isso nos deixa com \*\* 1 + 62 + 0\*\*. Logo, o endereço de broadcast da nossa primeira sub rede será `192.168.0.63`.

Dessa forma, após calcular cada sub-rede teremos o seguinte resultado:
java
Todos esses endereços utilizando a máscara `255.255.255.192`.

Dessa forma conseguimos alocar cada departamento em uma sub-rede, o que otimiza a rede e isola os problemas.

## Para saber mais

Como cada sub-rede é uma rede distinta, elas precisam de um roteador para se comunicarem umas com as outras.

Neste exemplo, utilizamos um IP da classe C para criar as sub-redes, porém conseguimos realizar essa configuração com todas as classes de IPs disponíveis.

Nós podemos utilizar outra notação quando falamos de máscaras de rede. Ao invés de utilizar a máscara em seu formato decimal, podemos dizer apenas a quantidade de bits um contidos nela.

Por exemplo, a máscara padrão da classe C, `255.255.255.0`, em formato binário fica `11111111.11111111.11111111.0000000`. Ou seja, ela tem `24` bits `1`. Então caso desejemos falar que o endereço IP `192.168.0.35` utiliza a máscara padrão, podemos utilizar a notação `/24`. Ficando assim `192.168.0.35 /24`.

O nome dessa notação é [**CIDR**].

## Dividir e calcular

Atribuir endereços IPs a redes é o um dos trabalhos de um **administrador de redes**. Saber qual endereço atribuir e qual máscara utilizar faz parte desse trabalho.

Quando estamos instalando uma rede, é bacana separarmos os departamentos para isolar possíveis problemas, melhorar a performance da rede, além da segurança.

Uma forma de fazer isso é criando **VLans**, porém mesmo com essa configuração, algumas redes podem ter problemas com o broadcast. Então uma forma de resolver isso é dividindo a rede em parte menores, criando sub-redes.

A Alura tem uma [**formacao de redes**]. Nela, são apresentados os conceitos de sub-rede e diversas outras situações bacanas de utilizá-las.





O [**Creative Cloud**], desenvolvido pela aclamada [**Adobe**], é o “canivete suíço” das ferramentas de criação, e conta com uma coleção de mais de vinte aplicativos e serviços para desktop e dispositivos móveis. Atendendo à áreas como **design, fotografia, vídeo, Web, UX, UI** e muito mais, oferece recursos que aumentam a produtividade, como a sincronização na nuvem e colaboração em tempo real.


Com ele é possível utilizar programas como o **Photoshop, Illustrator, Premiere**, entre vários outros, em um modelo de assinatura com atualizações frequentes e suporte constante. Todas as suas funcionalidades são interligadas, o que permite iniciar o trabalho em um programa e continuá-lo em outro.


O modelo flexível de assinatura do Creative Cloud oferece uma enorme vantagem: é possível ter assinaturas que se adequem ao perfil de cada estudante ou empresa, independente do tamanho da equipe e suas necessidades, com um plano de assinatura que atende às demandas e não pesa no bolso.


# O que o Creative Cloud oferece?

- Mais de 20 aplicativos disponíveis para download.
- Adobe Fonts: para utilizar milhares de fontes tipográficas em projetos diretamente nos aplicativos da Creative Cloud.
- Behance: para expor trabalhos de criação e descobrir novos artistas.
- Bibliotecas da Creative Cloud: para salvar, procurar e compartilhar ativos das bibliotecas nos aplicativos do Creative Cloud.
- Adobe Portfolio: para criar e personalizar seu próprio site de portfólio.
- Armazenamento: 100 GB de armazenamento na nuvem disponíveis para o compartilhamento de arquivos e colaboração.

Para quem é usuário do Adobe Creative Cloud, o ano de 2020 promete! A Adobe acabou de anunciar na conferência Adobe MAX 2019, em Los Angeles, as principais novidades para o próximo ano.

# Principais novidades da atualização


**Photoshop para iPad lançado:** O software mais conhecido e utilizado da Adobe, o Photoshop, agora pode acompanhar os usuários aonde quer que estejam através da aplicação para iPad. Desenvolvido do zero e com a interface otimizada para o toque e para o uso com o Apple Pencil, sua primeira versão traz as principais ferramentas, como as de composição e retoque de fluxos de trabalho.

**Photoshop Camera - novo aplicativo de foto com inteligência artificial:** O novo aplicativo da Adobe para editar fotos, o [**Photoshop Camera**] por enquanto só está disponível para testes em grupos de usuários iOS e Android mas deve ser oficializado em 2020. O aplicativo pretende ser uma ferramenta de edição não apenas para profissionais, mas para qualquer pessoa. Utilizando o [**Adobe Sensei**], a inteligência artificial da Adobe, o Photoshop Camera sugere filtros e lentes, que fazem desde pequenas mudanças até alterações mais significantes que as transformam em ilustrações. Assim como no Instagram Stories, o aplicativo contará com lentes criadas por influenciadores e artistas. Além disso, os usuários também poderão criar e compartilhar lentes com outros usuários. Ainda que seja uma opção mais simples de edição do que o Photoshop, com o novo aplicativo é possível editar fotos manualmente e remover a qualquer momento filtros que foram adicionados à fotos.

<iframe width="560" height="315" src="https://www.youtube.com/embed/zRfG7cWqCG8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

**Adobe Fresco para Microsoft Windows:** Lançado no início do ano para o iPad, o [**Fresco**] chega para usuários de dispositivos **Microsoft Surface Pro X** e hardware Wacom MobileStudio Pro. A Adobe está trabalhando para expandir ainda mais esta lista.

**Adobe Aero - novo aplicativo para Realidade Aumentada:** A Adobe lançou recentemente o aplicativo de realidade aumentada [**Aero**]. Ele utiliza programas da Adobe para que os usuários possam importar arquivos 3D do DImension e camadas 2D do Illustrator e do Photoshop para gerar experiências de interação.

Para designers sem experiência em 3D, ele permite que seus usuários criem cenas de realidade aumentada no aplicativo a partir de um passo-a-passo. Ele pode ser também utilizado como softwares de terceiros, como Cinema 4D e Maya. No Aero também é possível adicionar experiências interativas a partir do desenho do caminho de movimento do qual deseja-se que o objeto siga.

<blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/p/B2pjz7bplg6/?utm_source=ig_embed&amp;utm_campaign=loading" data-instgrm-version="12" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/p/B2pjz7bplg6/?utm_source=ig_embed&amp;utm_campaign=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div> <div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"></path></g></g></g></svg></div><div style="padding-top: 8px;"> <div style=" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;"> Ver essa foto no Instagram</div></div><div style="padding: 12.5% 0;"></div> <div style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;"><div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);"></div> <div style="background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;"></div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);"></div></div><div style="margin-left: 8px;"> <div style=" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;"></div> <div style=" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)"></div></div><div style="margin-left: auto;"> <div style=" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);"></div> <div style=" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);"></div> <div style=" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);"></div></div></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;"></div></div></a><p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;"><a href="https://www.instagram.com/p/B2pjz7bplg6/?utm_source=ig_embed&amp;utm_campaign=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;" target="_blank">Uma publicação compartilhada por Adobe (@adobe)</a> em <time style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px;" datetime="2019-09-20T22:13:44+00:00">20 de Set, 2019 às 3:13 PDT</time></p></div></blockquote>
<script async src="www.instagram.com/embed.js"></script>

> "Crie experiências interativas sem precisar contar com um desenvolvedor. Aplique comportamentos ao seu conteúdo para criar combinações de ações que atraem os espectadores de sua experiência para direcionar a narrativa e se envolver com a história. Adicione movimento aos seus objetos usando seu dispositivo móvel para desenhar o caminho do movimento que você deseja que o objeto siga"
*- Adobe.*

**Adobe XD com recursos de co-edição adicionados:** Para quem trabalha com desenvolvimento de UI em equipe, os novos recursos de co-edição do Adobe XD serão muito bem-vindos. A atualização permite que vários designers colaborem simultaneamente e vejam mudanças em tempo real. Além disso, as bibliotecas agora estão totalmente integradas ao XD, permitindo que seus usuários aproveitem suas criações em outros aplicativos, como o Illustrator, diretamente no XD. Agora também pode ser acessado no Microsoft Word e no PowerPoint, capacitando os não-criativos a criar documentos e apresentações com os recursos mais atualizados.

## Criatividade acelerada com o Creative Cloud
Para quem já utiliza as aplicações da Adobe, as atualizações para os principais aplicativos e novos recursos de produtividade agregam ainda mais valor ao Creative Cloud:

**Lightroom:** Agora são oferecidos tutoriais interativos na área de trabalho do aplicativo, para que seus usuários inspirem-se em trabalhos profissionais e aprendam novas maneiras de editar fotos. O Lightroom também traz o Panorama Fill Edges, que preenche as bordas de uma imagem utilizando a tecnologia Content-Aware Fill.

**Premiere Pro:** Para a aplicação de edição de vídeos da Adobe foi lançado o Auto Reframe, que utiliza a inteligência artificial Sensei para analisar imagens e aplicar movimento e corte inteligente, mantendo a ação no frame. Este recurso otimiza tarefas comuns para os editores e permite que dediquem mais tempo à parte criativa do processo.

**After Effects:** As atualizações trouxeram melhorias significativas para o desempenho, que agora conta com reprodução fluida e suave de visualizações em cache, arquivos Multichannel EXR mais rápidos e um Content-Aware Fill mais rápido, que usa metade da memória.

**InDesign:** Para seu software de diagramação a Adobe lançou um novo suporte para a importação de arquivos vetoriais SVG além da implementação do Variable Fonts, que permite que os designers ajustem as propriedades do tipo como peso, largura, inclinação e tamanho ótico. Além disso há um novo recurso para o Asset Link, que permite a vinculação direta entre o os assets do Adobe Experience Manager (AEM) e o InDesign, permitindo acelerar ainda mais a criação de conteúdo digital e de impressão.


__


Sempre buscando otimizar os fluxos de trabalho e a inovação, a Adobe vem mudando o mundo através de experiências digitais. A [Alura](www.alura.com.br) oferece formação em [Design Gráfico] para quem deseja desfrutar de boa parte dos benefícios que vêm no serviço.



**Criar uma animação no After Effects é um processo demorado, exige muita dedicação e depois de semanas trabalhando incansavelmente em cada detalhe, chega a hora mais prazerosa: dar o play naquele bendito .mp4, subir no Youtube, Vimeo, mandar pro cliente, basicamente apreciar o momento de glória que é finalizar uma animação.**

Desde que comecei a trabalhar com o After Effects vejo que uma das razões principais pelas quais as pessoas travam no inicio de seus estudos é simplesmente o fato de não conseguir exportar o resultado final de tudo que criou. Ou não entender esse processo. É uma situação extremamente frustrante que distancia iniciantes da parte mais prazerosa: assistir o resultado final!

imagem, lembra? Para posteriormente fazer um GIF, podemos usar a pre-definição Loseless. Mas o que muda nesse caso? O codec. É a mesma composição e a mesma resolução. Para isso, vou apenas duplicar, clicando com o direito e selecionando “Duplicate” e alterar o formato clicando deixando na pre-definição “Loseless” mesmo, mas pera, eu estou criando duas exportações para a mesma coisa! imagem**




No meu sistema de cadastro de livros eu preciso do nome e do preço:

java

Para cadastrar um livro eu preciso passar as informações e enviar para o banco de dados:

java

Todas as vezes que eu quiser cadastrar um livro eu terei que instanciá-lo, pegar uma conexão, salvar o livro e fechar a conexão. Vamos supor que agora nós precisamos verificar se o livro já existe no banco e, caso exista, precisamos atualizar em vez de salvar:

java

Quanto mais procedimentos para poder salvar o livro eu precisar, maior ficará a minha rotina de salvar livros. Imagine todas as classes que precisarem salvar um livro, terão que ser atualizadas todas as vezes que houver uma mudança! É uma péssima solução... Que tal mudarmos esse procedimento de salvar o livro para um único método? Então, ficaria:

java

Agora não precisamos saber sobre conexão ou qualquer procedimento para salvar um livro, apenas chamamos o método `salvaLivro()`, enviamos o livro, e ele faz tudo por nós! Quando transformamos um procedimento que apresenta muitas regras de negócio ou rotinas complexas em um método, chamamos isso de **encapsulamento**. E se tivermos que fazer um _backup_ dos livros cada vez que salvar ou atualizar? Bastaria adicionar esse trecho em um único lugar, ou seja, no método `salvaLivro()`:

java

O código mudou e continuamos utilizando o método sem nenhuma preocupação se ele mudou ou não! Além disso, o código foi modificado em apenas um lugar, ou seja, não precisamos nos preocupar se vai quebrar o nosso sistema em todos os outros lugares que usam esse método! Além de ser mais elegante, torna o nosso sistema manutenível.

É sempre importante verificar em todos os pontos do código aonde é possível aplicar o encapsulamento, pois ganhamos muitos benefícios:

- Melhor manutenção de código.
- Divisão de responsabilidades.
- Reutilização de código.

**E aí, gostou do encapsulamento? Está pronto para analisar o seu código e verificar aonde ele pode ser aplicado? O encapsulamento faz parte de uma das boas práticas de refatoração de código onde é apresentado detalhadamente no [curso de Refatorando na prática com Java], que demonstra como fazer manutenção em um sistema com um código de qualidade utilizando as boas práticas de refatoração.**




Desenvolvendo um site para um cliente fictício me deparei com a seguinte situação:

imagem, que encontramos hoje em dia, como o [**Google Web Fonts**] e o [Font Squirrel], por exemplo, oferecem muito mais opções de escolha.

Mas não são justamente as fontes externas que influenciam na [**velocidade de carregamento da página**]? Bom, é uma questão de prioridades. 

No entanto, vale lembrar que mesmo as Web Fonts podem não ser apresentadas ao usuário, caso ele mesmo tenha desabilitado o download das fontes no navegador (Sim, é possível!). Isso geralmente é feito para aumentar a velocidade de carregamento em conexões mais lentas.

Então como garantir que teremos um plano B caso uma situação assim aconteça?

Podemos unir as duas ideias, ou seja, montar uma Font Stack com a Web Font de primeira opção e adicionar uma Web Safe Font na sequência:

css

A primeira fonte é uma fonte externa importada do Google Web Fonts, enquanto a segunda é uma das fontes mais genéricas entre as Web Safe Fonts.

Neste momento asseguramos ao nosso usuário que os textos serão exibidos corretamente.

Quer saber mais técnicas para otimizar seu site e melhorar a performance das páginas? Na Alura temos um curso muito legal de [**Performance Web**] ensinando as boas práticas e recursos que podemos utilizar para conseguir isso.




O mercado vem sofrendo uma rápida e abrangente evolução tecnológica, sobretudo para os designers. A tecnologia tem contribuído para a evolução de conceitos e hábitos do consumidor, além de ter diversificado as áreas de atuação e dado espaço a novas profissões para designers.


## Áreas do conhecimento

### UX Designer

Muito abordado para lojas virtuais, o User Experience (UX) é a classificação da experiência do cliente ao navegar em um site. Ou seja, por meio dessa avaliação, é possível identificar se o design do site e seu desempenho estão atendendo às expectativas do cliente e fazendo com que este tenha uma boa experiência durante a navegação.

Para desenvolver uma UX de [alta performance], é necessário contar com a colaboração de web designers, que vão estruturar toda a usabilidade e interface do site. Trata-se de uma importante área em crescimento, já que estamos falando de um período em que o número de lojas virtuais tem crescido.

### Design de serviços

Pensando na importância dos produtos, além da tecnologia, percebemos a sua usabilidade, o significado para os consumidores e sua estética. Tudo isso, juntamente com a abordagem para a oferta desse produto, classificamos como Design de Serviços.

Essa área de atuação consiste em programar todo o serviço a ser oferecido. Significa estar ao lado da empresa cliente para projetar como atender o cliente final com o produto e como este deverá ser. Por exemplo: se teremos um novo aplicativo para transporte de pessoas, o design de serviços vai estudar qual a melhor, mais inovadora e abrangente forma de atender esse cliente, além de criar a identidade visual do aplicativo.

### Medicina

No ramo da medicina, a tecnologia também tem aberto portas para os designers. Com o surgimento de novos tratamentos e inovação na busca de diagnósticos, os aparelhos precisam alcançar o melhor resultado. Os cuidados com ergonomia e funcionalidade são imprescindíveis para a checagem do paciente.

Designers passam a ter uma boa oportunidade para o desenvolvimento desses equipamentos, assim como a criação de próteses mais adequadas à necessidade de cada paciente, proporcionando a solução para o seu problema e mantendo o conforto aliado à funcionalidade.

### Web Designer

Essa não é uma das profissões mais recentes para designers, mas a citaremos levando em consideração o seu crescimento. Além dos sites institucionais, as redes sociais se tornaram o cartão de visitas para qualquer empresa na internet. Conteúdos em blogs e os anúncios são os maiores chamarizes para a visibilidade de sua empresa.

O web design compõe o [marketing digital], valorizando a identidade visual, estética e boa expressão de anúncios por meio de criações específicas para web. O profissional leva em consideração o conhecimento técnico e sua aplicação para o contexto da internet, visando atender às expectativas do cliente.

### Designer de Front End

O conhecimento em [HTML e CSS] permite que os designers sejam imbatíveis na construção de layouts para sites, blogs e demais conteúdos para a internet. Quando falamos em [Front End], nos referimos a toda a parte da plataforma do site visível para o consumidor.

Nesse ramo, o designer desenvolve o Front End, considerando seus conhecimentos técnicos sobre [performance do site] e estética. O trabalho vai desde a estruturação da navegação até a [harmonização de cores] a serem utilizadas. Essa é mais uma das oportunidades para designer que foram ampliadas com a chegada da tecnologia.

### Design de Interiores

Não muito relacionada à tecnologia, essa área de atuação considera a harmonização e organização de informações e identidade visual de interiores de imóveis. O designer tem a possibilidade de personalizar um ambiente a fim de atingir um objetivo de captação de clientes ou, simplesmente, reforçar a identidade da empresa e garantir o conforto da acomodação.

Esta área é importante para empresas que se preocupam com a estrutura física a ser apresentada a seus clientes e o tipo de conforto que deseja fornecer. Nesse caso, o designer atuará lado a lado com a equipe de Comunicação Interna, considerando que, mesmo que direcionado aos colaboradores, há objetivos a serem alcançados com uma boa harmonização do ambiente.

### Design gráfico

Os designers gráficos de veículos de comunicação impressos são aqueles responsáveis pela criação de jornais, revistas, panfletos, folders, cartões de visita, etc. O trabalho consiste em diagramar a informação de maneira interessante e chamativa, que atraia a atenção do consumidor.

O conhecimento necessário vai desde o comportamento do público, para entendimento de qual mídia abrangerá o maior número de pessoas, até o conhecimento técnico para a estruturação do material, respeitando a identidade visual da empresa contratante.

## Formas de atuação de designers

Como já vimos até aqui, estão abrindo diversas oportunidades de atuação para designers. Contudo, além de estar atento às tendências do mercado, é necessário que o designer esteja interessado em conhecer culturas, para saber contextualizar culturalmente o produto e, para desenvolver conceitos, é importante embasar-se no comportamento e ambiente no qual o consumidor está inserido.

Todas as profissões para designers podem ser exercidas em empresas. Porém, temos formas autônomas de atuação. Aqui, citaremos duas:

### Freelancer

Os trabalhos autônomos rendem um faturamento sustentável, se levados a sério. É possível ser dono do próprio negócio ou trabalhar como autônomo, recebendo demandas avulsas. Para que tenha sucesso, é necessário disciplina e organização. Somente assim será possível manter um índice satisfatório de produtividade.

### E-commerce

Um e-commerce de design funciona tão bem como outro qualquer. O cliente acessa o site, solicita um orçamento e ele próprio pode enviar material da marca para que as peças que deseja sejam produzidas e enviadas. É possível atender a vários clientes dessa forma, sendo como complementação da renda ou, até mesmo, uma renda fixa, dependendo do fluxo de atendimentos.

As opções de profissões para designer são muitas e o aperfeiçoamento vai permitir que tenha ainda mais chances de ter sucesso em qualquer uma das áreas.





Após muita observação, a resposta encontrada foi simples: os processos do design davam liberdade ao pensamento e à iniciativa individual, enquanto os processos tradicionais as restringiam. Isso ocorria pois os tradicionais se apegavam mais à burocracia com diversas etapas desnecessárias de documentação, checagem e hierarquia.

Por exemplo, um designer gráfico, ao ter uma ideia sobre um layout interessante para um site, teria que criar um projeto formal, para então enviá-lo a um superior hierárquico para ser aprovado.

No caso do design thinking, toda essa burocracia seria desnecessária. O colaborador seria livre para pensar em alguma solução para o cliente, sem muita formalidade. Ele apresentaria a sua ideia, ela seria melhorada pela própria equipe em um esforço colaborativo e seria rapidamente aprovada caso fosse viável.

Assim, o **design thinking** nos negócios emprega a sensibilidade e métodos do design para atender às necessidades das pessoas. Dessa maneira, a sua empresa pode criar um plano estratégico capaz de converter essas necessidades em valor para o cliente, o que transforma um problema antigo em uma oportunidade de negócio para a sua empresa.

Por isso, confira como aplicar o design thinking como uma estratégia de negócios!

## Desenvolver a empatia

Nesta primeira etapa, sua empresa realiza pesquisas para desenvolver o conhecimento sobre o que seus usuários fazem, dizem, pensam e sentem. Imagine o seguinte cenário: o novo objetivo da sua equipe é criar uma forma de melhorar uma experiência de integração de ferramentas para novos usuários.

Para isso, você deve conversar com diversos usuários reais e observar diretamente o que eles fazem, como eles pensam e o que eles querem. Assim, você questionará coisas como: "o que motiva ou desestimula os usuários?" ou "com o que eles se frustram e se recompensam?".

A grande finalidade deste momento é reunir observações suficientes que você pode realmente começar a desenvolver empatia com seus usuários e suas perspectivas.

## Definir

Combine todas as suas pesquisas e observe em quais áreas sua empresa pode apresentar soluções úteis à vida dos clientes. Ao identificar as necessidades deles, comece a procurar as oportunidades de inovação dentro do seu negócio.

Considere o exemplo da solução de integração anterior. Na fase de definição, use os dados recolhidos anteriormente para obter informações-chave. Organize todas as suas observações e busque os padrões nos relatos dos seus usuários. Existe um ponto comum de dor em muitos usuários diferentes? Com isso, você identifica as necessidades do usuário não satisfeito.

Por exemplo, tomando como referência o exemplo do início do post, você identifica que seus usuários precisam de um design para uma página web que seja amigável às mais diversas mídias, como smartphones, tablets e computadores pessoais. Então, toda a equipe será engajada na pesquisa de quais mídias eles mais usam, quais funcionalidades eles necessitam na página, etc.

## Idealizar

Faça um **brainstorm coletivo** em toda a empresa. Então, escreva todas as ideias que passaram nas cabeças de sua equipe, por mais que pareçam uma loucura. Neste momento, você quer ideias criativas que abordam as necessidades do usuário não-satisfeito, que foi identificado na fase "definir".

**Dê à sua equipe total liberdade! Nenhuma ideia é muito complexa e, neste momento, desejamos muito mais quantidade do que qualidade**. Afinal, algumas ideias inicialmente ruins podem ser polidas até se tornarem o carro-chefe da sua empresa.

Por fim, você vai reunir os membros da equipe para esboçar mais ideias diferentes. Em seguida, eles as compartilharão uns com os outros, misturando e remixando tudo, construindo novos conceitos aprimorados sobre as ideias uns dos outros.

Neste momento, sua empresa vai utilizar todo o seu arsenal para criar uma solução única e criativa. Todo mundo deve falar todas as ideias sobre o layout: a landing page, os botões, as abas, as cores e as formas.

## Prototipar

Depois de sua equipe ter selecionado e aprimorado as melhores ideias, é hora de **construir um protótipo** de cada uma delas. Então, construa representações reais para elas. Por exemplo, se vocês gostariam de remodelar algum processo da empresa, criem um modelo ou uma maquete que ilustre bem como os novos processos potenciais funcionariam.

O objetivo desta fase é entender quais componentes de suas ideias funcionam e quais não. Assim, nesta etapa, você começa a contrabalancear o impacto com a viabilidade de suas ideias. Para isso, sua equipe deve se reunir novamente e cada um deve dar um feedback sobre os protótipos.

Este momento é muito importante e jamais deve ser ignorado, pois nele vocês vão perceber quais ideias podem ser aprimoradas e quais devem ser descartadas.

Na fase de protótipo provavelmente temo diversos wireframes. Precisamo ter em mente que eles não são o produto final, então podem ser reformulados infinitamente com base nos feedbacks. O conceito dessa fase é refazer, refazer e refazer.

## Testar

Retorne para os comentários dos clientes obtidos lá na primeira fase. Então, pergunte a si mesmo: "esta solução atende às necessidades dos usuários?" e "melhorou como eles se sentem, pensam ou fazem suas tarefas?".

Exponha seu protótipo para alguns clientes insatisfeitos e peça para que eles verifiquem se a novidade atinge seus objetivos. Os processos internos estão mais rápidos? A perspectiva dos usuários durante a navegação melhorou?

Como você ainda está em fase de criação, não tenha medo de testar e testar novamente até obter um protótipo ideal. Aqui você submete os protótipos criados para o cliente testar, então ele pode dizer o que gostou e desgostou em cada uma e quais ferramentas ele deseja ou dispensa.

## Implementar

**Coloque suas ideias em prática efetivamente**. Não se trata mais de testar, e sim de criar uma solução definitiva. Por isso, cuide bem das etapas anteriores para chegar com sua solução materializada, que melhora a vida de seus clientes finais de alguma forma.

Esta é a parte mais importante do pensamento de design, mas é o mais frequentemente esquecido. Afinal, o pensamento de design não o liberta do projeto real. As etapas anteriores não são um fim em si mesmas, elas têm um fim, que é a implementação.

**Por mais impactante que possa ser a idealização do projeto para a sua empresa, ela só leva à verdadeira inovação se é executada**. O sucesso do pensamento de design reside na sua capacidade de transformar um aspecto da vida do usuário final em uma oportunidade de negócio para a sua empresa. Por isso, este passo é essencial.

Por fim, depois de tantas etapas, você vai ver que surgirá um produto final aprimorado tanto para seus clientes internos quanto os externos. **Afinal, o design thinking pode ser empregado para uma gama imensa de atividades da sua empresa: otimização de processos, criação de novos produtos, iniciação de uma estratégia de rebranding**, etc.

Isso acontece, pois é uma metodologia para tirar as amarras da criatividade, uma vez que,no dia a dia, seus funcionários passam a pensar somente em ideias pragmáticas e se esquecem da importância de pensar livremente.

E quem quer aprender a [**analisar os resultados encontrados em uma experiência de Design Thinking**], temos um curso na Alura ideal para conseguir olhar pra a squestões e levantar soluções mais assertivas. ;)




Entrando na pasta **webapps** do seu Tomcat não encontramos nada, a não ser as aplicações de exemplo do próprio Tomcat.

Ou mesmo quando queremos fazer upload de arquivos na aplicação e não sabemos para onde o arquivo foi, uma vez que ele está na pasta de aplicações do Tomcat, algo como:

sql

Ou seja, quase impossível de achar.

O que ocorre, é que o Eclipse tenta liberar nossa pasta do Tomcat, não alterando os arquivos de configuração e/ou estrutura de pastas. Porém, muitas vezes, não é isso que desejamos. Queremos que o Eclipse use a própria pasta do Tomcat para isso. E a modificação para que isso funcione é bem simples.

**Passo 1**: Clique com o **botão direito** em cima do Tomcat na _aba Servers_ do Eclipse, e depois vá em **Add and Remove** e remova todas as aplicações que estiverem no servidor (apenas as que aparecem no eclipse). Confirme em **Finish**.

**Passo 2**: Clique novamente com o botão direito em cima do Tomcat e escolha a opção **Clean**.

**Passo 3**: Agora, clique duplo no servidor Tomcat (novamente na aba **Servers**). Na tela que abrir, procure pela opção **Server Locations** e marque a opção **Use Tomcat installation (takes control of Tomcat installation).**

Antes de fechar a tela, Salve as alterações feitas, _ou terá que fazer esse passo 3 novamente_.

Isso vai fazer nosso projeto ir para dentro da pasta do Tomcat diretamente. Porém o Eclipse separa as aplicações enviadas por ele na pasta _wtpwebapps_. Abrindo pelo explorer, vemos que nossa aplicação aparece lá, e não mais na pasta temporária do eclipse maluca que o Eclipse gerava antes.

**Passo 4**: Vamos colocar nossa aplicação de volta dentro do servidor, novamente com o botão direito no Tomcat -> `Add and Remove`, mandamos nossa aplicação para o lado direito e confirmamos em `Finish`. Confira pelo explorer se a pasta da aplicação foi criada no servidor corretamente. Algo como _seu_tomcat/wtpwebapps/sua_aplicacao_.

Com essa simples modificação, nosso projeto fica mais fácil de ser encontrado no Tomcat e até o upload de arquivos, que poderia não funcionar por causa das pastas temporárias e permissões, agora devem funcionar corretamente.

E aí? Ajudou a resolver aquele problema de upload ou mesmo a encontrar melhor seus arquivos? No nosso curso de **[Spring MVC 1 e 2]**, realizamos upload de arquivos, e também precisamos realizar essa configuração do Tomcat dentro do Eclipse.




Para medir o volume de chamados de suporte da empresa fiz o seguinte gráfico, e agora vou melhorar a sua visualização:

![]

Repare que a nossa atenção vai diretamente para a borda ao redor do gráfico, então a primeira coisa que farei será removê-la.

![]

Removendo a borda conseguimos manter o foco principal no gráfico, o segundo passo é melhorar a visualização das duas linhas principais, e faremos isso removendo as linhas de grade.

![]

Melhoramos a visualização das duas linhas no gráfico, mas os pontos nessas linhas atraem a nossa atenção antes que possamos compreender a linha inteira. Iremos removê-los também.

![]

Neste ponto, conseguimos visualizar claramente as linhas principais. Vamos expandir a nossa visão e olhar para os eixos.

Repare que o eixo vertical inicia no número 50, o que faz a distância entre 0 e 150 parecer menor. Nesse caso, a boa prática é iniciarmos no 0, assim deixamos claro pela distância que são 150 chamados. Então, irei alterar o ínicio do eixo vertical de 50 para 0.

![]

Olhando também para o eixo horizontal, veja que precisamos inclinar um pouco a nossa cabeça para podermos ler os nomes de cada mês, logo, o que irei fazer é reduzir os nomes dos meses para as suas três letras iniciais. Além disso, será que a palavra **mês** ali nos ajuda a entender que são meses ou já sabemos? Irei retirá-la do eixo para vermos se faz diferença.

![]

Veja que retirar a palavra **mês** não fez diferença, pois continuamos entendendo que os meses estão sendo referenciados no eixo horizontal.

Agora, vamos fazer mais um teste. Há pessoas que não enxergam cor, e precisamos nos preocupar com elas ao montarmos uma visualização. Será que conseguiremos entender esse gráfico se ele estiver em preto e branco?

![]

Repare que ao passar o gráfico para preto e branco, não conseguimos entender qual a linha de volume de chamados recebidos e qual a linha de volume de chamados resolvidos. Para melhorarmos isso, precisamos anotar ao lado das linhas quais foram recebidos e quais foram resolvidos.

![]

E também não precisamos mais da legenda abaixo do gráfico. Como já temos o gráfico finalizado em preto e branco, vou também alterar as cores para o azul e vermelho originais tanto do gráfico quanto das legendas.

![]

Nossa visualização está quase pronta. Vamos olhar para o gráfico, temos uma linha de recebidos e outra de resolvidos, mas recebidos e resolvidos do que? Por fim, vamos colocar um título que descreva a informação principal que queremos mostrar com o gráfico.

![]

E nossa visualização está pronta! Podemos olhar os gráficos inicial e final lado a lado agora para vermos a transformação:

![]

## Para saber mais

Gostaria de continuar aprendendo sobre visualização de dados? Você pode fazer os cursos de [**Visualização de dados parte 1**] e [**Visualização de dados parte 2**] na Alura.
Melhore a comunicação da informação por um gráfico aplicando práticas de visualização de dados.



Mesmo em tempos de alta de leitura informativa e vídeos, é nos livros que podemos encontrar informações mais ricas e relevantes. É como estabelecer um contato, ainda que passivo, com uma grande referência no assunto.

Considerando, assim, todos os benefícios que uma boa leitura pode proporcionar, separamos aqui 7 livros que podem ser de grande ajuda na sua formação em TI. Quer saber quais são? Então continue acompanhando o nosso artigo e confira!

## 1\. O Poder dos Quietos, de Susan Cain

[Susan Cain] é uma verdadeira entusiasta do comportamento humano e se incomodava com a forma como a sociedade trata as pessoas introvertidas. Estas são definidas pela escritora da mesma maneira como ela define as [mulheres] de antigamente: cidadãos de segunda classe, com enormes quantidades de talento inexplorado.

Caso você esteja se identificando com o tema — já que ele retrata o comportamento de boa parte dos profissionais de TI — saiba que este livro revela como as características desse tipo podem ser aprimoradas para auxiliar no seu [marketing pessoal] e superar as dificuldades da introversão.

Logo na sequência, a leitura de _[O Poder dos Quietos]_, lançado em 2010, ajudará você a enxergar a si próprio de forma diferente. E, para o líder de uma organização, a obra ainda ensinará a enxergar o grande potencial que existe dentro dessas pessoas e acaba por muitas vezes não sendo aproveitado.

## 2\. Engenharia de Software – Uma Abordagem Profissional, de Roger S. Pressman

Em quase todos os cursos de graduação na área de TI, a disciplina de Engenharia de Software se faz presente — com mais ênfase em algumas instituições do que outras. Mas, independentemente da matriz curricular, é essencial que o estudante compreenda bem essa disciplina.

Por isso, lançado em 1982 e distribuído atualmente na sétima edição, [o livro de Roger Pressman] aborda, de modo didático e com conteúdo bem elaborado (incluindo ilustrações), diversos conceitos de TI e as etapas do processo de engenharia que cada produto de software passa até chegar ao cliente.

Sobre o autor, sem dúvida, estamos falando de uma das maiores referências sobre o assunto no mundo todo, tendo mais de 40 anos de experiência com engenharia de software. E autor, também, de outras 9 obras até o momento.

Em outras palavras: você tem todas as razões para ler o que [Pressman] tem a dizer!

## 3\. Use a Cabeça! Programação, por David Griffiths & Paul Barry

[Esta edição da série Use a Cabeça! _(Heading first!)_] aborda todos os conceitos básicos de programação objetos, variáveis, funções, loops etc. — usando a linguagem [Python], que é considerada uma das [linguagens] mais fáceis de se aprender.

Trata-se de uma obra produzida para iniciantes na área de TI que desejam aprender a escrever um programa a partir de um livro. A missão para auxiliar isso ficou a cargo de [Paul Barry] e David Griffiths, duas grandes referências britânicas do setor.

Assim, ao ler o livro e praticar os ensinamentos em um ambiente de desenvolvimento básico, você será capaz de criar vários tipos de programas com funções primárias. E sem desperdiçar tempo, já que os autores dão dicas para escapar de erros comuns que atrasam o desenvolvimento.

## 4\. Redes, Guia Prático, de Carlos Morimoto

Os livros escritos por Carlos Morimoto, criador do site hardware.com.br e autor da coleção Hardware, são considerados clássicos para o aprendizado de alguns conceitos de TI. Para quem se interessa por redes, uma boa sugestão é ler a sua obra específica sobre o tema, chamada [Redes, Guia Prático].

Nesse livro, Morimoto explica (em 560 páginas) tudo que o iniciante deve aprender sobre cabeamento, configuração de redes Linux e Windows, firewall, protocolo TCP/IP, redes locais, redes móveis e muito mais.

De fato, essa leitura pode ser um ótimo ponto de partida para quem deseja saber como funciona uma rede e se essa é, de fato, a área que deseja seguir. — Caso for, você poderá avançar para leituras mais específicas.

## 5\. Design de Navegação Web, de James Kalbach

Sem dúvida, o pensamento sobre web design não pode se limitar à estética, devendo abranger também a funcionalidade e a otimização da experiência do usuário em sua navegação pelo site.

E é justamente esse o conceito que [James Kalbach], autor do _Mapping Experiences Rapidly_ (disponibilizado gratuitamente em seu [blog]) procura passar nesta obra. Além de ensinar várias práticas aplicáveis no desenvolvimento, ele também ensina o leitor a criar uma visão crítica sobre web design.

Então, se você se interessa pela carreira na área de design, sugerimos que considere o livro [Design de Navegação Web] um dos seus guias de referência.

## 6\. Linux a Bíblia, de Christopher Negus

Para quem almeja seguir carreira em qualquer setor da área de TI, a importância de aprender sobre o sistema Linux é muito maior do que se pode imaginar.

De fato, é difícil progredir na carreira dominando apenas o Windows, por exemplo — ainda mais com a adoção cada vez maior do Linux em ambientes corporativos, principalmente quando o assunto é redes.

Por isso, o livro [Linux a Bíblia], escrito por [Christopher Negus] — uma das maiores referências em Linux e autor de mais outros sete livros sobre o tema —, vai te ensinar a dominar habilidades tanto em desktop quanto em servidor, assim como a dominar o próprio sistema a ponto de se tornar um usuário avançado.

## 7\. Um Bate-papo sobre T.I., de Ernesto Haberkorn

Talvez um dos maiores problemas que um estudante enfrenta no início de carreira seja a leitura de conteúdos complexos, cuja linguagem é direcionada a usuários mais avançados. O que torna essa leitura pouco proveitosa, já que o conteúdo não é absorvido.

Então, pensando em proporcionar uma experiência mais “receptível” aos novatos, o professor [Ernesto Haberkorn], um dos maiores especialistas em ERP _(Enterprise Resource Planning)_ do Brasil, permite ao leitor do seu livro [Um Bate-papo sobre T.I]. tirar dúvidas que não costumam ser encontradas em outros livros sobre o assunto.

A maior parte da obra trata da carreira de um empreendedor e profissional de TI, relatando alguns obstáculos enfrentados pelo próprio Haberkorn. Além de dicas sobre aspectos motivacionais, sociedade, relacionamentos e, é claro, carreira em tecnologia da informação.

## Dica preciosa: leia obras escritas em inglês!

Independentemente do segmento, o Brasil ainda é conhecido por não traduzir obras essenciais para os seus leitores. E na área de TI a realidade é a mesma: são poucos os conteúdos estrangeiros traduzidos para o nosso português.

Portanto, é fundamental até mesmo para crescer na sua carreira aprender a ler em inglês para ter acesso aos melhores livros já publicados.

Afinal, o inglês é o idioma “oficial” para profissionais da área de TI, usado como base nas linguagens de programação. Sem contar que é o idioma nativo da maioria dos grandes especialistas do mercado!





Uma das perguntas que mais gosto de responder é para ajudar alguém a encontrar um primeiro caminho na carreira de desenvolvimento de software.

Gosto de programar, comecei aos 9, e sempre pude ter meu irmão, o Paulo, fundador da **Caelum** e do **GUJ**, como guia. Mas e quem não teve essa sorte? Tento repassar um pouco do que aprendi com ele nesses últimos 25 anos.

Temos **Java**, **.NET**, **PHP**, **Ruby**, **Python**, **Javascript** e por aí vai. O maior mercado de desenvolvimento hoje em dia é web (sites web e aplicativos mobile usam aplicações web) e todas essas linguagens se encaixam nesse nicho.

## Passo 1 - Ainda não sabe programação?

O primeiro passo é um **curso de lógica**, mas não de diagramas, fuja de cursos de diagramas puros. Nem você nem eu vemos diagramas no dia a dia, no mundo real. Não é natural. Repito: fuja de aprender através de diagramas sem prática de código - eles são válidos, mas limitados.

### Vamos então direto para aprender lógica na prática.

Comece logo com algo real ao [aprender lógica] ao desenvolver um jogo de adivinhação em Ruby, [um jogo da forca] , e finalizando com um curso onde [criamos um Pacman] em modo texto. Você verá não só conceitos de lógica, mas entenderá como funciona o computador e os desafios de criar um programa no mundo real.

Prefere outra alternativa? [Aprenda lógica com Javascript] para resolver problemas reais. E logo em seguida reforce essa base ao [criar um jogo] que envolve gráficos também com Javascript.

## Passo 2 - A base para a web

Para quem já sabe programar ou quem já fez esses cursos acima, o leque de oportunidades se abre e muito.

Aprenda agora o básico de [**HTML** e **CSS**] construindo um site na prática, e logo depois o básico de [banco de dados relacionais] com **MySQL** novamente resolvendo problemas reais.

## Passo 3a - Programando e ganhando dinheiro logo, de casa mesmo

Você quer começar a trabalhar logo, de casa mesmo, criando alguns sites para familiares ou conhecidos? Se você fez o curso de lógica em Ruby, já pode [aprender Ruby on Rails 5] para implementar um sistema real.

Se fez os cursos de lógica em Javascript, pode aprender PHP e Mysql com fundamentos para criar um [sistema Web cookies, sessões e mais recursos].

Tanto **Ruby on Rails** quanto PHP são amplamente utilizados nesse nicho.

## Passo 3b - Conseguindo um estágio no mercado

Existe um grande mercado de vagas de desenvolvedores Java e C#. Claro que a maior demanda é por desenvolvedores com mais experiência, mas mesmo assim a demanda é muito grande.

Um próximo passo agora que você já entende como funciona a criação e os problemas de se desenvolver um site é entrar no mundo Java ou C#.

- Comece com os [primeiros passos em Java].
- Aprenda [orientação a objetos com Java].
- Entenda as [principais APIs e bibliotecas de base].

- Aprenda os [fundamentos de C#].
- Entenda [**Orientação a Objetos** com C#].
- Continue com [tópicos mais avançados de C#].

Os dois caminhos são mais longos do que os de Ruby, PHP e até mesmo Python, sendo que esses três cursos apresentam a base da linguagem. Claro que todas as outras linguagens também possuem vagas no mercado, mas de acordo com o google trends a busca por essas duas ainda é muito forte e é o que recomendo.

## Passo 3 - Criando um jogo no mundo real

[Criar um jogo no mundo real], no mundo físico, é uma tarefa muito divertida que fazemos com o Arduíno. A linguagem é baseada em C, portanto se quiser ir para esse lado aprenda lógica e programação com a [introdução a C], [avançando na linguagem C], e [recursos avançados da linguagem] antes.

## Passo 4 - Como continuar

Não queria deixar em branco o próximo passo... já aprendi uma linguagem e já estou programando para a web. Como todos os nossos cursos e livros, é fundamental entender e utilizar boas práticas de código. Além disso é importantíssimo ter uma [boa prática de estudo] para não deixar de estudar daqui a pouco.

E claro, além de todas essas opções que temos na Alura pra quem está aprendendo a programar, também [temos os cursos presenciais na Caelum] pra quem preferir essa forma de ensino. Eles vão desde a [lógica de programação], até [a formação Java], assim em poucas semanas você vai sair programando suas próprias ideias.

Agora você está livre para continuar o caminho que escolheu, claro que sempre buscando boas práticas e bons professores.




Visualizar dados é uma das tarefas de um cientista de dados, por isso estava analisando os dias em que as pessoas mais acessam a plataforma da **Alura**. Para isso, os acessos da plataforma em uma semana do mês:

python

Esse método dos devolve um [**Series do Pandas**]:

python

 

Cada dia da semana está representado por um número - **0** para o domingo, **1** para segunda-feira, e assim para os demais.

Bacana! Já temos os dados, como podemos **calcular a frequência** agora?

## Cada dia, um valor

Precisamos saber o total de acessos em um dia, ou seja, temos que pegar cada dia da semana e ir somando 1 a cada vez que ele aparece na nossa lista. Há algumas formas de se fazer isso, uma é fazer um loop e ir iterando por cada valor no array, outra é utilizar a classe `Counter` da biblioteca de **collections** do **Python**.

Para utilizar essa classe, precisamos importá-la do pacote de `collections`:

python

Agora, só precisamos passar a nossa variável de acessos no construtor da classe `Counter`:

python

A classe `Counter` cria um dicionário onde a chave são os dias da semana e o valor é a quantidade que cada dia apareceu na amostra.

Podemos pedir para o Python nos mostrar o conteúdo dessa variável:

python

python

Podemos ver que a saída são todos os dias da semana e quantos acessos tivemos em cada um deles. Como estamos utilizando um `Counter`, podemos ainda pedir apenas os dias mais comuns, isso é, os dias com mais acessos:

python 

 

Humm… ele nos devolve uma lista ordenada, onde cada posição é uma **tupla** com o dia e a quantidade de vezes que ele apareceu. Podemos filtrar esse valor e pedir para o Python só nos mostrar, por exemplo, os três dias com mais acessos:

python

 

Bacana! Conseguimos visualizar aquilo que queríamos. Porém, ainda só conseguimos olhar esses dados pelo terminal, qual outra maneira temos de visualizar esses dados?

## Um gráfico vale mais do que mil palavras

Uma forma muito [**comum de visualização de dados é por meio de gráficos**]. Existem diversas formas de criar um gráfico e visualizar os dados. No nosso caso, estamos calculando a frequência de acessos e um gráfico muito utilizado quando queremos visualizar isso é o gráfico de barras.

Vamos plotar esses dados utilizando a [**Matplotlib**], uma biblioteca muito utilizada no mundo Python para visualização de dados.

Antes de tudo, precisamos importar da biblioteca o módulo de plotar gráficos com Python **pyplot**:

python

Podemos pedir para o `pyplot` plotar um gráfico de barras para gente, onde o eixo **X** tem os valores dos dias (`quantidade_de_acessos_por_dia.keys()`) e o eixo **Y** os valores das frequências (`quantidade_de_acessos_por_dia.values()`):

python

imagem` (de histograma), do que **bar**, falando sobre um gráfico de barras que pode ser "genérico".

Outro ponto interessante é que com os histogramas, temos tipos de manipulações de dados comuns para dados de frequências, como por exemplo, descobrir a frequência acumulada da amostra que estamos vendo.

Para isso, basta dizer que o parâmetro **cumulative** é verdadeiro:

python

imagem 70 pessoas acessaram a plataforma. Esse valor vai se acumulando até o fim da semana.

## Com que frequência?

Gráficos são muito utilizados na visualização de dados. Com eles, conseguimos ver de uma maneira macro como nossos dados se comportam.

Existem diversos tipos de gráficos. O histograma por exemplo, também conhecido como distribuição de frequências, é muito utilizado quando temos que visualizar a **frequência de dados** em uma amostra.

No nosso caso, olhamos apenas a frequência acomulada absoluta. Porém, poderíamos ter olhado a frequência relativa. Isto é, o percentual que cada grupo de dados representa.

Por exemplo, na nossa amostra temos 9791 dados. Isso representa 100% da amostra. Domingo tivemos 953 acessos, aproximadamente 9,73% dos dados. Já segunda tivemos 1477 acessos, ou 15,09%.

Acumulando essas duas frequências relativas, temos 24.82%. O que nos diz que 24.82% dos acessos foram entre domingo e segunda.

Visualizar dados é uma das tarefas principais de um cientista de dados. Aqui na [**Alura, temos uma formação sobre Data Science**]. Nela você aprenderá desde a parte de visualização, mineração, exploração e avaliação de hipóteses e muito mais.




Sabia que hoje é possível fazer páginas Web **funcionarem offline**? Na verdade, há uns bons anos o HTML5 permite isso com a _Application Cache API_. Mas se você já tentou usar,sabe que é difícil, chato e limitado.

A nova especificação de **Service Workers** repensa a Web Offline inteira. E faz a coisa direito. É o futuro das Web Apps! Nesta palestra, falo dos conceitos revolucionários dessa API e mostro como fazer uma página offline na Web:

https://www.youtube.com/watch?v=mchPQdKbbus

(Palestra gravada no evento FrontInPOA em Porto Alegre)




Quando fiz faculdade de Marketing achei que Redes Sociais era a área mais importante dentro do Marketing Digital e conforme fui me aprofundando nos estudos percebi que Marketing Digital pode ser um universo dentro do Marketing. 

Primeiro pergunte-se: você será responsável por todo o Marketing Digital de uma empresa ou por só uma parte? Ou seja, você ficará responsável apenas pela gestão das redes sociais (publicação de conteúdo e interação com os usuário), por exemplo ou vai cuidar dos anúncios, **SEO (Search Engenier Optimization)**, envio de e-mail marketing, gestão de conteúdo das redes sociais, blog, criação das imagens.... Percebeu que existem várias coisas para serem feitas?

Se seu papel é atuar em uma única parte do Marketing Digital de uma empresa, sugiro primeiro estudar todos os cursos daquela área, para depois abrir seu leque de opções com outros cursos.

Se irá atuar em todas as frentes de Marketing Digital de uma empresa, sugiro estudar o primeiro curso de cada área, e ai seguir estudando aquelas que se encaixam com o momento atual de suas tarefas na empresa.

Vamos então as diversas áreas que temos por aqui nesse instante?

**Opção 1. Conteúdo** Se você gosta de escrever e busca uma maneira de compartilhar as suas ideias e experiências e assim criar autoridade em um determinado assunto para a sua marca ou negócio, uma alternativa interessante é fazer o curso [**Marketing de Conteúdo: Uma introdução ao Marketing de valor**].

**Opção 2. Social Media** Se pretende atuar nos perfis de uma empresa nas redes sociais, entenda melhor qual é o perfil do profissional que faz a gestão de conteúdo e interação com os clientes através das redes sociais.

No curso [**Social Media Marketing: como fazer marketing nas redes sociais**] você vai entender a importância e as possibilidades que ter uma presença digital para um negócio ou marca através das redes sociais pode ter. 

Uma vez que isso fique claro para você, que tal conhecer mais as principais redes sociais? Aprenda a criar uma fanpage no curso [**Facebook Marketing**] e melhore a influência de sua pagina.

Se quiser também atacar a parte de design de ads para o mesmo, não deixe de fazer o curso [**Facebook: criação de imagens e anúncios**]. 

No curso [**Instagram Marketing: Promova seu perfil e conquiste mais audiência**] vemos como tornar o seu perfil mais relevante, como pesquisar referências para você ter ideias sobre o que publicar e como mensurar os resultados das ações que você realizar.

**Opção 3. SEO** Se você pretende aumentar o acesso a sua empresa e seu conteúdo através de search engines como o Google, existe uma série de cursos ligadas aos canais não pagos: começando com [**Introdução aos canais não pagos**], passando por [**SEO I: Rankeie bem no Google**], [**SEO II: Mais técnicas para rankeamento**] e [**SEO III: Métricas e Relatórios SEO**].

**Opção 4. Canais pagos** Entenda quando é o momento adequado de usar canais pagos em sua empresa através do curso [**Introdução aos canais pagos**], depois entenda como aplicar técnicas de ads no [**Google Adwords: Publicando a minha primeira campanha**] e [**Google Adwords: Otimizando seus resultados**].

**Opção 5. E-mail Marketing** No dia a dia é interessante manter o contato com seus clientes através de diversos meios e os cursos de Email Marketing vão permitir que você entenda um pouco mais sobre como trabalhar esse canal. Primeiro entenda o mesmo com [**Inbound marketing: Email marketing da segmentação ao AB**]. Depois o curso de [**Email marketing: design do seu email**] ajuda aqueles que pretendem fazer o design desses emails de forma tradicional.

**Opção 6. Criação de sites/Blogs** Muitas empresas e empreendedores que divulgam conteúdo gerenciam sua própria plataforma e a mais famosa delas é o Wordpress. Pensando nisso, se você será responsável pelo manuseio da ferramenta no dia a dia, não deixe de estudar [**Wordpress: primeiros passos para não programadores**]. 

Se você quiser se aprofundar na parte técnica do mesmo, como instalação configuração e customização, veja também [**Wordpress I: Hospedagem, Adm e widgets**] e [**WordPress II: páginas, temas e boas prática**].

**Opção 7. Ecommerce** Por fim, se sua empresa é de ecommerce, uma das ferramentas mais populares hoje em dia é o Shopify, e mantemos dois cursos sobre como utilizá-la no dia a dia em [**Shopify I: Colocando sua loja online no ar**] e [**Shopify II: Customizações e ajustes para a sua loja online**].

**Resumindo**

Independentemente de qual área seguir, é interessante saber medir os resultados de sua empresa em sua presença online, e para isso temos o curso [**Medindo resultados**].

Espero que esse post ajude você a traçar um caminho para sua carreira nessa área que tanto cresce no Brasil, permitindo a criação e divulgação de sites e empresas cada vez melhores e que trazem melhores resultados tanto para seus clientes quanto para a empresa.

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Completei mais um curso na Alura e aumentei a minha pontuação:

java

Para imprimir a minha pontuação basta concatenar a variável `aluno + pontos` dentro de um sysout:

java

Mas, como eu poderia fazer com que o aluno e a pontuação fossem uma variável só? É simples! A mesma coisa, basta "converter" a variável inteira (`int`) para `String`:

java 

Mas agora entrei no instrutor Guilherme Silveira, e olha os pontos dele:

java 

Olhando de cara qual é o valor desse número? Um milhão e oitocentos mil? Dezoito milhões?Cento e oitenta milhões? Vou ter que contar com o dedo na tela para saber o valor exato, muito chato e é certeza que eu vou errar!

Para separar a pontuação por casas podemos utilizar a classe `NumberFormat`:

java

Resultado:

java 

Ótimo! O número foi formatado como esperado, porém na maquina do João o resultado foi:

java 

Calma aí. Está dependendo da máquina??? Isso ocorre pois o getInstance devolve um formatador baseado na linguagem configurada na máquina. Para informar uma região específica basta definir uma localização, um `Locale`.

No meu caso, quero a língua portuguesa `("pt")`, com a variação do português brasileiro `("BR")`.

java

Resultado:

java 

Agora tanto a minha máquina como a do meu colega, ou ainda, a máquina de produção imprimem o mesmo resultado.

Quando começamos a programar, aprendemos a concatenar e parece o suficiente… mas mesmo em uma tarefa simples é importante seguirmos 3 passos:

- números acima de 999 ficaram legíveis?
- use o Locale adequado.
- teste em mais de uma maquina.

**[A classe Locale e o conceito de regionalização] é tambem explicado com mais detalhes nesse post da Caelum.**




Acabei de terminar mais uma funcionalidade da minha aplicação e preciso testá-la. Porém a minha aplicação possui o ambiente de desenvolvimento, teste e produção:

java

Agora vou usar a classe Scanner e fazer a leitura pelo teclado para testar o meu código:

java

Resultado:

shell

Poxa vida... 

Além de cansativo, existe a possibilidade de eu errar a opção e executar um ambiente por engano ou até mesmo não executar nenhum. Como eu posso fazer com que, ao executar o meu programa, ele já saiba que ambiente rodar? Pelo parâmetro args do método `main`!

java

Ué, aquela variável que não serve pra nada?

O parâmetro args é um array que **recebe dados da command line** (linha de comando), ou seja, no momento que executamos a nossa aplicação podemos enviar uma informação por meio dele.

## Enviando o parâmetro args na execução

Vamos então fazer teste enviando o valor **DEVELOPMENT** durante a execução da classe `Main`:

imagem`:

java

Testando o ambiente de desenvolvimento:

imagem`, como por exemplo usuário (user.name) ou o sistema operacional (os.name).

E aí, já passou por alguma situação em que precisava testar ambientes diferentes? O que achou dessa alternativa utilizando o `String[] args` e as Properties da classe `System`? 



Afinal, qual a diferença entre as tuplas e as listas na linguagem **Python** ? Veja quando utilizar uma e outra e perca essa grande dúvida :)!

Estou trabalhando em uma aplicação de mapeamento que se baseia em [**coordenadas geográficas**] para localizar endereços. Mas como posso armazenar estas coordenadas?

Uma ideia é termos uma variável para latitude e uma para longitude, mais ou menos dessa forma:

py

Por enquanto tudo bem. Mas quero trabalhar com rotas e distâncias, então preciso de mais de uma coordenada. E aí, como fazemos? Temos que criar outras variáveis de latitude e longitude?

py 

Bem… isso já está ficando estranho, não é? À medida que a quantidade de coordenadas vai crescendo, nosso código está ficando mais confuso e nos dando mais propensão a erros.

O ideal seria não deixar **latitude** e **longitude** separados, mas juntos em uma variável só, realmente organizados como uma coordenada. Quando queremos guardar juntos mais de um valor no Python, a primeira coisa que vem à mente são… [**as listas**]! Vamos usá-las, então:

py 

Agora já melhorou bastante, temos as nossas duas coordenadas separadas e organizadas! Mas será que uma lista é o melhor tipo para o que queremos fazer no Python?

## Os problemas da lista

Listas no Python são incrivelmente poderosas e úteis, mas será que são o ideal no nosso caso? Em primeiro lugar, podemos pensar no que pode ser problemático na prática, como a mutabilidade das listas.

Já sabemos que [**listas são mutáveis**], ou seja, que os valores de um mesmo objeto lista podem ser alterados. O que aconteceria, então, se alguém adicionasse um valor em `caelum_coordenadas` com o método **append()** ou ainda removesse um com o **remove()**. Essa variável não teria mais sentido nenhum!

Pior seria se alguém simplesmente mudasse um dos valores, fazendo por exemplo isso:

py 

`caelum_coordenadas` agora apontaria para uma coordenada sem relação nenhuma com o que era pra ter o endereço da Caelum São Paulo. Agora, na verdade, [aponta para o meio do Oceano Atlântico]! Isso não faz sentido nenhum pra nós…

Além dessa questão prática, temos um grave problema de **semântica**. Usamos uma lista para representar a coordenada, certo? Mas se é uma lista, **é uma lista de quê?** Afinal,são dois valores diferente - **latitude** e **longitude**.

A [**própria documentação do Python**] indica que os elementos de uma lista são, geralmente, **homogêneos**. Ou seja, têm o mesmo tipo e significado. Com as nossas coordenadas, temos valores **heterogêneos**, pois representam duas coisas diferentes (para então formar uma só).

Não só; direto de uma definição de lista no dicionário: uma relação **ordenada** de coisas **relacionadas**. Repare que o que queremos não é **ordem**, mas **estrutura** a relação não é de que latitude vem primeiro que longitude, mas que latitude está na primeira posição, enquanto longitude na segunda.

O que além da lista poderia ser usado para satisfazer melhor nossa necessidade?

## Conhecendo as tuplas

O Python nos disponibiliza um tipo que preenche muito melhor as características que procurávamos - [as **tuplas**]. Tuplas podem ser consideradas similares às listas, mas suas diferenças são cruciais.

Quanto à sintaxe, a tupla se diferencia por substituir os colchetes (`[]`) das listas por parênteses (`()`):

py 

Só para checar o tipo:

py 

Em primeiro lugar, a diferença mais explícita pela própria comunidade Python é que **tuplas são imutáveis**. Isso significa que não podemos alterar um mesmo objeto tupla, ou seja, mudar uma de suas referências internas (seus valores), nem adicionar ou remover elemento algum:

imagem:

imagem no final do valor, mesmo com os parênteses, ou o Python não interpretará como tupla.

Outro ponto importante e que pode gerar confusão a respeito dessa imutabilidade é que **tuplas podem conter objetos mutáveis**, como listas:

imagem que, por conta disso, tuplas ocupam menos espaço na memória comparadas a listas:

imagem`

Já que as tuplas se baseiam na estrutura dos nosso dados, seria interessante poder nomeá-los. Pensando nisso, no Python, já existe uma maneira para implementarmos nossas tuplas com campos nomeados - com [**a função namedtuple()**], localizada no módulo **collections** da biblioteca padrão da linguagem..

A função `namedtuple()` é, na verdade, uma fábrica de tuplas nomeadas. Isto é, ela nos retorna um objeto de uma subclasse de tupla que, além de darem acesso aos elementos pelo índice, nos permitem dar significado nomeado para cada um deles e acessá-los dessa forma:

imagem.

## Conclusão

Listas e tuplas são algumas estruturas de dados muito utilizadas quando estamos programando. Essas duas estruturas nos permitem guardar nossos dados agrupados, contudo suas semelhanças se encerram por aí, como pudemos ver nesse post.

Conseguimos desmistificar a ideia de que a tupla é **apenas** uma lista imutável, e entendemos como as listas têm uma função semântica diferente das tuplas.

Listas são usadas para guardar dados de mesmo tipo e significado, de modo que a ordem pode fazer diferença.

Já as tuplas, além de serem imutáveis, têm uma semântica muito mais estrutural, armazenando dados heterogêneos. Isto é, a posição do dado pode alterar o seu significado.

Também conhecemos um outro tipo que pode nos auxiliar com o bom uso da tupla - a tupla nomeada, gerada pela função `namedtuple()`. Com ela, podemos dar um nome para cada elemento da nossa tupla.

E aí? Gostou de entender mais sobre esse tipo no Python? Se quiser aprender mais sobre a linguagem, dê uma olhada em nossos [**cursos de Python na Alura**] e continue estudando!




Veremos nesse artigo como podemos **baixar uma imagem a partir da url** que o servidor nos retorna para exibi-la em um **UIImage**.

Estou desenvolvendo um aplicativo que lista filmes recentes. Para pegar as informações dos filmes, estou fazendo [**uma requisição para a API do The Movies DB**].

Vamos começar discutindo sobre esse assunto, utilizando como base a API do The Movie DB para listar os filmes

imagem` onde passamos por parâmetro a url da imagem:

swift

Vamos rodar o app para testar:

![]

Ótimo, dessa forma conseguimos setar todas as imagens dos filmes.

Uma imagem vale mais do que mil palavras

No nosso catálogo de filmes é legal mostrar sua capa. Geralmente, quando batemos em uma API, nós recebemos uma URL com o endereço da imagem. Então como podemos exibir essa imagem?

Vimos que podemos utilizar a biblioteca `AlamofireImage` para baixar a imagem. Mas só baixar a imagem não garante que conseguimos mostrá-la na tela. Para isso, precisamos utilizar a classe UIImage.

Aqui na Alura, temos uma [**formação IOS**], nela você aprenderá a construir aplicativos para **iPhones** com a linguagem Swift, técnicas de construção de layouts e sincronia com serviços web.




Uma professora de matemática elaborou uma técnica de avaliação diferente, em uma tentativa de aumentar a interação entre os alunos para a próxima prova, a nota de todos seria a mesma, equivalente à média de todas as notas.

Todo esse processo seria feito por um sistema automático em **Python**. As notas dos alunos da sala avaliada foram arquivadas em uma estrutura de **lista**:

python

A fórmula para calcular a média aritmética de uma lista de números é a **soma dos números dividida pela quantidade de números**. Precisamos, então, descobrir duas coisas: a **soma das notas** e a **quantidade de notas**.

## Somando todos os elementos de uma lista

Para somar todos os elementos da lista, vamos começar inicializando nossa variável que conterá o resultado da soma das notas com o valor `0`, indicando que a soma ainda não foi feita:

python

Assim, uma abordagem que podemos seguir é através da iteração sobre as notas - para cada nota, soma-se seu valor à variável `soma_das_notas`, dessa forma:

python

E o resultado da soma:

```
98.0
```

Funciona perfeitamente! Mas será que não há uma maneira mais simples de somar todos os elementos de uma lista?

## Somando os elementos de uma lista com a função sum()

Somar todos os elementos de algum conjunto é uma tarefa bastante comum em programação. Sendo assim, o Python também tem uma função nativa dedicada ao cálculo da soma de todos os elementos de uma lista - a função **[sum()]**!

Vamos usar essa nova abordagem:

python

Novamente, o resultado esperado:

```
98.0
```

Não só é mais simples usar a função `sum()` do que implementar um algoritmo de soma nós mesmos, como [sua performance é muito melhor] - um loop `for` é executado como **_bytecode_** Python interpretado, enquanto a função `sum()` é escrita puramente na linguagem C.

Agora que já sabemos a soma das notas, precisamos descobrir a quantidade delas.

## Descobrindo o tamanho de uma lista com a função len()

A quantidade de notas é o tamanho da lista. Podemos, é claro, contar nós mesmos e armazenarmos essa contagem nossa em uma variável:

python

Tudo bem, mas essa abordagem seria problemática caso a lista mudasse de tamanho, ou até mesmo se a lista fosse maior (imagine contar número a número em uma lista de mais de 100 elementos!)

Se já trabalhamos com outras linguagens de programação, provavelmente vimos que geralmente há uma maneira nativa mais simples para se calcular o tamanho de uma lista. No Python isso não é diferente!

A função _built-in_ **[len()]** retorna o comprimento de um objeto cuja classe implemente o **[método **len**()]** , como por exemplo uma string, ou, no nosso caso, uma lista. Vamos testá-la com nossas notas:

python

E o resultado é o esperado:

```
15
```

## Calculando a média aritmética

Agora que temos os dois valores que precisávamos, vamos calcular a média utilizando a fórmula `soma_dos_numeros / quantidade_de_numeros`:

python

Agora já temos a média:

```
6.5333
```

O resultado foi divulgado aos alunos, que responderam com reclamações - a nota foi mais baixa do que o esperado.

Depois de uma análise das notas, descobrimos que a média estava sendo calculada com a nota **0** de dois alunos que faltaram no dia da prova, o que não era justo!

Precisamos, então, remover essas notas **0** de nossa lista e recalcular a média.

## Removendo um elemento de uma lista com o método remove()

Agora que já temos nossa lista completa, como podemos remover um elemento de dentro dela? Para isso, o Python nos traz o método **`remove()`**, que recebe como parâmetro o **valor** que queremos remover de nossa lista. Vamos testar:

python

E o resultado:

```
[0, 9.0, 8.0, 5.0, 10.0, 7.0, 0, 7.5, 4.0, 10.0, 7.0, 7.0, 8.0, 8.0, 7.5]
```

Ok! Conseguimos remover um dos **0**, mas o outro ainda ficou. Por que será? Acontece que o método `remove()` remove apenas o primeiro elemento encontrado cujo valor é igual ao parâmetro passado, não todos os elementos com esse valor.

Precisamos, então, chamar o método `remove()` duas vezes? Tudo bem, isso daria certo, mas e se, em vez de duas, tivéssemos dez notas **0**. Será que realmente precisaríamos repetir uma mesma linha de código dez vezes? Isso não parece o ideal.

Conhecendo o Python e lógica de programação, uma abordagem intuitiva para esse problema seria iterar sobre a lista com um loop `for` e remover o valor caso ele seja igual a **0**, para não precisarmos nos preocupar com a quantidade de notas **0**. Vamos tentar:

python

E o resultado:

```
[0, 9.0, 8.0, 5.0, 10.0, 7.0, 7.5, 4.0, 10.0, 7.0, 7.0, 8.0, 8.0, 7.5]

```

Ué! De novo sobrou um **0**! Por quê, dessa vez? Nesse caso, o que houve foi uma confusão entre o laço `for` e o método `remove()`.

O `for` itera sobre os elementos de uma lista através do índice - ou seja, ele começa com o elemento na posição 0, passa pro elemento na posição 1 e assim por diante, até que o índice (a posição) atinja o comprimento da lista.

O método `remove()`, por sua vez, ao apagar um elemento, realoca os outros dentro da lista para que não haja um espaço vazio no lugar onde havia o elemento removido. Quando removemos um elemento da lista, a lista realmente diminui de tamanho!

Sabendo disso, vamos fazer uma simulação passo a passo para tentar entender o que aconteceu:

**PRIMEIRO LOOP**:      índice = **0**      lista = \[**0**, **0**, 9.0, 8.0, 5.0, 10.0, 7.0, 7.5, 4.0, 10.0, 7.0, 7.0, 8.0, 8.0, 7.5\]

**SEGUNDO LOOP**:      índice = **1**      lista = \[**0**, **9.0**, 8.0, 5.0, 10.0, 7.0, 7.5, 4.0, 10.0, 7.0, 7.0, 8.0, 8.0, 7.5\]

Note que o segundo `0` foi ignorado pelo `for`! Quando o `for` chegou no índice 1, onde estava esse `0` inicialmente, o `0` já havia sido realocado para o índice 0, resultando nesse problema.

Por isso, devemos sempre lembrar que é recomendável **nunca alterar uma lista enquanto se itera sobre ela!**

Precisamos de uma forma melhor de remover todas as ocorrências de um mesmo valor em uma lista.

## Filtrando uma lista utilizando _list comprehensions_

Já conhecemos uma técnica no Python chamada de **[compreensão de lista]**. Como podemos usá-la para resolver nosso problema? Queremos uma lista com todos os valores da nossa lista de notas, contanto que o valor seja maior que `0`.

Vamos lá, então:

python

E agora sim:

```
[9.0, 8.0, 5.0, 10.0, 7.0, 7.5, 4.0, 10.0, 7.0, 7.0, 8.0, 8.0, 7.5]
```

Enfim, basta recalcularmos a média com essa nova lista de notas:

python

Dessa vez, uma média melhor para os alunos:

```
7.538461538461538
```

Após a média ser calculada e arredondada para **7.5**, a professora quis conferir se seu método de avaliação tinha sido efetivo - isto é, se a nota da sala realmente representava como os alunos tinham se saído na prova.

Para isso, ela precisava calcular quantos alunos tiraram a nota na média, com uma margem de diferença de **0.5** (ou seja, quantos alunos tiraram uma nota entre **7** e **8**).

## Contando elementos em uma lista com o método count()

Para contar quantas vezes um elemento aparece numa lista, podemos usar o método **`count()`** dessa forma:

python

E o resultado:

```
3
```

Para de fato fazermos o que queremos precisamos usar o método com três valores - **7**, **7.5** e **8**:

python

O resultado:

```
8
```

Certo! No nosso caso, essa solução com o `count()` funciona bem, porque sabemos que são apenas esses três valores (`7.0`, `7.5` e `8.0`) que queremos.

Mas e se nossa lista tivesse, por exemplo, valores como **7.1**, **7.2**... e assim em diante até **8.0**. Teríamos que fazer um `count()` para cada um desses valores? Parece complicado, não é?

Uma outra abordagem que poderia ser utilizada, que evitaria o problema de haver mais valores no intervalo que queremos contar, seria utilizar um laço `for` e armazenar o valor da contagem em uma variável, dessa forma:

python

Temos o mesmo resultado:

```
8
```

Juntando o que aprendemos do método `sum()` e de compreensão de lista, e sabendo que no Python a classe `bool`, que representa os tipos booleanos, herda da classe `int` (**True é igual a 1 e False é igual a 0**), podemos até fazer isso de uma forma bem mais sucinta:

python

Temos o mesmo resultado:

```
8
```

## Conclusão

Nesse post pudemos ver a utilidade da listas, quando podemos usá-las e o que podemos fazer com elas.

Passamos por necessidades como remover todas as ocorrências de um valor na lista, somar todos os elementos da lista, saber o comprimento da lista e até remover todas as ocorrências de um elemento na lista, e conseguimos resolver uma a uma através de nossa lógica e das próprias funcionalidades do Python!

## Para saber mais

Quer aprender mais sobre listas em Python? Dê uma olhada nos nossos outros posts no blog sobre o assunto e aprenda mais sobre **[adicionar elementos a uma lista]**, **[ordenar uma lista]** e até conheça a funcionalidade da **[compreensão de lista]**.

Além disso, pode ser legal dar uma lida na [documentação das listas no Python], para conhecer mais possibilidades no tratamento delas.

Gostou do conteúdo? Está mais confiante para usar listas no Python, agora? Que tal aprender um pouco mais? Confira nossa [formação Python para web] e continue estudando!





imagem 

A Alura decidiu criar um canal no youtube para expandir o seu público. O [**canal foi criado**] e esta é a aparência atual:

imagem antes de começar a publicar os vídeos.

Pensando nisso, chegamos neste visual para a capa e o avatar da Alura:

imagem para cada aparelho existente?

Será que existe alguma medida padrão que funcione bem para os diversos tamanhos de tela? Seja pelo computador, celular, tablet, etc.

## Os padrões de medida do YouTube

No intuito de conseguir redimensionar de acordo com o necessário (seja celular, desktop, etc), o Youtube determinou alguns padrões que auxiliam nesse processo:

imagem é um dos principais lugares para fazer uma declaração sobre você e sua marca ou empresa.

Se um usuário entrar pela primeira vez no seu canal e não conseguir entender do que se trata, é bem provável que perca o interesse em assistir algum vídeo seu.

Será que também há um padrão para a criação de capas de acordo com o seu gênero?

## O que fazem por aí

Um dos exemplos que podemos utilizar é o da própria Alura:

imagem e na capa com algum fundo que você acha bonito dando o foco a foto (e talvez até algum texto com a frequência em que você posta).

Há diversas outras formas para se criar uma capa, vai muito de cada contexto ou necessidade. :)

## Resumindo...

Apesar de não existir nenhuma regra de fato para criar capas e avatares, temos algumas orientações e padrões importante para considerar quando estamos desenvolvendo nosso canal no Youtube.

O limite é sua criatividade! Há diversas formas para se fazer. O importante é manter a coesão com a sua identidade e o conteúdo.

Quer aprender mais sobre as diversas áreas e possibilidades de Design? Temos uma [**formação**] na Alura que pode te dar uma ampla visão sobre o assunto!




Na empresa existem três coisas que posso fazer: responder emails, fazer reunião ou trabalhar. E assim segue a piada...

Claro que, na verdade, responder um email é uma pequena parte da execução de uma tarefa. Assim como adoro reuniões que são na verdade um trabalho em par ou uma revisão de algum conteúdo que foi criado anteriormente.

Depois de responder 30 emails, 30 mensagens diretas e 4 reuniões ou pareamentos, quando vou escrever um post no blog? Definir a ementa de um curso novo? Bolar a idéia de um novo livro ou testar uma tecnologia? Quando vou produzir algo diretamente palpável?

A categorização que escolhi entre "fazer algo palpável" e "colaborar com outros" foi proposital. A maior parte do meu dia passo colaborando com outros em algo que eles estão fazendo uma vez que sou responsável pela qualidade do conteúdo criado para o Alura. E sou chato.

Mas e esse vazio que sinto? As "minhas" tarefas que não executei? Como encontrar tempo para tudo isso sendo que o dia continua com 24 horas sendo só 8 para meu trabalho direto.

**A primeira técnica que quero compartilhar(comecei a usar em 2016) por idéia própria e é bem simples. Até o almoço eu colaboro, eu sento junto, converso com quem quiser conversar. Almoçei, voltei, coloco o fone de ouvido e o mundo agora é meu. Agora eu produzo, tenho meu produto em minhas mãos e só um foco.**

Se você é um desenvolvedor, um designer, um jornalista ou qualquer outro profissional cujo tempo de pareamento e colaboração com outro profissional é importante, você já sabe: precisa de um tempo para colaborar. Mas sabe também que se entupir de reuniões e emails pode levar a produzir zero. Balanceie. Comece com uma regra fixa e só pense em flexibilizá-la bem pra frente, quando dominá-la.

**Tudo bem Guilherme, de manhã colaboro com outros, puxo outros para opinarem no que fiz, faço as reuniões e opino no que eles estão fazendo. Chega a tarde e vou ter um único foco: minha produção direta.**

Mas começa a pipocar mensagens na aba do meu email, pipocam notificações de mensagem privada no messenger da empresa (Slack alguém?), eu abro e desfoco do meu produto. De repente estou indo e vindo de uma aba pra outra. Além do Facebook, que não para de me pingar na aba. Ah, sem contar o o celular, piscando e vibrando com as mesmas notificações de email, messenger, facebook, whatsapp etc.

Como não me distrair com essas notificações e focar a tarde inteira produzindo?

A segunda dica que quero dar é de diminuir suas distrações. Feche a aba do facebook, do email e do messenger. Aliás, ao voltar do almoço você vai dar um único comando: ALT+F4 no windows ou COMMAND+Q no Mac. Feche o navegador. Abra novamente com uma única aba, a do seu trabalho atual.

**Mas e o celular? Desativa todas as vibrações e vira ele pra baixo na mesa. Deixe-o voltado pra baixo, para que você não tenha como saber nem que horas são, nem se recebeu mensagem. Desconecte-se do mundo e dos outros. Não desligue o celular, você pode precisar em emergências, claro. Se o seu trabalho não envolve a internet, desligue o wifi. Se você é chato como eu, coloque a plaquinha do lado "reunião agora? só amanhã".**

Em dois passos você terá o que todo profissional precisa: um momento de criatividade colaborativa, e um momento de criatividade solitária, reflexão e produção.

O segredo da produção em quantidade não está na qualidade extrema de um profissional, está na sua capacidade de focar. Desligue o que você não precisa. Desligue o que você não quer.

Você não quer aquela outra aba que está aí em cima. Fecha ela agora. Vira o seu celular pra baixo. Se como eu, você voltou do almoço, fecha tudo.

Abra uma aba e começa a produzir. Muito.

**ps: tire a foto do seu celular virado pra baixo, de sua placa "reunião hoje, só amanhã" ou cabo de internet/wifi desconectado e compartilhe comigo no twitter com #produtividadedogui**





imagem 

Max Wertheimer foi um dos principais representantes da Gestalt e definiu o _Fenômeno Phi_ em 1912 que, junto da _Teoria da Persistência da Visão_**,** daria forma à _Teoria do Cinema_ de Hugo Münsterberg. A **persistência da visão,** ou **persistência retiniana,** nos diz que uma imagem dura um certo tempo em nossa retina, uma fração de segundo, e que, se dispormos imagens estáticas em uma sequência, teremos a sensação de movimento.

Dizer que exibir imagens em sequência pode produzir a sensação de movimento parece até senso comum, pois já temos noção de como os desenhos animados e filmes são produzidos, mas não era tão simples assim quando não havia referência. Wertheimer conseguiu provar o _Fenômeno Phi_ por meio do seguinte experimento: ele direcionou um feixe de luz para uma tela, onde formou-se um ponto, então apagou essa luz e acendeu outra ao lado, formando outro ponto, que depois também se apagara, e repetiu o procedimento cada vez com intervalos menores entre um feixe de luz e outro. Ao diminuir o intervalo de tempo, Wertheimer percebeu que havia uma característica de movimento na percepção, a qual o cérebro produzia uma ponte entre uma imagem e outra – o **_Fenômeno Phi_**.

![experimento_max_wertheimer_1]

Wertheimer sugeriu que o _Fenômeno Phi_ fosse considerado um fenômeno sensorial primário, pois não dependia de outros fatores para ser percebido. Assim como temos a sensação de tato ao tocar em algo, de olfato ao sentir um cheiro, o _Fenômeno Phi_, segundo Wertheimer, nos dá a sensação de movimento mesmo que as imagens estejam paradas e, portanto, poderia ser considerado um sentido primário, que não depende de outros sentidos.

![experimento_max_wertheimer_2]

O _Fenômeno Phi_ possibilitou o desenvolvimento do cinema, dos desenhos animados, de técnicas de _stop motion_ e muitas criações que passam a sensação de movimento a partir de imagens estáticas.

**Quer saber mais sobre Gestalt, Animação e Design? [Acesse a formação de Design & UX do Alura]!**




O mercado de aplicações mobiles não para de crescer e com isso a demanda por desenvolvedores tem crescido também. Se você tem interesse em entrar nesse mercado, vai ver que tem várias opções para construir suas apps.

Uma dessas opções é o desenvolvimento com o Ionic, um framework que foi criado em 2013 e vem ganhando muito espaço dentro da comunidade.

## Desenvolver utilizando HTML, JS e CSS e consegui exportar para Android e IOS

Esse tipo desenvolvimento é chamado de desenvolvimento híbrido. Você não precisa escrever na linguagem nativa do sistema operacional, você pode usar HTML, JavaScript e CSS e no final do desenvolvimento, você consegue exportar essa aplicação para Android e iOS.

## Tags que facilitam o desenvolvimento

A equipe do Ionic desenvolveu várias tags que podem ser usadas para a construção das nossas telas. Além de nos oferecer velocidade na hora de desenvolver, a tag já se preocupa com o layout que vai ser apresentado no Android e iOS. Por exemplo, quando criamos um componente de tabs o Android segue o padrão de deixá-las no topo da tela, já o iOS deixa bem no rodapé. Podemos ver um exemplo na imagem abaixo:

![android_ios_tabs]

Quando estamos desenvolvendo com o Ionic e usando as tags que ele nos oferece, ele já cuida dessa diferença pra gente, ou seja, para obtermos o mesmo resultado como vimos acima, basta apenas escrevermos o seguinte código:

xml

## Ferramentas da próprias, como o Ionic Creator e o Ionic View

A empresa por trás do framework é bem ativa e está sempre trazendo novos produtos para poder agregar ao seu produto. Dentre os produtos disponibilidade eu destaco o [Ionic View]. Com ele é possível testar a aplicação que você está desenvolvendo sem a necessidade de colocar em alguma loja, como o Google Play ou a App Store, basta você instalar esse aplicativo no celular que você quer testar a aplicação e fazer o download da aplicação que você subiu para sua conta no Ionic.

**Outro produto interessante é o [Ionic Creator]. Com ele é possível você prototipar uma aplicação de forma visual arrastando componentes e personalizando eles e após isso, você pode baixar o código da aplicação e continuar o desenvolvimento da mesma.**

Muito dos serviços são pagos, mas quase sempre eles tem algum plano free para você pode testar.

## Integração com o AngularJS e seus bibliotecas

Junto com o Ionic, temos uma versão do famoso framework da Google, o AngularJS. Todo o seu conhecimento de AngularJS pode ser usado para criar aplicações mobile e não só seu conhecimento é bem-vindo mas também as bibliotecas do Angular que você já usa nas aplicações web. Então caso você tenha uma biblioteca que gostou de usar e queira usar aqui, você pode.

## Produtividade

Com todo esse ambiente que foi construído ao redor do ionic, a produtividade é alta. Várias tags para os componentes mais comuns em uma aplicação mobile, layout personalizado para cada plataforma é feito pelo framework nos poupando desse trabalho, várias ferramentas a seu dispor para ajudar a criar, desenvolver e testar suas aplicações e a integração com o Angular deixa esse framework cada dia melhor e mais produtivo.

Durante meu trabalho com o Ionic, foram esses os pontos positivos que achei e gostaria de compartilha com vocês, e assim agregar mais conhecimento para nós e a comunidade de aplicações híbridas que cresce a cada dia.

**O que achou do Ionic? Está afim de aplicá-lo nos seus próximos projetos mobile? Então não perca tempo, dê uma olhada no nosso [curso de Ionic] aqui na Alura.**





imagem 

Hoje quando desenvolvemos um site já devemos nos certificar da adequação dele para telas de diferentes tamanhos, em especial o ajuste para smartphones e tablets, afinal, sabemos que o número de pessoas que acessam sites e contas através destes dispositivos têm aumentado exponencialmente.

Sendo assim, estamos diante de um cenário, de um contexto que sabemos que querendo ou não nosso projeto estará inserido. Haverá sim, pessoas que vão acessar nossas páginas dentro do ônibus, do metrô, em casa, deitado na cama ou de inúmeras outras formas.

Se existem tantas forma diferentes de se utilizar uma solução, talvez seja ideal refletir sobre estes cenários fictícios desde o início do projeto, a fim de criar soluções mais assertivas e criativas para o usuário.

Mais do que pensar somente em funcionalidades e telas, hoje devemos pensar muito além para o desenvolvimento de um bom produto: devemos contextualizar.

## Entendo o contexto

Quando se fala sobre contexto em Ux, estamos nos referindo à cenários, geralmente hipotéticos, onde o usuário estará interagindo com a nossa solução. Tais situações são geralmente relatadas através de [narrativas escritas, storyboards, vídeos ou até histórias em quadrinhos][.]

Unir a criação das [**personas**] com a reflexão sobre os momentos de uso do produto nos permite enxergar com mais clareza, quais fatores externos poderão influenciar positivamente ou negativamente a experiência do usuário.

Toda experiência, mesmo em produtos digitais, está suscetível ao mundo real durante a sua utilização, afinal, **o produto se adapta ao contexto e não o contrário**.

Um aplicativo deve pensar na disposição das principais funcionalidades na tela [**com base nos dedos que o usuário utiliza**], por exemplo, as atividades principais da solução geralmente se mantém na parte inferior da tela devido ao uso preferencial dos dedões. Quanto mais no topo da tela o botão estiver menos confortável é para o usuário utilizá-lo.

> A Internet das Coisas (IoT) vem reforçar ainda mais a necessidade da contextualização, através da ideia de trazer a internet para diversos objetos do nosso cotidiano, influenciando profundamente a forma como interagimos com o mundo a nossa volta.

Há projetos em que os cenários já fazem parte dos requisitos iniciais, como por exemplo, um aplicativo de caminhada, onde sabemos desde o começo que nossos usuários estarão de pé, se movendo, na rua ou em algum outro local e não na frente de um computador ou sentado no metrô.

Mas quando estas necessidades não fazem parte tão diretamente da ideia do projeto, há a grande possibilidade de não refletirmos sobre o uso do mesmo.

## O valor do contexto

**Contextualizar nos ajuda a visualizar a experiência desejada**, levando em conta quais serão as expectativas e motivações daquele usuário, qual o cotidiano em que ele está inserido e qual será o momento em que em meio a tudo isso ele irá procurar a nossa solução.

De que forma dentro destes cenários eu vou poder agregar mais valor para o meu produto utilizando todos esses fatores externos em benefício de uma experiência relevante e personalizada para o meu usuário?

Por este motivo e outros, é de suma importância para o profissional da área de UX, sair da frente do computador e **descobrir novas informações para o projeto através de técnicas como pesquisas com os usuários e entrevistas**.

Na **Alura** existem inclusive cursos como o de [**UX Produto**], que mostram algumas práticas de testes e métricas para por em práticas em seus projetos.







imagem 

É bem comum o desenvolvedor JavaScript precisar testar a obrigatoriedade de parâmetros das funções que cria. Vejamos um exemplo:

javascript

Excelente, mas se nossa função tiver cinco parâmetros obrigatórios, teremos que repetir cada instrução `if` cinco vezes. A boa notícia é que podemos utilizar um recurso adicionado no ES2015 (ES6) já consolidado entre os navegadores para tornar nosso código menos verboso e elegante. Primeiro, vejamos que recurso é este:

## Parâmetro padrão (default parameter)

Temos como exemplo a função `temporizador` que executará uma função depois da quantidade de milissegundos definida pelo usuário:

javascript

Muito bom, mas o programador terá que passar toda vez, como último parâmetro, a quantidade de milissegundos. Que tal adotarmos um valor padrão caso o parâmetro não tenha sido definido?

Alterando nossa função temos:

javascript

O valor de `milissegundos` será 1000 caso seu valor seja avaliado como `false`. Em JavaScript, `undefined, null, ""` e `0` são avaliados como `false`.

No entanto, podemos simplificar bastante nosso código atribuindo um valor padrão diretamente no parâmetro, novidade do ES2015 (ES6):

javascript

Na própria declaração do parâmetro `milissegundos` atribuímos seu valor padrão, que só será considerado caso ele tenha sido omitido. Muito mais enxuto, não?

Agora que já entendemos como valores padrões são definidos na linguagem JavaScript, podemos utilizar esse recurso para tornar parâmetros obrigatórios.

## Parâmetros obrigatórios com ajuda de parâmetros padrão

Vamos voltar para a função `moveFrame`, apresentada no início do artigo:

javascript

Podemos simplificá-la bastante estruturando nosso código da seguinte maneira:

javascript

Reparem que o valor padrão dos dois parâmetros da função `moveFrame` é a chamada da função `obrigatorio`, isto é, ela só será chamada se alguns dos parâmetros não forem definidos. A única responsabilidade de `obrigatorio` será lançar uma exceção indicando a obrigatoriedade dos parâmetros. Inclusive, essa mesma função pode ser reutilizada por outras funções do sistema.

## Conclusão

Combinar diferentes recursos para criar uma nova funcionalidade faz parte da arte da programação de todo Cangaceiro JavaScript! Aliás, a Alura possui [**cursos de front-end**] que podem ajudá-lo a ficar ainda melhor em JavaScript e outros tópicos.

**Twitter: @flaviohalmeida**




Essa semana o instrutor Alberto Souza disse que conseguia criar um projeto com Spring, Hibernate e todas as dependências em 5 minutos.

E ai, será que ele conseguiu? Confira no vídeo :)

https://www.youtube.com/watch?v=-U9QpXcCh10&feature=youtu.be




Neste último mês passamos por uma grande mudança. Não só uma mudança visual/estética, mas também resolvemos um problema que vínhamos enfrentando: a organização dos cursos.

**Desde o redesign passado, nossa quantidade de cursos aumentou muito, expandimos os assuntos e passamos a ensinar não só programação, mas também [UX], [design], [edição de video], [marketing digital] e outros assuntos.**

Com esse crescimento, precisávamos nos reorganizar, facilitar a vida dos nossos alunos e futuros alunos.

Nossa missão: um site com uma navegação simples, um visual leve, limpo, mais jovem e com o menor caminho do usuário até o ponto final. Foram algumas reuniões com o [**Sérgio Lopes**] e o [**Paulo Silveira**] para definir esses primeiros pontos: organização de conteúdo, rotulação de categorias e subcategorias, fluxo de navegação, etc. 

De início, decidimos seguir com nosso próprio conhecimento, sem a consultoria de um especialista de UX, afinal os 4 anos de Alura nos fizeram conhecer bem nosso público, criar nossas personas e trabalhar em cima delas.

E vamos ao trabalho: primeiro acabar com aquela quantidade de trilhas que tínhamos (quase 20), as quais viraram 6 categorias rotuladas de [**Mobile**], [**Programação**],[**Front-end**], [**Infraestrutura**], [**Design & UX**] e [**Business**].

Já nas subcategorias, achamos suficiente o uso de "filtros" (usamos algo parecido com o [Isotope], que mostrasse alguma interação no clique; em uma "transição seca" o resultado do clique nos filtros poderia passar despercebido pelo usuário). 

Depois do conteúdo organizado e as categorias e subcategorias rotuladas, o próximo passo foram os wireframes. Durante as reuniões de planejamento, acabamos rabiscando alguns wireframes de baixa fidelidade, esses foram um bom guia para agilizar e trabalhar com alta fidelidade nos wireframes seguintes.

imagem

imagem

Durante a criação dos wireframes de todas as telas do fluxo, pensamos: "Vamos contratar a consultoria de um profissional de UX para ver o que ele acha do caminho que estamos seguindo?", ainda nos restava um pouco de dúvida quanto à organização dos cursos.

E assim fizemos. Entramos em contato com o [Edu Agni] ([Mergo]) e com outra empresa, acabamos por contratar a consultoria do Edu. Ele sugeriu o card sorting. Recrutamos 10 usuários de diferentes perfis e foram 2 dias de card sorting aberto, com entrevistas de aproximadamente 1 hora/usuário. 

Nesse card sorting imprimimos cards com os diversos assuntos e cursos do Alura e pedimos para que cada usuário organizasse em grupo da forma que mais fizesse sentido para ele. Como o card sorting era aberto, depois da organização cada usuário rotulou os grupos que organizou, novamente, como mais lhe fizesse sentido.

imagem

Alguns dias depois das pesquisas com os usuários recebemos o relatório do card sorting. O resultado foi satisfatório para a gente: praticamente validou o que tínhamos feito,  e assim seguimos o trabalho.

Em um post futuro pretendo falar sobre o novo design do novo Alura, um pouco de informação mais técnica, softwares, interação designer com front-ender, etc.

**Enquanto isso você pode ler um ótimo post do Sérgio Lopes sobre a [Arquitetura do novo site do Alura].**




Quero calcular o imposto de um investimento. A regra é simples:

Se o saldo for maior que mil reais, pagamos 10 porcento de taxa. Se o saldo for maior que 500 até exatos 1000, o imposto é 5%. Caso o saldo seja menor ou igual a 500, o imposto é 1%.

Me diz em 5 segundos se a implementação a seguir está correta?

java

Para uma regra de três condições, algo tão simples... conseguimos complicar horrores na hora de implementar. Imagine em regras do mundo real, ainda mais complexas?

Complicado né? Que tal retornarmos logo?

java

Agora sim, em **5 segundos** bate o olho no código, ooooutra história! Os elses desaparecem...

**Esse é o retorno rápido, o early return.**

Se eu quero retornar um valor, retorno poxa! Esse é um pequeno exemplo do poder da refatoração.






imagem 

Estou desenvolvendo um jogo em Scratch de batalhas em espaçonaves. Para batalhar precisamos de inimigos, então vamos criar esse nosso inimigo.

Esse nosso inimigo, assim como o nosso personagem no jogo, é um ator, portanto, vamos falar para o Scratch criar nosso novo ator:

imagem da nave inimiga, vamos falar para o nosso ator vesti-la:

imagem, quanto no eixo vertical (`y`). Vamos falar para o nosso ator que, assim que o jogo começar, ele vá para a nossa o centro direito da tela. No meu caso, essas são as posições `0` para `x` e `-260` para `y`

imagem, mas aparecesse em posição horizontal diferente (eixo `x`)?

Logo, queremos que a nave apareça em um local aleatório no eixo `x, no meu caso, esse número deve ser entre`\-203`e`203\`:

![]

![]

Legal, nossa nave está sempre começando em uma posição aleatória, mas ela está sempre indo para a mesma direção. Isso pode fazer o jogador achar o jogo muito difícil, ou muito fácil, então, vamos falar para a nave começar em um lugar aleatório mas manter a sua posição `x`:

![]

Agora nosso inimigo já tem um comportamento definido para o nosso jogo. Nosso jogo tem apenas um inimigo, mas e se quiséssemos adicionar outro? Teremos que criar um outro ator e colocar nele os mesmos atributos e comportamentos deste que já criamos?

E se quiséssemos alterar algum comportamento do nosso inimigo, teremos que alterar em cada ator esse comportamento? Talvez com dois inimigos isso não possa ser um problema tão grande, mas e colocarmos cinco, dez, cem inimigos? Teremos que alterar um por um?

## A guerra dos clones

Nós queremos criar um outro ator que tem as mesmas características do nosso inimigo. Ou seja, eles vestirão a mesma fantasia, terão os mesmos comportamentos e atributos, nós queremos um clone!

Vamos falar para o Scratch que quando o jogo começar, ele crie um clone para a gente da nossa nave inimiga:

![]

Nosso clone foi criado, mas ele ainda não está fazendo nada. Temos que dizer ao nosso clone o que ele vai fazer. Então, vamos falar para o clone que **quando ele for criado** ele vai ter o comportamento do nosso ator principal.

![]

Humm… nosso clone não está fazendo nada, veja que nosso clone é uma cópia do ator principal, mas ele pode ter características e comportamento próprio. Então, nós temos que dizer para o nosso clone realizar as mesmas ações do nosso ator principal.

Mas se nós simplesmente copiarmos as características e comportamentos do nosso ator principal no clone vamos voltar ao mesmo problema que estamos tentando resolver, o código será duplicado.

O lado bom dos clones é que as características que passamos para um são propagadas aos demais. Isto é, um clone sempre é igual a outro clone. Portanto, o que nós podemos fazer é colocar todas as características e comportamento do nosso ator nos clones.

Dessa forma, sempre que criarmos um clone, ele já terá tudo que precisa no nosso jogo. Vamos falar para o nosso ator que quando o jogo começar ele crie os clones. Enquanto isso, quando os clones forem criados eles terão o comportamento da nossa nave inimiga.

![]

Agora nós podemos criar quantos clones quisermos que ele sempre terão os mesmos comportamentos. Mas agora nossa nave principal, aquela que não é clone, está sem comportamento.

Bem, como são os nossos clones que tem o comportamento, nós podemos falar para ela se esconder depois que os clones forem criados:

![]

![]

## Para saber mais

Já temos um comportamento dos inimigos no nosso jogo, mas ainda precisamos criar o nosso protagonista e outros elementos para deixar nosso jogo mais divertido e dinâmico.

O Scratch é uma ferramenta muito utilizada para aprender lógica de programação, criar animações, aprender sobre matemática e física e muitas outras coisas.

Essa ferramenta é tão usada que aqui na Alura temos uma plataforma com vários cursos sobre o Scratch.

Na [**AluraStart**], temos diversos cursos sobre o Scratch, neles, você aprenderá como [fazer um jogo de espaçonaves], como esse nosso jogo, como [criar um jogo de cobrança de pênaltis], como [criar um robô que adivinha seu nome] e muito mais.




Muitos desenvolvedores já ouviram falar sobre **Clean Code, ou Código Limpo**, e quando falamos sobre isso é comum associarmos à um **código com fácil manutenção**.

Mas, será que _Clean Code_ é só sobre um código fácil de dar manutenção?

## Design de Código e o Clean Code?

Se você já passou pela experiência de ter que adicionar algo relativamente simples em um código existente, e percebeu que essa "adição simples" impactaria em vários pontos do projeto, você sabe o que é um código difícil de dar manutenção. Sistemas legados não são exatamente o "sonho de um Desenvolvedor" e existe todo um traquejo para lidar com códigos de softwares assim, que tem pode dar muita, mas muita dor de cabeça. Mas não se preocupe aqui é está um guia para [lidar com softwares legados]. Tudo o que você precisa saber está aqui :)

Mas, se você nunca vivenciou isso, imagine ter que alterar um fragmento de código e essa alteração simplesmente quebrar todo o sistema. Definitivamente não seria legal.

E passar por isso faz a gente pensar que escrever um código totalmente novo é uma tarefa bem mais simples do que dar manutenção em código existente.

Mas, infelizmente, em nossas carreiras gastamos boa parte do tempo dando manutenção em código existente e, se não pensarmos direito no código que estamos escrevendo,vamos passar diversas vezes por situações semelhantes a essa.

Lembre-se sempre que todo código que escrevemos acaba se tornando um [**Passivo**]) (uma dívida) para a empresa. E quanto menos nos preocuparmos com a manutenção do código maior é o valor desse _Passivo_.

### O que é um código com fácil manutenção ?

Quando falamos de um código com fácil manutenção estamos nos referindo à um código com [**Baixo Acoplamento**]#Baixo_acoplamento), [**Alta Coesão**]#Alta_coes%C3%A3o), usando [**SOLID**], [**Imutabilidade**] (quando fizer sentido), aplicando [**Design Patterns**], minimizando [**Side Effects**]), maximizar o uso de [**Funções Puras**] e várias outras coisas.

Tudo isso pode ser resumido em ter um bom **Design de Código**,uma parte muito importante em ter um código limpo.

E o que mais meu código precisa ter para ser considerado um código limpo?

## Indo além da manutenabilidade

Pare 1 minuto olhando para esse código e tente responder: o que ele faz?

java

O que você achou dessa sequência de `if`s ? E esse monte de expressões sendo avaliada dentro de cada `if`? Como poderíamos reduzir a quantidade de código duplicado ?

Perceba que fizemos um esforço tremendo para tentar entender o que esse código faz - e é possível que não tenhamos conseguido entendê-lo.

Esse código que acabei de mostrar tem a função de salvar uma sessão de cinema, desde que a sessão que estamos tentando salvar não tenha conflitos de horários com outras sessões existentes, ou com uma possível indisponibilidade na sala (por exemplo a sala estar indisponível para manutenção).

Toda essa carga cognitiva que fizemos para tentar entender o código traz um cansaço físico e mental. Agora leve em consideração que **passamos a maior parte do tempo lendo código**.

Então [**legibilidade conta**] muito na hora em que estamos escrevendo código.

Então poderíamos [**refatorar**] o código para algo mais ou menos assim:

java

O código agora parece um pouco mais organizado, com alguns nomes melhores para aumentar a semântica e sem boa parte da duplicidade, além de conseguirmos lê-lo de cima para baixo em um fluxo contínuo.

Podíamos continuar refatorando o código infinitamente, movendo as responsabilidades para as classes corretas e assim melhorando ainda mais o **Design do Código** e a manutenabilidade.

Dessa forma temos muito menos esforço para ler e tentar entender o código.

**Lembre-se legibilidade conta muito para um código limpo.**

Porém como podemos garantir que após essa alteração nosso código continua funcionando?

## Testes, testes e mais testes

Sim, para garantir que seu código continua funcionando precisamos escrever [**testes**].

Testes fazem parte do jogo quando estamos desenvolvendo, e o fato de tê-los não elimina totalmente a possibilidade de termos um [**bug**]) mas minimiza bastante.

Com os testes conseguimos garantir que **pelo menos os cenários previstos estão funcionando** e extrapolar esses cenários é o que torna nossos testes mais eficientes.

Quanto mais níveis de testes (unitários, integração, aceitação, regressão e etc…) tivermos mais segurança teremos na hora de aplicar uma refatoração.

A tarefa mais díficil na hora de se escrever um teste é saber o que devemos testar. E é justamente aí que temos que focar nossos esforços.

Testes são uma parte importante para todo o [**ciclo de vida de desenvolvimento**] e sim **um código limpo é um código testável**.

## Agora sim o que é um código limpo?

Um código limpo é a composição de diversas características, como:

- Legível  
    Um código compreensivo possibilita a identificação de pontos que precisam ser melhorados. Passamos mais tempo lendo código do que escrevendo então, quanto mais fácil for ler o código menos esforço fazemos para entendê-lo.
- Testável  
    Devemos testar nossos código, pois isso vai dar-nos segurança para podermos alterá-los. E garantir que os cenários que previmos estão de acordo com o esperado.
- Fácil de ser mantido  
    Nosso código deve passivo de alteração tanto para adição de novas funcionalidades, quanto para aumentar a legibilidade ou manutenibilidade.

De uma forma bem resumida **um código limpo é um código testável, fácil de manter e de ler.**

Na Alura nós criamos uma [**formação em Orientação à Objetos**] pensando justamente nessas boas práticas.






Se você leu o título deste texto e se interessou pelo assunto, atenção: este conteúdo não pretende ensinar como aproveitar templates feitos por outras pessoas como se fossem seus. 

Achamos importante chamar a atenção para esse ponto logo no primeiro parágrafo do texto porque, como deve ser de seu conhecimento, existem muitos profissionais no mercado que não se preocupam com a autenticidade e transparência em seus processos de trabalho. Por isso, antes de usar um template para tornar o seu trabalho mais ágil, lembre-se de:

- Dar créditos ao criador original do trabalho;
- Registrar que o material foi modificado com base no template original feito por tal empresa;
- Informar ao cliente que você está usando um template que não é exclusivo;
- Comunicar que a criação de um template exclusivo demoraria muito mais tempo e custaria bem mais que usar um pronto.

Depois das ressalvas feitas acima, é hora de saber como agilizar seu trabalho com o uso de templates e se [**destacar na carreira**].

## Use templates free

Existem alguns sites no mercado que trabalham com templates free e não há nenhum problema em usá-los. Você pode aproveitá-los para fazer sites, lojas virtuais, apresentações ou outro material necessário. A única questão é deixar isso claro para o cliente no momento de enviar o orçamento. Os valores e o tempo de produção de um template exclusivo são muito diferentes de um free ou de um que foi apenas modificado.

Em função da diferença de valores e também da falta de cultura de valorização desse tipo de trabalho, muitos clientes vão optar pelo menor custo. O importante é que o cliente esteja pagando apenas pelo trabalho que você desenvolveu e que isso seja devidamente informado.

## Compre templates prontos

Além de usar os modelos free, você também pode optar por alguns modelos com licença fechada. A vantagem em relação à primeira opção é que como são pagos, as chances de existirem outros sites ou materiais parecidos são reduzidas apesar de existirem.

Por isso, a regra é sempre a mesma: informe ao seu cliente que você está usando um template pago que permitirá que você faça algumas customizações. Dê os devidos créditos conforme já explicamos.

Quando for mostrar a proposta ao cliente, é interessante até que você mostre o original e como o dele vai ficar com as modificações propostas. É importante que fique claro que você não vai partir do zero para fazer o material dele.

## Aproveite outros templates feitos por você

É possível também aproveitar os templates feitos por você. Claro que é preciso observar uma série de detalhes, como o segmento das empresas, os objetivos de cada uma, as ferramentas que cada instituição pretende usar, dentre outros aspectos. Quando você avalia esses pontos, consegue perceber se o material pode ou não ser adaptado.

O essencial é esclarecer esse uso para o cliente. Diga que você desenvolveu uma solução para um cliente de outro segmento e que pode fazer modificações para que o material atenda às necessidades dele. Mostre o original e fale sobre como o material vai atender ao que ele precisa. Aceitar ou não fica a cargo do cliente.

## Crie templates neutros

Você também pode criar os seus próprios templates pensando nas customizações futuras. Dessa forma, você cria uma estrutura mais básica, com cores neutras e funcionalidades que possam ser facilmente adaptáveis e a deixa como coringa em casos de necessidade. Verifique as principais demandas que você recebe e crie modelos com base nelas.

Quando você mesmo cria as suas opções de templates, fica mais fácil oferecer e defender o seu trabalho junto aos clientes. Mas lembre-se, você terá que dedicar algum tempo na criação desse material prévio para que seja possível, mais à frente, ter mais agilidade no trabalho. Aproveite os tempos livres e épocas que você não tenha tantas demandas para realizar a tarefa.

## Mesmo com templates, seja original

Alguns profissionais que usam templates prontos se desobrigam totalmente da originalidade quando não criam um material do zero. Isso é um erro, principalmente para as pessoas que vivem do que criam. 

Mesmo tendo um material pronto como base, sempre é possível dar o seu toque e deixar o trabalho com a sua marca pessoal, além de adaptá-lo ao jeitinho do cliente. Nunca se esqueça disso, aquilo que você agregar de valor a uma peça pronta vai dizer muito sobre a sua forma de trabalhar.

É importante lembrar que, se fosse para o cliente fazer algo que já existe, ele não o contrataria, e faria por conta própria. Para agilizar o trabalho você pode partir de um template pronto, mas precisa otimizá-lo de forma que o cliente sinta que o trabalho foi feito exclusivamente para ele, mesmo que você já tenha informado que a peça não é exclusiva.

## Esteja atento às tendências

Muitas vezes, você poderá recorrer a templates prontos para agilizar o seu trabalho, desde que não os venda como algo original. O importante é não deixar de observar as tendências do mercado a todo momento. Desde um pantone até uma linguagem de programação que está sendo mais requisitada observe tudo e saiba exatamente quem entregará a você o que o mercado está pedindo.

As soluções voltadas para o mercado mobile estão em alta e as opções de smartphones disponíveis aumentam a cada dia. É importante saber com precisão se os templates disponíveis irão atender às necessidades dos clientes e se as customizações são possíveis de acordo com a tecnologia oferecida por ele. 

Em algumas situações, a opção de desenvolver uma solução própria pode ser mais fácil e rápida do que se imagina. Avalie sempre, as mudanças acontecem muito rapidamente.

Viu como os templates podem agilizar o seu trabalho de forma ética e original? 





imagem 

Criar e cortar hábitos é algo que tentamos combater e aderir diariamente, seja para desapegar daquilo que tem nos atrapalhado com alguma coisa ou por exemplo, em algo que possa nos ajudar em uma promoção de emprego.

E nos restam aqueles questionamentos: Como transformar seus hábitos e ser mais produtivo?Como manter o foco em momentos de tarefas mais chatas ou que exigem uma certa dificuldade?

Neste episódio do Alura Live, o host Gabs Ferreira recebeu Priscila Stuani, instrutora da Alura, para conversarem sobre como criar metas que funcionam de acordo com seus objetivos e muito mais.

https://www.youtube.com/watch?v=FmDD_A72-x0

Ficou interessado em como mudar seus hábitos? [Assista essa live completa!]

Curso de hábitos:

> [Mude seus hábitos] e aumente sua produtividade pessoal

Carreiras na Alura

> Melhore seus hábitos, aprenda a lidar com o próximo, impulsione seus negócios:

[Soft Skills.]

> Comece agora a programar:

[Iniciante em Programação.]

> Faça nosso curso de Javascript:

[Desenvolvedor JavaScript.]

> Quer aprender a criar aplicativos?

[Desenvolvedor Android.]

>  Não quer programar e quer saber editar seus vídeos?

[Editor de Vídeo.]

> Ainda sim pensa em algo diferente, como ranquear sua página no Google?

[SEO Expert.]

Siga a gente no Twitter: [Gabriel Ferreira], [Priscila Stuani] e a [Alurinha]! ;)





imagem 

Atualmente, uma transportadora tem em seu sistema web uma tabela que consome alguns dados de uma API. Entre eles, as datas de quando os veículos deveriam ir para manutenção.

O que está acontecendo é que os funcionários estão perdendo algumas datas de manutenção dos veículos. Isso porque eles dizem que a parte da tabela responsável por mostrar as datas não está visualmente clara. Ela tem muitas informações e as pessoas se perdem na hora da leitura da tabela.

Parte da tabela de controle utilizada pelos funcionários: 

imagem. Neste caso, vamos alterar a cor de fundo (`backgroundColor`):

js 

O valor `#FF0F0F` é a representação Hexadecimal de um tom da cor **vermelha**. Vamos fazer a mesma coisa para as funções `amarelo` e `verde`:

js 

Ótimo, agora que já criamos as funções, vamos implementar a lógica para trocar as cores do campo de acordo com as datas.

## Criando a lógica das cores

Como as datas que estão dentro do campo são strings, vamos capturar seu conteúdo usando o `textContent`.

js 

Como não conseguiremos fazer o cálculo correto com as datas, porque são `strings`, vamos ter que encontrar uma maneira de transformar as strings em datas.

## Transformando uma string em data

[**Podemos instanciar o objeto**] `Date`, e obter a data atual

js 

Agora para fazer a conversão de string para data, instanciamos outro objeto `Date` com nome de `data` e passamos como parâmetro a data que está no campo da **Próxima Revisão**.

js 

Agora que já fizemos a conversão é só fazer a subtração das datas

js 

Agora vamos implementar uma estrutura de controle `if` que vai ser responsável por trocar as cores do campo.

js 

Seguindo nosso padrão de separar as responsabilidades do código em funções, vamos criar a função `mudaCor()` que vai receber como parâmetro um `td` que representa o campo da onde vamos tirar a data.

js 

## Calculando os dias

A lógica de transformar de milissegundos para dia é a seguinte: Primeiro dividimos por 1000 para obtermos os segundos, depois dividimos por 3600 para obter as horas e finalmente dividindo por 24 e obtemos a quantidade de dias.

js 

Como pode ocorrer de não obtermos um número inteiro, vamos usar a função `Math.floor( )`, para arredondar para baixo a quantidade de dias.

js 

Agora encapsulamos a lógica em uma função:

js 

## Criando uma verificação

Vamos criar uma função chamada `verifica()` onde vamos usar o `forEach` que vai ser responsável por executar a função `mudaCor()` em cada item do nosso array `ultimasRevisoes`

js 

## Deixando nossa tabela atualizada

Para termos a tabela atualizada, vamos usar um evento chamando `DOMContentLoaded`, que vai escutar nossa página e toda vez que ela for carregada, as cores dos alertas vão ser atualizadas.

js 

No corpo da função, vamos usar o `querySelectorAll` para selecionar todas as classes `.info-proximaRevisao` para passar as cores dentro dos campos, e depois chamar a função `verifica`, que vai aplicar a lógica das datas

js 

Tarefa concluida !

![]

## Estilos dinâmicos com Javascript

Alterar a cor é apenas uma das coisas que podemos fazer com Javascript, podemos capturar eventos, como clicks em botões, scroll de páginas, entre outros para deixar as páginas dinâmicas.

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação front-end**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, entre outras coisas.





imagem 


A responsabilidade é grande, uma vez que as empresas contratantes depositam ali toda a expectativa sobre o seu negócio. Isso porque um logotipo deve transmitir com criatividade tudo o que a empresa representa. 

Ele deve ser capaz de traduzir a essência da marca para os consumidores, ajudando-os a identificar e consumir produtos e serviços da empresa.

Uma responsabilidade grande, não é mesmo?

Para ajudar nesse processo tão complexo, resolvemos fazer um passo a passo com tudo o que é importante para você mandar bem na criação de logo. Ficou curioso? Então confira!

## Tenha um briefing bem-feito

O primeiro contato com o cliente após o fechamento do negócio é muito importante. Isso porque é ele quem vai definir o rumo de todo o seu trabalho. **O briefing é um documento em que estão dispostos todos os requisitos para a criação de logo.** 

Nele estão reunidas informações extremamente importantes, como: 

-   Qual é o negócio da empresa; 
-   Quais são os tipos de clientes que ela atende; 
-   Preços dos produtos ou serviços; 
-   Os principais concorrentes; 
-   Cores já utilizadas; 
-   Preferências e tudo o que for necessário para criar uma marca estrategicamente forte e cheia de conceito.

Nessa etapa, é importante que se saiba sobre a existência de um logotipo anterior ou utilização de algum tipo de elemento específico.

Esse documento tão importante precisa ser lido com atenção e, caso não responda a todas as suas dúvidas, elas devem ser acrescentadas e perguntadas novamente para o cliente, afinal, isso é essencial para garantir a aprovação do trabalho!

## Pesquise referências e possíveis soluções

Depois de analisar o briefing e entender a proposta do cliente, o primeiro passo é a pesquisa.

Investigue internamente tudo o que você puder sobre a empresa. Olhe com atenção o site, redes sociais e materiais já existentes. Isso vai ajudar você a imergir na realidade e captar a essência dos valores, objetivos e necessidades da companhia.

Em seguida, **analise as tendências de mercado para aquele segmento**, busque referências, pesquise a concorrência e não se atenha ao universo local. Referências nacionais e até internacionais são sempre bem-vindas e podem render boas ideias.

Essa etapa é muito importante, portanto, dedique-se a ela. Quanto mais conhecimento sobre o universo da empresa, melhor. Atenha-se a cores, formas, elementos e tudo o que puder ajudar você a chegar a um resultado bacana. Mas fique atento: referência não é cópia! Utilize-as para criar suas próprias ideias!

## Colocando a mão na massa: encontre o conceito certo!

A segunda parte do processo vem em decorrência da etapa anterior; enquanto você pesquisa e busca referências, anote tudo o que for interessante e, principalmente, as ideias que forem surgindo. Elas serão de grande importância para que você encontre o conceito criativo para seguir.

Nessa parte, todo o seu conhecimento prévio vai fazer a diferença, e elementos adicionais vindos da psicologia, [**semiótica**] e sociologia podem ser importantes.

Desenhe rabiscos no papel e associe os elementos. Misture pontos, texturas e linhas que forem relevantes ao processo.

Depois disso, filtre as ideias de que mais gostou, peça opiniões e, então, refine o trabalho, passando tudo para o computador, em um programa vetorial.

Agora você está pronto para a próxima etapa!

## Acerte na escolha da tipografia

Se seu logo utilizar tipografia, esta será uma das partes que vai fazer grande diferença no seu projeto. A forma das letras, nesse contexto, vai agregar sentido aos seus elementos, transparecendo certo posicionamento. 

Letras finas, por exemplo, dão ideia de algo rebuscado, ao passo que **letras bold transmitem robustez**. Nessa etapa, vale a pena buscar referências em sites especializados em tipografias e também testar várias soluções, até encontrar a ideal.

## Estude as cores

Depois de definida a tipografia, é hora de pensar nas cores que vão compor o seu projeto.

Muitas vezes, já há uma paleta de cores definida, mas, caso necessário, você terá que criar do zero.

Faça testes, junte cores diferentes, gradientes e texturas. É importante saber que [**cada cor transmite uma ideia**] e um estado de espírito. Pesquise sobre elas e veja se a ideia vai ao encontro do objetivo predefinido. 

Preste bastante atenção nessa fase do processo, afinal, as cores são geralmente o primeiro impacto do logotipo, e uma escolha malfeita pode comprometer o resultado final.

## Faça testes de tamanho e proporção

Você já definiu os elementos, a tipografia e as cores. Agora chegamos aos detalhes finais. Essa é a hora de prestar atenção se elementos e tipografia estão conversando entre si em equilíbrio, unidade e, acima de tudo, legibilidade.

Para saber se aquele logotipo é legível quando reduzido, faça diversos testes. Imprimi-lo em sua redução mínima também pode te ajudar muito nessa hora.

## Não se esqueça dos retoques finais

Após analisar a redução, seu logotipo está pronto para os retoques finais. Corrija os últimos detalhes, melhore o acabamento, buscando sempre a harmonia entre todos os elementos. Dessa forma, é muito mais fácil criar um conceito harmônico.

## Experimente o logo em diversos formatos

Logotipo pronto, é hora de ver como ele fica quando aplicado em diferentes peças. Faça uma [**simulação da marca**] criada em cartões de visita, anúncios, folders, canetas e tudo mais que for necessário. Isso, além de mostrar a composição com diferentes cores de fundo, também deixa a ideia mais clara na cabeça do cliente.

## Prepare-se para o grand finale: a apresentação!

Além de um logotipo atraente, sua apresentação deve ser brilhante!

Mostre o quanto você pesquisou sobre o negócio do cliente e como a sua marca está adequada a todos os objetivos e ideias a serem transmitidas. Seja original, transmita confiança e provoque emoção. Assim você garante chances muito maiores de ter sua arte aprovada!

Gostou deste passo a passo para criação de logo? Então, não deixe de seguir nossas redes sociais ([**Facebook**], [**Twitter,**] [**LinkedIn**]) e ficar por dentro de diversos artigos que podem te ajudar a realizar seus trabalhos!




[**São tantas disciplinas para se especializar**] que o iniciante na carreira pode ficar confuso se está escolhendo ou não o caminho certo.

Mas, nos últimos anos, a tecnologia 3D se tornou um coringa da área e seu uso está se expandindo para todas as práticas do design. Veja como ele está sendo usado e a importância de estar atento a essa transformação profissional.

## Modelagem 3D: Dando vida ao design

Já faz um tempo que a modelagem 3D se tornou uma habilidade importante para designers que querem [**trabalhar em jogos, filmes e outras mídias digitais**].

Essa não é mais uma tendência, é o padrão daqui para frente! Ter habilidades para trabalhar com a concepção e criação de modelos pode gerar uma vantagem competitiva muito desejada.

Veja como a tecnologia 3D vem crescendo para quem trabalha com modelagem.

### 3D em design de personagens

O design de personagens se tornou importante não só em filmes e jogos, mas também em estratégias de marketing que abraçam o storytelling para alcançar seu público. Quantos mascotes você tem visto por aí ultimamente?

A tecnologia 3D facilitou muito a concepção de personagens que, ao mesmo tempo, se conectam com as pessoas emocionalmente e transmitem os valores da empresa. Assim, as técnicas de modelagem são tão valorizadas para os designers que querem reforçar a identidade visual de uma empresa.

### 3D em peças virtuais

A modelagem 3D também se tornou um grande aliado do design gráfico. O consumo de design na internet e mobile cresce a cada ano. Os aparelhos se tornam mais potentes e o uso de tecnologia 3D abre uma nova porta para criar peças de design interativas.

Pense em aplicativos, vídeos, interfaces. Elementos tridimensionais servirão para criar novas experiências. E ainda tem a realidade virtual, outra aposta da indústria para o futuro. A modelagem 3D é a chave para o consumo de conteúdo manipulável.

## Espaços 3D: Imaginando dentro da tela

A tecnologia 3D transforma a forma como temos que imaginar algo que ainda não está lá. Profissionais que apostam nessa área são disputados entre as empresas que querem oferecer aos seus clientes uma experiência de compra diferenciada. Veja exemplos:

### 3D em design de ambientes

Uma sala reformada, a disposição dos móveis, as cores das paredes... O uso de tecnologia 3D na criação de ambientes é muito valorizado no design de interiores por conseguir mostrar ao cliente exatamente o que ele terá ao contratar o serviço.

Além disso, há também a organização de espaços para eventos, criação de ambientes planejados, uma grande área dentro de uma especialização.

### 3D em criação de mundos

Sim, novamente falamos de realidade virtual e como ela se beneficia com a [**tecnologia**] 3D. Profissionais especializados na criação de espaços e cenários começam a ser muito requisitados para criar mundos dentro da tela, seja para o entretenimento ou para campanhas publicitárias.

Nada de museus virtuais ou agências de banco em 3D. Pense nas possibilidades que um designer pode criar no futuro, aliando a identidade visual de uma empresa à um mundo exclusivo, cheio de experiências novas e interativas para os consumidores.

## Impressão 3D: O design autossuficiente

Nenhuma das novas tecnologias 3D promete mudar tanto o design como um todo do que a impressão de objetos tridimensionais. Mesmo ainda em seus primeiros passos, a técnica já vem transformando processos e até a forma como o design é pensado. No Brasil, empresas do ramo estão lançando novos materiais e as possibilidades são ilimitadas.

Uma grande vantagem da impressão 3D é a autossuficiência para o designer, que pode criar suas peças e também produzi-las, para vender ou experimentar novos caminhos.

Veja como esta tecnologia está auxiliando diversas áreas do design:

### 3D em design de produtos

**A área de design de produtos talvez seja a mais beneficiada com o avanço das tecnologias de impressão 3D. A possibilidade de criar um produto novo e poder manipulá-lo ao vivo, na hora!**

Na especialização de design de produto só se fala em ergonomia, inovação e praticidade. A capacidade de testar todas estas características em pouco tempo, ver o que dá certo e o que não dá, não só economiza tempo de criação como dá ao designer a chance de experimentar e encontrar novas soluções.

E nós sabemos bem. É na busca de novas soluções que o design transforma nossas vidas.

### 3D em design de interiores

Estes produtos criados também podem ser peças de decoração. Podem até ser obras de arte!

Designers de interiores, num futuro próximo, não vão precisar pesquisar pela cidade inteira para encontrar a peça que falta para encaixar naquele lugar que está vazio.

Uma, duas, ou todas as peças, o designer será capaz de planejar um espaço da forma como ele realmente planejou e colocar a assinatura do seu estilo no ambiente, seja uma casa, um comércio, ou até um evento inteiro!

### 3D em design gráfico

Design gráfico? Você pode estar pensando que não existe área mais bidimensional no design. Será que a impressão 3D também pode ajudar nesta parte?

É claro que sim, e muito! O design gráfico vem expandindo seus horizontes através de [**experimentações**] há um bom tempo, com materiais diferentes, texturas variadas, novas formas de apresentar um conteúdo gráfico.

Os designers dessa área ganharam com as impressoras de objetos tridimensionais uma nova forma de expressão. Ao aliar o gráfico ao físico, tecnologias 3D estão ajudando os profissionais a criarem peças inovadoras e criando novas formas de divulgação e interação com o público.

Seja qual for a área do design que um [**iniciante na carreira**]escolher, aprender a usar a tecnologia 3D pode ser garantia de sucesso em qualquer especialização. Se você está projetando para o futuro, esta habilidade pode se tornar indispensável para quem quiser atuar na área.

**E é claro que você está pensando no futuro, não é? Por isso, discuta o assunto. Compartilhe este artigo nas redes sociais e converse sobre os rumos da profissão. Só assim os profissionais irão crescer juntos e buscar novas possibilidades e oportunidades.**




Recentemente estava precisando subir uma página estática para uma aplicação web. Como estava **estudando Go**, resolvi realizar essa tarefa com a linguagem.

Segundo uma pesquisa feita pelo [**StackOverflow**], a linguagem de programação Go já é a terceira colocada na lista de linguagens mais desejadas para aprender e vem sendo utilizada por grandes empresas como **Uber, Google, Twitch... O próprio Docker**, queridinho do mundo dos containers, foi desenvolvido em cima da linguagem.

Um dos elementos que mais chamam a atenção para essa linguagem é sua alta performance, facilidade de trabalhar com concorrência e também é **elegante e concisa como Python e rápida como C**. 

Para comprovar esses fatos, por que não fazer uma aplicação web e exibir uma página? Mas antes de colocar as mãos na massa, é preciso fazer a instalação do Go.

# Instalando o Go 
Para instalarmos o GO no Linux, basta fazer o download na página da Golang, navegar até a pasta do arquivo pelo terminal com o comando: `cd Downloads`e executar os comandos :

```
sudo tar -C /usr/local -xzf go1.12.5.linux-amd64.tar.gz 
sudo export PATH=$PATH:/usr/local/go/bin. 
```
No Windows, basta fazer o [download] e seguir o passo a passo do instalador

Para confirmar que tudo correu sem problemas executamos o comando `go version`, que vai exibir a versão do Go instalada.

imagem    

Voltando ao nosso propósito, vamos finalmente dispor a página web para a nossa aplicação.

# Exibindo a página

Para finalmente exibir a página em nosso servidor, podemos utilizar a função `http.ServeFile`. 

Esse tal de `http.ServeFile` é responsável por dispor um arquivo, ou seja, estamos simplesmente servindo uma página web utilizando nossas variáveis responsáveis por escrever a resposta http e também o nosso request.

Nosso código com a adição do `http.ServerFile` ficou assim:

go


Agora que finalizamos nosso código, vamos executar o nosso programa. 

# Executando
Para executar o nosso programa, precisamos navegar até a pasta onde está o arquivo pelo terminal:

![]

E executar o comando `go run main.go`. 
Caso tudo tenha dado certo, o terminal vai ficar “travado”. Isso significa que o nosso programa está em execução.

![]

Agora vamos finalmente exibir a página! 

# Exibindo a página

Ao abrir navegador e acessar a URL http://localhost:8080/. Vamos ver o seguinte resultado:

![]

# Conclusão

Com esse simples projeto, vimos que em pouquíssimas linhas de código conseguimos criar uma aplicação web e que o tempo para executá-la é quase instantâneo.

Essa não é nem a ponta do iceberg! Go está crescendo cada vez mais no mercado. O uso para concorrência é ainda mais amplo e profundo do que em outras linguagens, já que Go nos oferece algo chamado goroutines, mas isso é outra história…

E agora que você conheceu um pouco mais sobre a linguagem Go, aqui na **Alura** temos um [**curso**] de Go onde vamos aprender a sobre controle de fluxo, fazer requisições HTTP e muitas outras coisas!








Em um mercado cada vez mais competitivo, ter apenas conhecimento técnico não é mais suficiente para os profissionais da tecnologia. Para se destacar, é necessário também trabalhar um conjunto de ações e estratégias que atribuam maior valor à sua imagem. Em outras palavras, é preciso investir no seu marketing pessoal.

Nesse contexto, se antes os profissionais da área tecnológica eram vistos como os _nerds_ que trabalhavam isolados em uma sala, hoje é imprescindível que eles apareçam mais e tenham um bom relacionamento com as demais áreas da empresa. Afinal de contas, quem não é visto, não é lembrado.

Entretanto, desenvolver o marketing pessoal pode ser um pouco mais complicado para algumas pessoas, especialmente para aquelas que não trabalham na área da comunicação, como é o caso dos profissionais de tecnologia. Porém, 

Por isso, elaboramos este _post_ com 6 dicas de marketing pessoal que vão alavancar a [**carreira do profissional de tecnologia**]. Confira e comece a praticar desde já!

## 1\. Cuide da sua imagem pessoal

Para ter uma boa imagem, você não precisa ser um modelo ou ter roupas caras. Mas é importante que esteja atento e se adeque à maneira como as pessoas do seu trabalho se vestem. Afinal de contas, a sua aparência é como um cartão de visitas, que precisa estar sempre bem apresentável.

Nesse sentido, algumas atitudes simples podem fazer toda a diferença, como:

- Não vestir roupas amassadas;
- Estar com os cabelos sempre limpos e arrumados;
- Evitar peças muito curtas ou chamativas;
- Manter uma boa higiene pessoal etc.

O importante é que você se sinta bem, confiante e transmita credibilidade aos demais colegas de trabalho por meio da sua aparência. 

## 2\. Demonstre espírito de liderança

Tão importante quanto a sua imagem, são as atitudes que você terá no dia a dia. Uma das qualidades mais admiradas no mundo corporativo é a capacidade de ajudar e liderar pessoas, independente do cargo ou função que você exerce.

Para os [**profissionais de tecnologia**], o espírito de liderança pode fazer toda a diferença, principalmente se você se predispõe a ajudar pessoas que estão com problemas. Para isso, procure conversar mais com os seus colegas de trabalho, pergunte sobre as dificuldades e os ajude, dando dicas e apresentando caminhos para resolver os desafios.

Dessa forma, os seus companheiros passarão a enxergar você como um ótimo amigo e orientador. Qualidades fundamentais para os líderes de hoje.

## 3\. Tenha cuidado com as suas redes sociais

Um bom profissional de tecnologia precisa estar sempre por dentro e conhecer as principais redes sociais. Porém, elas podem ser grandes parceiras ou vilãs da sua imagem pessoal. Tudo depende da forma como você as utiliza, do conteúdo que posta, curte e comenta.

Para que você faça das suas redes sociais uma boa estratégia de marketing pessoal, essas dicas serão fundamentais:

- Esteja presente nas principais redes sociais (Facebook, Twitter, Instagram, [LinkedIn], etc.);
- Mantenha os seus dados sempre atualizados;
- Divulgue informações importantes de fontes confiáveis;
- Evite conflitos sobre política, religião e outros assuntos polêmicos;
- Não poste fotos com bebidas alcoólicas, cigarros e em situações constrangedoras.

O mais importante de tudo é ter bom senso e sempre ressaltar as suas qualidades. Afinal de contas, as pessoas do seu trabalho e possíveis recrutadores podem entrar em seus perfis para conhecer o seu dia a dia e o que você anda disseminando nas redes sociais. 

## 4\. Faça _networking_ para potencializar o seu marketing pessoal

Uma forma de os profissionais de tecnologia aumentarem a sua visibilidade é investindo em _networking_. Manter uma boa rede de contatos é importante para compartilhar informações, ficar por dentro das novidades e, quem sabe, ser lembrado para futuras [**oportunidades profissionais**]. 

Para isso, é importante que você interaja com os seus colegas, mesmo aqueles com os quais você não trabalha de forma direta. Além disso, você pode conhecer novas pessoas fazendo cursos, participando de palestras, eventos e _workshops_. 

Uma dica é fazer um cartão de visitas para compartilhar, sempre que você conhecer novas pessoas. Dessa forma, você divulga seu trabalho e seus contatos de maneira educada e profissional. 

## 5\. Saiba trabalhar em equipe

Trabalhar em equipe é um dos grandes desafios de qualquer pessoa. Conflitos de interesse, egos muito aguçados, incompatibilidade de ideias ou simplesmente pessoas difíceis de lidar: quem nunca passou por alguma dessas situações?

Apesar de todos esses problemas, o profissional de tecnologia precisa ter jogo de cintura e saber trabalhar em equipe nas mais diversas situações. Para isso, é preciso ouvir, entender e conversar sobre as ideias alheias. Ao ressaltar o seu ponto de vista, procure ser cuidadoso e respeitoso com as suas palavras.

Aos poucos, você vai conhecer cada pessoa e descobrir a melhor maneira de lidar com elas.

## 6\. Tenha repertório

Você sabe conversar com as pessoas sobre vários assuntos? Você utiliza referências para desenvolver os seus projetos? Tão importante quanto ter conhecimentos técnicos é expandir a sua cultura geral e possuir um bom repertório.

Nesse contexto, o profissional de tecnologia costuma estar muito ligado às novidades da sua área, mas muitos acabam pecando em outros assuntos. Dessa forma, é preciso ter um pouco de conhecimento sobre tudo: música, artes, TV, notícias e os principais fatos que estão acontecendo no mundo.

Existem diversas maneiras e caminhos para ampliar o repertório, como:

- Ver filmes com diferentes temáticas;
- Ir a museus, teatros e shows;
- Ler livros sobre diferentes culturas;
- Estar sempre ligado nas notícias e fatos recentes;
- [**Investir em cursos**] de extensão cultural etc.

Dessa forma, você será um profissional de tecnologia completo, capaz de opinar e interagir sobre diversos assuntos, ser inovador em seu trabalho e ainda aumentar a sua visibilidade e credibilidade junto aos colegas e ao mercado de tecnologia. 

Muito interessantes essas dicas, não acha? Seguindo esses passos, será muito mais fácil montar uma estratégia de marketing pessoal efetiva e que destaque você dos demais colegas. Ser um bom profissional de tecnologia vai muito além de ficar apenas sentado na frente do computador. Então, coloque em prática essas atitudes e turbine a sua carreira!

Agora que você já sabe da importância do marketing pessoal, aproveite para assinar a nossa newsletter e ficar por dentro dos principais assuntos e cursos sobre tecnologia. Será mais um grande passo para a sua vida profissional!

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!





imagem 

A secretaria acadêmica de uma escola me pediu para fazer uma tela que mostrasse as informações dos alunos matriculados. Só que existia um problema: cada aluno preencheu o telefone usando traços em lugares diferentes

imagem`. passando como parâmetro a tag \`td.

javascript

O retorno do método `querySelector()` foi:

html

O retorno não foi bem o que queríamos, isso porque o `querySelector` está procurando no documento HTML o parâmetro que foi passado, e está retornando a primeira vez que esse parâmetro aparece, no nosso caso ele devolveu somente a primeira coluna e não todos os telefones dentro do campo. Então o `querySelector` não serve para o nosso caso.

Por convenção, fazer a busca por `tag` **não é recomendável**. Podem ocorrer mudanças no documento HTML que acabam quebrando o código. Então precisamos de uma maneira de buscar os telefones da tabela e que seja menos propensa a problemas com mudanças.

## Seletores

Seletores são usados no CSS para marcar os elementos HTML que serão estilizados, como estamos usando o método `querySelector` ele nos permite fazer uso de [**seletores CSS**], como `id` e `class`, e fazer uma busca mais específica.

## Acessando a tabela usando o id

A busca utilizando `querySelector` e tags HTML não servem para nosso caso. Felizmente temos o método irmão do `querySelector` o `querySelectorAll` que ao invés de retornar a primeira vez que o parâmetro aparece, vai retornar todas as vezes.

Agora que já sabemos que podemos deixar nossa busca mais específica com o uso de seletores, vamos fazer uso do `id` para nossa busca.

javascript

Agora o retorno já foi um pouco melhor do que com `querySelector`

html 

Mas de novo só conseguimos trazer as informações de um aluno, mesmo usando o `querySelectorAll`... Isso aconteceu porque o seletor `id` define um identificador exclusivo, precisamos então de algo que consiga fazer uma busca mais genérica.

## Acessando a tabela usando classe

Como muitos elementos podem pertencer a uma classe ao mesmo tempo, podemos fazer uso do seletor `.class`, já que todos os campos de telefone dos alunos tem a classe `.info-telefone`

javascript

O retorno do `querySelectorAll` é parecido com um array:

 

Agora temos que encontrar uma maneira de iterar por todos os telefones e fazer a alteração de acordo com o padrão escolhido pela escola.

## Alterando o telefone dos alunos

Uma maneira de percorrer todos os telefones para fazer a alteração é através do loop **for**. Depois de iterar por todos os telefones, usamos o método [**replace**], que vai substituir os traços do telefone por strings vazias.

javascript 

## Para saber mais

Além do `querySelector()` e do `querySelectorAll()`, existem outros meios de capturar elementos no DOM. Um exemplo é o método `getElementById` que retorna a referência do elemento através do seu id.

Outro exemplo é o método `getElementByClassName` que vai retornar um vetor de objetos com todos os elementos filhos que possuem o nome da classe dada.

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação front-end**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, entre outras coisas.





**Trabalhar com datas e horários** é algo comum para um desenvolvedor. Mas como podemos fazer isso com efetividade usando a **linguagem PHP**?

Fui contratado por uma empresa para desenvolver um sistema de controle de pontos, e a solicitação foi bem clara ao pedir um sistema que funcione na _Web_.

Pensei comigo: Já que mais ou menos 80% de toda a _Web_ usa PHP, parece uma boa linguagem para desenvolver essa solução.

Este sistema vai precisar exibir a data e hora de cada registro (entrada e saída) do funcionário e exibir quantas horas têm de diferença entre eles (as horas trabalhadas no dia).

## A função `date`

Velha conhecida dos programadores PHP, a função `date` pode ser a primeira opção que vem à mente para pegar a data atual. Com ela é bem fácil definir o formato em que queremos esta data, inclusive.

Para exibirmos a data atual no formato brasileiro, por exemplo, ficaria assim:

php

E este código exibiria: `20/03/2019`.

Como você já deve ter suposto, o `d` representa o dia, `m` representa o mês enquanto `Y` representa o ano com 4 dígitos. Se quiséssemos o ano apenas com 2 dígitos (19 no nosso exemplo), bastaria utilizar `y` (em minúsculo).

Com esta mesma função podemos também pegar o horário atual, além da data. Continua bem fácil:

php

E a saída seria: `20/03/2019 16:58`

Repare que como `m` representa o mês, para representar os minutos a letra `i` é utilizada. Para saber mais sobre quais letras utilizar em cada caso, você pode dar uma olhada na [**documentação da função**].

## Intervalo entre duas... strings?

Já conseguimos pegar as datas (como _string_, diga-se de passagem), então agora vamos pesquisar sobre como calcular o intervalo entre elas para exibir as horas trabalhadas.

Dando uma pesquisada, caí na documentação da função `date_diff`, mas vi que como parâmetros ela não recebe _strings_. Esta função recebe objetos de classes que implementem a interface `DateTimeInterface`. Bom, vamos com calma.

Até agora temos trabalhado somente com a função `date` que retorna uma _string_, mas nós podemos de forma tão fácil quanto, utilizar **Orientação a Objetos** nesta tarefa. Existe uma classe que podemos instanciar e obter a data e hora atuais e que implementa a `DateTimeInterface` que precisamos. "O nome dela é `DateTime`, e eu encontrei ela [**na documentação**]".

O código que tínhamos antes não muda muito. Veja como fica utilizando a classe que acabamos de conhecer:

php

Caso a gente não passe nenhum parâmetro para o construtor de `DateTime`, o momento atual será recuperado. Podemos ainda passar uma string informando o momento que queremos, por exemplo:

php

Se já tivermos uma string em outro formato, e quisermos criar um objeto do tipo `DateTime`, podemos utilizar o método `createFromFormat`, da seguinte forma:

php

## Agora sim, intervalo entre duas datas

Agora que já conhecemos uma forma de trabalhar com datas utilizando Orientação a Objetos, vamos ver como pegar o intervalo entre 2 objetos do tipo `DateTime`.

A interface `DateTimeInterface` expõe um método chamado `diff`, que recebe um outro objeto deste mesmo tipo como parâmetro, ou seja, podemos chamar a partir de nosso objeto de datas, o método `diff` passando uma outra data como parâmetro. Vamos ver como ficaria isso:

php

E com isso temos a seguinte saída:

php 

Vamos por partes analisar o que acabou de acontecer. Primeiro, quando criamos as datas e horas, passamos apenas os seus respectivos horários, não informando os dias. Pois é. Se eu passar apenas o horário, ele pega a data atual no horário informado.

Depois, quando exibimos o retorno do método `diff`, vimos que temos acesso a um objeto do tipo `DateInterval`. Nele, temos acesso a quantos anos, meses, dias, horas, minutos e segundos existem no intervalo entre uma data e outra. No nosso caso, há 9 horas de intervalo, e podemos exibir isso da seguinte forma:

php 

PS.: Caso você tenha analisado a saída do `print_r`, viu que há as propriedades `d` e `days`. Num intervalo de exatamente um ano, a propriedade `y` teria o valor de 1, enquanto a propriedade `d` teria o valor zerado, o que significa que há 1 ano e 0 dias de diferença. A propriedade `days` teria 365 como seu valor, indicando o número total de dias.

## O problema do fuso horário

Com o sistema já implementado, fui implantar em um dos servidores da empresa, e notei que o relógio dele estava com um fuso horário diferente do daqui no Brasil. Isso estava causando inconsistências nas marcações de ponto.

Não é legal deixar que o fuso horário de cada máquina atrapalhe nossos sistema, então seria interessante se pudéssemos informar no código com qual fuso estamos trabalhando.

A boa notícia é que com PHP isso é até fácil de fazer. Na hora de criar nossa data, basta informar mais um parâmetro que é o fuso horário desejado. Veja como fica:

php

Repare que nós colocamos o timezone como `America/Sao_Paulo`. Mas e se quisermos saber outras possibilidades? É possível ver a lista de fusos horários suportados pelo `DateTimeZone` com o método `DateTimeZone::listIdentifiers()`:

php

Trabalhar com datas e fusos horários com PHP é moleza!

## Para saber mais: `DateTimeImmutable`

Conseguimos chegar na implementação desejada. Conseguimos pegar as datas que queremos (utilizando Orientação a Objetos, inclusive), calcular a diferença entre elas e até trabalhar com diferentes fusos horários.

Mas no artigo foi citada a interface `DateTimeInterface`. Que outra classe será que implementa essa interface?

A classe `DateTimeImmutable`! Ela pode ser utilizada da mesma forma que a classe `DateTime`, mas as operações que ela expõe retornam uma nova data, e não alteram a original. Pareceu confuso? Vamos ver na prática essa diferença e de quebra aprender a realizar mais operações com as datas:

php

Repare que com um intervalo de um dia, quando o adicionamos (com o método `add`) ao objeto do tipo `DateTime`, o próprio objeto é alterado. Já quando utilizamos `DateTimeImmutable` seu valor permaneceu intacto, retornando o valor com a alteração desejada.

Se ficou curioso sobre como criar um intervalo pode dar uma olhada [**na documentação**]. Mas basicamente, `P` significa um período, e adicionamos `1D`, que quer dizer um dia. Se quiséssemos adicionar 2 dias e 3 horas, ficaria: `P2DT3H`, onde o `T` indica que as informações a seguir são sobre o horário (hora, minuto ou segundo).

## Conclusão

Começamos o post com uma necessidade real de manipular datas utilizando PHP e vimos que não é necessária nenhuma biblioteca externa para isso. A própria **API** de datas do PHP é muito rica e nos fornece meios de criar uma data, realizar operações nela, buscar intervalos, trabalhar com fusos horários e muito mais.

Você pode ainda dar uma olhada no que mais o PHP te oferece quando o assunto é data na [documentação oficial], e pode conhecer mais da linguagem que domina a web [**na formação PHP da Alura**]!




Estou estudando para a certificação da Oracle e preciso saber todas as restrições do método main. Então vamos implementá-lo ora bolas:

java

Rodando a minha aplicação:

```
 > executando código

```

Ótimo, mas eu sempre terei que escrever o método `main` da mesma maneira? Será que não da pra modificar alguma coisa? Vamos tentar executar sem o modificador de acesso _public_:

java

Executando o código:

java

Parece que não deu muito certo, ele não consegue achar o `main`... Vamos tentar agora sem o _static_:

java

Testando mais uma vez:

java

Xi, tem que ser _static_ também... Bom e o `void`? Vamos ver se eu consigo retornar um `int`:

java

Verificando novamente:

java

É, parece que ele não permite nenhuma alteração... E esse `args`? Eu nem uso ele, então eu vou tentar tirar!

java

java

Puxa vida, será que não podemos alterar nada? Vamos tentar então, alterar o tipo do array `args` para outro, por exemplo, um `int`:

java

java

Aparentemente, precisamos escrever a assinatura do `main` como o conhecemos... Mas e se eu tentar variar o array de `String` (`String[] args`)? Em outras palavras, que tal tentarmos um varargs de `String`? Vejamos o que acontece:

java

Testando minha aplicação novamente:

java

Finalmente a minha aplicação rodou! Além de apenas variar de array de `String` para varargs, podemos também alterar o nome do parâmetro, não precisa ser `args`, pode ser qualquer nome:

java

Testando novamente:

java

Excelente! Agora eu sei quais são as restrições para declarar o método `main`:

Como vimos, para nossa aplicação executar precisamos do método `main`, porém o Java só entende que é o método `main` na nossa aplicação se seguir essa assinatura: `public static void main(String[] args)`. Vimos também, que a única alteração permitida é alterar o array de `String` para um varargs de `String`, pois na prática funcionará da mesma maneira.

Não sabia que o método main era tão restrito? Quer se aprofundar mais na linguagem Java? Aqui na Alura temos [**uma formação Java**].




Vamos fazer a requisição em uma classe chamada `WebClient`, ela será responsável por fazer a conexão com o servidor.

Nossa app é um catálogo de novidades aqui do Alura e, assim que abrirmos ela, será exibida uma listagem com todas as novidades. Essas novidades serão carregadas do servidor. Toda comunicação que fazemos com o servidor está na nossa **`AsyncTask`**:

Java

Legal, nosso código está funcionando! Mas o que estamos fazendo no _onPostExecute_? Estamos pegando a resposta e já estamos manipulando a tela.

Nossa `AsyncTask` tem a **responsabilidade** apenas de fazer essa requisição mais pesada,o que de fato tem feito no método `doInBackground`. Porém, no método `onPostExecute` estamos manipulando a tela. Manipular a tela não é o foco da a `AsyncTask`! Temos um especialista em manipulação de tela: nossa `Activity`. Ela deve se virar para consumir os dados desta requisição.

java

Agora, nosso código está bem mais claro e deixou cada especialista fazer sua função. Nossa _task_ para fazer a requisição pesada e nossa _activity_ para manipular a tela.

Mas, qual é vantagem disso? Nossa `AsyncTask` não precisa saber o que vamos fazer com os dados! Desta forma nosso código fica bem mais simples de dar manutenção e está bem desacoplado :)

Mas, e se tivermos a necessidade de fazer uma nova tela que também consumirá essa lista, mas fazer outro comportamento?

Já temos uma `AsyncTask` que retorna exatamente o que precisamos: a listagem. Mas ela está acoplada diretamente com a `Activity` que a chama, precisamos **desacoplar** nossa activity e garantir que receberemos um objeto que possua o método `lidaComNovidades`. Para garantirmos que qualquer classe que nós formos usar possua este método, vamos estabelecer um contrato, atráves de uma `Interface`:

java

Agora precisamos fazer nossa `Activity` implementar nossa interface :

Java

Agora, utilizando **polimorfismo**, podemos passar para nossa `AsyncTask` a interface em seu construtor! Desta forma podemos reaproveitar nossa task em diversos locais, sempre passando uma `Activity` que implemente a `Interface`.

Chamamos este padrão de **`Delegate`**:

java

Nosso código ficou bem mais desacoplado e agora podemos reaproveitar essa nossa `AsyncTask` em qualquer outro projeto! O único pré-requisito é que este projeto tenha um `Delegate`, pois podemos passar um objeto que implemente de `Delegate` e terá os métodos necessários para desempenhar seu papel. Essa abordagem que estamos utilizando é um `**Design Pattern**` chamado de `Delegation`.

**E ai gostou dessa dica? Quer conhecer mais sobre desenvolvimento Android e talvez iniciar sua carreira nessa área? Aqui na Alura temos [vários cursos] sobre Android. Se preferir aulas presenciais, veja os [cursos da Caelum] :)**




Algo bem comum na vida do desenvolvedor é deixar que a sua IDE o ajude na hora do desenvolvimento. Tão comum que geralmente pedimos a ela para dar aquele chute inicial quando começamos um novo projeto.

No desenvolvimento Android, quando iniciamos um projeto, ele já deixa configurado bastante coisa para gente: já cria nossa primeira `Activity`(desde a classe ao seu layout) e além disso também a registra no manifest.

Legal, mas quando estamos iniciando um novo projeto, temos que escolher qual é o tipo de `Activity` que queremos utilizar. Aí ele nos dá tela parecida com essa:

![tela de configuração ] 

E geralmente não imaginamos logo de início qual será a melhor escolha de `Activity` e preferimos escolher uma tela em branco. Essa tela em branco geralmente já vinha com um **Hello World** configurada nela, por isso escolhíamos `BlankActivity`. Isso até a versão 1.5 do **_AndroidStudio_**.

Na última versão, quando estamos pedindo para ele gerar essa `BlankActivity`, estão sendo gerados 2 arquivos de layout. Como assim? Se verificarmos, ele está gerando um arquivo chamado **content_NOME_DA_ACTIVITY.xml** e outro com nome **activity_NOME_DA_ACTIVITY.xml**. Vamos analisar um pouco esses arquivos.

Estávamos acostumados a criar uma `Activity` e ela já vir com um único arquivo. Ao verificamos o arquivo **activity_NOME_DA_ACTIVITY.xml** que está sendo gerado vamos ver algo parecido com isto:

xml

`CoordinatorLayout, AppLayoutBar, Toolbar, FloatActionButton`...o que é tudo isso?

Há um tempo atrás o **[Google]** criou uma biblioteca especialmente para **design** para aplicações mobile, você pode conferir mais sobre ela [aqui]. Todas essas `Views` já estão incluídas nesta biblioteca de design.

Legal, mas no meio desse layout há um **include** para outro arquivo de layout:

xml

Este arquivo **content** já é aberto por padrão no momento que iniciamos um novo projeto,ele está lá para colocarmos todas as views que serão exibidas em nossa tela.

Esse novo padrão foi criado para deixar de forma mais organizada os arquivos xml.

Caso quisermos uma `Activity` vazia, sem nenhuma `View`, podemos iniciar nosso projeto utilizando `**EmptyActivity**`, que substitui a forma que `BlankActivity` fazia até a atualização.

Conhecemos dois tipos de `Activity` e ainda existem muitas outras prontas que podemos utilizar!




No último post conseguimos fazer com que o zumbi chegasse até a posição da heroína. Porém, ele estava se teleportando e não andando até ela. Como vamos resolver esse problema?

![]

Até agora conseguimos calcular quanto o zumbi deve andar e para qual direção. Podemos representar a `distanciaX` e `distanciaY` com uma seta ligando a posição do zumbi até a posição de destino dele. Como estamos somando na posição do zumbi, a distância total entre ele e a heroína ele acaba se teletransportando até ela.

Se queremos que ele ande mais devagar, não podemos somar essa distância inteira, temos que somar menos. Mas quanto menos, será que metade dessa distância resolve?

![]

Ainda é muito rápido, será que 4 melhora?

![]

Ok, 4 frames é muito pouco para a jogadora fugir. Vamos dividir por um número muito maior, 100 por exemplo.

![]

Dividindo a distância total por 100, vemos que o zumbi começa com passos largos e vai diminuindo a velocidade de perseguição. Isso acontece porque calculamos a distância entre ele e a heroína todo frame, e como essa distância é cada vez menor, temos um número cada vez menor sendo dividido por 100.

Apesar de agora o zumbi não teleportar na direção da heroína, ele anda mais devagar quando está perto dela e isso é um problema, pois ela sempre conseguirá fugir. O zumbi precisa de uma velocidade constante, e como podemos fazer?

Estamos dividindo a distância por um número arbitrário que escolhemos. O ideal seria dividirmos dois números e sempre obtermos o mesmo resultado, e podemos ter isso se dividirmos qualquer número por ele mesmo, assim o resultado sempre será um.

![]

Ou seja, calculamos a distância e o sentido em que queremos andar e depois dividimosessa distância pelo seu próprio valor, lembrando de ignorar o sinal na hora de dividir. Como nossa `distanciaX` tem o valor de -100, -100/-100 = 1 e não queremos isso, queremos o valor -1 como resultado.

Como isso fica no código?

csharp

 

Assim ,o zumbi sempre andará uma unidade na horizontal e uma unidade na vertical por frame. Mas será que isso está correto?

![]

Dessa maneira, o zumbi não seguirá uma linha reta até a direção da heroína, como falamos para ele andar uma unidade em X e em Y ele pode dar um passo para fora do caminho.

Queremos que ele dê um passo de uma unidade na direção da heroína e isso, não necessariamente, significa andar 1 na horizontal e 1 na vertical. Vamos redesenhar esse diagrama para entendermos melhor.

![]

Desenhando dessa maneira fica visível que temos um triângulo retângulo entre os eixos X e Y. Como falamos, o que queremos é que o tamanho do nosso passo seja 1, assim, sempre que nos movermos teremos uma velocidade constante. Acontece que, se andarmos um em X e um em Y, o tamanho do nosso passo será igual a √2 que é maior que um.

O nosso passo está maior do que 1 e a direção dele não bate com a direção da jogadora. Como fazemos para deixar tudo igual?

Da mesma maneira que desenhamos um triângulo retângulo com os valores de movimentação do zumbi, podemos usar os valores da distância entre ele e a heroína.

![]

Desenhando dessa forma achamos que a distância entre o zumbi e a jogadora é de 134,53. Como queremos que essa distância vire 1, podemos dividir ela por ela mesma. Só que também precisamos manter as proporções do nosso triângulo, ou seja devemos dividir todos os lados do triângulo por 134,53.

![]

Agora sim, se andarmos -0,74 unidades na horizontal e -0,66 unidades na vertical estaremos dando um passo na direção da jogadora. Mas depois de tudo isso, como implementar o código?

csharp 

 

O primeiro passo é achar quanto nós precisamos nos deslocar em X e Y, em seguida calcular a distância entre o zumbi e o alvo. Com isso, dividimos o deslocamento nos eixos horizontal e vertical para que o passo na direção da heroína seja igual a 1. Por último, somamos a posição atual do zumbi com o deslocamento desejado e atribuímos isso à propriedade _position_ do componente `transform`.

Esse tipo de comportamento é tão comum em jogos e simulações que existem classes que encapsulam todos esse comportamento. A Unity utiliza a classe **Vector3** para representar o conjunto de números que compõem a posição de um objeto e isso possibilita fazermos operações com essa classe.

Por exemplo, ao invés de procurarmos pela direção do alvo utilizando eixos separados, podemos usar a própria classe e encontrar os valores para ambos os eixos em uma única linha.

csharp

 

Ao fazermos isso, recebemos um conjunto de números que representa o quanto o zumbi deve se deslocar para chegar até a heroína . Como não queremos nos teletransportar, precisamos dividir cada componente desse grupo pela distância entre os dois objetos. Esse processo que retorna os valores de X e Y para que o "passo" seja igual a 1 é chamado de normalização ou `normalized`do **Vector3**.

csharp 

 

Agora precisamos adicionar esses valores na posição atual do zumbi e atribuir isso ao componente **Transform**. Como nosso deslocamento é do tipo **Vector3**, podemos apenas somar a posição atual e o deslocamento, da mesma forma que conseguimos subtrair dois vetores.

csharp 

Enfim, a classe **Vector3** da Unity é baseada em vetores da matemática. Eles são uma maneira prática de fazermos operações em um conjunto de números e dessa maneira podemos expressar alguns comportamentos complexos de maneira mais simples dentro do código.

Vimos um pouco de como utilizar a soma, subtração e normalização de vetores para refletir um comportamento de perseguição dentro de um jogo. Além disso eles são muito utilizados quando queremos aplicar física aos jogos.

Caso você tenha interesse, pode procurar nos tópicos de álgebra linear para entender um pouco mais de como funcionam os vetores.

Gostou da ideia de fazer um jogo sobre uma invasão zumbi? Veja nossos [**cursos na Alura**] e de quebra aprenda muito mais sobre como trabalhar com a Unity. 



Vamos ver como tratar as notificações do Firebase.

No artigo onde vimos como [**configurar o FCM**] (Firebase Cloud Messaging) e integrar com a nossa App Android. Fizemos um pequeno exemplo de envio de notificação, porém, no exemplo que vimos, a notificação não aparecia em _foreground_, ou seja, enquanto estávamos com a App aberta. Em outras palavras, queremos obter um resultado conforme o exemplo abaixo:

imagem` dentro da classe `FirebaseMessagingService`. Portanto, faremos isso:

java

A partir desse método, quando a nossa App estiver aberta, **receberemos a notificação do FCM** e ela será representada pelo parâmetro `remoteMessage`. Mas e depois? Aparecerá a notificação automaticamente como vimos anteriormente? Nesse caso não, pois **recebemos apenas a mensagem**. Em outras palavras, precisamos **criar a notificação manualmente**.

## Criando a notificação no Android

Já que estamos recebendo uma notificação, podemos extraí-la para um objeto do tipo `RemoteMessage.Notification`:

java

Em seguida, vamos criar um método que vai criar e exibir uma notificação do Android. Portanto, vamos criar o método `mostrarNotificacao()` que recebe um objeto do tipo `RemoteMessage.Notification`:

java

Agora que criamos o método, o que precisamos fazer? Criar de fato a notificação que será exibida para o usuário, certo? No Android, temos a classe [**Notification**] que permite criarmos notificações. Porém, da mesma forma como vimos no [**AlertDialo**`], é recomendado que utilize a classe interna `Builder` para criarmos as notificações. Portanto vamos utilizá-la:

java

Por questões de compatibilidade, é recomendado que utilizemos a classe [**NotificationCompat**]. Em outras palavras, por meio dela, daremos suporte para versões do Android mais antigas. Portanto, vamos utilizá-la ao invés da `Notification`:

java

Você pode estar se perguntando do motivo de estarmos passando o `this` por parâmetro do `NotificationCompat.Builder()`, já que não estamos em uma `Activity` ou `Context`. Um detalhe curioso sobre a classe `FirebaseMessagingService` é que ela, **bem internamente**, contém uma herança de `Context`, portanto, podemos utilizá-la! :D

Agora que instanciamos o `builder`, precisamos montar a notificação. Para isso temos que, pelo menos, preencher 3 informações:

- Título.
- Mensagem.
- Ícone.

Para adicionar um título, basta apenas utilizarmos o método `setContentTitle()` enviando uma `String` como parâmetro. Mas calma aí, qual `String` mandaremos? Lembra que temos o parâmetro `notification`? Então, nesse parâmetro temos todos os dados que uma notificação do FCM pode ter, portanto, vamos extrair o título por meio do método `getTitle()`:

java

E pra adicionar uma mensagem? Simples, da mesma forma como vimos no _builder_ do `AlertDialog`, a maioria dos métodos do `builder` também nos devolve o objeto. Em outras palavras, basta apenas chamarmos o método que adiciona a mensagem após o momento em que inserimos o título, nesse caso, o método `setContentText()`:

java

Mas qual mensagem enviamos para ele? Da mesma forma como fizemos com o título, podemos também pegar a mensagem do objeto `notification` a partir do método `getBody()`:

java

Agora que temos um título e uma mensagem, precisamos apenas adicionar um ícone. Podemos fazer isso por meio do método `setSmallIcon()`. Mas qual ícone podemos utilizar? Nesse projeto, temos o ícone da própria App no local `R.drawable.casadocodigo`, ou seja, vamos utilizá-lo:

java

Da mesma forma como vimos no `AlertDialog`, finalizamos a `builder` com o método `build()`:

java

## Utilizando o serviço de notificações do Android

Se executarmos a nossa App nesse exato momento, a notificação não aparece! Por que será? Diferente do `Dialog`, as notificações fazem parte de um serviço gerenciado pelo sistema operacional, nesse caso o Android, ou seja, precisamos pedir para o Android esse serviço. Para isso, utilizamos o método `getSystemService()`:

java

Porém, precisamos especificar qual serviço queremos enviando uma `String` por parâmetro. Qual `String` podemos enviar? A classe `Context` contém algumas constantes referentes a esses serviços e, para a nossa felicidade, ela contém a constante `NOTIFICATION_SERVICE` que refere-se justamente ao serviço de notificação que desejamos. Portanto vamos pedir esse serviço:

java

Agora precisamos referenciar esse serviço. Por padrão, ele nos devolve um `Object`, porém, precisamos de alguém mais específico! Qual classe podemos referenciar? No Android, temos a classe [**NotificationManager**] que é um classe responsável em gerenciar notificações do Android. Então vamos refenciar essa classe adicionando um cast, pois temos a "certeza" que é essa classe que será retornada:

java

## Exibindo a notificação

A partir do objeto `notificationManager`, para exibirmos a notificação, basta apenas chamarmos o método `notify()` enviando dois parâmetros:

- **1º parâmetro:** _id_ da notificação (Esse id é um valor único para a notificação que está sendo criada dentro da App).
- **2º parâmetro:** um objeto do tipo [Notification].

Como primeiro parâmetro, podemos enviar qualquer valor, portanto, colocarei como 0. Porém, e o objeto do tipo `Notification`? Como podemos enviá-lo sendo que temos apenas o `builder` do tipo `NotificationCompat.Builder`?

Lembra do método `build()`? Adivinha o que ele retorna? É exatamente o que você está pensando! Um objeto do tipo `Notification`, em outras palavras, basta apenas refenciá-lo para um objeto do tipo `Notification`:

java

Então enviamos o objeto `notificacao` para o `notify()`:

java

Testando a nossa App e enviando uma mensagem a partir do firebase, temos o seguinte resultado:

imagem` que nos devolve um objeto do tipo `PedingIntent` que inicializa uma activity. Observe também que já enviamos alguns valores como parâmetro que tem o seguinte significado:

- **1º parâmetro:** Contexto onde será inicializado.
- **2º parâmetro:** refere-se ao _request code_ que é um id para identificar o peding intent dentro da App. (Nesse caso, podemos simplesmente passar qualquer valor).
- **3º parâmetro:** `Intent` que será executada.
- **4º parâmetro:** Flags que indicam o comportamento do pending intent, nesse exemplo utilizei a constante PendingIntent.FLAG_UPDATE_CURRENT que indica que a peding intent já existe e quero apenas atualizar os dados recebidos pelos extras. (Para mais detalhes das flags consulte a [documentação])

Agora que temos o objeto `pedingIntent`, precisamos apenas _settá-lo_ no objeto `notification` a partir do método `setContentIntent()`:

java

Se executarmos novamente a nossa App, temos o seguinte resultado:

imagem` que recebe um booleano como parâmetro, ou seja, passamos o valor `true`:

java

Pronto! Agora temos o mesmo resultado como vimos no início do post. Em outras palavras, estamos recebendo e tratando uma mensagem do FCM em foreground.

Que tal aprender hoje mesmo a desenvolver a sua App Android desde o zero? Na **Alura**, temos uma [**formação Android**] para que você crie sua primeira App com os principais conceitos necessários para desenvolver uma App.




imagem ou pela identidade visual da sua empresa.

Com a cor base escolhida, dado as regras de combinações acima, podemos concluir que existe um conjunto **finito** de combinações bacanas. Por isso que em alguns manuais de identidade visual acabamos notando semelhanças na escolha das cores, pois as combinações de cores para um resultado harmonioso é limitado.

O mesmo parece ser válido para a música e diversas outras áreas com um número limitado de harmonias: começando em um tom, existe um número limitado de tons harmônicos a ele, por isso muitas melodias “se parecem”.

## E o header?

Uma sugestão para a mudança do exemplo do header, baseada na regra de triangulação (ou triádica):

![triadica]

Perceba que comparado com o primeiro exemplo, o header ficou mais elegante e as cores não parecem brigar entre si.

Saber escolher as cores do seu projeto faz uma enorme diferença visual, seja para o bem ou para o mal.




Você já se perguntou como são criados os cursos aqui na Alura? Com mais de 400 cursos em nossa plataforma, esta é uma dúvida recorrente de nossos alunos.

Pensando sempre na capacitação profissional e nas demandas do mercado, a criação de um curso começa a partir do momento em que um instrutor identifica uma lacuna no ensino de alguma tecnologia.

## Criando o conteúdo

Para criar um curso, é preciso que o instrutor escreva o que ele vai ensinar a fazer. O foco não está na ferramenta que ele utilizará, e sim no que será feito com ela, pois prezamos a teoria com base na prática.

Após escrever sobre o que ele vai ensinar, é preciso elaborar um projeto prático, que servirá como base para o conteúdo do curso, baseado em situações reais do dia a dia da profissão.  Por exemplo, nos cursos de Web Design, o projeto é a modelagem de um site web.

O passo a passo é documentado dentro de um arquivo de texto e, depois de uma revisão detalhada, este projeto vira um roteiro para a gravação. Neste momento, é discutido qual conteúdo pode ser cruzado com cursos já existentes na plataforma, qual ordem é melhor didaticamente para apresentar o conteúdo, as boas e más práticas que serão abordadas durante o curso, entre outras questões pertinentes para garantir uma boa qualidade do conteúdo.

## Em frente às câmeras

Cada curso e instrutor têm demandas de tempo diferentes, por conta disso, não determinamos uma duração fixa para as gravações. Nosso objetivo neste momento é respeitar a individualidade de cada instrutor para que as gravações sejam uma experiência enriquecedora, e o resultado seja o mais natural possível.

Após o término das gravações, nossa equipe de vídeos entra em ação para fazer os devidos ajustes e cortes, mantendo a ordem correta e garantindo a qualidade da imagem e do som.

Com a edição dos vídeos finalizada, é hora da equipe de transcrição escrever tudo o que foi dito no curso para disponibilizar o conteúdo também em forma de texto,  deixando-o acessível a todos.

Mas o processo não acaba aí… Todos os nossos cursos possuem exercícios e projetos exclusivos, focados no mercado de trabalho. O instrutor elabora esses exercícios, que são revisados por uma equipe para evitar possíveis falhas.

Após todas estas etapas, temos um curso pronto para que os alunos possam aprender e se capacitar cada vez mais. Para descobrir ainda mais detalhes sobre a criação dos cursos, baixe o [**eBook Como os cursos da Alura e Caelum são criados**].

O que acha de treinar sua equipe para conseguir resultados ainda melhores em sua empresa? Na [**Alura**], possuímos centenas de cursos pensados para capacitar equipes e, dessa forma, auxiliar as empresas a atingir seus objetivos.




Durante a principal batalha contra Thanos o Doutor Estranho decide qual caminho escolher: um entre 14 milhões de futuros, aquele que os levará a vitória, e o [**Nerdologia Tech discute o assunto**].

Mas como ele é capaz de visualizar tudo ao mesmo tempo? Tentaremos resolver o problema com **Python e Data Science**. Demonstraremos como ele foi capaz de visualizar todos os resultados em menos de um minuto.

## O trabalho original

Nosso trabalho é [**baseado naquele do Gabriel Schade**]. Os heróis são: Ironman, Spiderman, Nebula, Peter Quill, Drax, Mantis e Doctor Strange.

Cada round alguém bate em alguém: heróis batem em Thanos em uma de 3 estratégias. Depois Thanos em um dos heróis aleatoriamente. Isso gera `3 * 7` possibilidades. Com mais dois rounds são `3^2*7^2`, possibilidades crescendo exponencialmente com o número de rounds.

O trabalho original faz o teste de uma heurística específica, que nos leva a resultados super interessantes. Aqui queremos ver o que o Doutor Estranho viu. Exatamente o que ele viu? Vamos ver... ele viu todos os futuros ao mesmo tempo? Poderia ser, mas para isso o computador teria que simular todas as possibilidades sequencialmente?

## Nossa implementação

Simularemos diretamente todas as possibilidades ao mesmo tempo. Para isso faremos uso de um truque tradicional de algoritmos e maratonas de programação: nem todos os estados futuros são únicos. Por exemplo, para o primeiro round:

```
a) 1/3 de chance, homem de ferro bate com bônus 1 => Thanos não sente nem cócegas, continua com 500hp 
b) 1/3 de chance, homem de ferro bate com bônus 2 => Thanos não sente nem cócegas, continua com 500hp 
c) 1/3 de chance, homem de ferro bate com bônus 3 => Thanos fica com 450hp
```

Opa... esses 3 futuros podem ser resumidos em 2 estados: (66% 500hp, 33% 450hp). O mesmo ocorre com os estados futuros. Portanto podemos discretizar os futuros e armazená-los na memória junto com a probabilidade de cada um deles ocorrer. Agora a cada round rodamos um round ao mesmo tempo em *todos os futuros ao mesmo tempo*.

## Aqui a visualização após um turno:

- 66% de chance de um cenário onde Thanos possui 100% de energia, e os Avengers 100% - 33% de chance de um cenário onde Thanos possui 95% de energia, e os Avengers 100%

imagem que resultaria em exatamente 1 único sucesso e 14 milhões de estados futuros.

## Desafios ao nosso estudo

Os gráficos usam surfaces para facilita a visualização mas deveriam ser pontos para ser mais realista, sem extrapolação. Os pontos, porém, não ficam fáceis de serem visualizados os personagens escolhidos pelo trabalho original, sinta-se a vontade para mudá-los e recomendar alterações.

As estatísticas dos personagens, sinta-se a vontade para mudá-las e recomendar alterações, a batalha é mesmo baseada em turnos? Em filmes, costuma ser, não há perda de poder de ataque e defesa a medida que um personagem perde energia, assumimos que o futuro é decidido somente pelo resultado de uma batalha e os pesonagens envolvidos na mesma.

Pode ser que o universo dos Vingadores não seja real, e o filme não represente o universo em que vivemos. Nesse caso é possível que os futuros encontrados não sejam futuros de verdade, mas sim um **plot 3d de um jupyter notebook no cloud**.

Todo o [código fonte do projeto pode ser encontrado aqui no meu github].




Por esses dias a Mega-Sena acumulou de novo... Chegou ao valor de R$ 200 milhões! Porém, eu sempre fico muito indeciso em qual jogo fazer, então vou pedir para que o meu sistema jogue por mim. Vamos criar nosso _array_ de `int` de 6 posições para armazenar os números:

java

Agora varremos nosso _array_ e preenchemos cada posição com um valor aleatório entre 1 e 60, utilizando a classe `Random` e seu método `nextInt()`:

java

Imprimindo o nosso _array_ com o método `toString()` da classe `Arrays`:

java

Ele gerou 6 números aleatórios! Mas, espera aí... um desses números é o 0??? A Mega-Sena sorteia apenas números entre 1 e 60... O método `nextInt()` com parâmetro 60 significa que será retornado um valor do tipo `int` entre 0 e 59. Para resolver esse problema, precisamos somar 1 no momento que geramos os números aleatórios:

java

Ótimo! O sistema gerou um jogo da Mega-Sena! E, como podemos ver, dessa vez o número 60 apareceu.

Mas ainda tem um probleminha, esses números estão desordenados... Imagina na hora de preencher o volante da Mega-Sena: marco o 53, depois o 32 e depois terei que avançar para o número 60! E quando sair o resultado? Terei que procurar a dedo? Que horror! O método estático `sort()` da classe `Arrays` nos auxilia na ordenação de vetores numéricos:

java

Excelente! Conseguimos gerar o nosso jogo da Mega-Sena! Mas agora, ao invés de utilizar um _array_, eu quero usar uma solução mais sofisticada. Uma `List`,por exemplo:

java

Agora, vamos preencher a nossa `List` com um `while`:

java

E para ordenar? Usarei o método `sort()` da classe `Arrays`? Infelizmente o método `sort()` da classe `Arrays` espera apenas _arrays_ como parâmetro e uma List é uma `Collection`... Porém existe o método estático `sort()` para `Collection` utilizando a classe `Collections`:

java

Ele gerou o jogo como esperado! Mas, espera um pouco... 49 e 49? Como assim?? A Mega-Sena não permite jogos com números repetidos... A interface `List` possui o método `contains()` que permite verificar se um número já existe dentro da lista. Então, basta adicionar um `if` no momento da inserção dos números:

java

Nesse trecho estou dizendo que, se não existir o novo número aleatório dentro da lista de números, adicione. Testando a nova implementação:

java

Agora o nosso sistema não permite números repetidos!

Vimos como é fácil ordenar números em Java, pois já temos métodos disponíveis para resolver esse problema. Lembre-se sempre desses passos antes de ordenar:

- Quantos números preciso gerar?
- Posso repetir algum número?

**Gostou da `List`? Quer aprender mais APIs e bibliotecas do Java? A Alura possui um [curso de Java] que explica com mais detalhes as principais APIs e bibliotecas, com 3.158 alunos inscritos e com recomendação de 96%.**





imagem 

Outro dia estava analisando dados de uma empresa que produz lápis de cor e canetas. Fui começar a análise identificando quais eram os tipos de dados.

Para isso, abri o arquivo de uma planilha e na primeira linha, me deparei com os seguintes dados:

```
----------------------------------
Azul | Vermelho | Amarelo | Branco
----------------------------------
```

Olhando para esses dados, nós conseguimos subtraí-los? Por exemplo, fazer uma conta que é **azul menos vermelho**.

```
---------------------------------
Azul - Vermelho = ?
---------------------------------
```

Não conseguimos, certo?

Veja que não conseguimos fazer contas com **Azul, Vermelho, Amarelo, Branco**, mas podemos usá-los para dizer algo sobre uma caneta.

Podemos falar que é uma **caneta azul**, e assim, estamos dando uma **qualidade** para esse objeto.

imagem termos 0,12 lápis de cor, por exemplo.

Quando temos **dados quantitativos** que são **precisos**, que conseguimos **contar**, como os de lápis de cor, esses dados são chamados de **discretos**.

Ou seja, ao falarmos daquela segunda coluna na tabela, estamos falando de **dados quantitativos discretos**.

## Dados quantitativos contínuos

Agora que já vimos como classificar os dados dessa planilha, vamos seguir.

Eu ainda tinha um último arquivo para que eu analisasse no projeto. Abri o arquivo, e mais uma vez encontrei uma tabela:

```
-----------------------------------------
| Caixa A | Caixa B | Caixa C | Caixa D |
-----------------------------------------
| 129     | 165     | 210     | 275     |
-----------------------------------------
```

Veja que temos a mesma coluna do que a tabela anterior, mas desta vez, ao invés de quantidade de lápis, temos o peso de cada uma das caixas.

Para definirmos que tipo de dado é esse. Vamos iniciar as nossas perguntas.

Conseguimos subtrair 0,129 de 0,165? Conseguimos.

```
-----------------------------------------
0,165 - 0,129 = 0,36
-----------------------------------------
```

Beleza, então se conseguimos realizar operações aritméticas, sabemos que estamos diante de **dados quantitativos**. Mas será que esses dados são **quantitativos discretos**?

Para determinarmos isso, vamos repetir aquele processo de incluir uma Caixa E na tabela e calcular o seu valor.

```
Caixa A = 129
Caixa B = 165
Caixa C = 210
Caixa D = 275
Caixa E = ? 
```


Precisamos descobrir qual seria o peso dessa caixa, mas repare que não temos uma balança e nem a caixa física para realizarmos uma pesagem, teremos que usar apenas algumas contas.

Então vamos lá:

```
165
129
36
210
165
45
275
210
65

```

Veja que há uma diferença grande ao realizarmos o mesmo processo para essa tabela.

Primeiro, pois **não há um valor se repetindo** no resultado quando subtraímos os pesos das caixas, segundo porque, como iremos ter **certeza** do quanto uma nova caixa pesaria com as contas?

![]

Não temos como resolver o fato de que não há um número que se repita, então vamos tentar melhorar nossos cálculos. Podemos pegar todos esses valores diferentes e tentar ver o quanto cada um aumenta e depois somar uma média desses aumentos ao último valor.

Vamos lá. Iremos ver primeiro o quanto cada um deles aumenta. Para isso, precisamos saber quanto é diferença entre eles, fazendo também uma subtração:

```
45 - 36 = 9
65 - 45 = 20
```

Ok. Sabemos que o primeiro teve um aumento de 0,09 e o segundo de 0,20. Vamos somar os dois valores e dividi-los pela sua quantidade que é 2 para ver o quanto dá.

```
9 + 20 = 29
29 / 2 = 14.5
```

Então temos uma média de 0,145 a mais de um valor a outro. Com esse número, podemos tentar sugerir que a Caixa E, tivesse um aumento de 0,145 no peso. Ficando com a tabela assim:

```
Caixa A = 129
Caixa B = 165
Caixa C = 210
Caixa D = 275
Caixa E = 420
```

Ir de 0,275 para 0,420 parece um pouco exagerado, certo? Os números estavam bem próximos e de repente demos um pulo. Será que ainda precisamos melhorar mais?

Para isso, podemos tentar estimar fazendo mais contas e usando o peso da caixa, o peso de cada lápis. E qual seria o problema disso? Ainda assim teríamos uma **estimativa**, não teríamos como ter certeza. Diferentemente de quando fizemos isso antes, agora só conseguimos estimar.

# Mas porque? Por causa do nosso tipo de dado.

Repare que estamos lidando com um dado diferente do **quantitativo discreto** aqui, então as mesmas regras são se aplicam. Com esses novos dados, não temos quantidades que podemos contar, não vamos apenas somando quilos, como 1kg, 2kg, 3kg e assim por diante, temos variações como 1,200kg, 2,374kg e 3,821kg. Entre os números 1 e 2, temos **infinitas** **possibilidades**, por isso fica tão difícil achar um número.

Estamos mais próximos agora do **28,11** do que do **60**, pois não estamos **contando** lápis, mas **medindo** seu peso.

Quando estamos lidando com algo que **medimos**, temos números diferentes que possuem **variações**, como se estivessem **continuando**. Então não são só 28, 29 e 30, mas 28, 1, 28,2, 28,3 até chegarmos ao 28,11 e podemos ir quebrando esses números em 28,111 e 28,112, 28,113 sempre adicionando mais casas após a vírgula.

Quando temos dados quantitativos que são **medidas**, que tem essa **continuidade**, eles são classificados como **dados quantitativos contínuos**.

## Dados e mais dados...

Vimos como temos alguns tipos de classificação de dados que podem se dividir entre **qualitativos** e **quantitativos**. E além disso, como cada uma dessas classificações se subdivide no caso do **qualitativo**, entre **qualitativo nominal** e **qualitativo ordinal,** assim como para o **quantitativo**, entre **quantitativo** **discreto**, **quantitativo** **contínuo**.

Mas não pára por aí. Além dessas classificações de dados, existem alguns outros tipos de classificações que podemos utilizar. Como a classificação de dados em qualitativos binomiais, quantitativos intervalares, até mesmo em qualitativo discreto nominal, ou quantitativo contínuo racional, entre outros.

Muitas vezes ao procurar online ou em livros, você pode encontrar dados qualitativos sendo classificados como categóricos, ou classificações que não mencionam dados intervalares, iremos explicar porque isso acontece e ampliar a nossa visão do que é uma classificação de dados.

A classificação de dados é algo muito importante quando estamos começando a analisá-los, principalmente nas áreas de Ciência de Dados, BI e Estatística.

Aqui na Alura, temos um [**curso de estatística**] onde você irá aprender sobre esses tipos de dados, e também sobre conceitos como a diferença entre moda, média, mediana, e muitas outras coisas. Tudo isso será feito utilizando a linguagem R, uma linguagem criada para cálculos estatísticos.

Aproveite esses recursos de estudo e até a próxima.





imagem 

No app Imagly temos a primeira tela mais ou menos assim:

imagem de navegação.

Com esse recurso, liberamos o espaço que precisávamos antes e deixamos o layout muito mais limpo.

E esse menu nem precisaria ser só o "menu hamburguer". Existem algumas variações, como os ícones de configurações ou de 3 pontos que indicam a continuidade de possibilidades no menu.

imagem. Porém, no iOS, esbarramos em algumas dificuldades…

Por ser um padrão de sistema, algumas coisas podem acabar assumindo um papel diferente em contextos diferentes.

No caso do iOS, o menu hamburguer [**não é um componente nativo da plataforma**]. É mais comum recorrerem a [**Tab Bars**], uma outra forma de expor as funcionalidades do app.

imagem e
    
- O tipo de gatilho que acionará o side menu (menu hamburguer, por exemplo)
    

Manter ou não o menu escondido, ou mesmo optar por novas soluções, vai depender muito de como cada app será recebido por seus usuários, por isso é tão importante manter os testes de usabilidade para validar as possíveis necessidades de alteração da UI.

Em alguns contextos é possível até que optem por utilizar a Tab Bar com todas as categorias principais do menu e deixar o seide menu apenas como apoio a categorias de prioridade secundária.

Incentive a equipe a sempre prototipar e analisar bem as opções antes de lançarem o produto. E, para isso, na Alura nós temos um curso bem legal de [**prototipação com Axure**], além das opções online que encontramos por aí para deixar os projetos mais concretos, antes da implementação. :)





imagem 

Saber a diferença entre **int** e **Integer** em JAVA pode nos ajudar muito no nosso dia a dia.

Estou trabalhando em um sistema para uma loja de peças de carro online como revisor de código, ou seja, revisamos o código dos programadores desse sistema. Em uma das revisão nos deparamos com a seguinte classe:

java

Nessa **classe**, guardamos o nome e a idade de cada cliente, mas o atributo `idade` é opcional, o cliente não necessariamente precisa nos dar essa informação. E aí, vocês estão vendo algo estranho nessa classe?

Para ficar mais fácil de visualizar, vamos **instanciar** essa classe e imprimir seus valores:

java

Se executarmos este código, teremos o seguinte resultado:

java

Agora que vem a parte estranha. Por que a `idade` esta com valor 0? Eu não preenchi essa informação. E outra, idade “0”? Isso não existe.

Vamos entender o motivo disso. Se voltarmos para a nossa classe `Cliente` podemos perceber que o **atributo** `idade` é do tipo `int`. Esse tipo, por sua vez, é considerado um **tipo primitivo**, que nada mais é do que um tipo que não representa uma classe.

Quando declaramos um atributo (membro da classe) como sendo de algum tipo primitivo, esse atributo tem um valor padrão. No nosso caso, o padrão de int é 0, mas isso só vale para **atributos de uma classe**.

Não é isso que queremos, não é mesmo? Caso o cliente cadastre a idade, queremos salvar a idade, caso contrário, não queremos salvar nenhum valor, ou seja, queremos salvar o atributo idade como vazio.

# Classes Wrapper

Agora, se pensarmos, todos os tipos não primitivos são, por padrão, nulos caso não seja atribuído nenhum valor a eles.

Pensando nisso, a linguagem Java nos disponibilizou o que chamamos de **Wrapper**, que, basicamente, é uma classe que representa um tipo primitivo. Por exemplo o Wrapper de `int` é o `Integer`. Perceba que o Wrapper começa com letra maiúscula, ele segue a mesma nomenclatura que qualquer outra classe, pois ele também é uma.

> Mas o que eu ganho usando esse Wrapper?

Boa pergunta. Bom, a maior vantagem é conseguir atribuir nulo. Mas com grandes poderes, vem grandes responsabilidades, logo, cuidado para não atribuir valores nulos a rodo, pois seu código fica muito propenso a tomar **NullPointerException**.

Podemos falar também dos métodos que ganhamos, como agora estamos **tipando** nossa variável com uma classe, essa classe pode ter métodos que podemos usar para o nosso inteiro.

Para exemplificar vamos tentar ver os métodos disponíveis para `idade`:

imagem`, que transforma o parâmetro para o wrapper que chamou este método.

Além disso, caso seja realmente necessário usar um dos **métodos não estáticos**, a forma de transformar um `int` em `Integer` é trivial.

Para conseguir essa transformação podemos usar exatamente esse método `valueOf()`:

java

Ou então, como `Integer` é uma classe não abstrata, podemos instânciá-la:

java

Mas, poxa, é um pouco chato o jeito que é feita essa conversão né? Ter que ficar dando **new** ou ficar chamando o método estático para conseguir um `Integer`...

# Autoboxing e Unboxing

Vendo a regularidade que a conversão de tipo primitivo para Wrapper e vice-versa ocorria, foi desenvolvido para o Java 5 duas funcionalidades, **o autoboxing e o unboxing**.

O **autoboxing** é um recurso que automaticamente converte tipos primitivos em seu wrapper equivalente. Por exemplo, vamos supor que eu queira transformar o atributo `idade` que está com o tipo `int` para uma nova variável do tipo `Integer`. Com o autoboxing eu poderia fazer dessa forma:

java

E pronto, legal,né? “Por baixo dos panos” o compilador compila para o seguinte código:

java

E o unboxing é o inverso do autoboxing, ou seja, ele pega um wrapper e o transforma em seu tipo primitivo. Assim:

java

E por baixo dos panos, temos o seguinte:

java

Agora que entendemos melhor as diferenças entre `int` e `Integer` podemos acabar de revisar a classe `Cliente`. Como `idade` é um atributo opcional e com certeza não queremos que por padrão seja 0, vamos mudar o tipo dela de `int` para `Integer`. Ficando com a seguinte classe:

java

# Operações matemáticas com Wrapper

Faltou falar sobre uma coisa. E para operações matemáticas? O que é melhor usar? `int` ou `Integer`?

Para isso vamos criar um método para calcular o valor das parcelas das compras feitas na loja online. Nesse cálculo temos que seguir algumas regras:

- Se a quantidade de peças comprada for maior que 3, é dado um desconto de 10% em cima do total da compra.
- A comissão do vendedor é igual a 5% do valor total da compra após os descontos dados.
- O valor das parcelas é adquirido pela divisão do total já descontado pelo número de parcelas.

Bom, podemos criar um método que recebe o valor total, o número de peças compradas, o número de parcelas e retorna um objeto do tipo `GerenciadorDeVendas` que recebe em seu construtor o valor da comissão do vendedor e o valor de cada parcela:

java

Como o foco não é a operação em si, se fôssemos resolver esse método, poderíamos fazer da seguinte forma:

java 

Agora vocês devem estar se perguntando porque eu usei tipos primitivos ao invés de Wrappers, né? Então, se os usássemos, estaríamos correndo o risco de receber algum valor nulo e quando operássemos sobre esse valor iríamos tomar um belo `NullPointerException`. Portanto, usando os tipos primitivos estamos evitando isso. No máximo teremos algum dos parâmetros com valor 0.

O segundo motivo é a questão da performance. Um Wrapper não deixa de ser uma classe e quando criamos um, estamos, de fato, instanciando um objeto, logo estamos reservando um espaço da memória para ele.

Pensando nisso, imagine a quantidade de objetos que teríamos para resolver essa operação matemática, simplesmente não vale a pena, pois tudo que precisamos é trabalhar com valores e nesse aspecto o tipo primitivo consegue suprir essa necessidade.

Outra ponto importante é que o Java possui um cache para números baixos, então por exemplo:

java

Esse código imprime `false` pois `Integer` é uma classe, logo `i1` e `i2` são objetos dela e as suas referências estão alocadas em espaços diferentes na memória. Quando usamos o operador `==` em objetos, ele compara as referências e não os valores. Isto é, como os objetos não estão apontando para a mesma referência temos como resultado `false`.

Agora, olhe este código:

java 

Este, por sua vez, imprime `true`.

> Mas você acabou de falar que comparar objetos usando o operador `==` resulta em `false`

O Java, para economizar memória, possui um cache de alguns objetos, incluindo o `Integer`. Dependendo de como é feita a utilização, se os objetos do tipo `Integer` tiverem o valor entre -128 até 127 o Java consegue fazer um _boxing_ dos valores e os reutilizar.

Logo, efetuar comparações usando o operador “==” com Wrappers é arriscado, pois além de compararmos referências ao invés dos valores podemos cair nesse caso, onde é usado o cache e resultar em uma comparação inesperada.

Duas soluções para isso são: Usar tipos primitivos para efetuar comparação usando “==” ou usar o método [**equals()**] que é o [**mais adequado para comparar objetos**].

## Conclusão

Wrappers, como o `Integer`, são úteis quando precisamos usar nossa variável em coleções ou queremos deixar algum atributo opcional, leia-se, com valor nulo. Já tipos primitivos são ótimos para quando não queremos nulo e para operações matemáticas, pois ocupam pouco espaço na memória, melhorando a performance da sua aplicação.

É isso aí, espero que você tenha conseguido entender a diferença entre `int` e `Integer` e quando vale a pena usar cada um. Já se enrolou alguma vez na hora de comparar um Wrapper? 

Para entender mais sobre esses detalhes da linguagem, como o cache feito pelo Java e outras coisas relacionadas aos Wrappers, na **Alura** temos o [**Curso Certificação Java SE 8 Programmer I: Conteúdo além da prova**], lá você encontra um capítulo inteiro sobre classes Wrappers e várias outras peculiaridades da linguagem e uma [**formação completa em JAVA**]




Desde que se tornou popular no cinema, a [animação 3D] vem conquistando um número incontável de fãs e adeptos. Essa técnica trouxe inovação em diversos segmentos da indústria digital, mas foi no cinema onde seu encanto prevaleceu e evoluiu rapidamente.

Quem não lembra de [Toy Story], o primeiro grande sucesso em animação 3D? Ele foi lançado em 1995 e levou a produtora [Pixar] ao conhecimento do grande público, passando do semianonimato ao estrelato.

Na mesma época, outra grande produção em 3D disputava com Toy Story o status de primeiro filme totalmente produzido digitalmente: [Cassiopeia], que é uma produção brasileira! Sim, isso mesmo. O Brasil esteve na corrida pela conquista do pódio nesse universo tão fascinante, que ganha cada vez mais espaço.

## O início de tudo

Para a surpresa de muitos, não foi com Toy Story que tudo começou. Em 1972, [Edwin Catmull] (o então futuro fundador da Pixar) e Fred Parke criaram A [Computer Animated Hand], um dos primeiros filmes em animação 3D.

Nesse experimento, eles desenvolveram um modelo de mão representada em três dimensões. A imagem apresentava textura e movimento e foi feita a partir da mão do próprio Ed Catmull, reproduzida em uma réplica de gesso. A partir disso, foi feito um mapeamento detalhado do polígono que compunha o modelo tridimensional.

O resultado foi extremamente simples, mas um marco na história da modelagem digital em 3D. Estava aberta a porta para a evolução da técnica e sua aplicação em muito do que conhecemos hoje em computação gráfica.

## As carreiras possíveis

Muita gente tem deixado de lado o medo dos softwares de computação gráfica para experimentar essa arte que, há pouco tempo, era vista como privilégio de pessoas com [habilidades] notáveis.

Na realidade, não é necessário possuir um talento especial para abraçar as carreiras de computação gráfica. É importante, no entanto, estar disposto a dedicar muito tempo e disciplina para se capacitar nessa área.

Para quem tem interesse nesse segmento, um mínimo de vocação artística pode facilitar o aprendizado. Conhecimentos em desenho ou escultura também auxiliam na transição para o 3D, mas esse não é um requisito indispensável para ingressar na carreira.

O que realmente importa é dedicação, paciência, disciplina, força de vontade, trabalho duro e muito mais disso tudo. Aceitar críticas também é uma grande virtude, já que o caminho para a excelência nesse tipo de trabalho é recheado de erros e dúvidas.

Atualmente, esse mercado está em franca expansão e precisa de pessoal capacitado. As carreiras relacionadas à área de animação 3D são muito promissoras e invadem diversos setores à medida que a tecnologia avança e se torna popular. Confira a seguir algumas alternativas e escolha a sua:

### Agências publicitárias

As agências funcionam muito bem como [ponto de partida] para profissionais que estão se aventurando na carreira. É um nicho onde se concentra a maior demanda de pessoas em busca de uma oportunidade para entrar no mercado.

O conteúdo dessas agências costuma ser bastante diversificado. Muitas trabalham com comerciais, envolvendo criação de vinhetas e anúncios que exigem um trabalho mais aprofundado de desenho, modelagem e animação 3D.

Algumas agências criam setores especialmente direcionados à produção de efeitos especiais e animação. Os salários variam bastante de acordo com o nível de conhecimento de cada profissional, mas podem ficar entre R$ 3 mil para iniciantes a R$ 10 mil para gestores/diretores de arte e coordenadores de projetos 3D.

### Mercado de games

A cada geração, os jogos eletrônicos vêm conquistando mais e mais adeptos de todas as idades e segmentos. Ganhou até um verbete: “gamificação”, partindo da ideia de que tudo pode virar um game, de filmes a atividades escolares ou profissionais.

Os games já foram vistos como coisa de criança, mas atualmente movimentam bilhões de dólares por ano, firmando-se como profissão séria para adultos e investimento lucrativo para empreendedores. O mercado brasileiro de jogos eletrônicos ocupa a 13º. posição no ranking mundial, segundo estimativa realizada pela [Newzoo], consultoria referência em pesquisas da indústria de games.

Essa é uma das mais cobiçadas alternativas para os amantes de animação 3D, afinal, os games são um universo lúdico onde você pode ter a chance de trabalhar com franquias amadas e criar universos totalmente interativos. Entretanto, não se engane: é preciso muita persistência para se manter nele.

A demanda de desenvolvedores no mundo todo é extensa e o leque de opções é cada vez maior. As ferramentas para produzir aplicativos e jogos estão tornando a criação de games mais acessível, criando muita concorrência entre pequenos e grandes estúdios que disputam os mesmos usuários.

Assim, o desafio para promover e distribuir jogos é grande, exigindo um crescimento na especialização em marketing e monetização, além do alto nível da qualidade dos jogos em produção.

Mas tudo isso faz parte de um mercado em expansão. Ao mesmo tempo em que a disputa entre empresas cresce, os negócios complementares também acompanham esse crescimento, estendendo as oportunidades.

No mercado de games, a média salarial para artistas gráficos e animadores flutua entre R$ 1,8 mil e R$ 4 mil. Muitos são freelancers e prestam serviços para diversos estúdios, então esses valores podem variar ainda mais.

De todas as áreas para atuação de artistas gráficos, esta é a que apresenta a mais baixa remuneração, mas é a que mais avança e se renova constantemente. Para os apaixonados por games, vale a pena o esforço.

### Produtoras de cinema

O cinema passou por uma transformação impactante desde que a computação gráfica mudou seus contornos. As histórias fantásticas, mundos suprarreais, seres mitológicos e super-heróis passaram a ter mais credibilidade.

Os efeitos visuais que a modelagem e animação 3D proporcionam têm sido as grandes estrelas desse setor. Desde que Edwin Catmull e seus colaboradores produziram o primeiro modelo 3D, [essa técnica] não parou de evoluir.

É importante deixar claro que os efeitos especiais também são aplicados para compor cenários da vida cotidiana e que, muitas vezes, ninguém suspeita de sua presença “em cena”. Um exemplo disso é o filme Chico Xavier (2010), de Daniel Filho, que teve o uso desse recurso em mais de metade da produção.

Porém, é inegável que o maior chamariz para os aspirantes à carreira de animadores 3D no cinema são os desenhos totalmente digitais. Depois do marco de Toy Story, uma avalanche de filmes colocou a produtora no ápice das bilheterias do gênero.

A Dreamworks de Steven Spielberg trilhou o mesmo caminho com super produções como Shrek, Madagascar e Kung Fu Panda. Esses dois estúdios se mantêm no topo, alternando sucessos de bilheteria entre si ao lado da Disney, que também produz animações 3D independentemente da Pixar.

O mercado de animadores no cinema ao redor do mundo ainda está carente de profissionais qualificados. A indústria cinematográfica em países como Estados Unidos e França conta com um bom número de especialistas, enquanto no Brasil ainda há um caminho a percorrer para alcançar o mesmo patamar.

Contudo, os salários são mais animadores que nas outras alternativas de carreira: no Brasil costuma variar entre R$ 3 mil a R$ 15 mil para um modelador generalista. Nos Estados Unidos, a realidade profissional é muito diferente e bem mais atraente para quem tiver oportunidade de buscar lá uma carreira de artista gráfico.

Como se pode notar, os caminhos que o mercado da animação 3D apresenta são particularmente interessantes dentro de um universo único, que fascina profissionais e admiradores. Escolha o seu e mãos à obra!





O mercado de trabalho tradicional, que contrata os colaboradores no regime da CLT, não tem dado sinais de que vai se recuperar tão cedo da recessão pelo qual o país passa. O trabalho freelance tornou-se uma opção viável e rentável para muitos profissionais que buscam qualidade de vida, remuneração justa e um maior controle sobre as atividades que desenvolve. 

Ele também é uma opção para [**quem está começando na carreira**].

Conseguir mais trabalhos como freelancer passou a ser a meta desses profissionais, que aperfeiçoam suas técnicas e oferecem oportunidades com preços mais competitivos para os clientes. 

## Como conseguir trabalhos como freelancer?

Para que você consiga trabalhos como freelancer, é necessário adotar algumas boas práticas e estratégias que te conduzam a esse objetivo. Nós listamos as principais a seguir. Confira!

### Crie um portfólio

Como um cliente pode avaliar sua capacidade de realização se você não possui um portfólio? O portfólio facilita a identificação do cliente com o seu trabalho, pois ele enxerga nos exemplos apresentados o que ele deseja para o seu negócio.

**Tenha um site que reflita o quão profissional você é. Opte pela aquisição de um domínio próprio, que transmite mais profissionalismo, e tenha um site responsivo e fácil de navegar. Deixe seus contatos em um ponto de fácil visualização e atualize seu portfólio com frequência.**

### Pratique o networking

Ative os seus contatos e busque, entre eles, os clientes potenciais que estão interessados no seu trabalho. Após identificar esses prováveis clientes, agende um encontro pessoalmente para apresentar seu portfólio e propor serviços.

Participe de eventos como palestras e eventos gratuitos, pois neles você pode encontrar potenciais clientes. Se você trabalha como designer de e-commerce, por exemplo, um evento com empreendedores que buscam turbinar seus negócios pode oferecer oportunidades únicas para o seu trabalho.

### Seja ativo nas mídias sociais

As mídias sociais não servem apenas para você se relacionar com amigos e familiares. O Facebook, por exemplo, permite a criação de _fan pages_ com finalidade comercial. Crie a sua e comece a divulgar seu trabalho.

[**Outra rede social que pode trabalhar ao seu favor é o LinkedIn.**] Essa rede social voltada para profissionais tem, frequentemente, recrutadores e clientes buscando por freelancers que desenvolvam atividades específicas em curto prazo.

O YouTube também pode te ajudar a encontrar novos clientes. Além de divulgar depoimentos de seus clientes sobre o serviço que você desenvolve, aproveite o canal para discutir temas relacionados ao seu trabalho e propor melhorias para a área. Fomentar a discussão sobre um tema também é uma forma de encontrar freelances.

### Envie e-mail marketing

Crie uma lista de contatos profissionais. Assim que começar a trabalhar como freelancer, dispare um e-mail marketing para essa lista contando sobre suas atividades. Para alimentar sua lista de e-mails, coloque em seu site algumas formas de capturar novos contatos. Isso pode ser feito por meio de formulários e compartilhamento de conteúdo relevante, trocando o conteúdo pelo contato.

### Apresente-se para as agências

**As agências de publicidade e de comunicação necessitam, frequentemente, de profissionais freelancer. Elas buscam oferecer diversas soluções para os seus clientes, porém nem sempre contam com uma equipe especializada em certos assuntos.**

Combine uma reunião com os proprietários da agência e apresente seu portfólio. Mostre como seu trabalho pode fazer a diferença para os clientes deles saber quais são os trabalhos desenvolvidos pela agência é fundamental, portanto faça uma pesquisa com antecedência para chegar com bons argumentos.

## Onde conseguir trabalhos como freelancer?

Agora que você sabe as estratégias para encontrar trabalhos como freelancer e aumentar sua base de clientes, nós listamos os sites especializados em divulgar vagas para profissionais como você. Confira!

### GetNinjas

O [GetNinjas] é uma plataforma virtual que serve para anunciar os mais diversos tipos de serviços. Quem presta os serviços precisa fazer um cadastro, que permite fazer uma página pessoal para descrever o tipo de serviço que presta, inserir fotos e divulgar as avaliações do seu trabalho. O GetNinjas também tem um aplicativo para smartphones que permite receber notificações quando algum cliente entra em contato solicitando novos orçamentos.

### Nearjob

Com design simples e fácil de navegar, o [**Nearjob**] é um serviço gratuito para freelancers que desejam conseguir mais clientes. Uma das vantagens desse site é a intermediação do pagamento entre você e o cliente, permitindo receber o pagamento assim que o trabalho for marcado como concluído.

### Logovia

O [**Logovia**] é voltado para freelancers que trabalham com a criação de produtos gráficos, como cartões, folders, identidade visual e logotipos. Os clientes preenchem uma ficha com o objetivo do trabalho e o orçamento disponível, permitindo que mais de um freelancer realize o trabalho, em uma espécie de concorrência. O cliente escolhe o vencedor, que, ao final, receberá o valor disponível para orçamento. O envio dos trabalhos e o pagamento são feitos por intermédio do site.

### Prolancer

Uma das plataformas mais completas para quem busca oportunidades freelance de trabalho, o [**Prolancer**] apresenta em sua plataforma uma série de trabalhos disponíveis. Os clientes descrevem suas necessidades e apontam os orçamentos. Caso você queira pegar algum dos trabalhos, basta se candidatar e enviar o seu preço, portfólio e diferenciais.

### Freelancer.com

Ideal para quem tem fluência em mais de um idioma, pois encontra-se presente em quase 250 países, o [**Freelancer.com**] apresenta cerca de 270 mil ofertas de trabalho sem vínculos empregatícios. O pagamento é em moeda estrangeira, no caso, o dólar — que está valorizado. O valor médio por trabalho é de 200 dólares, aproximadamente R$600,00.

### 99freelas

O [99freelas] permite o seu cadastro por e-mail ou pela sua conta do Facebook. Informe suas habilidades, experiências e demais informações. Depois de criar o cadastro, basta pesquisar entre os trabalhos disponíveis aqueles que sejam gratificantes para você. A plataforma também recomenda alguns freelances de acordo com o seu perfil profissional, habilidades e interesses. O site permite que cada usuário opte por ter um plano gratuito ou pago.

### Trampos

Nascido no Twitter como divulgador de vagas, o [Trampos] passou a ser uma plataforma que agrega diversas oportunidades de trabalho — para freelancers ou não. De navegação simples e intuitiva, o Trampos permite que você escolha as vagas por meio de filtros que separam a sua área de atuação e o tipo de contratação que está buscando. Os usuários que pagam o plano mensal do site têm direito a receber as vagas com algumas horas de antecedência, o que aumenta a visibilidade desses profissionais e as chances de conquistarem a oportunidade.

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Para isso, o empresário deve promover sua imagem, deixando claro que o negócio conta com sua habilidade e qualidade. Ser visto é essencial para ser lembrado, porém ainda insuficiente para divulgar os seus serviços como superiores aos da concorrência.

Manter a competitividade em um mercado tão exigente quanto o atual exige criatividade e inovação. A utilização de técnicas e estratégias de marketing pessoal para conquistar mais clientes é essencial para o desenvolvimento de colaboradores e até mesmo companhias como um todo. Descubra como agir para divulgar as suas competências e atrair o público!

## O marketing pessoal

O [**marketing pessoal**] consiste na realização de uma série de ações e estratégias (sempre aplicadas de acordo com a realidade de cada pessoa) com o objetivo de atribuir valor positivo à imagem pessoal de um sujeito.

Mais do que realizar a autopromoção da imagem de uma pessoa, o marketing pessoal não se confunde com a publicidade: ele diz respeito apenas à criação de possibilidades para que o público possa enxergar quem o pratica como autoridade em um assunto. O fortalecimento da marca é apenas consequência.

### Consumidores modernos pedem soluções de marketing pessoal arrojadas

Para tanto, é preciso um planejamento estratégico que vise entregar valor para as pessoas, já que o tradicional conceito de “ser visto para ser lembrado” não é mais suficiente para o consumidor moderno.

O marketing de conteúdo especialmente voltado para redes sociais — é assim uma das mais poderosas soluções para quem quer turbinar sua imagem e provocar um aumento de sua relevância no mercado, tornando-se referência em seu segmento.

Para fortalecer a sua marca pessoal, você precisa entregar exatamente o que o consumidor espera: conteúdos de acordo com seu perfil e que responda a dúvidas que seu cliente geralmente tem. Toda vez que o público o enxerga como especialista em seu assunto, você fortalece a sua imagem.

## Como fazer marketing pessoal de qualidade

O início da composição de uma boa estratégia é sempre sondar o público (ainda que por meio de terceiros, afinal, o cliente pode não dizer tudo o que pensa na frente do prestador de serviços) e descobrir sua real imagem perante os consumidores, respondendo perguntas como: o que pensam de você como profissional? Eles veem você como referência no seu setor?

A partir daí você pode traçar objetivos e ter um guia para uma ação mais adequada para fortalecer sua imagem. Em linhas gerais, a construção de uma solução segue o seguinte passo a passo:

### 1\. Defina um objetivo

A fim de ter sucesso na promoção da sua imagem, você deve ter certeza das metas que deseja alcançar. É importante definir objetivos concretos e tangíveis: de nada adianta esperar um aumento de 500% de clientes no espaço de uma semana, já que normalmente é uma situação incompatível com o mercado brasileiro.

Aumentar a clientela, gerar maior tráfego para seu site ou blog, aumentar seu alcance nas redes sociais, conseguir uma promoção — apenas você (ou um profissional qualificado para guiá-lo neste caminho) poderá [**definir quais tipos de metas**] são adequadas ao seu perfil.

### 2\. Busque autoconhecimento

Ao estruturar uma estratégia de marketing pessoal, você deve fazer uma autoanálise e descobrir quais os recursos que você já possui, bem como os que precisarão ser desenvolvidos ou mesmo adquiridos.

Aprender a lidar melhor com clientes, desenvolver habilidades de venda e dominar melhor soluções de marketing são exemplos de melhorias que podem ser implantadas.

Desenvolver habilidades que estão ligadas à captação do público permitirá a entrega de valores os quais eles talvez nem saibam que precisam, fazendo com que prestem mais atenção naquilo que você tem a oferecer.

### 3\. Promova mudança de atitudes

Tenha sempre em mente que a sua imagem é o que pode deixar uma primeira impressão positiva, sendo um verdadeiro cartão de visita. Uma vez realizada a observação consciente de suas atitudes, é hora de partir para a ação e modificar aquelas que estão insatisfatórias.

Pense em mudança de hábitos, formas de lidar com clientes e até mesmo de vestuário — tudo que aumente sua autoconfiança e fortaleça positivamente a percepção dos outros sobre sua imagem é válido.

Quer alcançar uma clientela mais específica? Estude seus hábitos e necessidades. Quer se comunicar melhor com o público? Invista em cursos de oratória. Sabe lidar com a tecnologia, mas está desatualizado? Capacite-se e busque cursos de qualidades para saber como acompanhar os avanços da era digital.

### 4\. Meça resultados e realize ajustes

O ideal é seguir métricas e acompanhar resultados em números e porcentagens e checar periodicamente se sua estratégia tem sido efetiva para promover ajustes. Afinal, investir em soluções que não funcionam significa perda de tempo e dinheiro.

Vale acompanhar o tráfego de seu site, conhecer o engajamento gerado pelos seus posts nas redes sociais (o que pode ser feito com ferramentas das próprias plataformas) e até mesmo ver se o número de negócios fechados aumentou com a implantação de mudanças: tudo dependerá das estratégias que você tenha adotado.

## Marketing pessoal nas redes sociais

O meio virtual é hoje uma extensão da nossa sociedade, tomando grande parte do tempo da maioria das pessoas, que utilizam a internet diariamente para atender a propósitos pessoais de trabalho. É pelas plataformas digitais que os cidadãos constroem sua imagem e alimentam a curiosidade do público.

Uma boa estratégia de marketing pessoal, assim, deve ter como pilar fundamental as redes sociais: seu alcance é bem mais rápido que o de outros canais e você pode (cuidadosamente) escolher o que postar e fortalecer sua reputação. Algumas atitudes são indispensáveis para quem quer investir nesse tipo de marketing. Entenda:

### Defina seu target

Toda marca pretende se comunicar com certo público e apresentar-lhes produtos ou serviços. Não pode ser diferente do que acontece em uma marca pessoal: o valor a ser entregue deve ser projetado para uma dada audiência.

Esteja claro de quem compõe essa audiência e mire seus esforços nesse target. Para aumentar sua rede de contatos e fortificar o networking, procure seguir pessoas influentes e trabalhe bastante para que elas sigam o seu perfil de volta.

### Invista em uma imagem pessoal impactante e uniforme

Ao criar uma imagem profissional, elimine apelidos: eles só serão úteis se forem mais utilizados que seu nome real. Imagens de perfil e capa devem ser sempre atualizadas, a fim de não cansar o público e causar maior engajamento.

O volume de postagens deve estar de acordo tanto com as [**redes sociais**] escolhidas, quanto à sua área de atuação. Só poste ou comente conteúdos que sejam realmente relevantes para a sua rede, sempre com autoridade e de maneira autêntica. Não ofenda ninguém e mantenha a ética profissional.

### Aposte em frases impactantes e bons títulos

Suas declarações (inclusive constantes na descrição do seu perfil) deverão ter apelos objetivos, atraentes e reais. Aposte em declarações fortes, que causem impactos positivos e estejam intimamente ligadas aos seus valores. Não poste conteúdo aleatoriamente e busque formular frases e títulos que sejam diferentes e fácil de ser lembrados.

## Aumentando a rede de clientes de maneira eficiente

Uma boa forma de agregar valor à sua marca pessoal é fazer associações e parcerias. Isso pode ser feito até mesmo por meio de comentários. Viu algo que gostou? Opine e compartilhe sua opinião. Uma conversa assim pode se desenvolver e render bons frutos no futuro.

Dê preferência a marcas [**formadoras de opinião**] já consolidadas na rede. Assim, você atrai mais seguidores ao se utilizar de um tráfego já existente.





Meu primeiro contato com o **universo 3D** foi há 13 anos atrás. Meus amigos me apresentaram o jogo CS 1.6 e estavam todos muito empolgados com o jogo e seu gráfico realista, que o tornava ainda mais interessante.

imagem em novas ferramentas** que surgem na efervescência da sofisticação tecnológica dos softwares de modelagem virtual 3D.

## **Outras áreas de atuação do profissional de 3D**

**Filmes de animação**:

![]

**Filmes** _**live action**_ - interação do 3D com pessoas reais:

![]

**Entertainment and advertising** - propagandas e comerciais:

![]

![]

![]

## **Quem faz?**

No Brasil temos grandes artistas de 3D que estão cada mais ganhando destaque no mercado.

![]

Ver referências de grandes artistas é muito importante para nivelar a qualidade do trabalho que você executa buscando sempre qualidade, porém, mantendo a originalidade que faz cada modelador ser singular.

Selecionamos abaixo alguns artistas renomados que vêm fazendo a diferença no direcionamento dos games e filmes 3D:  
[Rafael Grasetti]  
[Glauco Longhi]  
[Alex Oliver]  
[Fellipe Beckman]  
[Victor Hugo Queiroz]

Pela complexidade do ofício, **há uma grande procura por profissionais qualificados no mercado de trabalho**, o que torna-se muito interessante para quem deseja aprender e se profissionalizar.

Aqui na [**Alura**] temos vários cursos que apoiam esta jornada:  
[**Jogos mobile com Unity: Diversão com a Game Engine**]  
[**Blender 3D: Modelagem inorgânica**]  
[**Maya parte 1: Modelagem inorgânica**]  
[**Autodesk 3Ds Max Parte 1: Modelagem inorgânica**]  
[**Unreal Engine**]  





**Front End** ou **Back End** developer são termos para diferenciar onde uma pessoa que programa acaba se especializando. 
Se você está entrando no mundo do desenvolvimento muito provavelmente classifica todo mundo como programador e programadora, mas os sistemas se tornaram tão complexos que precisamos que cada um seja responsável por partes específicas de uma aplicação.

## O que é Front End?

Podemos classificar como a parte visual de um site, aquilo que conseguimos interagir. Quem trabalha com Front End é responsável por desenvolver por meio de código uma interface gráfica, normalmente com as tecnologias base da Web (**HTML**, **CSS** e **JavaScript**). Algumas pessoas podem confundir um pouco esse trabalho com o que um designer faz (no passado existia uma entidade chamda **Webmaster** que fazia tudo isso e mais um pouco), mas a diferença aqui é que o designer vai utilizar alguma ferramenta visual para **desenhar a interface**, do Photoshop ao Sketch, e quem faz front-end estará mais próxima do código em si,  que irá rodar em um navegador Web como Chrome, Firefox ou Safari.

imagem

É importante entender como funciona a web para saber o que diferencia quem faz front-end do back-end:

https://www.youtube.com/watch?v=kDy62zaCHZE

O mundo do Front End possui diversas tecnologias e está sempre evoluindo, se você quiser conhecer ele desde a base [recomendo você dar uma olhada na Formação front end aqui da Alura], e caso queira ir mais a fundo trabalhando com as ferramentas da moda, confere essas outras formações especializadas em frameworks JavaScript:

- https://www.alura.com.br/formacao-vuejs
- https://www.alura.com.br/formacao-angular
- https://www.alura.com.br/formacao-react

## O que é Back End?

Back End, como o próprio nome sugere, vem da ideia **do que tem por trás de uma aplicação**. Pode ficar meio abstrato em um primeiro momento, mas pense que para conseguir usar o Facebook no dia a dia, os dados do seu perfil, amigos e publicações precisam estar salvos em algum lugar, sendo esse lugar um banco de dados e processados a partir de lá. Não basta apenas o front-end em HTML e CSS! O Back End trabalha em boa partes dos casos fazendo a ponte entre os dados que vem do navegador rumo ao banco de dados e vice-versa, sempre aplicando as devidas regras de negócio, validações e garantias em um ambiente onde o usuário final não tenha acesso e possa manipular algo.

imagem

É comum desenvolvedores Back End trabalharem com ferramentas de linha de comando, sites (deixando o HTML dinâmico), análise de dados (embora isso puxe mais o que um [Data Scientist faz]). Tudo isso pode ser feito com uma série de linguagens diferentes como: PHP, Ruby, Java, Clojure, C# entre diversas outras que você pode dar uma olhada no fluxo para aprender cada uma delas se baseando nas formações aqui da alura nos links abaixo:

- https://www.alura.com.br/formacao-java
- https://www.alura.com.br/formacao-desenvolvedor-php
- https://www.alura.com.br/formacao-python-web
- https://www.alura.com.br/formacao-dotnet
- https://www.alura.com.br/formacao-node-js

## Onde se encaixa quem desenvolve aplicativos Mobile?

Existe uma discussão se quem trabalha como Front End também é desenvolvedor Mobile. Na prática não, mas pode ser. Explicando um pouco mais as tecnologias que envolvem os aplicativos mobile são inicialmente completamente diferentes das que citamos para a Web sendo elas para android: Java, Kotlin; E para iOS: Swift e Objective C. Desde o começo dos dispositivos mobile existiram alternativas para desenvolvermos como o Phonegap ou Apache Cordova que permitem que você crie um site que seja instalável como aplicativo (hoje temos a proposta das PWAs). 

Na prática são mundos diferentes, o que pode gerar uma intersecção do Front End e do mundo Mobile seria o React Native por utilizar tanto um framework super popular na Web quanto a linguagem JavaScript. Mesmo com essa familiaridade toda, as diferençås das plataformas ainda sim separam os profissionais que mexem com sites e aplicativos em duas linhas diferentes.

## É possível ser Full Stack?
Bom, ambas as vertentes do Front e do Back End possuem uma [trilha bem longa] dependendo do quão profundo conhecedor delas você quer ser. Uma definição comum é que quem mexe com **Front End e Back End** é um fullstack. Com o passar dos anos como desenvolvedor é meio natural após começar por um dos lados você ir aprendendo como o outro funciona, eu por exemplo comecei como desenvolvedor PHP e hoje sou focado 100% em Front End, por mais que eu não seja um especialista em Back End os conceitos que eu sei me ajudam a conseguir resolver problemas nesse lado, não tão bem quanto como Front End mas consigo. 

O que vale se atentar aqui é que algumas empresas esperam que você tenha um conhecimento também de [Devops] e de [SQL e Banco de dados]. 

Minha dica aqui é, se você está começando na carreira foque em uma área, estude ela bastante e conforme for se sentindo confortável e quiser explorar novos temas o conhecimento vai vindo de forma mais natural, vou até deixar um [post do Guilherme Silveira sobre como você pode organizar seus estudos].

## Conclusão
Vimos que quem trabalha com sites é chamado de Front End, quem faz aplicativos é um desenvolvedor Mobile e que o Back End cuida da aplicação que está por trás desses 2 tipos entre outros casos. Vimos que para ser Full Stack pode ser necessário aprender bastante coisa, e que se você quiser um guia para estudar aqui na Alura a gente tem diversas formações para poder ti puxar um norte nos estudos. 






Estava trabalhando na busca de tópicos para o fórum da Alura. Quando a pessoa procurar por uma palavra que existe em algum tópico, temos que mostrar esse tópico para ela. Por exemplo, a pessoa busca por “Java“. Todo tópico que contém **Java** em seu título deve aparecer. 

Uma maneira de implementar isso é **iterar pela lista de tópicos**, isto é, captamos o texto do usuários e caminhamos por todos os itens de uma lista de tópicos para verificar se a palavra existe naquele tópico. Utilizando o Python como linguagem, temos algo próximo a isso:

python

Procurando por “Java”, temos esse resultado:

python

Legal! Conseguimos pegar todas os tópicos que contém a palavra Java, mas qual o problema do algoritmo que implementamos?

# A complexidade do algoritmo 

O algoritmo passa por todos os itens da lista para fazer a busca pela palavra, ele faz uma [**busca linear**]. Ou seja, se a lista tiver 5 elementos, ele passará pelos 5, se tiver 20 pelos 20, se tiver um milhão, vai passar por todos os itens, ufa… O tempo que nosso algoritmo leva para percorrer depende do número de itens na lista. 5, 10, 15, até **N **itens. 

Logo, falamos que esse algoritmo tem **complexidade O(n)**. De fato, é possível que todos os itens na lista tenham a palavra que estamos procurando, mas o que aconteceria se apenas o primeiro item tiver a palavra? Mesmo assim, teremos que percorrer todos os outros itens, apesar deles não terem o que procuramos. 

Pensando em performance, esse algoritmo não é tão bom. Estamos em um contexto web no fórum da Alura. Se a busca demorar muito, afeta a experiência do usuário. Como podemos criar um algoritmo que consiga descobrir quais itens da lista tem a palavra que buscamos sem afetar muito a performance?

# O poder dos hashes 

No caso, estamos utilizando uma **lista** para guardar nossos tópicos. Outra estrutura que podemos utilizar são os **conjuntos, ou sets**. Quando estudamos **estruturas de dados**, uma das primeiras coisas que sabemos sobre eles é que eles guardam apenas uma ocorrência do item que ele guarda. Ou seja, se declararmos um conjunto dessa forma:

python
Quantos itens aparecerão quando pedirmos para imprimí-lo?

python

Só aparecem seis itens. Essa é uma das primeiras coisas que aprendemos, mas outra coisa muito interessante sobre conjuntos é que buscar itens fica muito mais rápido do que buscar itens em uma lista. Mas por que isso acontece? Para armazenar os itens, os conjuntos fazem uso de uma função especial, chamada de **função hash**.

A função hash é um algoritmo que pega o item que estamos buscando, ou inserindo no conjunto, e gera uma representação única para ele. Por exemplo, vamos pegar os números que usamos. A função hash do número pode ser o próprio número. Isso porque cada número é único no universo. O número 1 é o número 1. Só o número 1 pode ser o número 1. Se ele for outra coisa, não é mais o número 1, é outro número.

Neste caso, a função hash devolveria o próprio número que estamos buscando. No nosso exemplo de buscarmos palavras. Uma função hash que poderíamos utilizar é pegar a primeira letra da palavra. Por exemplo, Java retornaria J, Python P, JavaScript J também. 

A partir dessa letra, podemos ter **formas mais eficientes** de buscar as palavras nos itens. Claro, nossos exemplos são bem simples, algoritmos de hash podem ser, e são, mais complexos que isso. Baseados em diferentes cálculos matemáticos para realizar o hash.

Estruturas de dados que utilizam hashes são, em geral, mais rápidas de fazer buscas do que estruturas que não utilizam. No nosso caso, temos várias frases. Quando alguém buscar uma palavra, temos que retornar os tópicos que contém aquela palavra. E se utilizarmos a palavra dos tópicos como o item em uma função hash?

# Invertendo a lista 

Em uma lista temos a seguinte estrutura: Falamos que na posição 0 está o item 'Como começar a programar?'. 

E se invertemos esse modelo, isto é, falamos que a palavra é a posição e o item relacionado a essa palavra é uma lista com as posições dos tópicos na lista original? Por exemplo, para a palavra programar temos a uma lista com o item [0]. 

Já para a palavra Java temos uma lista com esses itens [4, 5, 6]. Dessa forma, podemos obter de um modo muito mais rápido os tópicos que estamos procurando, tudo isso utilizando o poder que os hashes dão para gente. Mas teremos que implementar essa função de hash na mão? 

No Python, assim como na maioria das linguagens de programação, existem os dicionários, também conhecidos como mapas ou arrays associativos. **Mapas são estruturas chave e valor**. A **chave** é um item que passou por uma função de hash, logo, só podemos ter uma única ocorrência da chave no mapa. Logo, podemos ter um dicionário onde a chave são as palavras que existem nos tópicos, enquanto o valor seria uma lista com os índices do tópico na lista. No Python, uma das formas de criar o dicionários é dessa forma:

python
Os dicionários também utilizam de chaves ({ }) para serem criados, porém, diferente desses podemos passar as chaves e valores na hora de sua criação. O próximo passo é percorrer os tópicos na lista, como precisamos pegar o índice de cada tópico na lista, podemos utilizar a **função enumerate()**. 

Esta **função construtora** nos devolve um objeto enumerate onde o primeiro elemento é o índice e o segundo o valor, no nosso caso o tópico:

python

Agora, basta percorrermos as palavras do tópico. Para isso, temos que quebrar o texto nos espaços **(split())** e checar se aquela palavra já existe no dicionário, se não existir, adicionamos nessa chave uma lista com o índice, se já existir, apenas acrescentamos à lista o índice do novo tópico:

python

Você pode estar se perguntando, se saímos de um loop para dois, a complexidade do algoritmo não aumentou também? De fato isso ocorreu. No nosso caso, para cada item na lista (N) percorremos suas palavras (N). 

Ou seja, temos O(N * N) de complexidade, ou **O(N^2)**. Neste caso, isso ocorreu pois estamos montando o dicionário. Contudo, nos próximos tópicos, basta pegarmos a posição na lista (índice) que ele foi alocado e iterar sobre suas palavras adicionando elas no dicionário. Com o dicionário agora, podemos fazer uma busca assim:

python

Temos apenas os índices dos tópicos que contém a palavra que buscamos. Basta pegarmos esses índices e buscarmos nos tópicos:

python

Buscando palavras Esse método que utilizamos para buscar as palavras é chamado de **lista invertida, ou lista de index invertido (inverted index)**. Ele é um algoritmo muito utilizado para fazer buscas de palavras, isso porque ele é um algoritmo muito rápido. 

Operação que envolvem dicionários tem **complexidade de O(1)**. Fora isso, quando nos é devolvido uma lista com os índices dos tópicos, sabemos que aquele tópico contém a palavra que buscamos, não é necessário ficar checando palavra por palavra em todos os tópicos. 

Esse algoritmo é muito utilizado em **motores de busca**, como o Google, ou então em ferramentas como o ElasticSearch. Nosso algoritmo no texto ficou bem simples. É possível aplicar transformações nas palavras como: passar todas as palavras para letra maiúscula ou minúscula, tirar acentos, plurais, eliminar palavras comuns, como artigos e pronomes também conhecido como **stopwords** tudo isso a fim de otimizar o algoritmo.

Aqui na Alura temos uma [**formação de aprendizado de máquina**] que mostra como fazer algumas dessas transformações. 





imagem 

As [**práticas de Search Engine Optimization**] (SEO) são fundamentais para dar a uma empresa a devida relevância em ambiente online. Sem elas, é bem possível que, mesmo com um conteúdo interessante, suas páginas acabem se perdendo em meio a tanta informação disponível na rede.

Pense bem: como se diferenciar num meio em que há espaço para todos? Uma alternativa é considerar uma melhor qualificação nas buscas, pois é por meio delas que as pessoas costumam chegar aos seus objetivos online.

É por isso que esse tema precisa ser mais bem compreendido. Na prática, o SEO é o que uma empresa precisa para garantir a adequação aos mecanismos de busca, em especial o Google. Você sabia que ele reúne [mais de 85%] da audiência entre buscadores?

Sendo assim, entenda melhor como o SEO funciona e quais são os pontos fundamentais em relação a essa estratégia!

## Afinal, o que é SEO?

Funciona da seguinte maneira: o Google, o Bing, o Yahoo!, O Duck Duck Go, enfim, todos os mecanismos de busca trabalham com algoritmos, espécies de robozinhos que ficam vasculhando a internet para atribuir notas às páginas visitadas. Essas notas é que darão aos sites o posicionamento nas páginas de resultados das buscas.

Quais são os critérios adotados? [São vários], mas fundamentalmente, eles consideram a relevância do conteúdo para o visitante do site. Sendo assim, tudo o que torna a página ou o conjunto delas pertinente para quem a acessa, é considerado na análise dos algoritmos.

**Search Engine Optimization** (em português, Otimização para Mecanismos de Busca) é um conjunto de técnicas adotadas para melhorar o seu site em função desses critérios utilizados pelos robozinhos. Consequentemente, são métodos que farão com que esse endereço se torne mais relevante para as pessoas e garanta, assim, maior qualidade para o que se publica na rede.

A prática de fazer link building ― um procedimento para incluir links internos (próprios)e externos (de terceiros) para melhorar a reputação e a autoridade de um site ― é tida como uma [**boa estratégia de SEO**]. Ao fazer uso desse recurso, você contribui para fazer com que sua empresa ganhe destaque no ranqueamento desses sites de pesquisa.

É importante lembrar que, como a internet é um meio dinâmico, as empresas estão sempre em busca de aperfeiçoamento. É o caso do Google, que, de tempos em tempos, apresenta atualizações de seus algoritmos.

O **Google Panda**, por exemplo, foi criado com o objetivo de tornar melhor a avaliação a respeito da relevância das páginas. Esse recurso tem sido constantemente atualizado para dar vida ao Panda 1.0, o Panda 3.0 e ao Panda 4.0.

Cada uma dessas atualizações resulta em alterações distintas, visando melhores práticas na rede. Além disso, a empresa apresentou também o Quality Update e o Mobile Update. O importante aqui não é saber exatamente como funciona cada uma dessas atualizações, mas sim que o foco delas está no objetivo final dos mecanismos de busca: tornar a experiência do usuário a melhor possível.

É por isso que o **Mobile Update** surgiu em função da crescente demanda do público por páginas capazes de [**facilitar a navegação em dispositivos móveis**]. Essa é a lógica do SEO e dos mecanismos de busca. Compreender isso é um passo importante para desenvolver uma campanha de sucesso na rede.

## Onde o SEO pode ser utilizado

O SEO pode ser adotado como recurso para atingir diferentes tipos de metas. Algumas situações comuns são:

- em casos de sites que contam a audiência para obter lucros com cliques em anúncios, como portais de notícias que precisam gerar tráfego para tornar mais visível os conteúdos publicitários disponibilizados por seus parceiros;
- quando prestadores de serviços buscam conversões para seus negócios na rede, via formulários, e-mail, entre outros;
- em situações em que e-commerces precisam chamar a atenção para seus produtos (fazendo um trabalho com palavras-chave mais específicas é possível obter maiores chances de conversão);
- no branding, pois o SEO gera um melhor posicionamento da marca e cria autoridade em um determinado assunto, fazendo com que a empresa se torne referência no que faz.

De uma maneira geral, sempre que você precisar tornar seu conteúdo mais visível para as pessoas, aposte no SEO. Como os algoritmos vasculham toda a rede em busca de informações relevantes para os usuários que fazem pesquisas na internet, toda vez que eles chegarem até sua página e identificarem sua relevância, darão a ela notas altas que serão importantes no ranqueamento dos mecanismos de busca.

É isso o que fará sua empresa ocupar o topo das páginas e ganhar credibilidade junto ao público.

Quando um usuário procura por uma informação específica na internet e encontra a solução para o seu problema num determinado site, ele tende a ver esse site de maneira positiva, podendo retornar sempre que for necessário.

Isso garante uma autoridade que a maioria das empresas ainda não tem e que costuma se converter em vendas. Exemplos que comprovam isso não faltam. Quando você precisa de uma solução para sua carreira e percebe que fazer um curso online é a melhor solução, você prefere aprender com um professor conhecido e que tem alunos garantindo a qualidade do ensino ou você aposta em um desconhecido?

Em muitos casos, até mesmo o fator financeiro fica em segundo plano diante da autoridade de uma marca ou serviço. É essa lógica que faz com que empresas consigam passar anos no mercado como “Top of Mind”, ou seja, aquelas que vêm à mente das pessoas logo num primeiro momento. Bombril, Brastemp, Coca Cola, todas elas têm em comum a autoridade no meio em que atuam.

É por isso que é importante saber usar o SEO em função de criar uma presença online positiva para a sua empresa. No meio digital, é isso que pode diferenciar uma marca confiável de outra qualquer.

O SEO pode e deve ser usado em meio digital para tornar sua marca visível, mas além disso, para fazer com que tudo o que diz respeito a ela seja pertinente para as pessoas certas.

## Importância das estratégias de SEO

Para aparecer no topo das pesquisas, sua empresa tem duas opções: a busca patrocinada e a orgânica. A primeira acontece quando você paga para colocar links patrocinados em posições de destaque nas buscas. A segunda acontece naturalmente, quando o link de sua página ganha as primeiras posições por atender aos critérios de ranqueamento dos mecanismos.

Embora seja possível obter bons resultados com a campanha de busca patrocinada, é com a busca orgânica que as pessoas tendem a se relacionar melhor.

Um dos motivos para tanto é que, como os buscadores identificam o conteúdo que é pago, quando o usuário visualiza na página uma fonte orgânica, ele tende a confiar mais na credibilidade do conteúdo. Somente em casos em que não identificou soluções na busca orgânica é que ele vai até os resultados da busca paga.

Isso torna o investimento em SEO ainda mais necessário, pois é ele quem dará à sua empresa condições para apresentar um conteúdo qualificado para a audiência.

Quando você aperfeiçoa o site da sua empresa em função das exigências dos mecanismos como o Google, a tendência é que tenha maiores condições para ocupar o topo das pesquisas.

Esse benefício vai muito além de simplesmente ser o primeiro do ranking. Um bom posicionamento no Google garante que ao menos [**33% do tráfego**] seja seu de imediato, simplesmente por ter uma página que aparece em primeiro lugar para as pessoas.

Isso parece lógico, não? Quantas vezes você acessou o Google para procurar por um assunto em específico e se concentrou somente no primeiro ou nos primeiros resultados para escolher a página para acessar? Quantas vezes continuou a pesquisa até a 10ª, 15ª página?

O fato é que a grande maioria das pessoas instintivamente já confia na qualidade do trabalho dos algoritmos, pois elas sabem que os primeiros endereços que aparecem no ranking tendem a ser os mais relevantes.

Na internet, mais do que ter uma solução interessante para o consumidor, é preciso criar meios para alcançá-lo de maneira eficaz. É nessa lógica que o SEO se apresenta. Um posicionamento adequado nos mecanismos de busca é o que toda empresa precisa para fazer com que os clientes apareçam e as possibilidades de vendas aumentem.

## Benefícios e vantagens

Com o SEO, você consegue aprimorar questões relevantes para os algoritmos dos buscadores. Entre elas, podemos citar:

### A velocidade de carregamento da página

Nenhum visitante ficará esperando por mais tempo pelo carregamento de sua página do que ficaria pelo de uma concorrente, ainda que seu conteúdo seja bom e suas soluções se apresentem como viáveis.

É por isso que a espera para que um site solicitado seja entregue pelo servidor de hospedagem deve ser mínima.

O grande benefício do SEO nesse sentido é fornecer ferramentas para um bom desempenho do site. Diante de um consumidor interessado em fechar negócio, isso é fundamental.

### A navegação no site

O SEO garante também que a navegação seja facilitada para o usuário, o que torna mais fácil seu processo de conversão.

Imagine um site com bons produtos, mas que peque por apresentar uma linguagem exageradamente técnica em sua plataforma. Em muitos casos, isso ocorre sem que os responsáveis percebam, uma vez que a internet abre espaço para diferentes tipos de empreendedores.

Nesse caso, contar com uma estratégia de SEO permite um direcionamento mais adequado de questões como a categorização e o uso da informação, tornando a navegação mais orgânica e intuitiva.

### Taxa de rejeição

A taxa de rejeição é o índice que confere a quantidade de pessoas que saíram de uma página sem interagir com ela, um problema que certamente todo empreendedor precisa evitar.

Garantir que o visitante chegue até sua página e se mantenha nela, de preferência assimilando a informação ali compartilhada, é o que o SEO oferece como benefício.

Dentro de qualquer estratégia de SEO, [**o conteúdo relevante dita as regras**]. De nada adianta você investir em soluções que potencializem a visibilidade de seu site na internet sem oferecer ao público algo que lhe interesse nas pesquisas.

É por isso que trabalhar com foco em SEO permite vantagens também na diminuição da taxa de rejeição. Com ele, você desenvolve conteúdos mais ricos e, assim, mantém o visitante mais tempo envolvido com seu material.

### Meta tags

As meta tags facilitam o trabalho dos algoritmos. Elas são comandos que informam sobre a página em questão. Assim, os algoritmos têm um breve resumo sobre aspectos como o título da página, o que será exibido como resultado das buscas e quais páginas devem ser indexadas.

Esse tipo de recurso, dentro de uma estratégia de SEO, permite uma comunicação mais precisa entre o webmaster e os sites de busca.

Entre as mais importantes [**meta tags**] estão:

- Title: responsável pelo título do documento HTML e é exibida no cabeçalho da página.
- Meta Description: trata-se da descrição do conteúdo que o usuário encontrará ao acessar a página.
- Meta Keywords: responsável por exibir palavras-chave relevantes de acordo com o conteúdo descrito na página.
- Meta Robots: orienta os robôs de busca sobre quais informações e como as páginas devem ou não ser indexadas e utilizadas para encontrar outras páginas.

Quer um exemplo? Sabe aquele texto que o Google utiliza logo abaixo dos resultados da pesquisa e que serve para tornar mais claro o entendimento a respeito da página em questão? Essas são as Meta Descriptions. Não é difícil compreender a importância desse tipo de recurso, não é? Quando ele é bem-feito, a pessoa que faz a pesquisa tem mais motivos para acessar o site, o que contribui para uma taxa de cliques elevada.

As metas tags são ferramentas importantes para ajudar o usuário a encontrar com maior rapidez o conteúdo que procura na internet.

## Mitos sobre SEO

Mas não pense que praticar o SEO é algo fácil. Esse tipo de estratégia exige o devido entendimento de uma série de questões e ferramentas disponíveis em ambiente online. Até mesmo por isso é comum ver erros recorrentes que têm a ver com verdadeiros mitos criados a respeito desse tema. Saiba mais sobre eles.

### Resultados sempre aparecem no curto prazo

Na grande maioria das vezes, para que a campanha seja bem-sucedida é preciso tempo.

Quando você trabalha com palavras-chave menores, as chamadas caudas curtas, tem que disputar espaço na rede com outras empresas que também investem em SEO. Sendo assim, para que o seu trabalho apresente resultados, é natural que demore um certo tempo, pois somente assim você conseguirá se mostrar mais relevante.

Isso não significa que você não conseguirá bons resultados no curto prazo. Ao investir em palavras-chave de cauda longa, sua empresa consegue especificar o tema e, assim, diminui a concorrência ao segmentar a mensagem.

Em termos práticos, a palavra “carro” é de cauda curta e menos específica do que “carro popular nacional”, uma palavra-chave cauda longa que atinge um segmento muito mais direcionado de mercado.

### Ao chegar no topo, a empresa permanecerá nele

O tópico anterior já explica o por que isso não ocorre. É preciso uma atualização constante do conteúdo para que ele se mantenha relevante e esteja sempre ocupando as primeiras colocações na pesquisa. Se ao chegar até o seu objetivo você simplesmente abandonar o site, ele certamente ficará para trás em pouco tempo.

Se seus concorrentes investem em SEO, eles certamente não sossegarão enquanto não aperfeiçoarem seu conteúdo para torná-lo mais bem ranqueado.

Esse é um benefício importante desse sistema para o usuário. Se todos os envolvidos com determinada palavra-chave levarem a sério a busca pelas primeiras posições, naturalmente é o público quem terá o melhor conteúdo para obter informações.

Por isso, não deixe de manter seu conteúdo atualizado, mesmo depois de chegar ao topo.

### Palavras-chave não são tão essenciais

É um erro básico acreditar que somente o conteúdo bem desenvolvido pode atribuir à empresa o posicionamento ideal nas pesquisas. As palavras-chave são a melhor ferramenta que os mecanismos de busca têm para identificar determinado site como relevante para os interesses do usuário que faz as pesquisas.

Com o Google Hummingbird, outra [**atualização dos algoritmos da empresa**], esse processo tornou-se ainda mais sofisticado. Agora o sistema consegue associar palavras diferentes, mas que dizem respeito ao mesmo tema. Palavras como futsal, por exemplo, já oferecem resultados para quem busca por termos similares como “futebol de salão”.

Toda essa sofisticação ainda depende de um direcionamento que o trabalho correto com palavras-chave permite oferecer.

### Quanto mais links, melhor

O trabalho com **links internos e externos (link building)** é um dos critérios utilizados por algoritmos dos sites de busca. Entretanto, é preciso garantir que esse trabalho seja feito de maneira correta, ou seja, com qualidade.

Links que procuram explicar cada passagem do texto e direcionam para assuntos que em nada acrescentam ao conhecimento do usuário, costumam ser punidos por esses sites. É bom lembrar que essas ferramentas de pesquisa estão cada vez mais sofisticadas e as empresas têm investido pesado em soluções contra tentativas de burlar as regras.

Nesse caso, evite ser penalizado. Use links que sejam, de fato, relevantes para o conteúdo que deseja publicar e evite exageros.

## Boas práticas de SEO

Para ter um bom trabalho de SEO é preciso estruturar sua campanha. Sem uma boa estratégia, todo conteúdo produzido trará resultados aleatórios, sendo pouco viáveis para o sucesso da empresa em ambiente online.

Sendo assim, o ideal é que você comece analisando sua concorrência. Considere o trabalho com a **análise SWOT** para identificar o patamar em que sua empresa se encontra em comparação com as demais. Identificando pontos fortes, fracos, oportunidades e ameaças, você consegue ter um parâmetro para desenvolver sua campanha.

Feito isso, uma boa maneira para começar a trabalhar com SEO é definindo a persona para quem sua empresa direcionará sua comunicação. Lembre-se sempre de apresentar sua mensagem na internet com o foco em solucionar os problemas das pessoas. A estratégia de SEO depende da identificação do seu público ideal para, somente então, tornar-se eficiente.

Depois dessa etapa definida, parta para a prática, otimizando seu conteúdo. Comece com o título. É por meio dele que o seu conteúdo passa a ter maiores condições para se destacar diante da concorrência. Ele é o primeiro contato do leitor com o seu material, portanto, quando não está otimizado, tende a ser menos relevante.

Ter exclusividade, impacto, ser curto e [**apresentar a palavra-chave**], são fatores essenciais para a construção de um bom título, otimizado em SEO.

Da mesma forma, é preciso facilitar a leitura de quem acessa o seu site. Trabalhe com tópicos e subtópicos. Isso, além de tornar a experiência de quem lê o seu texto mais agradável, também facilita a compreensão dos algoritmos a respeito do que é mais relevante no seu conteúdo.

[**Pense também nas imagens**]. Como a lógica dos algoritmos está cada vez mais centrada na melhor experiência possível do usuário, criar textos com conteúdos visuais de qualidade também é uma boa prática de SEO.

Cabe, então, a dica: mostre para os robozinhos que a imagem trabalhada tem tudo a ver com o tema. Transcreva vídeos e infográficos e use palavras-chave, tomando cuidado para não sobrecarregar a página com um arquivo muito pesado. Evite tornar seu site lento para também não ser penalizado por isso.

Otimize suas URL’s, inserindo sua palavra-chave nelas. Essa é uma ação que permite deixar a URL amigável, algo determinante para um bom posicionamento nos mecanismos de busca.

Você tem muito mais chances de receber o clique em páginas que esclareçam o visitante a respeito de seu conteúdo do que usando nomes aleatórios. Onde você clicaria com maior facilidade: em um link com a informação precisa sobre o site e a página em questão (www.dicasdeseo.com.br/palavras-chave) ou num conjunto de letras e números sem o menor sentido (www.dicasdeseo.com/2r996y356g04)?

Evite problemas como URL’s longas, concentrando-se em, no máximo, 5 palavras. Se precisar separar algumas delas, utilize o hífen e não use letras maiúsculas ou acentos. Pode não parecer, mas tudo isso contribui e muito para o sucesso do seu conteúdo em ambiente online.

Enfim, com o aperfeiçoamento cada vez mais rápido de procedimentos usados no mundo digital e o surgimento constante de inovações, é preciso ter ao seu dispor recursos que garantam a visibilidade necessária no meio digital.

Sendo assim, é importante destacar que,se existe uma maneira racional de atuar nesse meio e obter benefícios testados e aprovados por especialistas,essa, sem dúvida, é pelas técnicas de SEO.

Por meio delas, você estrutura sua página de maneira relevante para os interesses do seu público, ao mesmo tempo em que a torna mais assimilável para os sistemas que estão o tempo todo trabalhando em busca de sinais de otimização. Na prática, são duas coisas que se complementam.

Passe a enxergar as práticas de SEO dessa maneira e comece a obter resultados mais significativos para sua empresa em ambiente online.




Não tem ideia de como classificar cada uma dessas categorias de desenvolvedores? Aparentemente é algo bem abstrato e difícil de classificar, certo?

imagem 

Aproveitando a dúvida do nosso aluno e considerando que essa é uma dúvida que atinge muitas pessoas, resolvi gravar um vídeo para compartilhar o meu ponto de vista sobre o assunto, é claro, visando também o que muitas pessoas costumam definir o que é senioridade em suas respectivas áreas.

Ficou curioso? Então assista o vídeo abaixo:

https://www.youtube.com/watch?v=ezrojsKj4Nw

O mais legal é que é extremamente possível se tornar um desenvolvedor senior. Basta ir atrás de conteúdo e praticar bastante. Para você que está estudando Java e quer ir além do básico, temos uma [**formação em Java**], interessantíssimas para quem quer se tornar senior. O mesmo vale para o desenvolvedor front-end que pode [aprender diversos assuntos essenciais para se tornar senior].

Nos cursos presenciais da Caelum há diversos cursos avançados onde também é possível ter o conhecimento necessário para se tornar um desenvolvedor senior. Eu particularmente [recomendo a formação Java EE] e o [curso de AngularJS para webapps].

O que achou sobre os pontos levantados para cada uma das categorias de profissionais? Compartilhe com o seus amigos e veja também o que eles acham a respeito! :)






imagem 

**Você cursa Design e é um dos milhões de jovens brasileiros que estão procurando o primeiro emprego?** Quer aprender mais sobre ferramentas que possam ajudar a melhorar seu portfólio, a fim de ficar mais capacitado para o mercado de trabalho? Então, bingo! Este post tem tudo a ver com você!

Se você não sabe o que é mockup, vamos explicar: em português, essa palavra significa maquete ou modelo, e serve como molde para a aplicação de uma imagem, em bitmap ou vetor. Assim, você pode tornar suas criações muito mais realistas. E, claro, montar um portfólio mais profissional.

Os mockups também podem fazer a diferença na criação de inúmeros projetos, como design de logotipos, cartazes, revistas, camisetas, bonés e tudo o que você imaginar. Gostou? Então, confira esta incrível seleção de sites de mockup que preparamos para você!

## Como funciona um mockup

Há alguns anos, para se testar um produto, era necessário construir um protótipo físico, com todos os detalhes definidos no projeto. Com o surgimento dessa poderosa ferramenta, porém, esse cenário mudou.

O mockup possibilita que o projeto seja visualizado minuciosamente, em um ambiente virtual, em 3 dimensões, com todos os seus detalhes. Isso torna a apresentação realista e conclusiva, viabilizando os possíveis ajustes, antes do início da produção.

## AlienValley

O [**AlienValley**][ ]tem mockups de alta qualidade, em arquivos PSD. Além disso, você pode baixar muitos recursos de design e gráficos para seus projetos. Para receber os links de download, é preciso inserir seu e-mail.

Alguns conteúdos são gratuitos e outros pagos. De vez em quando, surgem pacotes com ótimos descontos. Algumas ofertas são temporárias e outras permanentes. Se, por qualquer motivo, você não estiver satisfeito com os produtos, pode pedir um reembolso no prazo máximo de duas semanas após a compra.

## Canva

Esse [site] é norte-americano, mas tem versão oficial em português. Oferece uma grande coleção de mockups e muitos outros recursos, como fontes, fotos, ilustrações, paletas de cores e templates.

Você pode testar os serviços gratuitamente, por 30 dias, e cancelar seu período de teste a qualquer momento, sem ser cobrado por isso. O plano custa US$ 12,95 por mês.

## Dunnnk

O [**Dunnnk**][ ](se escreve assim mesmo, com três “Ns”) também disponibiliza conteúdo gratuito, e é muito simples e funcional. Com poucos cliques, gera o mockup final.

Se preferir, você pode comprar a imagem original em PSD, para modificar seu projeto do jeito que quiser. Há uma grande variedade de mockups de relógios, smartphones, tablets e computadores, entre outros dispositivos.

## Freepik

Além de mockups, esse [site] oferece recursos gráficos de alta qualidade, como arquivos PSD, fotos, ícones, ilustrações exclusivas e vetores, entre muitos outros, em uma única plataforma. Pode ser testado gratuitamente durante sete dias.

Ele tem um modelo de negócios chamado freemium, em que a maioria dos recursos oferecidos pode ser usada de graça. Por US$ 9,99 mensais, porém, você pode se inscrever no plano premium e ter acesso a milhares de arquivos.

## GraphicBurger

O [**GraphicBurger**] tem muitos recursos de alta qualidade. Além de mockups, você também pode baixar arquivos em PSD, efeitos em texto, ícones e texturas, entre muitos outros itens legais.

Quer ver como fica um logotipo aplicado em [couro]? É agora! O arquivo deve ser editado no Photoshop e seu tamanho é de 6,7 MB.

## GraphicsFuel

Com recursos gratuitos e pagos, esse [site] oferece mais de 25 milhões de opções de design. Além de mockups, tem arquivos PSD, efeitos de texto, fontes, fotos, fundos, gráficos, ícones, kits UI, texturas e vetores, entre muitas outras opções.

Com um dos [**mockups**] oferecidos pelo site, por exemplo, é possível aplicar seu logotipo sobre uma imagem realista de tecido. Assim, fica sabendo se ele funciona em produtos com textura similar. O arquivo, editável no Photoshop, tem 55,3 MB.

## Pixeden

No [**Pixeden**], você vai encontrar mockups para cartões de visita, flyers, folders, livros e muitos outros produtos. Além disso, tem efeitos de texto, ícones, texturas, vetores e muito mais.

Você pode baixar vários arquivos gratuitos, nos formatos JPG e PSD, prontos para usar. Ter acesso aos serviços premium e todo o conteúdo do site custa a partir de US$ 6 por mês.

## Placeit

Muito fácil de usar, esse [site] oferece mockups instantâneos, de smartphones, tablets e TVs, que dispensam o uso do Photoshop. Basta fazer o upload da sua criação. O conteúdo gratuito oferece uma pequena quantidade de imagens.

Para usar todo o conteúdo, com uma enorme quantidade de modelos, você precisa pagar. A assinatura básica custa US$ 29 por mês, com direito a nove imagens de alta resolução.

## Pixelbbudha

O [**Pixelbbudha**][ ]disponibiliza gratuitamente muitos mockups para camisetas, flyers, folders, logotipo e smartphones, entre outros produtos. Além disso, tem efeitos de texto, fontes, fotos, fundos, ícones, kits UI, texturas e vetores.

Todos os arquivos, em PSD, podem ser usados de um jeito simples e fácil. Para usar todo o conteúdo, com uma enorme quantidade de modelos, você precisa pagar o preço de cada peça.

## Sketch App Sources

Esse [site] disponibiliza, gratuitamente, mockups de smartphones, tablets, TVs e muitos outros produtos. Além disso, tem ícones, kits UI, kits wireframe, plugins, tutoriais e muitos outros recursos de design.

Para usar todo o conteúdo, você precisa pagar o valor de cada arquivo. Eles foram criados por usuários de todo o mundo. É uma boa maneira de, além de aprender novas técnicas, conhecer o trabalho de outros [**designers**].

## Vectorilla

Além de mockups, no [**Vectorilla**], você vai encontrar fontes, ícones de vetores e PNG, papéis de parede e muitos outros recursos de design. Nele, é possível visualizar como o logotipo que você criou vai ficar em uma textura de [madeira]. O arquivo deve ser editado no Photoshop e seu tamanho é de 12,4 MB.

É fundamental que você se [**mantenha sempre atualizado**], para se tornar mais competitivo e desenvolver sua carreira profissional. 

E aí, gostou dessas dicas sobre sites de mockup? Então, que tal compartilhar este post com seus contatos nas redes sociais e espalhar essas informações?




Markdown é um formato de simples de  **markup**, isso é, de marcação de texto. A ideia é marcar um texto informando o que é importante, o que é um tópico, o que são links e imagens, sem a necessidade de utilizar marcações mais complexas, como o HTML.

É um formato bastante trivial. Por exemplo, se você escreve uma palavra entre astericos, ela aparecerá de forma mais enfática, normalmente em negrito:

```
Nosso **primeiro exemplo** de trecho de texto em markdown.
```

Após passar por um processador de markdown, o resultado pode ser o seguinte:

> Nosso **primeiro exemplo** de trecho de texto em markdown.

Você também pode linkar para outras páginas com uma sintaxe relativamente simples:

```
> Aqui tem uma [página com os códigos mais frequentes] do Markdown
```

que fica assim:

> Aqui tem uma [página com os códigos mais frequentes] do Markdown

Apesar de criado por pessoas que trabalham com programação, o markdown hoje aparece de inúmeras formas e em vários lugares. O [**fórum da alura**] usa Markdown para você pode criar perguntas e estruturá-las de maneira melhor.

# Editando e visualizando um arquivo markdown

Há varias formas de você testar seu markdown, dependendo da sua necessidade:

## Usando um editor na web

Existem vários **editores** web que você pode utilizar para testaar nesse mesmo instante o markdown, sem necessidade de instalações:

- [Dillinger]
- [Markdown Preview]
- [MEditor]

## Usando um editor de código

A maioria dos editores de código fornecem maneiras de editar um markdown e visualizar seu conteúdo lado a lado. Recomendo o VS Code, que pode ser baixado e instalado aqui.

Há uma (documentação)[https://code.visualstudio.com/docs/languages/markdown] sobre o Markdown no VS Code e você pode ter uma ideia do funcionamento na animação abaixo:


imagem








Hoje em dia você encontra muitos sites pela internet, mas você ficaria surpreso se eu te dissesse que ainda existem empresas que não têm um. Nesse artigo irei te mostrar se você precisa de um site ou não e o que ele tem que ter para atingir seus objetivos.

## Mas, pra que serve um site?

Primeiro você deve esquecer que precisa de um só porque todo mundo tem, porque não é verdade. É preciso pensar no objetivo dele e no motivo para investir no seu desenvolvimento. Pra mim, investir no progresso do site gerando mais negócios para empresa é o principal.

Na maior parte das empresas, a busca é pelo crescimento, venda, divulgação para mais pessoas mais vezes e pelo valor mais alto. Se esse é o caso da sua empresa, o investimento no desenvolvimento de um site é necessário. Mas preste atenção: **não é qualquer site que vende não**.

A maioria não vende nada porque as empresas escolhem qualquer um pra jogar um panfleto online, o que só trará custos e não será um investimento. O site que gera negócio é o site com um bom investimento e que gera [**ROI**].

## Definindo seu objetivo com S.M.A.R.T.

Tem uma técnica para a definição de objetivos que é muito fácil de fazer e muito útil, chamada S.M.A.R.T. São cinco passos/itens para delimitar um objetivo. Cada um deles é um critério que deve ter o seu objetivo:

- **_Specific_** (específico): definir um objetivo específico para seu projeto, como, por exemplo, “criar um novo canal online para geração de vendas”;
- **_Measurable_** (mensurável): criar um novo canal para geração de vendas não é mensurável, por isso podemos adicionar “que gere R$100.000 em faturamento”;
- **_Attainable_** (atingível): depois de definir os dois pontos acima, é preciso avaliar se o seu objetivo será atingível;
- **_Realistic_** (realista): assim, como o ponto anterior, seu objetivo precisa ser realista também. Os dois pontos variam de projeto para projeto, mas você precisa estar confiante de que eles irão dar certo;
- **_Time Bound_** (temporizável): em quanto tempo você quer atingir esse objetivo. Também é variável para cada projeto;

Resumindo, nosso objetivo poderia ser “criar um novo canal online para geração de vendas que alcance R$100.000 de faturamento em 6 meses com um gasto máximo de R$ 10.000”. Aí chegamos em um ponto bem variável:

> Quanto se deve gastar com um site e em qual tipo de site?

O custo vai depender especialmente do nível de complexidade da tecnologia. Quando o site for básico, tipo o próprio site da [V4 Company], ele é capaz de gerar bastante receita para vários tipos de negócio. Nesse caso, o custo é bem baixo e dá pra investir pouco para se concentrar no investimento de [tráfego] para gerar vendas.

## Mas quanto devo investir em meu site?

Caso você prefira investir no desenvolvimento, eu indico que seja no máximo até R$ 2.000 com uma mensalidade de R$ 300 para manter suas lead pages no ar.

Caso você escolha inovar, por exemplo, inserindo uma ferramenta com função de colorir paredes automaticamente quando o cliente insere uma imagem em um site de tintas. Como o nível de complexidade é maior, implicará custos mais elevados.

Por isso, indicamos que, antes de tomar essa decisão, você pense se essa ferramenta irá trazer retorno para o seu negócio. O único segmento que na maioria das vezes um layout simples não funciona é o varejo, o qual quase sempre necessita de um e-commerce.

Para esse tipo de site, o primeiro ponto que você precisa saber é que você precisa ter um [ERP] para ter o controle do seu estoque centralizado em um software de gestão que seja sincronizado ao seu e-commerce.

O erro mais clássico é criar um estoque separado para vender online quando, na verdade, o objetivo do e-commerce é colocar o que está parado em estoque disponível online.

## Considerações para o desenvolvimento de um e-commerce

Na hora de contratar alguém para desenvolver o seu e-commerce, escolha uma empresa que seja focada no desenvolvimento do e-commerce e não uma que também faz e-commerce, pois esse tipo de site é complexo e exige foco.

Nós da V4 indicamos e trabalhamos com a [Moovin] que, além de ser bastante eficiente, tem alguns pontos fundamentais:

- **SEO**: quando a plataforma é otimizada para os mecanismos de busca orgânica. Isso significa que ela irá facilitar que seu site ganhe relevância nos mecanismos de busca.
- **Integração com ERP**: possibilita integrar o seu site com o sistema de gestão que você utiliza.
- **Versão Mobile**: o seu site terá uma versão especialmente desenvolvida para dispositivos móveis, facilitando a usabilidade do usuário e gerando mais vendas.
- **Integração com Marketplaces**: espécie de shopping online onde se vende produtos de outras lojas e a sua pode vender também.

Os custos de tudo isso vão desde o ERP, implementação da plataforma e da mensalidade que normalmente é um mínimo mais uma porcentagem sobre as vendas. Normalmente esse custo é de 2 até 3% do faturamento da sua loja. Após essas decisões, você vai se deparar com a seguinte pergunta:

> O que um site tem que ter?

Vou enfatizar algumas coisas fundamentais para qualquer projeto de desenvolvimento de um site:

- **Tráfego**: como você levará acessos para o seu site. Há duas formas, orgânica e paga. A orgânica é a posição que o seu site fica nos mecanismos de busca. A paga é ao investir em mídias digitais.
- **Engajamento**: como você envolverá as pessoas com a sua empresa. Aqui você deverá levar em conta a filosofia “não me faça pensar” na qual o usuário não pode pensar muito para agir dentro do site.
- **Conversão**: como você irá fazer vendas. A forma mais óbvia é vendendo online ou pela captação de Leads (oportunidade de negócio, o contato do usuário).
- **Retenção**: como você irá manter os acessos recorrentes, valorizando e desenvolvendo estratégias para trazer o usuário novamente em outro momento.

Como mencionei as plataformas mais acima, já deixo a minha indicação: o [WordPress]. É a plataforma de gestão de conteúdo mais utilizada no mundo. Além de ter um custo de desenvolvimento super baixo, ele tem uma excelente estrutura que atende todos os requisitos do Google para ficar bem posicionado no mecanismo de busca.

**DICA**: Caso você queira saber mais sobre Wordpress e outras plataformas, indico escutar os episódios do [**NerdTech**], que é uma parceria entre a Alura e o Jovem Nerd, uma maneira fácil e divertida para se aprender esse assuntos complexos.

Depois de desenvolver o site, a mensuração dos resultados é importante. O Google Analytics dará essas informações, basta instalá-lo. Com elas você saberá o fluxo de pessoas e como elas estão, e o que é preciso ser feito para aprimorar ainda mais.

Por exemplo: se seu site tem um bom número de acessos e você não está gerando leads interessados, concluímos que o seu acesso ou é desqualificado ou sua usabilidade está ruim, não está levando o usuário para tomar a ação que você quer.

A conclusão que eu deixo pra você é que, depois de ler esse artigo, você saberá tudo o que é crucial antes de fechar o investimento no desenvolvimento do site.

Sei que agora você está preparado para tomar essas decisões com mais segurança. Caso ainda reste alguma dúvida, entre em contato pelos comentários ou com a V4 [nesta página].




Pouco após entrar na faculdade, começamos a mexer com Java nas aulas de lógica de programação. Até então, nunca tinha tido nenhum contato com a linguagem, apenas ouvido falar sobre. Depois de um mês vendo lógica vi que gostava da linguagem e queria me aprofundar quero me tornar um desenvolvedor Java, mas por onde começar?

## Começando com a base

Apesar das linguagens de programação serem parecidas, todas elas têm suas peculiaridades, Java não é diferente. Por isso, comecei estudando o [básico da linguagem, conhecendo as estruturas condicionais e de loops].

Além disso, estudar [orientação a objetos] e aprender conceitos como [herança, polimorfismo e composição], ajudam bastante no dia a dia. Esses são os conceitos básicos. Mas como já foi dito, cada linguagem é única.

Logo, o próximo passo é conhecer as particularidades da linguagem. Aprender sobre [como funcionam as String], as [funcionalidades de entrada e saída de dados], as [coleções, como listas, mapas e conjuntos], além de [aprender sobre as novidades da linguagem] é algo de muito valor, já que agrega muito no desenvolvimento.

Legal! Com isso temos uma forte base na linguagem Java, mas será que isso é suficiente para entrar no mercado? Em muitos casos sim, principalmente quando estamos procurando estágios. Porém, se estamos almejando um cargo como júnior, é interessante conhecer mais sobre outros locais do uso da linguagem.

## Começando no mundo web

Hoje em dia, muitos serviços funcionam na internet. A web está em muitos lugares, por isso, conhecer esse mundo é importante para quem pensa em ingressar no mercado de trabalho. Logo, se vamos utilizar Java para a web, precisamos conhecer o que a linguagem nos oferece para tal.

E, no Java, a [base para aplicações web é conhecida como Servlets]. Entender o ciclo da web e como as Servlets trabalham com ele é um passo muito importante.

Praticamente tudo que funciona no mundo Java para web, roda em cima de uma Servlet. Utilizando apenas Servlets, já conseguimos escrever sistemas que podem ser acessados de um navegador, [criar páginas dinâmicas além de muitas outras coisas].

Além da web, é muito comum que no dia a dia salvar informações como dados de usuários, informações de acesso, entre muitos outros. Portanto, precisamos de um banco de dados para armazenar as informações. Mas como podemos realizar a comunicação do banco de dados com o Java?

## Se comunicando com um banco de dados

As Servlets são uma especificação. Isto é, elas definem um contrato de como uma aplicação que usa Java na web deve funcionar. De uma forma análoga as Servlets, temos uma especificação que é utilizada para realizar a comunicação com bancos de dados, a JPA.

Uma especificação é um contrato. Por isso, precisamos de alguma coisa que coloque o que está neste contrato em prática, ou seja, o implemente.

No caso da [JPA, a implementação mais utilizadas é o Hibernate]. Logo, estudar Hibernate como a implementação da JPA é algo muito valioso para quem quer entrar no mercado. Essas tecnologias são, praticamente, o padrão que a indústria usa no dia a dia quando falamos do mundo Java.

Geralmente, um dos maiores gargalos de uma aplicação é na comunicação como banco de dados.

Logo, conhecer bem o [Hibernate e a JPA para realizar otimizações] é algo bem valioso, principalmente, quando pensamos em performance da aplicação. Bacana! Já conhecemos Hibernate, Servlets, sabemos muitas coisas sobre a linguagem Java.

Conseguimos escrever aplicações bem legais já com essas tecnologias, mas precisa ser tão trabalhoso? Quando trabalhamos com Servlets puras, realmente é um pouco trabalhoso criar e manter a aplicação.

Claro que pode acontecer de encontrarmos aplicações assim no dia a dia, as chamadas aplicações legado. Mas, no dia a dia, não costumamos trabalhar com Servlets puras.

Utilizamos algo que se comunica com a Servlet, dessa forma, não precisamos trabalhar diretamente com o código da Servlet, mas ainda utilizamos de seu poder. Mas como podemos trabalhar com Servlets, sem escrever Servlets?

## Conhecendo o Spring Framework

Escrever código de Servlets é algo comum a muitas aplicações. E, como é algo trabalhoso, foi criada ferramentas para melhorar esse processo. Uma dessas ferramentas é o [Spring]. Um conjunto de códigos e projetos, que chamamos de framework, que nos auxiliam no dia a dia do desenvolvimento.

O Spring é um framework muito robusto e utilizado por grandes empresas e tecnologia, como a Netflix. Com ele, conseguimos agilizar muito no processo de escrita e códigos Java. Vimos que para desenvolver em Java, seguimos um passo a passo, mas quando estudamos, as vezes, sentimos falta da prática. Por isso, aqui na Alura, [pensamos em criar as formações].

## Conhecendo a Formação Java

Uma formação nada mais é do que uma trilha de cursos onde podemos nos tornar proficiente em uma tecnologia. No caso, criamos a **[Formação Java]**. Nela, você começará desde o básico com Java.

Conhecendo a linguagem, conhecendo a orientação a objetos, as APIs mais comuns, além de começar com o mundo web, passando por Servlets e Spring, e no mundo de persistência de dados com JPA e Hibernate.

[A formação não é formada apenas por cursos, mas sim por diversos outros conteúdos, como podcasts, posts e lives]. 

Cada conteúdo tem uma parte no aprendizado e eles vão se complementando e integrando conforme avançamos na formação. Ao final da formação, você realizará um projeto.

Isto é, irá colocar em prática tudo que aprendeu nos cursos que estudou. Esse projeto será revisado por um instrutor ou instrutora aqui da Alura que te passará um feedback sobre o código que escreveu.




A **retenção de colaboradores** pode ser definida como os métodos adotados pelas empresas para manter seus colaboradores por mais tempo na corporação. 

O mundo não é mais o mesmo, as relações interpessoais mudaram ao longo dos anos, e com o mundo corporativo não seria diferente. Atualmente, **apenas oferecer um bom salário não faz com que os funcionários queiram continuar na mesma instituição**.

Reter e manter motivadas as pessoas que trabalham nas empresas são desafios diários Apesar de ser trabalhoso, os resultados dessa retenção são: maior engajamento e comprometimento, o que aumenta os resultados da empresa. 

Além disso, gera sentimentos como o desejo de **crescer juntamente à organização**, pois os(as) colaboradores(as) encontram nos propósitos e objetivos da empresa algo em comum com suas razões e motivações pessoais.

Para os funcionários e funcionárias, **atualmente, não basta apenas fazer o que foi solicitado por seus gestores, e sim, encontrar razão naquilo, saber o porquê estão fazendo e conhecer o processo por trás daquele projeto**.

# Como fazê-la ?

Há muitas estratégias alinhadas ao fator financeiro **que auxiliam na retenção desses talentos**, dentre elas estão:

**Investimento em um processo seletivo mais criterioso:** a **atração de talentos é o primeiro passo para retenção**. Quando o funcionário vive experiências marcantes na empresa, quer permanecer nela. Para isso, quando as empresas investem em recrutar e selecionar os melhores colaboradores, sabem exatamente o que esperar, como agir e quais os anseios das pessoas que farão parte da corporação;

**Criação de um bom clima organizacional:** fazer com que o espaço seja colaborativo, com possibilidade de aprendizado constante. É muito importante que o time não esteja estagnado, mas que aprenda mais a cada dia;

**Investimento no plano de carreira:** muitas pessoas sentem-se engajadas quando tem uma ideia clara de plano de carreira, pois sabem exatamente por quais caminhos podem seguir dentro da empresa, seja em sua área de atuação inicial ou não;

**Feedbacks contínuos:** reconhecer os pontos positivos e ajustar pontos de atenção é muito importante, pois traz alinhamento com expectativas e necessidades da empresa e pessoas que trabalham nela;

**Flexibilização de horário:** muitas pessoas buscam por empresas que ofereçam jornadas flexíveis, e sentem-se ainda mais atraídas por essa corporação. Essa flexibilização cria um sentimento de colaboração e confiança entre o funcionário e a empresa, melhorando os resultados. Aqui na Alura procuramos flexibilizar os horários dos colaboradores e percebemos através de feedbacks e entregas que isso é um diferencial atrativo para reter nossos colaboradores e colaboradoras.


# Adaptando as estratégias à realidade da sua empresa 

Como vimos neste artigo, **a retenção de talentos** é muito importante para a empresa, pois alinha valores pessoais aos corporativos e faz com que o time se sinta ainda mais engajado, gerando melhores resultados.

Trouxemos algumas estratégias que, alinhadas, podem ajudar o time a criar um **desejo de permanência na empresa**. Mas, é importante ressaltar que essas estratégias devem ser alinhadas à realidade de cada corporação.

Por isso, é muito importante que, tanto os gestores quanto os colaboradores, **conheçam a empresa**, isso ajudará na aplicação desses métodos, tornando-os cada vez mais assertivos.


# Conheça nossos planos corporativos

Aqui na **Alura** temos [**planos corporativos**] que podem auxiliar a **traçar estratégias para atrair cada vez mais funcionários em sua empresa**. Além disso, é possível **extrair relatórios individuais sobre seu time** e **acompanhar seu desenvolvimento de perto**. 





Estava fazendo uma análise das notas dos alunos. Queremos ver como a abordagem de ensino está influenciando as notas dos alunos. Portanto, vamos analisar as notas de antes e depois da mudança.

Para fazer essa análise, vamos analisar as notas de uma turma com 21 alunos.

js
O quão bem foi a turma? Isto é, qual a média de notas da turma?

Podemos tirar uma média aritmética simples. Ou seja, somar todas as notas e dividir pelo número de alunos. Logo teremos:

js
O resultado desse cálculo é `11.51`, aproximadamente. As notas são de `0` a `10`, então, por que nossa média é `11`?

## Entendendo a média

A **média** é influenciada por todos os valores da amostra. Ou seja, se tivermos valores muito discrepantes, o valor da média é alterado.

Por exemplo, na nossa amostra de notas, temos uma nota com o valor `100.0`. Por isso a média está com um valor não tão usual. Esses valores muito discrepantes, tanto maiores quanto menores, são conhecidos como **outliers**.

Existem muitas maneiras de tratar **_outliers_**. Uma delas é remover o _outlier_. Em amostras com um grande número de dados isso não tem tantos problemas, já em uma amostra com pouco dados, como a nossa, retirar um outlier pode causar muito impacto. Então como podemos resolver esse problema?

Uma forma é checar se aquele dado da amostra está correto. Outra forma é substituir esse valor pelo valor que mais se repete na amostra, ou então pelo valor da mediana. Mas o que é a mediana?

## Conhecendo a mediana

A mediana é o valor que está no meio da amostra. Ou seja, ela divide a amostra em duas partes, onde metade está acima e metade abaixo. De que forma podemos calcular a mediana?

Uma forma de calcular a mediana é ordenando todos os nossos dados:

js

Agora que ordenamos os dados, precisamos saber qual o dado que está no meio da nossa amostra. Isto é, no nossa caso temos `21` elementos na amostra. Como é um número ímpar, basta somar `1` a este valor e dividir por `2`.

Logo, temos a fórmula `(numero_de_elementos + 1) / 2`. Fazendo a conta, veremos que o valor do resultado é `11`. Portanto, o nosso elemento mediano está na posição número `11`.

```
---------------------
|Posição | Elemento |
|-------------------|
|1       | 2.9      | 
|-------------------|
|2       | 3.0      |
|-------------------|
|.       | .        |
|.       | .        |
|.       | .        |
|-------------------|
|11      | 7.1      |
---------------------
```

A nossa nota mediana é `7.1`. Isso significa que metade dos nossos dados estão abaixo de `7.1` e metade dos dados estão acima.

Agora que temos a mediana, podemos substituir o _outlier_ com o seu valor. Quando substituirmos e calcularmos a nova média, veremos que seu valor mudou para `7.09`. E, calculando a mediana novamente, ela se mantém em `7.1`, **mas isso não é uma regra**.

A mediana é o elemento do meio. Ela divide nossos dados em duas partes. No nosso caso, nossa amostra contém um conjunto de dados com um valor ímpar. Mas e se tivéssemos um valor par? Como é calculada a mediana nesse caso?

### Amostra com valores pares

Para uma amostra com um número par de valores, temos que realizar um passo parecido, porém, ao invés de pegar o valor central, pegamos os dois valores que estão no centro. Então nossa amostra terá duas medianas?

Com esses dois valores nós podemos calcular sua média. Essa média dos valores centrais é a **mediana** da amostra.

Por exemplo, vamos imaginar que temos a seguinte amostra; `1, 2, 5, 7, 9, 11`. Precisamos dos dois valores centrais. Para isso, podemos utilizar a fórmula `numero_de_elementos / 2` e `(numero_de_elementos / 2) + 1`.

Ou seja, temos seis elementos. Logo, as fórmulas ficam `6 / 2` e `(6 / 2) + 1`. Com isso temos como resultado `3` e `4`. Portanto, os nossos elementos centrais são o terceiro (`5`) e quarto (`7`) elemento.

Realizando o cálculo de média entre eles, obteremos o valor de `6`. Ou seja, nessa amostra nossa mediana vale `6`.

## Para saber mais

Além da média aritmética que realizamos, existem outras médias. Como, por exemplo, as **médias geométrica e harmônica**.

Basicamente, a média geométrica vai medir a proporção média de um elemento em relação ao outro. Já a média harmônica mede a razão entre os elementos.

Pelo fato da média ser muito influenciada por _outliers_, geralmente é comum utilizar a mediana para fazer comparações entre amostras.

Além da média e da mediana, temos também a **moda**. A moda é o valor que mais se repete na amostra. Podemos ter distribuições com um valor modal (unimodal), dois valores (bimodal) e com muitos valores (polimodal). Há também a [média ponderada].

Média, mediana e moda são medidas estatísticas muito utilizadas quando estamos fazendo análise de dados. Aqui na Alura temos uma [formação de data science]. Nela você verá muitas medidas estatísticas e aprenderá a utilizá-las para analisar seus dados.

Além disso, verá também formas de visualizar seus dados. Como usar o `R` para realizar trabalhos estatísticos e muito mais!





imagem 

Quando começamos a lidar com desenvolvimento web, mais especificamente **HTML e CSS**, é bastante comum que fiquemos presos às ferramentas que já conhecemos e temos familiaridade.

Porém, isso pode se tornar um problema devido ao grande crescimento da Web e, com isso, o surgimento de novos problemas e consequentemente novas soluções. Esse é uma situação corriqueira quando lidamos com unidades de medidas no CSS, pela grande variedade, acabamos deixando de lado parte das existentes e não utilizamos, de fato, todo o poder que temos na mão.

Existem algumas unidades que provavelmente você já está acostumado, como o famoso pixel! Nesse post, abordaremos todas as unidades de medidas presentes atualmente e como elas podem nos ajudar durante sua jornada como desenvolvedor web. Antes de prosseguirmos, precisamos entender qual a diferença entre **medida absoluta** e **medida relativa**.

## Medidas Absolutas

Essas são as mais comuns que vemos no dia a dia. São medidas que não estão referenciadas a qualquer outra unidade, ou seja, não dependem de um valor de referência. São unidades de medidas definidas pela física, como o **píxel**, centímetro, metro, etc...

Essas medidas são fixas e não mudam de acordo com as especificações do dispositivo. Esse tipo de medida é indicada para quando conhecemos perfeitamente as características físicas e as configurações das mídias onde serão exibidos nossos projetos.

> Já lançarei um spoiler aqui para você, será que no "mundo real" conheceremos todas as informações de todos os dispositivos? Segura esse pensamento!

## Medidas Relativas

Essas são as que normalmente não estamos habituados. Essas medidas são calculadas tendo como base uma outra unidade de medida definida, como por exemplo

**em** e o **rem** (veremos mais sobre essas duas medidas no decorrer do post). O uso delas é mais apropriado para que possamos fazer ajustes em diferentes dispositivos garantindo um layout consistente e fluido em diversas mídias.

Devido ao fato de que essas medidas são calculadas pelo browser baseando-se em outra unidade, elas tendem a ser bastante flexíveis. Ou seja, podemos ter resultados diferentes de acordo com o ambiente.

Para começarmos a caminhar pelas medidas existentes, optei por começar pelas medidas absolutas, uma vez que estamos, normalmente, mais familiarizados com essas. Como diria meu amigo Flávio Almeida, bem começado, metade feito!

## Medidas absolutas no CSS

### **Píxels (px)**

Provavelmente você já conhece ou ouviu falar desse rapaz chamado Píxel. Píxel nada mais é do que os pequenos pontinhos luminosos da tela do seu monitor, celular, televisão, etc... Logo, o píxel é o menor elemento em um dispositivo de exibição!

Essa é uma medida bastante famosa para os web designers, grande parte dos desenvolvedores web usam o píxel como unidade principal de seus projetos.

Um detalhe que poucos conhecem é que na verdade, o píxel do CSS **NÃO** é realmente um píxel da tela do dispositivo (hardware), e sim o que chamamos de [**píxel de referência**] que geralmente é maior do que o píxel real. O que acaba por torná-lo numa medida abstrata onde é necessário controlar o mapeamento desse píxel de referência para o píxel do hardware (acontece por debaixo dos panos!).

A definição de píxel de referência no CSS é o ângulo visual(0.0213deg) de um píxel em um dispositivo com a densidade de 96dpi a uma distancia de um braço do leitor (28 polegadas), veja na imagem abaixo:

 imagem em diversos dispositivos pode parecer atrativa (cuidado com o píxel de referência!), mas do outro lado, temos consequências negativas quando estamos lidando com dispositivos de baixa resolução (blurry rendering).   

imagem**

A **próxima unidade é Point**. Definitivamente essa unidade é mais conhecida pelos designers, principalmente os que estudam tipografia.

Essa medida é geralmente utilizada em propriedades relacionadas a fonte do seu projeto. Sua abreviação se dá com a marcação de **pt** e seu uso não é tão comum, você provavelmente verá essa unidade muito raramente.

Geralmente espera-se que essa medida seja utilizada em folhas de estilo para **impressões**, quando se precisa ter certeza do tamanho da fonte utilizada. Não é recomendada para a estilização em tela!

### **in (inches/polegadas)**

**Polegada ou inch** em inglês é mais uma unidade de medida que conhecemos do mundo das medidas absolutas - geralmente vemos elas quando queremos comprar uma nova TV ou monitor , mas essa unidade também existe no mundo Web.

Apesar de existirem, elas não costumam ser utilizadas em projetos, uma vez que não existem um uso prático para elas (podemos atingir os mesmos resultados utilizando outras unidades)

### **Centímetro e Milímetro (cm / mm)**

Nós brasileiros, que adotamos o sistema métrico, conhecemos bem essas duas medidas, que são bastante utilizadas no dia a dia. Apesar de bastante comuns, tanto centímetro e milímetro são pouco usadas no CSS. Assim como o **pt**, o uso dessas duas é esperado para folhas de estilo para **impressões** (medidas mais precisas), evitando que elas sejam aplicadas para exibições em tela.

### **Paica (pc)**

Também uma unidade pouco usada no mundo web, a **Paica** também vem para o CSS sendo herdada da tipografia. Por não ser uma unidade amplamente conhecida, ela acaba sendo fadada ao esquecimento, mas é sempre importante conhecermos todas as ferramentas que estão à nossa disposição. A relação entre as unidades absolutas é:

> `1 in = 2,54cm = 25,4mm = 72pt = 6pc`

## Medidas Relativas no CSS

### **Ems (em)**

Nossa primeira unidade relativa é bastante famosa no mundo CSS. Dificilmente você achará algum navegador que não tenha suporte para essa medida, que está presente desde os primórdios. Até para o IE, nós teríamos que usar a versão abaixo da 3.0 para que tivéssemos algum problema.

Esse definitivamente é um dos pontos que fazem o **em** tão popular. O segundo ponto, com certeza se dá a facilidade de criar layouts fluídos e responsivos.

> Mas como funciona esse tal de **em**?Essa unidade muda para os elementos filhos de acordo com o tamanho da fonte (font-size) do elemento pai, então vamos lá. Digamos que temos o seguinte html, me permitindo a licença poética de utilizar a tag style:

html

Acima, temos uma div pai onde estou definindo um `font-size` de 16px, dentro dessa div, temos uma única div filha. Como havia mencionado, o tamanho definido para a fonte impactará no **em** dos elementos filhos.

Nesse nosso caso, para a div mais interna (id=filho), **1em será igual a 16px**, seguindo a lógica, **2em será igual a 32px** e assim por diante. Podemos colocar valores como 1.5 também! Nesse nosso caso, **1.5em será igual a 24px** Quando expressamos tamanhos como margin, padding utilizando **em**, isso significa que eles serão relativos ao tamanho da fonte do elemento pai.

Portanto, de acordo com o tamanho da fonte utilizada em determinado elemento, os elementos filhos serão redimensionados de forma a obedecer a referência a esse tamanho de fonte!

Uma técnica bastante utilizada consiste justamente em fazer uso desse poder do **em** componentizando nossos elementos. A ideia é que a alteração do tamanho da fonte do elemento pai faça com que todo o componente se modifique e redimensione baseando-se nesse novo valor. Você pode dar uma olhada em um exemplo nesse fiddle:

<script async src="//jsfiddle.net/r0od5zbe/2/embed/js,html,css,result/dark/"></script>

Caso não consiga visualizar o jsfiddle, o link é [**esse**]

Apesar de divertido, o motivo de utilizarmos essa técnica não é para que o usuário tenha um slider e altere o tamanho da fonte rsrs. Mas sim para facilitar a manutenção do componente como um todo, sem ter que sofrer alterando valores de todas as partes do componente. Bem legal né?

O último ponto que devemos nos atentar ao usar o **em** é que quando usamos essa medida, nós temos que considerar o `font-size` de todos os elementos pai. Por exemplo, se tivéssemos uma terceira div mais interna no nosso exemplo anterior e definirmos o tamanho da fonte para **2em**, nesse caso esses **2em seriam 64px**, uma vez que o font-size do elemento pai foi definido sendo **32px**(2em)! Pegou o pulo do gato?

Isso tende a se complicar quando estamos falando de 5, 6, 7 divs aninhadas, provavelmente não será muito divertido calcular isso! Mas a boa notícia é que temos uma unidade que nos ajuda a resolver esse probleminha.

### Rems (rem, "root em")

O **REM** vem como sucessor do **EM** e ambos compartilham a mesma lógica de funcionamento (font-size), porém a forma de implementação é diferente. Enquanto o **em** está diretamente relacionado ao tamanho da fonte do elemento pai, o **rem** está relacionado com o tamanho da fonte do elemento root (raiz), no caso, a **tag**.

O fato de que o **rem** se relaciona com o **elemento raiz** resolve aquele problema que tínhamos com diversas divs (elementos) aninhados, uma vez que não haverá essa "herança" de tamanhos, lembra?! Ou seja, não precisaremos ter dor de cabeça tendo que realizar cálculos, uma vez que nos baseamos na tag raiz.

Exemplificando, sabemos que a tag html é a tag raiz de todo documento html. Dito isso, se definirmos que o `font-size` desse elemento será de 18px, então **1rem = 18px**, **2rem = 36px** e assim por diante... Normalmente os browsers especificam o tamanho default da fonte do elemento root (raiz) sendo 16px, então guarde isso no coração! Mesmo essa unidade sendo mais tranquila de se trabalhar, ela não era muito utilizada para design responsivo, o que de primeira pode soar um tanto quanto estranho...

O motivo para isso é o suporte para essa medida. O chrome e o firefox suportavam tranquilamente, assim como o Opera e o Safari, porém, antigamente grande parte dos usuários utilizavam o IE, mais específicamente o IE 8, e esse browser não lidava muito bem com os **rems**, isso fazia com que os desenvolvedores precisassem optar por alguma unidade diferente, em muitos casos, o próprio **em**.

Como disse acima, o valor base é 16px, e isso pode acabar gerando dificuldades para que encontremos alguns tamanhos padrões que costumam ser utilizados. Por exemplo, como faríamos para atingir um tamanho de **10px** utilizando **rem**? Precisamos calcular.

**BASE 16PX**

css 

e assim por diante, realmente não são números muito "amigáveis" ou convenientes Porém, podemos lançar mão de um pequeno truque para nos ajudar (62,5%)

css

Repare que dessa forma, o valor em píxel será sempre o valor definido em **rem** vezes 10! Fica mais conveniente, concorda?

Apesar de parecer uma boa ideia, devemos ter cuidado com essas abordagens, uma vez que ela forçará que você reescreva todos os font-size do seu site, então tome cuidado!

Existe uma terceira visão sobre isso tudo. Essa solução utiliza px, em e rem de maneira bem definida. A ideia consiste em definir o `font-size` do elemento root em píxel, módulos utilizando rem e elementos interiores aos módulos utilizando em, facilitando a manipulação do tamanho global que naturalmente escalará o tamanho para os módulos (utilizando rem) e esses por sua vez escalarão os elementos interiores (que utilizam em e referenciam ao elemento pai). Veja um exemplo dessa abordagem. No console será mostrado o tamanho atual da fonte.

<script async src="//jsfiddle.net/p78usjfe/9/embed/js,html,css,result/dark/"></script>

Caso não consiga visualizar o jsfiddle, o link é [esse] Perceba como a combinação dessas medidas pode ser benéfica. O limite é só sua imaginação!

### Porcentagem (%)

Apesar de não ser uma unidade de medida, a porcentagem costuma ser bastante utilizada quando falamos de layout responsivo e fluido, por isso, não poderia deixá-la passar.

A porcentagem permite que criemos módulos que sempre vão se readaptar para ocupar a quantidade especificada. Por exemplo, se definirmos um elemento tendo um tamanho de **50%**, independente do dispositivo em questão, esse módulo sempre ocupará metade do espaço que lhe cabe (caso esteja dentro de algum outro elemento).

Veja o exemplo abaixo

<script async src="//jsfiddle.net/2yxo7puj/10/embed/js,html,css,result/dark/"></script>

Caso não consiga visualizar o jsfiddle, o link é [esse]

Repare que se alterarmos o tamanho da div container, o elemento interior a ela se redimensionará de forma a sempre ocupar a porcentagem especificada no CSS!

Veja também que o slider está alterando tanto a largura quanto a altura do elemento, mas se alterarmos cada um separadamente, também funcionará! Visto esse exemplo, podemos dizer que a porcentagem tem um comportamento um tanto parecido ao nosso já conhecido **em**, já que ele se relaciona diretamente com o tamanho da propriedade do elemento pai.

Portanto, ao trabalharmos com a porcentagem, temos o mesmo problema que tinhamos com o **em**, quanto mais elementos aninhados, mais complicado será de definirmos exatamente o tamanho, por isso, tenha cuidado quando utilizá-la!

### Ex

Talvez você nunca tenha ouvido falar dessa unidade do CSS, mas ela existe. Diferentemente da forma como a **EM** e a **REM** funcionavam, essa unidade não se relaciona com o tamanho da fonte (font-size), mas com qual fonte está sendo utilizada naquele momento (font-family), mais especificamente ao tamanho do caractere **x** dessa fonte em questão (x-height).

Como o browser sabe esse valor? Esse valor pode vir diretamente com a fonte, o browser pode medir o caractere em caixa baixa (lower case) e se esses dois não funcionarem, o browser estipula um valor de **0.5em** para **1ex**.  

imagem o **em** e o **rem** mudam, dessa vez, quando alteramos completamente a fonte, o **ex** mudará. O uso dessa unidade está mais presente em ajustes tipográficos, nos dando um controle mais preciso quando o padrão definido para algumas tags não se adéqua corretamente ao nosso layout.

### Ch

Também uma unidade pouco conhecida, o **ch** (character unit) é definida na documentação como sendo a "medida avançada" da largura do caractere zero ("0").

Existe uma discussão antiga onde se debateu bastante sobre essa unidade e o que realmente seria "medida avançada", [você pode acompanhar aqui]. A ideia é que um elemento com, por exemplo **100ch** de largura poderá comportar uma string de 100 caracteres dessa determinada fonte, caso essa fonte seja monospace (todos os caracteres têm o mesmo tamanho).

É comum acharmos definições que dizem que a frase acima se aplica para qualquer fonte, porém isso está errado. Como mencionei acima, a regra de **1ch = 1 caractere** se aplica apenas se a fonte usada for **monospace** (largura fixa). Fontes com a largura variável, qualquer caractere pode ser mais largo ou menos largo que o zero ("0"), como podemos ver na imagem abaixo:  

imagem obedece a regra acima, porém as outras duas não! O que podemos tirar após observações é que normalmente **1ch** é 20% - 30% mais largo, porém isso não é uma verdade absoluta e deve ser observado para cada fonte que você deseja aplicar. Por isso, tome cuidado com o uso!

### Vw (viewport width)

Essa medida faz parte das medidas mais atuais e do futuro do CSS. Viewport units.

Como escrito no título, **vw** significa viewport width, mas o que é viewport?

Viewport nada mais é que a área visível de uma página web para o seu usuário, essa viewport pode variar de acordo com o dispositivo, sendo menor em celulares e maior em desktops.

Antigamente, quando não existiam tablets e celulares capazes de acessar sites, todas as web pages eram pensadas para a tela de um computador, com tamanho fixo e design estático. Com a chegada desses dispositivos móveis, essas páginas eram grandes demais para serem exibidas nesses aparelhos, o que tornava muito difícil a navegação.

A primeira solução partiu dos browsers desses dispositivos, eles adotavam um comportamento de retirar o zoom de forma que o site inteiro coubesse na tela do aparelho,definitivamente não era o ideal, mas uma solução rápida. No HTML5, foi introduzido uma maneira para que os desenvolvedores conseguissem alterar a viewport através da **tag**, corrigindo esse problema de usabilidade relacionado aos dispositivos móveis, mas isso é assunto para outra postagem!

Voltando para o nosso querido **vw**, essa unidade se relaciona diretamente com a largura da viewport, onde **1vw** representa **1%** do tamanho da largura dessa área visível. A diferença entre **vw** e a **%** é bem semelhante a diferença entre **em** e **rem**, onde a **%** é relativa ao contexto local do elemento e o **vw** é relativo ao tamanho total da largura da viewport do usuário.

### Vh (viewport height)

Essa unidade funciona da mesma forma que o **vw**, porém dessa vez, a referência será a altura e não a largura. Existem diversos exemplos práticos e interessantes de uso dessas duas unidades. Você pode ver alguns usos nesse [link], provavelmente mais para frente postarei alguns exemplos bacanas. Me cobrem!

### Vmin (viewport minimun)

Essa unidade também se relaciona com as dimensões da viewport, mas com um porém. Anteriormente quando vimos **vh** e **vw** precisávamos escolher se gostaríamos de nos basear na altura (vh) ou na largura (vw) da viewport.

Diferentemente das anteriores, o **vmin** utilizará como base a menor dimensão da viewport (altura x largura), vamos ao exemplo.

Imagine que estamos trabalhando com uma viewport de 1600px de altura e 900px de largura. Nesse caso, **1vmin** terá o valor de **9px** (1% da menor dimensão!), caso tenhamos **100vmin**, esse será igual a **900px**! Interessante né?

No caso acima, a menor dimensão foi a da largura, porém se tivéssemos 300px para altura e 1400px para largura, nosso valor de referência seria o 300px! Sempre a **menor** dimensão!

### Vmax (viewport maximum)

Seguindo a mesma base lógica da unidade anterior, o **vmax** terá como valor de referência a maior dimensão da viewport. Ou seja, utilizando o mesmo exemplo, se tivermos 1600px de altura e 900px de largura, **1vmax** será equivalente a **16px**!

No segundo exemplo ocorrerá a mesma inversão, tendo 300px para altura e 1400px para largura, **1vmax** será equivalente a **14px**. Dessa vez sempre será a **maior** dimensão!

## Alerta!!

Na versão 9.0 do IE, o **vmin** foi implementado com um nome diferenciado (vm) Algumas versões do IE ainda não oferecem suporte para o **vmax**, nas novas versões isso foi corrigido.

Algumas plataformas como o windows tendem a ser inconsistentes na maneira de como eles contam o tamanho da barra de scroll dos browsers. (diminui o viewport ou não) Sempre verifique o suporte dessas medidas, tenha sempre [esse link] no cinto de utilidades.

## Conclusão

Como podemos perceber, existem várias unidades que podemos utilizar no mundo web, mas sempre surgem aquelas perguntas de quando tenho que utilizar? Qual a melhor? etc...

Não existe resposta certa nem errada para essas perguntas, infelizmente não temos uma regra de ouro para todas as situações. O uso dessas unidades depende de diversos fatores como equipe, preferência, familiaridade e assim por diante.

Entretanto, é importante que você como web developer tenha todas essas ferramentas no seu cinto de utilidades já que nunca sabemos quando precisaremos utilizar.

Definitivamente a inclusão das unidades da viewport foram positivas para a web quando estamos lidando com layout flexível, cabe a você começar a colocá-las em uso durante seu dia a dia!

No mais, espero de coração que esse post tenha agregado algum conhecimento e facilitado sua jornada rumo ao saber.

Aqui na **Alura** você pode se aprofundar mais no universo front-end, dê uma olhada na [**formação front-end!**]




O número de profissionais que optou por assumir a liberdade e os riscos do trabalho como freelancer [cresceu no Brasil] e por um bom motivo: as empresas estão em busca do serviço de autônomos criativos e qualificados.

Afinal, o mercado de trabalho brasileiro mudou muito nos últimos anos. Novas profissões surgiram, e as antigas passaram e têm passado por várias transformações. Empresas se adéquam às novas tecnologias e transferem suas estratégias de [marketing] — e muitas outras atividades também — para o ambiente digital.

Profissionais de TI, designers, tradutores e produtores de conteúdo, profissionais das áreas de marketing, manufatura, administração, finanças e direito são os mais procurados no país, [nessa ordem]. É um leque de profissões muito mais variado do que você imaginava, certo?

Para que você fique por dentro das vantagens e dicas para ser um freelancer capacitado, sendo um profissional mais livre e saltando na frente da concorrência, fizemos este texto. Leia até o fim e saiba como começar!

## Vantagens, desvantagens e o diferencial competitivo do trabalho freelancer

Converse com qualquer profissional freelancer: pessoas que procuram liberdade no trabalho, criando sua própria rotina e ganhando por produtividade não costumam se arrepender de terem escolhido esse jeito de trabalhar. Muitos começam essas atividades quando estão desempregados e nunca mais voltam à rotina do escritório de uma empresa, das oito da manhã às seis da tarde.

É claro que a renda do freelancer varia muito conforme a procura pelas suas atividades, o que pode significar ganhar muito bem em um mês e bem menos no mês seguinte. Isso torna um bom planejamento financeiro muito importante.

Além disso, profissionais pouco qualificados ou desorganizados não costumam durar muito no mercado. Se a sua intenção é trabalhar como freelancer, comece a treinar sua disciplina e organização e, principalmente, invista em capacitação e formação técnica na área que pretende escolher.

## Os cursos profissionalizantes são uma ótima opção

É claro que a faculdade tem um grande valor no crescimento pessoal e aprendizado profissional de todos nós. Mas você há de convir que ela oferece uma formação bem genérica e, sozinha, não prepara um profissional devidamente para o mercado de trabalho.

Além do mais, enfrentar trânsito, gastar com transporte e alimentação e se deslocar todos os dias em horário de pico é um esforço muito grande para a maior parte das pessoas. Algumas, inclusive, moram em pequenas cidades que simplesmente não têm uma universidade.

Os cursos profissionalizantes, por outro lado, têm uma proposta de conteúdo mais enxuta, tomam menos horas diárias do estudante e oferecem conhecimento mais aplicável e com retorno financeiro mais imediato.

Além disso, muitos deles podem ser feitos sem sair de casa. O Ensino a Distância (EAD) a cada dia se confirma como tendência entre profissionais das mais diversas áreas que buscam começar uma profissão ou aprimorar seus conhecimentos.

Investir nesses cursos faz muita diferença para o currículo de um freelancer, já que mostra não apenas que ele adquiriu formação na área em que atua, como também que tem interesse em se aprimorar e buscar novos conhecimentos.

Esse tipo de curso é a opção preferida das [empresas para oferecer treinamento para os seus funcionários internos], o que mostra que eles são exatamente o que elas esperam dos seus colaboradores.

E você, como freelancer, pode ter certeza de que vai ser submetido aos mesmos critérios de seleção que são utilizados para contratação de funcionários internos dessas empresas.

## A importância dos cursos específicos e como aproveitá-los melhor

Ainda mais direcionados que os profissionalizantes, os cursos específicos talvez sejam a melhor maneira de melhorar a qualidade do seu trabalho como freelancer. Veja por quê:

### Eles ensinam por projeto

**Se forem elaborados cuidadosamente, eles vão ser práticos, ligados a áreas específicas e moldados para resolver problemas reais do seu dia a dia como autônomo.**

Mas fica a dica: se optar por um desses cursos, avalie se a estrutura didática dele é feita por projeto, isto é, se ela busca te ensinar a resolver um problema te expondo a ele já durante as aulas. Dessa forma, tudo fica muito mais prático, não é mesmo?

### Eles são específicos e resolvem problemas reais

Um bom exemplo: vamos supor que você queira trabalhar como designer freelancer. Você tem formação acadêmica na área ou em alguma área relacionada, mas não se sente pronto para colocar a mão na massa e sair por aí, divulgando os seus serviços e pegando trabalhos "freela" de banners e cartazes virtuais ou impressos.

**Bom, a primeira coisa a fazer é descobrir de onde vem essa insegurança. Você não domina os softwares de edição de imagem a ponto de criar rapidamente utilizando-os? Falta conhecimento sobre alguma área específica, aquela lacuna que prejudica a sua visão de todo do trabalho de designer? Quer aprender como criar imagens para as redes sociais, mas não sabe os padrões e formatos requeridos?**

Quando tiver a resposta para essas perguntas, basta começar a investir seu tempo em cobrir essas lacunas: cursos de [Photoshop], [CorelDraw] ou [InDesign] (dependendo da sua área de atuação, até mesmo os 3 softwares podem ser úteis), cursos de [criação de imagens e anúncios para Facebook], produção de [telas para vídeos], [modelagem 3D], entre outros. Mesmo para um pequeno exemplo como esse, as opções são inúmeras.

### Muitos podem ser feitos online

E o melhor, com certeza, é adquirir toda essa especialização e conhecimento sem gastar muito tempo, fazendo cursos de casa mesmo. Bom para quem já trabalha ou pretende trabalhar como freelancer ou mora em uma pequena cidade e não tem opções de cursos presenciais como esses.

Ou, ainda, para quem vive em uma grande cidade, mas não está disposto a perder várias horas do dia — e um bom dinheiro do mês — com deslocamento.

Agora ponha-se no lugar do seu futuro empregador. Se ele tiver a opção de contratar um profissional freelancer qualificado, com habilidades práticas, vários cursos na área e compreensão teórica daquilo que faz, por que preferiria empregar um funcionário interno e arcar com todos os custos que isso acarreta?

Invista na sua carreira freelancer e comece agora mesmo a aprimorar seus conhecimentos, criar um [portfólio ou currículo virtual] e fidelizar seus clientes, planejando uma carreira com liberdade de horários e rotina e a possibilidade de ganhar pela sua produtividade. Tudo isso sem passar a maior parte do dia num escritório ou indo e voltando dele!






imagem 

Para começar a fazer vendas online, uma empresa que fabrica adesivos criou uma página para pré cadastro de cartão de crédito que contém campos como nome, idade, endereço, CPF entre outros.

O problema é que alguns cadastros não possuem um formato de CPF válido, isso porque o campo não possui nenhuma validação. Ou seja, o campo está aceitando não só números como letras e outros tipos de caractere.

O que vamos fazer é encontrar uma maneira de ajudar o usuário de forma mais clara possível a preencher o cadastro e garantir a validação no front-end antes que os dados sejam enviados para o back-end.

## Fazendo verificação do campo com a ajuda do pattern

Atualmente nós temos o seguinte HTML para o preenchimento do CPF:

html

Como podemos notar não temos nenhuma validação, então fica confuso se devemos ou não colocar ponto ou traço no CPF e pode acontecer do usuário colocar outros caracteres no campo sem querer.

Para isso evitar que isso ocorra vamos usar o atributo **pattern do HTML5** que nos permite fazer uso das famosas [**expressões regulares**] que nada mais são que padrões utilizados para selecionar caracteres em uma string.

Na nossa verificação vamos usar a **lista** `[0-9]`, esse padrão indica que queremos os números de 0 até 9 e o **intervalo** `{11}`, indicando que temos que ter um número de 11 dígitos no nosso campo.

Com a adição do `pattern` nosso campo de CPF ficou da seguinte maneira:

html 

Com a ajuda do `pattern` e das `expressões regulares` conseguimos resolver uma parte da tarefa, agora o que precisamos fazer encontrar uma maneira de formatar o CPF no padrão que precisamos enviar ao back-end.

## Mais um pouco de Regex

Para começar vamos criar uma função que vai ser responsável por formatar o CPF. Dentro dessa função vamos ter as variáveis :

- elementoAlvo: responsável pelo parâmetro que vai ser passado na função
- cpfAtual: responsável por capturar os números do CPF digitados
- cpfAtualizado: responsável por receber o CPF formatado.

js

Vamos usar os seguintes recursos das `expressões regulares` para formatar o CPF:

- O repetidor `{ n }` seu papel é repetir um item quantas vezes que forem preciso.
- O Grupo `( )` seu papel é agrupar itens.
- `\d` que representa o match com todos os números de 0 - 9.

Baseado no padrão normalmente usado para o CPF, nossa expressão ficou assim `/(\d{3})(\d{3})(\d{3})(\d{2})/`, ou seja, três grupos que recebem três números cada e um grupo que recebe dois números.

Como já o que já temos nossa expressão, o que vamos fazer agora é utilizar o método [**replace**] que vai receber dois parâmetros.

O primeiro vai retornar uma nova string no padrão da nossa expressão regular e o segundo recebe uma função que vai concatenar os pontos e o traço com os essa string. Por fim a variável `elementoAlvo` recebe o CPF formatado.

js

Por fim adicionamos o evento [**blur**] no nosso input para quando o campo de CPF perder o foco, a função `formataCPF` ser ativada.

html 

Já temos nossa verificação e padronização, agora vamos pensar um pouco no usuário. Seria interessante o usuário receber um aviso de erro customizado caso digite o número errado no campo.

## Ajudando o usuário a ser mais feliz =)

A API do JavaScript nos fornece algumas propriedades para trabalhar com [**validação**], para o nosso caso vamos usar:

- `validity`: responsável por retornar um valor verdadeiro ou falso.
- `patternMismatch`: responsável por verificar o pattern.
- `setCustomValidity`: responsável por personalizar a resposta para o usuário.

Vamos usar o [**eventListener**] para que toda vez que clicarmos no botão de enviar aconteça uma verificação.

Caso `patterMismatch` não corresponda ao padrão que definimos no `pattern` no `input`, vamos mandar uma resposta customizada para o usuário e desabilitar o botão de envio para que ele saiba que algo de errado aconteceu, caso contrário o número é enviado sem problemas.

js

Não vamos abordar nesse post a maneira de fazer o cálculo para saber se o CPF é válido ou não, felizmente o próprio ministério da fazenda nos disponibiliza o [**algoritmo**] para lidar com essa situação.

Se ficou interessado em como funciona regex, e quais os casos onde podemos utilizá-las melhor, aqui na Alura temos um [**curso de expressões regulares**]. Nele, você verá como expressões regulares, dentre outras muitas coisas.




Veremos nesse artigo, como compartilhar textos e imagens no iOS através da classe `UIActivityViewController`.

Estou desenvolvendo um app para o cadastro de alunos. Na tela principal é apresentado uma lista com o nome e a foto do aluno.

Utilizaremos como exemplo esse app de agenda:

![]

Ao clicar no nome aluno, conseguimos visualizar suas informações:

![]

Nosso objetivo é compartilhar o nome, nota e a imagem do aluno com outros professores.

Mas como poderíamos compartilhar essas informações rapidamente?

O caminho mais comum, seria o usuário tirar screenshot, recortar a imagem e enviar por e-mail. Mas, repare que o usuário teria que fazer vários passos até conseguir de fato compartilhar essa foto.

É muito importante nos atentarmos aos pequenos detalhes que facilitam a vida dos usuários. Ele quer compartilhar os dados. Portanto, vamos criar um botão para isso.

Vamos utilizar a `UIActivityViewController`.

Vamos começar, criando uma ação para o botão share:

swift

Esse botão vai, primeiramente, compartilhar o nome do aluno. Por isso vamos extrair o valor do `textfieldNome`. Em seguida vamos instanciar o `UIActivityViewController`:

swift

Repare que ao instanciar o ActivityViewController, podemos passar um array por parâmetro. Vamos começar passando apenas o nome.

Vamos rodar o aplicativo para testar:

![]

Ao clicar no botão share, conseguimos compartilhar um texto - o nome do aluno. Vamos clicar na opção de e-mail:

![]

Ótimo, já conseguimos compartilhar facilmente um texto simples.

O próximo passo então é compartilharmos a nota e a imagem. Ou seja, precisamos passar a foto e a nota para o **UIActivityViewController**:

swift

Agora, rodando o app para testar, temos o seguinte:

![]

Repare que escolhendo a opção e-mail, conseguimos compartilhar o nome, nota e a foto do aluno.

## Compartilhando informações

Uma de nossas missões com **desenvolvimento mobile** é sempre pensar na **usabilidade**. Ela é muito importante para reter usuários em nosso aplicativo. Nesse post, aprendemos a utilizar a classe `UIActivityViewController` para compartilhar textos e imagens rapidamente com outros aplicativos.

Aqui na Alura, temos uma [**formação iOs**]. Nela você aprenderá desde o básico da construção de aplicativos até técnicas avançadas, como sincronização com serviços web.




Você procura capacitação para o mercado de trabalho, mas tem dúvidas sobre qual profissão seguir? Está com medo de ir por um caminho com pouca oferta de emprego?

O ramo de tecnologia é sempre uma boa pedida. Existem muitas vagas de emprego abertas, as empresas sempre buscam profissionais qualificados e esse setor resiste bem às crises econômicas.

Mesmo quando o país vai mal, as empresas inovadoras de tecnologia acham um caminho para seguir crescendo e contratando.

A ideia interessou? Que bom! Para ajudá-lo a tomar uma decisão tão importante como essa, elencamos alguns dos profissionais de TI mais requisitados para 2017. Veja qual se encaixa melhor no seu perfil profissional. Boa leitura!

## Especialista em UI e UX

Designer de interface de usuário (UI) e designer de experiência do usuário (UX) são siglas semelhantes e podem até ser confundidas por muita gente, mas é importante saber qual a diferença entre elas.

UI é aquele profissional responsável por projetar o desenho da interface pela qual o usuário vai interagir com a empresa. Por exemplo, ele vai projetar o design de um site ou aplicativo, prevendo quais serão as funcionalidades disponibilizadas para o cliente.

UX é o profissional que vai além dessa função. É responsável por planejar toda a interação da empresa com o usuário final. Ele pensa de forma mais global, mais geral. Por exemplo, ele estuda quais são os serviços ou produtos que a empresa pode oferecer para que o cliente viva a melhor experiência possível.

Outra função do UX designer é estruturar as formas como a empresa vai oferecer o produto/serviço ao cliente: inbound marketing, e-mail list, site, etc.

Em linhas gerais, ele atua para aprimorar o relacionamento da empresa com o cliente. A ideia é entender todas as necessidades dos usuários (até mesmo aquelas que os próprios usuários ainda nem perceberam) para deixá-los satisfeitos.

Esse nicho de mercado é voltado para funcionários com formação nas áreas de comunicação, design e arquitetura. Requer conhecimento, principalmente, em [**ferramentas e softwares gráficos**].

## Desenvolvedor mobile

Com o crescimento acentuado na venda dos smartphones, os brasileiros estão sempre precisando de novos aplicativos, de novas atualizações e de novas ferramentas mobile. Dentro desse leque, entram desde apps de notícias, games, bate-papo, e-commerce e muito mais.

Para dar conta de tanta demanda, as empresas fabricantes de aplicativos precisam contratar desenvolvedores especializados na área. A função desses profissionais é programar aplicativos mobile, principalmente para Android e iOS (iPhone).

Os profissionais dessa área são desenvolvedores/programadores, muitos vindos de cursos técnicos ou de graduações, como ciência da computação e análise de sistemas. Segundo analistas de recursos humanos, há maior procura do que oferta de profissionais, por isso o bom profissional consegue emprego rapidamente.

## Desenvolvedor full-stack

Esse profissional é a menina dos olhos do setor de TI.

O que é um [**desenvolvedor**] full-stack, afinal? É aquele desenvolvedor que domina bem as duas grandes áreas do desenvolvimento: back-end (atua na infraestrutura de servidores e bancos de dados) e front-end (responsável pela interface). De quebra, conhece também sobre banco de dados.

Essa característica completa faz do [**full-stack**] um profissional requisitado, pois transita bem entre as duas áreas e sua visão integradora melhora a produtividade da empresa.

Para chegar a ser um full-stack, o profissional precisa estudar e trabalhar bastante, mas vale a pena. Os salários são altos e as vagas de emprego não faltam. Em geral, os full-stacks vêm de faculdades como engenharia de software ou ciência da computação.

## Chief Digital Officer (CDO)

Em bom português, **Chief Digital Officer** significa ser o chefe do escritório digital. É uma profissão recente e que, depois de ganhar força nos Estados Unidos, chegou ao Brasil. Nasceu para não deixar a empresa para trás no quesito tecnologia.

A missão do CDO é manter a empresa dentro do seu negócio principal e inserir novas tecnologias que surgem ano a ano. Esse cargo surgiu quando empresas consolidadas perceberam a dificuldade de aderir a grandes tendências, como Big Data, internet das coisas e inteligência artificial, e temiam ser superadas pelas rivais.

No Brasil, as vagas em CDO estão aparecendo agora, mas devem crescer muito nos próximos dois ou três anos. O perfil desse profissional é de alguém que entenda bem de business, administração, gestão e marketing, aliando essa visão a conhecimentos tecnológicos.

## Cientista de dados (Big Data)

Você já parou para pensar no volume de informação e dados que estão na internet? As empresas, sim. Por isso, buscam profissionais que saibam lidar com todo esse volume. É o cientista de dados.

Esse profissional tem como missão coletar e analisar as informações para, em seguida, apontar insights que favoreçam a empresa. O cientista de dados, por exemplo, comprova por números o comportamento que o mercado consumidor terá nos próximos meses. Um conhecimento que vale ouro para as empresas, pois podem tomar decisões muito mais assertivas e lucrativas.

O cientista de dados precisa ter formação ampla. Conhecer estatística, dominar softwares de análise de dados (como o Excel), ser [**criativo**] e entender bem do mercado em que a empresa atua. Profissionais que dominam linguagens de programação como Python ou R são diferenciais. O cientista de dados atua em várias áreas, entre elas finanças, saúde e marketing.

## Gestor de projetos

É um tipo de profissional requisitado por empresas de qualquer setor da economia. Não é à toa. O gestor de projetos é o responsável por tirar ideias e planos do papel e convertê-los em algo real, como um produto ou um serviço, por exemplo.

Cabe a esse profissional reunir e gerenciar a equipe, estabelecer responsabilidades, cobrar resultados e traçar o cronograma da execução, além de projetar e acompanhar o orçamento. Podemos dizer que o gestor de projetos é o coração da empresa. Se ele for competente, a empresa vai conseguir colocar seus planos em prática.

Os gestores de projetos vêm de áreas diferentes, mas em geral saem das faculdades de administração e engenharia. Além disso, há várias certificações oferecidas pelo mercado que proporcionam um diferencial ao profissional e abrem portas para o mercado de trabalho.

Percebeu como há muitas carreiras em TI que você pode seguir? Todas realmente muito promissoras e, claro, exigem bastante esforço e trabalho.

Siga nossas redes sociais para receber mais conteúdos como este: [Facebook], [Twitter], [Linkedin], [Youtube].




O Nexmo é uma biblioteca para o Java que vai te ajudar na implementação do 2FA, a autentição por dois fatores,

Quando um sistema possui informações muito sigilosas, manter somente uma camada de autenticação se torna um grande risco.  Mesmo que tenham sido gerados mecanismos para criação de senhas fortes, ainda há a possibilidade do usuário cair numa **Engenharia Social seja por meio de Phishing, Vishing, Keyloggers** ou outros Malwares que venham a calhar.

Uma das maneiras de tornar essa prática mais difícil é fazer com que o login passe por dois fatores, onde o primeiro é a senha comum e o segundo é algum objeto pessoal do usuário  seja um cartão magnético, uma chave física ou o próprio celular. 

Dessa forma, mesmo com a posse da senha o invasor não conseguirá entrar  pois não tem posse do tal objeto.

# Arquitetura da Solução

Marcelo trabalha numa fábrica de software voltada para telefonia chamada System of a Call. Ele acessa a intranet para atender aos chamados mas percebe que há uma nova atualização: Um Popup é exibido dizendo que as políticas da empresa mudaram e agora é necessário cadastrar seu número de telefone para fazer o Login.

Ele simplesmente insere seu usuário, senha e telefone e ao clicar em login, é exibida uma tela pedindo para digitar um código que foi enviado para o seu aparelho. A nível de teste, ele decide inserir um valor errado, mas o sistema não permite seu acesso. 

Ao optar pelo caminho certo, insere o código que lhe foi enviado. O sistema confirma a veracidade do código e exibe uma mensagem de que a partir desse momento todos os logins irão precisar passar por esse processo. Marcelo clica em “OK” e finalmente lhe é exibida a página dos chamados que ele acessa diariamente.

Nesse exemplo dado é possível visualizar como esse tipo de autenticação funciona na visão do usuário. A nível arquitetural, chegamos no seguinte modelo abaixo:

imagem

Com a modelagem em mente podemos começar a construir a aplicação.

# Preparando ambiente

Na nossa implementação não iremos criar uma aplicação WEB com Spring, nem iremos mapear objetos no banco com Hibernate. Para fins didáticos será feito uma aplicação Console - dessa forma o foco fica no código e não na infraestrutura.

Para enviar uma mensagem ao dispositivo do usuário iremos utilizar uma API do Nexmo. Será necessário um cadastro na plataforma para testarmos de forma gratuita.

Com isso feito, podemos criar um projeto Maven e incluir a seguinte dependência no arquivo pom.xml:

xml

Após a IDE baixar a biblioteca e buildar o projeto, iremos criar nossa classe cliente.

# Do código ao SMS

Dentro de uma classe com o método Main, a primeira coisa que precisamos escrever é o código responsável por inicializar o nosso cliente. Nele será setado as chaves da API - que são geradas para cada usuário e podem ser visualizadas na aba de configuração.

java

A próxima etapa é testarmos o envio da mensagem. Para isso basta utilizar a **classe VerifyRequest** onde o primeiro parâmetro é o número de telefone que você usou para se cadastrar no Nexmo e o segundo parâmetro é referente ao nome da sua empresa.

O método setLength representa o tamanho do PIN que você quer enviar para o usuário Ele pode ser 4 ou 6:

java

Com a mensagem configurada, agora basta enviarmos a mensagem para o usuário. Para isso executamos o método Verify, que é responsável por fazer o envio e retornar uma resposta que será tratada posteriormente:

java
# Validação do Token

A mensagem chegou, o perigo passou? Ainda não... Nossa verificação só estará completa quando verificarmos que o código digitado pelo usuário é o mesmo que foi enviado para ele. 

A classe VerifyClient possui um método chamado check que recebe o ID da requisição e o código digitado. Com isso validamos o token verificando o status da resposta:

java

Ao executar o programa, uma mensagem será enviada ao celular do usuário informando o nome da empresa e o token para validação conforme foram configurados anteriormente.

imagem

Basta o usuário inserir o código recebido para poder ter acesso ao sistema. Caso insira um código incorreto, será exibida uma mensagem de erro.

imagem

# Conclusão

A autenticação em dois fatores pode ser um forte aliado em sistemas de informações críticas. Nada é 100% seguro, mas essa camada dificulta ainda mais a ação de invasores. 

A utilização do Nexmo com o Java fluiu muito bem sendo possível criar uma aplicação diretamente do Console, o que abre horizontes tanto para a Web quanto para o Mobile.

O código que acompanha esse artigo pode ser baixado [aqui]. Aproveite para implementar outras features como, por exemplo, permitir o usuário digitar mais de uma vez o código caso ele erre na primeira tentativa ou a exibição de um cronômetro para mostrar o tempo de validação do Token. Existem diversas possibilidades.

Para saber mais sobre programação Java, dê uma olhada na [**Formação Java aqui da Alura!**]



O que há de mais valioso em uma empresa? Se você falou que são as pessoas, acertou.

Mais especificamente, são as capacidades das pessoas que conseguem empurrar um negócio para o crescimento: o quanto elas conseguem aprender, colocar o conhecimento na prática e transformá-lo em um benefício para o avanço da empresa.

## Cultura de aprendizado: por que ela é importante?

Imagine um ambiente de trabalho onde as pessoas estagnam, as tarefas estão automatizadas, e situações novas – tais como projetos ou mudanças – não são bem-vindas, pois representam um desafio à ordem já estabelecida.

Sem dúvidas, em uma estrutura desse tipo, as equipes podem passar a se sentir desengajadas e sem motivação para ir além das tarefas rotineiras dos seus cargos. Assim, esse ambiente acaba fechando espaço para soluções criativas e inovação que, em outras empresas, impulsionam os resultados comerciais e o crescimento do negócio como um todo.

Então, **como criar uma cultura de aprendizado na sua empresa** que a ajude a andar rumo sucesso?

## A diferença (nada sutil) entre o treinamento corporativo e a cultura de aprendizado

Várias empresas contratam programas de capacitação para os seus funcionários pensando no bem-estar da empresa. Os treinamentos pontuais até conseguem resolver algumas necessidades pontuais, como treinar a equipe em uma nova linguagem de programação para criar um novo aplicativo, por exemplo.

imagem, como também de episódios do dia a dia: um colega transmitir conhecimento para outro, determinar um líder para o seu time ou disponibilizar quaisquer **artigos**, **livros**, **vídeos**, **podcasts** ou **webinários**, com quais os funcionários possam adquirir algum conhecimento.

## Cultura de aprendizado como função do negócio

Uma cultura forte de aprendizado consegue gerar resultados comerciais ao alinhar as ações de capacitação com as metas do negócio. Por isso, criamos a [**Jornada Alura de Educação Corporativa**],que visa apoiar os times no planejamento, na execução e na multiplicação do aprendizado. 

Seguindo os passos desta metodologia, as empresas podem **escalar o processo de capacitação de forma previsível**. Assim, ao **obter resultados financeiros e não financeiros** dos programas de treinamento, será possível também preparar o terreno para a criação de uma cultura forte de aprendizado, que terá como principal tarefa **multiplicar o conhecimento na empresa** e formar pessoas altamente capacitadas que podem conduzir o negócio ao crescimento.

Conheça agora a Jornada Alura de Educação Corporativa [nesse post]!

![Cultura de aprendizado]

## Como montar uma cultura de aprendizado forte na sua empresa

Além de **combinar métodos formais e informais para as pessoas ganharem conhecimento**, é preciso que elas também ganhem o hábito de estudar um pouco todos os dias.

### Adote o Microlearning

Uma das tendências dos últimos anos para promover o conhecimento dentro do ambiente corporativo é **deixar as equipes consumirem conhecimentos em doses pequenas e regulares**.

Por exemplo, um funcionário pode passar uma parte da sua jornada de trabalho estudando sobre um assunto por sua própria conta, ou até mesmo fazer um curso online, escolhendo um horário que mais lhe for conveniente.  

Desta forma, ele está aprendendo e, ao mesmo tempo, não deixa de estar presente para exercer as tarefas do seu cargo e discutir novos projetos com a equipe.

Este tipo de aprendizagem chama-se **Microlearning**, e várias empresas estão adotando essa prática em seus times, uma vez que ela se encaixa com a rotina deles por sua eficiência.

Além disso, ela ainda promove a aquisição de conhecimento no dia a dia, com informações disponibilizadas em pequenas porções, sem que seja exaustivo. Conheça mais sobre o Microlearning [nesse post]!

### Eventos para promover conhecimento

Já os **meetups, ou workshops, organizados na empresa** têm outro papel primordial na hora de promover a cultura de crescimento constante. Debatendo e compartilhando ideias, as pessoas costumam absorver muito conhecimento, além de poderem expressar opiniões e compartilhar experiências pessoais.

As palestras práticas e inspiracionais feitas por colaboradores e para colaboradores, como a _Google Tech Talks_, são um excelente exemplo de vias informais para propagar conhecimento, habilidades e comportamentos.

Aqui na **Caelum**, fazemos sessões quinzenais, chamadas _Almoço técnico_. Pedimos comida juntos e, depois do almoço, assistimos a uma palestra, organizada por um ou uma colega sobre tópicos interessantes, para então discutirmos o exposto.

### Baixe também o [Infográfico] **5 passos para montar uma cultura de aprendizado na sua empresa**!

Os temas são diversos e associados tanto ao trabalho como ao crescimento pessoal. Como somos uma equipe bastante diversa, é muito legal poder ouvir e compartilhar experiências, e aprender um com o outro.

![Cultura de aprendizado]

### Sem medo de errar

Na **Facebook**, os colaboradores estão incentivados a arriscarem e a errarem. Mais precisamente, é adotada **uma cultura do avanço**, mesmo que esta venha com um maior risco.

Uma aprendizagem mais rápida permite também colocar o conhecimento na prática e **criar produtos de forma mais enxuta**. Assim, ao implementar novas técnicas ou metodologias, eventualmente, em algum momento, algo pode dar errado.

“_Isso vai acabar com a empresa? Se não, deixe-os testarem aquilo_” exclama Mark Zuckerberg no podcast _Masters of Scale_.

Uma maior responsabilidade dada aos funcionários pode ser benéfica na hora de transferir o conhecimento à prática, pois, às vezes, é a falta de incentivos e apoio da parte da gerência que cria **um vão entre o aprendido e o aplicado**.

Resumindo, pôr a mão na massa sem se preocupar demais com a possível imperfeição do resultado é algo que possibilita aos colaboradores converterem seu conhecimento em ações produtivas para a empresa.

## Agora é com você!

**Quer montar uma cultura forte de aprendizado na sua organização**? Baixe o nosso guia [**As práticas para montar a cultura de aprendizado**] e conheça dicas que podem converter o ambiente na sua empresa em uma máquina corporativa de conhecimento.



**Como fazer para atrair esses talentos para a sua empresa?**

Conheça agora alguns pontos-chave que podem agilizar o processo de atração, e também veja como fazer com que o emprego que você está oferecendo seja a oportunidade dos sonhos para as pessoas que procura.

## O que querem os profissionais de TI?

Como bem aponta Paulo Silveira no episódio [Seleção e contratação de Times de tecnologia], do podcast **Hipsters.tech**, mesmo que a remuneração seja importante – como em qualquer outro emprego –, ela não é o fator mais importante quando as pessoas decidem se candidatar para uma vaga em TI.

Você talvez já tenha ouvido sobre os benefícios altamente competitivos que os gigantes da tecnologia, como **Google**, **Facebook** ou **Adobe,** oferecem para os seus funcionários, como um _shuttle_ com Wi-Fi que transporta as pessoas até o escritório, o berçário no local de trabalho ou o buffet livre com comidas saudáveis.

Mas, acho que podemos concordar que empresas de pequeno ou médio porte nem sempre dispõem de orçamentos para competir com este tipo de vantagens, certo?

imagem, existem mais **vantagens atraentes não financeiras para quem se interessa em trabalhar nelas**.

Vamos agora mostrar alguns dos fatores cruciais para que a sua empresa também consiga atrair os melhores talentos para participar do seu processo seletivo e também para que, depois de escolhidos, fazer parte da equipe pelo maior tempo possível.

### Desenvolvimento profissional e pessoal

Conforme o relatório [_Global Human Capital Trends 2017_] da Deloitte, o aprendizado e o desenvolvimento profissional fácil e rápido no trabalho fazem parte do segundo fator mais importante para os funcionários.

A possibilidade de crescimento não só é um fator determinante na hora de optar por se candidatar para uma vaga. O estudo [_Growth Opportunities Are Key to Employee Retention_] ressalta que as **oportunidades de desenvolvimento dentro da empresa jogam um papel importante na retenção dos talentos**.

É importante manter as pessoas sempre engajadas no trabalho, preparando desafios para enfrentar e proporcionando opções de aprender algo novo.

A **GetNinjas** é um ótimo exemplo disso: as pessoas, ao se interessarem em fazer uma mudança de área dentro da própria empresa, ganharam a oportunidade de se capacitar com cursos online e, depois de aprenderem o necessário para o novo cargo, fizeram a transição na carreira.

**Conheça o case de sucesso da GetNinjas com os cursos online da Alura**! Para acessar o material, clique [aqui].

### Inovação e responsabilidade por decisões

Dentro de muitas opções que os profissionais de TI tem na hora de procurar por um novo emprego, as vagas mais atraentes são as de empresas que trazem algo novo ou não comum.

A Universum realizou uma pesquisa sobre as preferências no emprego, perguntando aos estudantes de TI sobre as qualidades de um empregador em potencial. A **inovação** ficou em primeiro lugar, citada por 65,50% dos entrevistados.

Encorajar as pessoas a tomar decisões sozinhas na hora de desenvolver coisas novas é prioridade para o Mark Zuckerberg, CEO do Facebook. No podcast _Masters Of Scale_, ele até brinca: “_Isso destruirá a empresa caso dê errado? Não? Então, deixe-os testarem aquilo!_”.

![Como atrair e reter talentos em TI]

Também na **Movile**, empresa brasileira responsável pelos aplicativos de sucesso como iFood ou Sympla, a tomada de decisões e a responsabilidade pelo próprio trabalho são coisas incentivadas.

Os times na **iFood** são compostos por pessoas com conhecimento variado, chamados de _squads_, que possuem certa autonomia. Alexis, programador full-stack da iFood, explica: “_Se algo der errado no nosso trabalho, a responsabilidade é do time. Claro, temos todo o apoio das pessoas que estão aqui há mais tempo, mas se você é responsável pelo deploy, isso fica com você_.”

### Opções flexíveis de horário e trabalho remoto

O horário flexível e _home office_ tornaram-se uns dos benefícios não financeiros mais desejados por pessoas cujas tarefas não requerem presença física na empresa todos os dias.

A variedade de **ferramentas colaborativas que possibilitam as pessoas a trabalhar em um projeto juntas sem estar efetivamente presentes** no mesmo local possibilita repensar o ambiente corporativo.

Em cidades grandes, **a própria locomoção ao trabalho torna-se um horário não produtivo** e, por isso, a opção de _home office_ ou horário flexível é atrativa. Da mesma forma, essas alternativas possibilitam, por exemplo, trabalhar sem restrições para os funcionários que cuidam de seus filhos.

![Como atrair e reter talentos em TI]

A **Elektro**, empresa ganhadora do prêmio _Great Places To Work_ na edição brasileira, promove uma qualidade de vida com horários flexíveis e valorização da vida familiar.

“_Clima empresarial excelente, oportunidades de crescimento, boa qualidade de vida e horários flexíveis. Vale a pena para a carreira._”, avalia um ex-funcionário anônimo da Love Mondays.

A nova lei trabalhista abre espaço para facilitar essa relação entre colaborador e empregador. A disponibilização do _home office_ ocasional ou integral pode ser considerada como uma vantagem competitiva, que destaca a sua empresa ante as firmas que possibilitam somente o trabalho presencial e sem possíveis mudanças de horário durante a semana.

### Diversidade de pessoas no ambiente de trabalho

Quando há diferenças de idade, credo, gênero, etnia, educação ou bagagem cultural no ambiente de trabalho, **as pessoas ficam mais engajadas e dispostas a irem além de suas responsabilidades formais**, como revela a [pesquisa] do **Harvard Business Review**.

O ambiente de trabalho composto por pessoas com formações e _backgrounds_ diferentes proporciona um espaço para troca de ideias e conhecimentos, e acaba se tornando **uma ótima ferramenta para a retenção de talentos**.

Aqui na Caelum, sempre se fala muito dos benefícios que a diversidade traz, pois cada pessoa enriquece de forma única os projetos desenvolvidos em equipe.

## Atraindo e retendo na área de tecnologia  

Ter pessoas altamente qualificadas, ou até reconhecidas pela comunidade da área, trabalhando para a sua empresa e respirando a sua marca, é uma vantagem competitiva que consegue **gerar uma imagem atrativa dela no mercado de trabalho,** e assim fazer mais talentos se interessarem por fazer parte do time.

Nós, aqui da Alura e da Caelum, conhecemos a complexidade do processo, por isso elaboramos materiais que podem ajudar a sua empresa a ter sucesso com a seleção e a retenção do pessoal.

**Quer contratar pessoas para os seus times de tecnologia**? Acesse agora o eBook [Como atrair e reter os talentos em TI: As lições das empresas eleitas como preferidas pelos colaboradores] e coloque em ação pontos para fazer a jornada dentro da empresa mais atrativa, desde a contratação até a retenção das pessoas mais qualificadas profissionalmente – e sempre com um bom _fit_ para o seu negócio.

Além do eBook, que conta com dicas das empresas de sucesso, temos o [Guia prático para RH], que trata sobre o processo de contratação. Não deixe de conferi-lo também!




Eu não sei se você já parou para pensar, mas os últimos períodos da faculdade de Design podem parecer uma véspera de vestibular outra vez. Hoje em dia, a área tem tantas especializações diferentes que até o melhor aluno fica na dúvida sobre qual seguir após se formar.

Para ajudá-lo, hoje vamos apresentar uma classe de profissionais muito valorizada, que vem de uma categoria do Design cada vez mais importante no mercado: o UI Designer, também chamado por aí de Visual Designer.

## O que faz um UI Designer?

UI é a sigla em inglês para User Interface (Interface de Usuário). Portanto, o UI Designer é o responsável por criar e desenvolver estes elementos gráficos. No Brasil, também é conhecido como designer de interface.

### Um pouco de história

Desde o lançamento do Apple Macintosh e do Microsoft Windows, no meio da década de 80, as interfaces gráficas se popularizaram até se tornarem parte de nossas vidas — você tem uma tela no bolso, uma na sala e aposto que umas cinco no quarto!

Uma interface gráfica é a intermediária visual entre humano e máquina. É a tela de carregamento pedindo para você esperar, o botão vermelho para você clicar apenas se tiver certeza ou as informações do banco que você tem que entender sem misturar as coisas.

Primeiro para computadores pessoais, depois para smartphones, vídeo-games e agora para realidade virtual, a demanda por interfaces deixou de ser apenas uma praticidade para se tornar [**indispensável no mercado**].

### Onde o UI Designer entra

Imagine um botão de aceitar na cor vermelha ou um ícone de X para fazer login. Esses são desastres prontos para acontecer!

A principal tarefa de um UI Designer é desenhar uma interface de forma que ela seja clara, objetiva e principalmente intuitiva para o usuário.

O papel dele é conhecer padrões de uso da sociedade e costumes subjetivos para tornar o uso de um aparelho eletrônico tão natural que o usuário nem precise pensar.

Familiaridade: essa é a palavra-chave para um UI Designer. Pense em como o iOS e o [**Android**] têm padrões de interface muito parecidos. Apple e Google não fazem isso por quererem se copiar, mas porque esse padrão se mostrou o mais familiar e natural para usuários no mundo inteiro.

## Qual a diferença entre UI Designer e UX Designer?

Você já deve ter ouvido os dois termos, mas pode ter dúvidas sobre a diferença entre Interface de Usuário e Experiência de Usuário. Não se preocupe: é realmente confuso, até mesmo porque uma área geralmente não funciona sem a outra.

O profissional de UX deve se preocupar com a experiência de uso de uma interface — a forma como ela guia o usuário, como ele se sente utilizando aquele sistema. Já o UI Designer é responsável pela forma como a interface é apresentada.

Ele deve se preocupar com as informações para que o usuário não se perca, a disposição dos elementos, cores e tudo que for necessário para que o usuário saiba exatamente onde clicar para continuar seu fluxo de experiência.

Sendo um pouco mais romântico com o design, o profissional de UX propõe o sentimento que ele quer passar em uma poesia, enquanto o UI Designer cria a língua para que ela seja lida. Interessante, não?

## Qual é a função do UI Designer dentro de uma empresa?

Certo, você entendeu o que é o Design de Interfaces e já está pronto para subir nesse barco. Mas o que você vai [**encontrar no mercado**]? Como vai ser seu trabalho no dia a dia? É hora de responder a essas perguntas:

### O papel que você vai desempenhar

O UI Designer pode trabalhar em várias áreas no mercado. A mais tradicional delas, claro, é fazer parte de estúdios e equipes de design que prestam serviços de elaboração e produção de interfaces para outras empresas.

Hoje, existem estúdios de design especializados em interfaces para web ou mobile que estão sempre em busca de profissionais capacitados e criativos.

A grande vantagem de trabalhar nesses lugares é a quantidade de projetos diferentes com os quais você terá contato, além de participar de um ambiente focado em inovação.

Mas também é possível ser UI Designer em setores de TI de empresas maiores, com grande demanda para seus sites, softwares internos e produtos para o público.

Fazer parte do time de empresas desse porte é um grande desafio, mas é também recompensador pelo aprendizado que o profissional tem em várias áreas além do design.

### Os softwares que você vai usar

Bom, você já deve estar usando a maioria deles. Photoshop, Illustrator ou Sketch são todos programas que você já está acostumado e deve continuar usando para criar interfaces.

Mas para o desenvolvimento da UI, além da parte gráfica existe a organização da informação, importantíssima para não frustrar seu usuário. Se você já está cogitando ser um UI Designer, temos duas sugestões a mais para você:

#### Balsamiq

O [Balsamiq] é um software simples para criação de mockups. Ele conta com diversos elementos de interface prontos que você arrasta e adiciona no seu projeto. É perfeito para organizar toda a UI rapidamente e testar posições e tamanhos sem desperdiçar tempo na produção.

#### Adobe XD

O [Adobe Experience Design], apesar de o nome indicar uma vocação mais para UX, é bastante útil para o UI Designer. O programa ainda está em versão beta, mas já conta com várias ferramentas simples para não só criar os elementos visuais como testá-los em forma de protótipo.

## Como está o mercado para o UI Designer?

Tudo bem, captamos seu interesse, mas vamos falar de valores agora? Hoje, o salário de um UI Designer varia entre 2500 e 4000 reais, mas você pode ser muito mais valorizado dependendo da sua capacidade. Algumas vagas pedem como diferencial conhecimentos básicos de front-end para conseguir conversar tecnicamente com o time, por exemplo.

Como as interfaces se tornaram dominantes, ela se torna cada vez mais um fator de venda. Hoje elas estão nos carros, nos displays, nos supermercados, e, com o avanço da [Internet das Coisas], a procura por designers de interface só tende a aumentar.

Portanto, pense na importância que essa profissão terá no futuro. O UI Designer é essencial hoje e será ainda mais valorizado nos próximos anos. Escolher esta especialização significa trabalhar em projetos instigantes, desafiadores e inovadores — uma ligação direta entre tecnologia e humanidade.





imagem 

Trabalhar no exterior é um sonho de muitos desenvolvedores. Além de bons salários e oportunidades de crescimento na carreira, muitos buscam isso pela possibilidade de conhecer conhecer novas culturas, aprender outro idioma e toda a bagagem que vem junto com uma experiência internacional.

Felipe, um de nossos ex-alunos, saiu do Brasil para trabalhar na Bélgica. Curioso? Vamos lá :)

**Nome completo?** 

> Felipe Alencar Magalhães.

imagem.

**O processo foi dificil?** 

> Foi certamente o processo mais difícil pelo qual já passei. Tive que preencher um currículo no padrão que o cliente exige, depois realizei conversas por telefone, exames online, entrevistas pessoalmente no escritório do cliente onde estou alocado e, durante esta entrevista, tive de responder um questionário técnico, praticamente um pequeno exame.

imagem. É possível ver pessoas andando sozinhas à noite, mesmo em ruas menos movimentadas, sem medo de serem assaltadas. O transporte público atende bem e por um preço muito justo, os preços dos produtos em geral também são bem baratos se compararmos com o poder aquisitivo no Brasil. De "contras" eu destaco que a cidade não é das mais limpas da Europa (digo na área Central) e também existe uma certa quantidade de mendicância aqui, devido ao país ter uma política relativamente tranqüila para receber imigrantes.

**E o processo de adaptação, foi tranquilo também?**

> A adaptação aqui tem sido muito tranqüila, visto que trabalho em um escritório que tem funcionários de muitos países. A cidade, no geral, também tem muita gente de fora, então as pessoas compreendem bem o que é estar num país novo e se mostram - em sua grande maioria - receptivas e prestativas. Outra coisa à qual tenho tentado me adaptar são o clima e a variação na duração dos dias e noites também, aqui venta muito, nos piores dias de inverno, neva, e nos dias mais quentes do verão a temperatura atinge 30 graus.

> No período mais alto do inverno o dia começa a clarear por volta de 8:30 e escurece por volta das 17:00, já no verão o sol aparece por volta das 6:00 da manhã e só se põe cerca de 22:00. A diferença de horário para o Brasil varia: quando ambos países não estão no horário de verão, a diferença fica em 4 horas; ao iniciar o horário de verão do Brasil, a diferença diminui em 1 hora; e quando o DST (Daylight Saving Time) começa aqui, a diferença aumenta em 1 hora. Então o contato com os amigos e família no Brasil é um pouco diferente: pela manhã o pessoal todo está dormindo e na hora em que você estiver indo dormir, as pessoas provavelmente estarão saindo do trabalho. Fatalmente você vai acordar com várias mensagens não lidas no celular.


**E o salário, é compatível com os daqui?** 

> A área de TI possui uma faixa salarial que permite uma vida tranqüila, até porque o custo de vida é baixo se compararmos ao Brasil (para servir de base comparativa, antes eu morava no Rio de Janeiro, certamente uma das cidades mais caras do Brasil). Não espere salários exorbitantes aqui pela Bélgica (e em grande parte da Europa de um modo geral), aqui a diferença salarial entre profissões que exijam uma menor formação e a área de TI não é tão alta como no Brasil (o que reflete numa menor diferença social entre classes).

**E pra arranjar moradia, como foi?** 
> Levei menos tempo para encontrar um apartamento aqui do que quando me mudei para o Rio de Janeiro. Em 1 mês eu já estava de casa nova. A burocracia é um pouco maior do que no Brasil, pois você tem que contratar um seguro contra incêndio (e furto, caso queira) e registrar o contrato de aluguel na prefeitura da região onde você mora. Eu havia iniciado as buscas por apartamentos no Brasil, através de sites de aluguel de imóveis, mas ao chegar aqui descobri que no cliente onde trabalho havia uma espécie de "Classificados" interno, onde acabei encontrando o local onde moro atualmente. Ainda tive sorte de encontrar um apartamento bem novo e em um prédio com portaria e elevador. A grande maioria dos prédios em Bruxelas não são altos, têm no máximo 4 andares, sem portaria e elevador.

**O ambiente de trabalho é legal?** 

> O ambiente no trabalho é muito bom. A receptividade dos companheiros de escritório é muito boa, os chefes compreendem as necessidades de se ausentar para regularizar a sua situação no país (pegar identidade, abrir conta em banco, requisitar o plano de saúde, procurar móveis, contratar uma nova operadora de telefonia...).

_Há um diálogo freqüente para manter o feedback entre as camadas do setor de desenvolvimento, as dificuldades que surgem no meio do caminho são compreendidas sem problemas e os profissionais são muito abertos a ouvirem opiniões._

![img2]

**Algum curso na Alura que te ajudou diretamente a conseguir essa vaga?** 

> Para quem pretende fazer cursos na Alura, eu digo: não percam a oportunidade. Recrutadores miram muito no que você oferece de conhecimento em seu LinkedIn e ter uma boa gama de cursos pode ser fundamental para que você seja encontrado e receba ofertas interessantes.

**E aí, gostou? Se quiser ainda mais dicas de trabalho no exterior, [ouça o podcast que gravamos junto com o Jovem Nerd]**




**O [Thalles], então aluno do [terceiro curso de C] que explora recursos mais avançados dessa linguagem, fez uma pergunta interessante no fórum com relação à parte que tratamos da limpeza da memória no momento da alocação.**

É bem comum que, ao procurarmos informação a respeito de **limpeza da memória** encontremos posts que indicam três funções diferentes: `memset`, `fflush` e `setbuf`. Veja aqui como elas são diferentes e para quê usar cada uma delas!

### memset

A razão pela qual usamos o `memset` nesse curso é apenas para termos certeza de que o pedaço de memória que vamos usar esteja sem "lixo" -- isto é, para que saibamos que tudo o que tem nessa posição de memória são, no exemplo do curso, zeros:

`memset(&variavel, 0, sizeof(SUA_STRUCT));`

Isso é importante porque se esquecermos de colocar informação nessa variável, poderíamos, sem querer, usar o lixo que já estava naquela posição de memória e, com ele, ter resultados bem estranhos.

Pense, por exemplo, em um programa que guardasse a query que você faria para o banco de dados em uma variável. Você vai precisar criar essa variável e colocar nela a string da _query_. Aí, por um acaso, aquele pedaço de memória que você alocou tem um lixo onde vemos os caracteres `kjs83khas; drop database;` bem no trecho que seria usado como a query. Aí, por um novo acaso, o desenvolvedor esquece de preencher a memória com a _query_ correta e esse trecho de lixo é rodado.

Sem querer, por uma grande coincidência e azar, poderíamos apagar todas as tabelas do banco de dados que acessamos! Para garantir que não vamos ter lixo perigoso em variáveis, usamos o `memset`.

### fflush

A função `fflush` é usada para forçar seu programa a escrever **agora** tudo o que está no buffer que você passar como parâmetro - por exemplo o da saída de dados padrão.

As linguagens usualmente criam buffers para atividades que envolvam entrada e saída de dado (_IO operations_) porque essas são particularmente demoradas e frequentemente bloqueiam a execução normal do programa, enquanto estão escrevendo ou lendo.

`fflush(stdout);`

Se você chamar esse código, tudo o que está sendo acumulado para ser escrito quando o buffer encher será escrito agora. Isso serve, por exemplo, para garantir que toda a saída do programa será impressa antes do programa terminar!

Lembrando que ele também serve para arquivos ou qualquer tipo de buffer que você estiver usando.

### setbuf

A função `setbuf`, por sua vez, simplesmente transforma esse buffer que mencionamos acima para um buffer que determinarmos no segundo parâmetro. Então, quando as pessoas querem jogar fora tudo o que está em um buffer, elas podem fazer:

`setbuf(stdout, 0);`

Após essa linha, tudo o que estava no buffer foi jogado fora e, assim, o que não tinha sido impresso não o será mais. A mesma ideia vale para a leitura:

`setbuf(stdin, 0);`

Esse código faria tudo o que está no buffer de leitura da entrada padrão e ainda **não** foi consumido, ser jogado fora. Agora, seu buffer está limpo para receber uma nova entrada de dados.

* * *

**Como vimos, faz sentido que sejam três funções diferentes, apesar de todas elas, de alguma forma, limparem um trecho de memória! Mas, como qualquer dúvida de especificação, não se preocupe em decorar o que cada uma faz: é mais importante sabermos que esses três pontos podem ser limpos do que lembrar exatamente qual função usar!**





Há pouco mais de um ano atrás a Microsoft anunciou o .NET Core, uma reimplementação do .NET Framework open source e multiplataforma. Com ele, já é possível executar o ASP.NET no Linux e no Mac. 

https://www.youtube.com/watch?v=LrZuJPHdI6Q




Quando falamos em desenvolvimento de software é comum ter diversos ambientes, por exemplo:

- _Desenvolvimento_
- _Teste_
- _Homologação_
- _Produção_

E outra coisa comum no mundo de desenvolvimento é ter divergências entre estes ambientes.

Quem nunca ouviu a frase:

> "Na minha máquina funciona!"?

Nesse post vamos abordar o [**Docker**] como uma alternativa para minimizar essa divergência.

## Mas o que é o Docker?

O Docker é um sistema de virtualização não convencional. Mas o que isso quer dizer? Em virtualizações convencionais temos um software instalado na máquina _Host_ que irá gerenciar as máquinas virtuais (ex.: VirtualBox, VMWare, Parallels e etc...).

Para cada máquina virtual temos uma instalação completa do S.O. que queremos virtualizar, além de ter o próprio hardware virtualizado.

Se por exemplo eu precisar de uma biblioteca comum para todas as máquinas virtuais, preciso instalar em cada uma delas.

O Docker usa uma abordagem diferente, ele utiliza o conceito de container. Como assim [**container**])?

## Compreendendo o conceito de containers

Se pensarmos em transporte de cargas, container foi uma revolução nessa área. Pois antes deles o tempo de carregar e descarregar um navio era gigantesco e o trabalho era feito manualmente. Sem contar perdas (devido a quebras ou deterioração), desvio e outros problemas.

Com a chegada dos containers foi possível transportar mercadorias de uma forma segura, de fácil manipulação e com pouco, ou nenhum, trabalho braçal no carregamento ou descarregamento. E é justamente isso que o Docker tenta fazer com nossos softwares.

## Ganhos ao usar containers do Docker

Imagine nosso software como uma mercadoria a ser transportar como por exemplo, do ambiente de _Desenvolvimento_ para _Produção_.

Para fazer isso precisamos garantir que nosso ambiente de _Produção_ tenha todos os pré-requisitos instalados, de preferência uma versão do S.O. parecida com a do ambiente de _Desenvolvimento_ entre outros cuidados que devem ser tomados (relacionados a permissionamento, serviços dependentes e etc...).

Com o Docker temos um container com nosso software. Esse container é levado inteiro para o outro ambiente.

Com isso não precisamos nos preocupar com pré-requisitos instalados no outro ambiente, versão do S.O., permissionamento e se quisermos podemos ter containers para os serviços dependentes também. Dessa forma minimizamos muito a divergência entre os ambientes.

## Mas como o Docker faz isso?

Essa ideia de container já é bem antiga e a princípio o Docker usava internamente um projeto chamado [**LXC**] (Linux Container).

O projeto LXC usa por baixo dos panos diversas funcionalidades presentes no Kernel do Linux. Abaixo vou listar algumas dessas funcionalidades:

- **chroot** - Reponsavel por mapear os diretórios do S.O. e criar o ponto de montagem (/, /etc, /dev, /proc entre outros).
- **cgroup** - Reponsável por controlar os recursos por processo. Com ele podemos por exemplo limitar o uso de memória e/ou processador para um processo específico.
- **kernel namespace** - Com ele podemos isolar processos, ponto de montagem entre outras coisas. Com esse isolamento, conseguimos a sensação de estar usando uma máquina diferente da máquina host. Pois enxergamos somente o ponto de montagem especifico e processos especificos, inclusive nossos processos começam com PID baixo.
- **kernel capabilities** - Entre outras coisas, conseguimos rodar alguns comandos de forma privilegiada.

## Mão na massa

Agora que temos uma noção do que é e para que serve o Docker, vamos fazer o download da ferramenta e começar nesse mundo de containers.

### Instalando o Docker

Atualmente Docker está disponível em duas versões [Docker Community Edition(CE)] e [Docker Enterprise Edition(EE)].

Em ambas as versões temos acesso a toda a API, basicamente a diferença entre as duas versões é o perfil desejado de aplicações. No EE temos um ambiente homologado pela Docker com toda infraestrutura certificada, segura pensada para o mundo enterprise. Já na versão CE podemos chegar ao mesmo nível que EE porém de uma forma manual.

Nesse [link] você pode encontrar as distribuições para downloads em cada sistema operacional disponível e os passos para instalação.

Feito a instalação, execute esse comando no terminal `docker --version`. Se a instalação ocorreu com sucesso deve ser impresso algo semelhante a isso `Docker version 17.03.1-ce, build c6d412e`.

### Imagens

O Docker trabalha com o conceito de images, ou seja, para colocar um container em funcionamento o Docker precisa ter a imagem no host.

Essas imagens podem ser baixadas de um repositório (a nomenclatura para esse repositório é _registry_) ou criadas localmentes e compiladas. Esse é o [link] para o registry do Docker.

Nesse registry podemos ter imagens oficiais e não oficiais. Além de podermos criar nossas próprias imagens, também é possível fazer upload dela em um registry.

#### Baixando Imagens

Para baixar uma imagem podemos usar o comando `docker pull` e o nome da imagem que queremos baixar. Vamos baixar a imagem do _Ubuntu_, para isso execute o seguinte comando no terminal: `docker pull ubuntu`.

\[caption id="attachment_7091" align="aligncenter" width="750"\]imagem.

### Executando Containers

A partir da imagem podemos iniciar quantos containers quisermos através do comando `docker run`.

Para acessarmos um terminal do _Ubuntu_ podemos usar o comando `docker run -i -t ubuntu` ou `docker run -it ubuntu`. O parâmetro `-i` indica que queremos um container interativo, o `-t` indica que queremos anexar o terminal virtual `tty` do container ao nosso host.

### Listando containers em execução

Para ver os containers em execução podemos usar o comando `docker ps` (em outro terminal ou aba), e ele exibirá um retorno parecido com esse:

imagem.

### Removendo containers

Para remover o container podemos usar o comando `docker rm` e informar o id do container ou o nome dele. Para nosso caso poderíamos executar o comando `docker rm 43aac92b4c99` ou `docker rm dreamy_bassi` para remover o container por completo.

Caso tenhamos a necessidade de remover todos os container (em execução ou encerrados) podemos usar o comando `docker rm $(docker ps -qa)`. A opção `-q` do comando `docker ps` tem como saída somente os ids dos containers, essa lista de ids é passado para o `docker rm` e com isso será removido todos os containers.

Só será possível remover um container caso o mesmo não esteja em execução, do contrário temos que encerrar o container para removê-lo.

### Como são feitas as imagens?

Nesse momento podemos pensar que o Docker é meio mágico (e **é**...kkk). Dado uma imagem ele pode rodar um ou mais containers com pouco esforço, mas como são feitas as images?

Uma imagem pode ser criada a partir de um arquivo de definição chamado de `Dockerfile`, nesse arquivo usamos algumas diretivas para declarar o que teremos na nossa imagem. Por exemplo se olharmos a definição da imagem do _Ubuntu_ podemos ver algo semelhante a isso:

shell

Para ver o Dockerfile completo consulte [aqui].

Com um arquivo `Dockerfile` podemos compilá-lo com o comando `docker build`. Ao compilar um arquivo `Dockerfile` temos uma imagem. Mas isso é um assunto para um próximo post.

Não deixe de conferir nosso curso de [docker] na **Alura**.



Nesse artigo vou mostrar como funciona o operador de igualdade no **Python** e como alteramos seu comportamento, controlando mais nosso código.

imagem 


Tenho um sistema em Python que armazena os filmes que eu tenho em uma **lista**, para organização, com uma função que pega todos os filmes e retorna uma lista com eles:

python

Vamos ver como ficou:

python

Ok, temos nossa lista de filmes!

Depois de um tempo, queria descobrir se eu tinha um filme. Como podemos fazer isso?

## Comparando objetos com o operador ==

Para descobrir se eu já tenho um filme, criei uma função que verifica se o filme que eu quero saber está na nossa lista de filmes:

python 

Rodamos nosso código e esse foi o resultado:

python

Ué! A gente já viu que o filme A Teoria de Tudo está na nossa lista, então o que está dando errado?

Sabemos que o operador `==` funciona bem para **números e strings**:

python 

O resultado:

python

Mas então por que ele não funciona como queremos com nossa classe `Filme`?

## Como o Python compara objetos?

A questão é que o Python não sabe como deve comparar os objetos de tipo `Filme` quando utilizamos o operador `==`. Que valor deve ser comparado? O titulo? O diretor? E de que forma? O Python não sabe!

Com essa dúvida, o Python opta por não verificar valor nenhum, mas sim a **identidade** dos objetos. Isto é, ele checa se as variáveis em comparação apontam para o mesmo objeto na memória. Podemos verificar a identidade de um objeto através da função **id()**:

python

O resultado será parecido com esse:

python 

Repare que, de fato, os dois valores de identidade são diferentes! Se indicássemos que a variável `b` aponta para o objeto da variável `a`, o resultado seria diferente:

python

Dessa vez:

python

Isso ocorre porque, nesse caso, as duas variáveis apontam para o mesmo objeto, ou seja, possuem a mesma identidade:

python 

O resultado:

python 

Vamos ver como isso funciona com os números inteiros e as strings que testamos lá atrás:

python

E o resultado:

python

Bem, os números têm identidades diferentes, enquanto as strings apresentaram identidades iguais. Isso significa que a comparação `==` com strings compara o `id`, e com números inteiros não? Não exatamente…

## Como o Python compara tipos primitivos?

De fato, os ids eram os mesmos com as strings, mas, mesmo assim, não era isso que estava sendo comparado. **Os tipos primitivos no Python já têm implementado nativamente suas próprias maneiras de se comparar**. No caso do int e da string, o que se compara são seus valores.

Como podemos mudar esse comportamento padrão do `==`, então? Afinal, comparar o id dos objetos não é o que queremos! Precisamos, de alguma forma, basear nossa comparação em algum atributo do `Filme`.

Quem vem de outras linguagens de programação, como Java, já deve conhecer métodos como o **[equals()]**, que pode ser sobrescrito para ter o comportamento alterado. Como isso funciona no Python?

## Conhecendo a rich comparison

No Python temos como implementar algo similar ao `equals()`, mas ainda mais poderoso - a comparação rica, ou, como é tecnicamente conhecida, **rich comparison** . Com ela, podemos definir os seguintes métodos de comparação em uma classe:

- `__eq__()`, chamado pelo operador `==`
- `__ne__()`, chamado pelo operador `!=`
- `__gt__()`, chamado pelo operador `>`
- `__lt__()`, chamado pelo operador `<`
- `__ge__()`, chamado pelo operador `>=`
- `__le__()`, chamado pelo operador `<=`

No nosso caso, como estamos tratando de **comparações de igualdade**, focaremos no método `__eq__()` (mas é importante notar a possibilidade de implementação de todos os tipos básicos de comparação!).

Precisamos, primeiro, saber o que queremos que seja comparado. Como precisamos que a comparação foque em algo único de cada filme, usaremos o próprio título. Então vamos implementar:

python

Agora que aplicamos isso ao nosso código, vamos tentar procurar um filme em nosso acervo novamente:

python

Dessa vez:

python 

Certo!

## Simplificando nossa verificação com o operador `in`

Podemos, ainda, simplificar o código em nossa função `tenho_o_filme()` utilizando o operador **in** para verificar se o filme já está na lista, já que este operador também se baseia no retorno de `==`:

python

## Peculiaridades da rich comparison

Há alguns aspectos interessantes de nosso código que valem a pena destacar. Em primeiro lugar, repare que não implementamos o método **__ne__()**, relativo ao operador **!=**. Mas o que acontece, então, se tentarmos usar esse operador?

A partir do Python 3, o operador `!=` retorna automaticamente o inverso do retorno do método `__eq__()`, se o método `__ne__()` não tiver sido implementado.

Apesar disso, **se sua classe herdar de outra em que o método `__ne__()` é definido (como é nos tipos primitivos), o comportamento do `!=` se baseará no que é especificado nesse método, não no inverso do `__eq__()`!**

Por conta disso, **é recomendável sempre declarar o método `__ne__()` quando quisermos implementar o `__eq__()`**, tanto pela compatibilidade com o Python 2 (que sem esse método vai comparar os ids), quanto para evitar possíveis problemas em nosso código.

Outro aspecto interessante de nosso código é que **optamos** por retornar um valor boolean. Sim, optamos!

A rich comparison te permite um retorno de qualquer tipo. Isso significa que uma comparação do tipo `a > b` não precisa, necessariamente, nos devolver um boolean, mas **pode devolver** **qualquer coisa que o desenvolvedor implementar.**

Em geral, optamos por retornar um boolean, mas há grandes e importantes projetos que alteram esse comportamento, como o **[SQLAlchemy]**, que [usa essa feature para facilitar a criação de queries SQL], e até a biblioteca **[numpy]**, [inspiração para a criação da rich comparison].

## Conclusão

Nesse post, aprendemos a implementar métodos de comparação para nossas classes no Python utilizando a técnica de comparação rica. Agora entendemos como funcionam os operadores `==`, `!=`, `>`, `<`, `>=`, `<=`.

E aí? Agora não teremos problemas com comparações entre objetos que nós mesmos implementamos no Python! Se quiser se aprofundar mais na linguagem e conhecer outras features dela, dê uma olhada na nossa [**formação de Python para Web**]!




Para buscar um arquivo utilizando o terminal, basta pedir para ele procurar (**find**), em todo meu sistema(**/**), algo que contenha o nome (**-name**) que queremos. 

Preciso desses arquivos rápido e tenho apenas o terminal em mãos… 

## Usando o find para achar arquivos

Eu sei que o nome dos arquivos contém `pagamentos` então é só acrescentá-lo ao comando.

`find / -name pagamentos`

imagem, sem se importar com o maiúsculas e minúsculas (`-iname`), o arquivo que comece com `pagamento*` seguido de qualquer coisa".

O asterisco indica que o nome pode ser seguido de qualquer coisa, sejam espaços em branco, outras palavras, letras, números …

imagem um arquivo com o nome que queremos. Por exemplo: `pagamentos`

`locate pagamentos`

imagem e nos mostra os resultados. Ao contrário do `find` que faz uma varredura em todo o sistema buscando o arquivo.

Repararam que utilizando o `locate` apareceram outros resultados que continham `pagamentos` no nome? Isso acontece, pois por padrão o `locate` já usa asteriscos no começo e no fim da string de busca, procurando em todos os lugares onde a palavra se encontra.

Esse comando equivale a `find / -name *pagamentos*`:

imagem se as letras estão em caixa alta ou baixa.

`locate -i pagamentos`

![]

E novamente ele nos retornou a localização de nosso arquivo, não apenas de um, mas de todos que continham a string de busca no nome.

Agora, que tal fazer um teste? Vamos criar um arquivo de texto comum em qualquer lugar chamado `teste.txt`. Depois usar o `locate` para tentar localizá-lo.

`locate teste`

![]

Hum… o resultado que esperávamos não está aparecendo. Por quê?

### Entendendo o banco de dados do locate

Vimos que o locate faz uso de um **banco de dados** para realizar suas pesquisas, porém quando criamos um arquivo ele não é automaticamente inserido no banco de dados sendo necessário atualizá-lo.

Para que o banco de dados seja atualizado temos que utilizar o comando `updatedb`. Para isso devemos estar logados como root, ou utilizar `sudo` na frente do comando

Assim, se fizermos novamente a busca ela já retornará o nosso arquivo:

![]

Com isso nosso banco foi atualizado e obtivemos o resultado esperado.

## Conclusão

Queria localizar um arquivo no servidor que não tinha modo gráfico. Vimos como podemos procurar nossos arquivos no terminal, utilizando o nome do arquivo, ou parte do nome, em uma pasta ou em todo o sistema.

Para isso, existem alguns programas, como o `find` e o `locate`. Vimos como utilizar cada um, seu funcionamento e suas diferenças.

Gosta de Linux? Aqui na Alura temos uma [**formação completa**] sobre ele. Nela você aprenderá sobre o sistema, como utilizar o terminal para fazer suas tarefas, sobre a filosofia Open Source, além de muito mais coisas para você dominar esse sistema operacional.




Está começando agora a sua carreira como programador? Ou então nem começou mas precisa de um "empurrãozinho" para dar o ponto de partida? Então da uma olhada nessas dicas que farão toda a diferença para você trilhar a sua jornada!

## 1 - Escolha uma linguagem de programação.

Em diversos grupos, redes sociais ou em qualquer tipo de comunidade de estudantes/programadores uma das maiores dúvidas de qualquer pessoa que está começando é:

> **_"Qual linguagem de programação devo começar?"_**.

Para esse tipo de pergunta, é bem comum obtermos diversas respostas, como por exemplo, C, Java, C#, C++, Ruby, Python, PHP, JavaScript entre diversas linguagens que temos atualmente.

Entretanto, quando estamos começando, a linguagem em si não importa, pois a **lógica é a mesma para todas as linguagens!**

Nesse exato momento, você pode estar se perguntando:

> **_"Se a lógica é a mesma para todas, pouco importa qual linguagem eu devo utilizar?"_**.

Teoricamente sim, porém, na prática, recomendo fortemente que escolha uma linguagem que tenha **menos barreiras na curva de aprendizagem.**

Em outras palavras, linguagens como por exemplo o JavaScript, que pode ser escrito em qualquer editor de texto e executado em qualquer navegador (até mesmo o IE em versões não tão antigas), é uma ótima escolha, pelos seguintes motivos:

- Não precisa instalar uma ferramenta específica para codificar.
- É uma linguagem de fácil aprendizagem.

Não à toa [**o nosso curso de lógica de programação**], que foi totalmente regravado e melhorado esse mês, utiliza JavaScript.

## 2 - Práticar gera mais resultados do que teoria

Além da linguagem, um dos pontos principais quando estamos aprendendo é justamente a prática. Mas como assim a prática?

Até hoje não conheci nenhum programador que só aprendeu na teoria!

É isso mesmo, colocar a mão na massa, tentativa e erro, **praticar diversas vezes até compreender um conceito ou algo novo que viu**, faz parte do dia-a-dia de qualquer programador.

Portanto, tudo que você escutar, ler ou assistir, coloque em prática! Pois quanto mais praticamos, mais compreendemos.

Por exemplo, já tiveram diversas vezes que eu só fui entender o que realmente o meu código estava fazendo na quinta vez que o implementei!

E confesso que foi a partir dessa sensação de "domínio do que estava fazendo" que eu comecei a me apaixonar por programação.

## 3 - A lógica de programação em primeiro lugar

Uma das dicas mais importantes (se brincar a mais importante de todas) para qualquer iniciante é procurar aprender, antes de tudo, a **lógica de programação**.

Mas por que a lógica de programação? Por que não Orientação a Objetos, ou programação funcional, ou estrutura de dados ou qualquer outro tópico da programação?

É justamente porque todos os outros tópicos que envolve programação são baseados na lógica de programação!

Em outras palavras, a lógica de programação são os ingredientes do bolo, ou seja, **programar sem lógica de programação é a mesma coisa que tentar fazer um bolo sem ingredientes**.

Com toda certeza esse bolo não vai sair como o esperado! ;)

## 4 - Procure um amigo para estudar

Além dos passos mencionados, uma das melhores escolhas que você vai fazer na sua vida é procurar um amigo para estudar junto com você! Então você pode pensar:

> **_"Mas eu não consigo aprender sozinho?"_**

Sim, você consegue, porém, ter uma pessoa próxima para que você consiga exibir suas ideias, discutir implementações ou até mesmo compartilhar o que aprendeu em um novo curso, faz toda a diferença!

Em diversas vezes eu tive mais vontade de aprender uma nova tecnologia, conceito ou realizar um novo curso a partir de um feedback de amigo.

Portanto, um amigo ali do seu "lado" para que você possa compartilhar suas experiências e ele as dele, fará com que, tanto você quanto ele, compreendam com mais facilidade tudo que estudaram.

## 5 - Crie um projeto seu e compartilhe com todos

Uma das melhores sensações para qualquer programador é justamente terminar um projeto e compartilhá-lo com algum familiar, amigos ou até mesmo com a comunidade. Portanto, durante o seu aprendizado, coloque tudo em prática em um projeto seu e o compartilhe!

Lembrando que não precisa ser um projeto mega complexo e com diversas funcionalidades, é a partir de projetos como calculadoras básicas, contas bancárias ou cadastro de vendas que damos os nossos primeiros passos.

Além disso, uma das práticas comum é compartilhamos nossos projetos com a comunidade a partir de um [github], por exemplo. Dessa forma podemos pegar um feedback de programadores mais experientes.

Você também pode aprender a programar com a nossa [**formacao de iniciante em programação**], com uma sequência de cursos focada em quem está começando. Outra possibilidade são os [**cursos presenciais da Caelum**] que conta com diversas turmas abertas para quem quer iniciar com programação.




O **Composer** é uma das ferramentas principais do **PHP** moderno.

# Autoloading com o Composer

Imagine que você precisa enviar um e-mail, e para isso vai ser necessário o uso de três classes Email.php, Mensagem.php e Servidor.php. Quando vamos utilizar elas em um arquivo,temos que fazer uso da função de **require**.

php

Legal, isso funciona, mas imagine que precisássemos utilizar mais de vinte classes, esse código iria ficar gigante né? para contornar isso, podemos utilizar a função de autoload do Composer.

O Composer faz o **autoload das classes** do seu projeto, do mesmo jeito que ele faz o autoload de bibliotecas externas. Para isso, existe uma propriedade chamada autoload que pode ser adicionada no `composer.json`:

php

Neste código, estamos fazendo uso do autoload seguindo a convenção PSR-4. A PSR-4 é uma das **PHP Standards Recommendations**, que foi criada pelo PHP-FIG (PHP Framework Interop Group) que define normas para se criar o autoload de arquivos PHP. No caso, estamos atribuindo o namespace “MeuNamespace” para o diretório src na raiz do programa.

Com isso todo o nosso código estará acessível através desse namespace, a única configuração que devemos fazer é incluir na nossa aplicação o arquivo de autoload do Composer! ele pode ser incluído com o seguinte código:

php

O Composer mantém um cache próprio em relação aos arquivos de autoload, então precisamos utilizar o seguinte comando toda vez que fizermos uma alteração no autoload, pois ele vai atualizar o cache.

```
composer dump-autoload
```

# Acessando arquivos executáveis pelo Composer.

Em uma aplicação real, é muito comum precisarmos desenvolver testes para que a nossa aplicação não sofra com regressão de funcionalidade ou bugs que podem ser criados conforme vamos desenvolvendo. Uma biblioteca que auxilia com isso no PHP é o **PHPUnit**, e podemos instalar no nosso projeto utilizando o Composer.

php

Observe o **–dev** utilizado logo depois do require, isso é desejável nessa situação pois o **PHPUnit** é uma dependência que só faz sentido enquanto estamos no ambiente de desenvolvimento e ela não deve ser instalada no ambiente de produção. No ambiente de produção, o comando a ser digitado para instalar as dependências é:

php

O que instalará somente as dependências que podem ser instaladas em um ambiente de produção, excluindo as dependências de desenvolvimento e deixando o ambiente de produção mais enxuto.

Depois de instalarmos dependências que possuem arquivos executáveis instaladas pelo Composer, elas ficam acessíveis no diretório vendor dentro da pasta bin. Para executarmos o PHPUnit, faremos o seguinte:

php

![]

# Scripts customizados com o Composer

Quando executamos testes na nossa aplicação, precisamos de toda a performance possível para que os testes executem logo. Uma otimização que pode ser feita é desligar o debugger quando executamos a bateria de testes, isso pode ser feito com o seguinte comando:

php

Grande, não é? para facilitar, podemos criar um comando customizado do Composer, basta adicionar a seguinte propriedade no arquivo composer.json:

json

Legal! agora quando executarmos o comando composer test, vamos executar de uma maneira mais curta o mesmo comando que digitamos antes.

![]

Você pode descobrir mais sobre o Composer olhando a documentação oficial e se você quiser conhecer mais sobre desenvolvimento de PHP moderno, acesse a [**formação PHP da Alura**].




imagem 

Matheus Henrique, 21 anos, mora em Mogi-Guaçu - SP Desenvolvedor web Hobbies: por incrivel que pareça estudar, jogar sinuca e futebol.

**Depoimento:**

Estudar nunca foi o hobby de muitas pessoas, com o tempo passou a ser o meu e acredite: o único beneficiado será você! Durante o início de carreira o aprendizado é um dos grandes desafios de todo programador. E sempre acabamos nos perguntando:

- Como aprender a programar?
- Como aprender uma linguagem de programação?
- Como se dar bem em ser um desenvolvedor?

Acredito que a resposta para as três perguntas seria muito estudo e prática. Uma técnica que aprendi com o Guilherme Silveira que me ajudou: passei a assistir as aulas do Alura com velocidade em “2x” e comecei estudar e aprender o dobro sem precisar me dedicar horas e horas a mais. Outra coisa que ele me ensinou é a estudar um pouco todos os dias. Sempre separo no mínimo uma hora para os estudos todos os dias...seja estudando no Alura ou um livro da Casa do Código.

Mais importante do que estudar horas a fio, o importante é ter um contato com a linguagem que quer aprender todos os dias. Por menor que seja o tempo: pode alguns minutos do seu almoço ou antes de dormir.

Outra técnica que passei a adotar foi não copiar códigos ou utilizar recursos prontos. Muitas pessoas utilizam frameworks para poupar o esforço e economizar tempo, mas acredito ser um preço muito caro a se pagar para nós que estamos começando. Você terá o resultado que deseja, mas sem saber o que está acontecendo por de baixo dos panos!

Passei então a criar meus próprios códigos para que eu possa aprender e principalmente entender como os frameworks trabalham. Depois de ter aprendido mais a fundo sobre determinada funcionalidade, não vejo mais problemas em copiar ou utilizar frameworks porque você já saberá o que está acontecendo por baixo dos panos.

**Nunca** seja pessimista ao ponto de pensar “não sou capaz”, “não sei fazer” ou “é muito difícil”! Com um pouco de dedicação, estudo e vontade tudo é possível :)

Não queira aprender tudo ao mesmo tempo! Dedique-se em uma linguagem/tecnologia de cada vez. Qualquer que seja sua área, existem caminhos a serem seguidos e tentar cortar caminho geralmente não dá muito certo.

Quer aprender desenvolvimento front-end? Aprenda HTML, CSS e Javascript. Deixe para partir para SASS ou jQuery depois, pois eles precisam de uma base de CSS e Javascript para que as coisas façam sentido para você.

Quer trabalhar com Java para a Web? Aprenda **bem** o básico da linguagem. Depois, foque nos recursos avançados e só em seguida vá para a parte Web pois, para aprender um framework web como VRaptor ou Spring você precisa ter uma ótima base da linguagem.

Essas são algumas das técnicas e métodos de estudo que eu tenho adotado e vem me trazendo muitos benefícios! Estou conseguindo evoluir e melhorar cada dia mais. Espero que sirva para você também que não sabe como começar ou ainda tem dúvidas sobre a longa caminhada que nós desenvolvedores temos de enfrentar :)

* * *

**É Aluno da Alura também e tem uma história bacana pra nos contar? Conta que publicamos seu depoimento aqui! Envie um email para gabriel.ferreira@caelum.com.br :)**




**Design thinking** é uma série de métodos para abordar problemas da mesma forma como um designer costuma fazer seu trabalho.

É um ciclo de identificar algo que pode ser melhorado ou adaptado a partir de um problema, entender seu contexto, **experimentar ideias** e gerar uma solução que resolva o obstáculo, seja ele qual for.

Esse tipo de abordagem pode ser usado em qualquer momento da sua vida: no seu trabalho, claro, mas também nos estudos, no controle financeiro ou no planejamento de uma viagem.

**O fluxo do design thinking é composto dos seguintes passos:**

- Descoberta
- Interpretação
- Ideação
- Experimentação
- Evolução

São com esses passos que criamos nosso curso de  [**design thinking**] e detalhamos aqui:

# 1. Descoberta

O primeiro passo para inovar com design thinking é descobrir mais sobre um problema que você identificou anteriormente, seja por observação ou por ter sentido na pele.

- Falta [**tempo para estudar**]?
- Eu preciso de uma forma melhor para gerir meu material de estudo?

A maioria das ideias inovadoras surge de necessidades rotineiras de pessoas atentas e criativas.

# 2. Interpretação

Depois de entendido melhor e identificado todos os aspectos que circundam e motivam o problema, é preciso interpretar e compreender esses dados. Aqui, é importante a empatia, conseguir se colocar no lugar de outras pessoas.

- Muita gente enfrenta esse problema?
- Alguém já o abordou de alguma forma?
- Solucioná-lo vai realmente melhorar a minha vida e a de outras pessoas?

Colocar a questão em um contexto local e global ajuda a pensar em formas de resolvê-la.

# 3. Ideação

É hora de ter ideias. Aqui, vale tudo, o que vier à cabeça, desde que de forma ordenada e sempre com um foco na solução do problema (inclusive essa falta de objetivo claro é um problema que muitas empresas têm ao lidar com o começo do processo de design thinking).

O **brainstorming** é uma ferramenta poderosa porque te faz encontrar e associar ideias que a princípio não parecem ter relação, e é exatamente por isso que são inovadoras.

# 4. Experimentação

**Do brainstorming, surgem as ideias mais promissoras** É hora de agrupar as similares, combinar e confrontar ideias, para finalmente selecionar apenas as que atendam ao problema de fato e sejam viáveis diante seu tempo e recurso.

Selecionadas as mais promissoras, todas elas devem passar para a fase de experimentação e ser testadas no mundo real. É a hora de descobrir se alguma delas vai funcionar.

# 5. Evolução

Se você chegou a este passo ao inovar, parabéns! Você identificou um problema, interpretou, teve ideias, experimentou e chegou a uma solução mais apropriada!

Ou talvez não. Talvez a solução não seja possível no momento, mas ao passar por esse processo você está um degrau acima do que estava antes para alcançar uma inovação.

Outra característica importante do design thinking é nunca parar. A criatividade é motor que não pode esfriar, e nenhuma solução é perfeita. É hora de voltar ao problema e ver como evoluir a ideia. Mãos à obra!

# Processo de criação e invenção

Em algum momento da história, entre a Renascença e a Revolução Industrial, criou-se uma imagem supervalorizada do "inventor", uma pessoa especial que tinha o dom raro de criar coisas novas.

Você conhece o estereótipo: cabelos desgrenhados, fala sozinho, grita “Eureca!”. O que aconteceu foi que o rótulo de pessoa especial acabou desincentivando muitas outras que achavam não ter o que era preciso para ser criativas.

Essa visão estigmatizada finalmente está perdendo força. Qualquer pessoa pode ser criativa. E deve ser! O design thinking é uma consequência disso, de pessoas buscando incorporar inovação e criatividade em suas vidas.

Independentemente da forma como você faça isso, esta é a dica: viver criando e criar vivendo.

Para ser criativa, uma pessoa não precisa de talento divino ou uma certa personalidade, mas saber identificar problemas e encontrar soluções em qualquer lugar, a qualquer hora.


# Práticas no Design Thinking

## Misture as referências

Podemos dizer que aqui está a base da inovação.  A criatividade vem da habilidade de pegar referências distintas e combiná-las de um jeito que ninguém pensou ainda, mas que resolve o problema em questão.

Então, não tenha medo de misturar as coisas. Deixe os preceitos e os preconceitos de lado e treine seu cérebro para fazer associações livres de tudo o que encontra pela frente.

## Abrace todas as ideias

Sim, é para abraçar mesmo! Proteja as suas ideias e não desista delas facilmente. No momento certo, você vai saber se ela é viável ou não, mas, no começo, apenas deixe que ela amadureça em sua cabeça.

Quantas ideias boas não foram perdidas por serem abandonadas antes da hora? É melhor nem pensar nessa conta.

## Mapeie as ideias

É por isso que, não importa a ideia, trabalhe nela. Inovação e criatividade vêm da persistência.

Se alguma se mostrou promissora, mapeie o que é preciso para experimentá-la, como ela vai funcionar, pontos positivos e negativos. Por menor que seja o problema que você quer resolver, é importante encontrar a solução mais adequada e eficiente.

## Teste todas as ideias

Não tenha medo de errar! Se a solução é viável ou não, você só vai saber testando. Ponha as melhores ideias em prática, repita os testes e tente de outras formas.

Boa parte do processo criativo e do design thinking tem a ver com evolução. Experimentar é a melhor forma de encontrar os pontos fracos da sua ideia e consertá-los.

A era dos grandes inventores já passou há muito tempo. A humanidade vem evoluindo de forma tão rápida porque cada pessoa pode ser uma fonte de inovação e criatividade.





**Por: [Carolina Penedo]**

## Mais uma fase, mais um termo da moda

Eu me lembro quando entrei na faculdade em 2007 e a minha turma era a primeira a levar o título de “Graduação em Design Gráfico”, antes era uma “salada”, contendo moda, industrial, gráfico. Tudo junto e misturado. Depois vieram outras modalidades para incrementar ainda mais esse currículo, como design de games, web design, design editorial e por aí vai.

A gente sai da faculdade com todas essas opções para seguir, sem nenhuma experiência e sem nem mesmo saber o que nos espera no mercado de trabalho. E foi exatamente assim quando concluí o meu curso, procurando o meu lugar nesse universo quase infinito de possibilidades, em busca de **“qual designer sou?”**.

## Primeira etapa: Direção de Arte

O que poderia ser mais glamuroso, divertido e disruptivo do que ter a carteira de trabalho assinada como **Diretora de Arte**?

Eu mineira, recém formada em Santa Catarina, juntei minhas malas novamente e parti para essa oportunidade, que me esperava no Rio de Janeiro.

Dois anos se passaram nesta função, e a empolgação já não era mais a mesma. Percebi que não nasci para ter ideias que vão mudar o mundo e ganhar um “leão de ouro”.

Então veio a onda do digital, a pressão de me manter atualizada, não existia mais criação “on” e “off”. Nesse momento, enxerguei um novo horizonte e vamos à segunda etapa.

## Segunda etapa: Design de Interface

Aqui voltei a estaca zero, fui para uma agência com foco em digital, a “parada” agora era o mundo online!

Um ano fazendo social media - posts para redes sociais, é que a galera de UX tem mania de complicar - logo vieram os primeiros sites e um desafio absurdo!

Afinal se antes eu desenhava um anúncio, agora, em um site havia várias páginas com vários conteúdos e um milhão de possibilidades.

Encontrei um trabalho em equipe, muito mais dinâmico, com arquiteto da informação, devs front, back, java, bootstrap, uma sopa de letrinhas, e lá se foram uns 3 anos para me familiarizar. E eu sempre focada em fazer a coisa ficar bonita.

## Terceira etapa: Design de Usabilidade - como surgiu essa ideia

Em uma pequena agência que trabalhei, me perguntaram seu eu “fazia UX”, pensei, aquele Power Point que o arquiteto faz, acho que consigo fazer. Wireframe já faço no dia a dia mesmo, acho que posso fazer isso! Como podem imaginar, na prática não é bem assim e meu primeiro projeto como **UX** foi uma tragédia.

Comecei a pesquisar para colocar mais esse carimbo no meu portfólio e encontrei outra sopa de letrinhas de desanimar qualquer um.

Fui lendo alguns artigos, conheci alguns podcasts como o Movimento UX que foi fundamental para entender como funcionava o mercado, o que faziam de fato os profissionais da área.

Em seguida fiz alguns cursos online, na Alura, onde conheci a parte teórica e alguns softwares essenciais para o dia a dia. Li alguns livros de indicação de amigos e por aí vai.

Um ano se passou, e eu estava completamente imersa naquele conteúdo, de repente tudo fazia sentido, de repente cada pixel tinha um motivo para estar ali e um novo mundo se abriu.

## Por que UX?

De repente, vi uma oportunidade de me libertar de sentar atrás do computador com um fone de ouvido, e sair por aí explorando temas, colocando minha curiosidade em prática, lidando com pessoas. Se você não gosta de pessoas, não seja um profissional de UX, #ficadica.

Malas feitas de novo, agora em São Paulo, para o meu primeiro emprego como UX designer, já posso afirmar que a minha trajetória até aqui foi fluida e encantadora.

Seja para agregar ao trabalho de um UI, ou como uma nova profissão ele deve ser levado a sério.

Não é nada simples mudar o mindset de alguém como eu que foi treinado a criar layouts lindos, a colocar a experiência do usuário como prioridade, além de ter que pensar nas necessidades do negócio e como o produto que você está desenvolvendo vai impactar a vida de quem está recebendo.

A quantidade de termos, metodologias, livros, softwares e informações do universo UX assusta, eu sei. Mas um dia de cada vez, aprendendo na prática, com profissionais mais experientes, vamos nos formando. Se você também está neste caminho, não desista e seja bem-vindo.

Espero que minha história sirva de motivação para a sua história!

![]

**Carolina Penedo**

Se você gostou da história da Carolina e deseja acompanhar seus trabalhos, você pode [**seguir ela no Twitter**], se [**conectar com ela no LinkedIn**] e [**seguir seu trabalho em seu site**].




Para diminuir ao máximo a possibilidade de acontecer algum erro quando algum usuário for utilizar essa nova funcionalidade, vamos criar um plano para garantir uma boa cobertura de teste antes que ela vá para produção.

# Criando um plano de teste 

Podemos pensar em três pontos importante para iniciarmos no plano:

**Escopo de teste**
**Cenário de teste**
**Caso de teste**

## **O escopo de teste é o que vamos testar**. 

Podemos pegar todos as funcionalidades e serviços que a empresa possui, analisar o que a nova funcionalidade pode impactar e definir o que testar ou não. É importante que o analista de teste tenha um bom conhecimento do negócio para que seja capaz de classificar o que será impactado com o novo serviço.

Com isso em mente [Desenvolvemos uma planilha] para auxiliar na criação do plano de teste.

Para um escopo mais completo iremos classificar não só o que vamos testar mas também os seguintes tópicos:

**O que ficou fora do escopo** : tudo que não iremos testar.

**O que foi realizado poucos testes**: funcionalidade que iremos realizar poucos testes porque a nova funcionalidade não tem impacto direto. 

**É importante testar mas não foi possível**: funcionalidade que ficou fora do escopo por algum impedimento mas deveria ser testado.

**O que ficou dentro do escopo**: funcionalidades que iremos testar porque a nova funcionalidade deve impacto direto.

imagem

As funcionalidades que iremos testar são as **telas de login, cadastro e perfil** e podemos colocar uma pequena descrição que ajudará a entender o porque a funcionalidade está sendo afetada.

# Cenário de teste

O Cenário de teste é **onde testar e em quais condições**. Para isso iremos utilizar a segunda aba da planilha para definir os cenários:

imagem

A frases destacadas em vermelho definem onde iremos testar e em quais condições, como no seguinte exemplo:

> **USUÁRIO QUE UTILIZA DISPOSITIVO MOBILE COM NAVEGADOR FIREFOX**

Sendo o dispositivo mobile o cenário (onde testar) e utilizando o navegador firefox como condição.

Nessa tabela também temos outras informações como revisor, tipo de teste que pode ser manual ou automatizado e os casos de teste do cenário que será feito na próxima etapa.

# Caso de Teste

Por fim, temos o caso de teste que é **como testar**. É importante que você tenha as etapas anteriores bem definidas antes de começar a criar os casos de teste, porque boa parte do que foi feito será reaproveitado.

Agora vamos analisar o seguinte caso de teste apresentado na nossa planilha.

> “CT-001 Verificar se o campo de e-mail está sendo apresentado na tela de cadastro quando utilizado um aparelho celular com o navegador firefox”

imagem

Veja que no trecho “apresentado na tela de cadastro” e “utilizado um aparelho celular com o navegador firefox” são o escopo e cenário de teste respectivamente que criamos anteriormente e a validação que será feita é “Verificar se o campo de e-mail está sendo apresentado”.

Informações como notas, executor, passo a passo, data da execução, resultado esperado, status podem ser colocadas também. Quando mais informação constar no caso teste melhor, pois essa é a aba que o analista de qualidade seguirá para executar os testes. 

Abaixo temos um modelo mais completo:

imagem

Ao concluir essa etapa, podemos atualizar a aba de cenário para vincular os casos de teste:

imagem

Feito isso teremos nosso plano de teste pronto para ser executado, garantindo uma maior cobertura de teste na funcionalidade que foi desenvolvida e garantir menos bugs em produção.











imagem 

Saiba como eu utilizei o fetch para consumir dados de outros sistemas via Rest e preencher automaticamente a seguinte lista:

imagem vamos pegar a resposta com as informações do CEP:

javascript

Com o retorno da data (dados) vamos atribuir ele para os campos e fazer uma função pegar o id do campos e atribuir os valores para eles:

javascript

E dentro do evento de click do **btnPesquisarCEP** iremos atribuir a função:

javascript

Mas como sabemos, o CEP pode ser digitado de maneira errada, então vamos fazer uma exceção que mostre para a pessoa que foi um CEP incorreto ou inexistente.

Para isso criamos um `alert` dentro do then para mostrar que o CEP está inválido.

javascript

## Conclusão

Neste post, aprendemos como fazer uma requisição web com Javascript vendo como são úteis e como elas facilita a vida de quem desenvolve. E normalmente no dia a dia, os sistemas se comunicarem com outros por requições.

Se gostou do conteúdo, que tal dar uma olhada na nossa [**formação front-end na Alura**] ou em nossos livros na [**Casa do Código**].





imagem 

Neste episódio do Alura Live, conversei com a Giovana Delfino, uma da desenvolvedoras do time da Alura pra conversar sobre algoritmos, sua importância e dicas para quem quer começar a estudá-los.

https://www.youtube.com/watch?v=1GOwmog0Cvc&lc=z23ezhtzzsvufbbjc04t1aokge5kc4uo3sqldxxynhpzrk0h00410

Gostou deste vídeo? Então não deixe de se [inscrever em nosso canal no Youtube!] O Alura Live vai ao ar todas as quintas lá em nossa [página no Facebook]. Confira quais os assuntos dos próximos episódios [aqui].

Gostou deste vídeo? Assista o [episódio completo] aqui!

Confira os cursos de Algoritmos na Alura, que estão divididos em [parte 1] e [parte 2].

Veja outros cursos e carreiras na [Alura]!

Siga a gente no Twitter: Não deixe de seguir [eu] e a [Alura] no Twitter! :)




Existem algumas extensões do Chrome que são bem interessantes para sermos mais produtivos em nosso cotidiano tanto profissional quanto pessoal. Se você é designer, recomendo inclusive meu post no [Dicas UX] sobre extensões do Chrome para designers.

# 1 – **GetPocket**
Quantas abas estão abertas agora no seu navegador? Muitas pessoas costumam deixar diversas abas sem uso abertas, o que pode atrapalhar o desempenho nas atividades do dia a dia que precisam de atenção.
Com o GetPocket você pode salvar tudo isso para ler mais tarde no seu computador ou mesmo no celular. Além disso, a extensão permite adicionarmos tags nos links e o aplicativo funciona offline.
Você pode deixar o layout dele em modo noturno também.

imagem

# 2 – **LastPass**
Decorar mil senhas é complicado. Para resolver isso, muitas pessoas acabam usando a mesma senha em mais de um serviço ou mesmo senhas muito fracas.
Para gerenciar seus acessos e ajudar sua memória, existe o gerenciador de senhas LastPass. A ideia dele é ser um cofre digital com suas senhas, além de facilitar a vida na hora de criação de senhas com **muitos** caracteres também.
Pode parecer estranho no primeiro momento, mas serviços como esse possuem várias travas de segurança para evitar que algo de ruim aconteça.

imagem

# 3 – **Video speed controller**
Tempo é dinheiro e eu não quero perder o meu. Imagino que você também não queira perder o seu, não é? Por isso gosto bastante da funcionalidade do Youtube em deixar a velocidade de reprodução do vídeo em 2x.
O problema é que não são todos os serviços de vídeo que fornecem essa opção, e mesmo no Youtube são alguns cliques até conseguir mudar a velocidade. Eis que surge o Video speed controller.
Essa ferramenta te ajuda a aumentar a velocidade de vídeos em diversos sites que existem por aí. E sim, funciona na Netflix e na [**Alura!**]

imagem

# 4 – **Buffer**
Quando vemos aquele post bacana (tipo esse 😊) e queremos compartilhar com o maior número possível de pessoas, o que fazemos? Abrimos cada rede social e vamos colando o link em todas… Mas é meio chato, não?
O Buffer é um serviço/extensão que me faz ganhar bastante tempo quando passo por isso. Eles possuem planos pagos, mas para usos mais tranquilos a versão free é bem aceitável.
 
Essas ferramentas facilitam a vida de estudantes e profissionais de diversas áreas! e desejar conhecer métodos para melhorar a sua produtividade, temos o [**curso de Produtividade:** estratégias para o dia a dia aqui na Alura!]




Para fazer o livro das turmas formandas de uma faculdade, o designer recebeu as seguintes orientações:

**_"Todos as fotos dos alunos deverão ter um filtro azul, juntamente com seu nome. São um total de 100 alunos."_**

> _Então, para fazer as edições, só precisamos ir aplicando o filtro em todas as fotos, repetidas vezes, incluir o nome de cada aluno, salvar e pronto, certo?_

imagem.

Mas, antes de utilizar este recurso, precisamos entender como criar a ação que queremos repetir.

### Pré-determinando ações

Para criar uma ação, temos uma janela no Photoshop chamada **Actions** (ou ações), que será responsável por gravar as orientações de ação que queremos.

imagem.

Para registrar o processo de adição do filtro azul, vá até a janela Actions e **crie uma nova ação**, nomeie e clique em **Ok**.

imagem, tingimos a camada com a cor azul.

Depois, diminuímos a opacidade em 50% para criar um efeito de filtro azul e, por último, retiramos toda a saturação da foto (deixar em tons de cinza), indo em Image > Adjustments > Desaturate. Chegamos a este resultado:

imagem com opacidade em 90%. Algo como:

imagem. No caso, é uma boa prática definir termos de acordo com o que representam, como "foto", para as fotos de alunos, e “nome”, para os nomes.

**Agora chegamos à parte mais importante! Precisaremos definir as variáveis dos campos que sofrerão alterações.** Isto é, as variáveis serão as identificações que utilizaremos para indicar os dados a serem alterados.

Para isto, seguiremos este caminho: Image > Variables > Define.

Na janela que abre, primeiro escolhemos o nome da camada que sofrerá alteração. Veja o exemplo:

imagem em uma mesma pasta, para que, ao executar a função, os arquivos referenciados sejam encontrados.

imagem** ou seja, um arquivo **.csv**, também dentro da pasta de arquivos do projeto. Assim criamos o conhecido **Data Set.**

## De volta ao Photoshop…

Com a planilha de nomes pronta, voltamos ao Photoshop e seguimos o caminho File > Import > Variable Data Set.

Na janela que abre em seguida, escolhemos o arquivo da planilha criada e deixamos os dois campos selecionados, como indicado abaixo:

imagem






Do nada o meu produto que custava R$ 30,40 agora parece que custa R$ 30,399999. Pior ainda, a soma das notas fiscais não bate com a soma dos produtos! Olha meu SQL piradão:

sql

Que doideira é essa? Até eu não erro essa conta!

Mas eu preciso armazenar os números direito e o tipo double é uma aproximação! Aproximou,perdeu precisão.

Usei double pois o Mysql suporta ele, mas diversos bancos tem seu próprio tipo numérico aproximado. Por exemplo o SQL Server tem os tipos real e float, [o Oracle tem seu mundo a parte que apresentamos em seu curso].

A solução? Dizer quantas casas desejamos para representar o valor e quantas casas decimais, então vamos usar o tipo DECIMAL. Dica bonus: deixe uma casa decimal de margem para arredondamentos:

sql

Vai representar ponto flutuante?

Diga a escala e a precisão e siga o padrão SQL com o DECIMAL.

**Essa dica é baseada no nosso curso básico de banco de dados relacionais, onde vemos [outras situações onde a tipagem é fundamental] para criar restrições no dia a dia como o uso de enumerações.**




Estudando! Rá!

Mas bom, no dia a dia tenho 3 práticas que me ajudam muito:

## 1\. Estudar um pouco todos os dias é cientificamente comprovado como eficaz.

Faço isso todos os dias da minha vida. Se você, como eu, acorda e olha o email, em um minuto você aprende algo. Imagina aprender todo dia sem "perder" tempo?

Por exemplo, junte-se ao expert Sérgio Lopes a lista diária de um minuto sobre [boas práticas de Javascript], onde [em menos de um minuto me toquei que Javascript já faz muita coisa que antes precisávamos do JQuery].

Ou a lista diário de um minuto de [**boas práticas de SQL**], onde, por exemplo, ensino em menos de um minuto [**como nunca mais apagar coisas que não devia com DELETE**]. Encontre sua fonte diária de dicas e boas práticas. Quer se inscrever nele?

## 2\. Faça cursos.

Começou com o estudo curto e rápido diário e agora está pronto para dedicar meia hora por dia? Uma hora a cada três dias? Não deixe de fazer cursos.

Eu já criei mais de 40 cursos no Alura, e já assisti literalmente todos [**os melhores cursos do Alura**], foram mais de 150 que já assisti fazendo revisão :) Haja estudo!

Mas eu devo ter 100 horas em um dia? Não!

30 minutos por dia é uma meta animal! Se conseguir, [me avisa]!

## 3\. Discuta as práticas com seus amigos.

Questionar e ser questionado faz parte do aprendizado. Manda o link de um post aqui do blog para um amigo agora. Isso agora. Fala "javascript tá animal". Ou "se lembra aquele delete que eu fiz ano passado?". Puxa o assunto! Me conta o que aconteceu?

E aí, mandou? Eu compartilho esse tipo de coisa informação e insights a rodo, é assim que pego informação nova, de todo lugar e de todos!

Abraço!

Guilherme





imagem 

Perguntamos ao host **Paulo Silveira**, co-hosts e fãs quais são os seus episódios de **Hipsters.tech** preferidos!

Confira a seleção, escute os que ainda não conhece e comente sobre outros que você gosta!

## Tecnologias no Nubank – Hipsters #01

Esse é o piloto do podcast e por isso inesquecível episódio. É aí onde tudo começou!

Mesmo lançado há mais de dois anos, em julho 2016, esse ep segue sendo um dos mais queridos de quem acompanha o Hipsters Ponto Tech.

E os convidados são logo da maior startup financeiro do Brasil! Escute para descobrir o que há por trás do cartão roxo que naquela época virou febre e quais são os desafios do time de tecnologia.

<iframe src="https://open.spotify.com/embed-podcast/episode/0CEqymEIXegTThgucywPXy" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>


O episódio predileto da co-host **Roberta Arcoverde** e do maior dos hipsters do time Caelum,o **Gabs Ferreira**. Sem convidados, os 3 hosts do podcast se reuniram para falar sobre os livros que mais influenciaram a carreira deles. Será que são os mesmos que você já leu e que te ajudaram?

Escute o ep para ver quais títulos o pessoal achou secos e entediantes demais para sequer concluir a leitura e por quais se apaixonaram e nunca irão largá-los.

<iframe src="https://open.spotify.com/embed-podcast/episode/39emOB3lVBo80RDOs6BZVG" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

## Produtividade e mais produtividade

São dois episódios que abordam o mesmo tema, um trazendo mais informações úteis que o outro para a sua vida pessoal e profissional. Recomendação do guru de produtividade daqui da casa, o grande Guilherme Silveira! Ele provavelmente já leu mais livros este mês do que a gente escutou de podcast o ano passado...

Quando crescer, quer ser como ele? Então aprenda com pessoal que entende do assunto sobre como priorizar tarefas, como lidar com procrastinação e como traçar metas para ter uma carreira (e vida) de sucesso.

<iframe src="https://open.spotify.com/embed-podcast/episode/2t6wgbrhaUhh7yW5lx0b1F" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

<iframe src="https://open.spotify.com/embed-podcast/episode/3rg3fwydxGECapljIp9DNC" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

## Programar sem enxergar – Hipsters #82

Um dos episódios mais extraordinários, onde o Paulo bateu papo com dois devs e uma deva, todos eles com alguma deficiência visual.

O pessoal comenta sobre os desafios de escrever código de forma diferente, sobre como é trabalhar com engenharia de software em empresas ou trabalhar remotamente. E, no final do ep, rola um live coding sensacional! Bateu curiosidade? Bora ouvir!

<iframe src="https://open.spotify.com/embed-podcast/episode/0n7huBx5Z7xZ4tUHMfr9P5" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

## Mitos de UX – Hipsters #93

Um episódio divertidíssimo e que esclarece muita coisa para quem está iniciando no mundo de User Experience ou quer aprender sobre para não cometer os mesmos erros e clichês no seu próprio produto. Entre os convidados, a simpática e fera, Carla de Bona. 

<iframe src="https://open.spotify.com/embed-podcast/episode/07TR5hOosalS0RobfaK17X" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

## Bônus: Melhores episódios de Hipsters.tech segundo o Paulo Silveira

Imagina alguém que está gerindo uma empresa um grupo de empresas, criando duas filhas, fazendo crossfit e ainda encontra um tempinho para gravar um podcast com as pessoas mais incríveis do mundo de tecnologia (ou não) brasileira (ou não).

Pois é, ele é uma máquina de conteúdo sem igual que junto ao seu irmão Guilherme inspirou muita gente a aprender Java e a entrar na área de programação. Sem mais delongas: quais são os episódios preferidos do host do podcast?

## Tecnologias e Transformação Digital no Magazine Luiza – Hipsters #107

Como começou a grande virada de uma loja de varejo para um dos e-commerces mais importantes do país? Entenda de tecnologia, logística e “calor humano” integrados nessa marca gigante que só cresce!

<iframe src="https://open.spotify.com/embed-podcast/episode/0esppR0fad6TgDcJTMXKCM" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

### Mainframe e desenvolvimento raiz – Hipsters #118

Cobol, PL/1 ou Adabas...existem mesmo essas tecnologias ou são lendas? Onde vivem e o que comem? Nesse episódio, o Paulo conversa com o pessoal que trabalha com algumas (e que por coincidência são seus amigos da infância) e não faltam também os co-hosts “raíz” Maurício Linhares e Roberta Arcoverde.

Ah, e nos comentários do episódio nos emocionamos com a quantidade de gente que trabalha com COBOL e agradece pelo episódio, além do dev que se chama Buga! Já imaginou a zoeira? 😂

<iframe src="https://open.spotify.com/embed-podcast/episode/6ulFn9u7QdHRZVfKn2jS0H" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

### Carros Elétricos e Programação – Hipsters #135

O episódio saiu esta semana e já ganhou o coração do Paulo! Os convidados discutem o quanto os veículos sem motorista são longe ou perto da realidade, e quais as tecnologias relacionadas.

Diretamente da Suíça, um dos convidados que bateu papo sobre o futuro (ou presente) foi o Henrique Bierwagen, coordenador de testes na National Electric Vehicle Sweden. Vale a pena conferir!

<iframe src="https://open.spotify.com/embed-podcast/episode/2hswmBLMLeQaYOUJWLZE0i" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

## ♥ Mais um bônus!

### Por trás do Hipsters: Caelum, Alura e Casa do Código – Hipsters #100

Um episódio que nos leva aos bastidores do Grupo Caelum e conta a história das empresas pelas lentes dos fundadores.

Essa vez, o Paulo Silveira brinca de convidado e o Maurício Linhares estreia como host. Junto a eles, o Sérgio Lopes, que foi o primeiro estagiário da Caelum e até trancou a faculdade por causa da empresa.

É óbvio que não pode faltar também o Gui Silveira, que conta porque o treinamento de instrutores e instrutoras de cursos de tecnologia é mais pesado que os treinos de crossfit.

<iframe src="https://open.spotify.com/embed-podcast/episode/2U6y2etKfB73kcaBC3I4gG" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

E aí, já ouviu todos esses? Você pode achar todos os episódios no site [Hipsters Ponto Tech] ou no [Spotify]. Também, divulgamos sempre os novos conteúdos nas redes sociais.

Aproveite para seguir a gente no [Twitter], [Instagram] e [Facebook]!






Independentemente da área em que atuam, é importante ter alguns cuidados e estar atento para detalhes essenciais durante esse processo.

Manter-se atualizado, cultivar o ciclo de relacionamentos, apostar em uma comunicação eficiente e ficar atento às demandas do mercado são algumas estratégias que fazem toda a diferença para quem deseja atuar como freelancer.

Além disso, alguns quesitos comportamentais também são importantes! É preciso ter disciplina e muito foco. Confira algumas dicas e saiba como vender os seus serviços de freelancer corretamente.

## Invista em cursos e certificações

Quando o profissional está começando a sua carreira e ainda não tem muita experiência atuando no mercado ou um grande portfólio, é muito importante apostar em certificações técnicas.

Cada área tem suas especificidades, mas é preciso ficar atento para aquelas que são mais exigidas pelas empresas ou clientes. Na área de redação, pode-se ter certificação relacionada à produção de conteúdo ou [**mídias sociais**], por exemplo.

Para os designers, as certificações no pacote Adobe também oferecem certa segurança, pois elas demonstram que você está apto a usar as principais ferramentas exigidas pelo mercado.

Já na área de TI, uma certificação em linguagem SQL pode te ajudar a conseguir muitos jobs interessantes. Ela é conhecida como Oracle Certified Professional Advanced PL/SQL Developer Certification.

## Seja um autodidata

Você nem sempre terá a chance ou o investimento necessários para realizar todos os cursos que deseja.

As certificações formais, oferecidas por institutos renomados são muito importantes, mas quando não for possível realizá-las, use os recursos disponíveis e seja um autodidata. Explore livros, tutoriais, vídeos, manuais online e use a [**sua criatividade**].

A disposição para aprender sozinho é importante para quem não tem o tempo necessário para se capacitar. Um cliente pode pedir uma demanda com prazo muito apertado e, por mais que você não domine alguma técnica, provavelmente vai querer aceitar o serviço.

Por isso, é importante não perder as oportunidades e aproveitar para desenvolver novas habilidades por conta própria, sempre que possível.

## Venda o seu peixe

Ninguém saberá que você é um profissional freelancer, a menos que você fale. Nesse caso, a propaganda é sempre a alma do negócio. Por isso, aproveite todas as chances de vender o seu peixe.

Para [**conseguir trabalhos**] é fundamental ter um bom portfólio, manter os contatos ativos e usar a tecnologia a seu favor para divulgar aquilo que você faz de melhor.

O seu perfil do Linkedin deve estar atualizado e, de preferência, com recomendações sobre os trabalhos já desenvolvidos. O link para o seu portfólio deve estar em todos os perfis de mídias sociais, mas lembre-se de atualizá-los sempre com conteúdo relevante e de qualidade.

Não dá para ser um designer e publicar uma imagem com baixa resolução na web ou ter um cartão de visitas mal feito, não é mesmo? Em casa de ferreiro, o espeto não pode ser de pau!

## Frequente eventos da sua área

Para vender seus serviços de freelancer, é importante estar atento às tendências do mercado. A melhor forma de manter-se atualizado é por meio das feiras e congressos da sua área.

Lá, você pode ter contato com especialistas diversos, fornecedores e potenciais clientes. Aproveite também para focar no conteúdo das apresentações e usar isso a seu favor.

Quando você inclui a participação em grandes eventos em seu currículo, os clientes percebem que você é uma pessoa que valoriza a troca de conhecimentos e está atento ao que acontece na sua área.

Outra grande vantagem dessas ocasiões é o networking. Estar em contato com colegas e outros profissionais do seu ramo pode te render conhecimento, indicações para trabalhos e até mesmo boas amizades.

## Controle suas finanças

É essencial saber vender os seus serviços de freelancer, mas também é igualmente importante saber cobrar por eles e monitorar esse valor depois de recebido.

Aprenda quanto vale o seu trabalho e não deixe que as outras pessoas definam o seu valor. Todo esforço deve ter um preço justo e com base na média do mercado.

Um trabalho nunca vai ser, por exemplo, um “simples post para facebook”, e sim uma produção de conteúdo que faz parte de uma estratégia de marketing muito maior. Por isso, cobre pela sua especialidade sem medo.

Se você já sabe o valor do seu ofício, também precisa controlar muito bem suas receitas e despesas. Caso trabalhe em casa, diferencie os gastos profissionais dos pessoais.

Evite despesas desnecessárias e sempre pesquise antes de comprar algum software, equipamento ou material de escritório. Para viver de freelas, é importante ter muito controle e rigor com as finanças.

## Tenha foco e disciplina

**O controle e o rigor que o freelancer tem que ter na vida financeira também são necessários em todos os outros aspectos da vida profissional. Se você não tem que “bater o ponto” no seu trabalho, deve ter um horário muito determinado para começar e terminar suas tarefas.**

Acorde cedo, se alimente, troque de roupa e vá para o escritório ou local que você desenvolve sua tarefa. Nada de trabalhar de pijama! É preciso ter disciplina para cumprir seu cronograma e entregar os trabalhos propostos.

Com essa rotina, você vai começar a controlar melhor quanto tempo leva para fazer cada atividade. Assim, vai aceitar os trabalhos de acordo com a sua disponibilidade para atendê-los e manterá um controle rigoroso sobre isso.

Quem é freelancer precisa ter muito foco para não se dispersar, já que a pontualidade e o profissionalismo nas entregas dos trabalhos vão determinar a quantidade de serviços que você será capaz de vender e sua consolidação no mercado.

Oferecer serviços de freelancer tem seus prós e contras, como qualquer atividade profissional. Você tem flexibilidade de horários, mas não tem vale-refeição; não tem custos com transporte, mas precisa planejar o próprio 13º salário!

**O importante é saber lidar com questões muito próprias dessa atividade e estar disposto a se surpreender com o seu trabalho a cada dia. Descubra novas formas de fazer aquilo que você gosta e insista em fazer disso a sua profissão!**

Se você acha que este post pode ser útil para algum amigo que também trabalha como freelancer, compartilhe-o nas redes sociais e faça a informação circular!





imagem 

A gente é bem bitolado em [performance aqui na Alura] e na Caelum há bastante tempo. Já seguimos muitas boas práticas na hora de desenvolver e até ensinamos várias delas nos [cursos de performance front-end].

**Mas a vida acontece**

Mais especificamente, as coisas evoluem. Mudam organicamente. Uma funcionalidade nova aqui, outra ali. Muita gente mexe no código. Até os browsers mudam. E aí sem a gente nem perceber, a **performance pode ir pro ralo**.

Recentemente passamos por diversos pequenos casos na [plataforma de aula da Alura] onde a performance estava sofrendo por besteiras pequenas ou por _débito técnico_ que estava acumulando. E isso me fez lembrar como **precisamos sempre estar de olho** na performance do site. Não é algo que se faz e se larga. É preciso monitorar.

**O HTTP/2 que sumiu**

Usamos HTTP/2 na Alura há bastante tempo. [Somos mega fãs]. Poucos meses atrás um [update do Chrome] passou a exigir um protocolo mais moderno de negociação do HTTP/2 (o ALPN). Mas ele só funciona se o servidor tiver OpenSSL mais moderno. E a gente usava o Ubuntu LTS aqui que tava com OpenSSL antigo.

Conclusão: ficamos algumas semanas sem HTTP/2 no site até migrar toda a infra para um Ubuntu + OpenSSL recente. Mas como ficar sabendo disso? Afinal usávamos HTTP/2 aqui sem problemas por muito tempo. Só ficando de olho mesmo, monitorando.

**O GZIP que não era**

Nessa migração, atualizamos nossas configurações no servidor, onde usamos o **nginx**. E, claro, _beabá_ de performance, temos GZIP habilitado por lá. Mas comecei a reparar que nosso jQuery tava com mais de 90KB de transferência - e eu sabia que devia ser menos de 30KB. Um erro no arquivo do nginx e estávamos fazendo GZIP apenas de HTML e CSS. Tanto JS quando SVG, que se beneficiam bastante de GZIP, estavam de fora. Um fix de 1min que economizou uns 100KB pra todos os pageviews de alunos da Alura.

**O JS que sobrou**

E por falar em **pequenas ações com grandes ganhos**, outra que economizou mais uns 200KB pros usuários foi tirar um JS esquecido lá na página que era usado em uma funcionalidade que nem existia mais. Era um Google Charts que usamos uma época e nunca mais. Mas o JavaScript ainda estava lá. Pior: por descuido, era um [script blocante] no head. Ouch. 200KB inúteis de um request crossdomain travando a renderização. _Pra envergonhar qualquer especialista em performance._

Todas essas melhorias (e mais algumas) já estão no ar para todos os alunos. Mas o ponto é perceber como é fácil escorregar em algo e perder a mão com a performance do site. Coisas mudam, projetos crescem e, se não ficamos de olho, podemos estar perdendo oportunidades como essas - pequenas correções no projeto com grandes impactos na performance final sentida pelo usuário.

Se você se interessa por performance de Front-end, não deixe de conferir os 2 cursos na Alura **completíssimos** e com **notas altíssimas** dos alunos que fizeram. Sem querer nos gabar mas já nos gabando, com certeza são material referência na área no Brasil hoje; não há nada nem parecido por aí.

- [Curso online de Performance Web I: otimizando o front-end]
- [Curso online de Performance Web II: Critical Path, HTTP/2 e Resource Hints]





imagem 

Estou fazendo a manutenção de um ecommerce desenvolvido em C#, nele é feito o cadastro de pessoas onde é inserido o nome e o e-mail. Todos os dados são salvos em um arquivo CSV.

imagem com as promoções do mês para todos os e-mails cadastrados no ecommerce.

Quando tentamos enviar os e-mails, porém, acabamos tendo erro de envio porque o nome dos usuários veio junto com o e-mail:

Para mandar uma newsletter preciso pegar apenas o e-mail, então temos que fazer a separação dessas duas informações. Como podemos fazer isso?

## Fazendo a separação com Substring.

Temos algumas alternativas para pegar apenas uma parte de texto dentro de uma string. Porém, quando eu penso em fazer separações, logo penso em utilizar [SubString] pois este método faz a separação da string em uma subparte.

Para isso tenho que passar a posição inicial e final que quero separar.

Por exemplo tenho a seguinte string:

csharp

Para fazer a extração apenas do e-mail. Tenho que passar a posição inicial do e-mail e a posição final. Neste caso a posição inicial é a 6 que é o começo do e-mail e a posição final é a 15 que é quando acaba o e-mail.

csharp

Perceba que fazendo a utilização do Substring tenho um ponto ruim, pois, cada vez que eu tenho uma string de `pessoaRecebida` diferente, eu tenho que mudar os valores- das posições.

Vou tentar fazer a separação do e-mail da Leticia.

csharp

E vamos ter essa saída:

![]

Não era este tipo de saída que eu gostaria de obter, pois aqui eu tenho uma parte do nome e não tenho o e-mail completo.

Como a função SubString não conseguiu fazer a separação de modo correto, vou ter que buscar mais funções na documentação.

Eu preciso de algo que faça o corte entre o nome e o e-mail e então separe eles em dois. Mas será que existe alguma outra forma de fazer isso?

Ao rever a documentação achei a função Split que faz a separação também. Vamos entender um pouco mais das características dessa função e ver se encaixa melhor.

## Fazendo a separação com Split

Já que não conseguimos fazer a separação utilizando o SubString. Vamos fazer a separação usando o [**Split**] . Ele faz a separação dos valores conforme o parâmetro que indicamos ser o divisor da informação.

No nosso caso seria o `;` para fazer a divisão da string, pois esse é o elemento que divide o nome do e-mail na listagem do csv.

csharp

O Split vai nos devolver um array de string com duas posições, onde a primeira posição vai ser o nome e a segunda posição vai ser o e-mail. Aqui estamos pegando apenas o array de string por isto vai ser retornado o **System.String\[\]**, mas queremos pegar apenas o e-mail.

Como é um array eu posso selecionar apenas um dado, no nosso o dado do e-mail, que está na segunda posição do array.

csharp

Com isto toda a pessoa que recebermos iremos conseguir extrair o e-mail do CSV.

## Conclusão

Nós começamos com um CSV com vários tipos de dados, onde não podia ser feita a verificação do que era e-mail e o nome, pois, teríamos que pegar a separação do e-mail a mão.

Então teríamos que fazer a separação do dado que nós vamos receber. Optamos por utilizar o método SubString que faz a separação da string que passarmos em subpartes. Porém como o tamanho da string pode mudar, não seria uma boa utilização.

Com tudo isto, procuramos na documentação outro método para nos ajudar e achamos o Split.

Ele faz a separação conforme o valor que vamos passar como parâmetro, então independente do tamanho que nossa string tenha nós vamos conseguir fazer a separação dos valores.

E aí, o que achou do post? Fica até mais fácil trabalhar com datas no c# agora, não acha?Se quiser continuar estudando sobre o assunto, dê uma olhada em nossos cursos na Alura de [**C#**] continue aprendendo!





imagem 

Uma empresa de hospedagem está enfrentando um problema: o número de endereços IPs disponíveis está acabando. Sem endereços IPs, a empresa não pode ter novos clientes.

Essa empresa possui cerca de 5000 servidores dedicados para os clientes. Cada servidor tem um IP público, por isso ela tem uma faixa de IPs para comportá-los. Por exemplo, uma faixa de `250.127.1.x` a `250.127.20.x` endereços disponíveis.

Bem, se estamos sem endereços, podemos comprar mais. Porém descobrimos que [**acabaram os endereços IPv4 disponíveis**] para a América Latina. E agora, o que podemos fazer para ter novos endereços?

Já era esperado que os endereços **IPv4** fossem acabar. Por isso foi criado a nova versão do protocolo, o **IPv6**.

## Entendendo o IPv6

IPv6 nada mais é do que a nova versão dos endereços IP. Ele veio resolver alguns problemas que o IPv4 apresentava, como, por exemplo, o esgotamento de endereços IPv4 disponíveis.

Como o aumento do número de dispositivos conectados a internet, os endereços disponíveis foram chegando ao fim. Algumas técnicas como o [**NAT**] atrasaram um pouco a mudança, porém com o crescimento acelerado de dispositivos conectados, os endereços disponíveis foram acabando.

O computador entende bits. Ou seja, tudo que passamos para o computador é traduzido para zeros e um. Com os endereços IPs acontece o mesmo.

No endereço IPv4, por exemplo, `192.168.0.1`, temos quatro grupos, ou octetos, nos quais podemos utilizar números para escrever o endereço. Cada octeto é um conjunto de **oito bits**. Logo, temos **32 bits** disponíveis para escrever um endereço. Ou, aproximadamente, **4,2 bilhões de endereços**.

Já com o IPv6, temos oito grupos, porém esses grupos não são divididos em oito bits cada, mas em **16 bits**, separados por dois pontos (`:`). Portanto, temos **128 bits** disponíveis para escrever nosso endereço. Logo, temos, aproximadamente, **340 undecilhões de endereços**. Ou, **3,4 x 10^38** endereços.

Isso significa que temos endereços praticamente inesgotáveis. Por ser um valor muito grande, em vez de utilizar valores decimais, nós representamos os endereços IPv6 com valores hexadecimais. Ou seja, números de 0 a 9 e letras de A a F.

Cada grupo de 16 bits, também chamado de decahexateto, ou duocteto, possui quatro símbolos hexadecimais. Portanto, percebemos que cada símbolo hexadecimal representa 4 bits.

Sabendo disso, podemos escrever um endereço IPv6 dessa forma: `2001:0BAA:0000:0000:0000:24D2:12AB:98BC`. Oito grupos, com quatro símbolos hexadecimais separados por dois pontos (`:`).

> _"Esse endereço é muito maior que um endereço IPv4, não é complicado lê-lo?"_

De fato, os endereços IPv6 são maiores que os endereços IPv4, por isso foram criadas algumas regras de abreviação.

### Abreviando o IPv6

Nós podemos omitir os zeros a esquerda quando estamos escrevendo o endereço. Dessa forma, escrevendo novamente o endereço, teremos este resultado `2001:BAA:0:0:0:24D2:12AB:98BC`

Já fica um pouco menor, porém conseguimos encurtar mais o endereço. Quando temos uma sequência de blocos com valor zero, conseguimos abreviá-las digitando duas vezes dois pontos (`::`). Aplicando essa regra, nosso endereço fica assim:

`2001:BAA::24D2:12AB:98BC`

Contudo, devemos prestar atenção, pois essa regra só pode ser usada uma única vez. Isso porque se tivermos duas vezes essa abreviação, os equipamentos de rede não conseguirão saber a posição precisa de cada grupo.

Por exemplo, vamos imaginar o seguinte endereço:

`2001:AB14::1205::35FE`

Qual a posição do grupo `1205`? Esse endereço pode ficar tanto assim: `2001:AB14:0000:0000:1205:0000:0000:35FE` quanto assim: `2001:AB14:0000:0000:0000:1205:0000:35FE`. Por isso só podemos utilizar essa abreviação uma única vez.

Outra coisa que muda em relação ao IPv4 é a máscara de rede. No IPv6 utilizamos a [**notação CIDR**] para dizer qual parte do endereço pertence a rede e qual parte pertence ao host. Essa notação diz qual parte do endereço pertence a rede e qual pertence ao host.

Dessa forma, deixa de existir máscaras de sub-rede. Já que a identificação da rede está no próprio endereço.

Legal, já sabemos como funciona o endereço IPv6, mas como eu posso configurá-lo?

A configuração do IPv6 é parecida com a do IPv4. Vamos ver sua configuração em um roteador Cisco.

## Atribuindo o endereço no roteador

Nos roteadores Cisco, temos que entrar no modo de usuário privilegiado para começar a configurá-lo. Para isso, digitamos `enable` no terminal:

imagem pelo terminal (`terminal`):

imagem que receberá o IP, que, no meu caso, é a interface `gigabitEthernet 0/0`.

imagem. Ao invés disso, ele realiza o [**multicast**]. Por isso, alguns protocolos baseados em broadcast, como o [**ARP**], não existem na nova versão.

Alguns protocolos, como o [**ICMP**] e o [**DHCP**], receberam novas versões no IPv6, o ICMPv6 e o DHCPv6.

Além dessas, outras mudanças foram feitas. O cabeçalho do protocolo IPv6 tem menos campos que o do IPv4, bem como a segurança do IPv6 foi aumentada.

Contudo, mesmo com essas mudanças, o IPv6 foi feito para ter compatibilidade com todos os protocolos das camadas superiores do [**modelo OSI**].

As tecnologias estão em constante desenvolvimento. Por isso temos sempre que ficar nos atualizando para continuar no mercado.

Aqui na Alura, temos uma formação em [**infraestrutura de redes**]. Nela você aprenderá sobre os protocolos de comunicação, equipamentos de redes, como realizar a configuração dos equipamentos, além de ver questões de segurança e aprender a se proteger de possíveis ataques.





imagem 

Nós sabemos que esse início costuma ser um pouco difícil, pois você ainda está desenvolvendo suas habilidades e adquirindo experiência.

Se você usa o **software da Adobe** para produzir suas imagens, já deve saber que existem vários plugins e complementos com funcionalidades extras — tanto gratuitos quanto pagos. Talvez você já tenha experimentado um ou outro, mas ainda não sabe quais são os mais importantes.

Escolher os **melhores plugins para Illustrator** pode poupar boa parte do seu tempo de trabalho. Algumas funcionalidades são basicamente cerca de 10 coisas que já estavam no programa. Só que, em vez de selecionar uma ferramenta de cada vez, o plugin faz tudo em apenas um comando. Enquanto isso, outros plugins adicionam ferramentas inéditas à sua lista de recursos. Conveniente, não?

E para te ajudar a não se perder nesse mar de opções, trouxemos aqui alguns plugins básicos para Illustrator que podem te poupar horas de trabalho e melhorar a qualidade dos seus produtos. Confira:

## 1\. Metaball (Arc)

Volta e meia você vai precisar criar algumas formas mais suaves e curvas que são quase impossíveis de fazer direito à mão. Mas não importa o quanto você seja bom, nunca vai criar estas formas perfeitas manualmente. Felizmente, existe um plugin chamado **Metaball (Arc)** que serve justamente pra isso.

O trabalho desse complemento é, basicamente, ligar várias formas diferentes em uma única figura. É como criar aquelas linhas guias de formas geométricas e depois usá-las para criar o desenho final. Algo simples, mas que te poupa bastante tempo.

Normalmente, você teria que criar essas formas e depois preencher os espaços manualmente, terminando tudo ao apagar as linhas guias. Mas isso consome muito tempo e você tem que entregar esse serviço logo! Com esse plugin, você poupa o esforço e fecha mais um trabalho antes do fim de semana.

## 2\. Dup at Selected Anchor

Em alguns trabalhos, cada ponto de ancoragem de uma forma precisa ser preenchido com outra forma. Por exemplo, todas as patas e juntas de uma aranha precisam ter uma bolinha vermelha. Mais uma vez, você tem que pegar a forma que precisa, copiá-la várias vezes, arrastar, colocar no ponto certo etc. Ou você pode só usar o **plugin Dup at Selected Anchor.**

Pode não parecer um dos melhores plugins para [**Illustrator**], mas ele também vai te poupar uma ou duas horas de trabalho a cada projeto. Com ele, você pode selecionar a forma que deseja repetir e o objeto onde pretende inserir essas formas. Após a seleção, o plugin vai automaticamente colocar uma cópia em cada ponto de ancoragem da imagem desejada. Se você estiver lidando com um polígono com muitos pontos de ancoragem, esse recurso vai, no mínimo, poupar a dor dos seus tendões.

## 3\. MultiExporter

Em alguns momentos, você pode querer usar as várias camadas da imagem produzida separadamente, como o plano de fundo, os objetos principais etc. Talvez precise delas para outras edições ou só queira dar uma olhada com calma depois. Com o MultiExporter, você pode fazer isso tranquilamente.

O trabalho desse plugin é resolver exatamente o problema que descrevemos. Ele separa cada camada presente na edição e a salva em um arquivo PNG ou PDF único. Mais uma vez, pode não parecer relevante, mas se você tem uma figura com 100 camadas e só quer mostrar uma delas, vai ter que abrir todas e ficar sentado esperando. Então, abra só uma.

Todos esses plugins até agora são gratuitos. Mas, se você pretende ter credibilidade profissional, vai ter que pagar por outras funcionalidades mais polidas. Estes abaixo são os plugins pagos que mais podem te ajudar.

## 4\. VectorScribe V3

Em muitos projetos, o seu cliente pode precisar de uma imagem em vários tamanhos, ou mesmo uma definição grande demais para ser exportada no computador. Como você já deve saber, a solução aqui é usar imagens vetorizadas. **E o VectorScribe (volume 3)** é um plugin excelente para melhorar o resultado das suas figuras criadas em vetores.

Ele possui várias funcionalidades que aceleram a produção da imagem, como maior controle de pontos. Isso facilita o processo de edição e reduz o tamanho do arquivo final, o que reduz o tempo que você tem que esperar para enviar uma prévia, por exemplo.

## 5\. Gold Rush

Já notou como vários [**trabalhos de design**] usam tons metálicos variados e realistas para realçar as formas? Seria interessante se houvesse algum plugin que oferecesse esses efeitos, não é? Espera, existe sim! O **Gold Rush**.

Dentro desse pacote, você vai encontrar centenas de efeitos e cores metalizados e de glitter. O suficiente para praticamente qualquer projeto. Vários tipos de ouro, prata e bronze, além de muitos outros metais. E você certamente já sabe como uma imagem brilhante pode atrair a atenção do público.

## 6\. ColliderScribe V2

Alinhar diferentes formas para que se toquem delicadamente não é uma tarefa impossível. Mas haja paciência para dar zoom e alinhar tudo perfeitamente! Uma paciência que seus clientes nem sempre possuem. Para isso serve o **ColliderScribe**: facilitar as colisões entre as figuras.

Uma nova funcionalidade da versão 2 é a possibilidade de “rotacionar” uma forma ao redor de outra. Ao colidir dois círculos, por exemplo, você pode arrastar um deles pela superfície do outro. Assim, até os ajustes de posicionamento ficam mais fáceis.

## 7\. ArtBlue Gold 2.5

Agora, se você pretende investir pesado no [**trabalho de designer**], vai precisar de plugins mais robustos. Esse é o **ArtBlue Gold 2.5.**

Com ele você adquire muito mais opções de criação de formas, com muito mais precisão e detalhes. Você também pode usar o mesmo plugin para converter uma imagem simples em uma escultura complexa, ou integrá-la em uma estrutura 3D. O preço é mais salgado que a média, mas o retorno está à altura.

Agora que você conhece mais alguns plugins para Illustrator, é hora de fazer alguns downloads e melhorar seus produtos. Acha que mais pessoas podem aproveitar essa dica? Então compartilhe este artigo em suas redes sociais e mostre como é possível adicionar mais qualidade ao seu trabalho de designer.

Que tal utilizar esses conhecimentos no Illustrator e aprender a criar a identidade visual de um produto?

Aqui na Alura temos um curso onde você pode colocar na prática todo esse conhecimento com o Illustrator e [**aprender o processo de criação da identidade visual de uma marca**], desde de coletar informações a partir de um briefing, a escolha da tipografia, até a validação.





imagem 

Muitas pessoas utilizam seus celulares para realizar tarefas rotineiras, como ligações, envio de mensagens, postagens em redes sociais, escutar músicas, jogos e etc… Não é uma novidade a capacidade que temos com um celular, principalmente [o Android que desde 2017 possui mais de 2 bilhões de dispositivos ativos]!

Considerando o potencial desta plataforma, não à toa, muitas empresas investem pesado para fornecer aplicativos Android para seus clientes, seja um App simples ou complexo… E você? Também interessado em colocar em prática a sua ideia para o mundo Android? Então confira abaixo como você pode criar o seu primeiro App em Android!

## Android Studio: ferramenta de desenvolvimento

Assim como muitas linguagens de programação ou frameworks, no Android temos o Android Studio como IDE oficial para desenvolver Apps Android, a partir dele, somos capazes de criar os nosso Apps. Portanto, como primeiro passo faça [download] e [instale o Android Studio conforme o seu sistema operacional].

> Uma observação interessante é que o Android Studio é baseado no [**Intellij IDEA**] da Jetbrains que oferece o [**Toolbox**], um instalador de IDEs capaz de instalar as ferramentas da Jetbrains, inclusive, o Android Studio! É uma ótima alternativa para evitar passos manuais, comuns em sistemas Linux.

Após instalar o Android Studio e executar os passos iniciais de _wizard_ (famosos **_next_**s), chegamos na launcher (tela inicial) do Android Studio:

imagem, Wears (smartwatches), TVs, automóveis e IoT. Já as Activities, são entidades responsáveis em executar o App e apresentar a interface gráfica para o usuário.

Portanto, podemos escolher, por exemplo, o modelo **Empty Activity** que cria toda estrutura da Activity, porém com um visual vazio pronto para ser editado. Após selecionar a opção, basta clicar em **Next**:

### Configurações do projeto

imagem

A escolha de linguagem vamos manter o Java, considerando que ele é a opção padrão durante a configuração.

> A partir desta opção, somos capazes de configurar a famosa [linguagem Kotlin] para Android.

### Definindo API mínima

Na API mínima, indicamos qual a versão mínima do Android vamos dar suporte, no exemplo está marcando a opção 4.4 que representa a API 19 do Android SDK. Você pode escolher a API que deseja, a única observação é quanto mais recente for a API mínima, menos usuários seu App vai atender.

> Para um auxílio na escolha, você pode clicar em **Help me choose** que apresenta uma nova janela indicando a porcentagem de dispositivos ativos com base na versão desejada.

Por fim, temos os _checkbox_ para configurar o [**instant App**] e [**AndroidX**]. Considerando que estamos nos primeiros passos, podemos ignorar esses campos que podem ser vistos em um segundo momento. Então clicamos em **Finish**:

imagem` que representa o estado de criação da Activity:

> "Como assim o estado de criação?"

## Estado criação da Activity

Se explorarmos o pacote **br.com.alura.tarefas**, a única classe existente é a `MainActivity` e, mesmo sem um método `main()`, o projeto consegue ser executado!

Isso acontece pelo fato de que o Android como sistema operacional, gerencia a criação das Activities e permite a adição de comportamentos a partir da sobrescrita dos seus estados.

Portanto, qualquer instrução dentro do `onCreate()` será executada durante a criação da Activity!

Inclusive, perceba que temos o método `setContentView()`, responsável em configurar o visual da Activity, com o argumento `R.layout.activity_main`. Este argumento representa o layout gerado a partir do modelo **Blank Activity**.

## Editando o layout da Activity

Para editar o layout, podemos acessar o arquivo dentro de **res** > **layout** > **activity_main.xml**:

![]

Ao abrir o arquivo, temos acesso ao editor visual do layout! A partir dele, podemos modificar o conteúdo do texto apresentado na tela que é representado pelo componente TextView.

Ao clicar no TextView temos acesso aos seus atributos, dentre eles, o **text** que está mantendo o texto **Hello World!**, portanto, ao modificar esse atributo:

![]

Somos capazes de adicionar a nossa tarefa! Nesse caso a **Estudar Android**. Com essa modificação temos o seguinte resultado ao executar o App novamente:

![]

A nossa tarefa aparece conforme o esperado!

## Conclusão

Com certeza não estamos limitados apenas a editar um layout e apresentar uma mensagem, somos capazes de implementar outros comportamentos, como uma lista ou formulário.

Interessado em aprender como é possível evoluir nesta área de desenvolvimento de software? Então confira a [**formação Android da Alura**] que, além de explicar passo a passo do que foi feito por debaixo dos panos durante a criação do projeto, também ensina como criamos layouts, implementamos listas e formulários comuns em qualquer App.





imagem 

Como o próprio nome diz, esse é um evento mundial que acontece anualmente, sempre próximo do dia 25 de janeiro. Depois de dez edições, a Global Game Jam já faz parte do calendário de muitos desenvolvedores de jogos, profissionais ou amadores, pelo mundo inteiro.

Apesar do evento não ser a única Game Jam no mundo, ela é a maior. Em 2018, participaram 42,800 "jammers" e foram feitos 8,606 jogos, em 108 países diferentes - doze países a mais que no ano passado.

Para conseguir organizar um evento desse tamanho, os criadores da GGJ pedem ajuda para a organização de sedes regionais, ao redor do mundo inteiro. Essa sedes servem de local de encontro para os participantes e quem tem interesse em participar, pode ir até uma, ou criar sua própria sede.

Esse ano, o Brasil teve 48 sedes oficiais da GGJ, sendo que a maior delas, a sede localizada na PUC Paraná, teve 474 participantes e foi a [quarta maior sede] do mundo. Além da sede de Curitiba, o Brasil teve sedes em São Paulo, Rio de Janeiro, Recife, Brasília, Florianópolis, etc… A lista completa você encontra no próprio site da [GGJ].

Quem participou do evento nesse ano, chegou na sede escolhida por volta da 17:00PM da sexta-feira ( 26\\01 ) e assistiu ao vídeo de abertura da Jam:

https://www.youtube.com/watch?v=3Roxls_2W2M

Desta vez, o tema escolhido foi "Transmissão". Para anunciar o tema, o vídeo mostrava ondas de rádio, engrenagens, cabos de fibra ótica, etc… A proposta do tema é ser realmente abrangente, já que 40 mil pessoas vão utilizar esse único tema para criarem seus jogos.

Outra estratégia dos organizadores da Jam é colocar pequenos desafios opcionais para os desenvolvedores. Esses "[diversificadores]", como são chamados, podem ser aplicados nas diversas áreas que envolvem a criação de um jogo - Programação, Arte, Música, Design, Narrativa, etc...

Falando em diversas áreas do conhecimento, a criação de um jogo é, por essência, multidisciplinar, e por isso, a variedade de profissionais que se reúnem em eventos como esse é gigante. Participam da GGJ programadores, artistas, modeladores 3D, músicos….

Além da diversidade de habilidades, encontramos pessoas com diferentes níveis de experiência dentro de cada área. Desde novatos\\estudantes até profissionais com anos de experiência desenvolvendo jogos.

A diversidade possibilita a troca de experiências entre todos os participantes de uma Jam que têm o desafio de criar um jogo do zero, isso cria um clima muito agradável para o evento, fazendo com que ele cresça a cada ano.

**_Mas, então, como é participar de uma Jam?_**

Participar de uma Jam, qualquer que seja, é muito divertido. Criar um jogo não é uma tarefa fácil e por isso mesmo o desafio, de criar um em 48 horas, é grande.

Depois que o tema é liberado, no final da tarde da sexta-feira, cada equipe se junta para discutir o que aquele tema traz de familiar, novo, inusitado e as possibilidades que cada um vê para a criação de um jogo.

A discussão sobre, o quão grande é o jogo que a equipe vai tentar fazer, habilidades individuais de cada membro e organização do grupo, acontece nesse momento inicial do evento. Aqui, todos estão com ideias na cabeça e tensos, pensando que em dois dias um jogo deve estar pronto.

Eu e minha equipe, seguimos o mesmo caminho. Nos juntamos para discutir as ideias que tinham surgido durante a apresentação do tema e começamos a pensar em vários jogos diferentes.

Passamos por jogos de espionagem, _party games_ simulando um pega-pega em que o pegador espalhava uma doença para os outros, jogos de _puzzle_, um personagem viajando nas ondas de rádio… A quantidade de ideias possíveis com um único tema é enorme, ainda mais sendo um tema tão abrangente.

Depois que o grupo decidiu qual jogo faríamos, começamos a pensar na organização da equipe. Inicialmente, éramos em 3 e cada um teria suas responsabilidades na criação do nosso jogo.

Quando terminamos de definir o escopo do jogo e qual seria nosso cronograma, começamos a produção de fato. Eu segui fazendo a programação, utilizando apenas cubos enquanto esperava os modelos 3D que íamos implementar mais tarde.

A produção da sexta-feira foi até as duas horas da manhã, quando decidimos que estava tarde demais para continuar e que a equipe como um todo, precisava descansar. Apesar das poucas horas que trabalhamos no jogo, começávamos a ver algo palpável que mais pra frente iria se tornar um jogo.

Sábado de manhã, retomamos a produção do jogo, e por volta do meio da tarde, tínhamos nosso primeiro protótipo jogável. Ainda não tínhamos todos os modelos 3D, mas já conseguimos ter uma noção de como o jogo ficaria.

Como falei, inicialmente éramos em 3 pessoas mas, surgiram ideias novas durante a produção do jogo e com isso pedimos ajuda para um outro amigo gravar algumas falas para um personagem do nosso jogo.

Com o resto do tempo, acabamos refinando o protótipo base do jogo, adicionamos as falas que foram gravadas e no final do domingo mais um amigo veio ajudar com a interface gráfica e o logo do jogo. Depois de todo trabalho que tivemos, nos juntamos com o resto dos participantes da GGJ da nossa sede - Fatec São Caetano do Sul - para a apresentação dos jogos que foram feitos.

Afinal, depois de trabalhar durante 48 horas no seu jogo, você vai querer mostrar ele para alguém. No final do domingo, todas as equipe são convidadas a apresentar seus jogos para os outros participantes daquela sede. Além disso, os jogo ficam disponíveis no [site oficial da Global Game Jam].

A apresentação dos jogos foi até a noite, por causa da grande quantidade de jogos que foram feitos nessa sede. Todas equipes estavam cansadas mas, a satisfação de ter ao menos um protótipo de jogo feito em 48 horas é tanta que o clima era de festa.

![]

**_Gostou da proposta da Global Game Jam?_**

Se você já desenvolve jogos, essa é uma ótima opção para conhecer outros desenvolvedores e criar um portfólio. Se você não sabe como desenvolver um jogo, mas tem interesse em aprender, temos cursos aqui na Alura para você aprender a desenvolver em [**Unity**] e em [**Cocos Creator**], duas engines muito legais para quem está começando.

**_Não quer esperar até o ano que vem para ver o que foi feito na Global Game Jam 2018?_**

No dia 20 de fevereiro teremos um encontro de desenvolvedores com a proposta de mostrarmos nossos jogos feitos durante a Global Game Jam. Se você participou, ou só quer ver os jogos que foram feitos, participe do [14° Encontro Game Developers Brazil] às 19 horas, na rua Vergueiro 3185 - 2° Andar - proximo ao metro Vila Mariana.




Quando trabalhamos com sequências de dados que representam pontos no tempo (time series) é muito comum entender o crescimento de um valor em função do tempo. Por exemplo, o preço de um produto ou uma ação que antes era 100 e agora 110 cresceu `110/100 - 1 = 10%`, e depois se caiu para 105, caiu `105/110 - 1 = -4%`.

Portanto a fórmula geral é `valor / valor_anterior - 1`. Em python podemos gerar alguns dados aleatórios:

python

![]

Como o valor da linha n+1 vai ser dividido pelo valor da linha n temos algo como:

python 

![]

Mas, claro, como toda boa análise básica de time series, o pandas já fornece uma função do gênero para trabalharmos:

python 

![]

[**Você pode encontrar o notebook com o código aqui**]. [**E para saber mais sobre numpy, pandas e muito mais em nossos cursos de data science na Alura**].




A pergunta do aluno Henrique Lopes é útil para todos nós que queremos ganhar experiência ao mesmo tempo que estudamos:

https://www.youtube.com/watch?v=uqp5-F2_-lU

Adorei a pergunta, Henrique! Nós temos a impressão de que estudar não é ganhar experiência, não é praticar. Isso depende de sua fonte de estudo. O que tentamos fazer aqui no Alura é que em tudo curso damos um projeto para você executar, para que o estudo tenha uma prática junto com ele. 

Conversando com os professores, e os alunos percebem também, percebi que esse guia é bom para mostrar o que o aluno deve ou não aprender naquele instante praticando tudo isso e passando por problemas do mundo real. Não é à toa que os professores sofrem junto com os alunos.




Dia 1º de Março a gente [**lançou o novo site da Alura**]. Além do fantástico novo visual, muita gente reparou nos diversos outros detalhes: subdomínio separado da plataforma de aulas, a performance fenomenal do site novo, o design responsivo etc. Neste post quero discutir um pouco da Arquitetura do novo site e como chegamos nesses resultados.

imagem 

## A decisão de separar o site da plataforma

Historicamente, a Alura todo era um grande monolito escrito em [**Java**]. Isso inclui o site de vendas, páginas de marketing, a plataforma de cursos, o sistema de pagamentos e até códigos  do [**MusicDot**]. É ruim porque temos muita gente mexendo no código, porque o deploy é demorado, a disponibilidade é uma só (se cair, cai tudo de uma vez).

Na nova reformulação, resolvemos quebrar um pouco. O site externo agora é **um projeto separado da plataforma de cursos**. Em [www.alura.com.br] fica o site externo, com foco em apresentar e vender a Alura, em SEO, em marketing. E no [cursos.alura.com.br] fica a plataforma de cursos, focado em apresentar as aulas, exercícios, fóruns etc.

imagem.

[**Há 7 anos que usamos o Google App Engine na Caelum**]. E com **muito** sucesso. Na minha opinião, é o **único PaaS de verdade** no mercado. Escalabilidade barata e 100% transparente. Zero trabalho de manutenção de infra. Deploy instantâneo com escalabilidade infinita. Resolvemos ir para o GAE no novo site da Alura.

imagem. Com isso tira-se o foco de otimizações básicas como simples concatenações. E entram em cena recursos ultra bacanas como [**Server Push**]. Isso tudo merece um post a parte para mostrar o impacto de se usar HTTP/2.

## Integração entre sistemas

Um último ponto que vale a pena destacar é que o site da Alura não possui banco de dados,um admin ou back-end complexo. Todo o cadastro de dados, como as informações dos cursos, continua na plataforma de cursos. O site externo consome esses dados através de uma nova API REST que a plataforma expõe.

Por exemplo, para saber os valores atuais dos planos de assinatura, chamamos [https://cursos.alura.com.br/api/planos].

No lado do site da Alura, fazemos um GET para essas URLs de tempos em tempos usando [Cron jobs] e [Task queues] do App Engine. Os dados são então salvos no [Google Cloud Storage] e cacheados no [Memcache] do GAE para acesso rápido.

## Mais sobre o projeto

O projeto do novo site da Alura começou a sair do papel no final de 2015 com a [criação e design]. Muitas pessoas participaram da implementação. Na equipe de front-end estavam [Fernando Stefanini], Jana Paradiso e Yuri Padilha. No back-end e APIs, [Philippe Ehlert], Rodrigo Turini, Felipe Oliveira e [Caio Incau]. Além de [Caio Souza] na reorganização do conteúdo e dos designers [Thiago Vilaça] e [Fabio Gushiken].

Muitas outras coisas bacanas aconteceram no projeto. Fizemos uma implementação **responsiva** **mobile-first**, usando **flexbox** no CSS, sistema de ícones em **SVG. **Fizemos várias otimizações para ficar com [**excelente performance**]. Nos próximos dias vamos contar mais detalhes sobre o site.

O mais bacana ainda é que tudo o que ensinamos nos nossos cursos foram usados extensivamente na prática. Pegamos esse conhecimento prático e trouxemos para os nossos [**cursos de Frontend da Alura**] e [**presenciais da Caelum**], onde você vai poder aprender todos esses conceitos e aplicar nos seus projetos.

E você, o que achou do site? E das nossas decisões arquiteturais? Vem aprender tudo isso com a gente.




De tempos em tempos surgem novas maneiras de como pegarmos feedback e permitirmos que os alunos contribuam com o crescimento da plataforma, do conteúdo e da comunidade. Recentemente lançamos uma funcionalidade de sugestão de correção de textos, já temos a de sugestão de cursos, e no fim do ano passado resolvemos pesquisar a escolha dos alunos: o que eles mais gostaram no ano de 2015!

O feedback de vocês é importantíssimo para nos servir de guia de como criar um melhor ensino para que possam crescer através das ferramentas que disponibilizamos.

É com orgulho que compartilho com vocês, primeiramente, as escolhas de vocês!

## Melhor Instrutor

Vocês escolheram o melhor instrutor geral e... ops, ganhei! Fica o desafio para meus colegas: \*quero\* que me passem em 2016!

1\. Guilherme Silveira 2. Mauricio Aniche 3. Flavio Almeida

## Melhor Instrutor Estreante

1\. Eduardo Guerra - [cursos de Thread e Reflection em Java] 2. Viviane Martins e Renan Saggio - [3 cursos de Excel], e [diversos cursos de PHP] 3. Rodrigo Gunisalvo - [curso de Arduíno]

## Melhores cursos/trilhas

1\. [AngularJS] - Um curso que, sozinho, ganhou de duas trilhas! 2. [Trilha Java] - A trilha que dá a base de Java para todas as especializações do mercado. 3. [Trilha Certificação Java] - A trilha que fornece o treinamento necessário para um desenvolvedor que entender a linguagem por trás e, de quebra, treina para a certificação da Oracle.

## Melhores momentos de erro e risada

Vira e mexe tem um errinho que passa despercebido. Qual foi o ganhador?

1\. "Não encontrei nenhum erro" - Uhu! Para nossa felicidade, mais de 90% respondeu que não encontrou erros 2. "A cara do Guilherme Silveira quando errava alguma fala no curso de jQuery" - Parece que eu faço muitas caretas no curso de jQuery, será?

Outros pequenos erros ou momentos engraçados foram citados mas isoladamente (uma única vez cada um). Pelo jeito somente minhas caretas que deixam marcas na memória dos alunos.

## Projeto mais interessante

1\. [AngularJS] - Parece que o Flávio acertou em cheio com o curso. Novamente o curso estreante ganhou disparado! 2. [Bootstrap] - Front-end mostrando sua força, com um projeto bem rico e real. 3. [Photoshop para a web] - Agora é Design mostrando suas garras, com um outro projeto real.

## Exercícios mais interessantes

1. [Angular] - A equipe de criação do Rio está de parabéns, seus exercícios são criados em grupo por uma equipe grande, por um processo que faz inveja a nós professores da equipe de criação de São Paulo. Parabéns, novamente ganhando de duas trilhas inteiras! 

2. [Trilha Java] - A formação Java fornece a base, mas já do começo tentamos colocar exercícios que recriam problemas reais. A didática da Caelum, a plataforma do Alura! 

3. [Formação Front End] - A trilha que permite novos alunos aprenderem a base e irem bastante além: do HTML ao AngularJS, há muito o que aprender com os exercícios práticos e reais dessa trilha.

Queria também compartilhar um pouco da minha experiência coordenando em 2015 junto com o Mauricio Aniche em São Paulo e o Nico Steppat no Rio de Janeiro as duas equipes de criação de conteúdo. Mas este post é de vocês, minha experiência e sugestões fica para a próxima!





Conhecer as funções pré definidas do SQL nos ajuda a ter mais produtividade no dia a dia,nesse artigo vou mostrar como utilizar funções de agregação com **GROUP BY**.

Eu criei uma tabela `livros` e inseri todas as compras que realizei:

sql
sql

Ótimo! Os livros que eu comprei estão bem organizados. Posso até fazer **queries** para verificar, por exemplo, quais foram os livros que eu paguei mais de R$ 30,00:

sql
sql
sql
Porém, agora eu queria saber quanto gastei com todos os livros que paguei acima de R$ 30,00. Ou seja, quero fazer uma soma! Como podemos fazer isso no SQL? É muito simples: já existem funções pré-definidas pelos bancos de dados realizar cálculos. Podemos, por exemplo, usar a **função SUM** para somar:

sql
sql
Essas funções são chamadas de [**funções de agregação**]. Elas agrupam todas as linhas encontradas e retornam apenas uma única linha com o resultado da operação solicitada. Nesse caso, uma soma :)

Consegui verificar o quanto gastei com livros acima de R$ 30,00, mas agora eu preciso saber o quanto gastei por mês! Na minha tabela as datas são completas, ou seja: tem dia, mês e ano. Mas, nesse caso, preciso apenas do mês...como podemos retornar apenas o mesmo de uma data? Simples! Da mesma forma que o banco de dados forneceu uma função para somar, ele também fornece uma função para devolver o mês de uma data! Utilizamos o **MONTH() que extrai o mês de uma determinada data**:

sql
sql

Então, agora que sabemos como somar e como pegar o mês, basta juntar as duas funções! Vamos fazer nossa nova query:

sql
sql

Ué, apenas mês 12? E R$ 202,40 apenas no mês 12? Eu tenho quase certeza que não foi tudo isso. Vamos filtrar essa query para retornar apenas os livros comprados no mês 12:

sql

sql

O que será que está acontecendo? Será que não podemos exibir mais de uma linha com uma função de agregação? Muito estranho isso. Como vimos, as funções de agregação a princípio retornam **apenas uma única linha**. O que precisamos fazer é informar que queremos **agrupar** as linhas por mês **soma-las**! Para isso, utilizaremos a instrução `GROUP BY` informando qual coluna queremos que seja agrupada:

sql
sql

Excelente, veja que agora conseguimos verificar quanto foi gasto por mês!

Vimos que quando utilizamos funções de agregação(como `SUM()`) por padrão o branco nos retorna apenas **uma única linha** com o resultado de todas as linhas que foram encontradas. Mas, se quisermos que a função agrupe por diferente de uma outra coluna(como o mês), precisamos informar que essa coluna será **agrupada** utilizando a instrução `GROUP BY`.

E aí, gostou da função `SUM()` e o `GROUP BY`? Está pronto para utilizá-la em seu banco de dados? O que acha aprender mais funções de agregação para criar queries mais robustas e inteligentes? Temos [**vários cursos de SQL**] na **Alura** para que você aprenda desde queries mais básicas até as mais complexas!




Muitas vezes quero me comunicar com os clientes ou estudantes de tecnologia do Brasil e, para isso, uso o e-mail, claro. O _[Mailchimp]_ é uma das ferramentas que permite o envio de e-mails para um grupo grande, mas um dos problemas é que à medida que o número de pessoas que querem nos escutar aumenta, maior a chance dos servidores de e-mail acharem que elas não nos deram permissão para esse envio.

Isto é, mesmo que o assinante de uma lista de _newsletter_, ou de uma automação, queira o nosso e-mail e tenha confirmado, existe ainda uma boa chance de um servidor como o _Gmail_ considerá-lo_ spam_.

Existem dois passos simplíssimos que uso para evitar que os servidores classifiquem meu e-mail (que o assinante pediu!) como _spam_... e eles estão ligados a conhecer melhor quem está recebendo o e-mail. Se você conhece o nome de quem o está recebendo, o _Gmail_ e outros servidores sabem que a chance é menor de você estar espameando aleatoriamente... então vamos pedir o nome dos assinantes... e usá-los!

## Passo 1. Pedir o nome de nossos assinantes

Em meus formulários de cadastro, eu peço o e-mail e o nome da pessoa, como neste **[aqui]**, onde cadastramos pessoas interessadas em aprender boas práticas de Javascript. Para fazer isso, basta usar o editor de formulário de uma lista do _Mailchimp_, escolha sua lista e clique em _Settings > Singup Forms > General Forms edit_:

imagem que foi usado. Pelo padrão do _Mailchimp_ é FNAME:

![Customizando o TO]

A partir de agora, todas as suas campanhas saem com o nome bonitinho do assinante. Se ele não preencheu e o campo era opcional, ele sai como antes, para o e-mail puro, seco.

Pronto! Dois passos super simples que ajudam a diminuir a taxa de marcação de _spam_ automático pelos servidores e, consequentemente, permitem aumentar a taxa de abertura dos e-mails que o assinante queria receber. Afinal, se ele pediu, temos que nos esforçar para entregar o que ele quer!

Lembre-se, claro, de sempre usar ferramentas de e-mail marketing para aquilo que o assinante tem vontade de receber, se não, é natural que ele marque como _spam_.

Essas são duas das dezenas de técnicas que peguei no dia a dia estudando e praticando _inbound marketing_. Se você quiser aprender diversas outras, dê uma olhada no meu [**curso de boas práticas em mail marketing**].





imagem 

O portfólio, para o designer, é tão determinante quanto a apresentação de um currículo. Confira dicas para criá-lo.

Imagine que uma proposta de freelance, ou mesmo de emprego, surge e você precisa entregar seu portfólio para avaliação. Quando o cliente abre o portfólio, encontra algo mais ou menos assim:

imagem para que outras pessoas encontrem seu trabalho também.

Mas a maior dúvida é: Como criar um bom portfólio? Neste post vamos entender alguns passos essenciais para chegar a isso! ;)

## Planeje o que irá exibir

Devemos primeiro ter em mente que nosso portfólio é nossa vitrine, portanto, assim como lojas usam estratégias para expor seus produtos de maneira atrativa para os consumidores,precisamos planejar o que queremos valorizar e o que podemos excluir da nossa apresentação.

### Os melhores projetos

Comece selecionando os projetos mais relevantes até então em sua carreira, ou os que você mais valoriza (seja por algum apego afetivo, complexidade, etc). Considere apresentar entre 10 ou 15 projetos, mais ou menos.

Depois disso, alinhe as características que tornam esse projeto tão bom para ser adicionado em sua "vitrine".

## Definindo as principais características

**_O que você gostaria de contar sobre seu projeto?_**

Para ter uma definição mais precisa do que quer apresentar, faça um breve levantamento de tópicos relevantes a serem apresentados sobre o projeto escolhido, como:

- Por que escolhi estas cores para a identidade visual da empresa?
    
- Qual a motivação para este formato de logo?
    
- Quais os pontos altos do projeto? As peças gráficas? A estratégia utilizada?
    
- Que ferramentas utilizei, Photoshop, Illustrator, After Effects?
    

Este é o momento de adicionar e retirar ideias, até encontrar um roteiro enxuto e objetivo, que apresente seu produto de forma clara e eficiente, conceituando o que foi feito.

Podemos então começar a destrinchar o que foi levantado em etapas mais concretas, como: Definição conceitual, processo criativo, características, protótipos navegáveis, etc.

**Cada projeto demanda de etapas diferentes a serem apresentadas, mas pode ser uma boa ideia utilizar no máximo 4 ou 5 divisões, para não deixar a apresentação muito longa também.**

Porém, existem algumas etapas que poderão ser muito relevantes na maior parte dos projetos.

### Contexto da produção

Pode ser interessante, logo no começo, fazer uma breve contextualização do que foi feito para chegar ao resultado final. A inspiração, conceitos trabalhados, ideia inicial, entre outras motivações que auxiliem na compreensão do projeto como um todo.

### Processo criativo

Uma boa tática é mostrar, sucintamente, o processo que te levou àquele resultado. Temos bons exemplos como os da [Andrea Avedissian] e do [Vinicius Sampaio], respectivamente, por exemplo:

![]

![]

Note que as intenções aqui ficam mais claras. Para o cliente que ainda não conhece sua forma de trabalho, entender a maneira como você organiza suas ideias pode ser uma boa ideia na hora de demonstrar seu estilo de trabalho.

### Mockups

A percepção que temos de um arquivo apresentado de forma como o enviamos para uma gráfica, por exemplo, passa uma sensação muito mais abstrata do que quando aplicada à um [**mockup**], ou seja, simulações do produto aplicado a um contexto. Veja este exemplo:

**ARQUIVOS PERSONALIZADOS PARA ÁLBUM**

![]

**MOCKUP DO ÁLBUM**

![]

Pode parecer algo trivial, mas note como esta simulação dá uma noção muito mais concreta da peça final.

E não precisamos nos limitar a imagens estáticas! Pode ser um recurso legal tentar alguns mockups interativos como gifs ou outras opções que deixem a apresentação mais interessante e convidativa.

![]

O mais legal é que essa tática serve para projetos reais e também para trabalhos "fictícios" - como redesign de grandes marcas - ou mesmo projetos acadêmicos.

Outra alternativa é, se tiver acesso à sua peça final, expor fotografias e vídeos do produto, desde que bem produzidos, reforçando a ideia de profissionalismo com o trabalho concluído.

## Outras considerações importantes

É importante deixar a apresentação dos seus projetos bem equilibrada, mas também é igualmente importante considerar pontos como a elaboração de um "Sobre mim" que resuma de forma clara e objetiva seus interesses e área de trabalho.

Neste ponto, quem define a linguagem a ser utilizada é você mesmo, mas as mesmas considerações que costumamos fazer em currículos como evitar erros gramaticais ou muitas gírias, por exemplo, cuide de sua descrição focando em passar uma imagem honesta e positiva de si mesmo.

Além disso, antes de publicar seus trabalhos, pense em questões como direitos autorais, categorias dos projetos, pessoas envolvidas, informações confidenciais, entre outros pontos que possam comprometer seus projetos futuramente.

## Mas, onde criar meu portfolio?

Se fizermos uma pesquisa rápida no Google encontraremos [**uma série de plataformas**] muito boas para a produção de um portfolio de qualidade.

Mas, obviamente, cada plataforma terá diferentes características e limitações, portanto, é importante estudar um pouco as opções, antes de sair montando seu portfolio na primeira plataforma que aparecer pela frente.

Considere questões como:

- Quero uma plataforma que também ofereça vagas de emprego relacionadas com a minha área?
    
- Seria ideal ter uma página que posso personalizar o layout?
    
- Estou disposto a gastar quanto?
    

Enfim, são muitos os pontos a se refletir antes de criar um portfolio, mas, independente da escolha, tenha em mente que a apresentação dos materiais criados será sempre um fator importante.


Para deixar seus projetos ainda mais atrativos e demonstrar suas diversas habilidades, apresente materiais feitos com diferentes ferramentas! Na Alura temos diversos cursos de Design sobre como trabalhar com ferramentas voltadas para [**materiais impressos**], [**audiovisual**] ou mesmo de [**design para web**].




# Programação orientada a objetos e programação estruturada

Como a maioria das atividades que fazemos no dia a dia, programar também possui modos diferentes de se fazer. Esses modos são chamados de **paradigmas de programação** e, entre eles, estão a **programação orientada a objetos** (POO) e a programação estruturada. Quando começamos a utilizar linguagens como Java, C#, Python e outras que possibilitam o paradigma orientado a objetos, é comum errarmos e aplicarmos a programação estruturada achando que estamos usando recursos da orientação a objetos.

Na programação estruturada, um programa é composto por três tipos básicos de estruturas:

- sequências: são os comandos a serem executados
- condições: sequências que só devem ser executadas se uma condição for satisfeita (exemplos: `if-else`, `switch` e comandos parecidos)
- repetições: sequências que devem ser executadas repetidamente até uma condição for satisfeita (`for`, `while`, `do-while` etc)

Essas estruturas são usadas para processar a entrada do programa, alterando os dados até que a saída esperada seja gerada. Até aí, nada que a programação orientada a objetos não faça, também, certo?

A diferença principal é que na programação estruturada, um programa é tipicamente escrito em uma única rotina (ou função) podendo, é claro, ser quebrado em subrotinas. Mas o fluxo do programa continua o mesmo, como se pudéssemos copiar e colar o código das subrotinas diretamente nas rotinas que as chamam, de tal forma que, no final, só haja uma grande rotina que execute todo o programa.

<p align="center"><img alt='Fluxograma de um programa estruturado. Depois de começar, o programa lê dois números A e B, verifica se A é divisível por B e, se for, imprime "A é divisvel por B", senão imprime "A no é divisível por B".' src="assets/poo-programacao-orientada-a-objetos/fluxograma.png"/></p>

Além disso, o acesso às variáveis não possuem muitas restrições na programação estruturada. Em linguagens fortemente baseadas nesse paradigma, restringir o acesso à uma variável se limita a dizer se ela é visível ou não dentro de uma função (ou módulo, como no uso da palavra-chave `static`, na linguagem C), mas não se consegue dizer de forma nativa que uma variável pode ser acessada por apenas algumas rotinas do programa. O contorno para situações como essas envolve práticas de programação danosas ao desenvolvimento do sistema, como o uso excessivo de variáveis globais. Vale lembrar que variáveis globais são usadas tipicamente para manter estados no programa, marcando em qual parte dele a execução se encontra.

A **programação orientada a objetos** surgiu como uma alternativa a essas características da programação estruturada. O intuito da sua criação também foi o de aproximar o manuseio das estruturas de um programa ao manuseio das coisas do mundo real, daí o nome "objeto" como uma algo genérico, que pode representar qualquer coisa tangível.

Esse novo paradigma se baseia principalmente em dois conceitos chave: **classes** e **objetos**. Todos os outros conceitos, igualmente importantes, são construídos em cima desses dois.

# O que são classes e objetos?

Imagine que você comprou um carro recentemente e decide modelar esse carro usando programação orientada a objetos. O seu carro tem as características que você estava procurando: um motor 2.0 híbrido, azul escuro, quatro portas, câmbio automático etc. Ele também possui comportamentos que, provavelmente, foram o motivo de sua compra, como acelerar, desacelerar, acender os faróis, buzinar e tocar música. Podemos dizer que o carro novo é um *objeto*, onde suas características são seus *atributos* (dados atrelados ao objeto) e seus comportamentos são ações ou *métodos*.

Seu carro é um objeto seu mas na loja onde você o comprou existiam vários outros, muito similares, com quatro rodas, volante, câmbio, retrovisores, faróis, dentre outras partes. Observe que, apesar do seu carro ser único (por exemplo, possui um registro único no Departamento de Trânsito), podem existir outros com exatamente os mesmos atributos, ou parecidos, ou mesmo totalmente diferentes, mas que ainda são considerados *carros*. Podemos dizer então que seu objeto pode ser classificado (isto é, seu *objeto pertence à uma classe*) como um carro, e que seu carro nada mais é que uma *instância* dessa *classe* chamada "carro".

<p align="center"><img alt='Imagem com dois retângulos lado a lado. O primeiro representa uma classe, apenas contorno do desenho de um carro; o segundo representa um objeto, com três carros desenhados.' src="assets/poo-programacao-orientada-a-objetos/class-analogy.png"/></p>

Assim, abstraindo um pouco a analogia, uma classe é um conjunto de características e comportamentos que definem o conjunto de objetos pertencentes à essa classe. Repare que a classe em si é um conceito abstrato, como um molde, que se torna concreto e palpável através da criação de um objeto. Chamamos essa criação de *instanciação da classe*, como se estivéssemos usando esse molde (classe) para criar um objeto.

## Exemplo em Java
```
public class Carro {
    Double velocidade;
    String modelo;
    
    public Carro(String modelo) {
        this.modelo = modelo;
        this.velocidade = 0;
    }
    
    public void acelerar() {
        /* código do carro para acelerar */
    }

    public void frear() {
        /* código do carro para frear */
    }

    public void acenderFarol() {
        /* código do carro para acender o farol */
    }
}
```

## Exemplo em Python
```
class Carro:
    def __init__(self, modelo):
        self.modelo = modelo;
        self.velocidade = 0

    def acelerar(self):
        # Codigo para acelerar o carro

    def frear(self):
        # Codigo para frear o carro

    def acenderFarol(self):
        # Codigo para acender o farol do carro
```

# Encapsulamento, herança e polimorfismo: as principais características da POO

As duas bases da POO são os conceitos de classe e objeto. Desses conceitos, derivam alguns outros conceitos extremamente importantes ao paradigma, que não só o definem como são as soluções de alguns problemas da programação estruturada. Os conceitos em questão são o *encapsulamento*, a *herança*, as *interfaces* e o *polimorfismo*. 

## Encapsulamento

Ainda usando a analogia do carro, sabemos que ele possui atributos e métodos, ou seja, características e comportamentos. Os métodos do carro, como acelerar, podem usar atributos e outros métodos do carro como o tanque de gasolina e o mecanismo de injeção de combustível, respectivamente, uma vez que acelerar gasta combustível.

<p align="center"><img alt='Desenho de um carro, representando a classe "carro", com os métodos e atributos da classe escritos dentro do desenho' src="assets/poo-programacao-orientada-a-objetos/oop-car-methods-and-attributes.png" align="center" width="250px" height="200px"/></p>

No entanto, se alguns desses atributos ou métodos forem facilmente visíveis e modificáveis, como o mecanismo de aceleração do carro, isso pode dar liberdade para que alterações sejam feitas, resultando em efeitos colaterais imprevisíveis. Nessa analogia, uma pessoa pode não estar satisfeita com a aceleração do carro e modifica a forma como ela ocorre, criando efeitos colaterais que podem fazer o carro nem andar, por exemplo.

Dizemos, nesse caso, que o método de aceleração do seu carro não é visível por fora do próprio carro. Na POO, um atributo ou método que não é visível de fora do próprio objeto é chamado de "privado" e quando é visível, é chamado de "público".

<p align="center"><img alt='Desenho de um diagrama de Venn, representando um círculo mais interno com os métodos e atributos privados, contido em outro círculo maior com os métodos e atributos públicos. O círculo mais interno é inacessível de fora e acessível aos componentes públicos do objeto, enquanto estes são acessíveis de dentro e de fora. Imagem encontrada no Google Imagens.' src="assets/poo-programacao-orientada-a-objetos/encapsulation.png"/></p>

Mas então, como sabemos como o nosso carro acelera? É simples: não sabemos. Nós só sabemos que para acelerar, devemos pisar no acelerador e de resto o objeto sabe como executar essa ação sem expor como o faz. Dizemos que a aceleração do carro está *encapsulada*, pois sabemos o que ele vai fazer ao executarmos esse método, mas não sabemos como - e na verdade, não importa para o programa como o objeto o faz, só que ele o faça.

O mesmo vale para atributos. Por exemplo: não sabemos como o carro sabe qual velocidade mostrar no velocímetro ou como ele calcula sua velocidade, mas não precisamos saber como isso é feito. Só precisamos saber que ele vai nos dar a velocidade certa. Ler ou alterar um atributo encapsulado pode ser feito a partir de *getters e setters* (colocar referência).

Esse *encapsulamento* de atributos e métodos impede o chamado *vazamento de escopo*, onde um atributo ou método é visível por alguém que não deveria vê-lo, como outro objeto ou classe. Isso evita a confusão do uso de variáveis globais no programa, deixando mais fácil de identificar em qual estado cada variável vai estar a cada momento do programa, já que a restrição de acesso nos permite identificar quem consegue modificá-la. 


### Exemplo em Java

```
public class Carro {
    private Double velocidade;
    private String modelo;
    private MecanismoAceleracao mecanismoAceleracao;
    private String cor;

    /* Repare que o mecanismo de aceleração é inserido no carro ao ser construído, e
        não o vemos nem podemos modificá-lo, isto é, não tem getter nem setter.
        Já o "modelo" pode ser visto, mas não alterado. */
    public Carro(String modelo, MecanismoAceleracao mecanismoAceleracao) {
        this.modelo = modelo;
        this.mecanismoAceleracao = mecanismoAceleracao;
        this.velocidade = 0;
    }
    
    public void acelerar() {
        this.mecanismoAceleracao.acelerar();
    }

    public void frear() {
        /* código do carro para frear */
    }

    public void acenderFarol() {
        /* código do carro para acender o farol */
    }

    public Double getVelocidade() {
        return this.velocidade
    }

    private void setVelocidade() {
        /* código para alterar a velocidade do carro */
        /* Como só o próprio carro deve calcular a velocidade, 
            esse método não pode ser chamado de fora, por isso é "private" */
    }

    public String getModelo() {
        return this.modelo;
    }

    public String getCor() {
        return this.cor;
    }

    /* podemos mudar a cor do carro quando quisermos */
    public void setCor(String cor) {
        this.cor = cor;
    }
}
```

### Exemplo em Python
```
# Exemplo da classe Carro em Python
class Carro:
    def __init__(self, modelo, mecanismoAceleracao):
        self.__modelo = modelo;
        self.__velocidade = 0
        self.__mecanismoAceleracao = mecanismoAceleracao

    def acelerar(self):
        mecanismoAceleracao.acelerar()

    def frear(self):
        # Codigo para frear o carro

    def acenderFarol(self):
        # Codigo para acender o farol do carro

    def getVelocidade(self):
        return self.velocidade
    
    def __setVelocidade(self):
        # Codigo para alterar a velocidade por dentro do objeto

    def getModelo(self):
        return self.modelo

    def getCor(self):
        return self.cor

    def setCor(self, cor):
        self.cor = cor
```


## Herança

No nosso exemplo, você acabou de comprar um carro com os atributos que procurava. Apesar de ser único, existem carros com exatamente os mesmos atributos ou formas modificadas. Digamos que você tenha comprado o modelo Fit, da Honda. Esse modelo possui uma outra versão, chamada WR-V (ou "Honda Fit Cross Style"), que possui muitos dos atributos da versão clássica, mas com algumas diferenças bem grandes para transitar em estradas de terra: o motor é híbrido (aceita álcool e gasolina), possui um sistema de suspensão diferente, e vamos supor que além disso ele tenha um sistema de tração diferente (tração nas quatro rodas, por exemplo). Vemos então que não só alguns atributos como tambm alguns mecanismos (ou métodos, traduzindo para POO) mudam, mas essa versão "cross" ainda é do modelo Honda Fit, ou melhor, *é um tipo* do modelo.

<p align="center"><img alt='Imagem representando a taxonomia de animais. Nele, uma hierarquia com a classe "Animal", que é o primeiro nível da hierarquia, com as classes "Mamífero" e "Ave" que herdam de "Animal" e, no último nível, as classes "Cachorro" e "Homem" herdando de "Mamífero" e "Beija-flor" herdando de "Ave". Imagem encontrada no Google Imagens.' src="assets/poo-programacao-orientada-a-objetos/inheritance.png"/></p>

Quando dizemos que uma classe A *é um tipo de* classe B, dizemos que a classe A *herda* as características da classe B e que a classe B é *mãe* da classe A, estabelecendo então uma relação de **herança** entre elas. No caso do carro, dizemos então que um Honda Fit "Cross" *é um tipo de* Honda Fit, e o que muda são alguns atributos (paralama reforçado, altura da suspensão etc), e um dos métodos da classe (acelerar, pois agora há tração nas quatro rodas), mas todo o resto permanece o mesmo, e o novo modelo recebe os mesmos atributos e métodos do modelo clássico.

### Exemplo em Java

```
// "extends" estabelece a relação de herança dom a classe Carro
public class HondaFit extends Carro {

    public HondaFit(MecanismoAceleracao mecanismoAceleracao) {
        String modelo = "Honda Fit";
        // chama o construtor da classe mãe, ou seja, da classe "Carro"
        super(modelo, mecanismoAceleracao);
    }
}
```

### Exemplo em Python

```
# As classes dentro do parênteses são as classes mãe da classe sendo definida
class HondaFit(Carro):
    
    def __init__(self, mecanismoAceleracao):
        modelo = "Honda Fit"
        # chama o construtor da classe mãe, ou seja, da classe "Carro"
        super().__init__(self, modelo, mecanismoAceleracao)
```


## Interface

Muitos dos métodos dos carros são comuns em vários automóveis. Tanto um carro quanto uma motocicleta são classes cujos objetos podem acelerar, parar, acender o farol etc, pois são coisas comuns a automóveis. Podemos dizer, então, que ambas as classes "carro" e "motocicleta" *são* "automóveis".

Quando duas (ou mais) classes possuem comportamentos comuns que podem ser separados em uma outra classe, dizemos que a "classe comum" é uma *interface*, que pode ser "herdada" pelas outras classes. Note que colocamos a interface como "classe comum", que pode ser "herdada" (com aspas), porque uma interface não é exatamente um classe, mas sim um conjunto de métodos que todas as classes que herdarem dela devem possuir (implementar) - portanto, uma interface não é "herdada" por uma classe, mas sim *implementada*. No mundo do desenvolvimento de software, dizemos que uma interface é um "contrato": uma classe que implementa uma interface deve fornecer uma implementação a **todos** os métodos que a interface define, e em compensação, a classe implementadora pode dizer que ela é do tipo da interface. No nosso exemplo, "carro" e "motocicleta" são classes que implementam os métodos da interface "automóvel", logo podemos dizer que qualquer objeto dessas duas primeiras classes, como um Honda Fit ou uma motocicleta da Yamaha, são automóveis.

Um pequeno detalhe: uma interface não pode ser herdada por uma classe, mas sim implementada. No entanto, uma interface pode herdar de outra interface, criando uma hierarquia de interfaces. Usando um exemplo completo com carros, dizemos que a classe "Honda Fit Cross" herda da classe "Honda Fit", que por sua vez herda da classe "Carro". A classe "Carro" implementa a interface "Automóvel" que, por sua vez, pode herdar (por exemplo) uma interface chamada "MeioDeTransporte", uma vez que tanto um "automóvel" quanto uma "carroça" *são* meios de transporte, ainda que uma carroça *não seja* um automóvel.

### Exemplo em Java

```
public interface Automovel {
    void acelerar();
    void frear();
    void acenderFarol();
}

public class Carro implements Automovel {
    
    /* ... */

    @Override
    public void acelerar() {
        this.mecanismoAceleracao.acelerar();
    }

    @Override
    public void frear() {
        /* código do carro para frear */
    }

    @Override
    public void acenderFarol() {
        /* código do carro para acender o farol */
    }

    /* ... */
}

public class Moto implements Automovel {

    /* ... */
    
    @Override
    public void acelerar() {
        /* código específico da moto para acelerar */
    }

    @Override
    public void frear() {
        /* código específico da moto para frear */
    }

    @Override
    public void acenderFarol() {
        /* código específico da moto para acender o farol */
    }

    /* ... */
}
```

### Exemplo em Python

```
class Automovel():
    def acelerar(self):
        raise NotImplementedError()

    def frear(self):
        raise NotImplementedError()

    def acenderFarol(self):
        raise NotImplementedError()

class Carro(Automovel):

    # ...

    def acelerar(self):
        # Codigo para acelerar o carro

    def frear(self):
        # Codigo para frear o carro

    def acenderFarol(self):
        # Codigo para acender o farol do carro

    # ...

class Moto(Automovel):

    # ...

    def acelerar(self):
        # Codigo para acelerar a moto

    def frear(self):
        # Codigo para frear a moto

    def acenderFarol(self):
        # Codigo para acender a moto

    # ...
```

Nota: criar um erro do tipo `NotImplementedError` é apenas uma conveção para que, caso uma classe filha tente executar um método da classe mãe sem tê-la implementado, ocorra o erro. Em Python, as interfaces são criadas como classes normais que são herdadas pelas classes filhas. Existem formas de forçar a implementação por parte das classes filhas, mas para nosso exemplo essa abordagem é suficiente.

## Polimorfismo

Vamos dizer que um dos motivos de você ter comprado um carro foi a qualidade do sistema de som dele. Mas, no seu caso, digamos que a reprodução só pode ser feita via rádio ou *bluetooth*, enquanto que no seu antigo carro, podia ser feita apenas via cartão SD e *pendrive*. Em ambos os carros está presente o método "tocar música" mas, como o sistema de som deles é diferente, a forma como o carro toca as músicas é diferente. Dizemos que o método "tocar música" é uma forma de **polimorfismo**, pois dois objetos, de duas classes diferentes, têm um mesmo método que é implementado de formas diferentes, ou seja, um método possui *várias formas*, várias implementações diferentes em classes diferentes, mas que possuem o mesmo efeito ("polimorfismo" vem do grego *poli* = muitas, *morphos* = forma).

### Exemplo em Java 
```
public class Main {
    public static void main(String[] args) {
        Automovel moto = new Moto("Yamaha XPTO-100", new MecanismoDeAceleracaoDeMotos())
        Automovel carro = new Carro("Honda Fit", new MecanismoDeAceleracaoDeCarros())
        List<Automovel> listaAutomoveis = Arrays.asList(moto, carro);
        for (Automovel automovel : listaAutomoveis) {
            automovel.acelerar();
            automovel.acenderFarol();
        }
    }
}
```

### Exemplo em Python
```
def main():
    moto = Moto("Yahama XPTO-100", MecanismoDeAceleracaoDeMotos())
    carro = Carro("Honda Fit", MecanismoDeAceleracaoDeCarros())
    listaAutomoveis = [moto, carro]
    for automovel in listaAutomoveis:
        automovel.acelerar()
        automovel.acenderFarol()
```

Repare que apesar de serem objetos diferentes, `moto` e `carro` possuem os mesmos métodos `acelerar` e `acenderFarol`, que são chamados da mesma forma, apesar de serem implementados de maneira diferente.

# Design Patterns

Alguns problemas aparecem com tanta frequência em **POO** que suas soluções se tornaram padrões de design de sistemas e modelagem de código orientado a objeto, a fim de resolvê-los. Esses **padrões de projeto**, (ou **design patterns**) nada mais são do que formas padronizadas de resolver problemas comuns em linguagens orientadas a objetos. O livro "Design Patterns", conhecido como **Gof:Gang of Four**, é a principal referência nesse assunto, contendo os principais padrões usados em grandes projetos. A Alura também oferece cursos de *Design Patterns* em linguagens de programação como [Java], [Python] e [C#].

# Clean code e SOLID

Em projetos desenvolvidos com POO, assim como em qualquer outro, o cdigo pode se tornar desorganizado e dificil de manter a médio e longo prazo. Em vista dessa situação, alguns princípios de boas práticas de programação e código limpo foram desenvolvidos como, por exemplo:

- KISS (*Keep It Simple, Stupid*, "Mantenha as coisas simples"): Sempre que um código for escrito, ele deve ser escrito da forma mais simples possível, para manter o código mais legível. Códigos complexos demais são mais difíceis de se manter, j que é mais difícil entender o que ele faz e como ele faz.
- DRY (*Don't Repeat Yourself*, "Não se repita"): Todo código escrito para resolver um problema deve ser escrito apenas uma vez, a fim de evitar repetição de código. É quase uma variação do KISS, dado que a repetição de código o torna mais confuso e difícil de manter e corrigir, se necessário.

Além dos **design patterns** e dos princípios de código limpo existe um conjunto de técnicas, mais generalizadas que os design patterns, que ajudam a criar código orientado a objeto de forma a deixá-lo mais maleável, possibilitando uma manutenção e expansão mais suave e descomplicada do código ao longo do tempo.

Alguns cursos da Alura abordam esses assuntos, como o curso de [SOLID com Java], [SOLID com PHP], e também nosso [artigo sobre o que é Clean Code].



O **ES6** introduziu o conhecido **Template String ou Template Literals**, onde conseguimos criar cadeias de caracteres, utilizando outra forma de interpolação que não fosse o sinal de +.

Como faríamos uma interpolação da maneira antiga?

javascript

As coisas tendem a ficar mais complexas quando envolvemos mais variáveis e expressões no nosso código, como podemos fazer atualmente ?

# Usando Template Literal

Para utilizarmos uma Template Literal, é necessário utilizarmos o backtick (acento grave da língua portuguesa), para realizar a **interpolação**, utilizamos a notação de `${}`

javascript

O que poucas pessoas conhecem é a possibilidade de utilizarmos esse Template junto de uma função criada para trabalhar no contexto desse Template.

# Definição

Uma Tagged Template é uma chamada de função onde os argumentos são derivados de uma Template Literal. Os valores desses argumentos incluem um **Template Object** (que nada mais é do que o objeto representativo das Template Literals) e os valores produzidos após avaliação das expressões embutidos em uma Template Literals (`${}`)

Essa possibilidade acaba sendo ignorada pela maioria dos desenvolvedores.

Mas o que é essa **Tag** que é mencionada no nome? O que essa definição acima quer dizer?

Vamos por partes…

# Tag

A tag nada mais é do que a própria função que será chamada através da utilização da Template Literals. Vamos ao exemplo para ficar mais claro.

Estamos mais acostumados a ver chamadas de funções dessa forma:

javascript

Porém, utilizando Tagged Template Literals, nossa chamada para a função seria executada da seguinte maneira:

javascript

Naturalmente  pensamos que as duas chamadas são equivalentes, porém isso NÃO é verdade.

O que ocorre é que quando utilizamos Template Literals para realizar a chamada de uma função, o parâmetro pode ser passado de duas formas.

Quando nossa Template Literals é composta apenas de uma string, sem a necessidade de se avaliar valores de variáveis interpoladas, nosso parâmetro é um **array**, veja abaixo:

javascript
Repare que recebemos o parâmetro sendo um array, de fato, isso não é algo trivial, mas calma!

Tem explicação!

Lembra lá em cima no começo do texto quando relembramos Template Literals (Template Strings)?

Uma dos poderes desse Template Literals é a capacidade de **interpolar** os valores de variáveis e é justamente por isso que recebemos um array como parâmetro.

Vamos ao exemplo, reescrevendo nossa função:

javascript

Quando utilizamos a notação `${}` no meio de uma sentença, nossa string é quebrada ao meio, vamos ver como seria uma função semelhante utilizando a notação que conhecemos.

javascript

Veja agora que na verdade, temos um Array de cadeias de caracteres e essas cadeias são determinadas pelo posicionamento da nossa interpolação!

Analogamente, todos os valores interpolados são passados um a um após o Array, respeitando a ordem em que aparecem na Template Literals, veja o exemplo abaixo:

javascript

Pegou a ideia?

Mas agora vem a pergunta que não quer calar…

Onde posso utilizar Template Literals? Vamos ver alguns usos bacanas!

# Colocando a mão na massa

Vamos criar um método que irá destacar uma frase em negrito (tag strong) tudo que for passado através de `${}`

javascript

Nosso método utiliza **spread operator** para receber um número variável de valores interpolados e uma lógica utilizando reduce, onde acumulador é o valor retornado no último **callback**, string é o valor atual e i é o índice do elemento que está sendo processado.

No nosso caso, o reduce retornará uma **string** com os valores que foram interpolados, envolvidos pela tag strong do HTML. Repare que o retorno do nosso método é justamente os valores interpolados envolvidos por uma tag strong! Sensacional!
Esse foi apenas um pequeno exemplo do que podemos fazer com Tagged Template Literals.

No mundo **React**, vemos bastante Tagged Template Literals quando utilizamos styled-components em nosso projeto.

# Conclusão
Apesar de não ser amplamente utilizado entre os desenvolvedores, é importante termos grande parte das ferramentas da linguagem em nosso cinto de utilidades, já que nunca sabemos quando poderemos precisar.

Definir se Tagged Literals será algo popular cabe a nós desenvolvedores, portanto, deve partir de cada um optar por usar ou não essa funcionalidade.

Se ficou interessado em como o **Javascript** funciona e como você pode utilizá-lo melhor, aqui na **Alura** temos uma [**formação engenheiro front-end**]. Nela, você verá como programar em Javascript, e conhecer algumas novidades do ES6.





Grid basicamente consiste em dividir uma proporção da tela do usuário em partes iguais com espaçamento entre elas.

Os smartphones já são praticamente parte de mão de todo mundo que possui um, o tempo todo acessamos apps de todo tipo (até lembrar de tomar água) e em alguns momentos até esquecemos que por trás de vários desses existe uma versão web que funciona tão bem quanto.

imagem: Estrutura que divide espaços dentro de um container (pode ser feito com combinações de float e width, flexbox ou mesmo em cima do [Grid Layout do CSS])
- Gutter: é o nome do espaçamento que se dá entre as colunas de um grid, no modelo que fizemos definimos ele com padding nas colunas
- Row: No exemplo eu não coloquei em todos os casos, mas poderiamos criar esse elemento que serviria como um dividor horizontal dentro dos grids e que reseta o padding aplicado no container deixando as colunas com o máximo possível de tamanho dentro do mesmo.

Os nomes das classes do CSS aqui acabam considerando como se cada pedaço do grid fosse algo único, mas nada impede de você [organizar o CSS da forma que achar melhor com algo como o BEM CSS], desde que fique fácil para seu time usar e manter ao longo do projeto.

> Mas e como isso funciona no responsivo?

### Trabalhando com Media queries e Grids

Para deixarmos esse grid responsivo basta adicionarmos [media queries] que alterem o tamanho do nosso container:

<iframe height="265" style="width: 100%;" scrolling="no" title="Grid: Colunas + Responsivo" src="https://codepen.io/omariosouto/embed/RwwJOLj?height=265&theme-id=default&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true"></iframe>

Na prática os grids que fazemos hoje tomam como base algumas convenções como que a menor tela de celular é do iPhone 4 que possui 320px de pixels reais, a tela média de um tablet possui 480px a  tela média de um desktop possui 1120px e assim por diante (esses valores podem variar de acordo com cada projeto e as telas do momento). Em cima dessa base o designer do projeto imagina como o conteúdo pode ser distribuido dividindo a área máxima possível de mostrar conteúdo, também chamada de container em muitos casos, e em colunas.

## Como funciona o grid do Bootstrap 4 com Flexbox?

O bootstrap 3 possuia o estilo anterior de grid com float que vimos e em sua nova versão utilizando flexbox algumas coisinhas mudaram:

<iframe height="265" style="width: 100%;" scrolling="no" title="Grid: Flexbox baseado no do Bootstrap " src="https://codepen.io/omariosouto/embed/NWWzmem?height=265&theme-id=default&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true"></iframe>

- Container: a ideia aqui continua a mesma
- Row: Agora a row tem o papel de aplicar o flexbox nos elementos filhos
- Col: Um col sozinho tem o comportamento de ocupar o máximo de área disponível e com mais de um isso vai sendo ajustado automaticamente 
   - Cada col ainda continua possuindo um gutter pré definido de espaçamento horizontal
- Col-X: X é o numero de colunas que um elemento irá ocupar, isso é feito com um mix de flex-basis e max-width

Existem outras variações de como utilizar o grid novo do bootstrap, se quiser se se aprofundar mais, da uma olhada na [documentação deles] e imagino que agora vai ficar mais fácil de conseguir usar :)

## Grids com Grid Layout

Seguindo a ideia de resolver alguns problemas do CSS, [como centralizar coisas], a spec do Grid Layout surgiu como uma forma de ter algo da própria plataforma web para lidar com grids. 

Embora o nome de uma ideia de que ele seria a bala de prata quando falamos nesse tema, vale lembrar que a simplicidade do código é algo importante e em vários casos o uso dessa spec nova pode deixar o código mais complexo/confuso, então use com parcimonia e [se quiser saber mais sobre indico esse post aqui da alura].

E tem também [esse joguinho super bacana] que vai ti guiar pelas diversas propriedades da spec.

## Dicas extras

## Como simular diferentes tipos de tela no dia a dia de forma fácil?

![Botão que habilita e desabilita o simulador de resoluções no Chrome]

Para simular diferentes resoluções no dia a dia, não se esqueça de que no devtools da maioria dos navegadores, hoje nós temos um ícone que habilita um modo onde fica fácil trocar de resolução.

![Site da alura alternando em resoluções de tela]

### Design systems

Se você está interessado em grid, deixo a dica para você aprender sobre design systems também. Muitas pessoas descobrem esse tópico olhando como alguma marca organiza seus componentes por meio de alguma ferramenta como o [Storybook], hoje formas de documentar e organizar componentes são o hype do momento no mundo do Front End e pegar referências pode ti ajudar bastante a chegar em algo mais sólido nas interfaces de onde você trabalha. [Esse repositório no github é uma central de links e posts sobre o tema].

### Site com grid responsivo ou site com versão mobile?

Essa pergunta é comum para quem está chegando na web e o que posso dizer é que depende e muito. Como primeira opção até pensando principalmente em manutenção é melhor ter somente um website, um código só com uma codebase só ajuda a evitar bugs e ficar em muitos casos replicando código ou criando estratégias para compartilhar. Aplicações gigantes como o facebook tem sua versão específica para sites mobile pelo fato da interface ser tão complexa que a solução mais rápida acabou sendo criar um novo site, mas pense bem sobre e antes de me despedir por aqui vou deixar esse [excelente post do Sérgio Lopes sobre design responsivo]

## Conclusão

Hoje nós aprendemos que a base dos grids giram em torno de entender o que são os Containers, Rows e Cols. Seja com float, flexbox ou grid layout o importante é conseguir deixar de um jeito fácil qualquer site que você vá desenvolver responsivo.

Caso você queira mais dicas sobre o mundo do Front End, da uma olhada na minha série aqui na alura [Fronteiras do Front End]

Por hoje é isso,espero que tenha gostado, em breve trarei mais dicas sobre diversos outros tópicos relacionados a Front End, não deixe de me seguir nas [minhas redes sociais] e acompanhar meus outros artigos em meu site pessoal [https://mariosouto.com].



Nesse artigo, trabalharemos com um aplicativo que lista filmes:

Fomos contratados para desenvolver um aplicativo que contém um catálogo de filmes. Quando o usuário acessa o aplicativo, uma lista com os filmes é apresentada:

imagem do ViewController:

swift 

Agora temos a lista de filmes:

imagem` espalhado pelo código.

O problema é o print que temos no caso de erro, onde simplesmente estamos imprimindo o erro do servidor no console.

Vamos dar uma olhada na mensagem de erro:

imagem vamos implementá-la:

swift

Vamos testar novamente:

![]

Ótimo, agora estamos apresentando um alerta para o usuário indicando qual foi o problema.

## Requisições e avisos

Fazer requisições para buscar informações é uma tarefa comum no desenvolvimento. Seja em aplicações mobile, web, e até mesmo em algumas aplicações desktops.

Porém, algumas vezes não existe a conexão com a internet. Então como fazemos? Uma forma, é mostrar uma mensagem para o usuário falando que a conexão com a internet é requerida.

Além dessa forma, existem diversas outras que podemos utilizar para tratar esse tipo de erro. Como, por exemplo, fazendo um cache da última requisição e utilizar esses dados para compor a tela que desejamos.

Aqui na Alura, temos uma [**formação IOS**]. Nela você aprenderá técnicas de construção de layouts que ajudem na experiência do usuário, formatar dados como CPF, CNPJ, e até comunicação com web services.





imagem 

Ser designer permite a atuação em variadas áreas, e uma delas é a fotografia. Ela pode estar presente dentro do curso de design como disciplina das graduações de design gráfico, industrial, moda e produto... Mas, além disso, é capaz de ser estudada fora do ambiente acadêmico em diversos outros contextos e possibilidades.

Você está conhecendo esse mundo agora? Então, é importante saber por que design e fotografia podem se complementar e entender a importância que um curso de fotografia em sua qualificação profissional!

## Afinal, qual a relação entre design e fotografia?

Desde o início dos tempos os homens procuraram se comunicar e expressar as suas ideias, usando sons, imagens, signos, evoluindo as técnicas de comunicação com o passar dos anos.

Assim, em dado momento a busca passou a ser pela melhor forma de conservar um conteúdo. Chegamos à impressão a partir do papel, que, além de útil, tinha um preço acessível e estava ao alcance de todos.

Dessa maneira, o uso da fotografia para expressar ideias fez-se necessário, contribuindo para o nascimento do [**design**] e da própria fotografia.

## Qual a importância de se ter um curso de fotografia no currículo?

Como em qualquer outra área, um profissional de design quer ser bem-sucedido e, para isso, é importante vender seus projetos

Um designer deve ter em mente que precisa sanar uma necessidade: a vontade do cliente. Logo, precisa trabalhar bem em seu produto, na imagem geral dele e em como causar boas reações. Quando um trabalho consegue atingir essas características, com certeza significa que foi bem-feito.

Logo, a importância de se produzir e compartilhar imagens ou fotos com ótima qualidade dos seus produtos se reflete na própria divulgação dela, como também na personalidade do seu tipo de trabalho e nos créditos que seu negócio tem.

Dessa forma, projetos visuais que se encontram em baixas resoluções e sem nenhuma criatividade, mensagem ou contexto, serão totalmente ignorados por possíveis clientes, e não é isso que você quer, certo? Então, um [curso] pode melhorar e muito essa perspectiva.

Sem se qualificar, você corre o risco de tirar fotos, mesmo com uma câmera de nível profissional, sem nenhum conceito, objetivo e linha de raciocínio sobre o que se deseja produzir.

Se o seu objetivo com esse trabalho é vender, divulgar, atrair, mostrar sua marca, se promover ou adquirir simpatia do público, é preciso bem mais que somente tirar algumas fotos e sair postando por aí.

É fundamental fazer um [**curso de fotografia**] se você, como designer, deseja que seu trabalho possua uma identidade e que os seus projetos ou serviços sejam exibidos de uma maneira interessante e atraiam seu público-alvo.

A importância que a fotografia tem nas peças de publicidade, como ilustrações de marketing, obras artísticas e outros, está aí para comprovar essa importância da qual estamos falando. O trabalho de encantamento que a fotografia possui no mercado é consequência da imagem criativa e de boa qualidade que se é feita a partir dela.

Para exibir e vender produtos pelos meios da internet, por exemplo, a importância da fotografia se torna ainda maior, pois, por mais que o cliente não possa tocar nos itens, as fotos são os meios de suprir a experiência que ele teria com o produto real.

Detalhando ainda mais o assunto, você saberia responder qual seria a importância de um [**curso fotográfico**] para algumas das principais áreas de design? É o que vamos conferir a seguir:

### Design de moda

Não é somente o ato de tirar fotos da vitrine ou de modelos que vai mostrar, de fato, o produto. É preciso imaginar como as outras pessoas estão vendo aquela peça!

É essencial preparar o ambiente pensando em como é possível chamar a atenção do cliente e em como ele enxergará o produto. Você deve saber evidenciar os pontos mais fortes de cada peça de roupa à venda e saber compartilhar essas fotos com a estratégia e edição certas. Partindo dessa ideia, a melhor forma de se preparar é tendo especialização e domínio sobre o modo fotográfico.

### Marketing digital

Por fazer uso de tecnologias móveis, como celular, computadores, tablets, entre outros, é preciso saber bem como usar a [imagem] no marketing digital. Não adianta somente ter o preço e a descrição do produto vendido.

Sabemos que as pessoas adquirem produtos pela internet somente não só com a visão que elas têm do produto, mas o primeiro impacto certamente será o da imagem da mercadoria.

Para isso, é essencial pensar em como você vai apresentar os produtos; nos fundos, nos detalhes, na posição, nas cores que serão utilizadas e, principalmente, na qualidade. Por ter feito um curso de fotografia, todas essas ideias estarão muito mais frescas na sua memória. Além disso, terão um embasamento teórico.

### Design gráfico

Em geral, o uso fotográfico para o design é como uma ferramenta de ajuda para o profissional; contudo, no campo de design gráfico, ela também tem outro caráter importante: é uma forma linguagem para a comunicação visual — o que representa um ponto crucial para o campo gráfico.

O profissional usa a fotografia para atingir seus objetivos e, se bem usada, ela pode se tornar uma solução para os seus projetos. E por que isso ocorre? Pois a fotografia tem o potencial de transmitir mensagens, despertar sentimentos e retratar ideias.

Ao ter concluído um curso, todas essas características estarão ao favor do designer. A fotografia serve de apoio para o decorrer do projeto, como dos [**esboços gráficos**], podendo ser aplicada na produção ou na criação, ficando ao desejo do profissional.

Portanto, o conhecimento em fotografia para um designer pode agregar e muito para a sua qualificação profissional e amostragem dos seus produtos ou projetos.

Entendendo como funciona a relação dessas duas áreas e os benefícios que um curso de fotografia traria para a sua carreira, você pode conseguir melhorar sua posição no mercado de trabalho. E essa é uma grande vantagem competitiva, não é mesmo?

Então, gostou do nosso post? Então, não perca tempo e assine a nossa newsletter. Receba em seu e-mail conteúdos relevantes sobre a sua futura área de trabalho!




Se você é um designer ainda na faculdade ou está começando sua carreira como [**freelancer**], é bem difícil ter acesso às ferramentas de design mais usadas no mercado. Os softwares são caros, sua remuneração ainda é baixa e você precisa conciliar muitos outros gastos.

Por isso é tão comum que designers iniciantes recorram à pirataria. Mas você precisa mesmo dela para o seu trabalho?

## Por que piratear não vale a pena

A pirataria é uma solução fácil para o maior problema de um designer iniciante: a falta de dinheiro para investir na carreira.

Sites de torrents e downloads ilegais deixam qualquer software a um clique de distância. Mas o que parece simples pode ter implicações sérias que muitas vezes passam desapercebidas por quem precisa destas ferramentas para seu trabalho.

### Piratear é crime

Este é o motivo mais óbvio, mas ignorado por quem precisa de qualquer forma usar um software caro. Baixar e usar qualquer programa sem uma licença legítima do desenvolvedor é crime previsto em lei.

Apesar de haver uma noção geral de que este é um crime sem punição, novos sistemas e empresas de segurança vêm se tornando cada vez mais eficientes na busca de quem pirateia softwares.

### Coloque-se no lugar do desenvolvedor

Além de ser crime, você deve pensar também na ética na hora de piratear ferramentas de design. Designers deveriam entender esta parte mais do que a maioria dos profissionais de outras áreas: quantas vezes um cliente já quis um serviço de graça ou pagando menos do que vale o seu trabalho?

E se você gastar meses para terminar uma arte, um tema para sites ou uma peça de design e outra pessoa utilizar sem pagar ou sem sua autorização?

Os softwares mais usados no mercado são tão bons porque muita gente trabalhou para que ele se tornasse o que é. Coloque-se no lugar dessas pessoas e imagine como você ia se sentir se roubassem o seu trabalho.

### Malwares e o risco de invasão

**Softwares piratas não são apenas ilegais como também perigosos.**

Para burlar a segurança de qualquer programa, é necessário usar _cracks_ que modificam seu código original. Esta é a brecha que uma pessoa mal-intencionada precisa para inserir programas espiões e comandos maliciosos.

Malwares são pequenos softwares camuflados que, quando instalados em seu computador, podem roubar informações sigilosas ou até permitir que outra pessoa assuma o controle do seu PC. Por isso, tenha muita atenção ao instalar um programa pirata!

## Ferramentas de design gratuitas ou mais acessíveis

O principal ensinamento para um designer que está [**iniciando a sua carreira**] ou ainda cursa a faculdade é que os softwares são apenas ferramentas. Um bom designer trabalha bem nem que seja apenas com um papel, um lápis, tesoura e cola.

Mesmo que você já tenha se acostumado com ferramentas mais estabelecidas no mercado como Photoshop e Illustrator, é importante que você conheça outras ferramentas, não só para evitar a pirataria como para não depender de uma única solução.

### GIMP

O [GIMP] é a alternativa ao Photoshop mais usada no mundo, por oferecer um ambiente de trabalho muito similar ao software da Adobe. Ele é grátis, bastante customizável e possui uma enorme quantidade de tutoriais e documentação para te ajudar a começar.

### Inkscape

O [Inkscape] segue o mesmo caminho do GIMP como uma alternativa ao Adobe Illustrator e ao CorelDRAW. Da mesma forma que o primeiro, ele é grátis e tem uma grande comunidade para te dar suporte.

### Affinity

Se você quer um software mais sofisticado sem pagar tanto, o [Affinity Photo] e o [Affinity Designer] são boas alternativas ao Photoshop e ao Illustrator por menos de R$ 200 cada.

A desvantagem é que você vai precisar pagar em dólar, mas as duas ferramentas estão disponíveis em uma versão beta gratuita para quem quiser experimentar.

### Opções online

Existem também várias ferramentas de design online e gratuitas, como o [Gravit] e o [Pixlr]. Embora sejam um pouco mais limitadas, podem ser úteis para desenvolver pequenos trabalhos.

## O que as empresas têm feito em relação à pirataria

Nos últimos anos, a maioria das desenvolvedores de softwares percebeu que a melhor forma de combater a pirataria é oferecendo serviços melhores e vantagens para quem trabalha legalmente. Por esse motivo, várias medidas que estas empresas estão tomando só facilitam o trabalho do designer.

### Sistema de assinatura

Empresas grandes como a Adobe e a Microsoft estão mudando a forma como oferecem suas ferramentas e estão trocando a venda de produtos pela assinatura de serviços.

O [Creative Cloud], por exemplo, é muito mais do que apenas ter o Photoshop no seu computador. O assinante do serviço da Adobe tem acesso a bancos de imagens e fontes para te ajudar a criar, armazenamento na nuvem para o seu trabalho e uma plataforma para expor seu portfólio.

Todas essas vantagens são essenciais para um designer iniciante que quer mostrar o seu trabalho e conseguir novos clientes, mas nenhuma delas está disponível quando o software é pirata.

### Preços melhores para estudantes

Se você [**está na faculdade**], é ainda mais fácil ter acesso às ferramentas de design mais utilizadas pelos profissionais. Quase todas as empresas, como a própria Adobe, têm descontos especiais para quem ainda é estudante.

Se você conseguir fazer um esforço e ter serviços como o Creative Cloud durante a faculdade, pode ser o suficiente para já sair dela com a carreira estabelecida e nunca mais precisar piratear um software!

Alguns designers, no início de seus estudos e atividades, por falta de grana acabam recorrendo à pirataria, mas o esforço em buscar softwares originais pode te recompensar e até alavancar a sua carreira.

Seja com alternativas mais em conta ou se esforçando para ter sempre as grandes ferramentas de design, lembre-se de que o mais importante é que você esteja capacitado. [**Faça cursos**], aprimore sempre sua técnica, e naturalmente os softwares piratas ficarão para trás.

Gostou da discussão? Você concorda ou tem uma opinião diferente? Compartilhe este post nas redes sociais e veja as opiniões dos seus colegas de profissão!




Umas semanas atrás eu estava na copa da Alura jogando um Fifa com a galera e, depois de perder vergonhosamente, fui tomar um café. Sentado em uma das mesas estava o [Artur Diniz], instrutor da Caelum e responsável por 50% do consumo de café e Red Bull do Brasil.

-E aí Artur, beleza? Tá fazendo o que de bom aí? 
-Estudando CSS mágico que não existe. 
-Oi? 
-Dá uma olhada aqui.

O que eu vi foi isso: ![]

Não entendi muita coisa.

Convidei ele então pra gravação de um episódio do Alura Live pra conversarmos sobre isso e ele me explicar o que seria esse tal CSS mágico.

Confira os melhores momentos da nossa conversa:

https://www.youtube.com/watch?v=WtTH6pd8SW8

Alguns links que citamos: [Repositório que contém as discussões do grupo de trabalho do CSS] [Post da Lea Verou sobre gradientes cônicos] [Discussões sobre o CSS Houdini] [Exemplos e demos das APIs do Houdini]

Gostou deste vídeo? Então não deixe de se [inscrever em nosso canal no Youtube!] O Alura Live vai ao ar todas as quintas, 14h, lá em nossa [página no Facebook]. Confira quais os assuntos dos próximos episódios [aqui].




Promover-se não é uma tarefa simples. Ter um bom destaque profissional dentro da sua área requer um planejamento prévio e alguma criatividade — não se resume, somente, a manter-se em evidência.

Você sabe do que se trata o [**marketing pessoal**]? Entende qual a importância de estruturar um briefing de marketing? Independentemente da sua área de atuação, vale a pena apostar no marketing pessoal para obter mais sucesso profissional e destaque no mercado em que atua.

O artigo de hoje busca solucionar algumas dúvidas em relação a esses assuntos. Você vai ficar por dentro de informações acerca dos benefícios de uma boa estratégia de marketing e verá dicas incríveis de como organizar um [**briefing**] completo.

O que está esperando para estruturar um bom briefing de marketing pessoal? Mãos à obra!

## O que é um briefing?

O briefing é uma espécie de relatório, um resumo de informações e instruções que devem ser entendidas a fim de realizar um serviço ou atividade. Quanto mais organizado e recheado de informações relevantes, melhor será aquela reunião de subsídios.

Um briefing básico abrange o histórico da empresa, seu público-alvo, a lista dos concorrentes, seus objetivos detalhados, a verba para projetos e as possibilidades de comunicação (site, mídias sociais, relações públicas, publicidade, entre outros).

## E o que é marketing pessoal?

**Marketing pessoal (ou personal branding)** é uma técnica estratégica e planejada para agregar valor à imagem pessoal de alguém. Trata-se de um marketing específico para valorização da sua imagem, de modo que os outros vejam você da forma mais positiva possível.

O objetivo é sempre o fortalecimento de uma marca (que, nesse caso, é sua imagem), diferente de ser apenas uma autopromoção.

É formado por um conjunto de variáveis: são diversas as maneiras de se mostrar como uma referência em algum sentido. Porém, tudo deve ser pensado dentro de um contexto. Aí é onde entra o briefing.

## Como compor um briefing ideal?

Um bom briefing de marketing pessoal deve conter informações sobre você:

- a delimitação de sua atuação e de seu público-alvo de interesse;
- as percepções de seu mercado;
- informações estratégicas sobre seus concorrentes e suas boas práticas;
- um detalhamento de seus canais de comunicação e relacionamento;
- os objetivos que você quer alcançar com sua iniciativa.

Responder algumas perguntas pode orientá-lo melhor na hora de estruturar o seu material. São elas:

- O quê?
- Para quem?
- Onde?
- Quando?
- Como?

Essa é a estrutura básica de questões, mas você pode desenvolvê-las e aprofundar mais, a fim de montar um briefing ideal. Por exemplo, pergunte-se sobre o que você deseja vender. Para quem? Qual a sua localização? Qual período de tempo e de prazos? Como você deseja fazer isso?

Para ajudá-lo de forma mais prática, [veja alguns exemplos]. Na hora de contestar a questão "O quê?", você pode reunir suas formações e habilidades, bem como o que diferencia você no mercado e tudo o que você faz de melhor no segmento de design.

A pergunta "Para quem?" vai auxiliar a compor o seu público-alvo desejado, ou seja, definir para quem exatamente você quer vender seus serviços de comunicação visual ou projetos.

Ao responder o tópico "Onde?", será mais capaz de delimitar a extensão para divulgar e se relacionar com parceiros e clientes sua atuação será sustentada somente na sua cidade, ou passará para todo o país? Isso também ajudará a definir as plataformas e ferramentas de divulgação, de redes sociais a material de papelaria e impressos.

Ter a certeza de que no seu briefing estarão contidas as respostas para aquelas perguntas é fundamental para ter um material bem mais completo e incrível.

## Como estruturar um briefing de marketing pessoal?

No caso do briefing de marketing pessoal, alguns detalhes mais específicos podem e devem ser abordados. Acompanhe as dicas abaixo:

### Faça uma honesta autoavaliação

Uma avaliação pessoal é sempre importante. Considere quem você é e tudo o que você gosta e proporciona à sua felicidade. Busque inspirações externas, como personalidades ou cases de sucesso.

Boa parte do que você será no futuro está relacionada à imagem que está sendo construída hoje.

### Prepare um histórico recheado

Não se mantenha apenas naquele histórico básico. Procure abordar sua filosofia, sua missão e adicione personalidade ao texto. Fale um pouco acerca do que você pode oferecer.

Uma boa descrição inicial pode ser fundamental para prender a atenção até o fim do briefing.

### Mostre o seu diferencial competitivo

Não é ético expor os concorrentes para se autopromover. É imprescindível mostrar o que você faz de diferente de seus rivais de mercado e o que pode ser ainda melhor no seu ramo de atuação.

Foque continuamente nos seus pontos e características positivas.

### Detalhe os seus objetivos

Procure responder a estas perguntas em um texto corrido: que atividade você está buscando? Por que você se interessa por esse ramo? Quais objetivos você almeja alcançar ao exercê-la? Para quem você deseja falar? Como o seu serviço pode ser efetivo?

Explique, de forma coerente, as razões pelas quais você acredita que precisam dos seus serviços ou produtos. Descreva um pouco do seu mercado nesse tópico. Demonstre seu conhecimento sobre o que faz — e onde pisa.

### Tenha cuidado com a linguagem utilizada

É importante pensar em como tudo será descrito. Na linguagem, evite a imperatividade. Utilize uma linguagem simples e fácil de ser compreendida, mas evite também o uso de jargões e gírias. Isso pode dar uma ideia de pouco profissionalismo.

## Quais os benefícios de ter um bom briefing de marketing pessoal?

Todo conteúdo organizado por meio de estratégias de marketing pessoal podem [**destacar você entre os demais**]. A imagem construída sobre você é o seu cartão de visitas.

Um dos principais benefícios de se estruturar um bom briefing de marketing pessoal é a menor chance de cometer erros diante das boas oportunidades. Afinal, você já terá uma boa orientação sobre o que fazer e como fazer suas táticas de mercado.

Já outro ponto positivo é antever com clareza como será a sua divulgação e a manutenção do relacionamento com clientes e parceiros, já que é fundamental promover o próprio trabalho e os seus melhores feitos. Não adianta muito ter uma larga competência e ninguém saber sobre isso, certo?

O maior desafio do marketing pessoal, no entanto, é fazer com que as suas capacidades sejam notadas de forma não invasiva. A construção de um briefing de marketing pessoal possibilita essa dosagem, fazendo com que ela seja feita de uma maneira mais segura. Por isso, como já dissemos, planejamento e uma boa autoavaliação são fundamentais.






Neste artigo, iremos examinar um cenário inicial de uma solução de comércio eletrônico em **.NET**, propondo uma nova arquitetura de **microsserviços** e avaliando os desafios inerentes a esse tipo de abordagem.

Vamos considerar possíveis **padrões de arquitetura**, tecnologias e ferramentas necessárias para realizar a **comunicação entre os serviços**, e ao final iremos demonstrar uma solução de exemplo, que pode ser baixada e executada, e na qual foram aplicados os conceitos que abordamos aqui. 

O assunto “microsserviços” é extremamente vasto, portanto vamos nos focar aqui apenas na **comunicação** entre serviços.

# Por que microsserviços?
Depois de uma estratégia de marketing bem-sucedida, as vendas em nosso website disparam. Temos uma multidão de clientes acessando simultaneamente e o desempenho do nosso servidor cai consideravelmente. 

Os clientes, até então fiéis à plataforma, começam a reclamar nas redes sociais e criar memes sobre a lentidão e os erros constantes do website.

Então a empresa começa a contratar profissionais de desenvolvimento e de suporte, porém a estrutura da aplicação, **monolítica**, torna difícil para vários profissionais trabalharem ao mesmo tempo no mesmo projeto e mesma base de código.

Para dar conta do grande volume de usuários, a equipe hospeda a **aplicação na nuvem**, acrescentando novos servidores ou mais memória conforme necessário. Porém, a aplicação monolítica não é **modular**, e tanto o processo de “escalar para cima” (**acrescentar memória RAM aos servidores**) como “escalar para fora” (**instanciando novos servidores**) aumentam muito o custo da hospedagem em nuvem. 

Os desenvolvedores reclamam do tempo excessivo que a aplicação leva para carregar e iniciar em suas máquinas. Com isso, os bugs e novas funcionalidades se acumulam e o **“lead time” (tempo entre um chamado do cliente e a implantação)** se torna cada vez maior.

Desenvolvedores começam a criar muitos **hot-fixes** com pouca padronização e sem os testes de unidade adequados, introduzindo novos erros potenciais. Implantar novas tecnologias se torna muito complexo, pois frameworks afetam o aplicativo inteiro aumentando o custo de suporte. 

Também fica difícil de entender o impacto de cada mudanças, o que exige um cansativo teste manual. Bugs em qualquer módulo, como **vazamento de memória**, podem derrubar a aplicação inteira e levar o website a ficar indisponível. O resultado: clientes insatisfeitos e vendas caindo.

# Arquitetura de Comunicação de Microsserviços
Criar uma arquitetura que suporta aplicativos baseados em **microsserviços** traz benefícios para a gestão do ciclo de vida do projeto: 

> ela promove as práticas de integração e entrega contínua, graças à **modularidade e alta granularidade dos serviços**. 

Também podemos contar com menor custo de manutenção e maior agilidade na entrega de novas funcionalidades, já que as melhorias e correções de bugs em um dado serviço não afetarão os demais. Porém, há o outro lado da moeda: quebrar uma aplicação monolítica em múltiplas aplicações e processos traz diversos desafios técnicos e operacionais. 

Aqui, vamos considerar apenas alguns padrões de arquitetura de comunicação que podem ser usados em uma solução com microsserviços.

Um dos padrões mais comumente encontrados é o **Bounded Context (Contexto Delimitado)**, que normalmente é associado ao conjunto de padrões conhecido como **DDD (Domain Driven Design)**. Com o contexto delimitado, cada serviço tem seu próprio modelo de dados, que é independente do modelo de outros serviços. 

Com isso, o modelo de um serviço pode ser refinado continuamente, sem afetar outros serviços. Os dados do modelo de cada serviço podem ser persistidos em uma base de dados diferente. 

Por exemplo, um serviço pode gravar registros em tabelas de **banco de dados relacional**, enquanto outros serviços da mesma solução salvam informações em **bancos de dados não relacional**. 

As **requisições** realizadas entre microsserviços são diferentes das chamadas entre componentes dentro de uma aplicação monolítica, pois cada serviço é executado em seu próprio processo. 

Por isso, novos desafios surgem quando a comunicação é feita entre aplicações distribuídas: **o que acontece quando é feita uma requisição a um serviço está indisponível, ou que leva muito tempo para responder?**

Para atender essas necessidades, as aplicações se comunicam com outros processos através de protocolos adequados para aplicações distribuídas: 

> Com **HTTP resiliente**, os componentes podem realizar requisições a **serviços REST** com possibilidade de retentativas, caso a chamada tenha falhado na primeira vez. 

Para sistemas orientados a mensagem, **o protocolo AMQP** possibilita **pub-sub (publicação/assinatura)** e enfileiramento de mensagens assíncronas. Quando a comunicação entre serviços precisa ser bidirecional e feita em tempo real, os **WebSockets** são a melhor opção.

# Conhecendo a aplicação
Vamos falar um pouco sobre nossa pequena solução de e-Commerce de exemplo que utiliza o **ASP.NET Core** para implementar microsserviços.Ela [pode ser baixada do GitHub] e executada em sua máquina, seguindo as instruções que estão descritas na página do projeto.

imagem do DDD (Domain-Driven Design). Isso garante que o modelo de um serviço possam ser modificado sem introduzir erros em outros serviços.

Como os serviços rodam em aplicações e processos separados, a comunicação entre eles é feita de forma assíncrona e desacoplada: 

> Em vez de dependências e chamadas diretas, a comunicação é feita através de mensagens. Isso permite que uma aplicação possa delegar uma tarefa a outro serviço, sem ter que esperar pelo término da sua execução.

## Como os serviços se comunicam, exatamente?

Quando a página inicial de produtos é carregada, a WebApp MVC conta com a biblioteca [**Polly**] para fazer uma requisição HTTP resiliente do serviço de `CasaDoCodigo.Catalogo`, solicitando a lista de produtos.

Nesse caso, resiliente significa que a requisição se torna tolerante a falhas:

> caso o serviço de catálogo esteja indisponível no momento em que a requisição é feita, a aplicação MVC não produzirá uma exceção imediatamente.

Em vez disso, o middleware Polly entra em ação e realiza novas tentativas de requisição até que o serviço responda ou até que o **número máximo de tentativas (chamado de Circuit Breaker)** seja alcançado. Esses parâmetros são definidos por configuração.

imagem e as publica numa fila [**RabbitMQ**], que implementa o protocolo [AMQP] e transporta as mensagens entre os serviços através do [**Rebus**](event bus, ou barramento de eventos).

imagem OrdemDeCompra e IdentityServer, que irão tratar de gravar os dados do novo pedido e da alteração de cadastro do usuário, respectivamente.

Quando o serviço OrdemDeCompra lê a mensagem de novo pedido, o componente que recebe a mensagem (**handler**) do evento não é o mesmo que grava o pedido no banco de dados: esse papel é representado por outra classe, o **repositório de pedidos**.

Porém, em vez de invocar um método na classe de repositório diretamente, o manipulador do evento envia um comando, que é tratado por um componente intermediário o **mediator** implementado pela biblioteca [**MediatR**] 

![]

Esse manipulador cria uma instância do repositório e invoca o método de criação de novo pedido. Esse processo é feito para permitir o **desacoplamento** entre o manipulador de evento do event bus e a classe de repositório de pedidos.

Podemos pensar nesses comandos como um tipo de mensagem síncrona, que é processada dentro de um mesmo serviço. A biblioteca MediatR implementa dois padrões de projeto: **Command e Mediator**.

No final, quando o pedido é gravado no banco de dados, o serviço OrdemDeCompra publica uma mensagem em tempo real, feita através de [WebSockets ] com o [SignalR.NET], notificando o cliente **JavaScript** da aplicação MVC, indicando que o novo pedido foi gerado.

![]

Essa indicação de “novo pedido” aparece num contador de notificações na parte superior da página do website, como é comum em diversos aplicativos hoje em dia:

![]

# Conclusão
A arquitetura de microsserviços não deve ser usada indiscriminadamente e nem deve ser vista como panaceia para todos os males da tecnologia. Dito isto, microsserviços é um conjunto de técnicas bastante vasto e riquíssimo para o exercício de boas práticas e padrões de arquitetura de serviços, programação de componentes e operações na nuvem.

Felizmente, a plataforma **.NET** está pronta para oferecer as tecnologias necessárias para vencermos os obstáculos no desenvolvimento de soluções nessa arquitetura. Neste artigo, vimos como usar aplicar esses padrões de arquitetura com a ajuda de algumas tecnologias de comunicação entre serviços.

Agora, que tal você mesmo praticar um pouco a comunicação entre serviços usando ASP.NET Core? Baixe [**o código-fonte da aplicação de exemplo**] de e-commerce **.NET** que acompanha este artigo, e veja como funciona o código para comunicação entre os serviços!

Para saber mais sobre aplicações web e serviços com .NET e ASP.NET Core, dê uma olhada na nossa [**Formação .NET aqui da Alura**]! Tem também o curso de [microservices] com Java e Spring.







Vamos imaginar o seguinte cenário: **você precisa treinar o Thiago, futuro líder de design na sua empresa**, em Scrum e Usabilidade. Ele também deveria se aprimorar em design com _Sketch_.

Então, você acaba escolhendo três treinamentos, todos **com duração de 7 horas** e online, para otimizar o tempo. Ficou combinado que o Thiago fará os três cursos em três dias, sempre nas segundas-feiras.

## O problema dos treinamentos extensos

Durante o período da capacitação, ele dedica o seu horário de trabalho exclusivamente a ela, sem contribuir com o desenvolvimento do trabalho do seu cargo. Ele não está disponível para a sua equipe ou para resolver situações urgentes. Assim, é possível notar que na terça-feira, **ele chega cansado e tem muito trabalho acumulado para fazer**.

Quando você pergunta como vão os cursos, Thiago diz que está tudo bem, mas que não deu tempo de praticar alguns assuntos das aulas e que queria ainda pesquisar e aprender mais sobre o tema para poder implementar as técnicas aprendidas no trabalho de seu time.

imagem com vias mais informais, como webinars, hangouts com especialistas no assunto, vídeos curtos no YouTube ou cursos online. Assim, os colaboradores adquirem conhecimento e novas habilidades de diversas formas.

![Microlearning em treinamentos corporativos]

Também recomendamos que você incentive os colaboradores a consumirem conteúdos **de forma intercalada**. Desta forma, eles podem evitar o cansaço de aprender muito sobre um assunto de uma vez só.

Vamos voltar ao exemplo do nosso futuro líder de design, o Thiago. Em vez dele fazer um curso extenso e depois começar outro, ele pode adotar o microlearning da seguinte maneira: na segunda-feira, ele assiste um curso de Scrum; na terça, lê um pouco de um livro sobre liderança; na quarta, participa de uma palestra sobre Usabilidade; na quinta, aprimora-se praticando no Sketch; e na sexta, continua com o curso de Scrum.

### Explore o blended learning

A combinação de recursos online e treinamentos presenciais, também chamada de _blended learning_, pode entrar em pauta na hora de criar uma estratégia de desenvolvimento de talentos na sua empresa.

Por exemplo, você pode **usar cursos presenciais em áreas em que é necessário experimentar as habilidades e “pôr a mão na massa”**,  enquanto os cursos online, artigos ou webinars podem servir perfeitamente na preparação para a prática, especializações, atualizações ou em assuntos que não requerem explicação do instrutor em tempo real – onde o colaborador consegue aprender seguindo instruções do curso, vídeo ou artigo.

O _blended learning_ também pode ser de grande ajuda na hora de repensar o orçamento. Os cursos presenciais exigem investimento de tempo e recursos financeiros além do próprio treinamento, como o deslocamento dos participantes ou do instrutor. Assim, mesclar a capacitação presencial com cursos online auxilia **otimizar o investimento**.

### Maximize o tempo produtivo com o mobile learning

Recomendamos também o uso do _[mobile learning]._ Essa modalidade de ensino permite as pessoas da sua empresa a aprenderem em horários e locais mais convenientes, possibilitando uma maior flexibilidade na hora de participar de um treinamento.

Com um **aplicativo de cursos online** em que seja possível baixar os conteúdos para consumi-los também offline, um funcionário pode aprender até em horários que normalmente são improdutivos, tais como o trajeto ao trabalho.

### Potencialize a cultura de aprendizado

Inclua na sua estratégia de aprendizagem pesquisa e leitura de artigos ou livros, e incentive os colaboradores a tomarem um pequeno período do seu horário de trabalho exclusivamente para o estudo.

![Microlearning em treinamentos corporativos]

Se os seus funcionários se interessam por **palestras** ou outros eventos que podem acrescentar na vida profissional, isso pode ser mais um uso criativo de microlearning. **O****s membros da equipe podem compartilhar o conhecimento com os colegas**, assim contribuindo com uma cultura forte de aprendizado na empresa.

## Microlearning: uma aprendizagem de alto impacto

O ponto forte do microlearning é o impacto que ele pode ter nas pessoas dentro da sua empresa, independente do tempo consumido com a aprendizagem.

Em outras palavras, **um curso online com duração de 5 horas de vídeos e exercícios pode fazer uma diferença muito grande para um colaborador**. Este pode adquirir o mesmo conhecimento como se estivesse participando de um treinamento mais extenso, que interferisse no trabalho em equipe ou talvez tivesse um custo elevado para a empresa.

Combinar as formas mais tradicionais de aprendizado corporativo com vias informais – uso de artigos, vídeos curtos ou webinars – é um caminho que leva à eficiência e à flexibilidade. Com o microlearning, a sua equipe consegue aprender e, ao mesmo tempo, ser produtiva.

**E como é a sua empresa?** A sua equipe já aprende com conteúdos curtos no dia a dia? Ou você pensa em incluir o microlearning em sua estratégia de desenvolvimento?

Para ter um time atualizado e preparado para futuros desafios do mundo corporativo, conheça mais tendências emergentes no whitepaper **6 tendências da educação corporativa para 2018**! [Baixe o material agora] e aplique novas metodologias e tecnologias da forma mais proveitosa para a sua empresa.




Eu recebi uma lista de alunos em um arquivo CSV e preciso cadastrá-los no meu sistema:

```
 Alex Felipe;21 
 Cléber Nascimento;16 
 Felipe de Souza;25 
 João da Silva;18 
 Juliana Guimarães;18 
 Maria Cristina;23 
 Pâmela Aguiar;17

```

java

Preciso digitar as informações deles no meu sistema. Usarei a classe `Scanner` do pacote java.util para receber os dados do teclado:

java

Pegando o primeiro resultado:

```
 Digite o nome do aluno: Alex Felipe 
 Informe a data de nascimento do aluno: 21 
 aluno: Alex Felipe 
 idade: 21

```

O método `nextLine()` permite a leitura de `String` e o método `nextInt()` permite a leitura de `int`. Enviando os dados para o aluno:

java

Verificando a impressão:

```
 nome: Alex Felipe idade: 21

```

Ótimo, consegui cadastrar um aluno! Agora vamos cadastrar o restante dos alunos:

```
 Digite o nome do aluno: Cleber Nascimento Informe a idade do aluno: 16 nome: Cleber Nascimento idade: 16 Digite o nome do aluno: Felipe de Souza Informe a idade do aluno: 25 nome: Felipe de Souza idade: 25 Digite o nome do aluno: João da Silva Informe a idade do aluno: 18 nome: João da Silva idade: 18

...

```

Espera aí! Isso já está ficando cansativo! Será que eu vou ter que cadastrar todos esses alunos na unha? Se apenas com 7 está sendo esse sofrimento imagine com mais 30! Vai tirar a paciência de qualquer um!

Além de permitir a leitura de dados por meio do teclado, a classe `Scanner` **possibilita a leitura de arquivos**! Basta informar no construtor que ao invés de ler pelo teclado(System.in), queremos ler um arquivo específico instanciando a classe File do pacote java.io:

java

Pronto! Agora precisaremos ler linha por linha fazendo iterações com um while por meio do método `hasNext()` que informa se ainda existe linhas para ler:

java

Para pegar o próximo elemento do arquivo usamos o método `next()`:

java

Se testarmos nosso código:

```
 Alex Felipe;21 
 Cleber Nascimento;16 
 Felipe de Souza;25 ...

```

Ops! Dessa maneira eu não vou conseguir separar os dados do aluno... Além de fazer a leitura do arquivo, o `Scanner` tem o método `useDelimiter()` que **delimita a leitura do elemento**, ou seja, determina até que ponto precisa pegar o elemento, por exemplo, eu quero que ele pegue o elemento até aparecer um ";":

java

Executando o código mais uma vez:

```
 Alex Felipe 21 
 Cleber Nascimento 16 
 Felipe de Souza 25

...

```

Ótimo! Separei as informações, agora irei instanciar os meus alunos:

java

Testando o nosso código:

```
 Exception in thread "main" 
 java.lang.NumberFormatException: For input string: "21 Cleber Nascimento"

```

Que estranho... Problema na conversão? Que String grotesca é essa? Parecia que as informações de nome e idade estavam separadas corretamente... O que aconteceu nesse caso é que o nosso delimitador está separando as informações até o momento em que ele acha um ";" entre a idade e o próximo nome do aluno não existe um ";" tem apenas uma quebra de linha, ou seja, precisamos informar ao `Scanner` que **ao mesmo tempo que delimitamos pelo ";" queremos que ele delimita por quebra de linha também**:

java

O pipe(|) indica que queremos que delimite por ";" ou "\\n" que significa quebra de linha. Testando novamente:

```
 Exception in thread "main" 
 java.lang.NumberFormatException: For input string: "21 "

```

Outra Exception? Que doideira! Como podemos ver ele já separou a idade do nome do outro aluno, porém ele ainda deixou uma quebra de linha e por isso não foi possível fazer a conversão para `int`. Nesse caso podemos usar o método `trim()` da própria classe `String` que ajusta o conteúdo contido na `String` **eliminando quebras de linhas ou espaços em branco**:

java

Conferindo o resultado:

```
 nome: Alex Felipe idade: 21 
 nome: Cleber Nascimento idade: 
 16 nome: Felipe de Souza idade: 25

...

```

Excelente! Agora o meu sistema é capaz de ler o arquivo CSV e cadastrar os alunos pra mim!

Vimos que para receber dados de meios externos em java nós podemos utilizar a classe `Scanner` que tem a capacidade de receber dados por meio do teclado ou arquivos, porém nem sempre quando lemos as informações de um arquivo o resultado é esperado, então precisamos sempre verificar as seguintes informações:

- Se existir algum carácter que separa cada elemento use um delimitador
- Se for necessário utilizar mais de um delimitador utilize o pipe (|)
- Se sempre estiver pegando o próximo elemento ao invés da linha inteira, sempre use o delimitador '\\n'

Gostou da classe Scanner? Quer conhecer outras alternativas para a classe `Scanner` e outras bibliotecas da linguagem Java? Conheça a [**Formação Java**].




Neste episódio do Alura Live, recebi o Eduardo Matos, desenvolvedor na GetNinjas, pra falar sobre esse assunto da moda, confira:

https://www.youtube.com/watch?v=qSzFIQjS1jg

Gostou deste vídeo? Então não deixe de se [inscrever em nosso canal no Youtube!] O Alura Live vai ao ar todas as quintas lá em nossa [página no Facebook]. Confira quais os assuntos dos próximos episódios [aqui].

Quer saber mais? Assista a o [episódio completo] (começa em 6:10). Não deixe de seguir [eu], a [Alura] e o [Eduardo] no Twitter! :)

Confira também [o curso de Progressive Web Apps da Alura] e as carreiras relacionadas: [**Formação Front End**]

Para outros cursos e carreiras, acesse a [Alura]!




Hoje muito se fala sobre UX Design. Vemos o termo sendo aplicado de diversas formas, sendo abordado de pontos de vista diferentes, gerando polêmica em alguns artigos e mostrando que o assunto deve ser profundamente estudado, principalmente para os aspirantes da área, de forma que compreendam com clareza o que ele significa.

Muitas das vezes, para que se possa entender com maior facilidade o que faz parte de um escopo, ou o que queremos, é necessário pensar no que **não** queremos e no que **não** faz parte do escopo também.

Partindo deste princípio, vamos abordar 6 "nãos" que todo UX Designer, ou todo aspirante à UX Designer, deve ter em mente.

## 1 - UX Design NÃO é só Design

Quando ouvimos este nome pela primeira vez acabamos gerando essa interpretação e associamos o Design como o trabalho de um UX Designer.

Porém, ao contrário disso, a rotina desse profissional envolve pouquíssimas vezes softwares gráficos e muito mais planilhas, dados, pesquisas, reuniões e outros métodos que fazem o cotidiano da área ser, em sua grande parte, longe do computador.

Quando falamos sobre Design, estamos falando com maior precisão da área de UI Design que é responsável pelo desenho das interfaces. O UI é apenas uma das áreas que a Experiência do Usuário engloba.

O trabalho de um profissional de UX pede que ele esteja presente e envolvido desde o início do projeto até depois do lançamento, de forma que ele analise, acompanhe, monitore e até melhore continuamente o produto lançado.

As decisões sobre o Design fazem parte do processo, porém, existe um trabalho árduo antes de chegarmos a criação das telas. Deve-se compreender que wireframe, sitemaps, protótipos, fazem parte do conjunto mas não é só isso.

A complexidade da área envolve não só a análise dos elementos de interação com o produto, como duplo-clique, duplo toque, slide para abertura de tela, posicionamento dos botões e etc.

Mas também, reflexões em torno de qual necessidade o usuário possui para que meu produto possa agregar valor para ele e se ele voltará a utilizá-lo outras vezes.

## 2 - UX NÃO tem respostas certas

A primeira parte de um trabalho em UX requer a busca por perguntas e não por respostas. Tendo feito uma interpretação clara do problema, será muito mais fácil encontrar a solução adequada.

Além de facilitar todo o processo no geral, saber as perguntas certas também auxilia na apresentação da solução criada, de forma que ela seja comunicada com clareza para o restante da equipe.

Afinal, por melhor que seja a solução, se o restante do time não a compreende, o valor se perde.

Quanto mais questionarmos, quanto mais perguntarmos "como" e “porquê” para cada funcionalidade, interação, ideias e etc, mais próximos estaremos de experiências mais assertivas, que vão de encontro com a satisfação do usuário.

Muitas das vezes nesta área, a busca por perguntas certas parte de hipóteses, mas nada em UX deve ter como base um simples "eu acho".

Em outras palavras, cada hipótese deve ser validada sempre que necessário e para isso utilizam-se de testes, entrevistas, protótipos, novas reuniões, analytics e tudo o que for preciso para projetar a solução mais correta possível.

## 3 - Usuários NÃO são todos iguais e você NÃO é usuário

Vale muito a pena compreender que o UX Designer, tem como papel representar o usuário e defendê-lo em cada uma das etapas do projeto.

Ele precisa saber quem é esse usuário, qual a necessidade, de onde ele vem, e muitas outras informações que vão auxiliar na hora de equilibrar os objetivos do projeto com a satisfação desse usuário ao utilizá-lo.

**Existem muitos produtos parecidos no mercado, muitos serviços idênticos, cujo diferencial é uma ótima experiência, projetada com cautela, que permite ao usuário querer usar ou ter aquele produto específico mesmo diante dos concorrentes, gerando o que chamamos de preferência e fidelidade.**

Devemos compreender não só sexo, lugar onde mora ou faixa etária e sim pesquisar aspectos emocionais, necessidades, objetivos, o cenário da vida desse usuário, suas reações, e assim criar algo sob medida para este perfil encontrado.

Ouve-se muito falar sobre **[Personas]** e na forma como elas nos ajudam a criar usuários ficcionais que poderão ser utilizados como referência para criação, validação e informação para o projeto.

Quando criamos proto-personas, criamos em cima de hipóteses, mas é através de técnicas como enquetes, testes, entrevistas, pesquisas quantitativas e outras, que conseguimos validar essas hipóteses.

Por isso é essencial sair da frente do computador e ir de encontro aos seus usuários, conversar e identificar:

- Comportamentos
    
- Padrões
    
- Tipo de personalidades
    
- Necessidades
    
- Objetivos
    
- Dores e etc.
    

Lembre-se sempre que você não é usuário. Não se deve validar hipóteses com você mesmo, pois ainda que você tenha perfil parecido com o tipo de público que o projeto deseja atingir, você não é território neutro!

Sendo assim, Prepare as anotações e vá ao encontro de seus usuários.

## 4- UX NÃO é só para produtos digitais

Todos os processos que fazem parte da área podem ser considerados uma fusão de outras áreas como Psicologia, Engenharia, Design, Tecnologia, usando conceitos de Ergonomia e Design Centrado no Usuário que já existem há anos.

**Dessa forma, ainda que muito se ouça sobre a aplicação em produtos digitais, também é possível encontrar a área de Experiência do Usuário na criação de serviços, objetos e até ambientes, tudo feito a partir da identificação das interações que o usuário terá com estes produtos.**

## 5- UX NÃO é função de uma pessoa só.

Como já dito anteriormente, a área de UX requer muitas reuniões, muita conversa e muito debate. Desde as pesquisas iniciais até o código: Todo o esforço deve ser feito por uma equipe multidisciplinar.

Um projeto deve ser feito por um time que engloba diferentes áreas, com diferentes visões, onde em sessões colaborativas, reuniões ou bate-papos ocorre a mediação destes diferentes pensamentos de forma a estruturar o projeto e levá-lo com maior facilidade ao objetivo desejado.

## 6 - UX Designer tem que saber dizer NÃO!

**Um estrategista de UX precisa saber dizer "não". Nem tudo é ideal para um projeto!**

Seguir tendências nem sempre é o melhor caminho, por exemplo, nem todos os usuários saberão encontrar um menu hambúrguer ou terão uma boa experiência ao utilizar uma rolagem infinita.

Deve-se compreender que as tendências se tornam tendências porque estão dando certo, porém, será que o meu perfil de usuário combina realmente com o que está na moda atualmente?

O Design não é mais importante do que usabilidade, fazer algo diferente nem sempre trará benefícios.

Ainda existem Designers que desejam fugir do padrão, como por exemplo, retirando o menu de navegação do topo, no entanto, já existe um comportamento padrão em nossos usuários: para navegar eles vão procurar o menu no topo.

**Sendo assim, fugir do padrão pode gerar rejeição em alguns casos.**

Cada projeto é um projeto! Cada público tem suas características e nem sempre, por mais que você queira, seguir determinado caminho será bom para ele. E para não ter dúvidas de qual caminho seguir, todos os pontos citados neste artigo serão de grande ajuda.

Obviamente, por ser uma área tão vasta, que engloba tantas características, esses são apenas alguns pontos e que podem (e devem!) ser aprofundados e gerar novas reflexões através de muita pesquisa, estudo e claro, "mão na massa".





O [**mercado de programação**] foi se modificando muito ao longo dos anos, trazendo diferentes desafios e novas oportunidades. 

Para discutir um pouco dessa realidade, tivemos um Alura Live com Paulo e Guilherme Silveira falando um pouco do mercado de trabalho nessa área, respondendo dúvidas e levantando pontos importantes para esse profissional nos dias de hoje.

Confira o que rolou na live:

https://youtu.be/wUX-tRMynHE

Na Alura nós temos diversas [**formações na área de programação**]! Prepare um plano de estudos com um [**calendários que faça sentido para você e sua rotina**] !!!

[**Escolha agora mesmo o seu plano**] e garanta um ano cheio de novas oportunidades!




Dependendo do tipo do cabo, temos conexões mais rápidas, ou seja, temos uma maior taxa de transmissão.

E da mesma forma que o [**Wi-Fi tem seus padrões**], os cabos de rede também segue algumas especificações. 

> "Mas como eu escolho um cabo de rede?"

Tudo depende da placa de rede que seu computador possui, também chamada de **NIC (Network Interface Card)**, e do tanto de dados que sua rede trafega.

## Conhecendo os tipos de cabos

Existem basicamente dois tipos de cabos de rede, o **cabo coaxial** e o **cabo de par trançado**.

### O cabo coaxial

O **cabo coaxial** consegue transmitir dados em até **10 Megabits por segundo** (Mbps). Geralmente ele é usado pelos provedores de internet para conectar a rede local da casa com a internet. É aquele cabo que liga no seu roteador.

Esse foi um dos primeiros cabos utilizados em redes locais. Como ele permite frequências muito elevadas, este cabo também é muito usado para transmissão de imagens para a televisão.

Apesar de conseguir alcançar grandes distâncias sem a necessidade de replicar o sinal, quando utilizamos esse tipo de cabo para montar redes locais, temos alguns problemas.

Quando utilizamos o cabo coaxial, nossa rede fica em uma topologia chamada de [**Barramento**]. Essa topologia funciona, basicamente, assim:

Todos os computadores da rede são conectados a um cabo principal. Quando um computador da rede se comunica, todos os outros esperam para poder falar. Caso dois computadores se comuniquem ao mesmo tempo, ocorre uma colisão e os pacotes precisam ser retransmitidos.

Logo, em redes com muitos computadores, isso se torna um problema, pois um computador sempre precisa esperar o outro para poder se comunicar, o que provoca atrasos no envio de pacotes.

### Já o cabo de par trançado

Este cabo é muito utilizado em redes locais, recebe este nome, pois é composto por quatro pares de cabos que são entrelaçados entre si. Isso faz com que esse cabo sofra menos interferências eletromagnéticas.

Esse cabo, ao contrário do coaxial, pode ser usado em topologias onde todas as máquinas se comuniquem ao mesmo tempo. E também conseguem ser utilizados para ligar equipamentos de redes, como [**hubs e switches**].

> "Mas como o cabo sabe qual máquina está se comunicando?"

Todo cabo de rede utiliza um conector. O cabo coaxial, por exemplo, utiliza um conector chamado de **BNC**, já os cabos de par trançado utilizam um conector chamado de **RJ-45**:

imagem. Está é deve ser a categoria de cabos mais utilizada.

A categoria **6** foi feita para transmitir grandes quantidades de dados. Ela transmite de 1Gbps à 10Gbps. Esta categoria está aos poucos substituindo a anterior.

Além dessas, existem outras categorias de cabos de par trançado, como a categoria **5** que já está em desuso, ou a categoria **6a** que transmite dados a partir de 10 Gbps.

## Para saber mais

A escolha de cabos de rede são muito importantes, pois são eles quem de fato transmitem os dados. Dependendo da escolha, eles podem causar um gargalo na rede que, por consequência, ficará lenta.

Cabos metálicos, como o **cabo coaxial** e o de par trançado, podem sofrer **interferências eletromagnéticas** de outros cabos, o que prejudica na transmissão dos dados. Por isso, alguns cabos são "blindados" para evitar essas interferências.

A blindagem nada mais é do que uma malha de metal que cobre o cabo. Quando um cabo de par trançado é blindado, dizemos que ele é um **cabo STP (Shielded Twisted Pair)**.

Além desses cabos metálicos, existem outros que transmitem dados, não pela eletricidade, mas por pulsos de luz, como é o caso da fibra ótica.

Como a fibra ótica utiliza a luz para transmitir os dados, ela não sofre interferências de outros cabos. E, da mesma forma que os cabos metálicos, possui categorias. Existem fibras óticas monomodo e multimodo.

A principal diferença entre esses dois tipos de fibra é que na **monomodo** a luz não reflete dentro da fibra, enquanto na **multimodo** é refletida.

Como na monomodo a luz consegue ir direto ao destino, sem refletir, os dados conseguem ser transmitidos com mais rapidamente chegando a terabits por segundo.

Aqui na Alura temos uma [**formação redes**], nela você verá sobre cabos de conexão, protocolos e equipamentos de rede, além de segurança da informação.




Tenho um banco de dados com informações sobre vendas de jogos. Gostaria de saber como estão as vendas por produtora, então agrupo como de costume:

sql

Mas repara que tem uma dezena de resultados "menores" que não estou tão interessado. Só queremos quem vendeu mais de 500?

sql

O banco de dados não aceita resultados de funções de agregação na cláusula "where", pois ela é usada para selecionar os registros...antes de agregar!

Subconsulta neles!

sql

Resolvido? Sim, mas com uma "volta ao mundo".

Será que o SQL já não foi espertinho pra permitir "queriar" o resultado de uma agregação? Queria dizer que dentre os grupos que formei, aqueles que **tem** mais de 500, em inglês: **having**.

sql

E se quer se aprofundar em SQL e banco de dados, vale conhecer nossos [**cursos de Oracle**](/formacao-certificacao-oracle-12c) e [**cursos de SQL**] da **Alura**.



imagem

O engajamento profissional pode ser definido como a relação entre o(a) profissional e o ambiente em que ele(a) trabalha. Mas, afinal, porque investir em estratégias de engajamento corporativo? 

# Criando um time engajado

Precisamos entender que satisfação e engajamento, embora parecidos, têm significados diferentes. A satisfação está muito mais ligada ao que a empresa oferece ao colaborador e ao que ele espera receber. 

Porém, quando engajados, profissionais tendem a desempenhar um trabalho excelente, pois estão alinhados aos propósitos da empresa, e não se limitam apenas a entregar o básico. 

Este alinhamento de propósitos não se resume somente ao profissional, mas ao pessoal. Isso acontece porque os propósitos da empresa estão diretamente ligados aos propósitos individuais dos colaboradores que encontram que encontram razão em fazer o que foi proposto. 

[**Estudos e análises**] apontam que a possibilidade de aprender e vivenciar novos desafios é o maior benefício não-financeiro que uma empresa pode oferecer aos colaboradores e colaboradoras. 

Com isso, cria-se um ambiente corporativo saudável, que engaja e motiva os funcionários. Todos possuem autonomia e responsabilidade para apresentar suas ideias originais, sem medo de como elas serão recebidas pela gestão e colegas estimulando assim uma cultura de aprendizado entre os(as) funcionários(as). 

# Cultura de aprendizado

É possível criar uma nova cultura na empresa através do compartilhamento de conhecimento, sendo a corporação grande ou pequena. 

Além disso, há aprendizado contínuo, onde, além de não ficarem parados, os(as) funcionários(as) podem sugerir novas estratégias, evoluindo a cada dia mais. 

Quais outros benefícios o **engajamento corporativo** é capaz de nos oferecer?

# Vantagens do engajamento corporativo

Além da cultura de aprendizado, existem outros benefícios não-financeiros relevantes relevantes para criar e manter o engajamento de uma equipe, são eles: 

**Conhecimento individual e coletivo**: é imprescindível que a/o líder da equipe a conheça, tanto no coletivo como individualmente, justamente para criar relações de confiança e trabalhar as dificuldades de cada um;

**Feedbacks**: são extremamente relevantes pois norteiam a jornada profissional dos colaboradores. Os feedbacks reconhecem os pontos positivos e ajudam a melhorar os pontos de atenção;

**Alinhar a cultura pessoal à corporativa**: muitos funcionários sentem-se motivados quando encontram razão nas tarefas designadas, não somente para cumpri-la, mas pela satisfação envolvida na confecção;

**Encarar erros como algo positivo**: os erros, quando analisados e reconhecidos, são construtivos. É possível entender como ele aconteceu, e trabalhar para diminuir sua ocorrência;

**Aumento de resultados**, assim como foi dito anteriormente, uma equipe engajada se esforça para entregar um trabalho excelente. Assim, é possível melhorar os resultados da equipe e da empresa como um todo.

Citamos alguns exemplos, mas há diversas ações que, combinadas, melhoram o dia a dia da corporação. Funcionários engajados formam equipes engajadas, que formam uma corporação engajada e com propósitos similares, aumentando a qualidade e quantidade de entregas. 

Aqui na **Alura** temos [**planos corporativos**] que podem ajudar a **aumentar o engajamento de seu time** por meio de nossas funcionalidades.









imagem 

## O que é Gestalt?

**A psicologia da Gestalt** é uma escola de pensamento que analisa a mente e os comportamentos humanos como um todo.

Ao tentar entender o que nos rodeia, o que a Gestalt sugere é que não nos concentremos em cada componente pequeno, mas sim em como eles interagem uns com os outros, em sistemas complexos.

O princípio de Gestalt desempenha, por isso, um papel importante no desenvolvimento moderno do estudo da sensação e da percepção humana, no design e na publicidade.

## Quais são as origens da Gestalt?

Você já notou como um conjunto de luzes de Natal piscando geralmente parece se mover? De acordo com o princípio de Gestalt, esse aparente movimento acontece porque nossas mentes são capazes de preencher as informações faltantes.

Originando-se no trabalho de **Max Wertheimer**, o princípio orientador por trás da Gestalt é de que o todo é maior do que a soma das suas partes. Ou seja, considera-se que um conjunto de informações é mais relevante do que um trecho.

A crença de que o todo é maior do que a soma de suas partes levou esses teóricos à descoberta de vários outros fenômenos da percepção. E o princípio de Gestalt ajudou a criar a ideia de que a percepção humana não é só ver o que está contido no mundo ao nosso redor. É também ser influenciado por uma série de motivações e de expectativas.

## Por que o princípio de Gestalt é importante?

Hoje, optamos cada vez mais por realizar tarefas em um mundo digital, graças aos computadores.

Se no passado a única maneira de transferir dinheiro para uma conta bancária era visitar uma agência bancária, entrar e realizar a transação com auxílio de outro ser humano, hoje um aplicativo faz tudo isso para nós com alguns cliques.

O desenvolvimento da [**era digital**] nos forneceu conveniência e serviços rápidos, mas abandonar o ambiente 3D só é possível porque possuímos um sofisticado sistema de percepção que organiza os estímulos visuais a nosso favor.

Nosso cérebro possui a tendência de organizar o mundo ao nosso redor, o que pode nos ajudar a entender melhor o que acontece à nossa volta, e o princípio de Gestalt é uma forma de descrever essas tendências para que designers e outros profissionais de artes visuais consigam fazer o melhor trabalho possível.

Entendendo o princípio de Gestalt, o seu trabalho como designer será mais bem-feito e terá melhores resultados. Os usuários ficarão mais satisfeitos e você obterá resultados mais harmoniosos.

## Quais são as leis da Gestalt?

Existem muitas leis que compõem o princípio de Gestalt e que um designer pode utilizar na sua rotina de trabalho. A seguir, você vai conhecer as principais:

### Similaridade

Usuários percebem objetos que parecem semelhantes como tendo usos semelhantes. Essa é uma estratégia simples que você pode usar em seus designs como meio para comunicar a função de um determinado objeto rapidamente, [**aumentando a usabilidade**].

Ao criar ícones ou estruturas similares, por exemplo, você economiza muito tempo explicando para o usuário qual é a sua função.

### Proximidade

Objetos que estão próximos uns aos outros são percebidos, segundo o princípio da proximidade, como mais relacionados do que objetos mais separados. A proximidade diz que quando elementos são posicionados um perto do outro eles são vistos como parte de um grupo, e não individualmente. **Eles não precisam sequer ser parecidos, o mero fato de dividirem o mesmo espaço é o suficiente para a proximidade funcionar.**

### Agrupamento

Seguindo o raciocínio da similaridade, o agrupamento repete os seus efeitos em objetos agrupados mesmo quando eles parecem diferentes. Existem, portanto, 2 maneiras de usá-lo:

- adicionar uma barreira visível para incluir elementos, como um círculo ou uma caixa, o que pode ser visto no menu de websites;
- aproximar elementos para que eles se comportem como um conjunto, o que pode ser visto ao [**diagramar**] as notas de rodapé de um livro.

### Fechamento

O fechamento, por sua vez, aplica as propriedades mencionadas pelo princípio de Gestalt e faz com que usuários completem objetos na sua mente caso eles estejam parcialmente obscurecidos.

O minimalismo e o uso de elementos parciais emprega o fechamento para economizar espaço e para se comunicar com eficiência.

### Paralelismo

**Elementos paralelos** uns aos outros são vistos como mais relacionados do que elementos não paralelos. Linhas que apontam, ou se movem, na mesma direção, são vistas como similares mesmo que sejam bastante diferentes.

### Continuidade

Por mais estranho que isso pareça à 1ª vista, o olhar do usuário cria um tipo de impulso à medida que ele se move de objeto para objeto em um layout, e a isso chamamos de continuidade.

Linhas, em geral, aumentam esse efeito. Tanto que é possível perceber curvas e retas onde elas não existem, apenas pela disposição dos elementos que compõem uma imagem.

O poder da continuidade se sobrepõe ao poder da cor. Vemos isso aplicado todos os dias nas barras de navegação verticais e horizontais.

### Simetria e ordem

Simetria é o que nos dá um sentimento de ordem, que tendemos a procurar nos objetos e layouts ao nosso redor. É, segundo a Gestalt, parte de nossa natureza impor essa ordem ao caos. Esse princípio nos leva a buscar [**equilíbrio nas composições**], mesmo que esse equilíbrio não seja perfeito.

Uma vez que nossos olhos encontram simetria e ordem, esses princípios são usados para comunicar informações rapidamente. Como quando identificamos aberturas e fechamentos de colchetes numa imagem como sendo parte de um todo, ainda que elas desrespeitem o princípio da proximidade.

### Conexão uniforme

A Gestalt diz que elementos que estão visualmente conectados são percebidos como mais relacionados do que elementos sem conexão. Isso significa que 2 figuras idênticas em um layout, quando desconectadas, são vistas diferentemente do que as suas figuras disformes ligadas por uma linha.

De todos os princípios que sugerem que os objetos estão relacionados, a conexão uniforme tende a ser o mais forte.

Depois de ver todas essas leis não é de se admirar que o princípio de Gestalt tenha efeito sobre o trabalho de um designer, concorda? Aqui, citamos só alguns exemplos para que você se familiarize com o conceito. **Caso queira aprender um pouco mais sobre Gestalt,recomendamos o livro Gestalt do Objeto Sistema de Leitura Virtual da Forma, de João Gomes Filho.**

Agora que você já sabe bastante sobre o princípio de Gestalt, que tal dividir esse conhecimento com os seus amigos? Compartilhe este post nas suas redes sociais!

Quer aprender mais sobre Gestalt? Aqui na **Alura** temos um [**curso de Gestalt onde você colocará na prática seus conceitos e princípios**] reformulando o layout de um site.




Victoria foi desafiada por sua amiga Maya para demonstrar suas habilidades adquiridas no curso de [**JavaScript Avançado da Alura**].

Maya disponibilizou para Victoria o seguinte HTML que exibe uma tabela com os nomes e as idades de três pessoas.

html

O código anterior apresenta o seguinte resultado:
java

A tarefa de Victoria será somar todos os valores da coluna `Idade`, exceto as idades que forem menores que 18 anos. O resultado deve ser inserido na `td` com a classe `total`. Considerando tudo que a Victoria tem que fazer, quais são os passos que ela precisa realizar?

## Utilizando o querySelectorAll

Seu primeiro passo foi selecionar todos os elementos `td` com a classe `idade`. Ela utilizou [**document.querySelectorAll**] pois essa API do DOM aceita receber seletores CSS para buscar elementos e seu retorno será sempre um `NodeList`.

javascript

Victoria explicou para Maya que um `NodeList` parece com um array e que ela poderia tratá-lo da mesma forma. Maya ficou ressabiada, pois reconhecia que arrays em JavaScript são poderosos.

## Transformando um array com map

Sabendo que `querySelectorAll` retornava elementos do DOM que continham um texto com o valor das idades, ela lançou mão da função [**map**] para criar uma nova lista, contendo apenas os textos convertidos para números:

javascript

Contudo, para a alegria de Maya, o seguinte erro ocorreu:

js

Victoria lembrou que apesar de um [**NodeList**] ser parecido com um array ele não é, e por isso não possui a função `map`.

## Uma ajudinha do spread operator

Ela precisava muito que o `map` funcionasse, porque fazia parte da sua estratégia. Então,ela lembrou do [**spread operator**] e fez o seguinte:

javascript

Os `...` passaram para dentro do `[]` cada elemento individualmente e agora ela era capaz de usar a função `map`.

Maya olhou com certa desconfiança, mas reconheceu a validade do código e disse:

> "Muito engenhosa essa sua solução para converter um NodeList para um Array".

## Separando o que interessa com filter

Victoria já tinha uma lista de números, então ela só precisava filtrar essa lista considerando apenas as idades iguais ou maiores que 18 anos. Ela lançou mão da função [**filter**] que todo array possui:

javascript

Excelente! Agora, ela tinha certeza que no array filtrado só havia as idades 19 e 22. Maya gritou:

> "Ainda falta totalizar!".

## Totalizando com reduce

Sem pestanejar, Victoria usou a função [**reduce**] para reduzir os elementos de um array a um único valor:

javascript

Agora, de posse do total, ela só precisava inserí-lo na `td` correta. Contudo, Maya comentou:

> "Por que você usou const?"

Victoria pacientemente explicou que o único local do seu programa que faz sentido a variável `total` receber uma atribuição de valor é neste ponto. Não faz sentido mais tarde alguém atribuir um novo valor para total, pois o valor que ele já guarda foi devidamente calculado com base nas idades lidas das páginas.

Sem deixar que Victoria acabasse de explicar, ela tomou as rédeas da conversa e disse:

> "Eu sei, eu sei, acabei de lembrar. Variáveis declaradas com `const` não podem receber uma nova atribuição com o operador `=`."

Depois de fazer questão de mostrar para sua amiga que lembrava das razões do uso de `const` ela engatou um novo comentário:

> "Aliás, você adora arrow function, usou com map, filter e reduce!".

Sobre o comentário da [**arrow function**] Victoria respondeu:

> "É uma maneira mais sucinta de escrevermos funções, além de outras características que não são importantes para o problema que estou resolvendo, como o escopo léxico".

## querySelectorAll vs querySelector

Em vez dela usar `querySelectorAll`, ela usou `querySelector`, pois este sempre retorna um elemento e não um array:

javascript

## Escrevendo ainda menos

Victoria, não se contentando, decidiu remover a variável `total` deixando seu código ainda mais enxuto:

javascript

## Uma homenagem ao jQuery

Ao ver o código, Maya disse:

> "Incrível, você fez tudo isso sem declarar uma variável! Só ficou meio grandinho ter que escrever document.querySelector e document.querySelectorAll".

Victoria, com astúcia respondeu:

> "Não tinha me preocupado com isso, mas posso enxugar o código desta forma, mas vou precisar de uma variável, aliás, farei uma homenagem ao jQuery usando a variável $".

javascript

Maya ficou com um olhar perplexo ao ver a solução. Sem que ela dissesse alguma coisa, Victoria explicou:

> "Eu criei um atalho para document.querySelectorAll guardando-a na variável $. Mas fazer simplesmente isso não funcionaria, porque $ perderia document como seu contexto, algo fundamental para que ela funcione. Daí, usei a função [**bind**] para criar uma nova função que mantivesse document como contexto. Aprendi isso estudando na Alura".

Maya sorriu.

## Conclusão

No final da conversa, Maya elogiou o código de Victoria por ela ter combinado seus conhecimentos de manipulação de DOM, spread operator, conversão de tipos, map, filter e reduce de uma só vez para resolver o problema que lhe foi dado.

Sorrindo, Victoria disse:

> "Só estava seguindo o caminho de uma cangaceira em JavaScript!".

Por fim, Maya pediu a Victoria que elaborasse um desafio para ela, nada mais justo depois de ter colocado a amiga à prova. Sabem qual desafio foi? Vocês só saberão no [próximo artigo]!

**Twitter: @flaviohalmeida**




No meu sistema de cadastro de produtos para um mercado, recebi uma lista com alguns produtos:

python

Cada produto é um objeto do tipo `Produto`, que é representado pela seguinte classe:

python

Note que a lista contém produtos em uma ordem aleatória. Porém, preciso ordená-los, isto é, saber quais são os produtos mais caros ou mais baratos, ou então, ordenar pelo nome para facilitar a visualização dos produtos. Então como podemos fazer isso?

## Ordenando lista de números

No Python, quando precisamos ordenar listas, podemos utilizar a função [sorted], por exemplo, para uma lista de números:

python

Temos o seguinte resultado:

python

## Ordenando lista de strings

Funciona perfeitamente! Mas será que para textos também funciona? Vejamos:

python

Então temos o seguinte o resultado:

python

## Ordenando lista de objetos

Aparentemente, funciona para tudo! Então podemos utilizá-lo para objetos também:

python

Vejamos o resultado:

python

### Critério de ordenação de objetos

Ué, não deveria ordenar? Deveria, mas precisamos primeiro pensar nas seguintes questões:

- Como ordenamos um objeto do tipo `Produto`?
- Pelo atributo `nome`? Ou pelo `valor`?

Observe que inicialmente não sabemos, pois em determinados momentos, podemos querer ordenar por `nome` ou por `valor`. Em outras palavras, o `sorted`, inicialmente, também não sabe como ordenar o nosso objeto!

Suponhamos que queremos ordenar por `nome`, como o `sorted` saberia disso? Não informamos em nenhum momento!

Portanto, quando **queremos ordenar um objeto** do tipo `Produto`, **precisamos informar por qual atributo ele será ordenado!**

### Definindo critério de ordenação do objeto

Para informar ao `sorted` por qual atributo desejamos que ele ordene, precisamos enviar o parâmetro `key` com o valor do atributo da classe desejada. Vamos tentar pelo atributo `valor`:

python

Observe que nesse caso, estamos utilizando o `get_valor` justamente por estarmos escondendo o atributo. Vejamos agora o resultado:

python

Veja que agora os nossos objetos foram ordenados pelo valor! Em outras palavras, agora estão ordenados dos mais baratos para os mais caros :D

Vamos tentar pelo `nome` também? Bora alterar e verificar se dá certo:

python

Então temos o seguinte resultado:

python

## Realizando ordenação reversa

Maravilha! Funcionou como o esperado! Entretanto, e se eu quiser da ordem inversa? Ou seja, do mais caro para o mais barato, ou então, da letra "z" para "a", como faremos isso?

Simples! basta adicionar o parâmetro `reverse` com o valor `True`. Vejamos o resultado ordenando pelo `valor`:

python

Temos o seguinte resultado:

python

Agora com o `nome`:

python

Testando o código novamente:

python

Funciona perfeitamente! Um recurso bem fácil que não exige inúmeras implementações para funcionar :)

Vimos nesse post que quando queremos ordenar listas no Python, podemos utilizar a função `sorted`. Vimos, também, que ela funciona perfeitamente para strings ou números, entretanto, quando queremos ordenar objetos, precisamos informar como ela deve ordenar o objeto, ou seja, enviando um atributo do objeto por meio do parâmetro `key`.

O que achou da ordenação de listas no Python? Fácil né? Que tal aprender mais sobre o Python e seus diversos recursos? Então dê uma olha nos nossos [**cursos online de Python**] aqui na Alura!




O Leonardo é uma daquelas pessoas que não se acomodam e correm atrás dos seus sonhos :) 

imagem, fiz dois sistemas por conta própria para mostrar meu conhecimento.

Agora, depois de três meses de muito estresse procurando um emprego, estou há três meses empregado como desenvolvedor back e front-end! Estou desenvolvendo um sistema do começo ao fim, prestando atenção sempre na qualidade do meu código.

Eu gostaria de agradecer muito à todos os meus professores, Maurício Aniche, Guilherme Silveira, Renan Saggio, Sergio Lopes, Leonardo Wolter, Luiz Fernando Oliveira e Flavio Almeida (tecladinho do mau rsrsrs). Atualmente estou estudando mais front, meu ponto fraco, para fazer esse projeto decolar, sei que tenho muito caminho pela frente, mas graças à vocês eu sei que estou no caminho certo.

Minhas dicas para quem está começando a programar é: não se desespere com novas informações, conhecimento é sempre bom, nunca deixe seu código ficar bagunçado ou com gambiarras, principalmente por preguiça e talvez o mais importante, estude e busque novos conhecimentos, programação não é pra quem tem preguiça de estudar.




Estou fazendo um projeto que calcula o preço de um imóvel dado o valor de seu IPTU. Para isso, juntei informações sobre vários imóveis:

```
-----------------------------------------
| Valor do IPTU (R$) | Preço do Imóvel (R$)
-----------------------------------------
1.000,00             | 500.000,00          
-----------------------------------------
250,00               | 125.000,00
-----------------------------------------
30,00                | 80.000,00
-----------------------------------------
2.596,00             |1.236.598,00
-----------------------------------------
```

A ideia é conseguir saber o preço do imóvel a partir de seu valor de IPTU. Mas como podemos fazer isso?

## Visualizando os dados

Já temos os dados dos IPTUs e o valor dos imóveis. E se utilizarmos esses dados para descobrirmos os valores dos imóveis no futuro? Isto é, com um valor de IPTU, descobrirmos o valor do imóvel.

Estou utilizando a [**linguagem R**] para fazer a análise dos dados. Para facilitar o trabalho, podemos criar um gráfico para ver como os dados estão dispostos. 

Para isso, vamos criar duas variáveis, uma com os valores dos IPTUs e outra com os valores dos imóveis.

r 

E pedir para o R **plotar (plot) o gráfico**:


r 

[imagem` para descobrir nossa função. Para isso, basta passar a variável `valores_imoveis` pelos (`~`) `valores_iptu`:

r 

Esse comando nos retornou algumas informações. Uma delas é a fórmula que passamos para o comando. 

Outras duas informações são: o valor **Intercept**, que é 5369.2, e o `valores_iptu`,que vale 601.4. Mas o que eles significam?

O comando `lm()` retorna para a gente uma **função afim**, ou uma **função do primeiro grau**,isto é, uma função que tem a forma: `f(x) = ax + b`. Os valores que o comando `lm` retorna são justamente os valores de `a` e `b`. No caso, nossa função ficaria:

r

Esse procedimento que utilizamos para descobrir a função é chamada de **regressão linear**. A **regressão linear é muito utilizado em estatística, análise de dados e machine learning**.

Podemos ver a reta da equação atribuindo o valor do retorno da função `lm()` a uma variável e passá-la na função `abline()`:

r

[![]]

Vemos a linha no gráfico gerada pela nossa função. Apesar de não passar por todos os valores, ela tem uma boa aproximação com os valores da amostra.

## Para saber mais

A regressão linear é muito utilizada na estatística, análise de dados e em machine learning. Existem várias aplicações que podemos utilizá-la. Neste caso, utilizamos a regressão com apenas uma variável, o IPTU, mas podemos ter outras variáveis. Em casos assim, falamos que temos uma regressão linear múltipla.

Aqui na Alura, temos vários cursos que mostram casos de uso com a regressão linear. Um deles, é o [**curso de estatística com R**], nele você verá os conceitos estatísticos e como aplicá-los com o R.

Também temos o curso de [**aprendizado supervisionado de máquinas**]. Nele mostramos os conceitos e algoritmos sobre aprendizado supervisionado, tudo isso utilizando Python.

Além desses, temos o [**curso de análise de dados com R**]. Aqui, vemos como utilizar o R para analisar os dados da nossa empresa, criando gráficos e modelos para isso.





imagem 

E é aí que entram os programas e técnicas de edição de imagem. Mais do que ajustes estéticos, a fase de edição, tratamentos e correções é essencial para adequar as peças às necessidades das campanhas publicitárias. Confira agora as razões pela qual toda imagem publicitária precisa de edição!

## Adequar a imagem ao conceito da campanha

Toda campanha publicitária, assim como qualquer projeto, começa pelo planejamento. E é nessa fase que são decididos os objetivos, a linguagem e a “cara” da peça.

Com relação à fotografia, é possível seguir por dois caminhos: a utilização de fotos de bancos de imagem ou a criação da foto exclusivamente para a campanha.

Caso seja utilizada uma imagem já pronta, é preciso adequá-la à linguagem da campanha, mas o custo é consideravelmente menor. Nesse caso, é preciso saber editá-la com bastante atenção. Cores, formas e objetos presentes na imagem podem atrapalhar muito o objetivo da peça publicitária.

Já se a opção for pela criação da fotografia, é possível pensar em toda a estética antes de executar os cliques. Mas, em compensação, o custo pode ser alto, uma vez que envolverá, no mínimo, um fotógrafo, um modelo e a locação.

## Corrigir sem exagerar

Apesar da sua grande utilidade para profissionais de diversos setores, ferramentas de edição como o **Adobe Photoshop** já foram utilizadas, muitas vezes, de maneira equivocada, mesmo em campanhas publicitárias de grande alcance.

Não é difícil encontrar em pesquisas na internet galerias com centenas de imagens desse tipo. Braços sem conexão com alguém, umbigos faltando, pessoas com corpos desproporcionais... A lista é grande e inclui vários erros bizarros!

Fato é que, quando bem utilizada, a edição de imagens consegue remover imperfeições que tenham passado despercebidas durante a criação da fotografia, trazendo o foco para o que realmente importa. E isso mudará de acordo com a necessidade. É mais comum vermos edições mais aparentes em campanhas que utilizam fotografias de pessoas, uma vez que o número de retoques é, naturalmente, maior no corpo humano do que em objetos.

Já as peças publicitárias de produtos, por exemplo, precisam de imagens que [**correspondam à realidade das mercadorias**]. Nesse caso, a edição é feita para aparar e retirar algum defeito que possa ter passado, sem alterar drasticamente a realidade do objeto fotografado.

## Criar quando necessário

Nem sempre o [**briefing**] realizado para a campanha na fase de planejamento tem relação com uma imagem mais próxima da realidade. Dependendo da característica da campanha, é possível que seja necessária uma edição mais elaborada, voltada para a combinação de elementos que fujam da realidade, ou seja, uma manipulação da imagem.

Nesse sentido, os softwares de edição não apenas são um auxílio, mas sim a principal ferramenta que faz com que seja possível obter o resultado desejado. E a etapa da edição se torna o principal momento de criação das campanhas.

Muitas peças são compostas, visualmente, pelas tão faladas montagens. Elas nada mais são do que o resultado da manipulação de vários elementos combinados para formar uma imagem final.

Para tanto, é preciso preparar cada um dos objetos antes de montá-los na peça. Isso significa que o trabalho de pré-produção, como remoção de imperfeições e recorte das imagens é também muito importante, facilitando a tarefa do criador.

Com as imagens em mãos, é hora de criar a peça publicitária. Combinando os diversos elementos com fundos, [**textos**] e outros materiais gráficos, o designer, profissional responsável por esse tipo de trabalho, seguirá o que foi determinado no planejamento para dar vida à campanha.

## Valorizar produtos

Como falamos no tópico anterior, nem todo tipo de publicidade demanda uma manipulação mais agressiva. Mesmo assim, é preciso entender que tanto no mercado da fotografia de produtos quanto aquela voltada para pessoas, o objetivo é enaltecer e valorizar o assunto fotografado.

Em um mercado inundado de imagens, é preciso se destacar para fazer uma campanha de sucesso se traduzir em mais vendas para a empresa. E é por isso que a fase de criação e, especialmente, a fase de edição de imagem se torna tão crucial no processo de desenvolvimento das peças publicitárias.

Agências de publicidade grandes possuem um setor de direção de arte muito forte, responsável pela elaboração e supervisão do projeto. Gerenciando o desenvolvimento da ideia, a execução e finalização do projeto, o diretor de arte guia a equipe de edição para que ela não fuja das diretrizes planejadas.

E é por isso que, hoje em dia, é mais difícil ver erros de edição e manipulação em peças de grande circulação. Além de um maior cuidado, o poder de ferramentas como o Photoshop é utilizado para ações essenciais, sem as quais não seria possível atingir o resultado desejado.

Levando em consideração o poder da imagem nos meios publicitários nos dias de hoje, é preciso ser minucioso e atentar aos mínimos detalhes na análise a execução das ações de edição e correções. Uma edição de imagem bem-feita é o diferencial na criação de campanhas de sucesso, o que pode ser crucial para o aumento das vendas do cliente.

Sem dúvida alguma, a etapa de edição de imagem na criação de campanhas publicitárias se tornou um passo fundamental no desenvolvimento desses produtos. Realizar ajustes e correções pontuais sempre foi um passo necessário, mas é preciso ter muito cuidado para não exagerar e acabar criando mais um exemplo de erros bizarros de Photoshop.

Gostou do nosso artigo? Tem muito mais no nosso blog! Para continuar acompanhando nossas dicas e novidades, não se esqueça de seguir a gente no [Facebook], [Twitter] e [YouTube]! Além de vídeos e aulas sobre as inovações do mercado de tecnologia, você ainda fica por dentro das principais novidades e lançamentos!




**Design System** é uma coleção de componentes reutilizáveis, padronizados para determinado produto, site ou sistema web. Diferente de um **style guide** (guia de estilos), um design system vai além: o design system unifica a linguagem de um determinado produto.

Encare o design system não como um projeto, mas como um produto interno da empresa, que precisa de pessoas que o atualizem enquanto desenvolvem soluções novas, novos componentes, novos guias de estilo. De botões arredondados e snippets de códigos a concepções de aplicação de marca, tom de voz de texto e o **microcopy**.

# Exemplos de Design Systems

Como a definição de design system ainda é viva, o ideal é enxergar exemplos conhecidos na comunidade, que possuem seu sistema publicado:

## Stack Overflow

O Stack Overflow possui um Design System com padrões que vão de classes CSS, uso de marca e até mesmo e-mail marketing. Muito completo e é um exemplo bastante conhecido na comunidade de UX e design:

https://stackoverflow.design/

imagem

## Adobe Spectrum

Na seção sobre cores do Design System da Adobe ela se preocupa com o modo noturno da aplicação.

https://spectrum.adobe.com/

imagem


## Claro Mondrian

Exemplo brasileiro, a Claro também fez seu próprio Design System, inclusive com bibliotecas em React de componentes específicos que eles criaram e usam:

https://mondrian.claro.com.br

imagem



# Podcast Design System

E para saber mais, gravamos um podcast focado no assunto que pode te ajudar nos primeiros passos:

spotify:4gSyKdBWXsTHM4Hz6Xh7nU

# Referências Design System

- [Dicas UX - Design System]
- [Diferença entre um style guide e um Design System]
- [O que é, e porque criar um Design System?]




Quando estamos desenvolvendo nosso código **PHP**, ninguém nos define regras de como desenvolver. Podemos fazer como quisermos e é bom que a gente tenha essa liberdade.

Mas, na medida que nosso sistema cresce e começamos a implementá-lo em varios lugares, surge, inevitavelmente, a necessidade de seguir algum padrão para que quem vá implementar ou dar manutenção consiga entender o que está acontecendo.

Ao desenvolver um método para validar os dados de um usuário, nada nos impede de escrever algo como:

php 

Perfeito, nosso método funciona. Mas, como funciona esse método? Quais validações ele faz? Onde começa o **if** e onde termina? Se alguém fosse, futuramente, dar manutenção nesse método, seria extremamente difícil!

É por isso que surgiram as PSRs ([**PHP Standard Recommendations**]). Para que haja maior interoperabilidade entre os desenvolvedores e projetos.

Uma das **PSRs é a PSR 2**, ou **Guia de estilo de codificação** ([**Coding Style Guide**]), que aborda como deve ser feita a formatação do nosso código para facilitar a leitura por outros desenvolvedores. Algumas das indicações desse guia são:

- Devemos usar 4 espaços para identação, não tabs.
- Não devemos fixar um numero de caracteres por linha, mas é bom que uma linha tenha menos de 80 caracteres.
- A abertura de colchetes de classes e métodos devem vir na proxima linha.
- A abertura de colchetes de estruturas de controle devem vir na mesma linha com um espaço em branco.

Se seguirmos a PSR 2 com nosso método, teriamos:

php 

Nosso código está muito mais legível! Conseguimos entender perfeitamente que a validação do usuario depende de 3 outros métodos `validaNome`, `validaEmail` e `validaSenha` e retorna um `boolean`. Ou seja, com PSRs conseguimos nos comunicar de forma transparente como desenvolvedores.

Mas, PSRs não servem apenas para identação de código. Quando trabalhamos com **frameworks MVC** é muito comum precisarmos importar arquivos. Algo como:

php 

Porém conforme o sistema cresce, precisamos importar mais arquivos:

php 

E a quantidade de includes tende a crescer. Esse é um dos motivos pelo qual utilizamos a funcionalidade de `autoload`! Existem diversas formas de se realizar `autoload` em php, uma delas é a [**PSR-4**] que define uma forma padronizada de escrever nossos `namespace` para que possamos importar nossos arquivos da mesma forma em nossos sistemas, aumentando, também, a interoperabilidade entre projetos! Para isso, declaramos nossos namepsace com a estrutura:

php 

Agora para importar nossos arquivos, a partir da versão 7 do PHP, basta utilizarmos o agrupamento do `use`:

php 

Alguns frameworks MVC estão implementando este padrão para realizar o `autoload`. Um exemplo é o **Laravel**, a partir da versão 5.

Atualmente existem 14 PSRs criadas pela **PHP-FIG** ([**Framework Interoperability Group**]) sendo que sete estão em desenvolvimento e cinco já foram aceitas. As PSRs aceitas, além da Coding Style Guide, são:

- [**Basic Coding Standard**] (Padrão de código básico) – Aborda o que devemos considerar para garantir um código de alta interoperabilidade técnica com PHP.
- [**Logger Interface**] (Interface de Logger) – Descreve uma interface comum para bibliotecas de Log.
- [**Autoloading Standard**] (Padrão de auto-carregamento) – Descreve uma especificação para auto-carregamento de classes pelo diretório do arquivo. Também diz onde colocar arquivos que serão auto-carregados de acordo com a especificação.
- [**Caching Interface**] (Interface de Cache) – Descreve uma interace padrão para desenvolver sistemas de Cache.
- [**HTTP Message Interface**] (Interface de Mensagem HTTP) – Descreve uma interface padrão para desenvolvimento de mensagens HTTP .

Uma definição mais aprofundada de cada PSR, além das PSRs em desenvolvimento, está disponível no [**site da php-fig**]

Com PSRs evitamos a necessidade de nos preocupar com certas peculiaridades de cada sistema! Se um sistema segue uma PSR, ou todas, já saberemos como manipulá-lo da forma correta.

E a mesma coisa serve para os sistemas que nós desenvolvemos. Se seguirmos as PSRs, quem for implementar saberá exatamente como fazê-lo da forma correta, reservando a documentação para coisas mais específicas do sistema.

Claro que ninguém é obrigado a seguir as PSRs, ou qualquer outra especificação, ao desenvolver em PHP. É uma escolha livre do desenvolvedor, mas é necessário que, pelo menos, conheçamos bem. Afinal, a tendência é que cada vez mais projetos/frameworks sigam e, por consequência, o mercado também.

Aqui na **Alura** [**temos uma formação PHP**] onde vemos boas práticas, além de conhecer os frameworks mais utilizados no mercado.





imagem 

Seu objetivo é trabalhar em startup, mas será que você está fazendo tudo que poderia para alcançá-lo? Neste post, você vai aprender boas práticas para buscar um cargo na sua área e, ainda por cima, na startup dos seus sonhos.

Quer apostar que as boas oportunidades estão a apenas alguns passos de distância? Veja a seguir as atitudes que destacamos para auxiliá-lo a se alinhar ao seu objetivo.

## Compreender o que é uma startup

Startups ficaram muito conhecidas nos últimos tempos devido ao seu rápido crescimento e à sua tendência à inovação, que chamam a atenção de muitos profissionais e empreendedores.

Esses novos modelos de negócios são formados por pessoas que arriscam em uma ideia irreverente que, quando bem-sucedida, pode cobrir uma demanda de mercado que muitos ainda não identificaram.

Por meio da tecnologia e de recursos digitais, na maioria das vezes essas novas empresas entram no mercado sendo escaláveis e replicáveis, além de conseguirem crescer em um curto período de tempo.

Se você ainda não tinha esses conceitos claros na sua mente e esse é o seu objetivo profissional, a primeira atitude a ser tomada é [**estudar mais**] sobre essa modalidade de empresa. Afinal, não adianta querer entrar em um jogo sem saber quais são as regras básicas, certo? Feito isso, veja os próximos passos.

## Ter um bom currículo e portfólio

Startups são ambientes compostos por jovens como você, mas assim como essas empresas se diferenciam do mercado, os profissionais que conseguiram fazer parte delas também souberam se destacar.

Saber apresentar seu perfil profissional de maneira atrativa é, sem dúvidas, pré-requisito para conseguir um emprego em qualquer tipo de empresa. Entretanto, no caso das startups, bons currículos e portfólios podem significar coisas diferentes em relação ao mercado tradicional.

A razão disso? Essas pessoas souberam apresentar suas habilidades, experiências e, principalmente, seu objetivo.

**Seu currículo**, antes de mais nada, merece uma boa curadoria das suas experiências e habilidades. Busque destacar informações básicas e essenciais que mostrem de maneira intuitiva o caminho que você trilhou e aonde você quer chegar. Não deixe que o material fique muito extenso — o ideal é que não passe de duas páginas.

Toda informação colocada no seu currículo deve ser verdadeira, desde a grafia correta do nome das empresas em que você trabalhou ou estagiou até os resultados que alcançou ao atuar nelas. Não tente apontar nada que não esteja de acordo com a realidade, afinal, você quer estabelecer uma imagem confiável desde o princípio.

É claro que você não vai se candidatar a apenas uma vaga. Em meio a [**suas pesquisas**], certamente haverá oportunidades diversas e nem sempre a descrição de uma vaga é igual à de outra.

Você vai querer que seu currículo esteja adequado a cada vaga a qual você vai se candidatar, por isso, sempre adapte o seu currículo de acordo com o cargo e empresa. Não fazer isso pode levar você a enviar informações incompletas que podem fazê-lo perder a chance de participar de um processo seletivo.

Para muitas vagas em startups é necessário que você apresente também um portfólio de produções autorais, e ele precisa ser feito da maneira ideal. Coloque no seu portfólio a nata das suas produções, sempre seguindo a mesma premissa de que vagas diferentes podem buscar perfis profissionais diferentes.

## Entender o que é valorizado pelas startups

### Independência

Busque cursos gratuitos online, workshops, certificações. Ponha seus conhecimentos em prática e faça de seus resultados reais um [**diferencial a ser apontado numa entrevista**].

Pesquise diariamente e conheça o básico sobre todas as etapas que envolvem a área de atuação na qual você pretende trabalhar. Isso fará de você um profissional que, mesmo atuando em uma empresa em crescimento com número ainda reduzido de funcionários, é capaz de superar pequenos obstáculos sem precisar da ajuda de terceiros, otimizando os processos da empresa.

### Inovação

Mantenha-se atualizado e exercite sua criatividade em cima dos conhecimentos adquiridos em seus estudos autônomos. Leve sempre em conta o contexto em que a empresa está inserida e em qual etapa de desenvolvimento de startup ela se encontra, para que, caso você consiga a vaga, seja um colaborador ativo e com diferencial.

Ao propor novas soluções para um problema, tenha em mente que nem todos vão acreditar no sucesso da sua proposta, mas é isso que a tornará inovadora.

### Capacidade comunicativa

Não hesite em compartilhar ideias, conhecimento e dicas com colegas. Busque interagir com eles também. Muitas startups promovem workshops internos dados por seus próprios funcionários. Quem sabe você não se destaca por um conhecimento ou habilidade e possa até mesmo começar a construir uma imagem em cima disso?

### Postura prática

A todo momento surgirão problemas a serem resolvidos. Isso será parte do seu dia a dia e resolvê-los se tornará a sua rotina. Para isso, você precisará ter em mente que muitas vezes fazer algo funcionar não significará fazê-lo da maneira ideal, e para uma startup isso é essencial.

## Saber o que esperar desse tipo de trabalho

### Ambiente

Já deu para perceber que, numa startup, tudo é rápido. Não se preocupe: esse ritmo, muito semelhante ao ritmo de jovens como você, facilita sua adaptação. Esse tipo de empresa costuma ter um ambiente jovem, com um clima ideal para quem está buscando aprendizado e crescimento individual e coletivo ao mesmo tempo.

### Comportamento dos profissionais

Nesse tipo de ambiente, não deve existir egoísmo e competição entre os funcionários. Eles são uma equipe que, unida, visa ao aprimoramento de seu setor e da proposta da empresa como um todo. Tudo é feito por meio da colaboração constante.

### Intensidade de trabalho

Assim como em qualquer empresa, você terá metas a serem cumpridas, mas elas não são suas inimigas. Em startups, os indicadores por meio dos quais você é medido são oportunidades para que você cresça. Procure saber quais empresas são mais voltadas para essas métricas em relação a outras e analise em qual delas você poderia se sair melhor em momentos de maior pressão.

Você precisará ser bastante produtivo e até mesmo desenvolver técnicas para garantir isso, se necessário. Realizar tarefas múltiplas de maneira organizada enquanto lida com interrupções será seu desafio inicial e sua futura rotina.

### Carreira

As startups são muito dinâmicas e precisam de profissionais que se encaixem nesse perfil. Numa empresa tradicional, você teria que esperar por muitos anos para construir sua carreira. Já as startups promovem oportunidades para que você mostre o seu valor e aprimore seus conhecimentos de maneira muito mais rápida.

Além disso, seu caminho dentro da empresa não precisa, de maneira alguma, ser linear. Se você se destacar, é possível até mesmo se tornar o head de um novo departamento ao longo do crescimento da empresa.

Agora que você já aprendeu as melhores práticas para alcançar o seu objetivo de trabalhar em startup, que tal aprofundar seus conhecimentos [**criando sua startup enxuta com base nos conceitos de Lean**]? ;)





imagem 

Recentemente comecei a fazer o curso [**Javascript: programando na linguagem da web**] e resolvi me organizar com relação às anotações que estou criando.

Normalmente eu mantenho as anotações em cadernos, que cá entre nós, não é muito eficiente quando preciso procurar algum texto específico, além de que com o passar do tempo eles acabam sendo esquecidos dentro do armário.

Para resolver esse problema eu optei por utilizar o **github** que além de manter a organização, podemos fazer uso da linguagem de marcação **Markdown**, que vai converter o nosso texto para um HTML válido.  

A primeira aula do curso de Javascript se chama **Introdução**, agora que o repositório está pronto, podemos partir para as anotações. 

## Criando anotações

Para criar um arquivo basta clicarmos em **Create new files** e teremos acesso ao editor de texto dentro do github. Não podemos nos esquecer de salvar o nome do arquivo com a extensão **.md**, já que queremos escrever em markdown.  

imagem colocar o nome da linguagem e fechar com três backticks **(\`\`\`**).

imagem

O markdown nos oferece uma maneira bem fácil de criar citações, basta utilizar **\>** antes do texto e como resultado teremos:

imagem  

imagem  

E teremos o seguinte resultado:

imagem   

E para finalizar vamos colocar uma barra de progresso para indicar o quanto falta finalizar o curso utilizando a seguinte formatação:

![]

![]

Clicando em Preview Changes temos:  

![]

A barra de progresso aparece logo abaixo do título, bem legal!  

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação engenheiro front-end**]. Nela, você verá como programar em Javascript, enquanto usa minhas dicas para criar anotações.





imagem 

Recentemente me fizeram uma pergunta muito interessante:

> _"Eu sou da área de Design Gráfico, mas gostaria de migrar para UX. Você acha que vale a pena? Faz sentido?"_

Mas o que mais me chamou atenção nessa pergunta é: Por que não valeria a pena?

Bom, eu também trilhei esse mesmo caminho. Quer dizer, ainda estou muito envolvida com a produção de design digital, mas o enfoque agora é muito maior para as questões de UX Design, então acreditei que poderia deixar minha contribuição falando um pouco desses dois processos.

Uma das possibilidades é o fato de muitas pessoas confundirem [**o que de fato significa UX**] por acreditarem que UX é uma das ramificações da área de Design, quando, na verdade, engloba processos de diversas naturezas e times interdisciplinares.

Então, antes de mais nada, precisamos entender do que se trata cada uma dessas áreas, certo?

## A área de Design

Quando falamos em design, podemos estar nos referindo a diversas coisas, afinal, a área de design é muito abrangente.

Existem os designers especializados em produções impressas, por exemplo. Esse profissional será responsável principalmente pela [**criação de materiais gráficos editoriais**], isto é, os materiais físicos, impressos.

Por outro lado, existem também aqueles especialistas na parte online, de criação de peças digitais, desde anúncios até [**layouts para a web**].

Indo um pouco mais longe, tem também aqueles designers que, além de produzirem essas peças digitais, também complementa seus conhecimentos na parte digital, estudando alguns conceitos de front-end, como [**HTML e CSS**], por exemplo.

E, sabe aqueles vídeos animados em comerciais? Os efeitos especiais em filmes? Então, quem elabora esse tipo de material também entra na categoria design, mais especificamente na parte de audiovisual. Toda a parte de [**edição de vídeos**] e [**animações**] é feita por esses profissionais.

Além disso, se você manda bem desenhando, ainda tem a possibilidade de ser um ilustrador e [**criar o personagem publicitário**] de alguma marca.

## Falando em UX Design

A primeira coisa a se fazer quando falamos em UX é entender [**o que de fato é a experiência do usuário**] que tanto falam.

Depois, outra coisa importante é lembrar que em UX nós temos times interdisciplinares, ou seja, não só de designers é feito o time de UX. Nele temos sim designers, mas temos também a galera do back-end, do front-end e todas as demais especialidades necessárias para planejar o produto a ser desenvolvido.

> _"Então quem é o UX Designer?"_

O UX Designer pode ser qualquer uma dessas pessoas. Quando falamos em UX Design nos referimos ao desenho de toda a experiência que queremos criar, então o UX Designer é basicamente aquele que terá uma visão geral de todas as áreas para guiar o planejamento todo até o lançamento do produto ao final.

Entendendo isso, podemos começar a destrinchar os processos de UX Design, isso porque, mesmo dentro de UX, temos profissionais com especificidades para cada processo também.

Existem, por exemplo, aqueles que se encaixam melhor na [**parte de pesquisa**] ou então aqueles que farão todo o [**monitoramento do produto**], ou ainda, o que será responsável pela [**prototipação**].

Podemos ir por diversos caminhos dentro dessa área, afunilando nossos interesses e habilidades para construir times que complementam o processo em diversas áreas.

E se você quiser entender um pouco mais da rotina no desenvolvimento de um produto, existem algumas metodologias interessantes de investigar, como Design Sprint, por exemplo, que baseia-se em conceitos de [**Design Thinking**] e [**Metodologias ágeis**].

Agora, retomando a pergunta… Sim! Com certeza vale a pena. :)

Migrar de uma área para outra pode soar um pouco assustador, principalmente quando já estamos há algum tempo no mercado. Mas nunca é tarde para recomeçar os estudos e bolar novos planos. Seja lá qual for sua escolha, invista tempo e dedicação e vai valer muito à pena! ;)

Aqui na **Alura** temos uma [**Formação em UX**] !!




Hoje em dia, o design é mais do que uma disciplina: com o avanço de conceitos como UX/UI (experiência e interface de usuário para dispositivos móveis), Internet das Coisas e dispositivos cada vez menores, mais potentes e portáteis, os designers estão sendo requisitados para trabalhar com os avanços tecnológicos mais recentes.

## 1\. Jonathan Ive

Nascido no Reino Unido, **Ive** começou os estudos inspirado pelo pai, artesão que tinha especial cuidado pelo trabalho e pelo acabamento bem feito em suas criações. Formou-se na Politécnica de Newcastle, onde teve contato com designers de diferentes disciplinas.

Foi ali também que Jonathan conheceu seu primeiro Mac, que na época era o primeiro a permitir desenhos artísticos com o mouse.

Depois de formado, com vários prêmios da Real Sociedade de Artes, ajudou a fundar a Tangerine, empresa de design que primeiro prestou consultoria e depois foi integrada ao departamento de design da Apple. Era o início de uma parceria duradoura.

Embora o início tenha sido desanimador (a Apple passava por períodos difíceis no meio da década de 90), o retorno de Steve Jobs à empresa deu o estímulo do qual Ive precisava para continuar o trabalho.

A parceria dos dois começou a dar frutos logo em 1998, com o iMac G3, computador de mesa com o icônico gabinete curvo e colorido. Seguindo uma filosofia de design que opta pelo simples e minimalista, o designer foi desenvolvendo produtos cada vez mais finos e inovadores, como os iPods, iPhones e iMacs.

Atualmente, depois da morte de Jobs, Jonathan assumiu também o posto de vice-presidente sênior da Apple, além de ter começado projetos externos, como uma edição de luxo limitada de câmeras fotográficas para a marca Leica.

## 2\. Jakob Nielsen

Nascido em Copenhague, na Dinamarca, **Nielsen** é um consultor de usabilidade web mundialmente conhecido, com PhD em interação homem-máquina pela Universidade Técnica de Copenhague.

Por quatro anos, trabalhou como Engenheiro de destaque na Sun Microsystems, fabricante da plataforma Java. Ali, desenvolveu estudos focados na melhoria da usabilidade das nascentes aplicações para a internet.

Nielsen é conhecido por definir os cinco componentes para alcançar as [metas de usabilidade]: adaptabilidade, eficiência, facilidade de reconhecimento, baixo número de erros e satisfação do usuário. Ele também é autor de [10 regras que visam melhorar a usabilidade].

Embora tenham sido fortemente criticadas por designers gráficos, por deixar itens como tipografia e [hierarquias visuais] de lado, estas metas continuam sendo o padrão seguido pelos desenvolvedores.

É também de sua autoria a [Lei de Nielsen], que afirma que as conexões de rede de alto desempenho terão sua velocidade dobrada a cada 21 meses. Atualmente, Nielsen é autor de uma newsletter sobre web design e constantemente listado entre os designers mais influentes do mundo.

## 3\. Steve Jobs

Não é possível falar sobre designers envolvidos com tecnologia sem falar em Steve Jobs. Nascido em São Francisco, na Califórnia, **Jobs** começou a cursar a Reed College, em Portland, mas abandonou o curso devido a restrições financeiras.

No entanto, continuou a frequentar o ambiente da faculdade, matriculando-se em vários cursos livres, entre eles o de caligrafia, que seria de enorme valor anos depois.

Mais tarde, começou a trabalhar em parceria com o amigo de longa data Steve Wozniak. Com uma versão do [jogo _Pong_] desenvolvida pelo amigo em mãos, Jobs conseguiu um emprego como técnico na Atari, então líder em jogos de videogame.

Em 1976, juntamente com Wozniak e o amigo Ronald Wayne, fundou a Apple Computer, na garagem de sua casa, desenvolvendo o primeiro produto da empresa: o computador pessoal Apple I.

No ano seguinte, foi lançado o primeiro computador comercial da Apple, o Apple II, um sucesso de vendas, devido a suas inovações computacionais e seu design diferenciado.

Com o passar dos anos, a empresa foi crescendo, assim como a fortuna pessoal de Steve, avaliada em 100 milhões de dólares no início da década de 80. No entanto, desavenças internas e conflitos sobre os rumos da Apple levaram Jobs a ser demitido da empresa que ele mesmo criou, em 1985.

Saindo da Apple, criou a NeXT no mesmo ano, desenvolvendo hardwares inovadores, porém sem muito sucesso, depois mudando o foco de produção para softwares e frameworks.

O triunfo de seu novo empreendimento e os tempos difíceis da Apple levaram a empresa a comprar a NeXT, em 1997, trazendo Jobs de volta à chefia.

Em seu retorno, aliado a designers de ponta como Jonathan Ive, Jobs começou a revolucionar a indústria de tecnologia. Foi ele o maior responsável pelo surgimento dos iMacs, iPods, iPhones e iPad, invenções que quebraram barreiras e renovaram indústrias inteiras.

Com Jobs, a Apple deixou de ser uma empresa cambaleante para assumir o posto de vanguardista tecnológica.

Além de sua importância vital na Apple, Steve Jobs também é responsável por fundar a Pixar, empresa de [**animação**] criadora de clássicos como _Toy Story_, _WALL-E_ e _Ratatouille_, vencedores do Oscar.

## 4\. Elon Musk

Grande destaque nas manchetes mais recentes sobre inovação, o designer de produtos e engenheiro (mais engenheiro do que designer :)) sul-africano **Elon Musk** define-se como um visionário disposto a criar tecnologias para salvar a espécie humana do risco de extinção.

Com PhD em física aplicada e ciência de materiais na Universidade de Stanford, começou a carreira fundando empresas como a Zip2 e a X.com, que seria depois fundida com a Confinity, dando origem ao serviço de pagamentos PayPal.

As empresas mais famosas de Elon são a SolarCity, que visa fornecer energia solar a preços competitivos para residências, a Tesla Motors, que já tem uma grande linha de carros totalmente elétricos (com alguns projetos de carros sem motorista em desenvolvimento), e a SpaceX, um dos primeiros empreendimentos privados de exploração espacial.

Foi a SpaceX, inclusive, que deu a Musk a maior parte de sua fama: seu objetivo de pousar uma nave não tripulada em Marte até 2018 e criar uma colônia experimental ainda neste século tem atraído atenção e investimentos de grandes empresários.

Neste texto, vimos um pouco da vida e da [**carreira**] de designers famosos que fizeram avanços indispensáveis no mundo tecnológico.

Cada um deles deixou uma marca que não pode ser apagada na sociedade, garantindo melhores produtos e melhor qualidade de vida para seus usuários. Muito além de designers,são fonte inesgotável de inspiração!





Comecei a estudar Java no primeiro ano da faculdade de computação. Como nunca tinha mexido com a linguagem antes fiquei curioso para testá-la em casa e tentar escrever meus primeiros programas, mas como começar a escrever em Java?

## Baixando o kit de desenvolvimento Java

Antes de tudo, temos que baixar o [**kit de desenvolvimento Java**]. Esse kit é um conjunto de ferramentas que podemos utilizar para escrever e rodar um código Java. Após instalá-lo, podemos abrir o terminal e ver qual a versão do Java estamos utilizando.

Para isso, basta digitar `java` no terminal seguido de `-version`. No caso, estamos na versão 11 da linguagem:

imagem após a declaração de uma classe:

java 

Essa é a classe principal do nosso programa. Vamos usar ela para rodar um código que imprime uma mensagem. Ou seja, nossa classe terá um comportamento: Imprimir uma mensagem no terminal. A esse comportamento, nós chamamos de métodos.

O método pertence a classe, isto é, ele faz parte do corpo da classe. Por isso, vamos começar a escrever o método dentro das chaves, dentro do corpo da classe.

Esse é o nosso método principal (`main`). No Java, existe um padrão para escrever esse método. Primeiro, dizemos que ele é um método público (`public`), ou seja, todos têm acesso a ele. Precisamos falar que esse método pertence a classe, por isso, falamos que ele é um método estático (`static`).

Esse método é não devolve nada, isto é, ele é executado e não retorna nenhum valor após sua execução, indicamos isso com a palavra `void`. Da mesma forma que as classes, o método precisa de chaves (`{ }`) para indicar seu corpo e além disso, todo método precisa terminar com parênteses (`( )`).

Por ser da especificação do método principal, dentro dos parênteses, temos que colocar o conteúdo `String[] args` (na verdade, pode ser outro nome além de `args`, porém esse é o padrão seguido pela maioria das pessoas):

java 

> O corpo do método foi definido, mas como podemos fazer o Java imprimir uma mensagem para a gente?

## Mostrando uma mensagem

Queremos que o sistema (`System`) imprima para gente uma mensagem (`print`). Essa ação de escrita é uma saída do sistema, ou seja, é um output (`out`). Logo, queremos que o sistema, realize uma saída do programa (`out`) que é imprimir alguma coisa:

java 

O `print` também é um método, ou seja, também deve terminar com parênteses e, por convenção da linguagem, toda instrução é terminada com um ponto e vírgula (`;`):

java 

No mundo da computação, existe uma tradição que o primeiro programa seja uma mensagem: "Olá, mundo". Portando, vamos colocar essa mensagem dentro dos parênteses do `print`. Como ela é um texto, passamos entre áspas:

java 

> \*"Mas e aí? Como podemos rodar esse código?"\*

## Rodando o código

O Java é uma linguagem híbrida, isto é, ela não é totalmente compilada, como C e C++, nem totalmente interpretada como JavaScript e Lua.

Quando escrevemos um código em Java, precisamos transformar esse código em algo que a máquina virtual do Java (JVM) consiga entender e executar o código. O código que roda na JVM é o **bytecode java**. Este é obtido após compilar o código Java, o bytecode é interpretado pelo JVM.

Ou seja, para rodar o código Java, temos que compilá-lo para bytecodes antes, logo, podemos ir até o terminal e rodar o comando `javac MeuPrimeiroPrograma.java`.

> Importante atentar que o nome do arquivo é igual ao nome da classe

![]

Código compilado, agora basta falar para o Java executar essa classe:

![]

Nossa mensagem foi impressa, mas o que significa esse `%` no final? Isso é algo que meu terminal coloca para indicar que ele colocou uma quebra de linha naquele espaço. Podemos falar para o Java colocar essa quebra de linha. Basta trocar o método `print` por `println`. O `ln` no final do método indica que queremos quebrar a linha:

java 

Agora basta compilar e pedir para o Java rodar novamente o programa:

![]

Bacana, conseguimos imprimir nossa mensagem.

## Para saber mais

Esse `String[] args` que passamos no método `main` é na verdade uma lista de parâmetros que podemos passar quando falamos para o Java rodar a classe.

O Java é uma linguagem muito utilizada pelo mercado. Podemos utilizá-las em diversos pontos no mundo da computação. Criando desde sistemas desktops, até sistemas complexos que se comunicam ao redor do mundo.

Essa é apenas uma pequena introdução sobre a linguagem. A plataforma Java é muito extensa e consegue ser encaixada em muitos projetos.

Aqui na Alura, temos uma [**formação que começa desde o básico com a linguagem e com orientação a objetos, até sistemas web com conexão no banco de dados**]. Ao final da formação você fará um projeto onde será que será avaliado por um de nossos instrutores. Nesse projeto, será colocado em prática todos os conceitos vistos na formação.





imagem 

O processo de enviar uma requisição para um servidor é parecido com o de enviar um pacote pelos correios, isto é, os pacotes enviados pelo computador passam por algumas etapas até chegar ao destino final. Esses passos são o que chamamos de **modelo OSI**.

Quando fazemos uma **requisição** para um servidor web, essa percorre um longo caminho da sua máquina até o servidor.

Essa requisição que saí do seu computador por um cabo de rede, ou pelo ar, caso use um Wi-Fi. Passa pelo seu provedor de internet e por diversos outros servidores até chegar no destino. Quando o servidor manda uma resposta, esse caminho se repete.

Mas como a requisição sabe qual caminho seguir? Como ela sai do meu computador e chega ao servidor?

## Conhecendo o modelo OSI

O modelo OSI é um padrão para os [**protocolos de rede**]). Protocolos nada mais são do que regras de comunicação usadas para conectar dois ou mais computadores. O que o modelo OSI faz é agrupar esses protocolos em grupos específicos, ou camadas.

## Camada 1 - Física

A primeira camada do modelo OSI é a camada física. Voltando para o exemplo dos correios, a camada física seriam as estradas, ou seja, o caminho que os pacotes percorrem para chegar ao destino.

Nesta camada são especificados os [**dispositivos, como hubs**] e os meios de transmissão, como os cabos de rede. Os dados são transmitidos por esses meios e processados na próxima camada.

## Camada 2 - Enlace ou Ligação

Fazendo um paralelo com os correios, essa camada funciona como um fiscal. Ele observa se o pacote tem algum defeito em sua formatação e controla o fluxo com que os pacotes são enviados.

Nesta camada, os dados recebidos do meio físico são verificados para ver se possuem algum erro e,se possuírem, esse erro pode ser corrigido. Dessa forma, as camadas superiores podem assumir uma transmissão praticamente sem erros. Esta camada também controla o fluxo que os dados são transmitidos.

Nesta camadas que são definidas as [**tecnologias como as VLans**], ou topologias como a Token ring, ou a ponto-a-ponto. Também é nesta camada que [**dispositivos como os switches**] funcionam.

Esta camada é dividida em duas subcamadas: **A camada MAC e a camada LLC.**

### A subcamada MAC

É nesta camada que possibilita a conexão de diversos computadores em uma rede. Cada máquina conectada na rede tem um endereço físico, conhecido como [**endereço MAC**]. É esse endereço que a camada utiliza para identificar e enviar os pacotes.

Essa camada atua como uma interface entre a camada física e a subcamada LLC.

### Já a subcamada LLC

É nesta camada que temos o controle de fluxo dos dados na rede. É por conta dessa camada que conseguimos ter vários protocolos da próxima camada convivendo dentro de uma mesma rede.

## Camada 3 - Rede

Quando estamos enviando uma carta, os correios verificam quem é destinatário e quem é o remetente da mensagem. Se existirem muitas mensagens para serem enviadas, eles podem priorizar quais serão enviadas primeiro e qual é o melhor caminho para enviar essa carta.

Isso é justamente o que a camada 3 faz, ela atua como uma central dos correios. Esta é talvez a camada mais atuante nas redes, principalmente na internet.

É nesta camada que temos o endereçamento IP de origem e de destino, ela também pode priorizar alguns pacotes e decidir qual caminho seguir para enviar seus dados.

Essa camada basicamente controla o roteamento entre a origem e destino do pacote.

> "Mas por que utilizar o endereço IP se já temos o endereço MAC?”

**O endereço MAC** é o endereço físico de quem envia o pacote. Ou seja, se enviarmos um pacote e esse pacote passar por cinco dispositivos diferentes (roteadores, switches, ou servidores, por exemplo) o endereço MAC é alterado no processo. Já o endereço IP não sofre essa alteração.

**O endereço IP** é a identificação da sua máquina na rede. É aquele endereço como 192.168.0.1.

É nessa camada que temos protocolos como o [**IP**] ou o [**ICMP**].

Bem, as cartas chegaram a central dos correios, agora elas precisam ser transportadas.

## Camada 4 - Transporte

Se na camada um temos as estradas e os caminhos que os dados percorrem, na camada quatro temos os caminhões e os carteiros.

É esta camada que garante o envio e o recebimento dos pacotes vindos da camada 3. Ela gerencia o transporte dos pacotes para garantir o sucesso no envio e no recebimento de dados.

Esta camada lida muito com a qualidade do serviço para que os dados sejam entregues com consistência, isto é, sem erros ou duplicações. Porém nem todos os protocolos desta camada garantem a entrega da mensagem.

Protocolos muito comuns dessa camada são os protocolos [**TCP**] em [**UDP**]. O primeiro garante a entrega da mensagem, diferente do segundo. Por não garantir a entrega da mensagem, o protocolo UDP é um pouco mais rápido que o TCP.

Bem, mas para ocorrer o transporte de um pacote entre os computadores, é necessário que as máquinas consigam se comunicar. Isso é função da próxima camada.

## Camada 5 - Sessão

Está camada é responsável por estabelecer e encerrar a conexão entre hosts. É ela quem inicia e sincroniza os hosts.

Além de realizar o estabelecimento das sessões, esta camada também provém algum suporte a elas, como registros de log e realizando tarefas de segurança.

Recebemos os pacotes, vamos checá-los para ver que dados tem dentro?

Ainda não podemos. Os dados ainda precisam ser tratados para serem usados. Como a camada de sessão só é responsável por estabelecer a conexão entre os hosts, o tratamento dos dados é de responsabilidade da próxima camada.

## Camada 6 - Apresentação

Está é a camada responsável por fazer a tradução dos dados para que a próxima camada os use. Nesta camada temos a conversão de códigos para caracteres, a conversão e compactação dos dados, além da criptografia desses dados, caso necessite.

Depois de tratados, esses dados estão prontos para serem usados na próxima camada.

## Camada 7 - Aplicação

**A última camada do modelo OSI é a camada para consumir os dados**. Nesta camada temos os programas que garantem a interação humano-máquina. Nela conseguimos enviar e-mails, transferir arquivos, acessar websites, [**conectar remotamente em outras máquinas**], entre outras coisas.

É nesta camada que temos os protocolos mais conhecidos como o **HTTP, FTP, além de serviços como o DNS.**

## Para saber mais

Quando falamos das camadas do **modelo OSI**, costumamos falar na ordem inversa, isto é, a camada mais alta é a camada 7, enquanto que a camada 1 é a camada mais baixa:

![]

Além do modelo OSI, outro modelo utilizado em redes é o [**TCP/IP**]. Esse modelo, que leva o nome de dois protocolos, busca agrupar os protocolos da mesma forma que o modelo OSI, porém com menos camadas.

Conhecer os protocolos é uma das skills de quem trabalha com infra. Não é necessário saber todos, mas conhecer alguns pode ajudar na hora de resolver alguns problemas na rede.

Se quiser aprender um pouco mais sobre esses protocolos, temos aqui na Alura uma [**formação em redes**].

Nela você aprenderá sobre os protocolos, como criar e configurar uma rede local, sobre VLans, além de segurança.

Se você é um desenvolvedor web, conhecer os protocolos por trás de seus projetos podem ajudar a otimizar o código e melhorar os serviços.

Na web o principal protocolo é o HTTP e aqui na Alura temos um [**curso sobre este protocolo**]. Nele você aprenderá como utilizar tudo que o protocolo HTTP tem para oferecer.





imagem 

Digamos que você tem um array de números em JavaScript:

javascript

E queremos ordená-lo. O que fazer? Usar a função `sort()` claro!

javascript

Repare no resultado: não está na ordem esperada. Essa questão foi trazida ao [fórum da Alura] pelo Jean Cesar Batista.

A grande questão é que a função `sort()` usa por padrão a ordenação alfabética baseada na tabela Unicode. Apesar de inesperado isso está [documentado]. A solução é **usar a nossa própria função de comparação**.

## Implementando função de comparação

O `sort` recebe opcionalmente uma função de comparação que, dados dois valores, deve devolver um número inteiro:

- Se for `0` indica que são iguais
- Se for `-1` indica que o primeiro valor é menor
- Se for `1`, o segundo é menor.

Podemos criar essa função:

javascript

E chamamos o `sort` passando a função:

javascript

Funciona!

## Simplicando a implementação

E, claro, podemos **simplificar bastante** esse código.

É possível trocar a função nomeada pra ser anônima. E trocar os três IFs por uma conta simples: `a - b`.

Repare que o resultado dessa conta é sempre `0` se forem iguais, `-1` se `a` é menor e `1` se `b` é menor. Exatamente o que precisamos.

Juntanto tudo isso com a sintaxe de _arrow functions_ do ES6 pra escrever menos, podemos simplesmente fazer:

javascript

O que achou? Bem enxuto, concorda? Aproveite e deixe o seu comentário sobre o que achou da ordenação de array no JavaScript.


Como encontrar a forma certa de se inserir no mercado de trabalho, competir pelas melhores oportunidades e crescer profissionalmente são preocupações para qualquer pessoa que dá os primeiros passos em sua carreira. Ter a preparação correta e saber como se capacitar são fundamentais para um designer na área de tecnologia encontrar essas respostas.

Essa missão pode parecer complexa, mas apresenta boas alternativas para quem sonha em trilhar um caminho como designer.

Enquanto profissionais de outros setores sofrem com a escassez de oportunidades, os designers enxergam um mercado em que as chances não diminuem mesmo em períodos de instabilidade econômica. Mesmo que não encontre um emprego fixo, é possível recorrer a trabalhos como freelancer, que proporcionam mais liberdade e autonomia sobre a própria rotina.

Entretanto, é necessário ter disciplina, [**dominar as ferramentas da área**], investir em cursos de capacitação e estar atento às tendências da área de tecnologia. Se as oportunidades são muitas nesse mercado, uma das principais razões é sua evolução constante e a grande capacidade de inovação. Dessa forma, é preciso se manter atualizado.

Você está interessado em ser um designer na área de tecnologia? Confira a seguir alguns dos motivos que justificam investir nessa carreira.

## 1\. Saiba por que investir em uma carreira na área de tecnologia

Lidar com computadores, códigos e redes faz parte da rotina de muitos jovens atualmente. Assim, a escolha por atuar na área de tecnologia é algo natural para quem sonha em aproveitar essas habilidades e construir uma carreira profissional.

A área de tecnologia apresenta um cenário positivo para quem pretende seguir esse caminho. A relação entre ofertas de trabalho e profissionais qualificados é positiva [**para quem procura uma oportunidade**]. Como não há grande volume de pessoas com as competências necessárias para essas atividades, são muitas as vagas disponíveis e que oferecem grande remuneração.

Mesmo quando há crise, as ofertas em tecnologia não sofrem redução como em outras áreas. Pelo contrário, se mantêm como alternativas de crescimento profissional e com salários atrativos para quem ainda dá os primeiros passos na carreira.  

Todavia, para estar apto a corresponder às demandas do mercado, é necessário se manter atualizado e preparado para mudanças. Novos softwares e ferramentas são desenvolvidos constantemente, o que obriga que a preparação e a busca por novos conhecimentos seja incessante.

Além de adquirir capacitação suficiente para atender às competências exigidas, é preciso mostrar aptidão para a área de tecnologia. A melhor forma de fazer isso é apresentar um portfólio que impressione, o que veremos a seguir.

## 2\. Entenda como montar um portfólio poderoso

Possuir um portfólio poderoso é uma ótima alternativa para quem procura uma oportunidade no mercado de tecnologia. É por meio dele que você mostrará a qualidade de seu trabalho e sua capacidade de adaptação às tendências de sua área de atuação.

Ter um portfólio online é pré-requisito para a participação em muitos processos de seleção. Caso o candidato não apresente projetos que já desenvolveu, ele nem sequer seguirá  para as próximas etapas da disputa por uma vaga. Porém, uma questão incomoda jovens profissionais. Como é possível ter um portfólio sem clientes?

Ao construir essa página online, não é obrigatório relacionar apenas projetos profissionais. Trabalhos desenvolvidos em estágio e faculdade são também oportunidades de mostrar aptidão e competências, qual seu estilo e a capacidade de atender às expectativas do cliente.

Caso ainda não tenha um portfólio, crie um. Comece com trabalhos para amigos ou familiares, ofereça projetos para ONGs (Organizações não-governamentais) ou instituições de caridade. Nesse caso, você não será remunerado, mas terá a oportunidade de desenvolver material para apresentar a futuros clientes.

Se, por ventura, você tiver participado de apenas uma parte do projeto, isso não impedirá que ele faça parte de seu portfólio. No entanto, é necessário identificar de quem é a autoria do restante do material, assim como é fundamental esclarecer quando o trabalho foi desenvolvido sob a supervisão de outro designer. Essas medidas são imprescindíveis para evitar constrangimentos.

A partir da criação de um portfólio, esse será um processo que jamais terá um fim. Afinal, novos trabalhos serão adicionados, até o ponto que os primeiros projetos possam ser substituídos por aqueles em que você atingiu altos níveis de qualidade e essa renovação se torne constante.

Há aqui, portanto, uma dúvida entre quantidade e qualidade. Embora ter muitos trabalhos possa demonstrar que você esteve envolvido em muitos projetos, priorizar aqueles com mais qualidade é importante para dar destaque aos seus melhores trabalhos.

### Como organizar um portfólio?

**Além de apresentar bons materiais, a forma como será feita essa apresentação é importante para causar boa impressão. A organização do portfólio pode ser feita por ordem cronológica,  categorias ou temas.**

Quando o fator é cronológico, priorizar dos mais recentes para os mais antigos pode ser uma boa alternativa, já que a tendência é de que sua experiência tenha contribuído para aqueles que foram feitos nos últimos meses terem mais qualidade. 

Já a divisão por categorias e temas facilitará a identificação entre os diferentes formatos de projetos, além de mostrar sua capacitação para diferentes trabalhos. Versatilidade é importante para que o cliente saiba que você é capaz de fornecer a solução para o que ele busca.

No entanto, algumas ferramentas podem facilitar essa organização. Avalie as opções a seguir e descubra aquela que mais se adequa às suas necessidades.

### Ferramentas úteis para a criação de um portfólio

Uma vez que a criação de um portfólio é fundamental para mirar boas oportunidades profissionais, utilizar alguma ferramenta pode tornar essa missão mais fácil de ser alcançada. Acompanhe algumas das alternativas que você pode aproveitar para criar seu portfólio:

- [Behance]: muito utilizada por designers, essa ferramenta conta com uma plataforma gratuita e fácil de usar, além de espaço para a inclusão de um pequeno currículo com informações básicas. Há a possibilidade de separação dos trabalhos por projetos, que poderão reunir todos os materiais, em uma interface bem organizada e bonita.
- [Coroflot]: desenvolvida para designers, essa ferramenta tem interface simples e espaço ilimitado para armazenamento de trabalhos. Um diferencial é a possibilidade de acompanhar todas as informações de tráfego da página e, assim, saber quais os projetos que receberam mais visitas.
- [Clippings.me]: criada para jornalistas, essa ferramenta atende também a profissionais de tecnologia da informação. É possível utilizar links de trabalhos feitos, o que facilita a indicação de projetos desenvolvidos.

## 3\. Saiba como conseguir trabalhos como freelancer e ganhar experiência

Ainda que a área de tecnologia não sofra tanto com a crise econômica como os demais setores, trabalhar como freelancer é uma alternativa que tem recebido mais adeptos nos últimos anos. Além de possibilitar “fugir” dos impactos da redução de investimentos e das ofertas de serviços, essa atuação dá mais liberdade ao profissional, que tem autonomia sobre os horários de trabalho e sobre a escolha de onde vai realizar suas atividades, além de receber por produtividade.

**Porém, trabalhos como freelancer exigem muita disciplina, organização e planejamento financeiro. Quem oferece esses serviços, normalmente, busca por profissionais com experiência e voltados para a prática. O foco está também em designers que sejam eficientes e tenham agilidade em suas tarefas. A boa formação acadêmica nem sempre será tão valorizada quanto à capacitação técnica.**

É importante ter em mente que a atuação como freelancer também exige profissionalismo. Portanto, se organize para ter um horário de trabalho e uma rotina bem definida. Saber definir prioridades é fundamental. Para defini-las, utilize critérios como prazo de entrega, nível de dificuldade para produção e conhecimento prévio sobre o trabalho a ser feito. Assim, você aumentará sua produtividade e conseguirá atender melhor os clientes.

Para o freelancer, há momentos em que são muitas as oportunidades de trabalho e os ganhos crescem. Porém, outros períodos apresentam menos serviços a serem feitos, o que afeta na renda e no planejamento financeiro. Assim, realizar bons trabalhos e se diferenciar no mercado é o caminho ideal para fidelizar clientes e sempre manter um bom leque de indicações.

**A capacidade de inovação está diretamente ligada ao planejamento financeiro. Se você apenas oferece trabalhos similares àqueles que são desenvolvidos por outros designers, o cliente tende a optar pelo menor preço. Dessa forma, se diferenciar no mercado amplia suas oportunidades e também o quanto você poderá cobrar por cada uma delas.**

Como vimos neste artigo, criar um portfólio é imprescindível para ter oportunidades de trabalho como designer. Afinal, é por meio do portfólio que o cliente conhecerá seu estilo e os projetos em que já participou. Você também pode aproveitar esse material para apresentá-lo a outros profissionais e aumentar sua rede de contatos.

Encarar outros designers apenas como concorrentes poderá limitar a chance de seu trabalho ser reconhecido e indicado para novos clientes. O networking também lhe dá a possibilidade de receber dicas, compartilhar conhecimentos e oportunidades de negócios. Você pode, por exemplo, “dividir” clientes com pessoas que trabalhem com suporte em tecnologia da informação e criar uma rede de indicações.

Ao receber novas oportunidades, esteja atento ao que o cliente procura. Ouça bem e não tente impor ideias. Atender às expectativas é fundamental para ganhar confiança e fidelizá-lo.

Para não decepcionar o cliente e gerar repercussão negativa sobre seu trabalho, não aceite qualquer proposta de trabalho. Foque naquilo que você saiba fazer. Aceitar oportunidades sem ter competência para atendê-las, fará com que você tenha muito trabalho para conseguir realizar aquela tarefa e ainda pode abalar sua credibilidade. Cumprir prazos é de suma importância para manter clientes satisfeitos e aumentar as chances de novas indicações.

### Oportunidades para freelancers

**Assim como networking e indicações são um bom caminho para conseguir trabalhos como freelancer, a internet oferece boas formas de encontrar oportunidades. Diferentes sites e plataformas podem ser utilizados para encontrar um serviço.**

Designers podem identificar boas oportunidades no [99Designs]. Todos os inscritos na plataforma podem disputar a mesma vaga, mas só o escolhido pelo cliente ganhará a oportunidade de realizar o serviço.

Já o [Freelancer] é uma plataforma que apresenta oportunidades de todo o mundo e paga em libras, o que representa mais ganhos para os designers brasileiros. Ele tem como um concorrente o [Upwork], que também atua em nível internacional.

Também são muitas as plataformas brasileiras para quem busca um trabalho como freelancer. Com foco na área de comunicação e tecnologia da informação, o [Trampos] tem ainda divulgação de empregos fixos ou estágios. Já o [99freelas] e o [Prolancer] permitem cadastro por email ou conta do Facebook e se apresentam como a conexão entre empresas que buscam um talento digital e esses profissionais.

O [Nearjob] tem design simples e de fácil navegação. Uma boa oportunidade para quem quer mais clientes, obriga o cliente a depositar na plataforma assim que é fechado o acordo com o freelancer. Quando o trabalho é concluído, esse valor é repassado ao profissional que o realizou.

Outra plataforma que intermedia a forma de pagamento é o [WeDoLogos], voltado para trabalhos de criação de cartões, folders e identidade visual. O [ComunicaGeral], por sua vez, apresenta oportunidades para profissionais de design gráfico, web design, programação e tecnologia, além de comunicação e [marketing].

## 4\. Procure diferentes cursos de capacitação

Seja para realizar trabalhos como freelancer ou ter um emprego fixo, qualquer profissional precisa demonstrar capacitação para vislumbrar mais oportunidades e ter uma sólida carreira, especialmente na área de tecnologia. Para designers, desenvolver competências se torna ainda mais importante. Afinal, essa é uma área com inovações constantes, o que pode minar o futuro de profissionais que não estejam qualificados para acompanhar essas mudanças.

Especialmente para freelancers, há uma demanda de profissionais que sejam capazes de demonstrar agilidade, eficiência e, principalmente, sejam voltados para aspectos práticos. Assim, a capacitação técnica pode sobressair à formação acadêmica.

Para atender a essa característica do mercado, os cursos profissionalizantes são um bom caminho. Com conteúdos mais enxutos, eles têm foco na preparação para conhecimento aplicável e oferecem retorno financeiro imediato. Na disputa por uma oportunidade no mercado, esses cursos de capacitação mostram que o designer na área de tecnologia procura se manter atualizado e em busca de novos conhecimentos.

Se cursos profissionalizantes são voltados para aspectos práticos, isso é ainda mais acentuado nos cursos específicos. Essa forma de capacitação permite que você esteja apto a corrigir pontos fracos e potencializar trunfos de seu currículo.

Com foco em áreas específicas, estes cursos desenvolvem habilidades para a solução de questões da rotina de trabalho. Para que essa capacitação tenha o resultado esperado, é necessário ter atenção ao seu programa e analisar se ele será destinado à prática.

Caso detecte a necessidade de desenvolver uma habilidade específica, como o uso de algum software, por exemplo, você pode investir seu tempo e concentração apenas nesse ponto e estar mais preparado para novas oportunidades. Uma grande vantagem desses cursos é a facilidade para encontrar alternativas online.

### Cursos para iniciantes em design

Para quem inicia carreira como designer, é importante conhecer quais alternativas de curso proporcionam os conhecimentos básicos para se inserir no mercado. Os primeiros passos nesse sentido podem ser dados com a entrada no mundo [Front End], com capacitação em HTML e CSS.

Inicialmente, o designer deve ter contato com as tags de uma estrutura básica de HTML, saber como evitar problemas de enconding com a tag charset e como aplicar estilo em tags HTML usando CSS. Os cursos básicos ainda ensinam como adicionar imagens utilizando tags, fazer tabelas com as tags TABLE, TR e TD, assim como criar menus de navegação com as tags NAV, UL, E e A.

Num segundo momento, quando for compreendida a capacitação básica, a preparação pode evoluir para o desenvolvimento de páginas da web (com HTML e CSS3), para web design responsivo e bootstrap, que proporcionará conhecimento sobre a criação de uma single-page responsiva.

Já se a intenção é ir além da estilização, o designer pode seguir para o caminho de cursos voltados para [automoção e performance]. Essa capacitação envolverá automação de tarefas front-end, testes automatizados em JavaScript e mais habilidades em CSS.

Quando dominar os conhecimentos de JavaScript, parta para conhecimento de frameworks que são utilizados na criação de apps usando front-end.

## 5\. Conheça mais sobre as tendências da área de tecnologia

Em busca das primeiras oportunidades no mercado ou apenas de mais um passo na carreira, o designer na área de tecnologia já pode ter mente uma tendência: o usuário é o foco atual. Proporcionar novas e satisfatórias experiências é a principal missão de quem está envolvido nesse setor.

Em 2016, as tendências de UX se consolidaram como mais do que uma moda passageira. O mercado de design demanda cada vez mais conhecimentos de programação. Essas habilidades podem ser básicas, mas tendem a ser um diferencial para quem busca mais espaço e novos horizontes. Assim, funções como front-end designer e UX designer têm se consolidado como algumas das próximas competências a serem exploradas.

Com a ampliação da venda de smartphones e outros dispositivos móveis, oferecer mais velocidade e melhores experiências são ainda mais importantes para um designer na área de tecnologia. O avanço agora vai além do conceito de mobile first, com web apps progressivos, que oferecem linkabilidade e compartilhamento, com ganhos em engajamento.

O profissional de design, portanto, tem de se preparar para atender às essas demandas e estar atento a possibilidades que surgem. Especialistas em avanços tecnológicos já apontam mais mudanças e inovações.

Líder mundial em pesquisa e consultoria em tecnologia da informação, o [Gartner] indicou que algumas tendências são claras para 2017 e preparam o cenário para Malha Digital Inteligente. Elas podem ser divididas em três aspectos. O primeiro deles se refere ao [aprendizado das máquinas e à inteligência artificial], a partir das abordagens científicas de dados. Dessa forma, há a criação de inteligentes sistemas físicos e baseados em softwares programados para aprenderem e se adaptarem à medida em que interpretam mais dados.

Outras tendências apontadas pelo Gartner estão focadas na interligação entre os mundos físico e digital. Nesse ponto, há a perspectiva do crescimento da realidade virtual e aumentada em nosso cotidiano, a evolução de softwares que utilizam sensores para responderem a mudanças e agregarem valor, e alterações nos formatos de transações, com maior facilidade para distribuição de música, a verificação de identidade, o registro de títulos e a segurança em cadeias de fornecimento.

E, por último, estão as tecnologias que envolvem as plataformas e os serviços necessários para entregar toda essa inovação para os usuários finais. Os sistemas conversacionais terão abrangência de mais pontos de contato, além dos tradicionais chatbots e aparelhos habilitados por microfones. O Gartner indica ainda uma solução otimizada para endpoints  (com experiência contínua para o usuário na medida em que transita entre eles), uma mescla entre plataformas digitais e também mais responsabilidade para os profissionais encarregados pela segurança digital.

**Você está preparado para essas mudanças? Se a resposta ainda não for positiva, não se assuste ou fique ansioso. Estabelecer uma carreira na área de tecnologia demanda preparação, mas tem grandes vantagens. É justamente a evolução constante desse setor que cria mais oportunidades e dá mais perspectivas de crescimento aos profissionais que querem seguir esses passos.**

Além de se manter atualizado, o designer tem a possibilidade de utilizar os cursos de capacitação para ampliar seu potencial para inovação. Desenvolver o próprio estilo é uma forma de se diferenciar no mercado, conquistar mais espaço e fidelizar clientes.

Oferecer apenas o que já é feito por outros designers, além de diminuir a possibilidade de disputar por uma vaga ou serviço, impede uma boa remuneração. Afinal, se não há um diferencial, o cliente pode optar por aquele que cobra o menor preço.

**Se você se prepara, valorize seu trabalho. Mesmo para quem ainda está no começo de carreira, o desenvolvimento de um projeto tem valor. O preço não deve ser o diferencial naquilo que você oferece. Há outras formas de conquistar oportunidades. Procure atender bem os clientes, corresponder às suas expectativas e agregar valor ao que oferece. Assim,além de ganhar confiança e credibilidade, você amplia a possibilidade de receber mais indicações.**





Assim como o **mercado de Startups e Fintechs**, o comportamento de consumidores é muito dinâmico. Se em um dia ele está certo do que quer, no outro o pensamento pode já não ser o mesmo.

Por isso, uma empresa, por mais que seu serviço/produto seja essencial ou extremamente vantajoso, precisa fazer com que os clientes e possíveis clientes lembrem-se disso frequentemente.

Uma das principais maneiras de permanecer em contato com o público é por meio do marketing digital. Com uma presença online forte, as Startups, Fintechs e qualquer tipo de empresa chegam nos lugares onde o usuário está e conseguem ser reconhecidas por ele.

Apesar de existir uma infinidade de estratégias possíveis, cada qual com suas vantagens, 4 ações serão responsáveis por viabilizar o relacionamento entre marca e consumidor, gerando ótimos resultados ao primeiro e boa experiência ao segundo. São elas:

- Estratégia de AdWords
- Remarketing com base em recência
- Conteúdo
- Coleta de leads.

## AdWords com sua própria marca

De acordo com o Google, mais de **1 milhão de empresas trabalham com AdWords**. A ideia central é a atração de novos visitantes, aumento de vendas e maior engajamento dos clientes com a marca.

Com o serviço, que vai muito além das buscas por palavras-chave, abre-se a possibilidade de alcançar clientes em páginas com bastante relevância em toda a web. A segmentação pode ser feita de inúmeras maneiras, como tipo de site, público-alvo, remarketing etc. Basicamente, os anúncios são veiculados onde e quando são relevantes para seu público-alvo.

O AdWords é capaz de mensurar precisamente como as pessoas agiram diante do anúncio. O anunciante sabe quantas tiveram acesso à mensagem e qual a porcentagem delas que clicou no link. Com ferramentas corretas, ainda é possível acompanhar as vendas que o site gera a partir dos cliques vindos de anúncio.

As Startups e Fintechs com anúncio no AdWords terão a oportunidade de alcançar pessoas na hora e local desejados, com a vantagem de pausar e reiniciar a campanha quando bem entenderem e em qualquer dispositivo cujos clientes utilizarem. Nossa dica é bem simples, mas algumas empresas ainda não utilizam: anunciar o próprio termo da marca.

Lucas Burza, diretor de conteúdo da Agência Linka, defende que a ideia de anunciar a própria marca garante a encontrabilidade para o caso de existir alguma busca pela palavra-chave.

> “Além disso, deixamos de correr o risco da concorrência veicular sozinha e, por fim, naturalmente com uma boa estrutura de campanha e criativos, o valor do CPC (custo por cliques) será muito baixo, já que naturalmente terá um dos maiores quality score para esse leilão”, reforça Burza.

## Remarketing com recência (curta e longa)

**A estratégia do remarketing com recência curta** tem a função de criar listas de remarketing com períodos de tagueamento mais curtos, assim o usuário é impactado justamente no momento em que apresenta as maiores chances de conversão.

Assim, o site de uma empresa com uma média de 80% das conversões nos 5 primeiros dias após o primeiro impacto pede uma campanha como essa, a qual, para conseguir maior impacto, contará com orçamentos mais agressivos ou a definição de lances para o período em questão mais altos.

Com isso, os usuários são mais impactados nos 5 primeiros dias e, após tal período, passam a ser impactados por outra campanha com a frequência, criativos e lances diferenciados.

Já o remarketing com recência longa é normalmente usado com produtos e serviços dos quais o tempo de decisão é maior, ou seja, são conversões em que o impulso não funciona. Com isso em mente, a ideia é conseguir, por meio do remarketing, eliminar as objeções.

> “A melhor estratégia de remarketing é conciliar a recência com as ações dentro do ambiente online junto a uma mensagem com senso de urgência. Imagine comparar alguém que há 15 dias acessou sua home e não voltou com uma pessoa que acessou, colocou um produto no carrinho, iniciou o checkout e tudo isso há 1 dia. São usuários diferentes, que precisam receber mensagens diferentes e, com certeza, investimentos diferentes. O mais importante numa ação de remarketing é não incomodar e sim atrair novamente”, avalia Lucas.

## Conteúdo

Trabalhar com marketing de conteúdo é pré-requisito para quem quer ver a marca crescer no mercado. A prática é fundamental para engajar seu público-alvo, estimular suas ações e, consequentemente, aumentar sua receita.

Um bom trabalho de marketing de conteúdo exige uma série de ações para ser implementado com sucesso. Logo no planejamento, é preciso definir qual é o objetivo de utilizar a estratégia, ou seja, o que se pretende alcançar por meio dela.

Alguns dos objetivos mais comuns são **geração de leads**, vendas e engajamento; diminuição de custo por venda; e aumento do lifetime-value. Com o objetivo definido, torna-se mais fácil o trabalho de encontrar a persona que agirá como dela se espera.

Pesquisas de mercado, análise de dados, pesquisas online e entrevistas com os próprios clientes são alguns dos meios para se estabelecer a persona. Em seguida, é preciso optar por quais canais se pretende alcançar seu público.

Alguns deles costumam ser muito efetivos, como blog, mídia social e e-mail marketing. A partir da escolha dos canais a serem utilizados, é o momento de escolher o formato em que o conteúdo será veiculado.

Mais uma vez, são muitas opções, sendo texto, imagem e vídeo as mais utilizadas. No entanto, pode-se ir além e apostar na criação e divulgação de infográficos, e-books e hangouts, por exemplo.

Talvez a parte mais importante da estratégia seja o estudo do funil de vendas. Apenas assim, uma marca será capaz de fornecer um conteúdo assertivo, respeitando o momento da jornada de seus possíveis clientes.

## Coleta de leads

Obviamente, atrair pessoas faz parte da estratégia de qualquer negócio. Para ser bem-sucedido nesse aspecto, o empreendedor pode se aproveitar de **4 aspectos importantes na coleta de leads**:

- Landing pages
- Formulários
- Oferta
- CTA (call to action).

A página de destino é onde o visitante chega ao site. Ela deve ser clara, de fácil utilização e com um layout amigável. Uma de suas funções é justamente conseguir informações do usuário, por isso um formulário nesta página é muito bem-vindo.

A pessoa preencherá o formulário com seus dados para receber uma oferta, que pode ser cupom de desconto, vantagens ou mesmo um material informativo, como um e-book. A relevância dessa oferta é o que vai fazer com que o usuário clique no CTA para recebê-la.

Ou seja, para coletar leads sem ser petulante, a oferta de um material rico é uma solução. O visitante deixará seu e-mail em troca do acesso a esse material.

## Ponto de partida, não de chegada

Obviamente, uma campanha de marketing pode deve, aliás **envolver outras estratégias para conseguir sucesso**. Entretanto, ter o know-how dessas 4 ações e saber implementá-las já será o suficiente para colocar uma empresa à frente de suas concorrentes no ambiente digital.





imagem 

Na plataforma de ecommerce da [**Casa do Código**], quando queremos comprar algum livro, precisamos passar estas informações:

imagem

Para diminuir as dúvidas do usuário ao interagir com nossos formulários ou nosso wizard, é muito importante deixar claro que tipo de informação queremos dele. Na Alura nós temos um curso de [Microcopy] que trata especialmente desse tipo de apoio à informações dentro de formulário. Dá uma olhadinha lá! ;)




Fiz um programa em Python para ser iniciado sempre que meu computador liga. O programa pega o nome de usuário de quem está usando e retorna uma mensagem de boas vindas.

Caso o usuário seja eu mesmo, que sou o administrador do computador, quero que a mensagem seja diferente. Decidi implementar utilizando um operador que aprendi recentemente - [o **is**]:

py 

Loguei no meu computador através do usuário **Visitante** e:

py 

Quando loguei como **Yan**:

py 

Certo, aparentemente está tudo funcionando! Acontece que eu resolvi mudar o meu login de `Yan` para `Yan Orestes`. Alterei meu código:

py 

Fui logar com meu usuário e:

py 

Ué! Se o usuário era exatamente o mesmo, por que não deu certo?

## `is` para identidade, `==` para igualdade

O que acontece é que estamos usando o operador `is` sem entender de fato como ele funciona! **O `is` compara a identidade do objeto,** isto é, o valor de referência de seu endereço na memória, não o valor definido por nós.

Mas espera… já vimos algo assim, não é? O operador `==` também funciona, a princípio, desta forma, mas [**seu comportamento pode ser alterado através dos métodos de comparação rica**], por exemplo.

Então como podemos alterar o comportamento do `is`? Bem… na verdade, não podemos. O propósito do `is` é justamente esse, uma comparação que sempre se baseará na identidade de um objeto, ou seja, se um objeto de fato **é** (_is_) o objeto que está sendo comparado.

**Quando quisermos comparar um valor (ou qualquer coisa que definirmos) de um objeto, usamos, então, o operador `==` e os métodos de comparação rica. Quando quisermos comparar a identidade de um objeto, usamos o `is`.**

Mas, se é assim, por que nossa primeira comparação com `is` (`usuario is 'Yan'`) retornou `True`?

## _String interning_ no Python

Por padrão, no Python (na implementação padrão [**CPython**]), cada vez que atribuímos um objeto a uma variável, estamos criando um objeto. Ou seja:

py 

Deve resultar em:

py 

Mas vimos que esse resultado esperado não foi obtido com a string `’Yan’`. Por quê? Isso é o que chamamos, na computação, de _[**string interning**]_.

_String interning_ é uma técnica que força o armazenamento de **apenas uma** cópia de cada valor de string diferente na memória do computador.

Essa técnica é de muita utilidade para poupar espaço na memória, mas, ao mesmo tempo, pode prolongar o tempo de processamento de algumas operações, já que ao criar uma string,o computador tem de procurar por todas as strings já existentes se uma já tem o valor dessa nova.

O Python suporta essa técnica de _string interning_ através da função **[intern()]** (que é _built-in_ no Python 2 e no Python 3 se localiza no módulo **[sys]**), mas não a utiliza por padrão nas operações de strings. Entretanto, há algumas exceções em que essa técnica é usada nativamente pela linguagem.

Um exemplo é com strings de apenas um caractere, que **sempre** passam por esse processo:

py 

E o resultado:

py 

No nosso caso, com a string `’Yan’`, o que acontece é que as strings que se pareçam com identificadores Python, isto é, contenham apenas letras normais (`a-z A-Z`), números (`0-9`) e underlines (`_`), passam automaticamente pela técnica de _string interning_.

Por isso o teste com a string `’Yan’` teve um resultado diferente de com a string `’Yan Orestes’`, que contém um espaço em branco. Olha como seria se não tivesse esse espaço:

py 

Como resultado:

py 

## Peculiaridades com números inteiros

O Python nos traz um comportamento parecido ao do _string interning_ automático quando lidamos com números inteiros. Vamos fazer alguns testes:

py 

Como resultado, temos:

py 

Dessa vez, o resultado é porque, na implementação em C do Python, [**os inteiros entre -5 e 256 são armazenados em uma array**]. Assim, quando criamos um int nesse alcance recebemos de volta uma referência para o int já criado na array, em vez de criarmos um novo objeto.

## Relações entre `==` e `is`

Depois de tantos testes e explicações, entendemos que o fato de `==` resultar em **True** para determinadas variáveis **não significa** que `is` também retornará o mesmo. Mas como funciona na relação inversa?

Intuitivamente, podemos pensar que todos as operações com `is` que retornam **True** também retornam **True** com `==`, afinal se uma variável **é** outra variável, elas devem ter o mesmo valor (além da mesma identidade).

Em geral, essa ideia está correta, mas não é uma regra, como nos mostra o próprio Python com o valor **[NaN]** (_**N**ot **a** **N**umber_, não é um número) de tipo float:

py

E o resultado é:

py 

## Conclusão

Nesse post, entendemos a diferença dos comparadores `==` e `is` e vimos quando devemos usar cada um deles, concluindo que o operador `is` deve ser usado **sempre e somente** quando queremos comparar a identidade de um objeto, isto é, seu endereço na memória.

O `==`, por sua vez, deve ser usado quando quisermos comparar valores (ou, na verdade, qualquer outra coisa!) de objetos.

Além disso, analisamos algumas peculiaridades específicas da implementação CPython, tornando mais pleno nosso conhecimento sobre o tópico.

Finalmente matamos essa dúvida, hein? E aí, gostou do conteúdo? Se quiser aprender mais sobre Python, se aprofundando nessa interessante linguagem, dê uma olhada em nossos [**cursos de Python na Alura**]!




Estudar sempre vale a pena. Podem tirar meus bens, mas o que eu aprendi, ninguém me tira.

A outra pergunta importante é: **uma certificação Java é valiosa pelo certificado ou pelo estudo**? Como co-autor do [curso de Certificação Java 7 e 8] pela **Alura** essa é a pergunta que vale ouro - ou pelo menos o valor da certificação :)

![]

## O real valor da certificação no mercado

Você está começando a carreira, na faculdade, atrás de um primeiro emprego? O papel da **certificação** é uma maneira de atestar que você estudou para passar nela. Tem valor e as empresas de Java darão este **reconhecimento**.

Você tem dez anos de experiência com **Java** e dominar alguns aspectos da linguagem que nunca olhou a fundo? O canudo pode não fazer tanta diferença, mas o processo de estudar a linguagem a fundo sim.

Aliás, acredito que o que me deu um primeiro empurrão na qualidade do meu modo de pensar foi entender a linguagem Java. Estudando para a certificação lá em 2001 aprendi tanta coisa dela… como ela funciona por trás e quais os motivos pelos quais ela funciona de um jeito e não de outro. Quais as **vantagens** das escolhas feitas por seus criadores, e quais suas **desvatangens**.

E o grande valor da certificação está aí: **você vai aprender muito**. Muito mais do que imaginou.

## Resumindo

Se você ainda não tem experiência no mercado, a certificação é uma maneira de comprovar que se dedicou aos estudos. Se você quer dominar a linguagem e deixar de ser um mero usuário dela, o processo do estudo é ainda mais valioso. Recomendo. Faça um [**curso**] ou compre um [**livro**], tanto faz, o importante será praticar tudo o que é visto!

No fim de sua jornada você será um programador bem melhor, entendendo a fundo o que muitos colegas comentam somente por cima.

**Já está pensando em tirar a certificação?** Temos uma [**formação de certificação Java disponível na Alura**].




Veja a diferença entre uma simples **Telnet** e o **SSH** e como cada um lida com as conexões.

Estou querendo acessar um servidor para realizar algumas configurações que fica em uma sala de servidores junto com vários outros servidores.

Logo, se desejo configurar esse servidor, basta ir até a sala e acessá-lo localmente. Mas e se eu não tiver acesso a essa sala? Ou pior, e se essa sala estivesse em outro prédio do outro lado da cidade, ou do estado, quem sabe até em outro país? Ou em um **cloud**?

A melhor maneira é [**acessar esse servidor remotamente**]. Dessa forma, não importa onde ele está localizado, sempre conseguiremos acessá-lo.

Existem diversos protocolos que conseguem realizar o acesso remoto, dois dos mais conhecidos são o **SSH** e o **Telnet**.

Com ambos protocolos nós conseguimos acessar outro computador remotamente e criar um terminal virtual, que nada mais é do que a emulação do terminal da máquina acessada em nossa própria máquina.

Dessa maneira, conseguimos executar comandos, realizar configurações, ou seja, temos total controle do servidor mesmo sem acessá-lo fisicamente.

Porém você deve estar se perguntando:

> _"Por que ter dois protocolos se ambos fazem a mesma coisa?"_

Ambos protocolos podem ser usados para acessar computadores remotamente, porém existe algo muito importante que diferencia os dois. [**A criptografia**].

## Entendendo a criptografia

A gente pode definir [**criptografia como a simples ação de tornar uma mensagem ilegível**]. Apesar de ser simples o conceito, existem diversos cálculos e métodos complexos usados para [**garantir que uma mensagem seja criptografada**] e que apenas os destinatários saibam o que ela significa.

Quando uma mensagem não criptografada trafega por uma rede, como a internet, qualquer um que a intercepte consegue ler seu conteúdo. Ou seja, se o conteúdo dessa mensagem conter dados sigilosos, como senhas, eles ficam vulneráveis.

Se essa mensagem está criptografada, o interceptador não conseguirá descobrir seu conteúdo, pois apenas o receptor sabe como tornar a mensagem legível novamente.

Essa é a principal diferença entre os protocolos Telnet e o SSH.

**O Telnet não possui nenhuma criptografia**. Ele envia as mensagens em texto puro. Dessa forma caso alguém intercepte esses dados conseguirá ver o conteúdo. Mas como um hacker consegue interceptar essas mensagens?

Existem diversas formas de interceptar uma mensagem, ataques como [**Man in the middle**] são um exemplo. Outra forma de interceptar essa mensagem é utilizar um farejador (sniffer).

O sniffer fica farejando pacotes em uma rede, ou seja, ele fica capturando os pacotes que passam em uma rede. Os pacotes capturados podem ser analisados e, se a comunicação não for criptografada, ele consegue ver o conteúdo da mensagem. Um sniffer muito conhecido é o [**Wireshark**].

## Farejando o Telnet

Vamos fazer uma conexão com o Telnet e usar o Wireshark para farejar essa comunicação e ver se, de fato, conseguimos capturar o conteúdo dos pacotes.

Então, no terminal, podemos dizer para o `telnet` se conectar a um host. No meu caso esse host é o `192.168.65.55`.

imagem e passamos o endereço:

`ssh yuri@192.168.65.55`

![]

Analisando os pacotes, vemos que não temos acesso as informações:

![]

Com o SSH mesmo se o pacote for interceptado o seu conteúdo é ilegível, pois o único que sabe como descriptografar as informações é a máquina que estamos acessando.

## Para saber mais

Mesmo o SSH criptografando os dados, ainda é possível descobrir o conteúdo dos pacotes. Existem várias técnicas, como o ataque Man in the Middle, que interceptam os pacotes e tentam abrir seu conteúdo. Ou ataques que tentam combinações para desvendar a criptografia.

Nos dias de hoje, o SSH é muito mais usado do que o Telnet justamente pelos benefícios da segurança.

Além de ser usado para conectar remotamente, com o SSH nós também conseguimos fazer [**transferências seguras de arquivos**].

Segurança de redes é um assunto muito importante, principalmente nesse mundo tão conectado. Entender como funcionam os protocolos, os equipamentos de redes, os tipos de ataques, ajuda quando estamos pensando na política de segurança.

Aqui na Alura temos uma [** formação em redes**]. Nela você aprenderá sobre os protocolos e equipamentos de redes, aprenderá sobre o endereços IPv4 e IPv6 e aprenderá técnicas de segurança de redes e segurança web.




Temos um construtor `Conta` que define um atributo `saldo` e um método `deposita`:

javascript

Legal, funciona!

Agora, nosso cliente precisa de uma conta poupança: um tipo de conta que atualiza o saldo de acordo com um índice.

Fácil: basta criarmos um construtor `ContaPoupanca`, copiar e colar todo o código de `Conta` e definir um novo método `atualiza`:

javascript

Poxa, mas **copiar e colar é ruim**. Toda vez que mudarmos ou ampliarmos `Conta`, temos que lembrar de copiar para `ContaPoupanca`.

O ideal é **reutilizar** o código de `Conta`, fazendo com que `ContaPoupanca` seja um **tipo especial** de `Conta`, com tudo o que `Conta` tem mais o método `atualiza`.

Em linguagens orientadas a objetos, essa ideia de criar um tipo especial baseado em outro é chamada de _**Herança**_. A linguagem JavaScript é orientada a objetos e tem suporte a herança.

A maioria das linguagens tem classes, com alguma maneira de estendê-las. Mas o JavaScript não é uma linguagem "clássica" e herança em JavaScript é um pouco diferente, baseada em **protótipos**.

Primeiro, crio o construtor `ContaPoupanca` sem as propriedades que quero herdar, apenas com o método a mais:

javascript

Então, usando o `prototype` de `ContaPoupanca`, digo que quero copiar tudo o que há em `Conta` para dentro de `ContaPoupanca`.

javascript

> Na verdade, existem outras maneiras de copiar as propriedade de `Conta` para o `prototype` de `ContaPoupanca`. A maneira acima é a mais comum.

Finalmente, podemos criar uma conta poupança e usar tudo de uma conta, além de atualizar:

javascript

Na última versão do JavaScript, o _EcmaScript 2015_, você pode definir herança usando a palavra-chave `extends`, presente em muitas outras linguagens:

javascript

A linguagem Javascript tem vários recursos poderosos! [**Formação Front-End**] da Alura.





imagem 

Lançamos um **grande redesign** do nosso site. Um visual renovado, mais limpo e mais ilustrado, criado pelo nosso designer [Thiago Vilaça]. Reorganizamos o conteúdo nas 6 principais categorias de cursos que temos hoje:

- [Cursos online de Programação]
- [Cursos online de Mobile]
- [Cursos online de Front-end]
- [Cursos online de Design & UX]
- [Cursos online de Infraestrutura]
- [Cursos online de Business]

A obrigatória imagem do antes e do depois:

imagem ao lado da versão anterior do site (a direita)]

A nova home do Alura (a esquerda) ao lado da versão anterior do site (a direita)

O novo site vem comemorar uma importante marca que também batemos hoje: os **200 cursos online** publicados no Alura! Cada curso ganhou um novo ícone, com nova identidade visual, criada pelo nosso designer [Fabio Gushiken].

![Screen Shot 2016-02-29 at 16.18.48]

Dentro da plataforma de aulas para alunos, também reorganizamos o conteúdo para ficar mais fácil de encontrar cursos nas novas categorias.

 
![Screenshot 2016-03-01 08.34.08]

E você, o que achou do novo site? Deixe seu comentário aqui ou compartilhe com a gente no [Twitter] e no [Facebook].

Nos próximos dias vamos compartilhar mais sobre como fizemos a programação do Front-end e do Back-end do novo site.





imagem 

Nunca é tarde para incluir um _blog corporativo_ na estratégia digital de sua empresa. Os _blogs_ são excelentes fontes de tráfego e um dos canais mais usadas pelos negócios digitais para atrair  “e-mails quentes” (os _leads_) através do [_inbound marketing_]_._

Tudo bem, concordo que blogar soa bem menos atraente do que o Medium “_Mulheres que Escrevem”_, as novas máscaras de Pokémon no Snapchat ou a popularidade da Gabriela Pugliesi no Instagram.

Mas sabia que um _blog_ conversa com todas essas redes sociais, cabendo perfeitamente em estratégias _crossmedia_? Além de ser o tipo de canal completo o suficiente para se tornar um ponto de encontro com seus clientes, agregar diversos formatos de conteúdo, _nichar_ sua audiência, interagir com públicos específicos e propagar os valores da sua marca.

A blogagem é uma prática que pode gerar:

- _tráfego e brand awareness_, quando sua estratégia inclui esforços para transformar seus visitantes em _leads_;
- novos _leads_, se você instalar formulários de captura de _e-mails_ e outros _hacks_ para tentar aumentar a retenção de seus visitantes,
- novas vendas, se sua estratégia for orientada para tal objetivo.

Isso sem contar as vantagens de estar 24 horas online.

Um _blog_ responde às perguntas dos clientes rapidamente, atende a vários usuários com a mesma dúvida ao mesmo tempo e apresenta os benefícios do seu negócio em conteúdos diversos.

Ponto de encontro, o meu **blog** ? É. Já viu o tamanho da comunidade do Jovem Nerd? E a longevidade do Bored Panda e do Techtudo? Imagine que cerca de 1.440 posts estão sendo escritos e publicados a cada minuto (só) na plataforma WordPress. Se um dia tem 1.440 minutos, isso são 2.073.600 milhões de posts por dia. Todos os dias. E se você prefere checar se o que digo é verdade, é só conferir o Worldometers.

# Como criar (do zero) um blog corporativo

O maior objetivo de blogar é… Bem, depende da sua estratégia. Ou de como você responderia a pergunta: “_Por que quero estar online?_”

imagem do _blog_ para capturar e-mails. Direcionados para uma plataforma de e-mail marketing, o Mailchimp, as respostas dadas geram listas de e-mails segmentadas, para o banco aumentar sua base de _e-mails_. Chamamos esse formulário de _opt-in_ e instalá-lo em seu _blog_ pode ajudar a nutrir sua base de _leads_.

Para entregar conteúdos estratégicos, você pode usar o [**Canva**] e criar artes visuais (isso se você não for um designer ou não dispuser de um na equipe, claro). No [Canva], eu gosto de criar _e-books_ e oferecê-los na _homepage_ do _blog_ em troca do _e-mail_ dos visitantes que desejarem fazer o _download_.

Se quiser uma ajudinha para seguir os 6 passos, você é convidado a colocar a mão na massa diversas vezes no novo curso da Alura sobre [**Blog Corporativo: gerando _leads_ e valor**], começando pelo exercício de escrever (ou reescrever) o _copywriting_ da sua página **Sobre**, a página mais visitada em qualquer _blog_ WordPress.

Mesmo que pareça meio _old school_ ou passe a impressão de envolver muito esforço e tempo na criação de conteúdos, blogar é uma atividade valorizada por profissionais de marketing pela **autonomia**. Porque não há intermediários entre as plataformas de _blog_ e seu negócio, o que facilita o **relacionamento** **direto** com sua marca.

 
# Por que incluir um blog corporativo em sua estratégia de marketing digital?

imagem
2. Para promover sua marca (_branding_)

Ambos os motivos têm outro motivo agregado: gerar sentimentos positivos sobre sua marca. E assim, fazemos o **branding**, ou seja, a impressão dos valores da sua marca na experiência relacional com seu público e persona(s).

Ao reforçar seu _branding_, abre-se um canal de conexão, como um ponto de encontro, entre seu público e marca. Exatamente como o banco Next fez quando se juntou ao festival Lollapalooza 2018: jogando um [game] e ganhando, o internauta poderia ser presenteado com ingressos para ir aos shows!

Sejam conteúdos informativos ou anúncios, ambos utilizam a mesma técnica para despertar sua atenção: um título atraente! E pronto. A informação pulou na tela do seu dispositivo e o conduz de um clique a outro até o conteúdo que as marcas querem lhe apresentar.

“Para quem eu escrevo?” e “Por que escrevo?” são, portanto, duas perguntas-chaves que orientam sua estratégia de conteúdo.

imagem

Essa estrutura é bastante usada como modelo para produção de conteúdos para a _web_.

 
# Nunca é demais lembrar: “As pessoas não compram o que você vende, mas por que você vende.”

imagem analisados pelos robôs do buscador para categorizar seu _blog_ e depois ranqueá-lo, né? 

Esses robôs se chamam _crawlers_ e são linhas de código. Eles analisam o **título**, os **subtítulos**, os **textos**, as **legendas das imagens** e outros elementos dos sites e _blogs_. Os itens semânticos são comparados às palavras que digitamos para fazer as buscas e tentar estabelecer relações entre o que seu visitante procura e o seu _blog_.

Nossa grande vantagem é que plataformas como o WP já têm os aspectos técnicos adequados para o SEO. Por isso, foca-se tanto na produção de conteúdo para competir nessa disputa pela atenção das _personas_.

Também é lenda a história de que SEO traz resultados imediatos para o seu ranqueamento. Criar conteúdos e convergir uma microaudiência parecida com suas _personas_ dá trabalho e costuma levar entre 3 e 6 meses para gerar os efeitos esperados. E sim, é um esforço que vale a pena se você entregar conteúdos de valor para seu público.

 
# Mas eu já sou profissional de marketing!

![]

Pensando na carreira do profissional de marketing orientado por _big data, performance ou tração_, o interessante é focar suas estratégias na automação e automatização de processos e tarefas, como fazem os blogueiros profissionais. 

Eles usam ferramentas de automação de marketing que auxiliam na ideação, criação, produção, monitoramento e gestão de conteúdo, como o Trello, a Contentools e o RD Station. E assim, podem viajar tranquilos para participar de eventos enquanto mantêm alimentados seus canais digitais.

Ah, deixa eu contar uns _hacks_ finais.

Blogar já não é escrever um diário online há muito tempo e existe um monte de robôs produzindo conteúdo profissionalmente mundo afora. Quando comecei a acompanhar as projeções futurísticas sobre o marketing digital, passei a concordar com o seguinte:

\- não vai lhe fazer mal aprender o básico de HTML e CSS;

\- ter um pouco de conhecimento sobre UX e design pode alegrar suas estatísticas de _churn_;

\- atenda o usuário e não o motor de busca, pois seu desafio é atender os dois públicos, sempre com foco no usuário;

\- um pouco de conhecimento de marketing e copywriting melhoram sua presença digital;

\- é sempre útil e interessante buscar amplo conhecimento sobre o negócio ou serviço que você está promovendo.

Para seguir os nossos 6 passos, aprender a capturar seus primeiros pokemons _leads_ e automatizar tarefas e processos da produção de conteúdo, inscreva-se [aqui].

E aí, vamos criar um blog corporativo hoje mesmo?

P.S.: Ao se inscrever no curso, você ganha um _link mágico_ da Umbler pra registrar, hospedar e publicar seu _blog_ de graça.





imagem 

Quando vamos usar **count** no banco de dados nos deparamos com várias opções do **SQL**, conheça as diferenças entre as várias possibilidades de contar linhas de tabela com count em um banco de dados.  

Como um exemplo, quantos produtos tem minha empresa mesmo?

sql

Mas...

sql

Como assim? SQL pirou? De novo?

sql

O **select count** verifica o número de linhas não nulas dentro do count que você quer fazer! Se tinha nome nulo, não contou! Resultado? Zoou.

Muito cuidado com seus counts. Então o que devo contar? Se você quer contar valores não nulos, use o count(campo), como fizemos:

sql

Mas se quer contar todos, count estrela nele pra não correr risco, ele vai contar o número de registros retornados, independentemente de valores nulos:

sql
E o 1? Pra que o count(1)?

sql

O **count(1)** seria uma alternativa ao count(algum_campo) pois você teria certeza que nunca seria nulo, e que não precisaria ler o campo... acontece que fica bizarro select count(1), e você quer ter código bizarro ou código legível?

Como disse, eu prefiro contar estrelas... e você, conta estrelas conta um ou conta id?

Fica agora o desafio: qual o resultado da SQL a seguir?

sql

Gostou dessas práticas e dicas de SQL? Então confira também os cursos que temos na Alura para a [**SQL e banco de dados**]! ;)




Estou me preparando para a certificação da Oracle e me deparei com a situação de comparação de booleanos. Todas as vezes que precisamos fazer comparações com tipos `boolean` utilizamos operadores **E** ou **OU**:

java

Nesses exemplos a comparação é feita nos dois lados. Dois lados? Mas como assim? Isso mesmo, dois lados! Por exemplo:

java

Quando ele verifica a expressão `1 > 2` é identificado como uma expressão `false`, mas, mesmo sabendo que o resultado total será `false`, ele verifica o `1 == 1`. Isso significa que sempre que utilizamos esses tipos de operadores a **verificação será realizada tanto da condição anterior quanto da posterior**! Chamamos esses operadores de _[bitwise]_ ou então bit a bit.

Agora vamos imaginar uma seguinte situação:

java

Testando esse trecho de código:

Resultado:

java

Como assim pagamento efetuado? Sendo que não tenho dívida... Nesse caso foi feita uma comparação entre dois métodos que retornam `boolean`, porém o método `pagamento()` possui um **efeito colateral** e só poderia ser executado se o método `temDivida()` retornasse `true`... Para resolver esse problema podemos utilizar os operadores **[short circuit]**: `&&` e `||`. Mas qual seria a diferença? Vamos testar novamente, porém com o short circuit:

java

Verificando o resultado:

java

Ótimo! Agora se não tiver dívida o pagamento não é realizado! Se testarmos em um momento em que tem dívida, ou seja, quando enviamos 1:

java

Resultado:

java

Agora o trecho de código funciona perfeitamente!

Todas as vezes que fazemos uma comparação precisamos tomar certos cuidados ao escolher **operadores bitwise** (&, | e ^) ou um **short circuit** (&& e ||). Ao **utilizar operadores bitwise corremos um grande risco** testando um método que tenha um **efeito colateral**, como foi o caso do método `pagamento()`. A **boa prática sugere o uso do short circuit** justamente para evitar esse problema.

E aí, gostou do short circuit? Quer aprender mais detalhes da linguagem Java? Pensando nisso, o instrutor Guilherme Silveira criou a [**formação Java**] na Alura !



No meu sistema de cadastro de produtos, preciso criar uma funcionalidade que, a partir de um arquivo CSV com dados dos produtos, eu consigo ler esse arquivo e separar todos os produtos contido nele. Para representar um produto temos a seguinte classe:

python

Inicialmente temos o arquivo `dados.csv` com o seguinte conteúdo:

python

Nesse meu sistema, irei ler esse arquivo a partir do diretório `"arquivos/produtos/"` portanto, criaremos a variável `arquivo` indicando o caminho e o nome do arquivo que leremos:

python

## Implementando a função de leitura do arquivo

Agora precisamos criar uma função que ficará responsável em ler esses produtos por meio da variável `arquivo`, portanto, criaremos a função `ler_produtos()` passando o `arquivo` como parâmetro:

python

Primeiro, precisamos abrir o arquivo CSV, ou seja, utilizaremos a função `open` enviando a variável `arquivo` e utilizando parâmetro 'rb' que indica leitura:

python

No Python, para ler um arquivo CSV, podemos utilizar a função `reader` do módulo `csv`, porém, precisamos importar o módulo:

python

Observe que também adicionamos o parâmetro `delimiter` que já separa cada informação a partir de um critério, nesse caso, cada informação será separada no momento em que aparecer uma vírgula, e também, estamos retornando a função `reader` que é justamente o arquivo lido.

Então vamos realizar um teste, faremos a chamada para a função `ler_produtos` e devolveremos para a variável `dados`:

python

Rodando o nosso código temos o seguinte resultado:

python

## Verificando a existência do arquivo

Opa! Ele não conseguiu achar o meu arquivo! Por que será que isso aconteceu? Vejamos dentro do diretório onde está o meu projeto:

bash

De fato não existe esse diretório, então o que devemos fazer? Antes mesmo de tentarmos pegar o arquivo, temos que verificar se ele pelo menos existe! Em outras palavras, precisamos primeiro verificar se o caminho que queremos encontrar existe, caso não exista, precisamos criá-lo!

Portanto, o nosso primeiro passo é separar a variável `arquivo` em duas, ou seja, a `arquivo` e `caminho`:

python

Em seguida, vamos criar a função `verificar_arquivo`, que será responsável em verificar se o diretório existe e o arquivo também, caso não exista, ela deverá criá-los! Então vamos criá-la:

python

## Verificando a existência do diretório

Qual é o nosso próximo passo? É justamente verificar se o diretório não existe. Para isso, no Python, podemos utilizar o módulo [`os`] com funções capazes de realizar [chamadas de sistema].

Nesse nosso primeiro caso, utilizaremos a função `path.exists` que verifica se existe um arquivo ou diretório com o parâmetro informado:

python

Observe que estamos varificando se o diretório não existe, caso isso for verdade, o que devemos fazer? Precisamos criar o diretório! Mas como criamos um diretório no Python? Simples! No modulo `os`, temos também a função `makedirs` que cria diretórios:

python

O nosso próximo passo é verificar a existência do arquivo dentro desse diretório. Podemos utilizar novamente a função `path.exists` do módulo `os`. Da mesma forma como fizemos com o diretório, caso não exista o arquivo, precisamos criá-lo.

## Criando o arquivo

Para criar um arquivo, utilizaremos a função `open` passando o segundo parâmetro com o valor "w" que indica a criação para escrita:

python

Por fim, retornamos a variável `arquivo` para lermos na função `ler_produtos`:

python

Agora, basta apenas chamarmos a função `verificar_arquivo` devolvendo o seu resultado para a variável `arquivo`, e então, chamamos a função `ler_produtos` enviando a variável `arquivo` como parâmetro:

python

## Exibindo as informações

Agora vamos imprimir os dados para verificar os valores, porém, ao invés de fazer um `for` de forma procedural, utilizaremos o recurso de [compreensão de lista]:

python

Executando o código temos o seguinte resultado:

python

Note que o primeiro valor ainda é o cabeçalho, isto é, linhas 'nome' e 'valor'. Para eliminarmos esse cabeçalho basta chamarmos a função `next` antes de iterar a variável `dados`:

python

Por fim, basta apenas armazenarmos os valores em objetos do tipo `Produto`:

python

Rodando o código novamente, temos o seguinte resultado:

python

## Situações inesperadas

Observe que todos os dados foram lidos sem nenhum problema! Entretanto, se o caminho `"arquivo/produtos"` ao invés de ser um diretório, fosse um arquivo? O que será que aconteceria com o nosso código?

Vamos fazer uma simulação! Primeiro eu vou alterar o nome do diretório para `"arquivo/produtos"` para `"arquivo/produtos1"` e então, vou criar um arquivo chamado "produtos" dentro do diretório "arquivo":

imagem

E que tal aprender a desenvolver com o Python hoje mesmo? Na Alura, temos a [**cursos de Python**], onde você vai aprender desde o zero até uma aplicação web usando o Python.





imagem 

Estamos trabalhando em uma editora de livros que já vende diversos produtos por conta das propagandas publicadas em revistas, estampadas em outdoor, transmitidas em rádios e canais de televisão e, até mesmo, na internet, com anúncios pagos em portais de notícias,sites relacionados a cultura e sites de blogueiros que fazem resenhas de livros.

Com o passar de um tempo, percebemos que muitas editoras que interagiam com o público nas redes sociais aumentaram suas vendas. Por mais que nossas vendas não tenham diminuído, antes, as nossas vendas acompanhavam o das outras editoras, agora, as vendas das outras editoras, que interagem com os clientes nas redes sociais, está bem maior que as da nossa. Então, passamos a analisar que queríamos ter esse contato com os clientes e pensamos em ter uma atuação mais direta com eles, pelas redes sociais também.

Dessa forma, criamos contas no Facebook, Twitter e Instagram para a editora e começamos a fazer diversas publicações relacionadas aos livros que são feitos e vendidos pela empresa.

Porém, com o passar do tempo, percebemos que não estávamos atingindo o público da maneira que queríamos, de uma forma com que eles interagem nas redes sociais da editora e se interessasse pelos perfis.

Assim, começamos a pensar em outros tipos de publicações que poderiam fazer. Pensamos em passar um conteúdo a mais dos lançamentos que seriam feitos pela editora, como séries baseadas em livros publicados ou até mesmo curiosidades da história e do processo de escrita de um livro que ainda será publicado.

Para isso, fazíamos publicações desse tipo nas redes sociais, mas também sentimos que poderíamos usar outro canal para aprofundar mais nas novidades e curiosidades. Pensamos em fazer um blog onde colocaríamos de forma bem mais aprofunda as novidade.

A partir disso, também começamos a colocar os links dos posts do blog nas publicações das redes sociais, tornando-as um ponto de encontro não só dos leitores, mas também dos diversos canais da empresa.

Isso começou a gerar o resultado que queríamos, com muitas pessoas marcando umas às outras para verem as novidades, para lerem mais sobre as curiosidades do livro ou, então, para falar de um evento de lançamento.

Com o passar do tempo, percebemos que nossas redes sociais transmitiam um conhecimento que, para algumas pessoas, era desconhecido, ou acrescentava mais conhecimento para quem já possuía algum.

Assim, muitas pessoas começavam a se simpatizar pela editora e, depois de algum tempo, começaram a comprar os livros publicados.

Isso que passamos a fazer na editora é o que chamamos de **marketing de conteúdo**, que acontece quando você transmite um conteúdo que traz um conhecimento relacionado ao que sua empresa faz, tornando-a conhecida e referência sobre o assunto.

Dessa forma, sempre que alguém pensar no produto da sua empresa, ela virá à mente da pessoa, tornando a empresa uma autoridade a respeito do assunto.

Esse tipo de marketing tem como objetivo atrair clientes, mas de uma maneira sutil, **sem se autopromover diretamente**, como acontece nas propagandas do marketing tradicional.

A empresa transmite um conhecimento, que não tem necessariamente o objetivo de vender, mas que pode resultar em uma venda, pois quando o cliente precisar do produto que sua marca vende, ele sempre irá recorrer a ela.

## Funil do Marketing de Conteúdo

Diferente do tradicional, no qual a intenção é que a venda ocorra de maneira direta, já que a pessoa vê e já procura comprar o produto, no marketing de conteúdo acontece um processo dividido em etapas até que ocorra, efetivamente, a venda do produto. Esse processo é o que chamamos de **funil do marketing de conteúdo** e ele possui quatro etapas.

**Primeira: atrair pessoas**. Nessa etapa, você cria um conteúdo interessante e de qualidade, que pode vir por meio de posts em blogs, publicações nas redes sociais e o próprio site da empresa, para atrair as pessoas.

**Segunda: converter**. Nessa etapa você começa a converter a pessoa interessada em um _Lead_, que é um possível futuro cliente da empresa. Isso acontece por meio de _Call-to-actions_ e formulários, pedindo o contato da pessoa para que ela receba futuras informações a respeito da empresa.

**Terceira: fechar a venda**. Isso acontece quando a pessoa efetivamente realiza a compra do produto da empresa. Isso se dá por meio de envio de newsletters, alertas de vendas, segmentação dos leads e a entrega de um conteúdo específico para aquela pessoa para nutri-la com conteúdos que a interessem. Além disso mostrando que a empresa possui produtos que têm a ver com o problema dela.

**Quarta: fidelizar**. Nessa etapa, tem outra diferença entre o marketing de conteúdo e o marketing tradicional. No marketing de conteúdo é muito importante que o cliente, além de comprar, também torne-se fiel à marca, pois, assim, ele sempre comprará os produtos da empresa. São pessoas que gostam do seu conteúdo e do seu produto, fazendo com que as chances deles divulgarem a marca sejam maiores. Então é importante criar conteúdos que apresentem os produtos, para quem não os conhece, e tragam as novidades da sua empresa, para aqueles que já a conhecem, também.

## Conteúdo

Primeiro, pense no conteúdo que poderia transmitir aos seus clientes. Deve ser algo que seja relacionado a eles, ao seu produto e que os interesse. Caso seja necessário, procure e pesquise os assuntos relacionados e tente trazê-los para a realidade da sua empresa.

Pense que, no caso da editora, tentávamos trazer o leitor para perto do livro, apresentando curiosidades da obra, para que, conhecendo os bastidores, o leitor sinta-se bem próximo a ela.

Para isso, podem ser enviadas newsletters, para quem concedeu o e-mail para a empresa, com as principais notícias e curiosidades da semana, por exemplo, e essas notícias serem links para o site e redes sociais da editora.

Além disso, no blog, o conteúdo será algo mais aprofundado a respeito do tema e que ensine ou solucione um problema do cliente.

Por exemplo, um post feito no blog da editora com o título "Compre tal livro" não é marketing de conteúdo, mas sim uma propaganda direta. Já um post que fala sobre o universo do livro, sobre curiosidades a respeito, sem fazer uma promoção direta, é marketing de conteúdo, pois apresenta uma informação a respeito do produto da empresa, e não somente a cara desse produto.

## Divulgando com conteúdo

Produzir conteúdo é uma boa forma de criar empatia com as pessoas que consomem seu produto, ou com futuros consumidores, que terão na sua marca não somente algo que poderão comprar, mas também uma referência, já que é a sua marca a especialista a respeito, possuindo e compartilhando um grande conhecimento.

O marketing de conteúdo é um modelo de marketing em que não há uma promoção direta, como no tradicional. É uma troca de informações que faz com que a empresa torne-se autoridade em assuntos relacionados ao produto dela, além de ser um ponto de encontro no qual os clientes podem se informar mais.

Assim, o cliente confia mais na empresa e pode se fidelizar a ela, sempre consumindo produtos da marca, pois o contato com a pessoa é constante e direto, ao contrário do marketing tradicional.

Lembre-se que para criar o conteúdo tem que saber qual o objetivo principal daquelas informações serem passadas ao seu cliente. Pode ser para ajudar, informar, entreter?

Essas ideias são a base para começar a implementar o marketing de conteúdo na sua empresa. Caso queira saber mais detalhes e ainda receber umas dicas de como criar os posts, infográficos e e-books é só acessar o nosso [**curso de Marketing de Conteúdo**]. Além disso, também pode conferir mais informações no [**livro da Casa do Código Marketing de Conteúdo: Estratégias para entregar o que seu público quer consumir**].




Está com dúvidas sobre como deve acessar o banco de dados com PHP7? Sendo assim, entenda a diferença entre mysqli e PDO.

Com a nova atualização do php de 5.6 para a versão 7, a extensão `mysql_*` para conexão com banco de dados, já depreciada na versão antiga, deixou de existir! Já se recomendava utilizar as extensões `mysqli` ou `PDO [(PHP Data Objects)]` e agora as duas se tornaram nossas únicas opções para essa funcionalidade.

Mas, qual das duas utilizar? As duas fazem a mesma coisa? É comum que este tipo de duvida apareça, até mesmo para quem já conhecia as extensões anteriormente!

Quando estamos desenvolvendo um sistema em PHP, uma hora ou outra nos deparamos com a necessidade de utilizar um banco de dados. Nesse momento podemos escolher qualquer um: PostgreSQL, MySQL, Oracle, SQLite, entre outros.

O mais comum entre a maioria dos desenvolvedores é o MySQL. Assim, podemos usar a extensão `mysqli` do php para realizar a conexão! Então, ao desenvolver uma query com a extensão `mysqli` temos algo como:

php

Perfeito, realizamos uma busca simples com um parâmetro através da extensão `mysqli`. Mas, e com `PDO`? nesse caso ficaria:

php

Ótimo, as duas formas funcionam e retornam o mesmo array `$pessoaArray`! Mas, já da pra ver que existem algumas diferenças entre as extensões.

Primeiro que ao instanciar `PDO`, precisamos de um prefixo `mysql` antes de passar o `host`, entretanto, com `mysqli`, não havia essa necessidade. Isso porque o `PDO`, ao contrario do `Mysqli`, consegue trabalhar com vários bancos de dados, então precisamos dizer com qual banco vamos trabalhar.

Caso houvesse uma migração de MySql para PostgreSQL, a única mudança necessária no nosso projeto com `PDO` seria:

php

Com `mysqli` essa migração simples não seria possível!

Outra diferença nos códigos é que com `mysqli` passamos o atributo `$nome` do método associado ao atributo `?` da query pelo método `->bind_param` . Já com `PDO` definimos um atributo `:nome` dentro da query e depois relacionamos `:nome` com `$nome` pelo método `->bindValue`.

Além disso, com `mysqli`, precisamos especificar o tipo do atributo `$nome` como `String` através da letra _"s"_. Isso porque o método `->bind_param` segue a estrutura:

```php ->bind_param("primeira silaba do tipo do parametro",$parametro) ```

Já o método `->bindValue` segue a seguinte estrutura:

```php ->bindValue(":parametroDaQuery",$parametroQueSeraAtribuido) ```

Isso faz com que a realização de queries em `PDO` seja muito mais fácil pois sabemos exatamente qual atributo estamos associando. No caso de termos mais de um parametro o código com `mysqli` ficaria:

php

Agora precisamos seguir a ordem com que os parametros `?` foram inseridos na query e especificar o tipo do `$id` como `Int` através da letra `i`. Caso houvesse uma simples mudança na ordem:

php

precisariamos lembrar de inverter os parametros e as especificações de tipo no método `bind_param()` para:

php

Já com `PDO`, a mesma situação ficaria:

php

Assim, não importa a ordem dos parâmetros, sempre estamos associando o parâmetro certo!

Com nosso exemplo simples de buscar uma pessoa pelo nome no banco de dados podemos perceber algumas vantagens do `PDO` e outras do `mysqli`:

- Com `PDO` conseguimos utilizar varios bancos de dados, facilitando possiveis migrações além de nos possibilitar desenvolver códigos mais semanticos, o que facilita muito a manutenção e melhora a legibilidade
- Com `mysqli` trabalhamos especificamente com banco de dados MySQL, o que da para essa extensão maior perfomance e algumas funcionalidades a mais

Então, quando devemos utilizar `PDO` ou `mysqli`? Para um projeto em que performance é de extrema importância, podemos optar pelo `mysqli`. Em outro projeto, no qual vamos trabalhar com mais de um banco de dados, podemos optar pelo `PDO`! Por isso, é importante refletir sobre qual deles utilizar em nossos projetos a partir de nossas necessidades e limitações.

Nesse post a gente viu as principais diferenças entre a extensão `mysqli` e `PDO`, um pouco da sintaxe dos dois e como escolher qual deles utilizar em nossos projetos! Mas, e você? Qual você mais utiliza, ou pretende utilizar, no seu dia-a-dia? Comente aqui!

Quer ver mais diferenças entre `PDO`, `mysqli` e o antigo `mysql_*`? Da uma olhada aqui no [php.net] (Disponível em inglês). Você também pode encontrar tudo sobre PHP e `mysqli` nos cursos online da alura: [PHP e MySQL I] e [PHP e MySQL II]




Todo mundo sabe que uma variável local é... local:

js

Mas e isso?

js

Uma variável declarada dentro do `if` é visível fora dele? Sim!

JavaScript só tem **escopo de função** (e o escopo global). Não temos escopo de bloco. Ou seja, o `if` não define um escopo isolado.

Cuidado pra isso não te atrapalhar em alguns cenários. Por exemplo, dois fors simples:

js

Ambos estão mexendo na mesma variável `i`, afinal o `for` também não define um escopo. Temos que tomar cuidado pra não fazer alguma besteira.

O novo ES6 define, FINALMENTE, **escopo de bloco** na linguagem. É com a palavra chave `let`:

js

Bom saber, mas o suporte ainda é fraco nos navegadores.

* * *

Quer fugir de outras enrascadas JavaScript e facilitar o seu dia a dia no front-end? Receba 10 dicas e boas práticas do expert Sérgio Lopes, uma por dia:

**[Cadastre-se na série Boas práticas de JavaScript]**




Hoje estamos com mais um depoimento de nossos alunos. Dessa vez, a Nathalia Chaves conta um pouco de todos os desafios que teve que enfrentar em sua trajetória para alcançar a tão sonhada oportunidade como desenvolvedora! Bora saber?

imagem

Aqui na Alura temos várias [**formações**] que podem ajudar em sua jornada profissional. Temos inclusive uma carreira em [**Ruby and Rails**], as tecnologias que a Nathalia usa em seu dia a dia no trabalho.

O que achou da história da Nathalia? Bem bacana né? Quer compartilhar a sua história também? Então entre em contato conosco através do e-mail contato@alura.com.br




Fui contratado por uma empresa para analisar o que cada cliente está comprando. A ideia é conseguir agrupar os clientes por gostos iguais. Dessa forma, serão feitas _newsletters_, promoções e campanhas de marketing direcionadas para clientes com algo em comum.

Para isso, precisamos pegar dados de clientes, como a categoria dos produtos que cada um costuma comprar e com que frequência isso ocorre. Bem, já temos os dados definidos, mas como podemos criar grupos com os clientes? Quantos grupos devemos criar?

## O aprendizado não supervisionado

Quando estamos trabalhando com análise de dados, é muito comum utilizar o aprendizado de máquinas, ou machine learning, para criar um modelo que classifique os dados para gente. Existem [**algoritmos que podemos utilizar para ensinar a máquina**] como trabalhar, mas qual deles utilizar?

Podemos classificar os nossos dados, mas não temos um rótulo para ensinar o classificador. Podemos definir esses rótulos na mão, isto é, ir analisando o perfil um por um e criar os grupos de clientes, mas isso levaria muito tempo e seria muito trabalhoso. O que nós podemos fazer para obter esses rótulos, isso é, o grupo que cada cliente pertence?

Vamos imaginar que temos dois tipos de frutas diferentes, maçãs e maracujás. Como faríamos para agrupá-las? Bem, nesse caso, temos dois grupos, maçãs e maracujás. Assim, utilizamos algumas das características das frutas para agrupá-las: cor, formato, tamanho,gosto, entre outras.

A partir dessas características, criamos os rótulos dos nossos dados. Podemos pegar as características que extraímos dos clientes, sua frequência de compra e a qual categoria pertencem os produtos que mais compram e utilizar essas informações para agrupá-los.

Podemos criar os grupos de acordo com a necessidade de segmentação, dois, três, oito, grupos, segmentar bem o conjunto de dados ou não segmentar tanto.

Para agrupar os dados podemos pegar um cliente que compra dez vezes no mês e compra muitos livros de ficção científica. Outra cliente também compra livros de ficção, mas com uma frequência de oito vezes no mês.

Apesar de não terem as mesmas frequências de compra, elas são parecidas. Também são os gostos. Logo, se fizer sentido, podemos colocá-los em um mesmo grupo. Isso nos mostra que, se criarmos um gráfico de número de compras por categorias, os valores que estão próximos podem pertencer ao mesmo grupo.

Existem diversos algoritmos que podemos utilizar para agrupar os dados, um desses é o **K-médias, ou K-means**. Esse algoritmos pega cada um dos nossos dados (observações), para cada grupo (k). Cada dado pertencerá ao grupo mais próximo da média.

No Python, existe a biblioteca [**scikit-learn**]. Essa biblioteca é muito utilizada pelas pessoas que trabalham com análise de dados e com machine learning. Ela já tem implementado diversos algoritmos que usamos no dia a dia, sendo um deles o K-means.

## Conhecendo a sklearn

Queremos utilizar a `scikit` no nosso código, então o primeiro passo é importá-la (`import`):

python 

Legal! Mas qual função da biblioteca nós queremos utilizar? Queremos utilizar o K-means, então nós podemos, em vez de importar todos os módulos da biblioteca, importar somente o K-means.

Para isso, falamos que da biblioteca (`from`) `sklearn`, do módulo de agrupamento (**cluster**), queremos importar o `KMeans`:

python

Já temos a classe que implementa o algoritmo, o que precisamos agora? Criar um objeto a partir dessa classe:

python 

Com o modelo instanciado, podemos pedir para treiná-lo e para ele predizer os dados dos usuários:

python

Esse método nos retorna uma série de números que são os rótulos dos nossos dados, **a predição**. Ou seja, conseguimos atribuir esse retorno a uma variável e utilizá-la em outra partes do código:

python 

Agrupamos nossos dados, mas como podemos ver esses grupos?

## Visualizando os grupos

Uma das formas que temos para [**visualizar os dados é a criação de gráficos**]. Uma biblioteca muito utilizada para isso é a [**matplotlib**]. Como a outra biblioteca, precisamos importá-la para começar a utilizar suas funções.

Nessa biblioteca, queremos utilizar o módulo de criação de gráficos com o Python (`pyplot`):

python

Por convenção, muitos desenvolvedores colocam um apelido (alias) nessa importação, chamando de `plt`:

python

Antes de mostrar os grupos, vamos ver como estão nossos dados. Para isso, podemos pedir para o Matplot plotar um gráfico com os pontos dos nossos dados. Esses gráficos tem dois pontos, um para o eixo **X** e um para o eixo **Y**

Como estamos querendo mostrar um gráfico do número de compras por categorias de produtos, esses serão nossos valores de **X** e **Y**, respectivamente. No meu caso, os dados dos usuários estão em um Array do [Numpy], onde a primeira coluna são a frequência das compras e o segunda coluna são as categorias:

python

Agora só precisamos mostrar (`show`) o gráfico:

python 

imagem vale quatro:

python

Plotando o gráfico agora, veremos que temos apenas três grupos formados:

![]

Além do K-médias, existem [**outros algoritmos**] que a SciKit implementa. Cada um deles tem seu próprio meio de agrupar os dados.

O aprendizado não supervisionado é uma das áreas no aprendizado de máquinas. Com ele, conseguimos rotular nossos dados e agrupá-los. Aqui na Alura, temos uma [**formação em aprendizado de máquina**].

Nela você verá desde estatística, até o aprendizado de máquinas supervisionados com classificação.




No dia 12 de Novembro de 2014 a NASA conseguiu [**pousar uma sonda em um cometa**] e a [**Microsoft anunciou**] que o .NET seria open source. Que dia para a humanidade.

Mas esse .NET não era bem o .NET "comum" que nós conhecemos, era o .NET Core - uma reimplementação do .NET tradicional que prometia ser mais rápido, modular e multiplataforma. E essa semana ele se tornou realidade. Depois de pouco mais de 1 ano e meio de desenvolvimento em conjunto com a comunidade nesta segunda-feira(27/06) [finalmente foi anunciado] o release 1.0.

Esta versão 1.0 roda em Windows, Mac e várias distros de Linux como RedHat e Ubuntu. Suporta C#, VB, F# e generics, LINQ, suporte assíncrono e mais. O código fonte [**está todo aberto no Github**] para quem quiser baixar, testar e contribuições são bem vindas.

## Começando com o .NET Core

Se você usa o Visual Studio 2015(pode baixar ele de graça [aqui]) tem que baixar o [Update 3] antes de baixar o [.NET Core Tools for Visual Studio].

Se você for usuário de Mac ou Linux, a melhor forma e olhar a própria página do .NET, a [http://dot.net] e ver as alternativas que você tem. O que a Microsoft recomenda é que você use o [Visual Studio Code], mas você pode usar seu editor favorito(Sublime Text, Atom, Brackets, etc).

## O futuro do .NET

Ao desenvolverem o .NET Core, a ideia da Microsoft é que ele seja o futuro do .NET e que, devagarzinho, o .NET "tradicional" seja substituído pelo Core.

Não sabemos como será a adoção dos desenvolvedores e empresas e se o Core realmente vai virar como a Microsoft espera. Mas ter mais opções sempre é bom, certo?

Se quiser ler mais sobre o .NET Core, eu escrevi sobre a [motivação do .NET Core] e sobre os dois repositórios mais importantes do Core: o [CoreFX] e o [CoreCLR] lá no meu blog.

Todas as informações que você precisa saber hoje sobre ele estão na própria [página do .NET] e no [blog do .NET] :)

E aí, o que achou dessa novidade?

**A propósito, você sabia que temos [cursos de .NET]?**





imagem 

Como usuário das múltiplas aplicações web, com certeza você já enfrentou algum problema com uma senha. Talvez a tenha esquecido, ou talvez tenha tido uma conta invadida.

Esses dias, decidi criar uma conta em uma rede social que meus amigos gostam. Entretanto,logo quando digitei a senha que eu queria, uma mensagem de erro apareceu na tela falando que minha senha era muito fraca. Pelo visto `senha` não ia funcionar, mesmo.

Lembrei daquelas regrinhas que todos já ouvimos em algum momento, sobre uma boa senha ter caracteres minúsculos, maiúsculos, números e símbolos, e remodelei ela; dessa vez, deu certo!

Tudo parecia bem, não é? Duas semanas depois, porém, recebo uma notificação - alguém havia invadido minha conta. Obviamente, fiquei indignado! Minha senha seguia aquelas regrinhas que eu aprendi! A senha era `Senh@123`...

Depois de pesquisar, descobri que minha conta pode ter sido invadida através de um **ataque de dicionário**, ou _[dictionary attack]_. Com essa técnica, o atacante, através de um processo automático, tenta ganhar acesso com múltiplas senhas diferentes. Essas senhas geralmente estão em um arquivo chamado de **dicionário de senhas** - existem vários desses disponíveis na Internet.

Mas qual o problema dessa senha? Como, então, podemos criar uma boa senha? Quais são os aspectos importantes que devemos levar em conta?

## Maiúscula, minúscula, número, pontuação - é isso?

Minha senha `Senh@123` contém três letras minúsculas, uma maiúscula, um símbolo e três dígitos numéricos. Lembrando do que aprendemos em nossas aulas de matemática, podemos até calcular quantas possibilidades de senha existem.

Temos **26** possibilidades de letras minúscula, mais **26** de maiúsculas, mais **10** caracteres numéricos, mais por volta de **28** caracteres de pontuação, totalizando **90** caracteres possíveis.

Como nossa senha tem 8 caracteres de comprimentos, a conta fica **90⁸**, que é igual a **4.304.672.100.000.000** possibilidades!

Digamos que o atacante consegue testar 1000 senhas por segundo. Para testar todas essas possibilidades, ele precisaria de **mais de 136 mil anos**.

> "_Uau! Que número gigante! Mas se é assim, como conseguiram descobrir a senha? Foi sorte do atacante?_"

Na verdade, o que acontece é que essa conta toda não se aplica à nossa senha, **porque ela não é aleatória**! Temos mais de 4 quatrilhões de possibilidades no total, mas a nossa não é apenas mais uma nesse monte. Essa senha é deduzível, e é assim que o ataque de dicionário trabalha.

## Seguindo as regras de uma maneira efetiva

O ataque de dicionário, diferente de outros tipos de ataque, como o **[ataque de força bruta]** (_brute force_), não tem o objetivo de tentar todas as possibilidades que existem dentro de um contexto. O que ele faz é, dadas algumas [palavras ou grupos de palavras comuns em senhas], tentar o acesso com várias possibilidades para cada palavra, considerando substituições e modificações comuns.

Ou seja, o ataque não vai só verificar se `senha` funciona, mas também `senha123`, `Senha`, `senh@123` e, eventualmente, `Senh@123`. **Isso não significa que caracteres especiais e de grupos diversos não fazem diferença, mas que é ilusório entendê-los como garantia de segurança**.

Assim, se nossa senha tiver uma base tão simples e usual como `senha`, substituições comuns como de `a` para `@` e mudanças do gênero de fato não aumentarão muito o nível de segurança desse nosso segredo. Mas e aí, o que devemos mudar?

Se juntarmos um pouquinho de tudo, podemos selecionar uma palavra aleatória, como **cordeiro**, e tentar fazer algumas modificações não tão usuais. Com algumas alterações, cheguei em `C0rd3iro%6` - uma senha já bem mais segura comparada à anterior.

Deixei um tempo parado e fui, finalmente, logar na minha conta. Coloquei meu email e… qual era a senha, mesmo? _Cordeiro_ alguma coisa, um dos **o** virava **0** e também havia algum símbolo no final, eu acho… Que complicado!

E agora? Será que a complexidade dessa senha é compensada pela segurança que ela traz? Não haveria um método melhor para nós, usuários?

## Senhas complexas X senhas longas

Toda esse problema de memorização e usabilidade que esse tipo de senha mais complexa traz é base das principais críticas contra ele. Randall Munroe, cartunista do _webcomics_ **[xkcd]**, criou uma tirinha em 2011 brincando um pouco com o tema, que continua sendo muito relevante.

imagem, nos garantindo uma senha pouco convencional e, ainda assim, bastante efetiva!

Mas e aí? Criamos nossa frase-senha comprida, com diversas palavras aleatórias, memorizamos e é isso? Podemos usá-la para todas as nossas contas, então?

## Senhas únicas para cada conta

Infelizmente, os ataques de dicionário não são o único perigo que nossas senhas enfrentam, hoje em dia. Há casos em que a segurança nem depende de nós, usuários, como quando alguma plataforma [armazena as senhas em texto plano], em vez de armazenar uma [hash gerada a partir dessa senha].

Há ainda casos que, apesar de dependerem de nós, não dependem exatamente da complexidade de nossa senha, como com _[malwares que capturam as teclas digitadas]_, ou até mesmo um caso bobo de alguém observando o teclado enquanto digitamos.

Por conta disso, não podemos confiar em uma única senha para tudo. O ideal é termos senhas completamente diferentes (isto é, que não sigam um mesmo padrão) para cada serviço em que criarmos uma conta. Assim, caso uma de nossas senhas fosse descoberta, por qualquer motivo que seja, nossas outras contas não estariam comprometidas!

Considerando tudo o que já aprendemos, podemos decidir por criar frases-senha diferentes, com palavras diferentes, para cada conta que criarmos. Entretanto, isso geralmente não é viável, afinal quem vai querer ficar memorizando dezenas de frases aleatórias?

Por conta disso, muitos usuários acabam optando pela simplicidade de uma única senha fraca para todos os serviços, em vez do método mais seguro. Mas será que não temos como encaixar usabilidade e segurança, nesse caso?

## Usando gerenciadores de senha para evitar a memorização

Depois de tanto procurarmos pela melhor opção de senha, novamente caímos no problema da memorização… Para gente, o melhor seria se realmente não precisássemos memorizar nada, ou pelo menos não muita coisa, mas que ainda assim tivéssemos senhas seguras.

Poderíamos guardar todas as nossas senhas em um único arquivo, para apenas copiarmos e colarmos elas quando fôssemos usar. Mas deixar em um simples arquivo solto seria um grande risco. E se houver um método melhor, que garante a segurança dessas senhas armazenadas?

Para isso, existem os **[gerenciadores de senha]**, como o [KeePass] e o [LastPass], que nos ajudam, de forma segura e organizada, a armazenar todas as nossas senhas.

Podemos configurar o acesso a eles com senhas (que podem seguir as recomendações que trabalhamos ao longo do post!) e até com arquivos-chave, no caso do KeePass, necessários para a visualização do banco de dados. Mas se agora vamos guardar nossas senhas em um gerenciador, como devemos criá-las, enfim?

## Usando senhas aleatórias como garantia

Agora que não precisamos mais memorizar senhas à toa, podemos abusar ainda mais do aspecto de segurança, gerando nossa senha através de algoritmos de aleatoriedade, o que, como calculamos mais acima, aumenta intensamente o nível de segurança de nossas senhas.

Com um bom comprimento e uma boa variedade de caracteres (**que não precisam se restringir aos ASCII, se a plataforma faz um bom trabalho de _hashing_ de senhas**), podemos criar senhas (**quase**) impossíveis de quebrar com métodos de dicionário/força bruta.

Uma senha gerada por esse [gerador aleatórios de senhas em emoji,] por exemplo, poderia demorar mais de **1,49 X 10⁵² vezes a idade da Terra** para ser quebrada, se todas as pessoas do planeta tentassem simultaneamente quebrá-la com um computador diferente a 1 milhão de tentativas por segundo. Basicamente, é improvável que uma senha dessas seja quebrada.

 

Para os casos em que precisamos de um acesso mais dinâmico a alguma conta, que não se restrinja a um computador, podemos usar das outras dicas que aprendemos no post.

Além disso, é importante, **sempre que possível**, utilizar a ferramenta de **autenticação de múltiplos fatores**, ou _[multi-factor authentication]_. Com essa configuração, o acesso a uma conta não depende apenas da senha, mas também de fatores externos diversos.

Uma possibilidade é, por exemplo, exigir um código de login por SMS. Assim, estaremos ainda mais seguros, mesmo que nossa senha seja comprometida.

## Maior segurança de dados para maior segurança nossa

Apesar de muitas vezes pensarmos não fazer diferença utilizar uma senha (que sabemos que é) fraquíssima, isso não é verdade. Não tomarmos atitudes em prol da segurança de nossos dados pode acabar em grandes prejuízos na nossa vida.

Tratando-se das senhas, entendemos o que torna uma senha segura (e o que pode torná-la insegura). Também aprendemos técnicas efetivas de criação de senhas que podem nos auxiliar bastante como usuários de múltiplos serviços e plataformas.

Gostou do conteúdo? Se quiser se adentrar mais nas tecnicidades da área de segurança da informação, que tal dar uma olhada em nossa [**Formação Segurança de Aplicações**], lá na **Alura**? 





imagem 

Estamos com uma rede que está [**dividindo os setores por VLans**]. Temos o setor de desenvolvimento e o setor de marketing, além de uma sala com um servidor que é utilizado pelos desenvolvedores:

imagem pelo `terminal`:

imagem.

Como cada setor está dividido em VLans, basta dizer para o roteador permitir apenas os tráfegos que tem como origem os endereços da **VLan** de desenvolvimento e como destino o servidor.

Ou seja, queremos que essa lista se estenda desde a origem do pacote, até o seu destino. Logo, queremos uma lista estendida (`extended`).

Mas como vamos identificar essa lista? Precisamos dar um nome para ela para facilitar sua identificação. No meu caso, vou dar o nome de `SERVIDOR-MARKETING`.

`ip access-list extended SERVIDOR-MARKETING`

imagem os pacotes da rede com o endereço `ip` `192.168.1.0`, no meu caso.

Essa rede utiliza a máscara de rede padrão (`255.255.255.0`). Ou seja, as partes fixas do endereço IP são `192.168.1`. Já que são essas partes que dizem que os computadores fazem parte da VLan Desenvolvimento. Nós os chamamos de **Wildcard bits**.

Os wildcard bits nos dizem qual parte do endereço pode variar. Neste caso, como estamos utilizando a máscara padrão, dizemos que apenas a última parte do endereço IP pode sofrer variação.

Quando uma parte do endereço não pode variar colocamos o valor `0`. Quando ela pode variar, colocamos um [**valor referente a máscara de rede**]. No nosso caso, este valor é `255`.

Dessa forma podemos falar para o roteador negar os endereços vindo da rede `192.168.1.0`, sendo que só a última parte pode variar `0.0.0.255`

`deny ip 192.168.1.0 0.0.0.255`

imagem que essa interface (ou sub-interface) faz parte, esse grupo é justamente o nome da nossa lista.

Logo, vamos dizer para o roteador que os endereços IPs (`ip`) dessa interface fazem parte do `access-group` `SERVIDOR-MARKETING`. Precisamos também dizer que esse grupo, vai analisar todos os pacotes que entrarem por essa interface (`in`).

`ip access-group SERVIDOR-MARKETING in`

imagem e dizemos para o roteador permitir (`permit`) os demais pacotes `ip` de qualquer origem (`any`) e qualquer destino (`any`).

![]

Pronto! Dessa forma a VLan marketing só fica bloqueada de acessar o servidor, mas pode acessar as demais máquinas na rede.

## Para saber mais

Esse foi apenas um exemplo de como utilizá-las, porém existem outros, como, por exemplo, bloquear os pacotes da [**camada de transporte**], como o TCP e o UDP, ou então bloquear uma porta específica.

Listas de acesso são muito utilizadas para controlar o tráfego nas redes. Em algumas provas de certificação da Cisco, elas são cobradas.

Aqui na **Alura** temos uma formação que te [**prepara para a certificação CCNA**]. Nele você verá todos os itens cobrados pela prova.

Se quiser estudar redes de computadores, mas não se preparando para uma prova, temos uma [** formação em redes**]. Nela você verá listas de acessos, aprenderá sobre como configurar VLans, como criar um servidor DHCP no roteador, além de técnicas de segurança da informação.




Vamos ter uma reunião aqui na Alura sobre novos cursos. Só que esquecemos o computador em um prédio que fica num bairro distante. A princípio, poderíamos buscá-lo, porém, perderemos muito tempo no trânsito fazendo com que a reunião não aconteça!

Será que tem alguma forma de acessarmos o computador remotamente?

Tanto o computador que temos aqui como o que esquecemo  operam no sistema operacional Linux, portanto, temos a capacidade de acessar diretamente um ao outro, de forma remota, por meio do [**SSH**].

# o que é o SSH?

SSH é o protocolo para o acesso remoto. Ele nos permite fazer uma conexão segura entre as nossas máquinas, acessando um **secure shell**.

Para acessar um computador utilizando o `ssh`, nós precisamos informar o usuário, `yuri`, e onde está a máquina que queremos acessar, usando o `@` e um endereço, como `192.168.0.10`.

Para isso é só abrir o terminal e digitar essas informações. O comando completo fica assim:

`ssh yuri@192.168.0.10`

O sistema vai te pedir uma senha, ou nem mesmo isso caso você tenha configurado um sistema de chave pública-privada para seu usuário.

imagem que facilitam e nos protegem de possíveis erros.] Mas, se for necessário esse tipo de acesso, **CUIDADO DOBRADO,** pois a chance de algo acontecer é grande**.**

## E no Android?

Supondo que nós estamos em uma situação em que precisamos acessar um servidor, mas não temos um computador por perto, como por exemplo, dentro de um ônibus.

Além do acesso via Windows ou Linux, temos alguns apps na Play Store que nos permitem acesso remoto também.

Para acessar um Linux por exemplo, temos o [**ConnectBot**]. É só informar o usuário, o host e a senha e temos uma conexão.

![]

Vale lembrar que acessar os servidores de forma remota tem seus riscos, como por exemplo, executar um comando sem querer e acontecer um problemão.

Também é importante se atentar ao consumo de dados, pois se você tentar usar algum recurso que exija algum tipo de transferência e não estiver em uma rede Wi-Fi, por exemplo, você pode consumir todos seus dados.

## Conclusão

Nesse post vimos como podemos acessar servidores Linux tanto com Windows, Linux ou Android. Além disso, vimos que esse tipo de acesso exige alguns cuidados, principalmente quando os servidores estão em produção.

Que tal aprender sobre servidores? Aqui na Alura, curso [**Windows Server**] no qual aborda desde a configuração inicial à configurações de privilégios e restrições para usuários.




Se eu tenho informações em 5 dimensões, eu consigo ver elas em 2d? Para responder essa pergunta, gosto da analogia da viagem. Se você foi para Tokyo e Paris, gostou muito das duas cidades e quando volta para o Brasil gostaria de compará-las. Você consegue ver Tokyo e Paris ao mesmo tempo, no Brasil?

Claro! É só olhar as fotos que tirou nas duas cidades. E para vê-las ao mesmo tempo, basta colocar as duas fotos lado a lado.

Mas aí você diz: Guilherme, você roubou, pois a foto diminuiu a experiência 3d da viagem em duas imagens 2d, perdendo informações. Claro, mas mesmo diminuindo em uma dimensão e perdendo informações, as fotos conseguem passar a mensagem que eu desejava visualizar: comparar as duas cidades/viagens - na verdade perdemos também a quarta dimensão, o tempo que passou durante a viagem.

Essa ideia de diminuir a dimensão de um conjunto de dados para poder visualizá-los em 2d (3d etc) pode ser alcançada no mundo dos dados através da análise deles. [**Um método estatístico para diminuir dimensões é o PCA, podendo ser usado não só para visualização, mas em outras situações importantes de análise também**].

Para usar o PCA existem diversas características importantes (como a escala dos dados nas diversas dimensões) portanto vamos ver um exemplo baseado em algo do mundo real?

Opa, mas que dado do mundo real tem mais de 2 ou 3 dimensões? Vamos pensar nos cursos que um aluno faz na Alura, seguindo o post e o código anterior sobre o assunto, eu sou capaz de gerar matrículas aleatórias em N cursos:

py

E gerar alunos que tenham mais matrículas numa categoria de cursos do que em outras categorias:

py 

E podemos gerar todos os alunos, de todas as categorias de uma vez só:

py 

Pronto, o código que me interessa é o que gera alunos que fazem cursos em 3 categorias. Teremos um grupo de alunos e alunas que faz mais programação, outro design, outro mobile. E plotamos como no post anterior:

py 

imagem e no plano em R^2 está aparecendo em (3,4)... juntamente com uma aluna que fez 3, 4, 15, 2 cursos. Que horror, visualmente ao descartar duas das quatro dimensões, perdemos muitas informações (óbvio):

imagem um número maior de dimensões, vamos mapear em 2 dimensões nossos alunos e alunas, e plotá-los:

py 

imagem com valores mais extremos, por isso seria interessante que todas as dimensões possuissem valores bem distribuídos. No nosso exemplo eles já tem valores máximos, mínimos e de distribuição próximas pois usamos distribuições normais para gerar nossos dados. 

Mas e se os dados estivessem em escalas distintas? Podemos "normalizar" os dados, e existem diversas maneiras de reescalar informações. Uma delas é diminuir todos os pontos pela média e dividir pelo desvio padrão. Isso faz com que todos os dados transformados estejam entre -1 e 1 - todos numa mesma escala. Em Python podemos fazer isso usando um `StandardScaler` e colocando junto com o `PCA`:

py 

O resultado é diferente mas a dimensão continua sendo 2 e temos a visualização e informações que buscávamos:

imagem e utilizá-los para mostrar como as 5 dimensões foram mapeadas em R^2:

py 

Por causa da natureza do PCA, como os eixos originais (direção) e suas influências (tamanho) são plotados indicam para onde eles foram parar no novo mapa (nosso plot). Quanto maior a correlação entre duas dimensões originais, mais dois eixos estariam alinhados.

imagem ou analisarmos os dados visualmente (uso exploratório).

Note que o objetivo dos posts não foi detectar agrupamentos (clustering), mas com certeza é mais fácil visualizar clusters num plot 2d do que num plot 5d (há!) até mesmo depois do processamento. Claro, se você é sortudo ou sortuda, e seus dados iniciais já eram em duas dimensões, maravilhas, mas se como no mundo real, o número de features e dimensões é bem maior, recorremos a métodos de redução de dimensão para analisar nossos dados.

[**Você pode encontrar todo o código da plotagem em 2d, 3d e PCA no github**]. Dentre [**alguns dos cursos existentes de Data Science e Machine Learning na Alura**], [**PCA pode ser utilizado no preparo e visualização dos dados**], além da diminuição de dimensões e escolha de features.





imagem 

Quando vamos começar a estudar programação, nos deparamos com diversas linguagens de programação. Qual delas devemos aprender primeiro?

Independente da linguagem de programação, todas elas têm ao menos uma coisa em comum: **a lógica**. Não importa a linguagem que escolhemos para começar, a lógica executada será a mesma. Claro, talvez os passos para realizar essas tarefas sejam diferentes, pois cada linguagem tem uma sintaxe diferente.

Em meio tantas linguagens de programação, uma [muito popular] é a [**linguagem C**]).

A linguagem C é uma das linguagens mais utilizadas nos dias de hoje, e serviu como base para diversas outras linguagens, como C++, C#, Java, PHP, Javascript, entre algumas outras. Mas como podemos escrever um programa em C?

## Olá, mundo! E algumas coisas a mais

Temos que começar a escrever nosso código que será o nosso programa em C. Para isso, podemos utilizar qualquer editor de textos. Precisamos falar para o computador que esse é um arquivo da linguagem C, para isso, colocamos a extensão `.c`:

imagem uma mensagem para a gente no vídeo:

c

Demos nossa instrução para o C. Falamos para ele imprimir um texto. O C pede que todo texto, também chamado de string, deve estar entre aspas duplas e toda instrução deve terminar com ponto e vírgula.

Esse código que escrevemos em C é um código legível por seres humanos. Isto é, uma pessoa consegue ler esse código sem muitos problemas. Contudo, o computador não entende essa linguagem.

Temos que transformar essa linguagem que nós escrevemos para uma linguagem que o computador consiga entender. Esse processo de transformação de um código de uma linguagem de programação em código de máquina é chamado de [**compilação**].

Quando compilamos um código, o compilador pega nosso código, neste caso escrito em C, e transforma para uma linguagem que a máquina entenda. Existem [**alguns compiladores disponíveis**], como estou utilizando um Linux, vou utilizar o [**GCC**], que já vem por padrão na maioria das distribuições.

`gcc ola-mundo.c`

imagem no nosso arquivo:

c 

Bacana, se tentarmos compilar nosso programa veremos o mesmo erro:

imagem. Essa função indica qual o ponto de entrada no programa. Como queremos que o nosso `printf` apareça quando o programa rodar, precisamos declará-lo dentro da função `main`. Mas como declaramos essa função?

## A função principal

Como todo programa em C tem a função `main`, o C padronizou o estilo que declaramos essa função. Basta colocarmos `int main() { … }` e pronto! Temos a função principal. Tudo que estiver entre as chaves (`{ }`) será executado linha a linha quando o programa começar:

c 

Agora podemos pedir para o GCC compilar nosso arquivo sem receber um erro:

imagem

## Para saber mais

O sinal de porcentagem que apareceu no final da frase, indica que naquele lugar acabou a string, isto é, acabou a frase que passamos para o `printf`. Como essa instrução não tinha uma quebra de linha, o meu \*\*terminal inseriu \*\*ela. Mas isso não é um comportamento padrão do programa.

O comum é que a linha não seja quebrada. Para colocar esse comportamento de quebra de linha como padrão, precisamos falar que no final da nossa frase, o `printf` imprima também uma linha nova (`\n`):

c 

Quando compilamos e rodamos o arquivo, veremos que o sinal de porcentagem sumiu, pois a quebra de linha está explícita agora:

imagem para o arquivo `ola-mundo.out`, por exemplo:

`gcc ola-mundo.c -o ola-mundo.out`

imagem`, falamos que a nossa função retorna um número inteiro. Contudo onde indicamos esse retorno?

Em alguns compiladores, quando nós compilássemos nosso código ele geraria um aviso (Warning) falando que a função `main` não tem valor de retorno. Isso não impediria o programa de rodar, mas não é considerada uma boa prática.

Ou seja, o legal é que a nossa função `main` retorne um número falando que sua execução ocorreu sem nenhum problema. Por convenção, este número é o `0`. Logo, podemos falar para a `main` retornar o número zero quando ela executar tudo que precisa:

c 

O C é uma linguagem muito utilizada até hoje. Ela tem uma capacidade de processamento muito alta.

Aqui na Alura, temos [**três cursos na linguagem**]. Em cada um deles você criará jogos que ajudarão a conhecer as funcionalidades da linguagem.

Também temos um [**curso sobre a linguagem C na Alura Start**]. Nele você também conhecerá as funcionalidades da linguagem. Além do curso de C, temos cursos que te mostrarão como utilizar os [**recursos da linguagem em desafíos da Olimpíada Brasileira de Informática**]. Nele você verá como utilizar o C para criar algoritmos e se preparar para a olimpíada.




Como nasceu o AngularJS e em qual versão estamos agora ?

O [**AngularJS**] surgiu dentro do Google em meados de 2008 meio que sem querer.

Um desenvolvedor chamado [**Misko Hevery**] precisava resolver um problema específico dentro de algumas aplicações e, depois de codar muito, olhou pro que ele tinha feito e pensou:

> "Olha só, acho que dá pra eu deixar isso um pouco mais genérico e liberar pra galera usar".

E assim nascia o **Angular**.

Por várias razões, este **framework** se tornou extremamente popular entre os desenvolvedores e ganhou muita força na comunidade e uma quantidade enorme de adeptos. Teve até muita gente que não precisava, mas mesmo assim construiu sua aplicação com Angular.

O tempo foi passando e o pessoal do Google viu que o monstrinho que eles tinham criado era muito legal, mas havia várias questões que poderiam ser melhoradas. Eles resolveram, então, criar um framework novo, o [**Angular 2**].

Foram lá e reescreveram tudo do zero! Tomando muito cuidado de não repetir os erros da primeira versão e fazendo tudo o melhor possível.

Quando essa segunda versão saiu, alguns devs ficaram um pouco chateados pensando:

> "poxa, mas eu estudei tanto a versão 1, agora vou ter que reaprender do zero?"

E eles ficaram ainda mais chocados quando, pouco tempo depois desta segunda versão sair, o **Google** vir de supetão anunciar o **Angular 4**!

> "Mas pera... Eles acabaram de lançar uma versão nova e logo em seguida lançaram outra? Tá meio estranho isso aí, não tá não?"

De início, pode parecer um pouco confuso sim. Mas no fim das contas é mais simples do que parece!

Pra desmistificar tudo isso aí, eu chamei a [**Vanessa Tonini**] pra um episódio do Alura Live!

A Vanessa é instrutora da **Caelum** e entre os cursos que ela dá, está o de Angular :)

Confira como foi o nosso papo:

![]

Gostou deste vídeo? Então não deixe de se [**inscrever em nosso canal no Youtube!**] 




Os verdadeiros gênios da informática muitas vezes ficam desconhecidos do grande público, mas sem o trabalho de programação deles, os sites e aplicações mais utilizadas do mundo seriam bem diferentes do que a gente conhece hoje, se é que existiriam. 

## Programação C

imagem e do C++ (criado por Bjarne Stroustrup) para desenvolver a linguagem que é base para o SDK e, como consequência, para muitos apps do Android.

## PHP

imagem, [**Rasmus Lerdorf**] é o criador da linguagem PHP, lançada no ano de 1994 e instalada no código de 82% de todos os sites existentes, de acordo com contagem da W3C.

Entre esses sites, se destacam Facebook, Twitter, Wikipédia e gigantes chineses, como Baidu e QQ.

## Python

imagem, da LISP (de John McCarthy) e da Perl (de Larry Wall), o holandês [**Guido van Rossum**] foi capaz de desenvolver a linguagem Python entre o fim da década de 80 e início de 90.

Focada na legibilidade do código, a Python já serviu de inspiração para a criação das linguagens JavaScript e Swift.

## Ruby

![]

Criada pelo japonês [**Yukihiro "Matz" Matsumoto**] em 1995, a Ruby foi planejada para ser uma linguagem de script. A ideia é que ela fosse mais orientada a objetos que a Python e mais poderosa que Perl, duas de suas inspirações.

Segundo o Índice Tiobe, a Ruby está entre as dez linguagens de programação mais populares do mundo.

## JavaScript

![]

Criada em 1995 pelo americano [**Brendan Eich**], a linguagem Javascript foi desenvolvida com o intuito de dinamizar determinados processos de páginas web, deixando seu uso mais agradável.

Após um ano de seu lançamento, a Microsoft utilizou a linguagem para seu navegador, a alçando a uma das tecnologias mais importantes e usadas na internet.

Além disso, também escrevi um post sobre [**5 passos para aprender a programar**], com dicas da minha experiência durante os estudos como programador.




Você está fora do mercado de trabalho e não sabe como procurar novas oportunidades? A primeira dica é se conscientizar sobre a importância de sempre está atento a novas oportunidades no mercado. Para isso, é recomendado fazer uma leitura de contexto e ter atitudes que condigam com seus objetivos e aspirações.

Mas como fazer uma **leitura do mercado com foco em oportunidades de trabalho**? Aguçar a sua percepção é uma orientação importante. É preciso perceber que buscar um emprego hoje é muito diferente de procurar uma recolocação nos anos 1990 ou até mesmo há cinco anos. As necessidades são outras, assim como as ferramentas de recolocação e as prioridades das empresas.

Confira algumas dicas que vão te ajudar a fazer uma leitura do mercado com foco em oportunidades de trabalho!

## **Saiba o lugar que você ocupa**

Você sabe exatamente o lugar que ocupa no mercado de trabalho atualmente? Não basta dizer que está sem emprego ou que ainda não sabe o que quer. É preciso ter essa consciência, mas isso é resultado de um processo de autoconhecimento.

Verifique se a sua **formação é sólida**, se as suas experiências anteriores te fizeram crescer, avalie o quanto você está disposto a aprender e se está preparado para competir de igual para igual com outros profissionais. Da mesma forma, se você ainda não acumulou experiências, saiba da importância dessas ações para ter visibilidade e despontar no mercado.

Quando você consegue perceber esses fatores, fica claro em que pontos você precisa se aperfeiçoar e quais são as suas características fortes e pontos de melhoria. Assim, você tem uma noção clara de quais oportunidades no mercado de trabalho são mais adequadas ao seu perfil. De repente, você pode estar tentando vagas voltadas a profissionais em nível pleno, mas o mais adequado no momento seria uma vaga de trainee, por exemplo.

## **Dê atenção às tendências**

O mercado tem dados sinais claros de que as vagas de trabalho têm passado por mudanças. Isso diz muito sobre as suas novas necessidades, e é preciso se adequar. Diversos profissionais estão aproveitando oportunidades para empreender e descobrir novas habilidades que podem levar a **caminhos inovadores**.

Em virtude dessas alterações, o movimento empreendedor tem crescido no país. As empresas têm adotado sistemas mais flexíveis, como trabalho via home office ou consultorias especializadas, em vez de terem profissionais alocados 100% do tempo. Outro mercado crescente são as empresas de base tecnológica, as famosas startups.

Os profissionais estão notando que o velho e bom emprego de carteira assinada não é tão bom assim e que há muitas outras formas interessantes de trabalho. É preciso acompanhar essas tendências e se qualificar para enfrentá-las.

## **Desenvolva habilidades**

As mudanças pelas quais o mercado de trabalho tem passado exigem que o profissional desenvolva novas habilidades. Já não bastam as capacidades técnicas, é preciso [**investir no desenvolvimento humano e gerencial**]. O cenário requer pessoas mais autônomas, capazes de desenvolver múltiplas tarefas ao mesmo tempo e que consigam lidar com cenários de instabilidade.

Os diplomas continuam sendo importantes, mas deixam de ser diferenciais. Saber novas[**linguagens de programação**] e usar diferentes ferramentas é um pré-requisito. Além disso, é importante saber se organizar frente a demandas diversas, estar preparado para tomar decisões rápidas e ter habilidade para gerir pessoas.

A capacidade de trabalhar com equipes e profissionais de diferentes áreas também é muito valorizada em tempos em que o trabalho colaborativo é uma máxima.

## **Nunca estanque a sede de conhecer**

O gosto pela aquisição de conhecimento é um dos requisitos muito avaliados pelas empresas nos dias de hoje. O profissional não pode estar satisfeito com seu repertório atual. É preciso demonstrar interesses em descobrir coisas novas a cada dia. Em tempos de internet, o conhecimento está mais democratizado, o que abre um leque de oportunidades para quem deseja se desenvolver.

Os autodidatas têm espaço garantido nesse meio. Conseguem aprender com vídeos, textos e múltiplas plataformas. Essa disposição para desvendar possibilidades é muito valorizada pelo mercado atual, pois demonstra persistência e dedicação. O e-learning contribui muito nesse quesito, já que é uma modalidade de ensino que ultrapassa as barreiras físicas e oferece opções que cabem no bolso.

## **Use as ferramentas disponíveis**

Não basta ter um bom currículo, é preciso exibi-lo em formato que favoreça suas habilidades e disponibilizá-lo em sites que façam a diferença. Dedique-se a atualizar o seu [LinkedIn,] preencha cadastros nas empresas de seu interesse e capriche no portfólio online. Ferramentas digitais como essas aumentam as possibilidades de contratação. É preciso separar um tempo para fazer e atualizar cadastros em sites especializados.

Outra estratégia interessante é participar de eventos da sua área. Fique atento às mídias sociais e participe de seminários, encontros e debates que contribuam para a sua atualização profissional. Nessas ocasiões, sempre é possível se atualizar sobre o que de mais moderno está sendo oferecido na área, além de também se poder encontrar possíveis empregadores ou clientes. Tenha sempre seu cartão de visitas em mãos!

## **Invista em network**

Você pode ser um profissional exemplar, ter uma boa formação e um ótimo perfil, mas uma boa indicação supera qualquer barreira. Ela não basta, mas abre muitos caminhos. Invista no network sempre. Isso pode te render participação em eventos, trabalhos importantes ou apenas te colocar no lugar certo na hora exata. E se você estiver começando a vida profissional, não se acanhe de pedir indicação aos seus professores!

Independentemente de você trabalhar em uma empresa ou abrir o próprio negócio, os contatos representam uma força importante nesse grande mundo das oportunidades de trabalho.

Para manter as relações sempre ativas, marque happy hours, participe de almoços, aproveite o horário de café para fazer ligações e atualizar as mídias sociais.

Produzir e compartilhar conteúdos relevantes nas mídias sociais também ajuda a mostrar o seu trabalho para a sua rede. Você não precisa emitir opinião sobre todos os temas que estão em debate, mas é essencial que saiba que eles estão acontecendo. Um profissional atualizado contribui para a empresa em que está inserido e se mantém crítico sobre as questões do mundo.

Como se pode perceber, para estar preparado para assumir oportunidades do mercado de trabalho atual, é preciso muita perspicácia e dedicação. Isso requer tempo, dedicação e mudança de hábitos. 





imagem 

O momento ideal de coletar os dados de usuário pode interferir muito na UX do seu app. Entenda como e em quais contextos podemos utilizá-lo.

No Aluroom, um aplicativo de e-commerce, foi implementada uma feature de login logo que o usuário abre o app:

![]

Nessa tela temos apenas duas opções: Fazer login ou criar uma conta. Isto é, não conseguimos entrar no app sem estar logados.

Só que, sem saber ainda do que se trata o app e o esquema de compras, muitos usuários podem deixar de dar continuidade à interação e desistir do app. Seria muito mais interessante para mim poder conhecer melhor o app antes de decidir me registrar e criar algum tipo de conta, certo?

Por outro lado, para a Aluroom seria um problema não ter o registro do usuário, por diversos motivos:

- Ao registrar-se, o usuário pode já inserir seu endereço e até uma forma de pagamento preferencial, como o cartão de crédito, por exemplo;
    
- Criando uma conta, podemos personalizar a experiência do usuário, guardando informações de buscas feitas anteriormente e oferecendo produtos já filtrados com os itens de interesse;
    
- Aproximamos o usuário de outros benefícios que a empresa pode oferecer especialmente a quem se cadastra.
    

Esses e outros benefícios podem ajudar muito tanto o usuário quanto a empresa.

Mas, então, como permitir ao usuário a possibilidade de conhecer e interagir com o app e ainda manter esse recurso de registro?

## Um test drive ao usuário

Se precisamos que o usuário ganhe interesse no app, nada melhor do que fazer uma espécie de "test drive".

Assim como quando vamos à uma loja e queremos visualizar o produto, manuseá-lo e verificar melhor sua qualidade, permitir ao usuário a chance de decidir por conta própria se curte ou não seu app é essencial.

Esse tipo de solução, quando falamos de UI Design Patterns, chama-se **Lazy Registration**, ou registro preguiçoso.

Quando utilizamos esse recurso, permitimos que o usuário interaja com o app e, em um momento oportuno, ou somente quando necessário, requisitamos um cadastro para que ele possa aproveitar as demais features do app.

No caso da Aluroom, o fluxo da interação ficaria mais ou menos assim:

> Tela de produtos > Produto selecionado > Tela de compra > Cadastro do usuário > Conclusão da compra

A primeira tela é já a de produtos oferecidos e só quando o usuário fecha o carrinho de compras e decide concluir a compra a tela de cadastro aparece.

> _"Mas e os aplicativos que ainda hoje forçam o registro ou login logo de início? Por que fazem isso?"_

De fato, existem alguns apps que ainda forçam o registro do usuário, porém existem diversos motivos para essa escolha.

## Analizando diferentes contextos

Alguns aplicativos, como o Facebook, Instagram e outros que pedem login ou registro logo na abertura do app, tem uma proposta um pouco diferente a oferecer ao usuário.

Se tratando especificamente desses dois apps, podemos analisar as principais features que apresentam e logo perceberemos que todo o funcionamento é baseado em uma conta de usuário.

Isto é, para conseguir visualizar algo na timeline, curtir, compartilhar, interagir, é necessário que o usuário crie uma rede de contatos que alimentarão o feed de notícias dele para todas essas interações acontecerem.

Nesse caso, faz todo sentido que se crie, logo de cara, um perfil de usuário.

Porém, existem também os casos em que, para simplificar o processo de registro, algumas empresas decidiram reaproveitar apenas as informações relevantes do usuário para alguma tarefa, diminuindo o tamanho desses formulários, como é o caso do [Shopify Pay].

![]

Nesse caso, o usuário insere apenas o e-mail e as informações de pagamento e envio para entrega, recebe um código via SMS para assegurar a compra e, num segundo momento, precisará apenas inserir o e-mail e o código recebido pelo SMS, encurtando o processo de compra.

Esse é um exemplo interessante para solucionar o problema recorrente que temos em formulários de cadastro longos e trabalhosos para o usuário.

## Dando liberdade aos usuários

Entendemos que alguns pontos são relevantes a considerar quando falamos de telas de registro, como, por exemplo, não limitar o usuário a experimentar o app antes de efetivamente concluir um cadastro.

Ainda assim, existem alguns contextos em que a implementação de um registro logo de início pode sugerir a grande necessidade dessa informação para a aplicação, bem como a redução dela a passos mais simplificados pode ser uma boa pedida para a UX em outros casos.

É sempre importante considerar os diversos tipos de contextos e intenções com as quais teremos de trabalhar, para então decidir se essa é uma boa escolha ou não.

Para diminuir o impacto desse tipo de decisão, precisamos pensar sempre em passar por todos os passos de prototipação e testes, acompanhando o dia a dia do produto no mercado para adequá-lo à melhor abordagem.

Na Alura temos um curso de [**UX Strategy**] apontando alguns pontos importantes no planejamento da sua aplicação, desde as definições iniciais até o [**MVP do produto**].




Quero gravar uma locução para um video de divulgação da Alura que vamos colocar no Youtube, nós ainda vamos inserir essa locução em um vídeo e em que vamos realizar uma compressão, isso no nosso software de edição no momento de exportar o vídeo como um todo.

Um dos grandes problemas que sempre enfrentava trabalhando com vídeo era entender qual a diferença entre diversos tipos de arquivos de audio que existe, alguns são maiores, outros menores mas me faltava o treinamento para entender qual tipo de arquivo utilizar em cada situação.

Então, para gravar esse audio estou utilizando o Adobe Audition. Quando apertei o botão vermelhinho de gravar dentro, do Adobe Audition ele me pediu para selecionar Sample Rate, Channels e Bit Depth

![image00]

Dei ok e fiz minha gravação. No fim da gravação selecionei a opção salvar e nesse momento apareceu uma janela pedindo que nós definissemos o tipo de arquivo.

![image01]

E aí, qual a melhor opção? O que precisamos nesse momento? Esse arquivo já está finalizado certo? Quando falamos em comprimir, pensamos em diminuir o tamanho, pode ser reorganizando informações ou jogando-as fora. 

Imagine, que seja salvo um arquivo comprimido que joga informações dessa locução fora e depois, no momento de exportar o video aconteça outra compressão e jogue fora mais alguns pedaços de todo esse arquivo, estou perdendo muitas informações importantes para um audio de qualidade. Pior seria se quisessemos, por alguma razão fazer uma edição neste audio antes de inseri-lo no video.

Neste momento o ideal seria salvar sem perda alguma, mas o que é um formato de audio sem perda? Qual formato podemos usar? Quando estamos falando em audio com sua maxima qualidade, o nome é exatamente esse sem perda , só que ingles **Loseless**.

Os arquivos Loseless mais utilizados são o **.WAV** e o **.AIFF**, eles não tem perda pois cada pequeno ponto utilizado para marcar a onda de audio é gravado, sem nenhum tipo de otimização.

Então, vamos escolher salvar em .AIFF. Essa minha primeira gravação, neste formato, ficou com 1.4MB tendo apenas 9 segundos é, o arquivo ficou bem grande... 1.4mb? Isso é tão pouquinho! Mas e se fizermos uma gravação um pouco maior?

Vou fazer uma segunda gravação, de uma pequena chamada de teste para um novo podcast que queria criar aqui no Alura, vou repetir o mesmo processo.

![image02]

No fim da gravação vou salvar e olha só 24mb para um arquivo de 2 minutos! Isso é muita coisa, principalmente se depois gravarmos um podcast de uma hora, imagina, quase 1gb em um arquivo de audio é muita coisa.

Os nossos ouvintes não vão conseguir baixar na 4G no carro. O ideal é que conseguissmos fazer um formato que tivesse uma boa qualidade, mas que tivesse um tamanho menor, mas não vou gravar assim, precisamos ter um original com qualidade que podemos editar a qualquer momento. Precisamos de um arquivo com menor qualidade quando terminarmos de editar todo o nosso audio.

Seria ideal ter um formato com perda, um **pouquinho de perda**, uma perdinha e o nome é esse mesmo, só que em inglês de novo **Lossy**. Os formatos Lossy mais utilizados são **.MP3** e **.WMV**. A caracteristica desses audios é que além do formato, você pode escolher a quantidade de informações que serão transmitidas por segundo, ou seja o **BitRate** e assim definir se você precisa de uma compressão maior ou menor, os Bitrate mais utilizados para .MP3 são **128kbps** e **320kbps**.

Será que nosso ouvinte vai notar a diferença entre o .MP3 com uma leve compressão e o .AIFF? Existem pesquisas indicando que uma pessoa comum, sem treinamento, não consegue notar a diferenças entre arquivos com compressão e arquivos sem perda. Isso acontece pois a mudança nesse audio é muito sutil. Então quer dizer que é inutil gravar arquivos Loseless?

**Na verdade não, quando se trata de gravações o ideal é gravar o primeiro arquivo com uma boa qualidade, pois sempre é possivel diminuir o tamanho depois, comprimir, descartar informações e fazer um arquivo menor, mas é impossivel recuperar informações que você descartou.**

Um bom audio é fundamental para um vídeo de qualidade, e com o arquivos certo de audio conseguimos extrair o maximo de qualidade de nossos recursos. Se você deseja aprender mais sobre edição de vídeo, motion graphics e edição de audios para video confira a [**Formação Edição de Vídeos**] da Alura.





imagem 

Apesar de parecer uma tarefa trivial, tentativas aparentemente simples e óbvias podem ter resultados inesperados, visto que listas, no Python, são objetos mutáveis. Mas o que significa tudo isso? 

Eu e meus amigos do clube de livros criamos um sistema em Python para organizar que livros cada um de nós tem.

Cada um tem sua própria lista, na qual os livros são divididos por categoria (no meu caso, **SQL**, **PHP** e **Front-end**). Cada categoria também é uma lista:

py

Recentemente, recebemos um participante novo do clube, Pedro, e ele decidiu comprar uma cópia de todos os livros que eu tinha:

py 

E agora a lista de livros do Pedro:

py 

Tudo certo!

Seguimos o clube e eu acabei adquirindo outro livro de uma categoria que eu ainda não tinha - **Games**:

py 

Agora olha como está minha lista:

py

Certo, como esperávamos! Acontece que o Pedro foi checar a lista de livros dele:

py 

Mas olha qual foi o resultado:

py 

Ué! Mas ele não tinha comprado o livro **Jogos iOS**! A lista dele ficou como a lista dos meus livros… Por que será?

## Listas são objetos mutáveis

Por que quando alteramos a minha lista, a lista do Pedro foi alterada junto? O que acontece é que não eram listas separadas, **eram a mesma lista**.

Quando atribuímos como valor de uma variável a referência de uma outra, o que estamos fazendo é apontar as duas variáveis, ou seja, os dois nomes, para o mesmo objeto na memória do computador. Podemos comprovar isso com nosso conhecido [**operador de identidade `is`**]:

py 

E o resultado:

py 

O mesmo acontece com qualquer outro tipo no Python, como strings:

py 

O resultado:

py 

E o que acontece se tentarmos alterar uma dessas variáveis?

py 

Olha o resultado:

py 

Só alterou a variável que pedimos para alterar! Mas ué, não era o mesmo objeto? **Era, mas deixou de ser quando fizemos essa alteração**. Olha só:

py 

E o resultado:

py 

Note que o identificador da variável `meu_nome` mudou assim que alteramos seu valor. Isso é porque **strings, assim como grande parte dos tipos nativos do Python, são imutáveis**.

> "_Mas como imutáveis, se acabamos de mudar o valor de uma string?_"

Apesar de parecer que alteramos a string, na verdade o que alteramos foi apenas a referência que era guardada no nome de variável `meu_nome`.

Não alteramos o objeto string original, porque **não podemos fazer isso**, mas criamos outro objeto string com valor `Yan Orestes` (ou `meu_nome + ‘ Orestes’`) e mudamos a referência em nossa variável. Por isso, o ID mudou.

Diferente das string, **listas são mutáveis**. Ou seja, podemos alterar um objeto lista mantendo ele no mesmo espaço na memória, em vez de termos de criar outro objeto para substituir a referência da variável.

Assim, quando usamos o método `clear()`, ainda estamos tratando do mesmo objeto lista com os dois identificadores:

py 

E o resultado:

py 

O identificador das duas variáveis se manteve o mesmo, pois continuamos tratamos do mesmo objeto mesmo depois de sua alteração. Como, então, podemos criar um segundo objeto lista igual a um já existente?

## Fazendo a cópia de uma lista

Os tipos sequenciais no Python, como as lista, nos disponibilizam uma técnica que pode nos ajudar em nosso objetivo - o fatiamento, ou _[**slicing**]_. O _slicing_ nos permite criar um **outro** objeto apenas com um pedaço desejado do objeto original.

A sintaxe do _slicing_ é parecida com a de uma indexação comum, mas com um `:` separando o primeiro elemento que queremos do último, **sendo o último descartado**. Com listas, podemos fazer algo como o seguinte:

py 

Assim, podemos ter uma cópia da lista em outro objeto:

py 

E os IDs:

py 

O Python ainda nos permite omitir o primeiro número do _slicing_ se quisermos pegar desde o começo, e o segundo se quisermos até o final, o que simplifica nosso código:

py 

E o resultado:

py 

Os mesmos da minha lista!

Agora vamos tentar adicionar uma categoria à minha lista de livros e ver se a do Pedro muda também:

py 

Dessa vez:

py 

Deu certo! Também podemos usar o método de lista `copy()`, que tem o mesmo comportamento:

py 

E continua funcionando da mesma maneira!

## O problema das cópias rasas

Todo o nosso sistema estava funcionando bem, até que eu consegui tirar a certificação PHP e decidi doar meu livro sobre o assunto para um amigo, criando a necessidade de remover esse livro de minha lista:

py 

E agora, minha lista:

py 

De novo, o Pedro foi checar a lista dele:

py 

E o resultado:

py 

O livro sumiu para ele também! Repare que nossas listas de livros ainda estão diferentes, mas quando eu removi um livro da categoria **PHP**, na lista dele também foi removido. O que acontece?

Quando usamos o método `.copy()` ou o _slicing_ para copiar uma lista, estamos fazendo uma **cópia rasa**, ou, tecnicamente, uma _[shallow copy]_.

Em uma lista, a cópia rasa vai criar outro objeto lista para armazenar os mesmos valores da primeira lista, **mas vai usar os mesmos objetos que a primeira lista em seu interior**, como indica a imagem:

imagem` ter criado um outro objeto lista para armazenar os valores, todos os elementos da lista `livros_yan` foram reutilizados.

Dessa forma, temos o mesmo problema do começo, já que listas são objetos mutáveis. Isso é o que limita as cópias rasas. Como podemos superar isso?

## Fazendo uma cópia profunda de uma lista

Em programação, ainda temos outro conceito de cópia, que se diferencia da cópia rasa - a **cópia profunda**, ou [**deep copy**].

Diferentemente da cópia rasa, ela não simplesmente insere as referências dos valores da lista original dentro a nova lista, mas também cria novos objetos para cada elemento, de fato separando uma lista da outra.

A imagem abaixo complementa a imagem anterior com esse novo conceito:

imagem]

Mas como podemos usar esta técnica no Python? Será que teremos que implementar nós mesmos uma função que faça isso recursivamente? Parece trabalhoso…

Por conta desse problema recorrente de objetos compostos, como nosso caso de listas que incluem outras listas, o Python já vem nativamente com uma solução em sua biblioteca padrão - com o módulo **[copy]**.

Dentro desse módulo, temos uma função específica para isso - a `deepcopy()`. Importando-a, seu uso é objetivo:

py 

Agora vamos tentar modificar a lista `livros_yan`:

py 

Dessa vez:

py

Certo! Agora sim funcionou exatamente como queríamos!

## Conclusão

Nesse artigo, pudemos entender a diferença de objetos mutáveis e imutáveis no Python, com exemplos usando listas. Vimos, então, uma forma de não nos atrapalharmos com isso com o método `copy()` ou o _slicing_ de lista.

Assim, aprendemos sobre **cópia rasa** e seus possíveis problemas para com objetos compostos, e como resolver isso com **cópias profundas**.

Agora sabemos quando basta uma cópia rasa, como em listas comuns, e quando precisamos de cópias profundas, como em listas que contêm outras listas.

E aí, gostou do conteúdo? Se quiser conhecer outras funcionalidades e peculiaridades de listas no Python, dê uma olhada em nossos artigos sobre [**adicionar novos elementos em uma lista**], [**ordenar uma lista**], [**compreensões de lista**] e [**outras ferramentas básicas desse tipo**].

Se quiser continuar estudando Python, temos alguns [**cursos na Alura sobre a linguagem**] para você seguir em frente com seu aprendizado!




 Em contraponto, a concorrência acirrada, os prazos apertados, a falta de rotina de trabalho e as dificuldades em organizar as tarefas por prioridade e prazos de entrega, deixam muitos profissionais com os nervos à flor da pele. O surgimento de ferramentas de trabalho remoto nos últimos anos trouxe não apenas fôlego renovado, mas muita organização para as empresas.

Uma evolução natural reuniu as funcionalidades de planilhas, timesheets, servidores e geradores de mensagens em dispositivos cada dia menores e mais eficazes. O resultado? Mais qualidade no trabalho, mais tempo para pensar, se planejar, trabalhar leads e prospects, gerando um portfólio mais rentável e fiel!

## Dropbox

**xCriar, compartilhar, colaborar. Conhecido e utilizado por muitos, o [Dropbox] permite salvar arquivos e imagens na nuvem, compartilhando com seus contatos, mesmo que algum deles não possua conta na plataforma.**

Independentemente do tamanho e natureza dos arquivos, sejam eles vídeos, imagens, textos ou qualquer outro tipo de arquivo, eles estarão seguros e protegidos contra qualquer descuido ou ação de terceiros.

Outra vantagem é que, assim que um contato realizar alguma alteração no arquivo compartilhado, todos os envolvidos conseguem acessar as atualizações, opinar, alterar novamente e seguir até o desfecho do trabalho em conjunto.

## Trello

Simples de usar, flexível, com um apelo visual e lúdico, o [Trello] lista as tarefas, os responsáveis, tudo em ordem de prioridade. Para os casos de tarefas compartilhadas, com fases bem definidas e responsáveis com interdependência no trabalho, o aplicativo sincroniza as informações e alterações, salvando na nuvem com a segurança e garantia já conhecidas.

O Trello é um dos mais populares dentre as ferramentas de trabalho remoto, pois permite otimizar tempo, seja trabalhando de forma isolada ou em equipe.

## Mindmeister

Excelente organizador de ideias, o [Mindmeister] cria mapas mentais, permitindo até mesmo um [**brainstorming**] entre os participantes. Seu apelo motiva a captura, o desenvolvimento e o compartilhamento visual de ideias, podendo transformar os mapas em slides lindos e dinâmicos em alguns segundos.

Se quiser, ainda é possível exportar os slides, anexar à apresentação em seu site ou transmitir ao vivo para equipe, pares, colaboradores e clientes que tenham atuação conjunta no projeto.

## Slack

Um software de comunicação entre equipes com suporte a diferentes canais, opções para conversas privadas e integração com outros serviços, internos ou externos. Esta definição já o credencia a estar entre os queridinhos do pessoal de design e desenvolvimento.

Falando de produtividade, o [Slack] permite integrações diversas, como com o Trello, por exemplo. Esta funcionalidade permite que você seja notificado sobre cards que mencionem seu nome ou tarefas com prazos que estejam perto de expirar. Esteja você envolvido em um time ou no trabalho de forma isolada, a comunicação é e sempre será vital.

## Skype

Já pensou uma ferramenta de mensagens, chamadas de voz ou com vídeo, sem custo? Estamos falando do [Skype], claro! Mas, além destas funcionalidades, ele permite compartilhamento de [telas], por exemplo, se precisar compartilhar uma apresentação ou animação, compartilhamento de arquivos diversos, chamadas de vídeo em grupo, e, por valores bem acessíveis, oferece alguns serviços de comunicação internacionais.

## Remember The Milk

O [Remember The Milk] tira a lista de afazeres de sua cabeça, transportando-a para um ambiente onde os lembretes surgem nos momentos certos, onde quer que você esteja e em qualquer um de seus dispositivos. Com a vantagem de que os lembretes não perdem a cola, não molham ou rasgam, nem sequer somem.

Com o aplicativo, a rotina, os compromissos e as anotações pessoais são organizados e gerenciados, deixando o [profissional] livre para seu objetivo principal: produzir e criar um portfólio melhor e maior.

Para freelancers que trabalham por conta própria, por exemplo, é uma excelente ferramenta que lembra a hora de ligar para aquele cliente, retornar uma solicitação de orçamento ou cuidar das tarefas mais simples que, quando deixam de ser feitas, podem trazer muito transtorno.

## Toggl

Levar suas "timesheets" a outro nível. Com esta proposta intrigante, o [Toggl] pode ser definido como um aplicativo de controle de horas efetivamente trabalhadas, permitindo criação de gráficos para melhor visualização de quais tarefas estão tomando mais ou menos tempo. Deixando que você compare se aquele determinado tipo de tarefa é compensador ou não.

Estas informações o ajudarão a definir preços e até mesmo qual tarefa é mais, ou menos, interessante. Como seu preço não é nada proibitivo pode ajudar indivíduos ou equipes a contabilizarem cada minuto de trabalho, facilitando a apresentação e a conferência de faturas de serviço. Se você está pensando em iniciar carreira em tecnologia, uma excelente pedida é conhecer as ferramentas disponíveis para começar à frente da concorrência.

## Zeplin

Uma plataforma colaborativa entre designers e [desenvolvedores], que não exige conhecimento de linguagens de programação, sendo suficiente um conhecimento básico para iniciar a operação? [Zeplin], é claro! Mas os benefícios continuam, a ferramenta oferece a oportunidade de reduzir a quase zero os erros na implementação do desenvolvedor.

Como ele faz isso? Entregando os dados de forma visual, otimizando assim o trabalho do desenvolvedor e melhorando a fidelidade do trabalho do [designer]. Estas funcionalidades contribuem para reduzir o tempo das reuniões de trabalho e os prazos de entrega.

Buscar [capacitação profissional em tecnologia] significa se integrar com o mundo virtual, mergulhando fundo nas funcionalidades e facilidades que este universo oferece. Uma particularidade deste mercado é que, contrariando a lei da gravidade, o mergulho é para cima, em direção à nuvem, e não para baixo.

Significa que, quanto mais você mergulhar, mais subirá nos níveis de conhecimento, pesquisa, aprendizado e compartilhamento. Considerando que estamos em uma aldeia global, estes aspectos terminarão te impulsionando, em um círculo virtuoso que contribuirá para sua evolução como pessoa e profissional.

Outro aspecto que não pode ser desconsiderado é a velocidade com que as coisas acontecem no mercado de tecnologia. Quando alguém pensa em começar algo, outra pessoa já pensou na mesma coisa do outro lado do mundo ou mesmo no apartamento ao lado. Logo, não dá pra esperar!




Sempre que escrevemos uma entidade utilizando **JPA**, precisamos definir qual a chave primária desta e geralmente, também colocamos uma estratégia para **geração das chaves**.

Por padrão, quando utilizamos somente a anotação **@GeneratedValue** sem passar nenhum argumento, a JPA utiliza a estratégia automática **(GenerationType.AUTO)**. Ou seja, a implementação da especificação escolherá uma estratégia para geração dos ids.

Por exemplo, utilizando o **Hibernate** como implementação da JPA, a estratégia AUTO escolherá o método de sequências **(sequence)** para o banco **Postgres**. Agora quando utilizamos o **MySQL**, qual estratégia esperamos?

Podemos pensar que ele usará o **AUTO_INCREMENT**, porém, a partir da versão 5 do Hibernate , a estratégia utilizada é a **TABLE** que já veremos como ela funciona. Mas já podemos falar que essa estratégia tem alguns problemas relacionados a performance.

A partir do Hibernate 5, toda vez que é utilizado o GenerationType.AUTO, ele tentará utilizar **sequences.** Caso não consiga, ele utilizará GenerationType.TABLE. Por não termos controle da estratégia de geração, muitas pessoas optam por não utilizar o GenerationType.AUTO.

Além disso, pelo fato de a partir da versão 5 o Hibernate colocar a estratégia TABLE como padrão, não é recomendado utilizar essa estratégia Mas qual o problema da GenerationType.TABLE?

# Conhecendo o GenerationType.TABLE

Essa é a estratégia que funciona em todos os **bancos de dados relacionais**, sendo compatível com todas as soluções do mercado, pois todos os bancos possuem tabelas. Parece perfeita, não? Então qual o problema com ela?

Quando utilizamos a **GenerationType.TABLE**, o Hibernate utilizará uma tabela para gerar as chaves primárias. Essa tabela pode ser global, servir para todas as entidades no banco, ou específica para uma entidade.

Podemos definir a tabela geradora pelo parâmetro generator da anotação @GeneratedValue e através da anotação **@TableGenerator** definir a tabela que será usada para gerar os ids:

java

O problema de utilizar a TABLE como estratégia está justamente no fato de precisarmos de uma tabela para ficar armazenando os próximos ids. Mas qual o problema de fato com isso?

O problema começa quando começamos a escalar a aplicação. O que acontece se duas entidades sejam persistidas ao mesmo tempo? Precisamos, sempre, fazer um lock pessimista da tabela que gera os ids. Não só isso, mas o que acontece se tivermos que usar outras instâncias do banco de dados? Como faremos com essa tabela?

Por coisas assim, a recomendação é nunca utilizar o GenerationType.TABLE, dado seus problemas com escalabilidade.

Como o GenerationType.AUTO usará o TABLE caso o banco de dados não suporte sequences (isso a partir do Hibernate 5), as pessoas preferem utilizar outras estratégias mais específicas como a GenerationType.SEQUENCE e GenerationType.IDENTITY

# Criando sequências com o GenerationType.SEQUENCE

Quando utilizamos o **GenerationType.SEQUENCE**, o Hibernate utilizará as **sequences** do banco de dados para gerar as **chaves primárias**. Da mesma forma que TABLE, podemos ter apenas uma sequence para todas as entidades, ou sequences específicas para cada tabela.

O bom de utilizar as sequences é que, pensando em performance, podemos utilizar o batch do **JDBC** na hora da inserção e atualização.

O problema de utilizar sequences é que nem todos os bancos de dados oferecem suporte a esse tipo de estratégia de geração. Portanto, utilizar essa estratégia aumenta um pouco o acoplamento com o banco utilizado (se bem que não é todo o dia que trocamos o banco de dados).

Podemos definir o gerador das sequências através da anotação **@SequenceGenerator** de uma forma parecida com a @TableGenerator.

java

Com essas anotações, será criada uma sequência chamada sequence_livro que será usada para popular os ids da entidade Livro. Além de sequences, podemos falar para o banco gerar os números da coluna id através da **estratégia Identity**.

# Conhecendo a estratégia Identity

A estratégia **GenerationType.IDENTITY** é, talvez, uma das mais utilizadas no mundo da JPA.

java

Vamos supor que estamos utilizando um banco de dados como o MySQL. Quando falamos que a estratégia de criação é a IDENTITY, o Hibernate utilizará como estratégia a geração AUTO_INCREMENT. Já, se o banco de dados for o Postgres, o Hibernate gerará uma coluna do tipo **SERIAL**.

Isto é, a cada nova inserção, uma chave primária será gerada para a entidade. Isso é um pouco menos performático para o Hibernate, pois ele utiliza a chave primária para gerenciar as entidades. Ou seja, neste caso, ele precisa fazer a inserção no banco imediatamente, não conseguindo usar técnicas como o JDBC batching.

# Para saber mais

Podemos usar o Hibernate para gerar **UUIDs** também. Dessa forma, caso algum de nossos modelos utilizem um UUID como chave primária, o Hibernate consegue gerá-la também.

Uma curiosidade sobre usar **ids sequenciais** é que isso pode trazer algumas informações na hora que estamos analisando os dados do banco. Por exemplo, um id com o número mais baixo significa que é um cadastro mais antigo, enquanto números altos é um id mais recente.

Aqui na Alura, temos uma [**formação Java**] onde vemos mais sobre JPA e Hibernate. Nessa formação, você verá como começar a utilizar a especificação, entenderá alguns conceitos como **EntityManager e LazyLoading**, aprenderá a fazer consultas com **JPQL**, relacionar entidades e muito mais.





imagem 

No aplicativo de uma loja de ecommerce tínhamos um processo de checkout - todo o processo desde a compra até o pagamento -, que seguia essa ideia:

> **_Coletar itens de compra > Realizar pagamento > Confirmação_**

Nesse fluxo pensamos apenas na lógica do processo:

> **_Escolher itens > Carrinho de compras > Informações de entrega e pagamento > Confirmação_**

A partir desse fluxo chegamos a essas telas:

imagem





imagem 

## Design de Experiência

Já há um tempo venho estudando _softwares_ de prototipagem para os apps que desenvolvo. Buscava um que englobasse o maior número de vantagens possíveis, sendo uma premissa a possibilidade de **compartilhamento simples e rápido** com a minha equipe, que trabalha remotamente, e _stakeholders_ de nossos projetos.

Uma grande vantagem seria se fosse, de preferência, **gratuito**.

Fazendo um levantamento das características positivas, negativas e recursos oferecidos por cada software analisado, minhas conclusões destacaram o **Adobe XD**.

> Seria ele o _software_ que melhor se adequaria ao trabalho que desenvolvo com a minha equipe?

Para chegar à esta conclusão me aprofundei ainda mais em analisar os pontos positivos do **Adobe Experience Design** (ou Adobe XD).

## Selo de qualidade Adobe

Com o selo de qualidade Adobe, que é um desenvolvedor de alta confiança com o qual já trabalho em outros programas como InDesign, Illustrator e Photoshop, que inclusive se comunicam com o XD, o software vem ganhando cada vez mais adeptos, que se dá tanto pelo bom desempenho relatado quanto pelo fato de estar sofrendo frequentes atualizações e prometer ainda mais melhorias.

> "Nós estaremos lançando novas versões do Adobe XD com frequência. Estaremos respondendo ao feedback que você compartilha com nossa equipe, para que todos tenham a oportunidade de nos ajudar a moldar o produto.

> Você pode ver os atuais recursos votados pela comunidade em ordem de prioridade em nosso [Adobe User Voice] e é bem-vindo para adicionar novas solicitações de recursos e votar nas existentes para influenciar o que trabalhamos enquanto desenvolvemos o Adobe XD."

_\- Adobe_

## Mapeando atualizações de melhoria

Fui pesquisar quais atualizações a Adobe promoveu para o XD no ano de 2019, que ainda está começando, e já são muitas as melhorias oferecidas:

**#1** Agora é possível **editar vetores no Illustrator** - copiando e colando, através do bom e velho Ctrl C + Ctrl V, e passar o conteúdo vetorial do XD para o Illustrator e do Illustrator para o XD sem que nenhum deles seja convertido em pixels, mantendo-se editáveis.

**#2** Ficou mais fácil **selecionar objetos de um grupo**. A forma antiga era dando um clique duplo para acessar os elementos do grupo e clicar no desejado: Agora é possível fazê-lo através de um atalho simples e além disso, selecionar múltiplos elementos de grupos diferentes.

**#3** Quando imagens do Photoshop e Illustrator são importadas, **seus objetos são automaticamente marcados para exportação**. Também tornou-se possível selecionar um objeto no _artboard_ e marcá-lo para exportação no Property Inspector ou utilizando o menu.

**#4** Tornou-se possível **ver em seu navegador as animações de gestos de arrastar** quando estiver visualizando seus protótipos e especificações de design.

**#5** Para testar a usabilidade de seu protótipo, agora é possível desativar os controles de navegação online e **criar um ambiente mais controlado para seus testes** com usuário, checando se ele pode realmente navegar por conta própria sem nenhum /problema. É uma atualização muito útil porque nestes testes busca-se checar se algo está confuso, esperando um feedback real. A nova atualização facilitou este processo onde é possível obter a informação que é realmente útil para o desenvolvedor do protótipo.

**#6** O software gerou **melhorias no gerenciamento de fontes**: caso a fonte que esteja utilizando esteja faltando, quando o arquivo XD for carregado não mostrará a mensagem indicando as fontes ausentes e sim verificar automaticamente se elas estão disponíveis no Adobe Fonts, ativando-as. A(s) fonte(s) que não estão disponíveis no Adobe Fonts estão mais fáceis de visualizar no documento, sendo possível a substituição em lote.

**#7** Agora o Adobe Experience Design **está mais integrado com o [Jira]**, uma ferramenta que permite o monitoramento de tarefas e acompanhamento de projetos garantindo o gerenciamento de todas as suas atividades em único lugar. O caminho do design até o desenvolvimento ficou mais curto: além do Jira Software Cloud, os designs do XD compartilhados no Jira Software Server e no Data Center podem ser acessados pelas equipes do projeto.

Além do que já oferece de novidade para o XD, a Adobe conta com seus usuários para identificar mais gargalos a serem melhorados:

> "Você pode ver os atuais recursos votados pela comunidade em ordem de prioridade em nosso [Adobe User Voice] e é bem-vindo para adicionar novas solicitações de recursos e votar nas existentes para influenciar o que trabalhamos enquanto desenvolvemos o Adobe XD."

_\- Adobe_

No Adobe User Voice mapeei também algumas futuras melhorias já garantidas pelo desenvolvedor que foram me comprovando que o Adobe XD pode ser sim o futuro do UX Design e uma excelente ferramenta para a minha equipe:

- Em breve será possível definir uma **área rolável (scroll) dentro de um _artboard_** sem que todo ele seja movimentado.
- Haverá um suporte de importação que permitirá **simular animações ou até vídeos** reproduzíveis na visualização interativa.

imagem será habilitada, conforme já funciona em outros softwares da Adobe.
- O Adobe XD oferecerá **efeitos interativos para Tap e Hover** em listas, botões e links que poderão ser exibidos durante apresentação para o cliente.

## Interface

Um ponto alto da minha análise sobre o Adobe Experience Design foi o fato dele possuir uma **interface minimalista**, _clean_ e mais organizada do que a maioria dos _softwares_ de prototipagem disponíveis no mercado (até mesmo se comparado com os outros programas da Adobe).

imagem do Adobe Experience Design nas etapas de alto nível abaixo para concluir o levantamento de pontos altos de seu uso para a minha equipe de desenvolvimento:

**Design:** crie elementos de layout, adicione artboards e importe recursos de outros aplicativos do mesmo desenvolvedor. Você também pode usar _plug-ins_ para automatizar as operações repetidas ou partes do fluxo de trabalho do designer que são tediosas, complexas ou repetitivas.

**Protótipo:** Selecione objetos ou artboards no seu design e crie interações entre diferentes artboards.

**Compartilhamento:** Uma vez que seu projeto esteja pronto para ser revisado, você pode compartilhar especificações de design e protótipo ou exportar o projeto ou ativos com as partes interessadas.

Em outubro de 2018 a Adobe ampliou a funcionalidade do software para fluxos de trabalho e integrações com a crescente coleção de _[plug-ins]_ criados pela comunidade de desenvolvedores da Adobe. Desde então é possível gerenciá-los com facilidade diretamente no aplicativo para automatizar funções, gerar integrações com outras ferramentas, criar designs com dados, entre outros.

## Conclusão

Ao longo da minha análise do Adobe XD já fui me convencendo que, de todos os _softwares_ disponíveis no mercado, este seria o mais adequado para as minhas necessidades. O programa já é excelente e promete ficar ainda melhor: quero estar em utilização para acompanhar todas as novidades que a Adobe promete para o XD!


Compreendendo o Adobe XD como uma poderosa ferramenta para o desenvolvimento de UX Design e apostando nela, a [**Alura**] já desenvolveu cursos e pretende lançar ainda mais, para que seus assinantes possam usufruir de todas os recursos e melhorias desta fantástica ferramenta.

- [**Adobe XD: Design visual de um site mobile**]
- [**Adobe XD: Componentes da interface**]
- [**Adobe XD: refinando o visual da interface**]
- [**Prototipagem e UX parte 1: Alta fidelidade com o Adobe XD**]
- [**Prototipagem e UX parte 2: linkando telas no Adobe XD**]




O [Bruno Lopes] mandou lá no [**fórum da Alura**] essa pergunta sobre usar ou não o Google Fonts.  Em especial tendo em vista as discussões sobre **Critical Path** que temos no [**curso avançado de Performance Web**].

## Considerações gerais sobre o load de fontes

A desvantagem do Google Fonts é que ele está em um hostname externo, o que vai exigir uma nova conexão extra (em geral 2, uma pro CSS e outra pras fontes mesmo).

E se você carrega as fontes com um `<link>` normal como a maioria das pessoas, isso é blocante. Sendo blocante, pode ser bem ruim colocar 2 hostnames externos no critical path da sua página (dá pra aliviar fazendo o `preconnect` do segundo hostname por exemplo, mas ainda é pouco).

## Vale a pena usar o Google Fonts?

A vantagem do Google Fonts é o potencial para a fonte já estar cacheada na máquina do usuário por causa de uma visita eventual anterior a outro site que use a mesma fonte que você. Mas, sei lá, é um tiro no escuro isso. Você não sabe direito como tá o cache do usuário, mas sabe com certeza que 2 conexões a mais no critical path são ruins.

Se for carregar fontes da forma tradicional com `@font-face` e sem as customizações que o Google Fonts permite, aí talvez compense **servir no seu próprio domínio**. Dá pra colocar o CSS do `@font-face` inline na página ou fazer um server push. Dá pra fazer `preload` dos arquivos das fontes. E tudo no mesmo hostname com prioridade máxima de entrega.

Você perde, claro, o cache global entre sites que o Google Fonts em teoria poderia te dar.

Agora, isso tudo pensando que a fonte foi carregada com CSS via `@font-face` e está bloqueando o Critical Path. Digo isso porque existem outras formas de carregamento mais lazy que não são tão ruins pra performance. Têm outros tradeoffs, como causar um **FOUT - Flash Of Unstyled Text**. Mas podem ser apropriadas.

Dependendo do nível que quiser se aprofundar nisso, recomendo fortemente [**esse artigo**] com estratégias de carregamento de Web Fonts.




Cada vez mais e mais desenvolvedores fazem parte do mercado de trabalho e muitos tem o objetivo de se destacar na carreira, mas ainda tem dúvidas de como chegar lá?

É muito comum encontrarmos profissionais que conhecem back-end profundamente e sabem todos os detalhes de como fazer uma integração multiplataforma através de mensageria assíncrona de forma eficaz. Ou então o profissional front-end que é craque em todas as nuâncias do CSS e design responsivo.

No entanto, quando esses dois tipos de profissionais precisam se conversar sobre a especialidade de um ou de outro, a conversa não flui. O profissional back-end não conhece de front-end e vice-versa. Quer adicionar mais uma pimenta aí nessa conversa? Inclua o DBA, que administra os bancos de dados.

Seria muito mais interessante se todos esses profissionais conhecem um a área de especialidade do outro, por exemplo, que o especialista de back-end tivesse conhecimento suficiente para trabalhar bem com banco de dados e com front-end.

É justamente isso que significa ser um desenvolvedor full-stack. Ter conhecimento de toda a pilha que envolve a área de desenvolvimento para que você possa colaborar em todas as áreas do projeto.

Cada vez mais esse tipo de profissional é requisitado pelas empresas [no brasil] e [no exterior] e geralmente com remunerações atrativas. Mas como conseguir chegar lá?

## O que devo aprender para ser um desenvolvedor full-stack?

O primeiro ponto que deve ficar claro para você é que não é necessário ser especialista em todas as áreas e todos os assuntos.

**Provavelmente haverá uma área que mais te atrai e nela terá mais conhecimentos, ou seja, você será especialista nessa área e as outras vertentes serão conhecimentos que te ajudarão no dia a dia, mas sem necessariamente ser especialista. Esse perfil de profissional é conhecido como [T-shaped].**

### 0) Controle de versão

O requisito básico para qualquer desenvolvedor é ter conhecimentos de pelo menos uma ferramentas de controle de versão. Atualmente as mais demandadas são o Git e o SVN e [aqui na Alura você consegue aprender Git de forma bem fácil].

### 1) Aprender programação front-end, HTML, CSS e JavaScript

Front-end não pode ser um trauma para você. Aprender o básico pode ser muito divertido e com certeza vai ser bastante proveitoso na sua carreira. Aprenda bem HTML, entenda as noções de posicionamento e as nuâncias do CSS, além de claro, conhecer os principais recursos do JavaScript para front-end. [**De quebra, aprenda também como funcionam os designs responsivos e como eles são feitos**].

### 2) Noções de Usabilidade

Quem nunca viu um desenvolvedor back-end que precisou colocar uma mensagem na tela e acabou fazendo isso através de um javascript com um `alert()` (não vou negar que eu já fiz muito isso) que fugia completamente do padrão e estragava toda a usabilidade da aplicação ou site.

[**Conhecer UX**] e saber o que pode ser feito e como aquela nova funcionalidade vai ser encarada pelo usuário final é fundamental para qualquer profissional full-stack. Isso vai ajudar a tomar decisões que tenham o usuário final como objetivo principal.

### 3) Aprenda desenvolvimento back-end

Aqui a gama de linguagens e opções é enorme. Para quem está vindo de aprender front-end, talvez seja o maior passo de todos.

Se você nunca teve contato com uma linguagem back-end, recomendo fortemente começar por linguagens em que a curva de aprendizado sejam mais tranquilas, como PHP e Ruby. Aqui na Alura temos as carreiras que te guiam a aprender [tanto PHP] [como Ruby].

Depois que se sentir confortável, você pode partir para novas linguagens e paradigmas, como Java e ASP.NET e depois se aprofundar.

### 4) Banco de dados

Sim, você vai precisar trabalhar com bancos de dados no dia a dia. E isso não significa apenas fazer selects básicos. Aprenda a realizar joins complexos, como fazer queries eficazes e que não exijam desnecessariamente do banco de dados também é fundamental no dia a dia. Além de conhecer como funciona os mecanismos de indexação disponíveis.

Você pode começar por aprender [MySQL], [Oracle], [PostgreSQL] ou qualquer outro servidor de banco de dados que seja o utilizado por você no seu atual ou futuro trabalho.

### 5) Mobile

Esse é um grande diferencial, dado que cada vez mais as empresas tem adotado as apps mobiles. Saber como funcionam e são estruturadas os aplicativos mobile para as principais plataformas também é um ponto importante.

Na maioria dos projetos, os aplicativos mobile se integram com um back-end, então esse conhecimento dos dois mundos pode ser um enorme diferencial para a sua carreira.

Você pode começar aprendendo [Android] ou [iOS], mas caso tenha mais familiaridade com HTML, CSS e JavaScript, pode optar também por aprender [Ionic ou Cordova], que através de um HTML, geram aplicativos para as principais plataformas mobile.

### 6) Infraestrutura, cloud e devops

Se você vem do mundo de front-end, é importante conhecer a infraestrutura, saber, por exemplo, que com HTTP2 você pode ter muito mais recursos legais para as suas páginas ficarem muito mais rápidas, entre outras coisas importantes e saber como configurar e disponibilizar tudo isso para o usuário final.

Já para quem vem do mundo back-end, montar um servidor de aplicação e preparar o terreno para o deploy é tarefa mais que comum nos projetos e que atualmente fica bastante a cargo dos desenvolvedores.

Entenda como funciona os diferentes tipos de serviços de cloud, como automatizar processos de montagem de ambientes e perca o medo de mexer na linha de comando e com certeza você terá muitos benefícios na sua carreira.

### 7) Bônus: conhecimento do negócio

Imagina o presidente da empresa chegando ao seu lado e perguntando: "Mas essa funcionalidade que você está fazendo, traz qual resultado para a empresa?".

Sua resposta poderia ficar apenas no aspecto técnico como "Estamos fazendo essa funcionalidade para saber desenvolver em Angular 2", o que provavelmente não faria os olhos do CEO brilhar, apesar de ser importante, claro.

Por outro lado, se a resposta fosse: "Essa funcionalidade é importante para diminuir o tempo o usuário espera para receber o atendimento. O legal é que depois dela no ar, a gente vai conseguir atender 20% mais pessoas, ou seja, muito mais clientes felizes com a gente."

Sempre tente entender o impacto do que você está fazendo no negócio como um todo. Desde a mais simples das funcionalidades, até a mais complexa, todas geram um valor para o negócio. Entender qual é esse valor é fundamental até para justificar o seu próprio trabalho.

## Como aprendo tudo isso?

Tenha em mente que você não precisa ser especialista em todos esses itens. Especialize-se em um desses pontos (se já não for) e, em seguida, comece a aprender os outros aspectos. Os principais desenvolvedores full-stack que conheço começaram sendo especialistas onde já trabalhavam e depois foram aos poucos aprendendo novas habilidades.

[O ponto importante aqui é fazer isso regularmente mantendo uma rotina de estudos!]

A grande vantagem de ser um desenvolvedor full-stack é ter desenvoltura para participar das diferentes fases do projeto, podendo se tornar até mesmo uma peça chave dentro dele, sendo aquela pessoa que tem um conhecimento especial sobre o projeto, que sabe de ponta a ponta como as peças se encaixam e claro, esse pode ser um diferencial importante para sua própria valorização como profissional.





Quando um container é removido todas as suas informações são perdidas. Será que existe algum meio de persistir as informações do container? Esse meio se chama volume e vamos ver como criá-los.

imagem 


## Criando nosso volume

Nós queremos criar uma cópia dos dados que estão no **container** para a nossa máquina. Caso o container venha a cair ou seja removido, podemos falar para ele onde está os dados. Dessa forma, nossas informações ficam salvas independente do estado do container.

Ou seja, queremos falar para o **Docker** criar um repositório de dados para os containers, ou, como é chamado **volume**.

Vamos falar para o `docker` que queremos criar um **volume** `volume create` chamado `dados-do-banco`, no meu caso:

`docker volume create dados-do-banco`

imagem:

`docker volume ls`

imagem do Docker.

Bacana, já temos um volume criado, mas como podemos atribuí-lo a um container?

## Referenciando um volume

Já temos o nosso volume criado, então, vamos falar para o `docker` rodar um container `container run`, chamado `db` (`--name db`), no meu caso, com o nosso volume (`-v`) `dados-do-banco` associado ao diretório do container que guarda as informações que desejamos salvar, `/var/lib/mysql`, neste caso:

`docker container run --name db -v dados-do-banco:/var/lib/mysql`

Dessa forma, estamos falando para o Docker criar um container e associar o diretório `/var/lib/mysql` ao volume `dados-do-banco`. Nossa aplicação precisa de uma senha para se logar no **banco de dados**, então vamos falar que este container, em seu **ambiente** (`-e`, environment), terá a senha `alura`:

python

Legal, agora basta falarmos qual é a imagem que criará nosso container, no nosso caso, é a imagem do **MySQL**:

python

imagem com um terminal interativo (`-ti`) no nosso container `bd` com o interpretador `/bin/bash`:

`docker container exec -it db /bin/bash`

imagem `root` e com a senha `-p` `alura`:

imagem um banco de dados (`database`) para fazer o nosso teste, no meu caso, vou chamar esse banco de dados de `loja`:

imagem `db` e em seguida falar para ele removê-lo (`container rm`):

`docker container stop db`

`docker container rm db`

imagem as bases de dados existentes (**databases**):

`show databases;`

imagem:

`docker volume rm dados-do-banco`

![]

Lembrando que para remover um volume, nenhum container pode estar utilizando-o.

O Docker ganhou muito espaço tanto no cenário de desenvolvimento quanto no de infra, isso porque ele vem com o objetivo de facilitar o desenvolvimento de aplicações.

Aqui na Alura, temos uma [**formação em DevOps**], nele você aprenderá tudo sobre o que é um container, como fazer eles se comunicarem, além de aprender como criar suas próprias **imagens** para personalizar seus container.





imagem 

Fui navegar pelo app da [Enjoei] e iniciei minhas buscas por um produto específico: fones de ouvido. Quando a tela de resultados abriu, haviam diversas opções desse mesmo produto.

imagem




Neste episódio do Alura Live recebi o **Giovanni Bassi**, que é Microsoft MVP, um dos grandes nomes por trás da Lambda3 e entusiasta do C#. Conversamos bastante sobre esta linguagem querida por muitos, falando desde seu nascimento até os dias atuais.

https://www.youtube.com/watch?v=eUl0mWTnL_A

Gostou deste vídeo? Então não deixe de se [inscrever em nosso canal no Youtube!].

Confira os cursos de C# na Alura:

[**C# I: Fundamentos da linguagem**]
 
[**C# II: Orientação a objetos**] 
  
[**C# III: Tópicos Avançados**] 
  
[**C# Brasil: Formate datas, cpf e números nacionais**] 
  
[**C#: Paralelismo no mundo real**]

[**NHibernate: Persistência de dados com C#**]

Aqui na **Alura** temos uma [**formção em certificação em C#**]





imagem 

O design editorial ocupa um importante espaço no mercado de trabalho dos profissionais gráficos. Ele é responsável pela construção visual de livros, jornais e revistas.

Uma área tão ampla e importante demanda [**profissionais atualizados**] e criativos para o desenvolvimento de projetos gráficos atraentes e eficientes. Se você é um designer ou pretende ser, pode ganhar muito com o mercado editorial.

## Faça as pesquisas necessárias

O 1º passo para desenvolver um design editorial eficiente é **conhecer o cliente** e o seu público-alvo e projetar para eles. Por isso, não tenha receio de fazer uma pesquisa detalhada.

Seja para um trabalho novo ou reestruturação de publicação já existente, é essencial fazer um briefing para entender as necessidades do cliente e da sua audiência.

Conhecer o perfil dos principais leitores, os seus interesses e os seus desejos facilita na hora de construir o projeto de design editorial.

## Acompanhe as tendências de design

Outro ponto importante é conhecer as [**tendências do mercado de design**]. Como em todos os setores, existem os ciclos de mudanças visuais.

Por mais que seja importante respeitar a identidade do cliente e as preferências do seu público, as tendências do momento devem ser consideradas. Afinal, elas darão um toque de atualidade e de modernidade ao material.

Por isso, não deixe de pesquisar o mercado e fique sempre atento às novidades do Brasil e do mundo. Quanto mais repertório visual você tiver, melhor será o resultado do seu projeto de design editorial.

## Crie uma hierarquia

Ao colocar a mão na massa e **iniciar o projeto de design editorial, um dos primeiros fatores a serem considerados é a hierarquia**. Isso significa entender que algumas partes do conteúdo são mais importantes do que outras e que, por isso, merecem destaque.

Essa definição será demonstrada por meio do tamanho das fontes, da organização das imagens e dos blocos de destaque. As áreas em evidência servem como pontos de atenção e guias para o olhar do leitor.

Esses cuidados devem ser aplicados tanto nos projetos impressos quanto nos [**materiais para web**].

## Tome cuidado com as fontes

O mercado disponibiliza uma variedade quase que infinita de fontes para os designers gráficos. Entretanto, nem todas são adequadas para o uso editorial.

É preciso considerar o volume de texto e procurar um tipo que facilite a leitura, deixando o visual leve e agradável. Nesses casos, as [**fontes serifadas**] costumam ser mais eficientes, especialmente em projetos impressos.

Já para as versões digitais, é possível considerar as fontes sem serifa para o corpo do texto.

A dica é simples: teste! Faça protótipos e visualize no navegador ou imprima, conforme o caso. Analise a qualidade e peça a opinião de outras pessoas.

Faça alterações até encontrar a fonte e o tamanho certo para deixar a leitura confortável e atrativa.

Além disso, é interessante respeitar as boas práticas de design e evitar o uso de mais de 2 fontes no projeto. O ideal é ter um tipo para os títulos e outro para o corpo. Isso ajuda a criar uma identidade visual para a publicação e transmitir o conteúdo com mais clareza.

## Preste atenção ao alinhamento

Os textos podem ser alinhados à esquerda, à direita, centralizados ou justificados. Não existe uma regra que diga o que é certo e o que é errado: tudo vai depender da necessidade do seu projeto de design editorial.

**O alinhamento justificado é o mais comum** e também o mais formal. Ele permite que as colunas fiquem bem separadas visualmente. O cuidado aqui deve ser o uso da hifenização correta para que não fiquem “buracos” na diagramação.

Apesar da opção justificada ser mais comum, cresce o uso de [**textos alinhados à esquerda**], especialmente para a web.

Você pode definir diferentes alinhamentos para áreas específicas. As caixas de destaque, por exemplo, podem se diferenciar com texto centralizado. O importante é manter o padrão estabelecido em toda a publicação.

## Garanta o bom espaçamento

Esse é mais um mantra do design gráfico: não tenha medo do espaço branco! Deixar uma área para o conteúdo “respirar” é essencial. Por isso, não caia na tentação de acumular muita coisa em uma só página.

É preciso respeitar o espaço entre as colunas, as linhas, assim como entre o texto e as imagens. São essas quebras visuais que garantem a clareza do conteúdo e ajudam a tornar a leitura mais agradável.

## Lance mão dos grids

Todos os detalhes de caixas de texto, tamanho das colunas e das imagens devem ser definidos em um [**grid**]. Ele é um esqueleto padrão da sua publicação e deve ser mantido em todo o projeto.

Você até pode apresentar algumas variações de número de colunas por páginas, por exemplo, mas isso deve se justificar por uma mudança importante no conteúdo.

Na construção do grid é que você vai prever os espaços livres, a área destinada às imagens, aos gráficos e aos textos. Por isso, tenha paciência e seja bastante detalhista nessa etapa.

Faça testes, na quantidade que for necessária, para garantir o melhor resultado.

## Invista em imagens

As imagens são componentes essenciais de qualquer publicação. Um bom projeto de design editorial conta, necessariamente, com belas fotos e gráficos.

Se o cliente não possui fotos próprias, é útil contar com um [**banco de imagens**]. Existem opções pagas e gratuitas — o importante é escolher o que mais se adapta à realidade do projeto.

Independentemente da maneira como as fotos chegam até você, a sua preocupação deve ir além do visual. As imagens precisam ter resolução adequada ao seu uso, seja ele impresso ou digital.

Poucas coisas são tão prejudiciais a um projeto de design editorial quanto imagens de baixa resolução, distorcidas ou mal tratadas. Por isso, o cuidado na etapa de manipulação e de fechamento de arquivos é essencial.

## Garanta uma exclusividade

Como falamos na 1ª dica, é importante que o projeto de design editorial seja adequado à identidade do cliente e às necessidades do público-alvo. Logo, fica fácil imaginar que copiar outra publicação não é nada interessante, certo?

**Invista em um projeto visual exclusivo**: é a melhor maneira de conseguir a diferenciação no mercado e o destaque entre os concorrentes. Mas isso não quer dizer que você precise de recursos totalmente inovadores em cada projeto.

Aposte nos elementos gráficos e nas cores para construir uma identidade única para o seu trabalho.

## Conheça as ferramentas para design editorial

Por fim, você precisa de conhecimento técnico para poder executar os conceitos de design definidos para o seu projeto. As ferramentas são o meio pelo qual todas as ideias são colocadas em prática.

Você pode, por exemplo, procurar por cursos para aumentar as suas [**habilidades no InDesign**]. Outra opção é investir no seu conhecimento de [**programas como o Photoshop**], que é uma ferramenta importante para garantir o melhor resultado no tratamento de imagens.

O mercado do design editorial é amplo e cheio de oportunidades. Se você deseja fazer parte dele com sucesso, não deixe de buscar sempre por atualização profissional.

E quando falamos em design editorial,[**uma poderosa ferramenta para utilizarmos na produção dessas peças é o famoso InDesign**], que conta dom diversos recursos focados especialmente para esta atividade de diagramação. ;)




Vamos ver **o que é necessário para desenvolver com o flutter e como criar uma primeira aplicação e entender o básico de tudo**.

Prefere conteúdo em vídeo? Então confere ai o **Alura+** que eu fiz sobre esse post :)

http://www.youtube.com/watch?v=xSC8j3gl7xM

> Se você ainda não entende direito o que é esse tal de flutter e quer entender onde ele se encaixa e como ele funciona, da uma olhada nesse outro post aqui: [Conhecendo o flutter e uma visão do desenvolvimento mobile]

## **Preparando o ambiente**

Vou aproveitar o comecinho aqui para adiantar que não iremos ver como instalar a ferramenta aqui, sugiro que você siga o passo a passo da sua plataforma conforme descrito na [**documentação**] super bem escrita do pessoal do flutter, a ideia aqui é vermos como começar na parte de código somente.

Na essência você também poderia ver esse conteúdo direto na documentação do [**Flutter no get started**], mas aqui nesse artigo eu tenho algumas dicas e uns probleminhas que peguei que podem acontecer :)

## **Começando o projeto com Flutter**

Após ter tudo instalado e configurado, rode um **`flutter --version`** em seu terminal para checar se está tudo certinho:

imagem

Feito isso, se tudo der certo, podemos ver nosso emulador surgindo

imagem**, que será executada como o ponto de entrada da nossa aplicação, ela é obrigatória no nosso arquivo **main.dart** pois é ela que será executada no bootstrap da nossa aplicação. 

Dentro dela vamos fazer uma chamada para a função **runApp()** que vem do pacote do flutter e é a responsável por chamar o ponto de entrada principal que vai servir de base para a estrutura da nossa aplicação e dentro dela passar um **widget** que veio do nosso import anterior chamado **MaterialApp()** com um atributo home com um outro widget inserindo um texto dentro, o código fica assim:

js

Salvamos isso no arquivo e … como visualizar? O flutter possui um recurso mega bacana chamado **Hot Reloading**, seguindo a mesma ideia do recurso famoso do **React Native** que preserva o state e nos ajuda a simular comportamentos de navegação complexos para testar bugs ou novas funcionalidades, então para ver as alterações basta abrir a aba do terminal onde seu projeto esta rodando e apertar a tecla “r”

imagem para facilitar algumas funcionalidades nas ferramentas.
- **android/ e ios/**: É a pasta que possui uma casca para gerar o APK/IPA dos aplicativos para que os mesmos sejam publicados nas lojas. Também permite que seja possível acessar comportamentos específicos das plataformas por meio dos Platform Channels 
- **build/**: É onde fica o build do nosso projeto em Dart, a linguagem que iremos conhecer em breve quando começarmos a alterar o arquivo da aplicação. Ela é gerada sempre que rodarmos o comando \`flutter run\`.
- **test/**: É a pasta onde podemos escrever testes para nossas aplicações, em próximos posts eu irei falar dela com mais calma com toda certeza :)
- **.gitignore**: Já vem configurado com alguns arquivos para serem ignorados na hora de fazer os commits com o git
- **.metadata**: É um arquivo usado pelo flutter para gerenciar alguns recursos internos e não devemos mexer nele manualmente. Inclusive ele possui uma mensagem dizendo exatamente isso, mas o mesmo sempre deve ser versionado junto com o projeto.
- **pubspec.yml**: É o arquivo onde podemos gerenciar as dependências de um projeto Dart (similar ao package.json do mundo JavaScript). Caso queira dar uma olhada sobre como instalar algo deixo o link da documentação ([https://flutter.dev/docs/development/packages-and-plugins/using-packages#package-versions])
- **.packages**: Esse arquivo faz um mapeamento de onde estão instaladas as bibliotecas do seu sistema para o sistema de imports do nosso projeto atual, ele é gerado automaticamente sempre que uma biblioteca nova é instalada
- **helloworld.iml**: É um arquivo criado para facilitar algumas integrações com o IntelliJ.
- **pubspeck.lock**: É um arquivo usado para gerenciar quais versões as libs das libs que você está usando estarão utilizando. Quando desenvolver algum pacote commit ele, quando criar um projeto pessoal não. [https://www.dartlang.org/guides/libraries/private-files#pubspeclock]
- **README.MD**: Aqui o arquivo não tem nada muito útil, você pode colocar nele suas primeiras impressões quando for subir seu projeto no github para todo mundo ver :P
- **lib/: **A pasta lib foi deixada por último porque é nela que vamos escrever o código da nossa primeira aplicação agora mesmo.

Deixarei [todo o código] que fizemos no github também, caso você queira só baixar e ver tudo rodando. Se você ficou perdido com algum código principalmente nessa etapa final fique tranquilo, em próximos posts irei falar mais sobre como a linguagem **Dart funciona**. No geral, ela é bem familiar com uma mistura de Java com JavaScript, ou um TypeScript da vida.

Se quiser começar agora, não perca tempo e da uma olhadinha na documentação: [dartlang] Recomendo ter uma familiaridade trabalhando com [linguagens Orientadas a Objeto], vai ajudar bastante a entender os conceitos. Veja mais no início do curso de [flutter].

Por hoje é isso, vejo você no próximo post, Espero que tenha gostado do post, em breve trarei mais dicas, não deixe de [me seguir nas minhas redes sociais] e acompanhar meus outros posts em meu site pessoal [https://mariosouto.com] até mais.

## **Referências**

- [https://medium.com/@dev.n/a-flutter-project-has-always-had-ios-and-android-folders-to-create-ipa-apk-files-for-the-respective-aad215470e46]
- [https://flutter.dev/docs/development/ui/layout]
- [https://flutter.dev/docs/development/ui/widgets]
- [https://flutter.dev/docs/get-started/codelab]




O **Growth Hacking** é um conjunto de técnicas com  **foco em experimento**. Se acordo com Sean Willis, que cunhou o termo, é simplesmente **marketing orientado a experimentos**. Encontrar oportunidades rápidas que possam trazer ganhos, mesmo que pequenos. O ideal é que esse ganho seja sustentável, o que muitas vezes não acontece.


As estratégias mais comuns estão relacionadas realizar pequenos experimentos, por meio de mudanças em partes isoladas da interface ou produto, pequenas campanhas específicas em mídia paga ou redes sociais, sempre com objetivo de que os usuários engajem mais, comprem mais, cliquem mais. 

Para isso, é fundamental encontrar um processo que seja fácil priorizar e documentar todos os possíveis testes de Growth, como é feito, por exemplo, no [ICE score].

As histórias mais impactantes costumam contar que uma simples troca de cor de botão gerou um aumento incrível de vendas, mas esse não é o caso comum.  Passamos por vários cases no  nosso [curso de Growth Hacking: crescimento para negócios digitais] e queremos mostrar rapidamente um caso de exemplo:

# Caso de exemplo: clube de assinatura

Vamos considerar um clube de assinatura de chocolates, no qual todos os assinantes recebem todo mês em suas casas uma seleção dos mais diversos chocolates.

Como é uma empresa que quer aumentar o interesse do público nesse segmento, eles decidiram que o primeiro mês da assinatura seria gratuito, para que as pessoas possam testar. Depois, o plano é renovado e os consumidores começam a pagar uma quantia mensal pelo serviço.

Após um ano de empresa, o número de pessoas que realmente continuavam com o plano foi diminuindo. De cada 20 pessoas que experimentaram o clube, cinco cancelavam. Alguns meses depois de feita a assinatura, de cada 20 pessoas, apenas sete continuavam com o clube.

Mas por que será que isso aconteceu?

# Foco nos dados

A empresa começou a pensar em técnicas que buscassem analisar, com dados, quais novas estratégias podem ser feitas, por meio de pequenas mudanças na interface e no produto. Com isso, querem aumentar o número de clientes que assinam o clube e diminuir a taxa de cancelamentos (**churn rate**) após o período de teste.

# Foco no usuário

E como sabemos quais experimentos fazer? Que tal começarmos a fazer experimentos relacionados a algo que possa agradar o cliente?

Então, antes de fazer qualquer experimento, focaram no que o usuário busca. Para saber isso, eles **realizaram pesquisas**, **observaram dados** e **analisaram o comportamento dos seus clientes** no site do clube e nas redes sociais, como:

- No que clicaram;
- O que liam;
- Para onde iam depois de acessar determinada página;
- Número de adesões ao clube;
- As pessoas que continuavam e as que desistiam.

Uma ferramenta que pode ser utilizada, e que foi empregada nesse projeto, para medir o comportamento dos clientes é o [**Hotjar**]. Ela é possui uma versão gratuita, que é limitada, mas permite visualizar onde eles clicam no site, os locais do site onde ficam com o mouse em cima por mais tempo e a porcentagem de pessoas que leram além da primeira parte do site, ou seja, que rolaram para ver um conteúdo mais abaixo.

Em suas pesquisas, **observaram que os usuários não clicavam na chamada** que os convidada a continuar com o plano de assinaturas logo após o fim do período de teste.

# Experimentação: testes pequenos e variáveis isoladas

Então, o clube de assinatura decidiu fazer pequenos experimentos em tudo que o cerca. Desde as redes sociais, com as quais se comunicam com os clientes e lead, o site, no qual a pessoa começa a assinar, até a plataforma de assinantes.

Esses experimentos serão **pequenas mudanças** em algum desses canais, para analisar qual trouxe mais adesão depois de modificado.

Para fazer esses experimentos, a empresa determinou um **problema específico** que estava repelindo os clientes e decidiu realizar o experimento sobre ele.

Um dos problemas identificados foi a [**call to action**] para assinar o clube, após o primeiro mês gratuito, na plataforma de assinantes, que não estava sendo clicada pelas pessoas. Analisando, perceberam que ficava difícil de ler com o background colocado no site.

imagem acerca dele, com os testes ocorrendo um de cada vez, sempre analisando os resultados dessa modificação depois.

Primeiro, alteraram a cor do título e analisaram o resultado dessa mudança, para então, testar colocar um filtro para deixar a imagem de fundo mais escura e analisar novamente seus resultados. Tudo isso com o objetivo de melhorar a chamada, o que se provou ser o que impedia que os clientes continuassem com a assinatura.

Também realizaram um teste nas redes sociais, analisando o horário em que as pessoas mais acessam e mudando o horário de publicação. Depois, analisaram quantas foram atingidas e como reagiram a ela.

![]

A partir do dia 8 de março, que foi quando começaram a agendar as publicações de acordo com os horários em que os usuários utilizavam o Facebook, o alcance aumentou e se manteve estável em valores altos e as publicações também passaram a ter mais envolvimento do público, reagindo, comentando ou compartilhando a publicação.

Essa estratégia representa uma das características do Growth Hacking, a **experimentação**, que considera **testes pequenos e variáveis isoladas**.






imagem 

Na editora em que trabalho, depois de [**definirmos qual conteúdo**] iremos compartilhar com os clientes, [**por quais canais**] iríamos publicar essas informações e [**qual linguagem**] usaremos com nossos clientes, começamos a criar o conteúdo e publicá-lo.

Definimos que é bom termos uma periodicidade, ou seja, uma frequência determinada de postagens, desde o início de nosso marketing de conteúdo. Dessa forma, sempre publicamos informações para os nossos clientes para que eles saibam que poderemos ajudar quando eles precisarem.

Montamos um cronograma, a partir de informações disponibilizadas no Instagram e no **Facebook** e de uma pesquisa realizada com os nossos clientes sobre o horário no qual eles mais mexem nas redes sociais.

Dessa forma, determinamos o que deveria ser publicado em cada dia da semana e em qual horário, enquanto criamos novos conteúdos.

Haveriam posts todos os dias em todas as redes sociais e o tema das publicações mudaria a cada semana - como curiosidades, novidades e perguntas.

- Duas vezes por semana serem publicados posts no blog sobre novidades ou curiosidades de um livro;
- Duas vezes por mês, posts de entrevistas com os autores e resenha de uma pessoa externa.

Por fim, uma vez por semana seria publicado um vídeo no Youtube e uma vez por mês seria disponibilizado o episódio do podcast.

Colocamos essas informações em uma planilha e ficou assim:

imagem, separando cada um para um canal da editora, e em cada um desses quadros adicionamos todo o nosso time.

Em cada quadro, organizamos em várias colunas os posts que estão sendo feitos, sendo cada coluna um momento do post, como escrita, revisão, finalizado, agendado e o que já tinha sido publicado.

Também, fizemos um quadro geral onde criamos uma coluna para cada pessoa, nas quais foram colocadas as tarefas a serem feitas por ela ou tarefa que deve ser feita, por meio de cartões (_cards_).

Cada cartão pode possuir um nome, uma descrição, anexar arquivos e links, além de permitir definir uma data e horário limite para a finalização da ação que está naquele cartão, além de outras funcionalidades.

Além disso, é possível mover os cartões pelas colunas, para determinar em qual fase a tarefa está.

Podemos também adicionar membros aos cartões sendo fácil a visualização de quem é o responsável por determinada atividade

Podemos estruturar e utilizar da maneira que quisermos, de forma que todos entendam e consigam se organizar. Pensamos em utilizá-lo criando um quadro para cada canal, incluindo para cada rede social.

![]

O **Trello** é uma aplicação gratuita mas pode também ser paga, depende do tipo de funcionalidade a mais que você possa precisar.

Aqui na Alura, para os posts do blog, também usamos o Trello para organizar quais estão em desenvolvimento, quais estão na revisão, quais foram finalizados, agendados e publicados.

Caso queira saber mais sobre as funcionalidades do Trello, leia [**este post do blog da Caelum**] ou então [**essa Alura Live sobre como usar Kanban**] para organizar os quadros da sua equipe.

## 2 [Google Calendar]

A segunda ferramenta que escolhemos foi o Google Calendar, que já usávamos individualmente, para criar eventos, convidando outras pessoas, que nos são lembrados por e-mail e por notificação no celular.

Assim, começamos a criar eventos para as datas limites de cada tarefa e para quando alguma publicação deveria ir ao ar. Também, passamos a criar eventos para reuniões. Em todos eles, todas as pessoas da equipe são convidadas por meio de seus e-mails.

Essa ferramenta traz a possibilidade de visualizar o dia, a semana e o mês, e quais tarefas irão acontecer naquele período, permitindo uma visão a curto e longo prazo de tudo que deve ser feito.

![]

## 3 [Quire]

Quando pesquisamos por ferramentas para planejamento, descobrimos o Quire. Na página inicial da conta é possível observar uma lista de tarefas que devem ser feitas, de forma geral, sem serem separadas. E, quando finalizadas, podem ser marcadas como finalizadas.

Em cada tarefa adicionamos o responsável, prioridade e data final. Por conta disso, passamos a utilizar como uma forma de visualizar todas as tarefas a serem feitas, em todos os canais e em todas as fases. Assim, podíamos ver qual tinha que ser realizada primeiro e por quem.

![]

Assim como o Trello, ela permite a criação de quadros. Cada quadro já vem com três colunas: "Para fazer", “Em Progresso” e “Concluída”, seguindo o modelo do Kanban, que [**você pode aprender nesse curso da Alura**].

## Planejamento nas ferramentas

Gostamos das três ferramentas, e agora, qual delas iremos utilizar? Ou podemos usar todas?

Para resolver essa dúvida, primeiro utilizamos cada uma em um mês. No próximo mês, usamos as três ferramentas em conjuntos e deu super certo! Como cada uma tem uma funcionalidade mais específica, em cada uma delas temos uma noção diferente das tarefas que temos que realizar.

No Trello ficaria para tarefas mais gerais, como por exemplo fazer uma postagem sobre um conteúdo específico.

O Quire foi utilizado para tarefas mais detalhadas, como o que deveria ser feito para que a tarefa geral fosse realizada.

E o Google Calendar usamos para lembretes e avisos de quando as postagens deveriam ser feitas e marcar nossas reuniões.

Todos os meses, colocamos todas as etapas do processo de criação do conteúdo:

- planejamento;
- pesquisa;
- criação;
- revisão;
- edição
- e publicação.

Depois do mês que usamos as três ferramentas, percebemos que nossa produção e publicações de conteúdo aumentaram consideravelmente, o que acabou por aumentar também o engajamento nas nossas redes sociais e cada vez mais pessoas nos seguiam e interagiam com nossos perfis.

Após vários meses de postagens constantes e seguindo o cronograma, a venda dos nossos livros cresceu 5%.

Por fim, concluímos que a periodicidade para a publicação de conteúdo é muito importante porque, sem um intervalo definido ou postagens recentes, as pessoas perdem o interesse e param de acompanhar.

E a organização e visualização desse intervalo, assim como o planejamento de postagens só foi possível utilizando essas três ferramentas. E você pode utilizá-las em conjunto ou experimentar como se sai usando só uma.

Se quiser descobrir outras ferramentas que podem ser usadas pro marketing de conteúdo, assista [**nosso curso de Marketing de Conteúdo**].





imagem 

Muita gente tem um bom senso estético e produz boas composições naturalmente. Outras pessoas talvez não tenham tanta familiaridade com trabalhos criativos e não entendam completamente como um designer realiza suas composições com tanta naturalidade. É claro que a experiência conta: conhecimento em softwares de criação, prática de desenho, fotografia, vídeo, atuação profissional, etc. Mas o assunto que tratarei neste post é a **Teoria de Percepção da Forma** – a **Gestalt**.

Essa teoria da psicologia explica como definimos a forma, apresenta princípios (ou leis) de composições visuais e também descreve as propriedades da nossa percepção. Portanto, a Gestalt é um dos principais recursos para justificar as composições visuais e também para identificar questões que podem ser corrigidas ou melhoradas em uma criação.

O que é “forma”? É o estado físico em que se apresenta um corpo, um objeto. Mas como se define “forma”? Christian von Ehrenfels propôs pela primeira vez em 1890, na Universidade de Graz (Áustria), os conceitos de Supersoma e Transponibilidade, a fim de defini-la.

![supersoma]

Supersoma é o conceito de que não se pode ter ideia do “todo” somente pelas partes que o constituem. Já Transponibilidade é o conceito de que identificamos as formas independentemente das suas características e peculiaridades: uma mesa é uma mesa, não importa se é de vidro, madeira, metal, retangular, redonda – é uma mesa. Então, temos os meios para definir o que é forma.

![transponibilidade]

**A partir dessa definição de forma, Max Wertheimer, Wolfgang Köhler e Kurt Koffka desenvolveram a Teoria Gestaltista com uma série de princípios, também chamados de leis, que serviriam para justificar, corrigir, melhorar e gerar composições visuais. As leis definem questões que muitas vezes parecem óbvias, mas na verdade não são tão simples assim. A explicação de espaçarmos, aproximarmos, diferenciarmos ou atribuirmos características semelhantes e distribuirmos os elementos uniformemente em uma composição está em cada uma das Leis da Gestalt. Ao respeitá-las, temos certeza da realização de uma boa composição.**

A Gestalt também define as propriedades da nossa percepção, que são as diferentes características da nossa interpretação das formas. De acordo com a propriedade da Invariância, identificamos a forma independentemente da sua posição, rotação, disposição e distorção – conseguimos identificá-la sob diferentes condições. Existem mais propriedades que servem para explicar outras situações: por que só identificamos as formas sob determinada distância, por que uma forma pode transmitir diferentes informações e ideias, ou por que identificamos a forma em espaços de uma composição que não estão preenchidos.

Este é um assunto fundamental para arquitetos, artistas plásticos, estilistas, publicitários, designers e qualquer outro profissional que trabalhe com a criação de composições. A Gestalt define o que é forma; suas leis orientam a criação e possibilitam que o profissional justifique seu trabalho com argumentação e embasamento; e a noção das propriedades da percepção permite desenvolver trabalhos que possuam informações não tão óbvias, múltiplas informações ou significados implícitos.

**Quer saber mais sobre a Gestalt? Acesse meu curso no Alura: [Gestalt: desmistificando o Design]**


 

Quando estamos trabalhando em um projeto de interface, depois de entender e estudar nosso problema/ideia, chega um momento que precisamos materializar as nossas soluções. 

No mercado, se percebe (não é regra) o hábito de ir direto para os wireframes de alta fidelidade. Não chega a ser um problema, mas há outros caminhos e um deles é começar a desenhar em papel. 

A vantagem de desenhar em papel é que, além de ser mais rápido, “rabiscar” no papel também possibilita que todos da equipe (não apenas designers) possam contribuir e compartilhar suas ideias e ajudar a conceber a solução, evitando retrabalhos e idas e vindas em um wireframe de alta fidelidade. Uma técnica que busca juntar a informalidade e rapidez do rabiscoframe com um geração de ideias é chamada [8 steps] (ou crazy eights).

**8 Steps ou Crazy Eights** é uma técnica adaptada do [gamestorming] que se chama [“6-8-5”]. Essa técnica ganhou fama através do *Design Sprint* (processo criado pela Google Ventures para responder questões críticas de negócios através de design, prototipagem e teste das ideias), pois nele o 8 steps foi adotado como o ponta pé inicial do processo de materializar ideias sobre um produto no papel.

> ### A ideia do 8 steps é ajudar o time a sair da sua zona de conforto e das ideias mais óbvias. 

Naturalmente, temos uma forte tendência a ficar com as primeiras ideias que temos, ao invés, de tomar um tempo para explorar abordagens complementares. Essa técnica é projetada justamente para combater esse padrão, pois ajuda o time a gerar muitas ideias, sem se preocupar com os detalhes ou implementação de qualquer ideia em particular. 

Além disso, essa técnica também funciona como um bom exercício de aquecimento para levar o time envolvido a pensar visualmente e tomar consciência do poder do pensamento visual para representar informações.

Embora você vai estar gerando ideias, não pense nisso como o brainstorming, pelo menos não do tipo que todo mundo está conversando e interagindo. Em vez disso, em um primeiro momento, todos da equipe estarão trabalhando silenciosamente e individualmente, muitas vezes em torno da mesma mesa.

> ### Basicamente, cada indivíduo do time é convidado a esboçar 8 ideias em 5 minutos. 

Sim, se você já fez as contas, isso é cerca de 40 segundos por esboço, o que é um pouco “crazy“, mas ao mesmo tempo é uma ótima maneira de “obrigar” você a desligar a auto-edição e apenas colocar suas ideias no papel. 

Vale destacar também, que não é um storyboard ou um fluxo de navegação, as ideias não precisam estar em sequencia ou contar uma narrativa coesa. Na verdade, o foco é gerar 8 ideias totalmente diferentes, de forma rápida e visual para o seu produto/ideia. 

Você pode estar se perguntando? E se eu não tiver 8 ideias? Se isso acontecer e você se sentir preso, tente repetir um dos esboços anteriores com uma pequena variação, esse tipo de exploração é útil e mantêm você em movimento. 

Com o tempo e prática, você percebe que você estará mais relaxado e automaticamente se torna mais produtivo em dinâmicas como essa, apenas deixando fluir suas ideias.

imagem

Aqui no [curso de UX da Caelum], trabalhamos com dois tipos de gamestorming para 8 steps. O primeiro, conhecido por “Momentos chaves”, é indicado para quando estamos em um processo muito inicial do nosso produto/ideia e ainda estamos buscando entender nosso problema. Entenda que por “momentos-chave”, estamos nos referindo as diferentes experiências possíveis e interações que o usuário tem com o software. 

Um momento pode ser uma tela propriamente dita, ou uma interação (o usuário vai clicar, vai dar zoom, vai deslizar o dedo sobre a tela?) ou ainda um caso de uso (onde o seu usuário vai estar usando o seu produto? Quando que o seu produto vai intervir na vida do usuário?). 

Já o outro, *8 steps*, elimina os casos de uso e interações e foca mais na concepção da telas propriamente dito. Esse segundo é usado normalmente, quando temos uma ideia mais clara do nosso produto/ideia e já conseguimos imaginar como nossa aplicação vai funcionar.

Para obter melhores resultados, sempre tente aplicar pelo menos duas rodadas do Crazy Eights. Com certeza, na segunda rodada, a equipe vai sofrer mais para gerar as 8 novas ideias. 

Fazendo uma analogia rápida, é como se a gente tivesse raspando o fundo do pote, o que torna tudo mais doloroso para se conseguir novas ideias. No geral, na primeira rodada os participantes vão gastar as suas oito ideias mais óbvias. 

A segunda rodada é, justamente, para reforçar a questão de sair da zona de conforto e fazer cada participante buscar ideais mais inovadoras. 

Vale destacar que não significa que você vai abandonar as ideias antigas, elas tendem a vir na sua mente por serem mais fortes, mas vale uma segunda rodada justamente para poder ir além do óbvio e ter mais opções e situações para se analisar sobre o projeto/ideia.

# Gamestorming – 8 steps – Momentos chaves

## Objetivo
Materializar as ideias (telas, caso de uso e interação) que temos sobre o nosso aplicativo no papel de forma rápida e visual.

## Ambiente

* As ideias/histórias/cenários descritos nos gamestorming anteriores.
* Folha A3
* Canetinhas
* Regras

Duração de 5 minutos;
Cada integrante do time deve fazer um 8 steps mesmo sem habilidades artísticas.

# Passo a Passo para o Crazy Eights

Distribua folha A3 em branco e canetas para todos os participantes.
Faça com que todos dobrem a folha de papel 3 vezes de modo que todos eles tenham a folha divida em 8 pedaços.

Peça à equipe que desdobre o papel e observe a grade de 8 retângulos foi criada.

Dê 5 minutos no total para desenhar oito momentos chaves, uma média de 40 segundos para cada quadro.
Ao longo do exercício continue a lembrar as pessoas do tempo e se certificar de que está claro o que elas devem esboçar
Repita conforme necessário.

Obs: Lembre-se que você pode aplicar esse mesmo *gamestorming* desconsiderando casos de uso e interação e apenas focado em telas quando sua equipe já tem uma ideia mais clara do que estão criando.

Uma vez que o *gamestorming* está finalizado, convide cada participante para compartilhar seus esboços favoritos, obter feedback do seu time e definirem quais steps são fundamentais para o seu produto/ideia funcionar. Aqui, por exemplo, pode-se usar a técnica do zen-voting para fazer a seleção final.




Como um **podcast** é em forma de conversa, compensa criarmos um roteiro? Ou uma organização das ideias seria melhor, já que queremos dividir a tarefa de falar essas informações entre os dois?

Seria legal se a gente tivesse algo mais estruturado, pelo menos para o começo do episódio, para dividirmos as falas e sabermos quais tópicos viriam em seguida, né?

Por isso, vamos montar um **roteiro estruturado**. Assim, iniciamos um rascunho da estrutura do roteiro.

Começamos escrevendo quais informações seriam lidas por quem, já que queremos apresentar a voz de ambos para o público, já nessas informações iniciais sobre o livro. Mas, achamos que fica chato para o ouvinte as informações serem apresentadas de qualquer forma, sem um ritmo ou um texto mais bonitinho.

Assim, decidimos elaborar alguns parágrafos mais organizados com os dados do livro. Neles, escrevemos exatamente o que falaríamos, em letras maiúsculas, pois fica mais fácil de ler enquanto estivermos gravando.

Marcamos as pausas com uma barra “/” para sabermos quando fazer uma pequena pausa no meio do texto e não trazer aquela sensação de algo que foi falado correndo só porque precisa ser falado. Queremos enfatizar as informações porque as achamos importantes.

Também marcamos os pontos finais com duas barras “//” para indicar que, naquela parte, o texto deve ser finalizado e possuir uma pausa um pouco maior, para mostrar que o assunto está mudando.

Depois, pensamos no debate que será feito no episódio. As nossas conversas sobre livro sempre levam horas, porém, não podemos deixar o episódio muito longo. Como poderíamos resolver isso? Queremos que as falas tenham ritmo de conversa, mas com uma certa linearidade de ideias.

Então, escolhemos os tópicos que queremos abordar e os colocamos depois das informações do livro, sem uma fala definida, só o tópico, para que vejamos a respeito do que falaremos a seguir.

Esses assuntos são como a autora começa o livro, apresentando a história do personagem principal, logo após o evento que será destaque em toda a saga, a apresentação do mundo, que é apresentado ao leitor ao mesmo tempo que é apresentado ao protagonista.

Por fim, gostaríamos de falar sobre como vemos a leitura desse livro para a classificação indicativa, já que é um livro infanto-juvenil, e como foi nossa experiência pessoal quando lemos pela primeira vez, ainda crianças, as dificuldades que encontramos e momentos que mais nos marcaram. Com isso, desenvolvemos um **roteiro para estruturar o episódio**.

E agora como montar todas essas informações?

# Roteiro para podcast

Optamos por montar uma tabela, que deixa separado cada parte, de quem fala e vinheta, para a fala e os tópicos, e fica mais organizado.

### Roteiro
> **Apresentador 1** (A1), BEM-VINDOS AO PRIMEIRO EPISÓDIO DA LEITURA ALÉM // Apresentação da pessoa

> **Apresentador 2** (A2), EU SOU / Apresentação da pessoa // E O LIVRO ESCOLHIDO PARA DISCUTIRMOS NESTE PRIMEIRO EPISÓDIO É O HARRY POTTER E A PEDRA FILOSOFAL

> A1, O LIVRO ESCRITO PELA AUTORA J.K. ROWLING / FOI LANÇADO ORIGINALMENTE EM 1997 NO REINO UNIDO //

> A2, E FOI LANÇADO NO BRASIL / NO ANO 2000 / PELA EDITORA ROCCO // A EDIÇÃO BRASILEIRA CONTA COM 264 PÁGINAS / ENQUANTO A BRITÂNICA POSSUI 223 // E MAIS UMA VEZ / BEM VINDOS AO LEITURA ALÉM

### Vinheta de abertura

A1 e A2, Discussão sobre o livro.

Principais tópicos: 
-   Começo do livro; Apresentação do Harry; 
-   Morte dos pais do Harry e tentativa da morte dele; 
-   Apresentação dos outros personagens; 
-   Introdução ao mundo bruxo; 
-   Livro infantil?; 
-   Nossas impressões quando lemos pela primeira vez; 
-   dificuldades; 
- o que marcou

Então, estruturamos o roteiro base desta maneira, para apresentá-lo de uma forma geral, para ser seguido na maioria dos episódios.

# Um roteiro para cada tipo de podcast

A maneira como o roteiro base é estruturado é de acordo com a forma em que as pessoas querem apresentar o podcast.

Dependendo do formato e estilo, se for completamente uma conversa, muitas vezes nem é necessário um roteiro, somente uma **lista com os tópicos** que podem ser abordados, para uma **condução melhor dos temas**.

Caso seja com um **texto fixo** para cada episódio, como o podcast [Escriba Café], no qual um texto a respeito do assunto é falado, um roteiro estruturado, no qual estão as **falas exatas que devem ser feitas, é bom para o locutor saber o que falar e, ainda, em quais momentos teria uma pausa, uma música, efeito sonoro ou vinheta.**

Também existem podcasts em que acontece uma entrevista com **diversos convidados sobre determinado assunto**,como no [Mamilos Podcast]. 

Nele você pode não escrever um roteiro,podendo escrever apenas as informações e perguntas principais, que os produtores e apresentadores querem que sejam abordadas.

Para o nosso podcast sobre livros, escolhemos seguir um roteiro pré-estruturado, para que saibamos a parte das informações dos livros e quais tópicos definimos e que gostaríamos de abordar, para não nos perdermos completamente na conversa.

Mas no fim das contas, nem todo podcast precisa seguir um roteiro totalmente estruturado,que mostre exatamente o que deve conter no áudio do episódio, como o que usamos para o começo do nosso, ou até mesmo, nem todo podcast precisa de roteiro. Isso vai de acordo com o objetivo dos produtos e do formato definido.

Tanto no [**marketing de conteúdo**] quanto no [**inbound marketing**], os podcasts são uma ótima forma de trazer informações aos seus clientes, mantendo contato e até os fidelizando.

No nosso podcast, que queremos trazer uma **fala mais definida**, ao menos do começo dele, achamos importante fazer uma pesquisa e definir um roteiro com um conteúdo.

Aqui na **Alura**, também temos um podcast sobre diversos assuntos em tecnologia, marketing e outras modinhas, [**o Hipster ponto Tech**]. Além de um [curso] e um [livro] sobre Marketing de Conteúdo, onde você aprenderá sobre diversas maneiras e canais para fazer um bom marketing de conteúdo.





imagem 

Estava em um sala aqui na Alura com o meu notebook. Quando mudei de sala, meu notebook não se conectava ao Wi-Fi dessa sala, mas o de todos os outros sim… Por que só o meu não conecta? :’(

Podemos pensar que é algum problema com a minha placa de rede sem fio, porém estou conseguindo listar outras redes e conectar a elas. Apenas essa rede não é listada e nem consigo me conectar.

Então, por que eu não consigo me conectar?

As redes sem fio têm diferentes especificações, isto é, cada rede funciona sobre um padrão (ou mais de um) específico. Caso no local exista um padrão que a rede não reconheça, não existirá conexão.

Para resolver meu problema, preciso antes entender quais são esses padrões.

## Entendendo os padrões de Wi-Fi

Existem alguns padrões de rede sem fio como: 802.11a, 802.11b, 802.11g, 802.11n. Cada um funciona sobre uma frequência diferentes, alguns na faixa de 2,4 GHz (Gigahertz), outros na faixa de 5 GHz. Se essas frequências forem diferentes uma rede não consegue ver a outra.

Mas, bem, vamos falar desses padrões...

### O padrão 802.11a e sua grande velocidade

O padrão 802.11**a** consegue atingir uma velocidade de transferência de 54 Mbps, e trabalha com uma frequência de 5 GHz

Contudo, por conta de sua frequência, os dispositivos que utilizam esse padrão têm um preço maior do que o seu padrão irmão (o 802.11b). Por esse motivo, essa tecnologia foi pouco adotada, principalmente em redes domésticas.

Sua frequência também tem um impacto em dispositivos móveis. Como esse padrão tem uma maior frequência, o consumo de bateria é maior.

### O popular 802.11b

Devido ao seu preço ser mais baixo, o padrão 802.11**b** foi, e ainda é, muito mais usado que o anterior, principalmente em redes domésticas, entretanto, sua velocidade é menor que a anterior, alcançando 11 Mbps.

Sua frequência também é menor que a anterior, fica na faixa de 2,4 GHz. Logo, ele consome menos energia que o anterior, o que significa uma economia de bateria para dispositivos móveis.

Muito bem, ele não consome muita bateria e é mais barato, mas além da velocidade, esse padrão tem algum ponto negativo?

Esse padrão também tem alguns inconvenientes, entre eles:

- Por trabalhar em uma frequência diferente do padrão 802.11a, os dois são incompatíveis;
- Essa frequência é a mesma de outros aparelhos domésticos, como telefones sem fio e microondas, o que causa interferências no sinal.

Mesmo assim, essa tecnologia foi bem aceita, tanto que algum tempo depois foi desenvolvida outra que visava manter esses benefícios e trazer algo mais: uma velocidade de transferência maior.

### Surge o 802.11g

Visando manter os benefícios do padrão 802.11b, , foi criado o padrão 802.11**g**. Assim como o anterior, ele trabalha na faixa de 2,4 Ghz, o que gera uma economia de bateria em relação ao 802.11a, e traz uma velocidade de 54 Mbps assim como este.

Por ter a mesma frequência que o 802.11b, uma tecnologia é [**compatível**] com a outra e, por consequência, possui os mesmos problemas relacionados a interferência do sinal.

Analisando a velocidade desse padrão você pode estar se perguntando:

> _"As redes sem fio não conseguem passar dessa velocidade de transferência?"_

Com as tecnologias de antigamente, não, porém nos dias de hoje lançaram outro padrão: o 802.11**n**.

### O rápido 802.11n

Esse padrão consegue atingir uma velocidade de até 300 Mbps. Contudo, esse não é seu único diferencial em relação aos outros:

- O alcance do sinal é melhor;
- Seu sinal é mais estável;
- Compatível com outros padrões.

Tudo isso graças a uma tecnologia chamada [**MIMO**]. Essa tecnologia permite ter múltiplas entradas e múltiplas saídas para os dados. Com ela, aumentamos a velocidade do Wi-Fi, seu alcance e estabilidade. Esse padrão também tem compatibilidade com os padrões anteriores.

Alguns roteadores têm a opção de escolher em qual padrão trabalhar, outros podem trabalhar em mais de um modo ao mesmo tempo. Sabendo disso, podemos ir até a configuração do Wi-Fi e escolher aquela que melhor nos atende atende.

imagem.

Apesar dos dispositivos sem fio terem essas velocidades máximas, dificilmente eles a atingem por causa de alguns problemas como [**overhead**]).

## Problema Resolvido!

Não conseguia conectar meu laptop na rede sem fio de outra sala aqui na Alura, vimos que a causa disso era a incompatibilidade entre os padrões.

Entendemos o que são os padrões, como eles funcionam, suas velocidades de transferência e como colocar o roteador para aceitar mais de um padrão.

Gostou de saber sobre Wi-Fi? Essa é só uma pequena parte do vasto mundo de redes. Aqui na Alura temos uma [**formação em redes de computadores**]. Nela você aprenderá sobre os conceitos e como montar uma rede corporativa, com tecnologias como VLans e IPv6, além de técnicas de segurança.




O marketing digital é uma grande área de especialização muitas vezes inexplorada por quem está [prestes a começar sua carreira]. 

A verdade é que nenhuma estratégia de marketing se sustenta sem comunicação visual, e a procura por designers na área só cresce a cada ano.

Se você se interessa e quer saber mais sobre o assunto, nós te ajudamos a dar os primeiros passos para ser um profissional de design para marketing digital.

## Por que o design é tão importante para o marketing digital?

O objetivo do [**marketing digital**] é promover produtos e marcas por meio de mídias digitais, principalmente a internet. Para isso, uma estratégia bem desenvolvida é aquela que atrai, informa, converte e encanta o público para transformá-lo em um cliente fidelizado e engajado.

Você já identificou onde entra o seu trabalho de design nessa história? A comunicação visual é fundamental para o marketing digital. O design gráfico é a forma de apresentar o conteúdo e guiar o usuário para o próximo passo sem que ele se perca ou desista no caminho.

## Por que aliar beleza e funcionalidade?

O design sempre foi um casamento entre forma e função, mas no marketing digital a segunda parte ganha um pouco mais de destaque.

O encantamento visual é muito importante para atração e compartilhamento de um produto ou marca, mas esse é um esforço desperdiçado caso o designer não consiga guiar o público para uma próxima etapa de conversão.

Se você se interessa e pretende trabalhar nessa área, deve prestar muita atenção para a usabilidade do seu trabalho. É uma questão de descobrir como fazer o usuário navegar pelo conteúdo e instigá-lo a clicar no botão certo, na hora certa.

## Quais são as melhores práticas de design para marketing digital?

Certo, você entendeu a importância da sua profissão para o marketing digital. Mas como colocar em prática o seu design para trabalhar nessa área? É o que vamos mostrar agora.

### Sites

É claro que o site de um produto ou marca é o centro da estratégia de marketing digital. [**O designer contratado para cuidar dessa área**] costuma se preocupar muito com a navegação e exposição da marca, para facilitar a conversão de usuários em clientes.

Isso significa criar Landing Pages atraentes e que mostrem tudo o que ele precisa saber imediatamente. Deve conter chamadas destacadas, descrições bem diagramadas para fácil leitura e imagens atraentes.

Caso a conversão seja feita em várias etapas, também é necessário pensar em todo o fluxo do processo. Dessa maneira, pode-se usar formulários intuitivos, navegação bem sinalizada e dicas visuais pelo percurso.

### Blogs

Uma estratégia bastante presente hoje nos planejamentos de marketing pelo mundo é o marketing de conteúdo. Ao contrário da mídia tradicional, que expõe a marca para um público geral de forma uniforme, essa estratégia é uma forma de oferecer às pessoas um conteúdo relevante na hora certa para que os clientes venham até a empresa por conta própria.

No centro do marketing de conteúdo está o [**uso de blogs**], que necessitam de um designer para uma diagramação focada em conversão. O design de blogs deve valorizar o conteúdo e garantir a facilidade da leitura, para depois guiar o usuário intuitivamente a se aprofundar mais naquele produto ou marca.

### Imagens para redes sociais

Outro alicerce do marketing digital é o engajamento do público por meio das redes sociais. Hoje em dia, não se faz esse trabalho sem a ajuda de um designer.

Todas as empresas já perceberam que a [**comunicação por meio de imagens**], vídeos, infográficos e animações tem uma chance muito maior de atingir o público e gerar compartilhamentos do que apenas o texto sozinho.

Seja em uma capa de Facebook, uma imagem para o Instagram ou um GIF para o Twitter, uma campanha de marketing digital bem-sucedida sabe criar uma linguagem visual própria e aplicá-la em suas redes sociais. Todo designer interessado nessa área adora este tipo de desafio.

### E-mail marketing

Design para e-mail? Sim! O e-mail não é só uma ferramenta muito importante para estratégias de marketing digital, como a atuação de um designer nessa peça em específico pode alavancar as conversões de uma empresa.

O importante aqui é que o profissional saiba criar um design simples, porém impactante, que chame a atenção em um segundo e não deixe que o usuário feche a mensagem.

Outra [**característica do e-mail marketing**] que exige um designer atento e interessado é a forma como os e-mails são lidos. As plataformas mobile se tornaram quase onipresentes para pessoas que checam suas mensagens o dia inteiro.

Por isso, as práticas de design responsivo são indispensáveis para não atrapalhar a experiência de atração da marca. Independentemente de como o seu cliente abra a caixa de entrada do e-mail dele, o conteúdo de sua marca tem que estar lá, limpo, claro, objetivo e passando a mensagem para o qual foi criado.

### Call to action

Em todas as situações acima, o trabalho mais importante de um designer no marketing digital é criar os chamados **"Call to action" (Chamado Para a Ação — CTA)** da melhor forma para atrair e converter clientes.

Um CTA pode ser um link, um botão para cadastro, um formulário para capturar e-mails, um bom e velho "Compre agora!" ou qualquer chamada que instigue o usuário a tomar uma ação para se aproximar mais de consumir uma marca ou produto.

Essa é uma tarefa essencial de um designer, demanda muito estudo e várias tentativas. Dependendo da natureza do público-alvo e do seu comportamento na internet, é preciso testar formas, tamanhos, cores e o posicionamento de CTAs para encontrar o mais eficiente em atrair cliques.

O design para marketing digital é uma área [**repleta de desafios**] para o profissional que está começando a sua carreira. Precisa de pessoas que gostem de estar o tempo todo testando novas possibilidades e criando novas formas de se comunicar visualmente.

Esse é o seu caso? Então compartilhe este artigo no Facebook e no Twitter e quem sabe você não começa a criar uma rede de contatos com profissionais tão interessados quanto você!




No desenvolvimento de qualquer sistema, é muito comum lidarmos com **listas**, como por exemplo, uma lista de produtos. Suponhamos que tenhamos a seguinte representação de um produto:

python

Então temos uma lista com alguns produtos:

python

Se executarmos esse código, temos o seguinte resultado:

python

Por enquanto, tudo ocorrendo conforme o esperado, mas, e se quisermos adicionar um novo produto nessa lista? Como podemos fazer isso? Nas listas do **Python**, existem duas funções capazes de **adicionar elementos**, que são a **`append`** e a **`extend`**. Vamos então testá-las! Começaremos pelo `append`:

python

Vejamos qual é o resultado:

python

Aparentemente ocorreu tudo conforme o esperado. Então vamos testar a função `extend`:

python

Opa! Parece que o `extend` não consegue adicionar um objeto na lista... Será mesmo? Se analisarmos a mensagem de erro, ela nos informa que o objeto do tipo "Produto" não é **_iterable_**, mas o que será que isso significa?

O `extend`, diferente do `append`, itera sobre o elemento que deseja adicionar, ou seja, envolve o argumento passado por parâmetro dentro de um laço, e então, adiciona os valores contidos dentro desse parâmetro, nesse caso, ele tentou fazer isso com o objeto do tipo Produto. É justamente por isso que não foi possível adicionar o objeto do tipo Produto e apresentou esse erro.

> Então significa que não podemos utilizar o `extend` para adicionar objetos?

Não exatamente!

Uma solução para esse problema é, ao invés de enviar um objeto puro, mandar como parâmetro uma **estrutura iterável** que contenha um objeto do tipo "Produto", ou seja, enviar uma lista que contenha um Produto!

python

Será que agora funciona? Vejamos o resultado:

python

Funcionou como o esperado! Entretanto, adicionamos apenas um único elemento! E se quiséssemos adicionar vários elementos? Em outras palavras, adicionar uma lista de produtos novos. Será que funcionaria sem nenhum problema? Vamos testar primeiro com o `append`:

java

Testando o código temos o seguinte resultado:

python

**Aparentemente funcionou**, mas repara que ao invés de adicionar cada produto na lista de produtos, ele adicionou uma lista inteira! Ou seja, quando utilizamos o `append` ele simplesmente adiciona o **valor completo na lista**. Mas e se utilizarmos o `extend`? Será que funciona? Isto é, adiciona produto por produto? Vamos verificar:

python

Rodando novamente o código:

python

Funcionou conforme o esperado! Portanto concluímos que as duas funções funcionam da seguinte forma:

- **append**: Adiciona qualquer valor **completo**, por exemplo, se enviarmos um objeto, ele adiciona o objeto, se enviarmos uma lista, ele adiciona a lista inteira ao invés de seus itens.
- **extend**: Adiciona itens de uma **estrutura iterável**, por exemplo, se enviarmos um objeto puro, ele não sabe como adicionar, porém, se enviarmos esse mesmo objeto dentro de uma lista, ele varrerá a lista e adicionará esse objeto e, caso exista outros, os demais dentro da lista.

Podemos ver claramente a diferença entre as duas funções no momento que tentamos adicionar uma string, por exemplo, a string "chocolate":

- **Append:**
  python
  Resultado do `append`:
  python

* **Extend:**
  python
  Resultado do `extend`:
  python

Veja que, enquanto o `append` adicionou toda a string, o `extend` adicionou letra por letra, pois a string, por de trás dos panos, é um array de **`char`**, portanto, ele varre esse array, isto é, essa estrutura iterável, e adiciona cada item.

Sabia dessa diferença no momento de adicionar algum elemento nas listas do Python? Não sabia? Quer aprender mais? Então dê uma olhada na nossa [**formação de Python para web**] na Alura e aprenda hoje mesmo os diversos recursos que essa linguagem nos oferece!




Como podemos criar uma vaixa de dialogo no **android**?

No post onde vimos como criar [**context menu**], criamos um menu de deletar um curso da lista, ou melhor, um item da lista. Para isso criamos o método `deletar()` que recebe a posição do curso, e então, deleta o curso a partir da posição:

java

A princípio, esse método está perfeito, porém, uma funcionalidade de **deletar é algo perigoso**, pois o usuário, de fato, perde a informação! Portanto, a boa prática é fazer com que o usuário tenha ciência do que está preste a fazer.

Em outras palavras, precisamos, de alguma forma, **alertar o usuário que a sua ação é perigosa!** Como podemos chamar a atenção do usuário? Podemos tentar adicionar uma janela de confirmação. Algo próximo do exemplo a baixo:

imagem` que nos permite adicionar um título ao dialog:

java

Mas o nosso dialog tem apenas um título? Ele também precisa de uma mensagem, certo? Porém, não referenciamos essa instância para um objeto, então como podemos adicionar uma mensagem?

O legal dos métodos do `AlertDialog.Builder` é que eles devolvem o próprio objeto, ou seja, podemos chamar mais de um método ao mesmo tempo. Portanto, vamos também chamar o método `setMessage()`:

java

Agora que o nosso dialog tem um título e mensagem, basta apenas exibí-lo! Para isso, finalizamos as chamadas de métodos com o método `show()`:

java

Vamos rodar a nossa App e verificar o resultado:

imagem`:

java

Porém, precisamos enviar 2 parâmetros:

- **1º parâmetro:** texto que será exibido para esse botão.
- **2º parâmetro:** ação após tocá-lo.

Então daremos o nome para esse botão de "sim":

java

Para adicionarmos uma ação, precisamos implementar a interface `DialogInterface.OnClickListener`, faremos isso da mesma forma como costumamos ver nos outros listener do Android, ou seja, pelo recurso de classe anônima:

java

Quando o usuário tocar no "sim", o que deve acontecer? deletar o curso né? Portanto, adicionaremos o código que deleta o curso dentro do `onClick()`

java

Outro erro de compilação!? Agora na linha `listaDeCursos.remove(position);` Por que será? :(

Já que a variável `position` está fora do escopo da implementação do `DialogInterface.OnClickListener()`, precisamos deixá-la como `final`, ou seja, basta apenas modificarmos no parâmetro do método `deletar()`:

java

Já podemos testar, porém, antes de executar a nossa App, precisamos pensar na seguinte questão:

- E se o usuário não querer deletar?

E então? Como o usuário faz pra não deletar sem tocar no botão "back" do Android? Por enquanto não demos essa opção pra ele. Então vamos adicionar também esse botão!

Da mesma forma que existe o método `setPositiveButton()`, também existe o seu oposto, ou seja, o `setNegativeButton()` que recebe os mesmos parâmetros do `setPositiveButton()`. Então vamos utilizá-lo enviando o primeiro parâmetro com o valor "não":

java

Porém, lembra que também precisamos adicionar uma ação para o botão? Pois é, qual ação daremos para ele? A princípio, nenhuma, mas como informamos isso? Simples! basta apenas enviar um `null`:

java

Rodando a nossa App novamente, temos o seguinte resultado:

![mostrando_opcoes_do_alertdialog]

Veja que agora alertamos o usuário e ainda mostramos quais opções ele pode escolher, isto é, se ele quer confirmar ou cancelar a determinada ação!

Nesse post vimos como podemos interagir com o usuário a partir de um dialog. A partir do dialog, podemos mostrar tipo de mensagem de alerta que permite que o usuário confirme ou não alguma ação que está acontecendo.

Que tal aprender a desenvolver para Android hoje mesmo? Na Alura, temos uma [**formação Android**], onde você aprende desde os conceitos mais básicos aos avançados.


 

As capacidades de aprender e de reaprender se tornam cada vez mais essenciais em um cenário de mudanças rápidas de tecnologia. As *hard skills* de hoje não são as mesmas de amanhã. 

Quantas vezes você precisou que alguém da sua equipe adquirisse novos conhecimentos técnicos em um projeto ou até mesmo mudasse quase que completamente de ferramentas e tecnologias?

# O Mundo VUCA

VUCA já se tornou um buzzword, mas parece que veio pra ficar.

> “Volatile, Uncertain, Complex and Ambiguous”

E em um ambiente como esse, fica ainda mais difícil de saber que capacidades precisaremos amanhã. Um ambiente mais colaborativo, de fácil acesso a informação, cursos, conteúdo, onde todos possam ficar atualizado no que *cada um* considera importante para seu trabalho, é um ambiente cada vez mais buscado.

# Modo focado e modo difuso

Em estudos mais recentes, Barbara Oakley, neurocientista conhecida no campo da educação, aponta que duas formas são comumente utilizadas em um aprendizado eficiente...

Não é à toa que utilizamos diversos canais, algumas vezes simultâneos, para adquirir conhecimento de um tema.

imagem

# Universidade Corporativa

A universidade corporativa precisa expandir seu espaço e derrubar paredes, assim como as universidades tradicionais tem feito. Envolver os colaboradores no processo de aprendizado e mostrar que isso faz parte do trabalho.

Se você busca um ambiente assim, com facilidade para desenvolver os indivíduos em habilidades de tecnologia e negócios digitais, ficaremos contentes em conversar. E não deixe também de ler X e Y sobre isso e ouvir um podcast Z sobre inovação e ver essa entrevista W no youtube. 

Repare que a sua própria jornada para entender mais sobre o lifelong learning e a universidade corporativa passa por diversos tipos de media e também no difuso/focado. É disso que a [**Alura**] entende.






Mas afinal, do que se trata este produto? Como ele é? Ou ainda, por que eu iria comprá-lo se não faço a menor ideia do que ou como é?

Temos a seguinte imagem:

imagem.

Ao utilizar os microtextos reduzimos as chances da informação chegar ambígua ou confusa. Veja um outro exemplo comum, utilizado em formulários:

![]

Perceba que nos próprios campos do formulário temos uma dica explicando mais claramente do que se trata, como "Escolha um nome de usuário", “Seu endereço de e-mail” e “Crie uma senha”.

Além disso, os pequenos textos abaixo do formulário são outro exemplo, que informam também algumas orientações essenciais ao usuário em seu primeiro cadastro.

## 4\. Botões que parecem botões

Os botões são os gatilhos para novas ações do usuário dentro da nossa página e elementos essenciais para a interação.

Se esse gatilho não estiver claro e visível, podemos acabar perdendo uma venda, um [**lead**] ou até mesmo um envio de informações importantes. Veja o exemplo:

![]

Para isso, existem as [**boas práticas**] a serem seguidas para criar um botão pensando na experiência do usuário, considerando cores, contrastes, rótulos, entre outras variáveis muito importantes.

![]

Note que agora temos uma percepção muito melhor do botão e ainda somos guiados, pelo contraste visual, a interagir com o botão mais chamativo, ainda que haja uma segunda opção. Este é um bom recurso para guiar o usuário a escolher a ação que desejamos.

## 5\. Usuários no controle

![]

Essa é uma opção comumente encontrada quando nos cadastramos em algum site.

A grande questão é: Será que vamos perder vendas e leads se disponibilizarmos essa opção ao usuário?

Sim, de fato! Mas então por que utilizar esse recurso?

Dar ao usuário a oportunidade de escolha, de fazer ou desfazer edições ou mesmo de definir se algo é positivo ou não, é dar [**liberdade e controle**] para essa interação.

Afinal, se queremos proporcionar uma experiência memorável, nada melhor do que permitir que o usuário personalize a seu próprio gosto.

Uma boa experiência gera maiores chances de conseguir que este usuário retorne à sua página.

## O detalhe que faz toda diferença

Ainda que pareçam questões muito sutis, estes são justamente os fatores que as pessoas acreditam ser "apenas detalhes", mas que ao serem deixados de lado, mudam completamente a percepção e a experiência do usuário.

Se atentar aos detalhes, pensando em UX, é como pensar em todas as pontas soltas e possibilidades de problemas, tapando todos os buracos que possam comprometer a usabilidade.

Além disso, que tal aprofundar seus conhecimentos com os [**cursos de UX**] da Alura? Aprenda desde os conceitos mais básicos até os passos para desenvolver uma estratégia de UX para seu projeto!




Eu trabalho bastante com Node em diversos projetos no meu dia a dia, e me lembro que no começo eu sofria bastante por não saber como debugar meu código. Afinal, existem inúmeras formas de se fazer isso e eu gostaria de compartilhar com vocês a que eu mais gosto - usando o VSCode

## Pré-requisitos

Fica tranquilo que para esse post você não precisa ser um ninja master em **Node**. Com uma base de **JavaScript** e interesse em Node já vai conseguir pegar a ideia :).

## Mão na massa

Para não perder muito tempo, eu já tenho um projeto previamente criado com Express que possui o seguinte código:

js

No `package.json`, eu deixei criado nos scripts um comando `dev` para rodar o servidor em modo de desenvolvimento

json

> Caso você não conheça o [**nodemon**], ele é uma ferramenta que encerra e inicia um processo node, facilitando o _reload_ para testarmos alterações feitas no código do nosso servidor.

## Encontrando o problema

Repare que ao acessarmos nosso projeto no navegador, a resposta nos retorna um `undefined`. Isso acontece pelo fato de que não informamos a variável na query string `dadoExterno`.

imagem` em `dadoExterno` para entender o que está acontecendo:

imagem em nossos projetos. Em linha gerais é aberto um socket que diversas ferramentas podem se inscrever e nos permitir o debug

imagem
- Para desligar tudo é só clicar no botão vermelho ao lado da setinha arredondada na lateral superior direita

Espero que tenha gostado do post, em breve trarei mais dicas, se curtiu e quiser saber em primeira mão quando vierem novos conteúdos, [me segue no meu twitter] e pra acompanhar meus outros posts ta tudo centralizado em meu site pessoal [https://mariosouto.com] até mais \\o

Se gostou do artigo, que tal dar uma olhada na nossa [**formação de engenheiro front-end na Alura**] e aprender mais um pouco sobre essa gigantesca área?




Nesse artigo vou mostrar sete dicas para se utilizar o **Illustrator**, desde de como aplicar **máscara de recortes** até trabalhar com **múltipas pranchas**.

## 1. Crie paletas de cores a partir de uma seleção

Escolher a [**combinação de cores adequada**] é uma das tarefas mais difíceis na hora de desenvolver layouts funcionais. Definir aquelas adequadas ao seu projeto fica mais fácil com a **Color Guide Tool**, que gera paletas incríveis automaticamente.

imagem e, no canto superior direito da tela, clique no leque de cores para visualizar as combinações geradas**.

imagem, pressionando alt ao longo do processo para que possa nomeá-lo.

imagem + n** todos os recursos pré-definidos são aplicados automaticamente. Para salvar um template, clique em Archive > Save as template e escolha a localização desejada.

imagem + n.**

## 5. Trabalhe com múltiplas pranchas

Não fique preso numa tela só! Componha com até 99 pranchas num mesmo arquivo, obtendo uma **visão global do layout** desenvolvido em um só lugar.

imagem + R**. A partir daí, é só definir o posicionamento das suas guias de acordo com o desejado. Para alinhar elementos utilizando o **snap to grid**, selecione um ou mais objetos (sempre usando o **shift** neste caso) e acesse no menu de contexto View > Snap To Grid. As guias criadas com auxílio da régua são invisíveis e não podem ser vistas na impressão ou composição final, ficando armazenadas apenas no arquivo editável do Illustrator.

![]

Gostou dessas dicas do Illustrator que vão poupar tempo e te ajudar a ser [**ainda mais eficaz**] no uso da ferramenta? Que tal aprender também a criar layouts para a web? Se interessou? Então dê uma olhada na nossa [**formação de Desing Gráfico**]. 




Muitas vezes precisamos **extrair** o valor de algum objeto em JavaScript:

javascript

Veja que para imprimir simples informações de um JSON representando um aluno foram necessárias 3 linhas de código. Além disso, note que em três das quatros linhas temos uma grande repetição de código, que seria a variável onde o objeto JSON está armazenado.

Uma tarefa às vezes muito repetitiva e verbosa...

Com todos esses recursos que o JavaScript vem ganhando, e essa sendo uma tarefa muito comum no dia a dia, será que não existe uma maneira mais simples e menos verbosa como essa?

## Desestruturando o Objeto

Considerando o nosso exemplo inicial, uma das maneiras para diminuirmos o nosso código seria devolver os atributos do objeto de uma vez, e então, dessa forma, a gente chamaria eles sem a necessidade de um objeto. Mas será que isso é possível?

Sim é possível, para isso o JavaScript na versão [**ES6**] lançou o chamado "**Desestruturação de objetos**", visando **facilitar** essa tarefa de **extração** de valores referente a um determinado objeto, mas como seria essa nova extração?

javascript

Veja que em apenas uma linha conseguimos pegar o valor de todos os atributos de nosso objeto e criar uma variável para eles, mas afinal, como foi possível imprimir o valor referente aos dados do aluno?

Primeiramente vamos reparar na estrutura de nosso objeto, podemos notar que dentro dele existem três informações, sendo elas: Nome, Idade e Email, respectivamente os mesmos nomes de nossas variáveis informadas dentro das chaves no lado esquerdo. Então, basicamente, a desestruturação de objeto segue a seguinte sintaxe:

js

Então quer dizer que se tivermos um objeto:

js

> _"Basta informar no lado direito o nome dos campos dentro das chaves que eu pretendo pegar?"_

Sim, dentro das chaves é onde fazemos a assossiação dos campos que pretendemos extrair de um determinado objeto JSON.

Por exemplo, se quisermos pegar apenas a razão social do objeto `fornecerdor`, podemos fazer da seguinte maneira:

js 

Assim conseguimos extrair apenas a informação que precisamos, ou seja, podemos passar N campos dentro de nosso objeto.

## Cuidados com a Desestruturação de Objetos

A princípio, desestruturar um objeto parece resolver todos os nossos problemas, certo? Mas e se informarmos um campo que não existe?

js

Como de costume, o JavaScript não vai encontrar o campo com o nome que informamos, pois ele não existe. Sendo assim, não será realizada a associação. Em outras palavras, a variável ficará com o valor `undefined`.

Mas, e se por acaso recebermos o seguinte objeto:

js

Veja que, para nós, esse objeto trata-se de um aluno onde `a`, `b` e `c` são informações referente ao seu nome, idade e email respectivamente, nesse caso vamos ter que criar variáveis com esses nomes sem significado?

Felizmente, não! A equipe responsável pelo desenvolvimento da funcionalidade já pensou nisso e criou o recurso para referenciar um objeto mas trocando seu nome na criação da variável:

js

Repare que agora informamos qual campo desejamos extrair a informação de nosso JSON, e passamos para uma nova variável com o nome logo após os dois pontos, seguindo a seguinte sintaxe:

js

Seria o mesmo que fazer:

js

Veja novamente como economizamos linhas e deixamos nosso código muito menos verboso! Mas então devemos usar esse tal de desestruturação sempre que precisamos extrair informações do JSON?

Acredito que devemos usar sempre que precisamos economizar a verbosidade. Isso significa que, se precisamos pegar apenas uma informação talvez não seja tão vantajoso utilizar tal recurso.

## Desvantagens no uso da Desestruturação de Objetos

Certo, agora já mostrei as vantagens, já dei exemplos para us... E onde ficam as desvantagens?

Embora seja menos verboso, em algumas situações o **destructuring** pode aumentar a complexidade do código, ficando um pouco mais complicado caso você não esteja acostumado com a nova funcionalidade.

Outro ponto a destacar é que quando usamos a desestruturação sempre atribuímos os valores desejados em variáveis, sendo assim, quando uma deixar de ser usada, será necessário apagá-la manualmente.

Por último, não menos importante... Como já foi mencionado no artigo, quando passamos o nome de algum atributo que não existe dentro do nosso objeto, a variável torna-se `undefined`.

## Para saber mais

Para finalizar, também podemos utilizar a desestruturação em funções, imagine que temos uma função responsável por imprimir as informações de nossos alunos:

js 

Para evitar a repetição da variável aluno, podemos utilizar a nova funcionalidade:

js

Em ambas as funções e chamadas, teremos o mesmo resultado.

Caso tenha interesse em conhecer e saber um pouco sobre a história do JavaScript tem um [post] que fiz em meu blog.

Aqui na **Alura** temos uma [**Formação Front-End**] onde ensinamos **Javascript** do básico até o avançado, passando
interação com elementos do **DOM** até programação funcional e testes.




A vida de freelancer não é fácil! Você precisa bater escanteio e cabecear ao mesmo tempo. Precisa executar o trabalho, cobrar do cliente e prospectar novos jobs.

Saiba que esse alguém já existe. São os marketplaces, sites que ajudam na contratação de freelancers. Eles podem ser comparados ao Uber — mas, em vez de conectar motoristas e caroneiros, conectam empresas a designers, [**desenvolvedores**], fotógrafos, por exemplo, dentre muitos outros profissionais.

A lógica desses sites é bem fácil de entender. A plataforma cadastra os profissionais interessados em trabalhar como [**freelas**]. Enquanto isso, também registram empresas e pessoas que estão precisando contratar profissionais capacitados para algum projeto específico.

Depois dessa etapa, a plataforma conecta os profissionais cadastrados aos potenciais clientes. Se der match, o negócio está feito! Simples assim.

Graças aos marketplaces, você não precisará mais investir tempo em prospecção e contato com potenciais clientes. A plataforma faz isso para você, e de uma maneira muito rápida.

Se você acessou este texto, é porque tem interesse pela ideia. E deve, também, estar com algumas dúvidas do tipo: como são feitos os pagamentos; quanto pode ser cobrado por trabalho e qual o custo da plataforma.

Para ajudá-lo a entender melhor o mundo dos marketplaces, destacamos os principais tipos de plataformas, de acordo com o modelo de negócios, ou seja, a forma como eles são remunerados e como remuneram os freelas.

Veja qual site é melhor para o seu perfil profissional. Boa leitura!

## 1\. Pagamento por comissão

Um dos modelos de negócios para marketplace mais difundidos da internet é o pagamento por comissão fixa.

Funciona assim: o contratante cadastra um projeto que precisa ser executado por algum freela (designer, fotógrafo, programador etc) na plataforma. Em seguida, os profissionais enviam as ofertas e uma delas é aceita pelo contratante. 

Com base nesse valor, o marketplace adiciona uma taxa de administração normalmente em torno de 10%. O freelancer recebe o valor acordado. Contudo, o contratante precisa desembolsar um pouco a mais para pagar a plataforma.

As plataformas que trabalham nesse modelo são:

### [99freelas]

É uma plataforma brasileira que começou focada no mercado de programadores. Cresceu muito e hoje atende freelas de várias outras áreas, como vendas, administrativo, advocacia e fotografia. Cobra uma taxa de administração de 10%.

### [Workana]

A plataforma é internacional, mas dá prioridade para freelas de língua portuguesa e espanhola. Também trabalha com advogados, desenvolvedores, designers e até atendentes à distância. Cobra até 15% de comissão.

### [WeDoLogos]

Foi um dos primeiros sites de freelas do Brasil e é focado no trabalho de designers. Funciona assim: os profissionais se inscrevem e enviam propostas para os pedidos de contratação em aberto. O contratante paga um valor que será dividido entre o designer e a taxa de comissão do marketplace.

## 2\. Taxa mensal cobrada do freela

Nesse modelo de marketplace, o site cobra uma taxa mensal dos profissionais cadastrados. O valor depende da área de atuação, da concorrência interna e do plano escolhido pelo profissional. Quem paga mais aparece em destaque na lista dos freelas e tem mais chances de ser contratado por alguém interessado.

Citamos uma plataforma que trabalha nesse modelo:

### [GetNinjas]

É o principal marketplace no Brasil e uma das startups de maior sucesso dos últimos anos. O GetNinjas cobra dos profissionais um “anúncio” para se destacarem entre a concorrência. Essa propaganda parece com os links patrocinados do Google — localizados no topo da lista do resultado de busca. O valor do trabalho é acertado entre o contratante e o freela.

## 3\. Mix de mensalidade, conta gratuita e comissão

Alguns sites mesclam contas gratuitas com pagamentos mensais e taxas de administração. É um mix de opções. Nesses casos, o freela precisa avaliar bem os valores com os quais a plataforma trabalha e entender qual é a melhor opção para cada caso.

O lado positivo é que você pode começar a usar o marketplace gratuitamente, porém, as plataformas sempre priorizam as contas premium na listagem de jobs.

Sugerimos o site:

### [Freelance.com]

Esse é, provavelmente, a maior plataforma do mundo para freelas. De origem australiana, o marketplace oferece trabalhos em várias áreas. O profissional pode começar com uma conta grátis. E se quiser ter mais chances de ser contratado, deve pagar um valor mensal para a plataforma, que varia dependendo do plano.

Em alguns casos, também é cobrada uma taxa de comissão do contratante.

## 4\. Quem paga é o contratante

Algumas opções de mercado cobram taxas das empresas que precisam contratar um freelancer. O pagamento nem sempre é mensal e pode ser realizado por demanda: a cada anúncio de recrutamento de profissionais, o contratante desembolsa um valor.

Porém, são oferecidos descontos para quem publica várias oportunidades ao longo do tempo.

A plataforma que opera nesse modelo é:

### [Trampos.co]

Este marketplace nasceu como uma plataforma colaborativa, em 2008. Desde então, não parou de crescer, e os donos resolveram cobrar dos contratantes para poderem rentabilizar o negócio. O pagamento é feito por anúncio.

Para o freela, tudo pode ser gratuito, mas a plataforma também oferece uma versão premium, que dá algumas vantagens ao profissional, como: receber os anúncios antes dos demais, ser informado sobre quem viu seu currículo e ganhar desconto em cursos promovidos pela plataforma.

## 5\. Marketplace 100% gratuito

São raros, mas o mercado oferece marketplaces que são 100% gratuitos, tanto para anunciantes quanto para freelas. É algo parecido com a OLX, ou seja, um grande classificado em que as empresas ofertam vagas e os freelas escolhem para quem trabalhar.

O site de serviço gratuito é:

### [Vagas 3D]

Essa é a principal plataforma free do Brasil. Conecta profissionais e empresas para trabalhos temporários, freelas e empregos [**fixos.**] Não há qualquer cobrança de taxa ou comissão. Atualmente, pede apenas uma contribuição para ajudar a construir o novo seu site.

Bom, como você já percebeu, o que não faltam são marketplaces com os quais você pode trabalhar. Qual deles é mais interessante para você? É importante ressalvar que você precisa avaliar bem qual se encaixa melhor no seu perfil.

Antes de se inscrever, certifique-se do modelo de negócios da plataforma, quais as taxas cobradas e como é feito o pagamento. Se valer a pena para você, vá sem medo e comece a "freelar"!

Gostou do texto sobre marketplaces? Não deixe de ler também nosso artigo sobre [como organizar sua rotina de trabalho como freelancer].




Uma imagem vale mais que mil palavras: este é um dos ditados mais conhecidos e verdadeiros ao redor do mundo. Muitas vezes, uma imagem correta pode ser a diferença entre sucesso e fracasso. O melhor texto pode não significar muita coisa se a imagem que o acompanha desvirtua completamente a escrita.

Então, sabendo que o contato visual é crucial na comunicação, ter acesso a um bom banco de imagens com certeza fará toda a diferença no trabalho final.

Escolher a imagem ideal para uma peça publicitária pode ser mais difícil do que se imagina. Não é apenas escolher a que condiz com a ideia: é necessário que a figura tenha boa qualidade (para sobreviver aos redimensionamentos) e, principalmente, capte a atenção e faça com que o observador realize uma ação.

Para ajudar na busca da imagem ideal, existem diversos bancos de imagens onde você encontrará planos de fundo, vetores, vídeos e fotos de diversos temas, além de poder solicitar a designers peças personalizadas.

## Fotografia ou banco de imagens?

Algumas pessoas acham que um banco de imagens seria o equivalente a contar com um bom fotógrafo ou contratar um estúdio de fotografia, mas são coisas muito diferentes.

Contar com fotógrafos ou uma agência encarecerá de forma considerável o projeto, pois envolve muitos custos adicionais como deslocamento, aluguel de espaço, modelos, maquiagem, entre outros fatores.

No banco de imagens encontramos gravuras prontas, o que torna o custo muito menor, até porque uma mesma foto ou imagem pode ser utilizada por mais de uma pessoa.

**Naturalmente, na fotografia existe algo muito mais personalizado e exclusivo, o que pode ser um fator importante se o seu negócio depender disso (como para exibir produtos ou modelos vestindo suas roupas e acessórios, por exemplo), enquanto no banco de imagens o investimento é muito menor e a praticidade e diversidade muito maior.**

Caso ache necessário, pode contratar um freelancer para editar as imagens, tornando a peça exclusiva e mantendo o baixo custo. Portanto, se você quer ter um baixo investimento, uma grande gama de opções e excelentes peças, utilize um banco de imagens.

## Direitos autorais

É muito comum na internet encontrar sites que fazem uso das mesmas imagens. Em grande parte das vezes, elas são utilizadas sem os direitos de uso, o que pode acarretar diversos problemas para a empresa ou profissional, desde uma pequena reparação até condenação prisional, que está previsto na constituição.

No entanto, há esforços para reverter essa situação e fazer do uso de obras autorais algo que beneficie tanto o criador quanto o usuário. A [**Creative Commons**] é uma empresa não governamental nascida na Califórnia, Estados Unidos, que tenta revolucionar o mundo cultural no quesito “direitos de cópia". Trabalha no intuito de permitir o maior número de compartilhamento de imagens e obras culturais sem ferir os direitos autorais.

**Para isso, a empresa criou as [licenças Creative Commons]. Essas licenças foram criadas para padronizar as declarações dos artistas quanto ao licenciamento e distribuição de seus conteúdos. Assim, no que tange às imagens, você pode encontrar peças que possuam uma licença que permita o uso irrestrito delas, contanto que você dê os devidos créditos aos autores.**

Também há modalidades onde o uso é limitado, ou seja, a imagem só pode ser utilizada em determinadas mídias ou não pode ser modificada. Em todos os casos, porém, tudo é uma questão de verificar com calma os direitos de reprodução das peças que deseja manipular.

## Pagos ou gratuitos?

A grande maioria dos bancos de imagens oferecem os dois serviços. Os planos de imagens gratuitos contam com uma disponibilidade menor de imagens e qualidade oferecida é, em sua grande maioria, de menor qualidade.

Cada empresa utiliza critérios próprios para liberar as imagens gratuitamente, como por exemplo, inserir uma _tag_ para identificar a origem da imagem, disponibilidade da imagem com baixa qualidade ou com marcas d'água, necessidade de se cadastrar e receber newsletter, etc.

Os planos pagos contam com uma quantidade muito maior, todas as imagens são de altíssima qualidade e disponibilizadas em diversos formatos e tamanhos.

Antes de escolher por qual opção inciar, que tal conhecer algumas opções? Para ajudar na procura e sanar essas dúvidas, trouxemos algumas opções de bancos de imagens gratuitos e pagos. Confira:

## Bancos de imagens gratuitos

### Pixabay

Com mais de 840 mil conteúdos incluíndo fotos, ilustrações, imagens vetoriais e vídeos, o [Pixabay] é uma das melhores alternativas para banco de imagens por se tratar de conteúdos livres de direitos autorais sob a licença [Creative Commons CC0].

### Everystockphoto

Sendo, na prática, um sistema de buscas em variados bancos de imagens, o [Everystockphoto] possui um acervo quase infinito sobre vários assuntos. Para facilitar a busca do usuário, os temas mais procurados ficam destacados na lateral do site.

### Dreamstime

Com mais de nove milhões de fotografias, o [Dreamstime] contém uma enorme galeria de imagens. Ainda que seja um site gratuito, também podem ser encontradas imagens pagas. Outro detalhe interessante, é que no Dreamstime, fotógrafos podem vender suas artes e receber até 60% de comissão.

### Freeimages

Com milhares de imagens no acervo, o [Freeimages] é famoso entre os fotógrafos profissionais. O site possui um repertório de mais de 300 mil imagens gratuitas, todas em alta qualidade e baixáveis com a condição de um cadastro (também gratuito, não se preocupe).

## Bancos de imagens pagos

### iStock

O [iStock] oferece milhares de imagens e fotografias únicas. Os usuários podem utilizar os créditos iStock, que são vendidos em pacotes, para baixar os conteúdos desejados.

Com uma navegação por categorias, o site facilita a busca e torna simples a procura dos clientes no meio de milhões de opções de imagens. Além disso tudo, o site está disponível em português brasileiro.

### Fotolia

O [Fotolia] possui mais de vinte milhões de imagens. O site tem uma particularidade interessante: quanto mais você comprar, mais barato vai ficando o conteúdo. O Fotolia também é dividido em seções, além de disponibilizar uma ferramenta de pesquisa para facilitar a navegação. Um ponto negativo é que o site é totalmente em inglês.

### Shutterstock

Um dos mais populares bancos de imagens da internet, o [Shutterstock] possui mais de trinta e cinco milhões de imagens em alta resolução e em formato vetorial.

Tal como o Fotolia, este site possui uma peculiaridade interessante: se o usuário possuir um site ou blog que tiver um número considerável de visualizações, basta mencionar de onde foram retiradas as imagens do post que poderá pagar um valor diferenciado. Além de tudo isso, o Shutterstock também conta com uma área para compra de vídeos.

## Por onde começar?

Se você está [**começando agora**] ou se possui pouco dinheiro para investir, o mais indicado seria começar a trabalhar com imagens disponibilizadas gratuitamente. Outra boa alternativa é deixar o cliente escolher, incluindo o custo da imagem escolhida ao serviço prestado.

Ao ganhar experiência e aumentar a quantidade de clientes você pode migrar para um plano pago e conseguirá ter custos mais competitivos pelo volume. E por que não criar peças ou fotos, disponibilizar nesses bancos e aumentar a fonte de renda?

**Nesse artigo você conferiu a diferença entre o uso de fotografias próprias e de banco de imagens, a importância de contar com imagens licenciadas em seus projetos e várias alternativas de bancos de imagens grátis e pagos. Agora é só escolher a melhor opção e atrair os seus clientes com belas peças!**





Mais conhecida como autocomplete, ela não só vai evitar erros de digitação, mas também promover outros destinos de acordo com o que o cliente digitar no campo de busca.

Como podemos utilizar o **JavaScript** para nos auxiliar nessa tarefa?

## Começando o autocomplete

Atualmente os nomes das cidades que a agência oferece os pacotes estão armazenadas no seguinte array:

js

A primeira coisa que vamos fazer é criar uma **função** para o autocomplete que vai receber o destino como parâmetro e retornar para os usuários as opções.

js

Uma das vantagens do autocomplete é digitar uma ou duas letras e já receber algum resultado. Então temos que encontrar uma maneira de pegar a quantidade de letras que forem digitadas e verificar se existe alguma cidade que corresponde a essas letras e retornar os resultados para o usuário.

## Filtrando o array

Para evitar de encontrar divergências entre o que o usuário digita e o nome das cidades no array, precisamos padronizar o input do usuário para comparar com o nome da cidade de forma mais assertiva. Para isso, vamos colocar todas as letras digitadas em minúsculo usando o método [**toLowerCase**].

Quando fizermos a comparação,precisamos retornar uma nova lista, onde somente os dados que baterem com o que o usuário digitou devem estar presentes, para nos ajudar a [**filtrar**] iterando por todo o array.

js

Agora que já temos todas as cidade em minúsculo, para fazer a comparação e retornar a nova lista no filter vamos usar o método [**includes**]. Ele vai dizer se a string que digitamos, seja ela uma letra ou o nome todo da cidade, está na variável `valorMinusculo`. Caso a resposta seja verdadeira, retornamos essa string para o usuário.

js

Nosso código completo ficou assim:

js

Ótimo! O **autocomplete** foi criado, agora vamos exibir o resultado para o usuário =)

## Exibindo o resultado para o usuário

Temos dois campos no nosso HTML, um campo para o usuário digitar o destino e uma [`<ul>`] que vamos usar para exibir os resultados:

html

Primeiro temos que capturar os seletores do campo:

js 

Agora é só adicionar um evento ao campo de busca para quando o usuário digitar já trazer o nome das cidades automaticamente.

js

Como a variável `dadosDoCampo` está recebendo o que está sendo digitado, criamos uma condição: caso a string capturada pelo evento seja verdadeira colocamos o resultado dentro do campo `sugestoes` com a ajuda do [**innerHTML**].

A função autoComplete, nos retorna sempre um array. Precisamos gerar uma lista de elementos baseada na lista de sugestões, para "mapear" a lista de sugestões para elementos, vamos usar a função [**map**] que vai ser responsável por iterar pelos resultados e vai criar `li` com a resposta, não esquecendo de usar o `join` para devolver o resultado como string.

js

O nosso código agora com o evento ficou assim:

js

## Para saber mais

Uma outra maneira de fazer um rápido autocomplete é através das propriedades do HTML5 como [**datalist**] que vai representar um conjunto de elementos e a [**option value**] que representa um item.

html

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na **Alura** temos uma [**formação engenheiro front-end**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, dentre outras muitas coisas.





imagem 

Qual a diferença de Outbound para [**Inbound Marketing**]?

Neste episódio do Alura Live, a nossa co-host Giovana Delfino recebeu Adriano Almeida, chefe de vendas aqui da Alura e um dos diretores do grupo Caelum pra uma conversa sobre este termo que está tão na moda.

Tá afim de saber um pouquinho mais sobre o assunto? Então confere ai, que tá bem legal o tema! 😀

https://www.youtube.com/watch?v=UbUicCXoHt8

Conheça nossos cursos de [Marketing Digital]





A mudança no mundo das midias sociais é uma constante: novas plataformas, novas maneiras de se comunicar e alterações nas plataformas já existentes. Para se manter atualizado, é necessário estar lendo constantemente e acompanhando as novidades conforme elas saem.

## Videos ao vivo

Bom, essa é uma tendência que já é uma realidade para muitos. Aqui na Alura mesmo, nós já fazemos um programa ao vivo todas as quintas, o [Alura Live].

Transmissões ao vivo dão um pouco de frio na barriga, eu confesso! Mas depois que você pega o jeito, é muito divertido. E é legal porque estabelece uma conexão direta entre a marca (empresa, loja, etc) e seus seguidores. É uma ótima maneira de se aproximar, tirar dúvidas e criar intimidade com o seu público.

Além do Facebook Live, você pode fazer videos ao vivo através Twitter (com [Periscope], Instagram e também no [Google Hangouts].

Existem várias maneiras de explorar transmissões ao vivo: cobertura de eventos, perguntas e respostas sobre seu produto, lançamentos de novas funcionalidades, dia a dia dentro da empresa e muito mais. As possibilidades são inúmeras :)

## Suporte através das redes sociais

Quando você tem um problema com algum serviço ou produto, qual o canal mais comum de comunicação? E-mail. E e-mail não é ruim, mas é muito impessoal, pelo menos pra mim: você envia um e-mail e horas depois (às vezes) dias recebe uma resposta, que geralmente é um pouco automatizada, aquela coisa meio quadrada.

Mais e mais marcas estão utilizando o Facebook Messenger, WhatsApp e Telegram para se comunicar com seus usuários. As pessoas ficam genuinamente **felizes** quando enviam uma mensagem para nós através da [**página da Alura**] e nós respondemos em menos de 5 minutos. E não é só porque respondemos rápido: é porque a pessoa sabe que do outro lado tem um ser humano ali, falando com ela, esperando ela responder, "ouvindo" o que ela tem a dizer e o que ela precisa. E essa sensação é muito boa.

Existem algumas ferramentas que ajudam no suporte através das redes sociais, como o [Zendesk] e [Sprout Social].

## Migração do Snapchat para o Instagram Stories

Ano passado, o Instagram anunciou o [Stories], uma forma de compartilhar videos muito parecida (senão igual) à que o Snapchat se propõe.

Pouco tempo depois do lançamento, muita gente já migrou para o Stories. Isso foi bem perceptível pra mim: dos amigos que eu seguia no Snapchat, 90% não estão mais lá e só usam o Stories agora.

Algumas vantagens do Instagram sobre o Snapchat: -Tem uma base de [600 milhões de usuários], contra 150 milhões do Snapchat.  
\-O Instagram é do Facebook, quando você vai fazer anúncios nele pode se basear em Insights do Facebook, e vice-versa. -Você pode postar fotos e vídeos permanentes no seu perfil além das histórias, o que torna seu conteúdo mais "compartilhável".

## A luta contra notícias falsas

É cada vez mais comum encontrar pessoas que consomem pouca (ou nenhuma) informação por outro meio de comunicação sem ser a internet. E com isso, também aumentou a quantidade de sites bizarros de notícias falsas.

Noticias falsas podem ser criadas apenas pela zueira ou para gerar [desinformação] em quem as lê. No auge da polêmica política que rolou ano passado eu vi muita gente compartilhando notícias falsas. E o pior: muitas pessoas fazem isso sem nem ler a notícia, lêem apenas o título e compartilham.

O [Facebook já anunciou] uma ofensiva para as notícias falsas, algo que irá nos ajudar muito a filtrar o que é verdade do que é mentira.

Esse é um passo muito importante, já que muita gente se informa apenas pelas redes sociais.

## Realidade aumentada

Os filtros do Snapchat são demais, vamos combinar. Pokemon Go também foi uma sensação (mesmo que não por muito tempo) em 2016.

A realidade aumentada não é uma tecnologia nova, mas começou a se tornar viral por vários fatores, entre eles as redes sociais. É bem provável que outras plataformas comecem a brincar com esse recurso. O Facebook, por exemplo, [comprou um app chamado Masquerade], que altera rostos em selfies. Além disso, o [tio Mark já admitiu que eles estão brincando com realidade aumentada].

Ainda há muito espaço para este conceito crescer e melhorar em 2017. E assim como o video ao vivo, a realidade aumentada traz novas oportunidades das marcas se conectarem com seus usuários de formas originais :)





imagem 

Não é à toa que o LinkedIn é um dos queridinhos dos recrutadores e usuários em geral. Afinal de contas, o **LinkedIn é sinônimo de oportunidade**, tanto do ponto de vista de recolocação profissional como pela busca por parcerias de negócios e prospecção de novos clientes.

[Para se ter ideia, ele cresceu 25% em pouco mais de 1 ano.]

Pensando na importância disso, listaremos a seguir alguns pontos que podem demonstrar as vantagens de você saber usá-lo a favor da sua carreira ou negócio.

**Vitrine profissional** O LinkedIn é um espaço democrático onde você pode expor as suas experiências profissionais, descrever as suas competências (no que você é bom?), projetos em que for voluntário, cursos e certificações. Para alguns recrutadores e profissionais, a certificação é importante, e existem caminhos para alcançá-las, onde além do certificado, você aprende bastante. Inclusive para conhecer os cursos preparatórios para diversas certificações disponíveis na Alura. Então que tal usar esses recursos a seu favor? Simples: inclua as suas experiências profissionais, os projetos, os benefícios que o seu trabalho pode ter gerado para a empresa, por exemplo.

**Competências** Quais são as áreas que você domina? Aproveite para deixar o seu perfil recheado de competências. Quanto mais sincero você for, melhor. Quanto mais validadas, maior pode ser a percepção que as pessoas terão de você. Ou seja, a sua autoridade nessas áreas pode ser fortalecida a partir dessas competências.

**Cursos** Aproveite esse espaço para atualizar com os seus certificados. Se você tiver muitos, use os mais importantes. Quando inserimos cursos em nosso LinkedIn queremos demonstrar que somos profissionais atualizados e em busca do aprendizado. E quem não gosta de ver isso?

**Recomendações** Embora algumas pessoas não usem com frequência esse recurso, é importante falarmos sobre como as recomendações podem aumentam as nossas chances de sermos reconhecidos como autoridades dentro da nossa área de interesse. Uma coisa é eu falar que sou boa em algo, outra coisa é quando alguém fala que eu sou boa. Dica: Para conseguir recomendações, lembre-se de recomendar antes, aguarde alguns dias e se a pessoa não retribuir a gentileza, envie uma mensagem e pergunte se a pessoa gostou da que você fez e se é possível ela retribuir. Recomendações precisam ser genuínas, caso contrário, fica notável que a pessoa fez por qualquer outro motivo, menos porque de fato ela te conhece.

**Grupos** Participar de grupos pode gerar muitas oportunidades. Você pode conhecer pessoas com o mesmo interesse que os seu, trocar ideias sobre situações do dia-a-dia, descobrir novas alternativas de resolver problemas e pode criar oportunidades de negócios e parcerias. A dica para aproveitar melhor esse recurso é escolher de um até três grupos que estejam relacionados com os seus interesses e participar ativamente dos debates. Com o tempo você pode descobrir outros grupos e querer ficar mais neles. Isso é natural, o importante é adotar o hábito de visitar um grupo por dia para ver o que as pessoas estão falando e se for do seu interesse, interaja com elas.

**Pulse** Que tal compartilhar experiências profissionais, ideias e os seus últimos aprendizados em formato de artigo? O Pulse é uma plataforma dentro do LinkedIn que serve para você publicar conteúdo. Uma das vantagens é que toda vez que você postar algo novo, a sua rede será notificada, o que aumenta as suas chances de atingir mais leitores.

**Networking** O LinkedIn é a plataforma para você manter contato profissional com a sua rede de contatos e também com as pessoas que você conhecer através dos eventos presenciais. Lembre-se de que o mais importante é fazer com que as pessoas lembre de você, e não que você apenas colecione contatos. Com o tempo, é natural que a sua rede tenha muitos contatos, então, sempre na medida do possível, interaja com as suas conexões, seja através do envio de mensagens privadas, compartilhamento de conteúdo na sua timeline ou em comentários de postagens que você ler.

Buscamos reunir aqui as principais vantagens para você se beneficiar no LinkedIn. O dia-a-dia pode nos ensinar como aproveitar melhor cada recurso, mas se você quer descobrir de forma ainda mais direta e prática de como otimizar e promover o seu perfil, conheça o curso [**LinkedIn: como fazer o seu perfil trabalhar para você**]

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Você já parou para ler todos os anúncios que aparecem na sua timeline do Facebook?

imagem com o objetivo de converter _prospects_ (clientes potenciais) em clientes.

Mas como isso funciona na prática?

Vamos comparar dois exemplos a seguir.

A Escola do Designer SA decidiu seguir uma linha mais voltada à venda. Até ai tudo bem, mas será que não fica muito apelativo? Digo, dá a impressão que se a pessoa estudar lá, terá 100% de sucesso, e sabemos que isso depende de outros fatores.

imagem** **Publicar conteúdo relevante é o principal modo de agradar a Google.** Dizem que se você não está no Google, você não existe. Ok, pode parecer um tanto exagerado, mas pare para pensar: vamos supor que a sua empresa ofereça serviços na área de saúde e bem-estar. Será que ela vai aparecer na busca quando alguém pesquisar no Google?

imagem É uma boa maneira de se diferenciar da concorrência.** As pessoas só vão parar para ler algo que seja relevante para elas. Então será que se você seguir as mesmas estratégias, estar presente nas redes sociais apenas por estar vai ser bom para o seu negócio? O marketing de conteúdo fornece uma oportunidade para reinventar-se a cada nova criação, com cada peça. No marketing de conteúdo, não existem regras, tudo é descoberta.

Um bom exemplo disso é a Nubank que tem uma abordagem muito interessantes através das redes sociais.

Se você acessar páginas das empresas que oferecem serviços bancários, notará que eles usam uma linguagem mais formal para comunicar seus serviços e vai se deparar com um emaranhado de reclamações nos comentários. Mas ao visitar a página do Nubank, verá que eles usam uma abordagem diferente, mais amigável.

imagem O conteúdo permite o contato com o público-alvo em todas as fases do processo.** Então você conseguiu chamar a atenção do seu cliente. Legal, mas e depois? Até quando ele vai te acompanhar?

Bom, o Marketing de Conteúdo pode ser útil para você desde a atração até a manunteção de clientes. A grande jogada é descobrir como usar o conteúdo a seu favor.

Abaixo, podemos ver um exemplo interessante do Blog do Alura.

Esse post é para municiar o leitor que está iniciando ou tem interesse em começar na carreira de programador.

![exemplo-blog-alura]

Já nesse outro exemplo, o conteúdo pode ser útil tanto para o profissional que está iniciando na carreira como quem já atua.

![exemplo-alura-2]

O grande barato do marketing de conteúdo é conseguir descobrir o que compartilhar para ajudar os seus leitores, em diversos momentos da sua jornada.

E ai, gostou de conhecer algumas maneiras de trabalhar com o Marketing de conteúdo?

**Quel tal se aprofundar mais no assunto?  Acesse a Trilha de Marketing Digital no Alura, e confira como o [Curso Marketing de Contéudo: Uma introdução ao Marketing de valor] pode ser útil para você ou para o seu negócio.**

Quer ficar por dentro de assuntos sobre [marketing digital], [marketing pessoal], [personal branding] e [carreira profissional]? Conheça o blog da [Priscila Stuani] e fique por dentro das novidades!




Estou configurando a rede em um prédio onde funcionará alguns departamentos da Alura: Financeiro e Vendas.

Poderíamos colocar os dois departamentos na mesma rede, porém com isso teríamos alguns problemas:

- Como todos os computadores estariam se comunicando pela mesma via, ao mesmo tempo, a rede poderia ficar mais lenta;
    
- Um computador conseguiria "ver" o outro. Isso poderia fazer com que um usuário malicioso direcionasse algum tipo de ataque;
    
- Caso ocorresse algum tipo de problema em alguma parte da rede, ambos departamentos seriam afetados.
    

Então temos que configurar duas redes diferentes, cada uma relacionada a um departamento.

Em uma primeira abordagem, podemos configurar essas redes fisicamente separadas. Isto é, com um switch para cada departamento, assim como uma interface no roteador. Porém o custo disso seria mais elevado, já que precisaríamos de mais switches e de um roteador com mais portas.

Outra maneira seria separar logicamente o switch e o roteador, pois dessa forma, além de separarmos a rede entre os departamentos, estamos economizando também. Esse tipo de configuração é conhecida como [**VLan**].

## Entendendo as VLans

As VLans, nada mais são do que redes locais (Lan) virtuais. Ou seja, são redes lógicas configuradas em um mesmo [**ativo de rede**] (roteadores e switches, por exemplo). Com ela é possível dividir nossa rede em quantas partes precisarmos para o projeto.

Além da divisão e economia da rede, temos as seguintes vantagens ao implantar esse tipo de rede:

- Mais desempenho, já que o [domínio de broadcast] fica dividido entre as redes;
    
- Mais segurança, apenas os computadores pertencentes a VLan podem "ver" um ao outro;
    
- Conseguimos isolar melhor os problemas, como as redes estão separadas, o problema de uma não afeta a outra.
    

Bacana, agora que sabemos o que é uma VLan e como ela pode nos ajudar, como podemos implementá-la na nossa rede?

Para isso vamos dar uma olhada na nossa rede e ver como ela está distribuída:

imagem via terminal (`terminal`). Portanto:

`# configure terminal`

imagem`? Os switches e roteadores Cisco nos mostram em que modo estão. Neste caso no modo de configuração.

Agora podemos configurar nossas VLans, mas como identificá-las?

Para isto, cada VLan deve possuir um número de identificação única. Esse número pode estar entre [2 à 1005]. Já que nossos dois setores estão no térreo, vamos deixar os ids das VLans terminados em 0, assim saberemos o andar que elas estão. Assim nossa primeira VLan será `1`, seguido do `0`, ficando `10`.

Vamos dizer ao switch que queremos criar uma `vlan` que tem o id igual a `10`:

`(config) # vlan 10`.

imagem # vlan 20`.

imagem # vlan 10`

Neste modo, falamos que esta VLan terá o nome (`name`), neste caso, `Financeiro`:

`Switch(config-vlan)#name Financeiro`

imagem, no nosso caso é uma `fastEthernet` e a porta que queremos acessar, `0/1`.

imagem ficará no modo (`mode`) de acesso (`access`) a um dispositivo final (computador, notebook, servidor...).

`(config-if) # switchport mode access`

E também que essa porta (`switchport`) estará acessando a VLan `10`

imagem, do tipo `fastEthernet` de `0/2` até (`-`) a porta `fastEthernet 0/5`:

`(config) # interface range fastEthernet 0/2 - fastEthernet 0/5`

Agora informamos que essas portas estão conectadas a um dispositivo final e que acessarão a VLan 10:

imagem, para começar nossa configuração. Em seguida digitamos `configure terminal` para dizer que ele será configurado:

imagem # interface fastEthernet 0/0`

Já que queremos ligar essa interface, temos que falar para ela não (`no`) ficar desligada (`shutdown`). Com isso nossa porta já está habilitada.

`(config-if) # no shutdown`

imagem # interface fastEthernet 0/0`. E, para informar a subinterface, digitamos `.` (ponto) e o seu número, `10` por exemplo.

`(config) # interface fastEthernet 0/0.10`

imagem está associada a uma VLan. Logo, precisamos dizer que ela está encapsulada (`encapsulation`) em uma VLan (`dot1Q`) seguido do id da VLan.

`(config-subif) # encapsulation dot1Q 10`

imagem # ip address 192.168.0.1 255.255.255.0`

imagem # interface fastEthernet 0/0.20`

Dizer que ela está associada a VLan 20: `(config-subif) # encapsulation dot1Q 10`

E terá como endereço IP: `(config-subif) # ip address 192.168.1.1 255.255.255.0`:

imagem # interface fastEthernet 0/11`

imagem não está no modo (`mode`) de conexão a um dispositivo final, e sim em um modo em que junta todas as VLans (`trunk`).

`(config-if) # switchport mode trunk`

![]

Vamos testar novamente e ver se nossas duas máquinas conseguem conversar entre si:

![]

Sucesso! Agora temos duas redes separadas logicamente que conseguem se comunicar.

## Para saber mais

Veja que neste caso foi interessante juntar todas as VLans na porta trunk, porém existem casos em que nós precisamos isolar essas VLans escolhendo quais passarão pela porta trunk. Apesar de esse não ser a proposta desse post, você pode conferir [aqui] essa configuração..

## Conclusão

Vimos nesse post o problema que tínhamos ao conectar duas redes distintas e como as VLans seriam uma solução. Vimos como configurá-las nos switches e nos roteadores fazendo existir comunicação entre elas.

Gostou de redes? Essa é só uma pequena parte de muitas outras. Aqui na **Alura** temos uma [**formação em redes de computadores**] onde você aprenderá sobre VLans, protocolos, como configurar listas de acesso, segurança e muito mais!




Quantas vezes caímos na situação de necessitarmos de uma lista em nosso aplicativo?

Vimos uma forma bem simples de implementar uma lista no **Android** com `ListView` e `Adapter`. Além disso, vimos como melhorá-la, ou seja, personalizá-la com um `Adapter` personalizado e como reaproveitamos as `View`s por meio do `ViewHolder`.

Você pode conferir todos esses tópicos com mais detalhes [nesse artigo!].

Mesmo sendo pontos importantes para a implementação de uma **lista** no Android, reparou o tanto de passos que realizamos para criar uma lista "ideal" para a nossa app? Será que não existe uma forma melhor?

Para resolver esse problema de não sermos obrigados a manter a boa prática sem a preocupação com alguns detalhes (que veremos no decorrer do post) foi criado uma nova `View` para listas.

Para começarmos a utilizar, temos que trazer a lib como dependência do projeto:

groovy

## Inserindo o RecyclerView no layout

Já podemos começar a usar todos os recursos dessa biblioteca! Vamos iniciar colocando ela num layout:

xml

## Pegando a referência do RecyclerView

Por enquanto nada muito diferente do `ListView`: declaramos da mesma forma. Para usá-la precisaremos de uma referência para ela:

java

Tudo está bem tranquilo até o momento, mas ainda falta fazermos bastante coisa.

## Criando uma entidade e lista de exemplo

Como estamos tratando de uma view que mostrará uma lista, em algum momento teremos que fazer essa lista surgir magicamente em nosso código. Vamos criar uma lista de livros, para isso criaremos uma classe `Livro`:

java

E agora vamos utilizar nossa lista de livros na nossa `Activity` :

java

## Implementando o adapter do RecyclerView

Está faltando pegarmos essa lista e a colocarmos para ser exibida, da mesma forma que **ListView**, mas como transformávamos mesmo nossos objetos em **Views**? Precisávamos criar um **Adapter**:

java

Para nosso código compilar, o objeto que precisamos passar deve ser um Adapter. Então, nossa classe precisará ser um também :

java

Para nossa classe ser um `Adapter`, temos que sobreescrever alguns métodos:

java

Repare que nos deparamos com três **métodos** novos: **onCreateViewHolder, onBindViewHolder, getItemCount**, vamos entender um pouco mais sobre eles.

O mais fácil de matarmos logo de cara é o **getItemCount**, que é a quantidade de itens que teremos, então vamos deixar nosso código certo:

java

## Implementando o ViewHolder do RecyclerView

Vamos partir agora para o **onCreateViewHolder**, que é o método que criamos o `ViewHolder`, que fazíamos por boa prática no `ListView`. Além disso, é neste método que devemos inflar a view para vincular ao `ViewHolder`.

Como esse `ViewHolder` saberá fazer os **findViewById** que precisaremos? Ele é muito genérico, não conseguirá resolver este problema!

Mas nós, como ninjas da programação orientada a objetos, sabemos como resolver: iremos criar uma classe que herde desse tipo mais genérico e que faça o que nós precisamos! Veja:

java

O compilador está reclamando que a classe pai tem um construtor que precisa de uma `View`. Vamos solucionar isso:

java

Retornando ao problema inicial, agora podemos solucionar instanciando nosso `ViewHolder`:

java

Precisamos passar uma `View` para nosso código compilar:

java

Perceba que precisamos providenciar um `Context` para que nosso `LayoutInflater` possa funcionar direitinho :

java

E na nossa `Activity` :

java

Bacana, tudo certinho, agora basta vermos o que o último método faz e tudo certo!

## Populando cada item do RecyclerView

E agora o que ficou faltando fazermos? Apenas popularmos cada item, com as informações do livro.

É exatamente o que faremos no método `onBindViewHolder`, por isso recebemos um `ViewHolder`, aquele que foi criado no método `onCreateViewHolder`, com isso conseguimos popular de maneira que desejamos.

java

Terminamos. Vamos rodar, tirando do **banco de dados** com registros ou do webservice e temos esse resultado:

imagem

imagem, alterando apenas o tipo do `LayoutManager`?

Quer saber mais de **Android**? Aqui na **Alura** temos uma [**formação android**] completa !




Se você está ligado nos novos cursos da Alura deve ter notado que temos um [**curso novo**] sobre Maratona de Programação. Mas você sabe o que é?

## Entendendo a maratona

**A Maratona de Programação é um evento de nível nacional da Sociedade Brasileira de Computação que existe desde 1996 e é destinada a alunos de cursos da graduação ou do início de pós-graduação na área de computação.**

Legal, mas como funciona? Trata-se de uma competição em equipes de 3 pessoas que tentarão resolver em 5 horas o maior número de problemas que conseguir utilizando apenas 1 computador. O que achou? Desafiador né? Então vamos ver mais alguns detalhes:

> - Ganha a equipe que resolver mais problemas.
> - Em caso de empate, ganha quem fez em menor tempo.
> - A correção é feita em tempo real. Caso sua resposta seja julgada errada a equipe é imediatamente avisada e tem a oportunidade de remandar o problema, caso esteja certo, a equipe recebe um balão referente ao problema que acabou de acertar.

Isso mesmo, um balão, olha que bonito que fica:

![]

Além disso os balões são utilizados como referência, ou seja, você tem uma demonstração visual do desempenho das demais equipes, por exemplo, na imagem acima, vemos muitos balões azuis, logo, muito provavelmente o problema referente ao balão azul é um dos mais fáceis da prova, sendo assim, você deve começar com ele já que tempo é essencial.

## Conhecendo os tipos de problemas

A essa altura você deve estar se perguntando:

> _Mas que tipo de problemas aparecem nessa competição?_

Bem, os problemas envolvem programação dinâmica, teoria dos grafos, fluxo, estruturas de dados entre diversos outros campos da computação.

Calma, vou especificar um pouco melhor, olha aí um exemplo de problema para você tentar resolver:

![]

## Benefícios da maratona para o mercado de programação

Agora você deve estar pensando que isso tudo parece muito teórico e nada prático, então por que um bom desempenho nesta competição seria um diferencial no seu currículo? Vamos lá.

**Um bom maratonista sabe trabalhar em equipe, afinal, são 3 pessoas em apenas um computador, portanto vai bem a equipe que souber se comunicar e delegar melhor as tarefas que surgem.**

Também deve saber trabalhar sob pressão, não só por ter pouco tempo para fazer os problemas mas também saber controlar os nervos ao ver o desempenho dos seus demais concorrentes, por exemplo, imagine só você no meio da competição travado em um problema vendo balões chegando a todo momento, complicado né?

Como se tudo isso já não bastasse, o bom competidor deve ter raciocínio lógico rápido e programar com agilidade e precisão, afinal, erros custam muito tempo.

Agora pense bem, não são essas qualidades que as empresas procuram em seus profissionais?

É muito comum maratonistas em destaque serem contratados por grandes empresas como Google e Facebook devido à similaridade dos problemas da competição com os apresentados nas entrevistas técnicas dessas empresas.

## Ganhos além do currículo

Ainda não está convencido se deve ou não participar? Bom, indiretamente a Maratona te proporciona experiências incríveis.

As finais mundiais da competição são sediadas cada ano em um país diferente, você tem então a oportunidade entrar em contato com programadores do mundo todo, melhorar seu networking e ainda por cima conhecer diferentes culturas e lugares.

E então, vai participar? Para mais informações sobre a competição acesse esse [link].

## Algumas dicas para se preparar

Agora, caso você queira testar suas habilidades existem diversos sites que simulam a competição, dentre eles, eu recomendaria o [**codeforces**] que contém simulações online periódicas porém requer o domínio do inglês.

Além do codeforces também tem o [**URI**] que é excelente para quem está começando pois possui seus problemas separados por assunto, contando até mesmo com uma categoria especial voltada para iniciantes.

Além disso, vale lembrar que o URI é um site brasileiro e por isso seu conteúdo pode ser visto em português!





imagem 

Ultimamente, diversas empresas estão passando por esse processo e fazendo verdadeiras transformações em seus sites. Muitas vezes, essas transformações vão além do visual, facilitando a navegação e deixando a vida do usuário ainda mais simples. A [**Caelum mesmo passou por um redesign**] há um tempo.

Ao lidar com o processo de redesign de site, deve-se levar em consideração, além de todos os objetivos da companhia, a mensagem que ela deseja passar aos seus clientes, desde a fase de planejamento até a execução da ideia. Apesar disso, é importante notar que nem todos os elementos de design criados anteriormente precisam ser alterados com esse procedimento.

A verdade é que redesenhar o website é justamente isso: realizar modificações funcionais,que tornam o site mais amigável para o usuário, com o intuito de favorecer o alcance dos objetivos da estratégia de marketing da empresa.

No post de hoje, vamos explorar um pouco mais esse assunto para que você saiba por onde começar ao fazer o redesign de site!

## Quando devo considerar o redesign de site?

Existem diversas razões que provam a relevância do redesign do site para uma empresa e mostram como esse processo pode facilitar o alcance das metas. Abaixo, listamos algumas delas para que você entenda melhor. Acompanhe!

### 1\. Quando não se obtém os resultados esperados

Ainda que o site esteja ótimo e funcionando conforme foi programado, se ele não está gerando os resultados desejados, a reformulação do design é, com certeza, uma solução bem plausível.

Nesse caso, os dados presentes no site e o modo como as pessoas o acessam são ótimos indicadores daquilo que deve ser redesenhado no site para melhorar a experiência do usuário ao navegar por ele. Para facilitar, algumas perguntas podem ser feitas, como:

- O **Call To Action** (CTA) está convertendo os visitantes em [leads]?

- As páginas possuem um design bem trabalhado?
- Elas encorajam o usuário a passar mais tempo no website?
- A mensagem da empresa está sendo transmitida da forma correta ao público-alvo?

### 2\. Quando o site não tem um design responsivo

Hoje em dia, uma grande parcela do tráfego da internet deriva de dispositivos móveis, provando o caráter fundamental e a [**importância de sites responsivos**].

Se o site de uma empresa não é totalmente compatível com dispositivos como tablets e smartphones, ela pode perder visitantes e, consequentemente, possíveis clientes. Assim, é de extrema importância que as empresas enxerguem a responsividade dos seus websites como algo de alta prioridade. Um conselho é tentar pensar [**mobile first**] a fim de facilitar a adaptação desse novo layout para tamanhos de tela maiores.

### 3\. Quando a concorrência se atualiza

Claro que não é preciso fazer alterações no site sempre que a concorrência fizer isso. Contudo, se o concorrente fizer grandes mudanças que impliquem na melhoria da posição dele nos motores de busca, o site da sua empresa poderá ser prejudicado.

Dessa forma, é importante dar uma olhada nos sites dos concorrentes para que se tenha uma ideia de como alterar os objetivos do próprio site, antes de executar o processo de redesign. O importante, nesse caso, é apresentar melhores respostas aos atuais e possíveis clientes.

Lembrando sempre que o usuário do seu concorrente não é seu usuário. Se o concorrente mudar a cor padrão do site e apresentar crescimento de alguma forma, não é mudando para a mesma cor que acontecerá o mesmo com você.

### 4\. Quando há mudanças na estratégia de conteúdo

Por conta da colaboração para as campanhas de SEO, o conteúdo do website é sempre uma das prioridades. Entretanto, de que vai adiantar um conteúdo tão bom se o usuário não puder encontrá-lo?

Se o planejamento abrange alterar a estratégia de conteúdo ou expandir a produção de conteúdo para o blog da empresa, por exemplo, é muito importante que seja feito um novo desenho para o site, para que a comunicação com o usuário continue eficiente.

Acima de tudo isso, é importante que o visitante se sinta confortável para pesquisar e percorrer todo o site, além de localizar de forma prática tudo o que lhe interessar.

### 5\. Quando as ferramentas são modernizadas

Se temos um site que recorre a ferramentas externas para fornecer uma experiência completa — como um sistema de pagamento de uma loja virtual, por exemplo — é preciso que essas ferramentas sejam compatíveis e estejam de acordo com os [**padrões de funcionalidade atuais**].

## O que exatamente devo levar em consideração?

### 1\. Qual o impacto do novo design para o usuário?

O processo de mudança faz parte dos sites. Mesmo assim, muita gente cria uma barreira quanto à utilização daquilo que é novo, ainda que a mudança seja para a melhor.

Dito isso, é preciso ter bastante cuidado ao implementar um redesign completo no site, pois, além disso implicar numa mudança na forma de navegar, também é uma introdução a um visual totalmente novo.

Para que haja uma boa aceitação, essas mudanças precisam influenciar positivamente a experiência do cliente e, para isso, é fundamental que ele se sinta totalmente confortável.

Caso seja coerente, procure manter os títulos das principais seções do site. Também é válido criar uma página explicando a mudança, sendo esta uma ótima oportunidade para explicar as alterações no site e até mesmo pedir um feedback sobre a mudança.

### 2\. Qual a vantagem para a empresa de ter um site responsivo?

É mais viável desenvolver um [**site que seja totalmente compatível**] com desktop e dispositivos móveis. Isso ajuda a economizar a longo prazo, em comparação a ter dois ou mais projetos em desenvolvimento para diferentes tipos de aparelhos.

Além disso, é vantajoso para a empresa ter um site responsivo pois ele poderá ser facilmente acessado pelo cliente, não importando de qual dispositivo ele esteja acessando naquele momento. Isso impactará diretamente no número de visitas e, consequentemente, no número de compras realizadas — no caso das lojas virtuais.

### 3\. As estatísticas do site antigo foram analisadas?

Não há como olhar para um negócio sem imaginar as possibilidades de melhoria, não é mesmo? Ainda mais em pontos onde os clientes interagem de forma direta com a empresa.

Entretanto, assim como em qualquer outro projeto, para que possamos evoluir, é preciso saber onde estamos, antes de tudo. Assim, o primeiro passo deve ser fazer uma análise atenciosa das atuais estatísticas de visitas do site.

Talvez você esteja se perguntando quais estatísticas poderiam ser analisadas. Isso é relativamente simples, basta se basear na demanda ou necessidade vista nos dados. Se existe uma alta quantidade de usuários estrangeiros, não seria uma boa ideia lançar uma versão em inglês do site, por exemplo?

Além de se certificar de que está partindo do ponto certo, os dados analisados poderão ser comparados com os que serão obtidos futuramente, ajudando a melhorar cada vez mais o projeto.O Google Analytics é seu amigo.

### 4\. Que tal aplicar o flat design?

Ao utilizar o flat design pode-se ter uma [**estrutura visual mais plana**] sem abusar de cores e tipografias, o que torna a navegação pelo site mais simples e intuitiva.

Além de auxiliar na boa navegabilidade nos smartphones e tablets, o [**flat design**] facilita a compreensão do conteúdo e também na detecção de botões de ação e CTA.

É importante ressaltar que a aplicação desse tipo de design depende da intenção e linguagem de cada empresa e a identidade da marca. Logo, dê atenção a esse aspecto, ok?

### 5\. E se o usuário clicar em um link antigo?

Quando o redesign do site é realizado, é possível que também ocorram alterações nos endereços das páginas. Isso normalmente acontece, pois, ao montar um novo design, podem ser feitas alterações na estrutura de pastas ou a inclusão/exclusão de arquivos, a depender do caso.

Nesse caso, o problema é o desperdício de usuários, já que, quando eles vierem de antigos links espalhados pela internet, não encontrarão mais o site.

Já que é praticamente impossível que todos os endereços das páginas se mantenham intactos, registre todos os [**erros 404**], ou seja, todas as páginas não encontradas.

Além disso, também inclua os antigos endereços às páginas do site mais recente. Quando não fizer isso, pelo menos redirecione o usuário para a homepage do site quando uma mensagem de página não encontrada aparecer. Nessa hora o Google Analytics continua sendo seu amigo e consegue _trackear _esses 404.

A experiência do usuário é muito importante quando estamos criando, ou redesenhando um site. Aqui a Alura temos uma [**Formação em UX design**]. Nela você aprenderá sobre o que é User Experience, como entender as necessidades do usuário, como elaborar protótipos e muito mais.




Pensando em uma filosofia open source onde todos podem fazer uso de soluções de maneira gratuita e colaborativa, o que vamos fazer é aprender a criar uma **biblioteca Javascript** e publicá-la no **NPM**, por onde todas as pessoas terão acesso.

Nessa biblioteca vamos ter uma lista com os nomes de várias linguagens de programação que poderão ser usadas como base de dados. Para desenvolver esse projeto vamos precisar do [**node.js**] e do [**git**] instalados em nossa máquina.

## Clonando o repositório

Para começar, criamos um repositório no github e marcamos a opção de inicializar com o README. Com isso podemos trazer o repositório para o nosso computador através do comando **git clone <url do repositório>** e teremos uma resposta parecida com essa:

imagem podemos ver que todas as configurações estão lá:

imagem. Aqui precisamos fazer uso do **require** uma função embutida do nodejs responsável por incluir módulos em arquivos separados.

No nosso caso ela está incluindo **linguagens-de-programacao.json** dentro do **index.js** para que possamos usá-lo.

javascript

Quando as pessoas forem utilizar nossa biblioteca em seus projetos, elas precisarão usar o **require** para incluí-la dentro do código, então, precisamos exportar nosso código para que ele possa ser importado em outro lugar, e para isso vamos usar o [**module.exports**].

Dentro do module.exports temos um objeto que contém uma propriedade chamada **all** que vai exibir todas as linguagens quando for executada. 

js

Nosso código final ficou assim: 

js

Se fizermos um teste rápido no console do node fazendo um require no nosso entry point e depois executando **.all**, vamos ter o seguinte resultado:

![]

Podemos ver que ao chamar a **teste.all** conseguimos exibir todas as linguagens. Estamos quase no fim.

Porém nosso código está apenas no nosso computador, temos que enviar esses arquivos novos de volta para o github.

## Adicionando os arquivos no Github

Primeiro usamos o comando **git status** que vai nos mostrar os arquivos não monitorados,aqueles que criamos depois de clonar o repositório:

![]

Como podemos ver precisamos adicionar ao nosso repositório **src/** e **package.json**. Podemos adicioná-los de uma só vez com o comando **git add \*** e logo depois disso fazemos um commit **git commit -m “comentário”** para salvar as alterações:

![]

Por fim com o comando **git push**, mandamos as atualizações de volta para o repositório no github:

![]

Agora falta o último passo, publicar a biblioteca no npm para que todas as pessoas possam ter acesso.

## Publicando na npm

Na pasta do nosso projeto basta digitar o comando **npm publish** e pronto:

![]

Se voltarmos no site da npm podemos ver que nossa biblioteca foi publicada com sucesso [https://www.npmjs.com/package/nome-das-linguagens-de-programacao].

Podemos sair da pasta do projeto e instalar a biblioteca rodando o seguinte comando:

js 

Vamos fazer um teste?

## Testando nossa biblioteca

Depois de instalar a biblioteca, criamos um novo arquivo index.js e dentro dele fazemos um **require** do nosso pacote de imprimimos através do console.log: 

js

Rodando no nosso terminal temos o seguinte resultado:

![]

Ufa!! depois de criar a conta no github, no npm, configurar o git e criar nosso código Javascript, conseguimos publicar nossa primeira biblioteca no NPM!!!

E se quiser se aprofundar mais no front-end, aqui na **Alura** temos uma [**formação front-end**] para você começar do zero e se tornar um profissional de ponta. 




A facilidade de criar seu **podcast** e publicar em ferramentas como o Spotify cresceu muito. Ao mesmo tempo, vejo um possível grande problema se repetindo cada vez mais: a **captação do áudio** com baixa qualidade.

Um podcast sem uma excelente edição e cortes, porém com áudio bom, que faz com que você se sinta próximo as pessoas e narradores, é um produto bastante aceitável. O contrário não funciona bem: não adianta tentar fazer mágica com um áudio distante, cheio de reverberação, ruídos de fundo e palavras ininteligíveis.

Com um equipamento bastante básico é possível ter um resultado incrível, mesmo em salas que não sejam adequadas para gravação. Temos três podcasts gravados pelo grupo Caelum Alura: Hipsters Ponto Tech, Like a Boss e Carreira sem Fronteiras. O setup dos três é bem parecido e gostaria de compartilhar com vocês. Grande parte do aprendizado aqui veio da equipe da [Radiofobia].

## Microfone: ATR2100-USB

Minha preferência é usar cardioides direcionais: aqueles microfones que parece com o dos cantores de banda. Por quê? Pois dessa forma você não precisa de uma sala acústica, nem precisa se preocupar com o latido do cachorro do lado de fora da sua casa: ele basicamente só capta o som que estiver na direção dele.


imagem

O [ATR2100] foi uma recente descoberta: relativamente barato, bom e  possui entrada USB dispensando o uso de adaptadores ou interfaces diferentes com o computador.  É facilmente encontrado no Brasil. Outra opção, porém sem USB, são os populares [XM8500 da Behringer].

Nunca gostei dos microfones condensadores como os populares Yetis: eles captam até uma agulha que cai a 10 metros de distância na sala. Se você tem uma sala de música em casa, pode ser uma  opção viável. Não é o meu caso e a diferença no final será mínima para o podcast.

## Gravações externas: Zoom H6

O [Zoom H6] é um gravador portátil realmente leve, que comporta até 4 microfones (e 6 com um adaptador). Se você vai gravar com convidados, essa é de longe a melhor opção. Usa pilhas, tem um visor para acompanhar a gravação, consegue gravar cada microfone em um canal diferente e tudo em SD card. Eu consigo carregá-lo junto com outros 4 microfones e um headphone em uma pequena bolsa.

imagem

De quebra, o H6 pode ser usado como interface entre um microfone XLR e o computador. As alternativas são usar um Tascam ou uma mesa da Zoom.


## Software de comunicação: Google Hang Outs

Aqui vai um pouco do gosto de cada um. Skype ou Hangouts são as opções mais óbvias, mas há outras. O Whereby (antigo appear in) é um serviço para as pessoas se conectarem sem necessidade de logins e senhas, além de ferramentas como o zencastr (que eu e colegas já tivemos muitas dores de cabeça).

## Software de gravação: Audio Hijack

Novamente influenciado pela equipe da Radiofobia, eu utilizo o [Audio Hijack] para Mac, que permite definir de onde gravo o som, em que arquivo, formato, etc.

Para o Windows, há o software grautito [OBS Studio], que também funciona nas outras plataformas. Para o Skype há o plugin _ecamm_ que dizem funcionar bem.

Você pode aprender muito mais com o [curso de podcast do Leo Lopes] aqui na Alura.






imagem 

Neste episódio do Alura Live, recebi Rodrigo Turini, líder da equipe de desenvolvimento da Alura que também é entusiasta do Java 9 e seu fiel escudeiro e estagiário de desenvolvimento, Philippe Ehlert, para batermos um papo sobre as novidades e as novas tendências dessa nova versão do Java que vem dando o que falar.

Fique por dentro das novidades da versão 9 do Java.

https://www.youtube.com/watch?v=RQor1jDHi1g

Achou legal esse vídeo? Assista o [episódio completo]!

Dê seus [primeiros passos com Java] e [orientação a objetos].

Quer começar uma carreira como desenvolvedor ou se aprofundar nos conceitos mais avançados? Conheça nossas carreiras: [Desenvolvedor Java Junior] e [Avançando na Plataforma Java].

Veja outros cursos e carreiras na [Alura]!

Não deixe de seguir: [Rodrigo Turini], [Philippe Ehlert], a [Alura] e [euzinho] no Twitter! :D




Criar um objeto em JavaScript é bem tranquilo:

javascript

Como faríamos pra ter um segundo produto, com o mesmo cálculo de desconto? Assim:

javascript

Puxa... Perceba que repetimos _exatamente_ o mesmo código no método `calculaDesconto` para os dois produtos. Além disso, repetimos o nome dos outros atributos, correndo o risco de digitá-los errados.

Como resolver isso? E se pegassemos a estrutura comum dos produtos (ter nome, preço e poder calcular desconto) e colocássemos em uma função `criaProduto`? Algo como:

javascript

Perceba que na função `criaProduto` retornamos um objeto que terá sempre os nomes de atributos. Além disso, não repetimos o código da função de desconto :)

Interessante! E o mais bacana é que o JavaScript já vem com uma sintaxe para definir a estrutura comum entre os objetos:

javascript

Observe que:

- não precisamos retornar nada
- as propriedades são definidas com `this`
- é usado `=` ao invés de `:` para atribuir
- as linhas são separadas por `;`
- ao criar os produtos usamos o `new`

A sintaxe anterior é a maneira correta de definir a estrutura para seus objetos e é chamada de **construtor**. Essa estrutura comum dos objetos muitas vezes é chamada de _classe_.

Na nova versão da linguagem JavaScript, o _EcmaScript 2015_, há uma outra maneira de criar um construtor (e a classe):

javascript

Repare que:

- temos uma `class`, e não mais uma `function`
- definimos os atributos dentro de `constructor`
- o método `calculaDesconto` fica a parte, sem o `this`


**A linguagem Javascript tem vários recursos poderosos. Nossos [cursos de Javascript] da Alura e a [Formação Front-End] da Caelum podem te ajudar a aprofundar nessa linguagem :)**




Sou monitor de um professor na faculdade e uma das minhas tarefas é corrigir alguns trabalhos.

A turma tem uns 40 alunos e eles farão 3 trabalhos ao longo do semestre. No final do curso, preciso fazer um relatório para o professor, indicando quais alunos estão de recuperação, reprovados ou aprovados.

Rapidamente fiz um programa em Python que lê uma lista de alunos e suas notas e imprime na tela a situação de cada um. O código ficou mais ou menos assim:

python

Não tem problema se você não manja de Python, o importante aqui é entender que esse código lê várias linhas do teclado na forma:

```
 Nome do aluno;
 Nota1;
 Nota2;
 Nota3

```

E imprime na tela algo como:

```
 Nome do aluno: Aprovado

```

A execução do código é a seguinte:

```
 $ python media.py > João da Silva;8;7;9 João da Silva: Aprovado > Larissa Souza;10;9;10 Larissa Souza: Aprovado > Mario Oliveira;5;4;5 Mario Oliveira: Recuperação > Pedro Carvalho;3;0;1 Pedro Carvalho: Reprovado

```

Embora o programa funcione, existem alguns detalhes que ainda dificultam a rotina de gerar o relatório, vamos entender quais são:

- O programa imprime imediatamente depois que digito, deixando o resultado final confuso.
- Dá muito trabalho rodar de novo. Se eu esquecer de um aluno, preciso digitar 40 nomes com 3 notas cada de novo.

Se o programa lesse os alunos e notas de um arquivo, daria para modificar só uma linha facilmente. Uma opção é alterar o código para trabalhar com arquivos. Essa alternativa é viável porque o código é meu e eu sei trabalhar com Python. Ficaria mais ou menos assim:

python

## Entendendo o redirecionamento

Nem sempre temos o luxo de ter acesso ao código fonte dos programas que usamos. Então como podemos fazer para ler as informações de um arquivo e direcionar cada linha para o nosso programa sem mexer no código?

Em sistemas baseados no Unix (como é o caso do Linux e do Mac), todos os programas são associados a uma **entrada e saída padrão**. Em geral, a entrada é o teclado e a saída é a tela (terminal). Podemos **redirecionar** tanto a entrada quanto a saída padrão de qualquer programa sem mexer no código, podendo facilmente ler e escrever em arquivos.

### Redirecionando a entrada

Para **redirecionar a entrada** do código original, basta utilizar o caractere `<` na hora de rodar o programa, indicando um arquivo de entrada. Então vamos criar o arquivo `notas.txt` com o conteúdo:

```
 João da Silva;8;7;9 
 Larissa Souza;10;9;10 
 Mario Oliveira;5;4;5 
 Pedro Carvalho;3;0;1

```

Rodando o programa da seguinte forma:

python

O resultado já ficou muito melhor. Agora posso copiar e colar a saída e mandar para o professor tranquilamente. Também posso mudar o nome do arquivo a ser lido com facilidade.

### Modificando o código para escrever num arquivo

Já melhorou bastante, porém estamos lidando apenas com 4 alunos. E se fossem 1000? Copiar 1000 linhas do terminal não é nada produtivo. Seria uma boa jogar a saída num arquivo também, certo?

Podemos fazer isso modificando o nosso código, da seguinte forma:

python

Observe que modificamos algumas boas linhas de código. Meio trabalhoso, não acha?

### Redirecionando a saída

Que tal utilizarmos o redirecionamento também? É muito mais cômodo porque não vamos mexer em código.

Para **redirecionar a saída** do código original, basta utilizar o caractere `>` na hora de rodar o programa, de forma semelhante ao redirecionamento da entrada:

text

E se olharmos o conteúdo de `resultado.txt`, veremos:

```
 João da Silva: Aprovado Larissa Souza: Aprovado Mario Oliveira: Recuperação Pedro Carvalho: Reprovado

```

### Redirecionando entrada e saída ao mesmo tempo

Uma coisa legal sobre o redirecionamento é que podemos fazer uma combinação. Não há nenhum problema em redirecionar tanto a entrada quanto a saída, isto é, podemos realizar o redirecionamento de saída e entrada **ao mesmo tempo**, veja como:

```
 $ python media.py < notas.txt > resultado.txt

```

Quando fazemos esse redirecionamento o nosso programa primeiro lê o arquivo `notas.txt` e depois escreve em `resultado.txt`.

## Truncamento

Agora os principais detalhes foram resolvidos, vou corrigir os trabalhos e gerar o relatório para o professor.

Como a turma é tanto para alunos do curso de Ciência da Computação como para alunos de Sistemas de Informação, decidi colocar as notas em dois arquivos diferentes: `notas_cc.txt` e `notas_si.txt`. Seus conteúdos são mais ou menos o seguinte:

```
notas_cc.txt Julia Aparecida;8;9;9 Gabriel Russo;2;4;2

notas_si.txt Danilo Gomes;10;9;10 Horacio Soares;5;7;4

```

Vou rodar meu programa duas vezes e meu relatório estará pronto:

```
 $ python media.py < notas_cc.txt > resultado.txt $ python media.py < notas_si.txt > resultado.txt

```

Olhando o conteúdo de `resultado.txt`:

```
 Danilo Gomes: Aprovado Horacio Soares: Aprovado

```

O que houve com os alunos de Ciência da Computação? Eles deveriam estar no arquivo também.

O problema é que quando redirecionamos a saída de um programa para um arquivo, o sistema operacional **trunca** o arquivo antes, isto é, apaga todo seu conteúdo. Não é isso que queremos... E agora?

Podemos redirecionar a saída com os caracteres `>>`, que fazem exatamente a mesma coisa com a diferença de que o arquivo não é truncado. Veja:

```
 $ python media.py < notas_cc.txt > resultado.txt $ python media.py < notas_si.txt >> resultado.txt

```

Na primeira vez, truncamos o arquivo e escrevemos. Na segunda, apenas escrevemos. Olhando para o conteúdo de `resultado.txt` vemos:

```
 Julia Aparecida: Aprovado Gabriel Russo: Reprovado Danilo Gomes: Aprovado Horacio Soares: Aprovado

```

## Para saber mais

Além de ler e escrever em arquivos, com esses redirecionamentos é possível fazer os programas conversarem, ou seja, podemos redirecionar a saída de um programa para a entrada de outro.

O programa [`ps`] com a flag `-x` imprime todos os processos que estão rodando nesse momento. Muitas vezes, esta lista é enorme e fica muito difícil procurar um processo. Podemos utilizar o programa [`grep`] para filtrar esses resultados.

O `grep` funciona de várias formas, mas uma delas é procurar um texto na entrada. Mas como redirecionar a saída do `ps` para a entrada do `grep` ?

Poderíamos utilizar um arquivo para guardar a saída e depois utilizá-lo como entrada, porém podemos fazer isso diretamente utilizando o caractere `|` (chama-se _pipe_). Basicamente, pegamos a saída padrão de um programa e jogamos para a entrada padrão de outro. Vamos ver um exemplo:

```
 $ ps -x | grep Eclipse 41891 ?? 0:37.48 /Users/gabriel/Applications/Eclipse.app/Contents/MacOS/eclipse

```

Agora que eu sei que meu processo tem o _PID_ 41891, eu posso rodar `kill 41891` para fechar o Eclipse travado.

## Resumindo

Nesse post aprendemos que é possível ler e escrever em arquivos sem precisar mexer no código de nossos programas. Para fazer isso, utilizamos os seguintes redirecionamentos:

- `<` para redirecionar a entrada
- `>` para redirecionar a saída truncando (apagando) o arquivo
- `>>` para redirecionar a saída sem truncar o arquivo

Que tal aprender mais sobre o Shell e Linux no geral? Aqui na Alura temos diversos cursos online de [**Linux**] para você aprender desde a estrutura básica do Linux como também os principais programas e comandos desse sistema operacional.




Na Alura, alunos fazem diversos cursos de diversas categorias. Queremos visualizar isso. Pense por exemplo um aluno que faz [**5 cursos de programação**] e [**2 de design**] pode ser representado como (5,2) enquanto uma aluna que fez 10 de design e 1 de programação como (1,10). Portanto se tenho duas dimensões (programação e design) os estudantes caem num plano em R^2 (estritamente positivo) que pode ser facilmente plotado.

Pensando em estudantes que fazem muitos ou poucos cursos, podemos gerar uma quantidade (1000) aleatórias de cursos que eles fazem em Python:

py 

E imprimir dois exemplo de muitos cursos feitos e poucos cursos feitos:

py 

Com a saída:

py 

Ótimo, somos capazes de criar agora um conjunto de dados de alunos que fazem muitos cursos de programação e poucos de design, por exemplo:

py 

Tendo como exemplo de resultado:

py 

Ótimo, somos capazes então de criarmos um conjunto de dados aleatório de alunos e alunas que fizeram mais programação e mais design:

py 

Agora podemos usar a biblioteca `seaborn` para plotar os alunos:

py 

imagem, o gráfico permite visualizarmos os 3 grupos de alunos de maneira clara. Isso pois o grupo de mobile foi gerado intencionalmente com um número baixo de cursos de programação e design.

É comum em situações como essa desejarmos colorir cada ponto de acordo com uma característica ou categoria. Vamos definir uma categoria (texto) para cada ponto:

py 

Que resulta em uma coluna nova chamada categoria, indicando o que escolhemos para esse grupo:

py 

Ótimo, mas o código está bastante repetitivo, que tal deixarmos valores padrão de poucos cursos para todos os cursos que não passarmos?

py 

Pronto, vamos indicar no plot que queremos o tom de cor (`hue`) de acordo com a coluna categoria:

py 

py 

imagem para determinar a cor. O `scatter` do `matplotlib` é mais baixo nível e requer, nessa situação, strings que condizam com cores reais, e não categorias. Uma maneira de fazer isso é mapearmos cada categoria para uma cor com um dicionário:

py 

E agora usarmos uma lambda para mapearmos a coluna categoria pra a cor:

py 

![]

[Você pode encontrar todo o código desse primeiro post no github]. Dentre [**alguns dos cursos existentes de Data Science e Machine Learning na Alura**], [**o plot de dados em diversas dimensões é fundamental para explorar os mesmos**].




Estou desenvolvendo um sistema de vendas web utilizando [**Spring Boot**] e agora o cliente pediu algumas funcionalidades um pouco peculiares...

Ele deseja saber como está o fluxo de vendas por um determinado período, por exemplo, a cada hora, ou então, a cada dia... Como será que podemos fazer essa rotina que irá realizar essas tarefas agendadas?

### Utilizando a API Timer do Java

Inicialmente, em uma implementação utilizando as APIs disponíveis em Java, poderíamos fazer uso da classe [`Timer`]:

java

Em seguida, faríamos uso do método `scheduleAtFixedRate()` que espera uma implementação da classe abstrata [`TimerTask`] como primeiro parâmetro e mais dois parâmetros do tipo `long` que indicam o início da execução e tempo constante para reexecutar sucessivamente em **milisegundos**:

java

Em outras palavras, neste exemplo estaríamos executando o código, inicialmente, depois de um segundo, e então, todas as vezes após 5 segundos!

Considerando esse exemplo, para que conseguíssemos realizar aquela consulta para o cliente que verifica o fluxo de vendas de um determinado período, como por exemplo, uma hora, faríamos algo como:

java

Em outras palavras, poderíamos criar uma classe responsável em ficar verificando as vendas realizadas a cada uma hora e nos devolveria a resposta que o nosso cliente tanto espera!

## Utilizando a annotation @Scheduled

Porém, veja a quantidade de código que tivemos que escrever para que fosse possível realizar essa tarefa! Neste caso, já que estamos utilizando o Spring, será que não tem uma forma mais fácil?

Felizmente, temos a annotation [`@Scheduled`] que já faz todo o papel do `Timer` e `TimerTask` pra nós! Em outras palavras, faríamos a mesma coisa que fizemos anteriormente da seguinte maneira:

java

Veja que o código diminuiu e muito! Porém, o que está acontecendo agora? No momento em usamos a annotation `@Scheduled` indicamos ao Spring que aquele método será agendado.

Além disso, veja que está sendo enviado o parâmetro `fixedDelay`, esse parâmetro é equivalente ao último parâmetro do método `scheduleAtFixedRate()` da classe `Timer`, ou seja, é o tempo fixo que sempre vai ficar rodando!

Também podemos usar outros parâmetros caso for necessário, segue alguns exemplos:

- **initialDelay**: Configura a espera inicial do agendamento, basicamente ele é equivalente ao primeiro parâmetro do método `scheduleAtFixedRate()`. Ele também recebe valores `long` indicando os milisegundos.
    
- **fixedRate**: Configura um período fixo entre o início e fim da execução do agendamento.
    

Observe que estamos fazendo a mesma coisa que fazíamos antes, porém com um código muito mais simples de ser compreendido!

## Configurando o agendamento no Spring

Conhecemos o Spring como um framework que facilita e muito a vida do desenvolvedor, isto é, com pouca configuração ele é capaz de gerenciar o ciclo de vida dos objetos entre diversas outras coisas...

Porém, para que isso seja possível, pelo menos uma vez, precisamos indicar ao Spring que ele tenha esse tipo de comportamento! Portanto, para rodarmos o agendamento das tarefas com o Spring, será necessário realizar algumas configurações também.

### Transformando a classe em Component

A primeira delas é fazer com que a classe que esteja utilizando a `@Scheduled` seja gerenciada pelo Spring. A forma mais fácil de fazer isso é basicamente tornando-a um [`Component`] por meio da annotation `@Component`:

java

### Habilitando o agendamento

Agora que a classe está sendo gerenciada, precisamos apenas informar ao Spring que queremos habilitar o agendamento para ela por meio da annotation `@EnableScheduling`:

java

Pronto, a nossa classe já está configurada! Agora basta apenas reiniciar o seu projeto do Spring Boot que o agendamento rodará!

Lembrando que para realizar um teste mais perceptível utilize a base dos segundos no parâmetro `fixedDelay` ou `fixedRate`. ;)

## Agendamento por um determinado horário do dia

Veja que agora conseguimos solucionar a situação em que o cliente queria ver a quantidade de vendas a cada 1 hora, ou seja, fizemos um agendamento a cada X tempo. Entretanto, se o cliente chegar e falar o seguinte:

> _"Quero também um relatório que me mostre quantas vendas foram realizadas até a meio dia de todos os dias!"_

E agora? Como poderíamos fazer? Bom, uma solução inicial seria fazer com que a nossa task iniciasse às 12:00h, e então, ela tivesse um tempo fixo de 24:00h, certo? Dessa forma, todas as vezes que passe às 24:00h seria a meio dia de cada dia...

Entretanto, veja que esse tipo de solução não é adequada, afinal, teremos algumas complicações dependendo de alguns cenários, por exemplo:

- **Aplicação (servidor) reiniciando**: O período de 24:00h não seria mais válido.
- **Mudança de horário**: Dependendo do cambio do horário teríamos 1 hora a mais ou a menos, ou seja, mais um preocupação.

E agora? Será que tem alguma forma de contornar essa situação?

## Agendamento com o Cron

Considerando todos esses cenários, o ideal seria fazer uso de algum tipo de recurso que permitisse de fato configurar de uma forma mais específica, os minutos, horas ou até mesmo o dia que o determinado agendamento será executado.

Um dos mecanismos utilizados em sistemas baseados no Unix (como é o caso do Linux), para o agendamento de tarefas de uma forma mais pontual, é o [Cron].

Basicamente o Cron é um programa que permite realizarmos a execução de jobs em um determinado período, como por exemplo: a cada A segundos, B minutos, C horas no dia D execute uma tarefa!

Todas as definições são feitas por meio de um recurso chamado [**Cron Expression**].

### Exemplos do uso do Cron

Abaixo seguem alguns exemplos de execução do Cron utilizando Cron Expression:

- **A cada segundo**: ```
 "1"
    
    ```
- **Todos os dias que o horário tiver ao menos `01` segundos**: ```
 "1"
    
     Exemplos: 11:22:01, 11:23:01...
 "0 0"
    
    ```
    
    Exemplos: 00:00:00, 01:00:00...

### Significado de cada campo do Cron

A princípio o Cron pode parecer algo muito bizarro, porém, cada campo possui um significado bem especificado. Abaixo é listado o que cada campo significa junto com seus valores esperados:

```
 A B C D E F

```

- **A**: Segundos (0 - 59).
- **B**: Minutos (0 - 59).
- **C**: Horas (0 - 23).
- **D**: Dia (1 - 31).
- **E**: Mês (1 - 12).
- **F**: Dia da semana (0 - 6).

Note também que nos exemplos foram usados o `*`, esse caracter indica que para o campo específicado qualquer valor será considerado.

**Observação**: Quando fazemos uso do `"/"` concatenando algum valor, indicamos o seguinte: para cada (`/`) X (valor numérico) repetição acione, em outras palavras, `*/1` indica que se qualquer valor do campo **segundo** mudar será acionado, logo, se fosse `*/2`, a cada 2 vezes que o campo **segundo** mudar de valor, será acionado.

## Usando o Cron no Scheduled

Tendo conhecimento de todo o poder do Cron nessa pequena demonstração, seria superbacana usar um recurso similar ao Cron no `@Scheduled`...

Felizmente podemos também fazer uso dele por meio do parâmetro `cron`, ou seja, para executar aquele agendamento que pegaria as vendas todos os dias ao meio dia poderia ser feito da seguinte maneira:

java

Nessa Cron Expression temos uma execução de todos os dias ao meio dia!

## Cuidados ao usar o Cron

Embora o Cron resolva o nosso problema de executar uma tarefa em um período bem específico, existe uma situação que pode ser problemática, que é justamente a [Time Zone]. Em outras palavras, se o local no qual o seu software estiver hospedado tiver um Time Zone diferente do seu, o horário de meio dia pode ser que não seja igual ao seu!

**Dessa forma, o Cron causaria mais problemas do que resolveria... E agora?**

Como sempre a gente vê, há sempre aquela flexibilidade em configurações quando usamos o Spring, e com o agendamento de tarefas não seria diferente! Ou seja, podemos também definir sob qual Time Zone a `@Scheduled` será executada por meio do parâmetro `zone`! Então ficaria da seguinte maneira:

java

Veja que agora estou enviando o Time Zone `America/Sao_Paulo` que é justamente o Time Zone utilizado aqui em São Paulo - SP, portanto, o agendamento poderá ser executado sem a preocupação de onde o projeto esteja alocado!

Querendo conhecer o Spring? Que tal começar hoje mesmo na Formacao de [**Desenvolvedor Java Web com Spring**]? Nesta seleção de cursos, você irá aprender a criar uma aplicação Web bem robusta desde o zero com um dos frameworks mais famosos do mundo Java! Veja também todo nosso conteúdo de [**Java, Web, Spring, Hibernate, Testes e mais**].




O número de cursos da Alura vem crescendo bastante e com isso temos um bom problema: qual curso devo realizar primeiro? E depois, para onde ir?

## Novas formações Alura!

Pensando nisso, eu tenho um anúncio bem interessante para fazer hoje: estamos lançando as formações Alura. São inicialmente [**seis formações**]:

- [Formação Engenheiro Front-end];
- [Formação Desenvolvedor Android];
- [Formação UX Designer];
- [Formação Desenvolvedor Java];
- [Formação Desenvolvedor .NET];
- [Formação Motion Designer].

![]

As formações são algo bem mais interessante que um simples conjunto de cursos: **são verdadeiros guias** para você entregar o resultado que precisa. Além dos cursos, há posts para blogs, podcasts, videos no youtube e muito mais.

## Projetos de Conclusão de Formação

E, para alunos Premium Plus novos e antigos, temos uma outra novidade: no final da formação você pode entregar um projeto final, seguindo requisitos propostos pela formação, e tê-lo avaliado pelos nossos instrutores e monitores, com um certificado de avaliação e feedback.

Alteramos também os planos de acordo com os recursos que vocês mais usavam. O plano Premium Plus reformulado dá acesso a Alura Start e aos projetos e avaliações da formação. E o acesso à Alura Lingua ficou para o novo plano Max. Quem já era aluno dos antigos planos continuam com os mesmos recursos e quem era Premium Plus ainda ganha o acesso aos projetos e avaliações.

Então, se você tinha dúvidas de quais próximos passos dar nos seus estudos, que tal conhecer melhor as seis primeiras formações da Alura e se organizar para esse desafio? E se não conhece ainda a Alura, temos uma nova [**página mostrando como é estudar com a gente**]!




Estou estudando aprendizado de máquina e, para isso, criei um algoritmo que tenta predizer quais times de futebol podem ganhar na rodada.

O algoritmo utiliza de quatro perguntas:

- O time joga em casa?
- Teve algum jogador expulso?
- Está perto da zona de rebaixamento?
- O time ganhou?

Para treinar o algoritmo, eu utilizei dados de diversos times, vindos de um arquivo CSV. No arquivo, esses dados estão agrupados dessa forma:

python

Respondemos as perguntas com os números `1` para sim e `0` para não. Por exemplo, o primeiro time jogou em casa, não teve jogador expulso nem está perto da zona de rebaixamento, e ganhou o último jogo. Enquanto o segundo time jogou em casa e teve um jogador expulso, ele não está perto da zona de rebaixamento nem ganhou o último jogo.

Já temos alguns dados disponíveis para serem usados, portanto, vamos começar a treinar nosso algoritmo!

## Treinando a máquina

O **Python** é uma linguagem muito utilizada para análise de dados e aprendizagem de máquina,por isso, vamos utilizá-la para criar nossos modelos.

Nosso algoritmo precisa conhecer nossos dados para começar a "adivinhar" os resultados. Esses dados estão salvos em um arquivo CSV, onde cada linha representa um dado sobre um jogo de um time.

Para treinar nosso algoritmo, antes precisamos abrir esse arquivo. Vou utilizar o [**Pandas**] para conseguir abrir o CSV no Python.

O Pandas lê o nosso arquivo CSV e nos retorna um objeto com nossos dados agrupados como se fossem uma tabela, esse objeto é conhecido como um [**data frame**].

Esse data frame tem todos os nossos dados. Contudo, nós temos dois tipos de dados diferentes, os dados que o algoritmo usa para chegar aos resultados - se o time joga em casa, por exemplo - e as marcações - se o time ganhou.

python 

Bacana! Já temos nossos dados e marcações separados, agora podemos treinar nosso modelo.

> Mas como o nosso algoritmo vai conseguir classificar os jogos?

Existem vários algoritmos para o aprendizado de máquinas, um bem conhecido é o [**Naive Bayes**]. Com esse algoritmo, vamos conseguir classificar se um time vai ganhar ou não dependendo das variáveis como se ele joga em casa ou não.

Na biblioteca [**Scikit-learn**] temos algumas implementações do algoritmo Naive Bayes. Podemos falar para o Python importar do módulo `naive_bayes` da Scikit-learn (`naive_bayes`) o algoritmo **MultinomialNB**, que é uma das implementações do **algoritmo Bayesiano**.

python 

Criamos nosso modelo, precisamos treiná-lo agora. Mas se nós usamos todos os dados para treinar o nosso modelo, como podemos validar depois?

## Dividir e treinar

Se nós utilizarmos todos os nossos dados para treinamento, não conseguiremos validar o nosso algoritmo. Quer dizer, até conseguimos utilizar os mesmos dados para testar o aprendizado, mas o algoritmo já os conhecerá, ou seja, não teremos um cenário "desconhecido" para realizar o teste.

Pensando nisso, o que podemos fazer é separar uma parte dos nossos dados em dados de treino e dados de teste:

python

Agora basta falar para o nosso algoritmo treinar (`fit`) utilizando nossos dados de treino:

python 

Podemos pedir para o modelo predizer o resultado do conjunto de teste e, com base nas nossas marcações, validar o tanto que o nosso algoritmo acertou:

python 

Rodando esse código, vemos que nosso algoritmo acertou cerca de **66% das vezes**, bacana, mas, o que acontece se mudarmos o valor do nosso tamanho de treino para que nosso algoritmo tenha menos dados para treinar?

python

Mudando o nosso tamanho de treino, o nosso algoritmo acerta agora em cerca de **65.9% das vezes**. Mesmo não sendo um valor tão distante um do outro, são valores diferentes. O que acontece se aumentarmos um pouco o tamanho de treino?

python

Neste caso, o nosso modelo acertou em cerca de **60% dos casos**. Um valor já bem diferente dos outros dois, por que isso aconteceu?

## Combinando os dados

O que acontece se o nosso primeiro time, que está sendo utilizado no treinamento, for para a última posição do nosso conjunto? Neste caso, o algoritmo teve uma taxa de acerto de **61.46%.**

Alterando a posição do elemento, temos um conjunto com dados completamente diferentes. Isso ocorre pois prendemos o algoritmo na sequência que os dados foram apresentados, isto é, a posição de cada elemento importa para o resultado do algoritmo. É por isso que quando alteramos o tamanho de treino o nosso algoritmo muda o resultado também. O que podemos fazer para evitar isso?

O que podemos fazer é separar uma parte dos dados para treino e teste criando várias combinações diferentes. Dessa forma cada combinação nos daria um resultado e, com esse resultado, veríamos o quão bom foi o nosso algoritmo.

Por exemplo, vamos supor que temos dez dados em todo o nosso conjunto. Podemos pegar os dados de um a oito e treinar o algoritmo e utilizar os dados nove e dez para testá-lo. Depois podemos pegar os dados de três a dez e utilizá-los para o treino, e então pegar os dados um e dois e testar nosso algoritmo com eles.

Dessa maneira, podemos fazer `k` **combinações** cruzando o nosso conjunto de dados. Cada um dos cruzamentos, nos retorna um valor que é a taxa de acerto daquela combinação.

Assim validamos nossos dados cruzando várias combinações possíveis. O nome dessa técnica em aprendizado de máquina é **validação cruzada**, ou em inglês **cross validation**.

Podemos pedir para o Python importar da biblioteca Scikit-learn do módulo de seleção de modelos (`model_selection`) a função de cruzamento de valores (`cross_val_score`).

Passamos como parâmetro dessa função o nosso modelo, e os valores dos nossos dados para treino, também precisamos falar quantas combinações (`cv`) queremos que ela faça:

python 

Essa função nos retorna um vetor com as taxas de acerto de cada combinação. Nós podemos tirar uma média geral somando esses valores e dividindo pelo tamanho do vetor:

python

Agora temos uma média de como o algoritmo MultinomialNB trabalha no nosso conjunto de dados, que no caso é **60%**. Podemos utilizar essa mesma técnica em outros algoritmos e decidir qual o melhor modelo para o nosso conjunto de dados e validá-lo com o nosso conjunto de testes.

## Para saber mais

Essa técnica de validação cruzada que utilizamos é chamada de **K-fold**. Ela é uma técnica muito utilizada em aprendizado de máquina, pois nos permite testar em vários cenários os nossos algoritmos antes de colocá-los em produção.

Além do algoritmo de Naive Bayes, existem diversos outros algoritmos que podemos usar para ensinar a máquina.

Aqui na **Alura**, temos uma [**formação em Machine Learning**]. Nela, você aprenderá sobre estatística, sobre como funciona um algoritmo de classificação. Aprenderá a classificar e-mails, a dizer se um usuário comprará ou não um produto. Verá como criar um sistema de recomendação, e até chatbots.




Aproveitando o mês das mulheres, trouxemos um tema interessante: ser mulher, profissional e mãe. Como isso funciona?

Poderia começar esse texto falando de todos os tabus que soam até mesmo como clichês para a rotina da maternidade, mas a ideia aqui é colocar um relato pessoal especialmente no que diz respeito à volta ao trabalho.

Não importa quantas histórias contem sobre como é difícil conciliar esses dois papéis, cada uma sempre vai ser muito singular. Ainda assim, existem aí alguns desafios que costumam acontecer muito em comum com todas elas.

## Ser uma boa mãe ou ser uma boa profissional?

O maior tabu sobre a maternidade nasce quando criamos essa divisão mental sobre a profissão e o papel de mãe. Parece uma divisão muito sensível que aponta uma enorme dificuldade em exercer bem os dois papéis ao mesmo tempo.

Existe um sentimento de culpa independente de qual das partes definimos como prioridade. Quer dizer, se decidimos voltar a nos dedicar ao trabalho surge o sentimento de culpa por não poder cuidar de perto de alguém que até então construiu um vínculo muito forte com a gente e com a nossa rotina.

Mas se decidirmos deixar a profissão com menos prioridade, sentimos culpa por ter dedicado tanto tempo de estudo e esforços que agora serão deixados de lado.

Tanto para mulheres quanto para homens existe uma necessidade de sentir-se produtivo, de enxergar um sentido para as atividades que exercemos, sejam elas quais forem.

Além disso, como citam [**Suzana Ayarza e Aline Prado**] da equipe de marketing do Google:

> "A questão cultural tem um peso enorme nesse comportamento. O ato de cuidar é inerente ao ser humano, seja qual for o gênero, mas a divisão convencional das funções nas famílias levou o homem a trabalhar fora de casa, e a mulher a criar os filhos e administrar a casa. Infelizmente, o aumento da participação feminina no mercado de trabalho não trouxe a diminuição proporcional nas atividades domésticas."

Existem muito mais degraus a considerar quando falamos nessa jornada dupla entre profissional e mãe.

E essa pode ser uma das questões que surgem para as mães que regressam ao trabalho. Só que, quando decidimos efetivamente voltar ao mercado profissional e nos ajustar a essa nova fase, precisamos considerar mais algumas coisas...

## Produtividade na volta ao trabalho

Existem muitas pessoas que dizem conseguir retornar ao trabalho integralmente, focada nos objetivos que veio cumprir ao longo do expediente - às vezes seguido até de um segundo período como estudante - e, ao voltar para casa, voltam com 100% da sua atenção ao filho e atividades pessoais.

Bom, nem sempre esse é o caso…

Em um relato pessoal, poderia dizer que ansiava a volta ao trabalho pelo simples fato de gostar muito de me sentir produtiva, criando e entregando valor para a minha profissão.

Só que, ao retornar, o que parecia muito simples de repente tornou-se um momento de reflexão e adaptação um pouco mais intenso.

O ritmo parecia muito diferente. Os mesmos desafios de antes pareciam ter mudado de sentido e o apego a determinadas atividades ficou muito menos motivador.

Me perguntei: Por que será que isso está acontecendo? Sempre fui muito metódica quanto às minhas atividades, mas por algum motivo o lógico da teoria parecia muito menos lógico na prática.

Acabei me sentindo muito frustrada por não conseguir acompanhar o ritmo de todo mundo na mesma intensidade. Me cobrei (como uma característica da minha personalidade) e tentei usar meu tempo em casa para refletir e chegar a novos consensos, mas a rotina com um bebê de cinco meses me tirava toda a energia no fim do dia (momento que eu teria para fazer essa reflexão).

Tudo parece virar uma bola de neve e a adaptação que acreditei durar no máximo uma semana virou um mês. Nós criamos metas e mais metas sem ter a mínima noção de como isso vai se desenrolar no meio do caminho.

Um mês sentindo uma dorzinha interna e uma insistente vontade de chegar a algum lugar que fizesse mais sentido.

Um mês. Foi o que eu precisei para conseguir me ajustar. Algumas pessoas demoram menos, outras demoram mais, mas uma hora essa produtividade chega.

O mais difícil e o menos recomendado é a comparação. Olhamos para o lado e vemos diferentes tipos de mães trabalhando em ritmos frenéticos, lidando com tudo de forma super eficiente e acreditamos muito que precisamos ser assim também: "Se ela consegue, eu deveria conseguir.".

**Grande erro!** Assim como existem personalidades diferentes, pessoas diferentes, gostos diferentes e até filhos diferentes, somos mães e mulheres diferentes e temos cenários familiares diferentes também. Por mais óbvio e clichê que isso possa parecer, na prática a dor do julgamento (muito mais o interno do que o externo) é complicadíssima de lidar.

Portanto, o primeiro passo para a produtividade é o foco. Esqueça as distrações de outras mães, mas não em um passe de mágica, exercite isso todos os dias. Se pergunte: "Por que eu estou me comparando? Minha realidade é a mesma que a daquela pessoa? Será que essa realidade que transparece é de fato o que acontece no dia a dia dela?".

Nós vivemos desafios de formas diferentes e, como mulheres, enfrentamos muitas outras questões também. Cada uma em uma realidade diferente, ainda que com traços em comum.

Se cobrar talvez seja a coisa mais normal, o difícil é conseguirmos moldar essa cobrança para que traga algum valor ou motivação. Em pequenos passos, esse lugar chega.

## Somos mães, mas somos muito profissionais também

Sabemos de todas as histórias sobre como profissionais mães temem o mercado de trabalho pelo simples fato de serem mães e como enxergam isso dentro da profissão.

Mas talvez o maior monstro que precisamos destruir é o da dúvida.

No início da carreira todos temos um pouco de medo e dúvidas se conseguiremos um emprego, se vamos nos encaixar, se conseguiremos entregar o valor que a empresa espera.

Só que, bem antes de pensar nessas questões, precisamos pensar em nós, mães, mulheres e profissionais. Você e eu sabemos nossas capacidades e conhecimentos da área.

Não chegamos até aqui por mérito de esforço e dedicação? Então, por que não valorizar isso? Quer dizer, o mundo vai continuar sendo um lugar complicado e assustador por muito tempo, mas nós temos muita capacidade e precisamos acreditar nisso. Somos profissionais!

Uma vez me disseram algo como: "Você já é a melhor mãe que o seu filho pode ter, independente de qualquer coisa" e também “Se você se preocupa em ser uma boa mãe, já é uma boa mãe”.

Essas duas frases me fizeram olhar mais para mim mesma como profissional, simplesmente porque consegui tirar um pouco da carga de "preciso ser perfeita em tudo" para “estou dando o melhor de mim”. Isso importa para mulheres, mães e especialmente para qualquer tipo de profissional.

Para as mães que estão nessa mesma situação em que eu estive, lembrem-se: "Você está fazendo o seu melhor!" :)





imagem 

No app Imagly, quando se entra a primeira vez em uma aba específica, temos a seguinte tela:

imagem, é importante verificar se não deixamos nenhuma lacuna para que ele se confunda no que estamos apresentando.

Então, como direcionar melhor o que cada funcionalidade do nosso app faz?

## Preenchendo as lacunas

Se nosso objetivo é orientar o usuário, poderíamos simplesmente adicionar algumas informações no espaço vazio.

imagem

E o que acha de aprimorar seus conhecimentos para conseguir criar composições mais atraentes e interessantes nas telas da sua UI? Na Alura temos um curso de [**composição com Illustrator**] que mostra formas bem legais de como abordar esse tipo de construção visual.




Quando estamos trabalhando com dados,principalmente na **fase de mineração**, realizamos muitas mudanças no **dataset**. 

Existem colunas que não queremos, ou precisamos usar, ou linhas que não contém dados válidos que precisam ser removidas.

> Mas quantos mais dados não é melhor?

Quando estamos analisando dados, principalmente para treinar **modelos de inteligência artificial**, alguns dados podem prejudicar ao invés de ajudar. Por isso, temos que utilizar apenas os dados que fazem sentido para o modelo.

Legal! Já sabemos que precisamos tratar os dados, mas como podemos fazer isso, como remover os dados?

# Removendo colunas no Pandas

Estou fazendo uma análise sobre gorjetas em transportes como táxis. Para isso, estou utilizando o [**Pandas**] que é uma biblioteca que facilita a manipulação dos dados.

No Pandas, temos um tipo de dado chamado `DataFrame`. Podemos dizer que um data frame é como uma planilha. Ou seja, temos linhas e colunas.

Podemos ver o começo do conteúdo da planilha utilizando o método `head` do data frame:

python

imagem** para retirar uma linha. Mas como remover todas as linhas que contém apenas um passageiro?

Podemos fazer um loop e iterar por cada linha no data frame e checar se o número de passageiros é maior que um. Se sim, mantemos esse dado, do contrário, removemos do data frame. Mas qual o problema dessa solução?

Mas o Pandas já tem diversas formas para trabalhar com seus data frames. O que podemos fazer é criar um filtro no qual é retornado um novo DataFrame com os dados já filtrados.

O Pandas permite filtrar um DataFrame pelos dados de sua coluna. Por exemplo, queremos pegar do data frame de gorjetas **(tips)** a coluna que define o número de passageiros **(size)** e com base nisso, queremos as linhas nas quais a coluna size é maior que um:

python

Agora, basta passarmos esse filtro como seletor no DataFrame:

python

Esse filtro nos retorna um DataFrame com as linhas onde o número de passageiros é maior que 1. Ou seja, os dados que passam pelo filtro:

python

![]

# Para saber mais

Os filtros utilizados podem ser mais complexos. Podemos utilizar estruturas condicionais,como o E e OU e checar o valor de mais de uma coluna. Além disso, podemos fazer outros tipos de filtros. 

Como checar se alguma linha tem um valor nulo, ou um valor de um tipo diferente do esperado. Para isso, o Pandas utiliza o conceito de [**comparação rica, ou rich comparison**].

Além de remoção, conseguimos fazer outras operações com os **data frames, operações que envolvem string, renomear colunas e adicionar colunas novas, juntar um data frame a outro, entre diversas outras operações**.

Aqui na Alura, temos uma [formação de data science com Pandas]. Nele você verá como manipular data frames de diversas formas. Além de ver como **criar gráficos, visualizar estatísticas descritivas, tratar dados faltantes e muito mais**.



Uma **paleta de cores** pode dar vida a um projeto, compor um ambiente, melhorar o conceito de uma arte e [**servir de inspiração**], sendo limitada apenas pelo tamanho da sua criatividade. 

imagem 


Em segmentos de **produção de conteúdo visual**, cada vez mais tem se falado sobre a influência que a paleta de cores exerce na vida de um profissional, seja ele aprendiz, amador ou experiente em sua área de atuação.

O fato é que há uma diferença marcante entre o designer que sabe não somente absorver referências, mas também criar a sua própria paleta de cores, do designer que sequer sabe da existência desse termo tão importante no ramo de criação visual.


## COLOURlovers

Para começar a nossa lista em grande estilo, nada melhor do que citar o famoso [**COLOURlovers**], uma [ferramenta prática, acessível e intuitiva]. Trata-se de um site com **interface agradável** que reúne conteúdos criados pelos usuários, servindo como inspiração e aprendizado.

Por meio da plataforma é possível pesquisar por temas em diversas categorias, ou, se você preferir, pode pedir dicas e trocar ideias com outros usuários nos grupos de discussão do site.

Além disso, também é possível fazer upload de uma imagem de seu computador e extrair a paleta de cores, por meio dos recursos que a ferramenta oferece. Após o envio, basta selecionar a cor em uma **miniatura da imagem** e a composição será apresentada, mediante a predefinição escolhida.

Você encontrará funcionalidades como o **COPASO**, que permitirá a criação da sua própria paleta, utilizando o **Color Wheel** e um **seletor de HSV e HSL**, muito parecido com o recurso do **Photoshop** (mas que também possibilita alterações na saturação da imagem).

Você pode utilizar as predefinições do próprio site, se preferir, para complementar o seu projeto.

Vale ressaltar, ainda, que além dos grupos de discussão sobre inúmeros assuntos pertinentes à área de ilustração e design gráfico, o COLOURlovers também oferece ferramentas interessantes para que você crie as suas próprias [**patterns**] de maneira simples e divertida.

## Color Explorer

Outra ferramenta inteiramente online para que você crie a sua paleta de cores, sem precisar instalar [**extensões no Illustrator ou no Photoshop**], é o site [**Color Explorer**]. Sem dúvidas, um dos mais completos ambientes digitais que todo estudante de design deveria acessar ao menos uma vez em sua carreira.

Por meio do Color Explorer, por exemplo, é possível extrair a paleta de uma imagem e utilizar um seletor de cores com todas as opções de sombra ao mesmo tempo, mostrando o efeito de cada alteração em tempo real.

Após criar a sua paleta de cores, você também pode aplicar diferentes estilos e filtros que a modificam em tons mais quentes ou mais frios, além de estilos como sépia e P&B, ou até mesmo cores vivas para projetos mais ilustrativos.

A funcionalidade **Color Matching** permite que a utilização de parâmetros para encontrar a sua própria inspiração na hora de criar a paleta, bastando apenas definir uma cor principal como referência e depois realizar ajustes de iluminação, saturação, entre outros.

Outras duas ferramentas que podem ser muito úteis dentro do Color Explorer são o catálogo e a conversão de cores. Lembrando ainda que é preciso tomar cuidado ao utilizá-las, pois os recursos tentarão simular o equivalente à cor do RGB, como se estivesse em uma versão impressa do arquivo.

Como estudante de design ou profissional na área, você deve saber que, sem um trabalho minucioso de calibragem dos monitores, essa tarefa pode ser bastante complexa, já que os dados e valores que constam na tela nem sempre são os mesmos que sairão na arte impressa.

Por fim, é possível exportar a sua paleta de cores em diversos formatos, podendo abri-la em inúmeros softwares de [**edição de imagem**] e plataformas diferentes.

## Adobe Kuler

Para utilizar esta ferramenta é necessário ter um nível básico de conhecimento de informática, já que se trata de uma extensão de temas do Photoshop ou Illustrator, mas nada que uma simples busca no Google não resolva.

O [**Adobe Kuler**] é um dos recursos mais conhecidos por designers e ilustradores, por causa de sua integração com os softwares da Adobe. Com ele, é possível criar as suas próprias paletas por meio do Color Wheel, com predefinições básicas (análogas, tríade, cores vivas, etc) o que torna a combinação de tonalidades muito mais prática.

Assim como as ferramentas que citamos anteriormente, o Adobe Kuler também permite que você envie uma imagem de seu computador para que ele extraia suas principais cores. A extensão fará uma varredura em toda a imagem, separando a sua composição em sombras, tons e outras opções.

Vale ressaltar que, para buscar inspirações e referências, também é possível explorar paletas criadas por outros usuários, já que, ao finalizar um projeto, além de poder exportá-lo para os mais variados formatos de arquivo [**muito útil na hora de montar um portfólio de design**], você também pode fazer upload de sua arte. Basta ter uma **conta Adobe ID** (é totalmente gratuita).

## Color Scheme Designer

Para finalizar o conteúdo não poderíamos deixar de citar uma das ferramentas mais funcionais e intuitivas para criar a sua paleta de cores, o [**Color Scheme Designer**].

Além de permitir que você encontre a paleta por meio do tradicional recurso Color Wheel, separando-as em cores frias e quentes, ele também mostra uma pré-visualização de cada paleta de acordo com a cor selecionada, abrindo uma página inteira como exemplo e permitindo que você altere até mesmo a saturação da cor selecionada ou da paleta inteira.

As paletas de cores podem ser encontradas com o auxílio de alguns parâmetros que a ferramenta oferece ou, se você preferir, pode gerar uma paleta aleatória. E, ao finalizar o seu projeto, pode exportá-lo para os **formatos GIMP, +CSS, XML, HTML, PSD e em texto** caso queira copiar as informações do arquivo.

Por fim, o Color Scheme Designer conta com um[**recurso de acessibilidade**]muito interessante, que permite que as pessoas que têm algum tipo de deficiência visual,como a deuteranomalia ou deuteranopia, possam criar uma paleta de cores sem dificuldades.

Agora que você já conhece as principais ferramentas para criar uma paleta de cores para seus projetos, aqui na Alura temos uma [**formação em Design Gráfico**] onde além conhecer mais a fundo o **PhotoShop** vamos aprender **composição, processos gráfico, tratamento de imagens** e muitas outras habilidades que um designer profissional necessita.





imagem 

Um aplicativo de vendas foi lançado e o layout desenvolvido pelos designers ficou assim:

imagem



Estou me preparando para a certificação da Oracle e surgiu o seguinte cenário: posso declarar variáveis com o mesmo nome na mesma classe? Vamos verificar a classe Livro:

java

Testando minha classe:

java

O resultado é o esperado:

```
 > Imposto do livro: 10.0

```

O método `calculaImposto()` sofreu um pequeno ajuste e agora ele mesmo define o valor padrão do imposto:

java

Espera aí! Duas variáveis com o mesmo nome? Pode isso? Qual valor será retornado? Testando a classe:

```
 > Imposto do livro: 12.3

```

Como podemos ver, a variável **membro** `preco` não foi retornada, declaramos uma variável **local** com o mesmo nome, por isso o `calculaImposto()` deu prioridade para a variável com valor 12.3 e a retornou. A capacidade de esconder uma variável membro é uma técnica conhecida como **shadowing**. Poderíamos, também, enviar um parâmetro com o mesmo nome:

java

Modificamos a chamada do `calculaImposto()` para enviar um `double`:

java

Verificando o resultado:

```
 > Imposto do livro: 15.5

```

Muito bom, mas... E se e eu quiser retornar o valor da variável membro? É simples, basta utilizar a palavra chave `this`:

java

Imprimindo o resultado:

```
 > Imposto do livro: 10.0

```

Veja que agora o valor retornado foi o da variável membro, ou seja, o atributo da classe!

Agora já sabe como lidar com variáveis locais e membros? Gostou do shadowing? Quer aprender mais dicas e nunca mais cair em pegadinhas no Java? Pensando nisso, o instrutor Guilherme Silveira, criou a [**Formação Java**] na **Alura**. 





imagem 

Aqui na Alura temos um servidor para guardar alguns arquivos e projetos internos, que basicamente funciona como um repositório interno.

Esse servidor tem um espaço de **armazenamento limitado** e, de tempos em tempos, tenho que ficar conferindo se a pasta do compartilhamento está ficando muito cheia.

O servidor não possuí modo gráfico, então como posso saber o tamanho da pasta de compartilhamento?

## Descobrindo o tamanho de um diretório

Para descobrir quanto do disco que o diretório está usando basta ir até o terminal e dizer: "por favor, mostre-me o quanto do disco (`du`, **disk usage**) o diretório `/compartilhamento` está usando":

`du /compartilhamento/`

imagem a informação:

`du -s /compartilhamento/`

imagem.

Podemos utilizar as duas expressões separadamente, `-s -h`, ou juntas `-sh`:

`du -sh /compartilhamento/`

imagem, cada um com suas diferenças. Para nosso script saber qual deles utilizar, temos que especificá-los na primeira linha.

Um dos shells mais utilizados é o [**Bash**], vamos utilizá-lo. Logo na primeira linha digitamos:

`#!/bin/bash`

Como queremos visualizar a tamanho ocupado pelo diretório `/compartilhamento`, temos que fazer nosso script acessá-lo. Portanto: `cd /compartilhamento`

bash 

Agora temos que pegar a informação sobre o tamanho do diretório. Já vimos como fazer isso, basta atribuirmos esse valor a uma variável.

O comando que nos retorna o percentual é o `df`, como queremos saber apenas do diretório compartilhamento, é ele que vamos especificar, já que queremos apenas a informação da porcentagem, não precisamos colocar o parâmetro `-h`

bash 

Só que, como vimos, esse comando nos retorna duas linhas, a primeira é um cabeçalho, enquanto a segunda são as informações sobre a partição.

Queremos apenas a informação sobre o uso, que se encontra na coluna 5:

imagem nossa variável estiver com 70% ou mais, então (`then`) vamos escrever uma mensagem na tela.

Para realizar essa comparação, vamos utilizar algumas [**expressões regulares**]. Nossa variável pode ter valores de 70% até 100%, ou seja, o dígito da dezena pode variar de 7 a 9 (`[7-9]`) e o da unidade de 0 a 9 (`[0-9]`), seguido do símbolo de percentual (`%`).

Essa expressão captura valores de 70% até 99%. Para acrescentarmos o 100%, dizemos que ou é essa expressão (`[7-9][0-9]%`), ou (`|`) será utilizado 100% para realizar a comparação.

A expressão completa fica assim:

`[7-9][0-9]%|100%`

Basta informar essa condição em nosso `if`:

bash

Vamos testar nosso script e checar se está funcionando:

imagem para o arquivo onde ficará nosso log que, no meu caso, fica em `/logs/compartilhamento.log`.

bash

O bacana é que mesmo que esse arquivo não exista, o programa o cria. Vamos testar nosso código novamente:

imagem, como é o primeiro parâmetro, colocamos um `+` na frente, ficando `+%F`. Esse parâmetro mostra a data do sistema no formato ano-mês-dia.

Vamos acrescentar o parâmetro para mostrar as horas , minutos e segundos, podemos utilizar `%T` (**Time**):

`date +%F %T`

imagem esse espaço:

`date +%F\ %T`

imagem.

Dessa forma, cada vez que o minuto for 00, ou seja, a cada hora, será executado o comando.

O usuário que irá executar o comando é, no nosso caso, o **superusuário** (root), como ele é o mesmo usuário que criou o arquivo, não precisamos especificá-lo. E o comando será: `bash consulta_tamanho_diretorio.sh`

Vale lembrar que se o script estiver em outro diretório sem ser o do usuário que irá executá-lo, devemos especificar o caminho até ele.

`0 * * * * bash consulta_tamanho_diretorio.sh`

Para salvar e sair do arquivo de configuração do cron, pressionamos _Esc_ e depois digitamos `:x`.

> _"Mas por que não colocar asterisco em todas as colunas? Assim nosso script não seria executado a todo momento?"_

Sim. Dessa forma a cada minuto o script seria executado, porém isso poderia, dependendo do número de requisições que o servidor recebe, sobrecarregaria sua CPU.

Agora nosso arquivo de log sempre será atualizado sobre essa informação.

Vamos olhar o arquivo de log e ver se ele está inserindo a informação:

imagem para fazer as configurações, mas podemos utilizar qualquer usuário para criar os scripts.

Caso você esteja utilizando o usuário root para fazer os scripts **cuidado** para não executar um script que comprometa o sistema.

## Problema Resolvido

Tínhamos que ficar checando de tempos em tempos se o diretório de compartilhamento estava ficando cheio. Vimos como podemos fazer isso e como automatizar essa tarefa utilizando Shell Script utilizando o cron para agendá-la.

Aqui na Alura temos um [**curso sobre Shell Script**]. Nele você aprenderá como automatizar tarefas utilizando, criar estruturas de seleção e repetição, funções e muito mais. 




**SQL Injection** é uma forma que hackers usam para tentar acessar o banco de dados da sua aplicação sem permissão para tal. Esses [comandos SQL](o-que-e-sql) são injetados dentro da sua aplicação através de formulários web que não foram bem processados e protegidos pelo back-end da aplicação, independente da linguagem.

IMAGEM HACKER

# Formulários web e SQL:

algo assim: https://img.ibxk.com.br/2017/01/05/05164905230860.jpg?w=528

# A técnica 'or 1=1'

# Como se proteger do SQL Injection?

Voce deve **sanitizar** os dados antes de processá-los. Isso é, deve tomar cuidado com aspas, caracteres especiais e uma série de detalhes. Você pode fazer isso com expressões regulares, mas certamente vai acabar esquencendo algum caso ou outro. Sua sorte é: existem bibliotecas em diversas linguagens que já fazem isso:


## SQL Injection sanitize em PHP:

use a funcao TAL. exemplo:


exemplo de saida:



colocar python, java, c# e node.js


# Testes automatizados com o SQLMAP

link pro curso curso-online-seguranca-web-em-java-parte-1 



Nesse artigo vou mostrar como adicionar extensões através do repositório central de extensões o PECL.

Estou desenvolvendo um blog usando PHP e quando acesso a primeira página, os posts mais recentes eram exibidos e, por baixo dos panos, eles eram obtidos através de um banco de dados responsável por armazenar o conteúdo.

**Para o PHP conseguir conectar em um banco de dados, preciso informar o nome do banco de dados, juntamente com o usuário e senha. Coloquei essas informações no código fonte, porém, após um tempo precisei mudar a senha do banco de dados e tive que modificá-la no código.**

Depois disso, percebi que é ruim que estes dados fiquem no código, pois uma alteração neles implica em uma mudança direta no código fonte.

Procurando maneiras para melhorar essa questão, descobri que é uma boa prática guardar estes dados em um arquivo separado em um formato como **XML, JSON ou YAML**. Entre esses tipos de formato, escolhi o YAML, por ter uma sintaxe mais simples de ler. 

sql

Precisei ler este arquivo a partir do nosso programa PHP. Como a documentação da biblioteca YAML apresenta a função `yaml_parse_file` para ler um arquivo YAML, então usei a função:

php

Quando executei o programa no meu computador, ao invés dele funcionar, o seguinte erro foi impresso na tela: 

imagem

O que aconteceu? O PHP disse que a função `yaml_parse_file` não existe. Pesquisando um pouco na internet, vi que YAML não faz parte da distribuição padrão do PHP, já que é uma extensão.

E como podemos adicionar esta extensão no PHP?

# Extensões no PHP

Quando precisamos realizar alguma operação que exija alta performance, como no meu caso de processar um arquivo YAML, e queremos que isso seja feito da forma mais rápida possível, podemos utilizar uma extensão do PHP.

Existe um repositório online de extensões da linguagem PHP disponíveis para download chamado PECL (PHP Extension Community Library), que é equivalente ao Composer, só que armazena extensões e não bibliotecas. 

Como estou utilizando Linux, instalei o PECL utilizando o comando:

php

imagem

No caso do Windows, utilizando o XAMPP, o PECL já deve estar instalado. No Mac, é necessário utilizar o Homebrew e para instalar o PHP junto com o PECL, é necessário utilizar o seguinte comando:

php

Com o PECL instalado, agora vamos procurar pelo YAML.

# Utilizando o PECL
 
Para utilizar o PECL, ele oferece somente uma interface por linha de comando, para procurar pela extensão YAML utilizei o seguinte comando:

`pecl search yaml`

Para instalá-lo, o comando:

`pecl install yaml`

Legal! A extensão foi instalada e no terminal teve a seguinte saída:

imagem

Quando utilizei o comando para instalar, a última linha mencionou que eu deveria adicionar “extension=yaml.so” para o arquivo php.ini. O que isso quer dizer?

**Existe um arquivo de configuração do PHP chamado php.ini, onde estão armazenadas todas as configurações que são aplicadas a tempo de execução no interpretador da linguagem e as extensões que devem ser carregadas.**

Às vezes pode ser um pouco complicado de encontrar este arquivo, pois, em algumas instalações do PHP, podem existir mais de um php.ini, já que ele pode ser encontrado de duas maneiras: na linha de comando e pelo servidor web.
Primeira maneira com o terminal

Para exibir as informações de configuração do PHP no meu computador, abri o terminal e digitei o comando:

`php -i`
Com o qual obtive o seguinte retorno:
 
imagem

No meio desse monte de linhas, procurei pelo seguinte texto:

`Loaded Configuration File => /etc/php/7.2/cli/php.ini`

Isso mostra o diretório do arquivo de configuração que foi carregado. Porém, estava um pouco difícil de encontrar essa linha. Para facilitar, decidi copiar o texto e colar em um editor de texto, como o Visual Studio Code, para utilizar a função de busca.
Segunda maneira com um arquivo php

Na minha máquina também estava utilizando o PHP na web, que é utilizado para exibir páginas de websites, para obter as informações de execução abri um arquivo com a extensão .php e digitei o seguinte código:

php

uando acessei este arquivo, apareceu a seguinte tela, que mostra a configuração “Loaded Configuration File” com o arquivo php.ini utilizado:

imagem

Na linha Loaded Configuration File, o nome do arquivo retornado foi /etc/php/7.2/cli/php.ini, com o nome do arquivo em mãos, abri ele em um editor de código e no final do arquivo e incluí a linha que havia sido pedida.

extension=yaml.so

Agora que consigo utilizar a função que lê o arquivo YAML, executando aquele código que foi citado no começo do deste post, consigo transformar este arquivo de configuração em um array do PHP e assim, utilizá-lo no meu blog.

Caso eu precise remover a extensão, preciso utilizar o seguinte comando: 

php

E para finalizar, precisei remover a chamada da extensão no arquivo de configuração php.ini para que o PHP não tente mais executar esta extensão.
Conclusão

Existem funcionalidades da linguagem PHP, como a de ler arquivos YAML, que por razões de performance não podem ser escritas em PHP e distribuídas como uma biblioteca no Composer,mas podem ser escritas como extensões da linguagem. 

Para instalar esta extensão utilizei o PECL, que é o repositório central de extensões da linguagem PHP. O PECL possui uma interface via linha de comando, no qual executei o comando para instalar a extensão YAML e depois, incluí ele no arquivo de configuração do PHP.

Com isso você estará preparado para utilizar o PECL e instalar extensões do PHP! Gostou do post? Por que não dar uma olhada nos [**cursos de PHP da Alura**]? Você poderá aprender sobre muitas ferramentas importantes do PHP moderno como o Composer, Doctrine e Laravel!



Sempre quis aprender sobre **SQL e banco de dados** mas não teve oportunidade ou simplesmente não conseguiu nenhum material que focasse com exemplos do mundo real, seus problemas e soluções do dia a dia?

Pensando nisso, escrevi a apostila de **SQL e modelagem com banco de dados**! Você pode baixá-la [**aqui**].

Esta apostila é baseada nos cursos dos instrutores da Alura e ensina desde os princípios básicos a **assuntos mais avançados sobre SQL e banco de dados**.

A nossa intenção é dar a oportunidade do aluno aprender sobre SQL e modelagem de dados dando ênfase sempre que possível na compatibilidade entre bancos.

Na apostila usamos o **MySQL** para ver desde a criação de um banco e suas tabelas até como funcionam diversos tipos de joins no mundo real.

Com essa iniciativa, esperamos retribuir o constante apoio da comunidade de profissionais de tecnologia. E, claro, toda ajuda e opinião são sempre bem vindas :)

Bons estudos!




No último [**desafio entre amigas**], Maya propôs um desafio a Victoria que o encarou com maestria.

No final, Maya pediu que Victoria também a desafiasse para que pudesse mostrar suas habilidades em JavaScript. Victoria não perderia a oportunidade de colocar sua amiga à prova.

## Hora da revanche, o novo desafio

Depois de terem almoçado juntas, Victoria elaborou a seguinte estrutura HTML para o desafio de Maya:

html

Victoria disse:

> "Maya, a página possui apenas um botão que ao ser clicado deve exibir no console o texto "Fui clicado"".

E Maya disse, surpresa:

> "Só isso?"

Victoria a esclareceu que essa era a primeira parte do desafio, que lhe contaria o próximo assim que ela a resolvesse primeiro.

Maya ficou em silêncio e deu início a sua implementação:

javascript

Victoria ficou calada, pediu para que Maya testasse o código e tudo funcionou. Em seguida, elaborou o seguinte comentário:

> "O botão poderia estar realizando uma requisição para um servidor web, uma API, certo? Nesse caso, o que aconteceria se o usuário, frenéticamente, clicasse várias vezes seguidas igual ao "The Flash" no botão?"

Maya respondeu:

> "O servidor teria que atender todas essas requisições desnecessárias."

## O padrão de projeto Debounce

Por fim, com um sorriso malicioso no rosto, Victoria passou a instrução final do desafio, que antes parecia simples:

> "Você deve postergar a execução de `exibeMensagem` caso ela seja chamada novamente em menos de um segundo através do clique do botão. Fácil, não? Para complicar um pouquinho, sua solução deve ser aplicável em diversos lugares de uma aplicação, sem repetir código."

Maya quis confirmar se entendeu corretamente o pedido:

> "Se eu clicar 10 vezes em menos de um segundo, apenas o último clique será processado, certo?""

"Perfeitamente", diz Victoria.

Por fim, Maya profere:

> "Você quer que eu implemente o padrão de projeto [**Debounce**], é isso?"

Victoria ficou pálida, pois tinha certeza que Maya não saberia resolver a questão e ainda lhe disse o nome do padrão de projeto a ser empregado para solucionar o problema. Ela ficou calada e Maya deu início a sua implementação.

Primeiro, ela criou a função `debounce`, mas apenas seu esqueleto:

javascript

Victoria pediu que a amiga explicasse para ela o esqueleto do código da função. Maya esclareceu que a função `debounce` recebe dois parâmetros. O primeiro é a função que desejamos assegurar que seja executada no máximo uma vez a cada X segundos. O segundo é o valor em milissegundos do intervalo de tempo que será considerado.

## Vendo como tudo se encaixa

Gentilmente, Maya pediu a Victoria uma licença poética e começou a utilizar a função `debounce` antes de estar pronta, para que a amiga pudesse entender como ela se encaixa com o evento "click" do botão.

javascript

Maya explicou que o retorno de `debounce` é uma função configurada para utilizar um temporizador que chamará `exibeMensagem` respeitando a janela de tempo de um segundo, como Victoria havia pedido.

Victoria disse:

> "Ah, muito engenhosa essa sua solução. Você está usando debounce para criar uma nova função que encapsula `exibeMensagem`. Esse encapsulamento é necessário, porque o evento "click" não pode chamar diretamente `exibeMensagem`, pois ela não possui um temporizador. Já a nova função, sim."

## Simplificando um pouco as coisas

Como Victoria já tinha entendido como as coisas se encaixavam, Maya alterou seu código, evitando a necessidade de declarar a variável `fn`:

javascript

## Implementando a função debounce

Agora, ela precisava continuar a implementação da função `debounce` para seu código funcionar. A primeira alteração que fez foi usar `setTimeout` para agendar a execução da função após a quantidade de milissegundos passada para `debounce`, no caso, 1000 equivalem a um segundo:

javascript

## Um problema esperado

Maya explicou que Victoria poderia testar o código do jeito que está, mas que ele não funcionaria como esperado. Se ela desse 100 cliques rapidamente no botão em menos de um segundo, todos eles seriam executados, com a diferença de que cada um esperaria um segundo antes de ser executado.

Maya disse que a solução estava no retorno de `setTimeout`. Ela ajustou o seu código e guardou o retorno na variável `timer`:

javascript

A variável `timer` guarda um ID ligado ao `setTimeout` executado. Com o ID, é possível parar o `setTimeout` através de `clearTimeout(timer)`.

Continuando sua implementação ela fez:

javascript

## Um problema não esperado

Assim que Maya acabou de realizar a alteração no código, Victoria, com ar de confiança, disse que o código não funcionaria do jeito que está.

Maya hesitou durante alguns segundos e após realizar um teste viu que a amiga tinha razão. Quando ela clicava no botão, a seguinte mensagem de erro era exibida:

java

## Há sempre uma explicação

"Quer desistir", diz Victoria. Mas Maya reconheceu o seu erro e decidiu explicar para a amiga o que aconteceu:

> "Para que minha solução funcione, a cada clique do botão eu preciso parar um timer já existente com `clearTimeout(timer)`. O problema é que no primeiro clique, ainda não temos um `timer` rodando para ser parado, inclusive a variável `timer` é declarada após o `clearTimeout(timer)`."

Então, Maya tentou resolver da seguinte maneira:

javascript

Maya esclareceu que estava iniciando o `timer` com zero e que isso não faria mal nenhum para `clearTimeout`. Victoria respondeu:

> "Faz até sentido, pois na primeira vez que você clicar não existe um timer sendo processado. Já podemos testar o seu código?"

Mais uma vez o código de Maya não saiu como esperado. Continuou com o mesmo problema de antes. Todos os cliques foram processados, com a diferença de que cada ação do clique foi executada um segundo depois.

Victoria pergunta mais uma vez se a sua amiga quer desistir. Maya já estava entregando a toalha quando de repente deu um grito:

> "Já sei! Basta eu mover a declaração de timer para o escopo da função debounce."

E foi isso que ela fez:

javascript

Para a surpresa de Victoria, o código de Maya funcionou como esperado.

## Closure?

Reconhecendo a competência da amiga, Victoria pediu que ela lhe explicasse a razão do seu código ter funcionado com essa pequena alteração. Muito modesta, Maya respondeu:

> "A função de `debounce` é chamada apenas uma vez e seu retorno, uma nova função, é associada ao evento click do botão. Certo? Essa nova função quando retornada por `debounce` trouxe com ela todo o contexto no qual foi declarada. É isso que permite a função ainda ter acesso à variável `timer` declarada no escopo da função `debounce` mesmo após esta última ter sido totalmente processada e retornado seu valor."

Com base no que acabei de explicar, o primeiro clique no botão fará `clearTimeout(timer)` assumindo o valor zero, o que não resultará em erro nenhum, para logo em seguida atualizar o valor de `timer` com um novo ID retornado por `setTimeout`. Todos os outros cliques acessarão e modificarão a mesma variável `timer`, fundamental para que a solução funcione.

Victoria, depois de olhar atentamente disse:

> "Isso tudo que você acabou de explicar, a noção de que uma função retornada por outra função traz o contexto da função que a retorna nada mais é do que o conceito de [**closure**]. Eu sabia desde do ínício, só queria saber se você tinha ideia disso.

No final, as duas amigas se abraçaram e marcaram de ir ao cinema assistir "Cangaceiro JavaScript".

**Twitter: @flaviohalmeida**




Há alguns anos atrás eu estava entrando na faculdade, no caso para cursar Sistemas de Informação, e me deparei com uma infinidade de assuntos diferentes para estudar: Sistemas Operacionais, Programação, Redes, Engenharia de Software, Empreendedorismo e várias outras possibilidades interessantes.

## Conheça as suas opções

O primeiro ponto fundamental que precisamos entender para que seja possível tirar o máximo de proveito de uma faculdade ou universidade é o papel que ela desempenha na nossa carreira e esse papel é justamente de te apresentar todas as opções que você tem disponíveis.

Ao fazer um curso de Sistemas de Informação, não significa que você será um _"Empreendedor Desenvolvedor Engenheiro de Software Especialista em Arquitetura de Computadores"_ e o mesmo vale para outros cursos.

Na verdade, nesse momento você precisa é conhecer as possibilidades que você terá e saber qual é a sua aptidão e interesse para cada uma dessas possibilidades.

Determinada matéria ou assunto, pode chamar mais a sua atenção do que outro. Esse é um indicativo de qual caminho que mais lhe agrada para a sua carreira, e também, que você talvez possa focar. Se você está ou já esteve na faculdade, tente fazer o seguinte exercício:

> **Identifique as matérias que mais te interessam e veja se elas se alinham com o que você quer para a sua carreira**.

## Organize-se para se aprofundar

Agora que você já sabe quais assuntos mais te chamam a atenção, você pode decidir focar um pouco mais nas habilidades dentro deles. A graduação irá te dar uma excelente base, mas você vai precisar ir além por conta própria e se aprofundar.

Por exemplo, se você decidiu que quer focar em programação e na faculdade aprendeu Java e Orientação a Objetos, agora se aprofunde nesses assuntos. [**Aprenda algum framework**], [**estude testes automatizados**], [**boas práticas de orientação a objetos**] e [**design patterns**], por exemplo.

No meu caso específico, durante a faculdade decidi que queria me especializar em Java, então comecei a estudar alguns frameworks e também para prova de certificação.

É fundamental que você tenha seu próprio objetivo do que quer aprender e que depois corra atrás desse objetivo.

Por fim, organize-se para estudar tudo o que precisa aprender. [**Monte seu próprio calendário de estudos**], conciliando o que já é necessário estudar para a sua graduação com o que você gostaria de se aprofundar.

Nessa época eu sempre tinha duas horas disponíveis no deslocamento de ônibus, então aproveitava essas duas horas, todos os dias, para estudar para a certificação. **Tente encontrar esses espaços disponíveis no seu dia a dia, nem que seja de 5 minutos**.

## Parceria entre a Alura e instituições de ensino

[Recentemente eu estive na Universidade Metodista], em São Bernardo do Campo, falando para os alunos ingressantes justamente como tirar o máximo da graduação e como agregar isso às respectivas carreiras. Veja só o quão bacana foi:

imagem contando um pouco sobre a sua instituição e suas aulas.





imagem 

Quando fui testar um aplicativo que estávamos desenvolvendo, a primeira coisa que fiz foi tentar abrí-lo. Depois de clicar no ícone do app, fiquei mais ou menos uns 3 segundos nessa tela em branco:

imagem são responsáveis por preencher exatamente essa lacuna que temos entre o início do carregamento do app e a abertura efetiva dele.

Com esse recurso, podemos aplicar no nosso app algo mais ou menos assim:

imagem da tela, evitando frustrar o usuário que tentasse ler ou compreender do que se trata aquilo, passar direto pela tela e depois não conseguir retornar para rever com mais calma o que aconteceu.

Mas, note que a tela que adicionamos é bem simples e não comunica nada de muito relevante sobre o app… Poderíamos aplicar essa mesma tela em qualquer app. Então, por que não aproveitamos esse momento para encaixar algo que traga algum valor para o usuário e para o app?

Geralmente, essas telas de lançamento, também conhecidas como _Splash Screens_, podem ser utilizadas para apresentar a marca do seu produto, algo como:

imagem], podemos notar que, segundo eles, as telas de lançamento não devem ser vistas como uma oportunidade de apresentação da marca.

Para eles, a menos que sejam elementos que fazem parte da primeira tela que o usuário verá do app quando iniciar a interação, não temos motivos para adicionar nada da marca do produto.

## Devo ou não devo usar as Splash Screens?

Se pensarmos no que representam as Splash Screens, ou melhor, a intenção que buscamos com elas, essas telas nada mais são que um fragmento **chamado antes do seu app inteiro ser carregado**, muito **mais leve** (para ser renderizado rápido), e que **apresenta um feedback ao usuário** de que o carregamento do app está acontecendo.

Se devemos ou não utilizar esse recurso vai depender de muitos fatores, especialmente se isso for um pré-requisito para que o seu app seja aceito naquele sistema operacional ou não se encaixar nas demandas que seu app pede (como pouco tempo de carregamento, por exemplo).

E, para aqueles que optarem por usar a Splash Screen, temos um post bem legal aqui na Alura mostrando o [**passo a passo para criar essa tela de abertura**].

Esse UI Design Pattern que comentei no post valoriza bastante o branding da marca. Se quiser entender um pouco mais de como funciona o processo de criação de uma marca forte, veja nosso [**curso de Branding da Alura**]!





imagem 

Sinais sem fio nada mais são do que [**ondas eletromagnéticas**], ou seja, são como as ondas de rádio, ou como a luz. Por serem ondas, eles trafegam em [**frequências específicas**] (2,4 GHz ou 5 GHz ). Logo, barreiras físicas podem impedir a passagem do sinal.

Porém, antes de sabermos quais são essas barreiras, precisamos entender o que é o **sinal do Wi-Fi**.

## O que atrapalha o sinal do Wi-Fi

Paredes, portas, vidros, espelhos e até mesmo a [**umidade do ar**] podem afetar o sinal Wi-Fi, em aparelhos que trabalham com a frequência na faixa de 5 GHz, a perda de sinal fica mais perceptível.

A distância também influencia no sinal. Quanto mais distante o host do ponto de acesso, mais fraco fica o sinal. Isso recebe o nome de [**atenuação**].

Atenuação nada mais é do que a perda de sinal. A distância e as barreiras, causam perda de sinal. Ou seja, quanto mais barreiras existir entre o roteador, ou o [**ponto de acesso**], e o host, ou mais distante estiverem, mais fraco ficará o sinal.

Vamos imaginar duas pessoas conversando. Quanto mais paredes houverem no caminho, ou quanto mais longe uma pessoa estiver da outra, mais baixo o som ficará e mais difícil será para o ouvinte distinguir o que está sendo dito.

É isso que acontece com o sinal de wi-fi também. Pode ser que o sinal sem fio chegue mais fraco na sala por conta do número de paredes e outros objetos que ele tem que penetrar. Mas não existem muitas barreiras desse tipo entre meu quarto e a sala. O que pode estar afetando o Wi-Fi?

Além dessas barreiras, existem outras que também podem atrapalhar o sinal do Wi-Fi.

Vamos voltar ao exemplo das duas pessoas conversando. Se por acaso outras pessoas estiverem conversando ao mesmo momento, pode ser difícil distinguir o que a pessoa que você está conversando está dizendo em meio ao caos de vozes.

Com as redes sem fio esse tipo de problema também ocorre. Como elas se comunicam em frequências específicas, outros aparelhos que trabalham nessas frequências atrapalham a comunicação.

**Telefones sem fio, micro-ondas, dispositivos bluetooth e outros dispositivos sem fio**, como outras redes sem fio interferem no sinal Wi-Fi.

> "Como assim, um Wi-Fi atrapalha outro?”

Bem, sim e não. Se dois equipamentos trabalharem em frequências diferentes esse problema não ocorre, pois seria como se duas pessoas estivessem se comunicando por voz e outras duas estivessem por texto. As “frequências” não se encontram.

Agora, se dois equipamentos trabalharem na mesma faixa de frequência, isso já se torna perceptível.

> “Existe alguma maneira de resolvermos esse problema?”

Existe uma possibilidade, que é de modificar um pouco a frequência na qual a rede atua. Assim o sinal de uma não interfere em outra.

Quando alteramos essa pequena fração da frequência, falamos que estamos **alterando o canal da rede sem fio.**

## Entendendo os canais de Wi-Fi

Quando existem duas redes na mesma faixa de frequência, o sinal de uma pode interferir em outra. Por isso, podemos “mudar” um pouco a frequência dos sinais, desta forma, um sinal não consegue “enxergar” o outro.

Podemos fazer um ponto de acesso trabalhar na frequência 2,412 GHz, e outro em 2,437 GHz. Os dois estariam na mesma faixa (2,4 GHz), porém um sinal não “encontraria” o outro, logo um não prejudica o sinal do outro.

Para ajudar nisso, existem alguns softwares e aplicativos que nos mostram informações sobre as redes sem fio. Um deles é o [**Wi-Fi Analyser**], disponível para Windows, ou [**Wifi Overview**], para Android. Com eles conseguimos ter informações como:

- Os canais da nossa rede e das redes vizinhas;
- Gráfico com as redes e os canais que elas pertencem;
- Os melhores canais disponíveis.

![]

Podemos ver muitas redes estão no mesmo **canal**, ou em canais próximos. Isso causa a interferência do sinal e ainda pode causar quedas e lentidão na rede.

Mesmo em canais diferentes, uma rede pode interferir no sinal de outra. Por exemplo, se uma rede está no canal 1 e outra o canal 2, O sinal de uma rede conseguirá encontrar o sinal da outra e causará interferência.

Tudo bem, vimos que os canais de Wi-Fi podem fazer com que o **sinal de uma rede não interfira em outra**, mas como podemos alterar esse o canal?

## Alterando o canal do Wi-Fi

Essa configuração pode ser feita diretamente no ponto de acesso que, em alguns casos, principalmente em redes domésticas, é o próprio roteador.

Para acessar o roteador, temos que entrar em um navegador e digitar o **IP do roteador**. Geralmente esse endereço fica anotado em baixo do aparelho, o mais comum de ser encontrado é o `192.168.0.1`.

Basta logar com usuário e senha e pronto. Estamos no painel de configurações do roteador.

Na opção `Wireless` temos uma opção chamada **Channel**, ou **Standard Channel**. Se seu dispositivo estiver em português, pode aparecer como Canal. É nessa opção que o ponto de acesso define o canal:

![]

Com isso nós podemos escolher qual canal melhor satisfaz a rede, para que não tenham muitas interferências. Em alguns dispositivos existe também um modo automático, que tenta buscar o melhor canal no momento.

## Para saber mais

O número de canais que existem disponíveis depende do país em que está localizado. Contudo grande parte dos países adotam os canais 1 à 13 para as redes de frequência 2,4 GHz.

Vimos que mesmo em canais diferentes, a rede pode sofre interferência se estiverem muito próximos um do outro. Por isso uma boa prática é alocar as redes nos canais 1, 6, 11. Dessa forma um canal não interfere em outro, garantindo melhor estabilidade e, por consequência, desempenho.

## Como está o sinal?

Ficar sem sinal, ou com um sinal instável de Wi-Fi em casa é muito ruim. Por isso é importante entender sobre o que é o sinal sem fio e o que atrapalha seu sinal.

**A distância, ou as barreiras**, como paredes ou portas, podem afetar o sinal da rede. Porém, além desses, outros aparelhos que emitem sinais nas mesmas frequências do Wi-Fi, inclusive outros Wi-Fi podem afetar o sinal.

Para evitar esse tipo de interferência, vimos que podemos alterar um pouco a frequência de atuação do Wi-Fi, alterando assim seu canal.

Gosta de redes? Aqui na Alura temos uma [**formação de redes**]. Nela você aprenderá sobre o que é um **endereço IP, switch, protocolos de redes, segurança** e muito mais!




O design responsivo, então, surgiu como alternativa para resolver o problema de todos os diferentes formatos aos quais os sites devem se adaptar. Ao projetar templates com base na largura do visor de qualquer dispositivo, todo o conteúdo online se reorganiza de acordo com o tamanho e a resolução da tela, sendo visualizado de forma satisfatória em qualquer aparelho.

Nesse post, você vai entender melhor como essa tecnologia é útil não apenas para a [**usabilidade do internauta**], mas também para potencializar o marketing de seu negócio. Confira:

## Uma página, um URL

Quando várias versões de um mesmo site são desenvolvidas para dispositivos diferentes (normalmente por meio de um processo caro e demorado), o esperado é que cada uma delas possua um URL distinto.

O problema é que isso atrapalha a indexação e ranqueamento dessas páginas por parte de buscadores como o [**Google**], que inclusive [**recomenda o uso do design responsivo**] como padrão para a implantação de websites. 

## Gerenciamento descomplicado

Com a configuração responsiva, as longas horas gastas com o gerenciamento de páginas também estão acabadas. Afinal, vários sites diferentes precisam de diversas campanhas de SEO, certo? Quando apenas uma URL é configurada, o link exige uma manutenção menor.

O [**custo de desenvolvimento**] e gestão de uma só plataforma também é bem mais vantajoso do que a elaboração de sites diversos, que podem exigir uma especialização distinta para cada tipo de dispositivo escolhido.

## Páginas rápidas

Uma das normas feitas pelos desenvolvedores do [**Google PageSpeed**]recomenda que o carregamento completo de uma página mobile aconteça em menos de dois segundos. Afinal, se o usuário esperar muito tempo para que sua página abra, ele pode acabar desistindo do acesso.

O problema é que, na maioria das vezes, uma versão desktop complexa de uma página online não pode ser carregada em um dispositivo móvel em tão pouco tempo. Além de prejudicar o usuário, esse problema também pode afetar o ranqueamento do site pelo Google. 

Felizmente, os sites responsivos são desenvolvidos de forma otimizada para os dispositivos móveis. Por isso, a página é mais leve e pode ser até carregada com mais rapidez do que na versão desktop.

## Foco na experiência do usuário 

Engana-se quem pensa que o design responsivo busca apenas colocar um site disponível para outras plataformas. 

Essa tecnologia se preocupa até com detalhes mais simples, capazes de tornar o site mais fácil de navegar, como links espaçados em dispositivos touch (para que seu dedo não esbarre em algo que você não queira abrir), dimensões de layouts que dispensem o zoom, mais rapidez de carregamento da página, melhor disposição de imagens e textos, etc.

Vários fatores importantes como funcionalidade, usabilidade, desempenho e aparência são cuidadosamente planejados para que o usuário tenha [**uma experiência única**] e se familiarize com o website da forma mais fácil possível.

Os resultados não poderiam deixar de ser positivos e muito variados: eles vão desde um melhor posicionamento de marca até o [**aumento significativo da taxa de conversão**] de seus visitantes, impulsionada pela democratização do uso descomplicado daquela página.

## Vendas potencializadas

Quanto tempo você já perdeu tentando navegar em um site que não funcionava muito bem? Provavelmente não muito, certo? Não há como negar que, nessas horas, a chance de o usuário fechar a página e procurar um concorrente é alta. 

Por outro lado, o que dizer de um site otimizado para mecanismos de busca, com boa usabilidade e ranqueamento nas primeiras posições do Google? Qual a probabilidade desse mesmo usuário acessá-lo no lugar daquela outra página em que ele não conseguiu navegar?

De acordo com o próprio [**Google Insights**], se um cliente fica satisfeito com o seu site e obtém uma experiência positiva de navegação, as chances de conversão para seu produto (ou serviço) são de 67%. Por isso é possível dizer que, se o seu site não possui um design responsivo, ele está te fazendo perder dinheiro.

## Taxas de rejeição combatidas

Mesmo que sua página esteja bem ranqueada em resultados de pesquisas, ela terá problemas de aceitação se não funcionar de forma eficaz para usuários de dispositivos diversos.

O Google interpreta essa rejeição como um sinal de que o site não está oferecendo conteúdo relevante aos usuários, o que provavelmente levará a uma queda na sua exibição e ranqueamento nas páginas desse buscador.

Um site projetado de forma responsiva é capaz de resolver esse problema. Ao apresentar o mesmo conteúdo que você visualiza no desktop de forma funcional em outros aparelhos, não há necessidade de comprometer a qualidade do site nem a experiência do usuário.

Isso garante que os visitantes sempre recebam as informações que estão procurando, o que os mantém na sua página, engajados com sua marca.

## Responsividade para o futuro

Como você já sabe, o design responsivo é feito com base no tamanho e resolução de telas diferentes, levando em conta não o tipo de dispositivo utilizado, mas sim a largura do visor. Ou seja, não importa se o seu cliente está usando um tablet, um iPad ou um smartphone: o layout irá se adaptar bem em qualquer dispositivo, mesmo que ele ainda não exista. 

Isso é importante para o [**marketing digital**] da sua empresa, na medida em que já prepara o seu site para novas experiências futuras.

Assim que os eletrônicos como smartwatches, óculos de realidade virtual e outros lançamentos estiverem ainda mais presentes na vida dos seus clientes, sua página continuará com um bom desempenho. 

Atualmente, é fundamental que qualquer site forneça uma experiência agradável aos usuários de dispositivos móveis. Sendo assim, ter um design responsivo já não é simplesmente uma boa estratégia, mas sim uma necessidade capaz de provocar grandes melhorias no crescimento de qualquer negócio.

E você, o que acha do design responsivo? É algo que você já implementou ou está cogitando utilizar em breve? Compartilhe esse artigo em suas redes sociais e informe seus contatos sobre essa prática a cada dia mais essencial!




Conseguir um lugar no mercado de trabalho é uma tarefa árdua, já que o pequeno número de vagas disputadas contrasta com a grande quantidade de candidatos. Entretanto, é possível ter sucesso na busca por um novo emprego investindo na atualização profissional constante.

## Conheça bem a sua área de atuação

Um bom profissional deve ter domínio sobre os assuntos de sua área de atuação. Procure saber tudo sobre o nicho em que atua, como o número de empresas especializadas no segmento, as inovações tecnológicas que podem afetá-la e as tendências do momento.

Procure também por material específico direcionado à sua profissão, como revistas, publicações científicas ou mesmo sites dedicados ao assunto.

Se não for possível pesquisar em português, é recomendável procurar por textos escritos em outros idiomas. E por falar nisso, você já domina alguma língua estrangeira?

## Estude outros idiomas

Falar sobre a importância de aprender uma língua extra pode parecer clichê, mas essa é uma necessidade no Brasil, onde apenas uma pequena parte da população conhece idiomas além do português.

Apenas [52% dos executivos brasileiros], por exemplo, têm algum conhecimento da língua inglesa, que na maioria das vezes é básico.

Os dados acima revelam a importância e os benefícios de investir parte do seu tempo no aprendizado de outro idioma. Além das vantagens profissionais e do acréscimo de valor ao seu currículo, ter essa nova habilidade possibilita que você entre em contato com diferentes pessoas, culturas e materiais publicados, expandindo o seu horizonte de informações.

O inglês, embora seja a escolha mais comum, não é a única saída para a diferenciação profissional: cursos de mandarim, a língua oficial da China, falada por 14% da população mundial, ou de espanhol, o idioma dos vizinhos e parceiros comerciais na América do Sul, são outras ótimas opções.

## Mantenha-se em constante aprendizado

Mais importante do que aprender tudo sobre sua área é compreender que o avanço da tecnologia e da informação torna obsoletos muitos conhecimentos que pouco tempo antes eram vanguardistas.

Na área de Design, um software de edição gráfica que tenha sido lançado em 2012, por exemplo, já é considerado ultrapassado, tanto por novas atualizações como por lançamentos da concorrência.

Um profissional que tenha investido no aprendizado desse conhecimento ultrapassado e deixou de se atualizar perde pontos preciosos na competição pela vaga de emprego.

Uma forma de evitar a desvantagem é manter um ritmo de estudos constante: eleja os pontos de maior importância da sua área que devem ser sempre estudados e procure atualizações e novidades sempre que possível.

Também é indispensável ficar atento às novas tecnologias ou processos que acrescentem novidades à sua bagagem de conhecimentos. Ao antecipar o problema, os prejuízos são muito menores.

## Frequente e participe de eventos na sua área de formação

Uma das maneiras de manter-se em dia com o que há de novo na sua área de atuação é procurar por eventos e reuniões temáticas. Congressos, palestras e seminários são uma ótima oportunidade de adquirir novos conhecimentos e ouvir pessoas de grande importância no cenário nacional ou internacional.

Outra oportunidade possibilitada por tais eventos é a de fazer um networking com pessoas de sua área. Networking é o termo usado para nomear a criação de redes de contatos entre profissionais, o que pode tornar o seu nome conhecido e recomendado por colegas de profissão. Desenvolver bons contatos é um dos pontos-chave de uma carreira de sucesso!

**Com o tempo e de acordo com seu desenvolvimento profissional, é possível até mesmo inscrever-se como palestrante ou ministrar oficinas nestes encontros, assumindo um papel ativo e aumentando sua exposição entre pessoas consideradas referências em suas respectivas áreas de atuação.**

## Melhore os seus pontos fracos

A pergunta mais temida por qualquer candidato a vagas de emprego é o questionamento sobre pontos fracos. Não se trata de um medo injustificado: mesmo com um currículo exemplar, demonstrar um ponto fraco que cause desencontro com os valores da empresa pode ser fatal no momento da seleção.

Existem várias maneiras de contornar estes problemas e lidar melhor suas fraquezas. Uma das formas mais procuradas por profissionais, mesmo altos executivos é o coaching. A técnica envolve uma gama de conhecimentos, de disciplinas como psicologia e administração, dedicada  a treinar o profissional para desenvolver-se profissional e pessoalmente.

## Procure cursos online para atualização profissional

É inegável que a internet é o meio de comunicação e pesquisa desta geração. A ampliação do acesso e das velocidades de conexão à rede abriu incríveis possibilidades, como a de realizar seus estudos online.

Com o conforto de [**estudar em casa**] e a praticidade de escolher os horários de estudo, esta modalidade tem conquistado grande público, [crescendo mais] que as formas tradicionais de ensino.

A oferta e a variedade de cursos são imensas: procure por um que se adapte ao seu modo e ritmo de aprendizado, e dê preferência para plataformas que possuam boa reputação, considerando também as avaliações positivas dos usuários.

Outra forma de aprendizado online está nos [grupos de discussão de nicho] espalhados por toda a internet e em aplicativos de conversa. Eles oferecem uma possibilidade de contato com profissionais de todo o mundo, facilitando a troca de informações.

É possível encontrar grupos como essa característica em [**redes sociais**] ou em fóruns mais específicos, como o [Stack Exchange], que possui mais de 100 sub-fóruns dedicados exclusivamente a assuntos como design, programação ou linguagens.

## Esteja informado sobre o que acontece no mundo

Embora não seja contado em currículos ou portfólios, saber quais são as movimentações mais recentes no palco mundial - no âmbito da política, economia ou cultura - faz de você uma pessoa e um profissional mais completo.

Possibilita, ainda, oportunidades para conversas produtivas com outros profissionais, elevando e destacando o seu perfil.

Neste texto, falamos sobre a importância de se manter em atualização profissional constante e ensinamos algumas dicas para quem quer aumentar seus níveis de conhecimento e tornar-se um profissional de destaque. Comece agora mesmo a sentir o impacto do estudo contínuo em sua carreira!

Gostou do post e quer melhorar suas chances no mercado de trabalho? Não perca tempo e invista agora mesmo no seu [aprendizado online]!




Trabalhar com Flutter rodando ele pelo terminal pode ser prático, mas ter ele integradinho na sua ferramenta de desenvolvimento favorita pode ser muito mais produtivo, e no meu caso com o VsCode eu realmente curto bastante! Se baseando nisso hoje vou ensinar como integrar o **Flutter no VsCode**.

**Pré requisitos**

Para aproveitar melhor esse post, eu recomendo que você faça ele após ter um projetinho Flutter criado, se você quiser ver como começar [da uma olhada nesse artigo] ou se preferir em vídeo assiste aqui  

http://www.youtube.com/watch?v=xSC8j3gl7xM

Lembrando que na plataforma da **Alura**, esses e vários outros conteúdos mais extra cursos de diversas [tecnologias estão disponíveis através do **Alura+**] dentro da plataforma da alura  

> Você vai precisar ter criado pelo menos um **emulador Android** e ter feito o [**processo de setup do Flutter em sua máquina**]  

## **Mão na massa**

Eu usarei no [exemplo esse projetinho de instagram fake], mas fique a vontade pra criar o seu projeto para acompanhar o post. Com o VsCode aberto, baixe a extensão do Flutter, que irá fazer a integração dos comandos da **CLI** com a estrutura do nosso editor

imagem + Shift + P é possível visualizar todos os comandos Flutter disponíveis dentro do VsCode  

![]

Para subir dois emulador basta selecionar o comando launch emulator e escolher o que falta pra você.  

O VSCode atualmente não suporta sincronizar dois emuladores, portanto caso você queira debugar vai precisar ficar alternando entre os emuladores através da opção **">Flutter Select Device"** desligando e ligando o projeto.  

O que eu faço no dia a dia para ser mais produtivo é escolheru ma plataforma, ex o **Android** e deixar a outra rodando via uma aba do terminal 100% separado do VSCode, o único foco é garantir que o layout está saindo certinho nas duas plataformas.  

Para isso, após ter 2 emuladores abertos, rode o comando **flutter run** e na sequência pede o ID como na imagem abaixo do emulador que você quer abrir

![]

Após copiar o ID, basta rodar o comando novamente mas com esse formato **flutter run -d IDDOEMULADOR**  

![]

Por hoje é isso, vejo você no próximo artigo, Espero que tenha gostado, em breve trarei mais dicas, não deixe de [me seguir nas minhas redes sociais] e acompanhar meus outros artigos em meu site pessoal [https://mariosouto.com].




Nos tempos atuais de incertezas e mudanças, as empresas com modelos tradicionais não dão conta de responder rapidamente a um momento em que as tecnologias se renovam constantemente.

Para responder rapidamente a essas mudanças, muitas empresas estão em busca do modelo *Business Agility*, que se trata de agilidade do negócio. E quando falamos em *Business Agility*, estamos falando em muito mais do que aplicar apenas os [**métodos ágeis**]. As empresas estão repensando todo os seus modelos de negócios, destravando muitas vezes processos e burocracias que impedem que a organização cresça de maneira ágil.

O ponto de partida das organizações é [**adaptar a cultura organizacional**] a essas mudanças também. Se uma empresa não tiver como valor na cultura a adaptabilidade, dificilmente terá sucesso com a mudança comportamental das pessoas. 

Os colaboradores precisam se adaptar a esse ambiente e estar preparados para as mudanças. Adaptabilidade é uma característica determinante para fazer parte de uma organização com a cultura ágil. 

Mas como você pode se preparar para trabalhar em uma empresa com a cultura ágil?

Aqui vai algumas dicas: 

- **Aprender sobre o manifesto Ágil**: O primeiro ponto é aprender sobre [fundamentos de agilidade]. Independente da área que você trabalhar, precisará entender esse mundo, para a engrenagem funcionar. 

- **Explorar um pouco sobre o Mindset necessário para embarcar no mundo Ágil**: Explorar características como autonomia, confiança e colaboração são características chaves nesse processo de mudança.

- **Conhecer os papéis e suas responsabilidades**: Conhecer os papéis necessários e suas responsabilidades, faz parte para que uma transformação ágil seja bem sucedida. Explorar como as equipes ágeis são organizadas, vai ajudar muito a fazer parte desse novo universo.

- **Agilidade no dia a dia**: Aprender como priorizar tarefas, mensurar resultados, identificar gargalos e tudo que possa agilizar o fluxo de trabalho.

- **Entrega de valor**: Toda essa mudança se resume em entregar valor para o cliente de maneira rápida, e com qualidade. Esteja preparado para se alinhar com a cultura ágil da empresa e gerar mais valor para o negócio e para o cliente.

https://www.youtube.com/watch?v=F_XPMcLo9ao

Nesse mundo de de tantas mudanças, muitas empresas já começaram ou vão começar a enraizar a cultura ágil, e estarão em busca de pessoas atualizadas, e nós como colaboradores precisamos estar preparados para entregar o que estão buscando.

Se você pensa em se preparar, ou preparar toda a sua empresa, conheça nossa [**Formação Bussiness Agility**]. Com ela, você, sua equipe, e toda a empresa vão poder colocar tudo em prática!



Quando vamos fazer um aplicativo Android, inúmeras vezes será necessário utilizar uma lista, o Alex mostrou para gente como [**criar uma lista**] e [**personaliza-la**] usando `ListView`.

Depois que fazemos todo esse procedimento vemos que a listagem às vezes engasga quando estamos passando os seus itens, vamos entender porque isso acontece. Vamos analisar esse `Adapter` :

java

Bom, nada de novo até agora, mas nesse momento estamos com um pequeno problema, quando nossa lista está com muitos itens ela trava, por quê ?

## Entendendo o processo de criação entre a ListView e o Adapter

O `ListView` quando é criado, pergunta ao `Adapter` qual é a quantidade de itens que ele terá, e recebe a resposta atráves do método `getCount()`.

Quando recebe a quantidade ele começa a se preparar para exibir os itens, vendo a quantidade que caberá na tela, vamos imaginar que sejam apenas 5 itens qua possam ser exibidos, nisso o Android vai inflar esses 5 itens e vai devolver para o `ListView` através do método `getView()`, além disso o Android acaba inflando mais duas views, para reaproveitarmos.

Está view que é criada para reaproveitamento é a view que recebemos como parâmetro no método `getView()`, chamamos ela de `convertView` :

imagem` para cada view.

O `findViewById()` percorre o xml em busca da view, perguntando para cada view se ela possui aquele id, indo da view principal descendo sobre seus "filhos" da esquerda para a direita, como se fosse uma árvore genealógica.

Isso num layout mais complexo levaria um certo tempo para encontrar cada view certinha e popula-la, por isso precisamos dar um jeito de fazermos a busca apenas quando criamos o item e quando reaproveitarmos o item criado, também aproveitar as buscas.

java

Dessa forma resolvemos o problema! Pena que o compilador está reclamando, pois quando formos reaproveitar uma view não teremos referência para os `TextView`, e agora?

## Implementando o ViewHolder

Bom, para resolvermos esse problema existe um **design pattern** chamado `ViewHolder` que irá segurar as informações da view.

Para utilizarmos esse pattern iremos criar uma classe que precisará da view que ela pegará as informações.

Java

Legal, classe criada, está faltando apenas a usarmos. Bora fazer isso !

java

Poxa, parece tudo certo, entretanto ainda estamos sendo barrados pelo compilador. O mesmo erro que estávamos lendo antes, quando formos reaproveitar a view o `ViewHolder` não será criado, portanto não terá referência para ser usado.

Para resolver isso, precisamos deixar o `ViewHolder` "pendurado" na view que ele pertence, dessa forma, quando formos reaproveitar a view, conseguiremos o recuperar.

java

## Conhecendo a API RecyclerView

Embora tenhamos implementado a `ListView` considerando todos os detalhes que vimos neste post, repare que tivemos que ter o conhecimento do `ViewHolder` para implementá-lo. Em outras palavras, se não o conhecêssemos, ainda teríamos o problema de performance conforme a lista fosse crescendo...

Pensando justamente nesse e outros detalhes, a Google disponibilizou uma API mais inteligente para a criação de listas que já nos obriga a realizar todas as implementações que vimos no `Adapter` e na `ListView`, e também, a implementação do `ViewHolder`!

Essa é a API `RecyclerView` que é explicada com mais detalhes [nesse post que escrevi]! Recomendo fortemente a leitura, pois é a forma mais adotada pelos desenvolvedores Android para criação de lista nas Apps.

## Resumo

Como vimos, para termos um `ListView` com boa performance, precisamos reutilizar as views que o Android cria a mais para gente, só para lembrarmos o nome que damos para essa view é `convertView`.

Além disso para melhorar de vez a performance, podemos evitar que ele faça `findViewById`s desnecessários, utilizamos o padrão `ViewHolder` que irá cuidar de fazer isso para nós e associamos ele a view cujo ele pertence, desta forma otimizamos bastante o funcionamento da lista, agora nada de ve-lá engasgar! :D

**Quer ver mais dicas bacanas sobre Android? Aqui na Alura [temos vários cursos de Android], se você preferir presencial na Caelum [temos dois cursos bem bacanas]!**





imagem 

Veja como manipular string no Pandas e veja meios de manipular seu data frame e tratar os dados da forma que precisar.


Imagine uma plataforma de música online chamada Alurafy, que permite tocar músicas, playlists e assinar dois tipos de planos. Os usuários acessam as páginas (URIs) e temos os dados crus em uma tabela com:

- coluna representando o ID do usuário (caso ele/a esteja logado/a)
- coluna com a URI acessada
- coluna com o status de resposta, se foi sucesso (200) ou um erro interno (500):

python

imagem:

python 

Resultando nas colunas em minúsculo:

python 

Mas os espaços em branco ainda estão lá. Podemos pegar essa série de dados, usar novamente o `str` e trocar os espaços por `underlines`:

python 

Finalmente com as colunas com os nomes que eu desejava:

python 

Se atribuirmos os valores dessas colunas a elas mesmas:

python 

![]

E essa linha de padronização dos nomes das colunas pode ser usado em quase todo projeto logo após importar um csv.

Agora vamos dar uma olhada nas páginas acessadas através de suas URIs:

python 

python 

Agora gostaria de criar uma coluna nova indicando se ao acessar aquela página, o usuário estava querendo comprar algo. Isto é, a URI começa com `/compra/`? Se sim, `True`, se não `False`. Para isso temos a função `startswith`:

python

Portanto estamos buscando numa coluna de string/texto pelas linhas que começam com determinado valor. Agora imprimimos com uma query os 5 primeiros elementos que estão com `True`:

python 

Resultando em:

![]


Para agrupar e contar o número de páginas de compra versus o número de outras páginas, vamos pegar a coluna `comprando` e somar seus valores:

python

E percebemos que temos cerca de 9.5% de acessos as páginas de compras:

python 

Por fim, cometemos um erro. Na verdade existem também as páginas de compra como do dia primeiro de abril em `/promocao_primeiro_de_abril/compra/plano_basico`. Portanto queremos não só as URIs que começam com `/compra/` mas que posseum no meio o trecho `/compra`. Além da função `startswith`, str nos permite executar diversas outras funções, como `contains`:

python

![]

Agora sim, criamos a coluna nova de acordo com quaisquer páginas que possuem o trecho `/compra/` em sua URI.

Resumindo, sempre que precisar trabalhar com uma coluna do tipo string, para extrair valores dela, fazer transformações de string para string, [**dê uma olhada na documentação da `str` para ver se ela já possui o que você deseja fazer**]. São algumas dezenas de funções.

O notebook com [**todo o conteúdo desse post pode ser encontrado no github**].

Dentra da **Alura** disponibilizamos diversos [**cursos de Python, Pandas, Data Science e Machine Learning**], onde vamos muito além da manipulação inicial dos dados.




Vamos supor que você é um líder que contratou treinamentos online para a sua equipe. Você escolheu os cursos, planejou e fez um cronograma para que cada membro do time pudesse aprender o máximo possível. Agora chegou a hora de mostrar para o seu supervisor,ou mesmo para o setor financeiro, os resultados que esse treinamento teve.

Medir o retorno sobre o investimento dos treinamentos online corporativos pode ser um desafio, pois é preciso **comprovar que foi o investimento em pessoas que gerou um determinado resultado**, e não outros fatores. Mas, seguindo o Método Kirkpatrick-Philips, você vai conseguir entregar um relatório do ROI com sucesso.

Então, como medir o ROI dos treinamentos online?

## Primeiro, faça uma análise dos impactos positivos

Para facilitar na hora de medir os resultados, você precisará analisar vários fatores que possivelmente foram impactados pelo treinamento, começando com as mudanças imediatas. Que tal descobrir as reações dos participantes? Eles consideraram o treinamento adequado às suas necessidades? Você pode realizar uma pesquisa com formulários online, ou entregar fichas de satisfação, para que os funcionários avaliem o treinamento de forma anônima.

Depois de vários dias após a finalização da capacitação, você vai querer saber se os participantes ganharam novos conhecimentos que podem ser aplicados no trabalho deles. Caso o treinamento foi focado nas habilidades técnicas, você pode verificar se a execução das tarefas do dia a dia melhorou em questões de **maior desempenho**, **menos bugs** ou **criação de novos produtos**.

Caso a sua equipe tenha participado de um treinamento em _soft skills_ – como atendimento ao cliente, negociação ou liderança – você pode observar **mudanças no comportamento ou melhorias no trabalho em time**.

Com o passar do tempo, você vai querer **validar se os resultados do treinamento foram duradouros ao longo prazo**, então você pode realizar pesquisas de satisfação dos funcionários, conhecidas como pesquisas de clima. E, por último, você vai precisar avaliar os resultados totais do treinamento para dizer **qual foi o impacto no negócio**.

### Método da avaliação do treinamento em 4 níveis

Baseado nesses passos, Donald Kirkpatrick, ex-presidente da _American Society for Training and Development_, elaborou o _Método da avaliação de treinamento em 4 níveis_, sendo eles:

- **1\. Avaliação da reação de quem aprende** _Como os participantes se sentem após o treinamento?_
- **2\. Avaliação do aprendizado** _Os participantes adquiriram novo conhecimento e/ou mudaram a sua atitude após o treinamento?_
- **3\. Avaliação do comportamento** _Os participantes aplicaram o conhecimento no dia a dia do seu trabalho mesmo após um longo período da finalização do treinamento?_
- **4\. Avaliação do resultado** _Quais foram os efeitos finais do treinamento em seu negócio, tais como aumento no número de vendas, diminuição das reclamações dos clientes, rotatividade dos funcionários?_

Como você pode perceber, nenhum dos níveis examina especificamente o retorno sobre o investimento que o treinamento possivelmente trouxe para a sua empresa. Para avaliar estes impactos, é preciso comparar os gastos com os ganhos.

Ainda que o nível 4 do método do Kirkpatrick já ajude a medir alguns resultados financeiros – como aumento nas vendas ou indicadores chaves da performance (KPIs) da empresa –, ele recebeu várias críticas por deixar de lado a questão do custo-benefício.

Então, **como fazemos para obter um relatório que indica se o nosso investimento valeu a pena?**

## O ROI dos treinamentos na prática

Jack Philips, fundador do _The ROI Institute_ – organização que ajuda gestores no processo de avaliação dos treinamentos corporativos –, aprimorou o Método do Kirkpatrick com o seu trabalho.

Este grande mentor em avaliação de treinamentos acrescentou o quinto nível a esse método, e trouxe uma **fórmula para medir o ROI**, comparando os custos totais dos treinamentos com os benefícios líquidos obtidos mediante estas ações.

A fórmula do Philps para medir o ROI dos treinamentos é a seguinte:

imagem com Java, com duração de 12 horas, no seu horário de trabalho. Se formos considerar que ele recebe R$ 70 por hora, a empresa investiu mais **R$ 70 x 12 horas = R$ 840**.

### Curso TDD com Java

Antes de iniciar o curso de TDD com Java, Thiago enfrentou a seguinte situação: a cada 5 funcionalidades desenvolvidas, 2 voltavam com erro e ele precisava de 10 horas para consertá-las. Após completar o curso, só 1 das 5 funcionalidades continha um erro para arrumar, então, **o retrabalho neste caso diminuiu pela metade**, de 10 para 5 horas.

Por mês, o Thiago precisa testar 15 funcionalidades, logo, temos um **retorno sobre investimento de 15 x 70 = R$ 1.050**.

Agora, ele pode dedicar mais tempo ao desenvolvimento e à liderança da sua equipe, pois tem menos retrabalhos. Para a empresa, os gastos com esses retrabalhos diminuíram.

Entretanto, você percebeu que o time do Thiago está entregando menos, comparado com a equipe de designers. Após falar com ele sobre os desafios da sua equipe, ele contou que, atualmente, as reuniões semanais ocupam 20% do tempo dos desenvolvedores, e só 10% delas são realmente produtivas, resolvendo bugs e trazendo ideias de melhorias. **Será que é possível diminuir o tempo das reuniões e aumentar a produtividade da equipe?**

### Curso Metodologias Ágeis com Scrum

Considerando que a equipe dos desenvolvedores tem 7 pessoas, e que cada uma delas trabalha 40 horas por semana e recebe R$ 50 por hora, se 20% dos seus horários forem gastos com reuniões – das quais só 10% são significativas para o crescimento da empresa –, isso resulta em um gasto semanal de 7 x 200 (10% do salário semanal de R$ 2.000) = R$ 1.400.

Então, você decidiu que o Thiago faria mais um curso, desta vez sobre metodologias ágeis. Ele participou de dois cursos de Scrum na Alura, com duração total de 10 horas. Então, seria outro investimento de horas do seu trabalho: **10 x 70 = R$ 700**.

Após concluir os dois cursos, ele trouxe novas ideias e técnicas de gerenciamento ágil. Agora, ele realiza reuniões várias vezes por semana que são mais curtas e focadas em um assunto concreto. Estes encontros **passaram a ocupar só 10% do horário dos colaboradores** e levam sempre a resultados importantes. Então, comparado com o tempo passado em reuniões anteriormente, \*\*a empresa poupa semanalmente R$ 1.400, e mensalmente R$ 5.600.

## Agora, vamos medir o ROI dos treinamentos online da Alura

**Chegou a hora de preparar o relatório dos resultados dos treinamentos.** O investimento total era de R$ 900 (investimento no plano corporativo de cursos online) + 700 + 840 (horário de trabalho investido em treinamento) = **R$ 1.810**.

Os **ganhos líquidos monetários** da capacitação eram de R$ 1.050 (ganhos obtidos com o treinamento em TDD com Java) e R$ 5.600 (ganhos obtidos com o de Scrum). Assim, teremos um total de **R$ 6.650**.

A fórmula do ROI dos treinamentos para o nosso exemplo seria:

![fórmula para medir o ROI dos treinamentos online]

No nosso exemplo, obtivemos um **retorno sobre investimento de 367,40%** já nos primeiros meses desde o treinamento. Se formos avaliar os benefícios após um ano de sua conclusão, ganharíamos um número até maior. Logo, poderíamos considerar a disponibilização dos cursos para outras equipes ou setores, seja para ganhar mais _insights_avançados de Scrum ou continuar com cursos diferentes, seguindo a demanda dos clientes.

E na sua empresa, **quanto tempo as reuniões das equipes ocupam**? Quais delas estão realmente gerando soluções de problemas e trazendo ideias relevantes para o negócio? E, finalmente, você já mede os resultados dos treinamentos corporativos para obter o ROI?

## Cursos online como um investimento valioso

Os cursos online representam uma das diversas opções para os colaboradores da empresa adquirirem conhecimento e, sem dúvida, podem trazer resultados financeiros interessantes para o seu negócio.

Contudo, para sermos capazes de relatar o sucesso das capacitações e justificar o nosso investimento, devemos sempre **medir os resultados para descobrir onde e quais benefícios ganhamos**, comparando os ganhos líquidos com o investimento feito inicialmente.

Para saber mais sobre a mensuração dos treinamentos online acesse o eBook [**Como mensurar o ROI dos treinamentos online: Exemplo dos cursos na Alura**]. Ele pode servir como um guia para ajudar a medir o retorno sobre o investimento, usando mais uma vez o Método Kirkpatrick-Philips.



Vou personalizar uma **ListView no Android** para que cada item da lista tenha seu próprio visual, dando uma maior flexibilidade para o desenvolvimento minha app.


No artigo sobre [**como criar listas com o `ListView`**] que eu escrevi anteriormente, vimos como é possível criar uma lista bem básica no Android. O resultado da lista criada foi:

imagem`, `getItem(int position)`, `getItemId(int position)`. Perceba que são métodos relacionados a uma lista! Para implementá-los da maneira correta, precisamos de uma lista dentro do nosso adapter.

Lembra que enviávamos a nossa lista via **construtor** no `ArrayAdapter`? Faremos o mesmo no nosso adapter para que possamos implementar esses métodos da maneira esperada:

java

### Informando o total de itens da lista

Agora podemos implementar os nossos métodos! Vamos começar pelo `getCount()`. O próprio método já diz o que ele faz: conta quantos itens existem na lista. Ou seja, o **tamanho** da lista.

java

### Devolvendo o item da lista pela posição

Agora vamos para o `getItem(int position)`. Veja que ele quer saber um item a partir de uma posição. Isso é fácil! Basta apenas retornamos por meio do método `get()` mandando a posição:

java

### Devolvendo o id do item da lista

Vejamos o próximo: `getItemId(int position)`. Esse método espera saber qual é o **id** do objeto que está sendo buscado. Porém, se verificarmos a nossa classe que representa um curso:

java

Veja que ela não possui um id. Para esse caso nós temos duas alternativas:

- 1) Manter o retorno como 0;
- 2) Adicionar o id ao curso e, pegar o objeto pelo método `get()` e então usar o getter do id.

Atualmente, não precisamos do id, então, por enquanto, devolveremos 0.

## Criando a View para cada item

Ótimo, implementamos os 3 primeiro métodos referente a lista que enviamos, porém ainda falta mais 1 que é o `getView()`:

java

Repare que agora ele retorna uma `View`, ou seja, esse é o método responsável pela construção de cada item! O que precisamos para implementá-lo?

Inicialmente, precisamos, de alguma forma, pegar a `View` que representa o nosso **layout personalizado**. Afinal é ela que queremos apresentar na nossa lista!

Mas, para pegar uma `View`, nós precisamos de uma `Activity` e a nossa classe, além de não ser uma `Activity`, não possui uma `Activity`.

E agora? O que faremos? Se dermos uma olhada na forma que fizemos para instanciar o `ArrayAdapter` anteriormente:

java

Veja que estamos passando passando o parâmetro **`this`** que representa o objeto da própria `Activity` que está fazendo a chamada. Precisamos receber também essa `Activity` via construtor:

java

Agora sim podemos chamar uma `View`!

Queremos criar uma **`View`**, ou seja, ao invés de só buscá-la via o método `findViewById()`, nós iremos criar a `View`.

Em outras palavras, inflar uma `View`! E para isso iremos utilizar o método `getLayoutInflater()` da `Activity` que é responsável em inflar uma `View`:

java

Pegamos o responsável em inflar e chamaremos o **método `inflate()`** que criará a `View` e a retornará para nós:

java

Perceba que utilizamos o `parent` que vem como parâmetro do método `getView()`. Mas o que ele representa? Como podemos ver, o `parent` é a própria `ViewGroup`, ou seja, o layout pai ao qual iremos adicionar a nossa lista, por isso enviamos ele.

Além disso, ainda existe o último parâmetro que recebe um valor booleano, esse parâmetro indica se queremos criar, nesse exato momento a `View`.

Mas, não fizemos nenhum tipo de alteração como adicionar as informações do curso, por isso mandamos o `false`. Dessa forma, podemos associar tudo que queremos e só depois ele criará de fato a `View` :)

Certo, pegamos a nossa `View` e agora precisamos de um curso, certo? Mas qual curso?

Veja que, ainda existe um parâmetro no `getView()` que é o `position`, ou seja, é justamente nessa posição que devemos pegar o elemento da lista que foi passada, nesse nosso caso, o curso:

java

## Preenchendo os valores para cada item da lista

Ótimo! Agora já podemos chamar as outras `View`s e preencher as informações e então, retornar o objeto `view`:

java

O nosso próprio adapter está implementado:

java

Para testarmos a nossa implementação, basta apenas alterar na `Activity`, que chamava o `ArrayAdapter` do Android, para chamar o nosso adapter:

java

> Observe que não foi apresentada a implementação do método `todosOsCursos()` justamente para ser mais objetivo na implementação do componente `ListView`. Compreenda esse método como um acesso aos dados qualquer, seja uma lista estática, banco de dados ou qualquer meio que devolva uma lista de cursos.

Agora se testarmos a nossa app:

imagem` do nosso adapter:

java 

Observe que estamos setando a **mesma imagem para todos os elementos da lista**! Precisamos de alguma informação do curso para sabermos a que ele se refere!

Atualmente, não temos nenhum tipo de informação para categorizar os nossos cursos, então que tal criarmos um enum para isso?

java

E agora adicionamos um **enum** para a nossa classe curso:

java

Muito bom! Agora basta verificarmos a qual categoria o curso refere-se e então settamos a imagem apropriada:

java 

Essa solução com esse tanto de `if` e `else` funciona, porém não é uma boa prática! [**Nesse post**] eu detalho um dos grandes problemas que temos com esse tipo de solução e como podemos resolver de uma maneira mais elegante.

Adicionamos as nossas condições para setar as imagens, então agora vamos testar e ver o resultado:

imagem` para adicionar conteúdo diferente de acordo com algum critério, como foi o caso da imagem específica para cada curso.

## Código fonte

Caso tiver dúvidas ou simplesmente quiser consultar o código fonte do projeto utilizado como exemplo, fique à vontade de dar uma olhada no [github]. Lembrando que para essa etapa do projeto eu fiz uso da branch **lista-personalizada**.

E aí, gostou de criar uma lista própria? Quer aprender mais dicas sobre o Android? Que tal conhecer [**a formação Android**]. 




Temos um sistema desktop que gerencia os funcionários de uma certa empresa. Para realizar tal tarefa, o sistema necessita que todos os usuários estejam cadastrados.

Temos nosso formulário de cadastro representado pelo seguinte código:

java

Ao executarmos a aplicação, temos o seguinte resultado:

imagem 99713-3837, para o CPF 893.920.408-57 e, também, não é nada legal deixar a senha explícita desse jeito. Como formatar tais dados?

## JTextFormattedField

Precisamos colocar uma máscara em cima dos nossos campos para que, conforme os dados sejam inseridos, nossos campos já consigam formatá-los. Infelizmente a classe [**JTextField**] não dá o suporte para formatação dos dados, mas para isso existe outra classe.

A classe [**JTextFormattedField**] estende a classe `JTextField`. Essa classe adiciona suporte para mascarar os dados do seu campo. Com isso podemos limitar e formatar os dados inseridos pelo usuário.

Agora que já sabemos o que precisamos usar, vamos por a mão na massa. Primeiro vamos colocar máscara no campo de telefone, para isso vamos alterar o atributo `telefone`:

java

Perceba que só foi necessário trocar o lado direito da declaração, pois como `JFormattedTextField` estende `JTextField` o mesmo não deixa de ser um `JTextField`.

Também podemos observar que passamos um objeto do tipo [**MaskFormatter**] e nele passamos a máscara que nosso campo terá. No caso, passamos "(##) #####-####", essa “#” significa que o campo só irá aceitar números.

Se rodarmos nossa aplicação novamente veremos o resultado:

![]

Boa, deu certo. Agora para o CPF, queremos, também, que só seja permitido dígitos e a formatação específica do CPF, certo? Bom, para isso vamos fazer a mesma coisa que fizemos com o telefone:

java

Executando o código:

![]

E por último, a senha. Como encobrir os caracteres da senha com aquela bolinha preta?

## JPasswordField

Igual ao `JFormattedTextField` o [**JPasswordField**] também estende `JTextField`. Essa classe, por sua vez, é um componente que representa um campo para digitar senhas ou informações sigilosas, pois ela esconde o valor original digitado e, por padrão, converte para as bolinhas pretas que estamos habituados a ver em campos de senha.

Para adquirir o resultado esperado, vamos trocar o atributo `senha`. Dessa forma:

java

Ao executar a aplicação temos:

![]

Pronto, todos os campos foram devidamente formatados!

## Conclusão

Praticamente todos os formulários têm a necessidade de usar máscara para seus campos para auxiliar o usuário que está inserindo os dados, evitando erros e complicações no momento de preenchê-los.

Outra vantagem de fazer isso é que você vai conseguir ter um conhecimento melhor de como os dados vão chegar no seu servidor, logo, facilita na hora de tratar os dados.

Todas as classes que usamos aqui são do pacote [**javax.swing**], que, por sua vez, nos provê componentes para montar nossas telas em aplicações Java para desktop.

Atualmente temos o [**JavaFX**], que, também, é uma biblioteca do Java para montar aplicações desktop. Ele veio para resolver alguns problemas do `swing` como a dificuldade para desenvolver usando os componentes desse pacote, a falta de componentes mais ricos visualmente e outros empecilhos.

Para saber mais sobre JavaFX, a [**Casa do Código**] possui um livro que [**destrincha grande parte dos seus componentes**], lá você vai entender o que é o JavaFX e como utilizar em suas aplicações. E a Alura tem a [**Formação Java**], onde você aprenderá muito mais sobre a linguagem e suas peculiaridades.



Isso acontece com um carro, por exemplo, depois de uma certa quilometragem você precisar trocar os pneus, algumas peças do motor, etc. O mesmo acontece com o seu computador que, depois de um tempo precisa de um upgrade, um disco maior, adição de mais memória RAM e assim por diante...

imagem 


A aplicação de técnicas por meio da engenharia de software tem o objetivo de utilizar esses mesmos conceitos: módulos plugáveis que podem ser atualizados ou trocados.

No mundo dos **softwares open source as comunidades acabam fazendo isso com certa normalidade, evitando ao máximo que essas atualizações gerem impactos negativos no que já está funcionando.**

Falando no framework **Emberjs**, podemos citar a relação entre o Ember, Handlebars e Glimmer como um exemplo. Apesar de seu surgimento ter acontecido em momentos diferentes, estão em busca de uma mesmo ideal: **tornar o desenvolvimento web mais eficaz**.

O projeto Ember surgiu como um fork do Sproutcore e a engine de templates Handlebars foi um aprimoramento do [Mustache].

Uma engine de templates serve para **interpolar valores dinâmicos obtidos em uma Linguagem de Programação a trechos de código HTML**.

No caso do **Handlebars** isso pode ser feito utilizando a linguagem Javascript, rodando em praticamente qualquer navegador de internet, evitando de usar HTML embutido, base de tecnologias que são utilizadas em arquivos .erb, .jsp, .asp, etc. Por exemplo, tendo o seguinte template:

js

Combinado com o Objeto:

js

Traria o seguinte resultado:

html

Além do Ember e Sproutcore já mencionados, outros projetos também usam o Handlebars, como o [**YUI**], que tem sua própria versão do Handlebars, ou o [**Marionette.Handlebars**], que é a integração com a biblioteca [**Marionette**].

O Ember extende o Handlebars, dando a ele uma forma de estruturar os arquivos e suporte ao binding de propriedades automaticamente. Vamos exemplificar com um componente no Emberjs

js

A principio teríamos o HTML:

html 

Mas a medida que o alterarmos o conteúdo do input, o valor do também será alterado, por exemplo se digitarmos Glimmer, teríamos algo parecido com o HTML:

html 

Essa "facilidade" do **two way data binding**, onde você altera o valor do atributo no HTML refletindo no Javascript ou vice-versa, tem seu custo e até a versão 2.9.X, o Ember tinha um problema de performance, se comparado aos concorrentes do mercado(Angular, React, etc).

A partir da versão [2.10] o Ember trouxe uma grande atualização e baseada no conceito de "estabilidade sem estagnação", a transição entre as versões 2.9 e 2.10 pode ser feita de maneira suave.

Além dos problemas de performance, essa atualização também diminuiu significativamente o tamanho dos assets gerados no processo de build. Para se aprofundar nisso é só dar uma pesquisada que vai achar benchmarks bem interessantes!

Até a versão 2.9, a integração entre o Ember e o Handlebars era feito pelo [**HTMLBars**], posteriormente, a partir da versão 2.10, esse motor de renderização foi trocado por um novo, chamado de [Glimmer], ele se denomina como uma biblioteca de componentes gráficos rápida e leve feita pela equipe do Ember e apesar dele ser composto de vários projetos nos referiremos a ele de maneira singular.

O Glimmer pode ser usado de maneira independente do Ember, porém parece não fazer sentido termos apenas o motor sem as rodas e chassi.

## Resumindo...

Em resumo, poderíamos dizer que o Glimmer 2 - assim nomeado em seu [anúncio] - foi uma evolução do HTMLBars(Glimmer 1), em que o processamento dos templates era feito utilizando a API do DOM, revitalizado como um novo projeto, utilizando várias técnicas de engenharia onde o processamento dos templates é feito de maneira incremental.

Agora pode surgir outra pergunta:

> _"É possível usar o Glimmer sem o Ember?"_

A resposta seria sim, mas lembre-se, ele é apenas uma biblioteca de componentes. Um fato para ainda utilizar o Ember seria o sistema de roteamento de endereços e templates.

Esperamos que com o tempo surjam mais e mais atualizações como essa, podendo melhorar nossas aplicações sem necessidade de reescrevê-las completa ou parcialmente.

Quer conhecer mais sobre o Ember, [**veja nosso livro em português pela Casa do Código!**] Acompanhe também as novidades da [Casa do Código] no [Facebook] e [Twitter]! ;)





Durante o desenvolvimento de um projeto web, nosso cliente pediu que no cadastro de endereço criássemos um recurso para busca de CEP automática facilitando o processo para o usuário, mas como podermos fazer isso?

Inicialmente, poderíamos adicionar algum tipo de botão ou listener que ficasse responsável em fazer uma requisição HTTP enviando o CEP, e então, recarregasse o formulário automaticamente.

Porém, quando estamos em formulários de cadastro de endereço, como por exemplo em sites de e-commerce, é muito comum adicionarmos apenas o CEP e as informações já aparecerem sem ao menos recarregar a página, certo?

Da nossa forma inicial, ou seja, recarregando a página, não entregaríamos essa experiência para o usuário... E agora?

## Entendendo o AJAX

Através do Javascript conseguimos enviar requisições para determinadas URLs e obter suas respostas sem que as páginas sejam recarregadas, em outras palavras, quando o usuário sair do campo do CEP ou clicar em um botão, a busca do mesmo será efetuada e as informações serão preenchidas para usuário sem que a página recarregue.

Esse método de requisição no Javascript é conhecido como [AJAX]. Legal, mas como poderíamos aplicar esse tal de AJAX? Em um primeiro momento podemos pensar em simplesmente realizar o download de uma biblioteca contendo a funcionalidade que precisamos, talvez a mais famosa seja o [JQuery].

Porém não parece ser uma boa idéia incorporar uma biblioteca em nosso projeto apenas para realizar um AJAX, pois estaríamos utilizando cerca de 10% do que a mesma pode nos oferecer.

Então como devemos solucionar o problema sem criar uma dependência com terceiros? Criaremos nossa própria funcionalidade para buscar os CEPs para atingir o resultado desejado.

## Pegando o formulário HTML

Nosso primeiro passo será de fato pegar o nosso formulário HTML para aplicarmos o AJAX. Para este exemplo farei uso [deste formulário] que está no meu Github, ou seja, se você quiser seguir o passo a passo, pode baixar também! ;)

![]

Com o HTML pronto, precisamos começar a implementação da busca de CEP conforme nosso cliente havia solicitado, para tal recurso iremos utilizar o [web service] do [viacep], um serviço gratuito na web que nos permite recuperar informações referente a determinados CEP's.

## Criando requisições com XMLHttpRequest

O Javascript nativo possui um objeto responsável por realizar requisições AJAX conhecido como [`XMLHttpRequest`], ou seja, por meio dele podemos recuperar dados de uma determinada URL. Apesar do nome, ele pode ser usado para recuperar qualquer tipo de dado e fornece suporte aos protocólos _HTTP, FILE e FTP_.

Vamos então criar uma instância do objeto para começarmos a utilizá-lo:

javascript

Com o objeto criado, vamos utilizar o método [`open`] para começarmos a criar a nossa requisição:

javascript

O método open recebe três parâmetros, sendo eles:

1. O [verbo HTTP] a ser utilizado para realizar a requisição, o mesmo deve seguir o [padrão REST].
2. A URL que pretendemos obter os dados.
3. Um argumento booleano informando se a requisição deve ser assíncrona ou síncrona.

Agora precisamos implementar a propriedade [`onreadystatechange`] que é disparada sempre que nossa requisição sofre alguma alteração durante seu processamento:

javascript

Repare que passamos uma função de _callback_, ou seja, uma função que sempre será executada assim que a requisição sofrer alguma alteração. Quando implementamos essa função precisamos tomar alguns cuidados, o primeiro é verificar se a mesma foi finalizada, mas como fazer essa verificação? Fazemos isso através do [`xhr.readyState`]:

javascript

O código 4 nos informa que a requisição foi finalizada, porém ainda não é suficiente, afinal, f**inalizada não significa que foi bem sucedida**, portanto, é necessário verificar se ela foi realizada com sucesso também! Portanto, faremos uso do [`xhr.status`] pra isso:

javascript

O código 200 nos informa que a requisição obteve sucesso durante seu processamento. Isso significa que agora podemos acessar a resposta que o servidor nos enviou e realizar alguma função desejada.

## Preenchendo os campos no formulário

Até o momento já devemos ser capazes de obter as informações do nosso serviço de CEP, começaremos então a criar uma função que será invocada a cada clique em um botão:

javascript

O primeiro passo será pegar a referência do campo CEP para obtermos seu valor:

javascript

Feito isso já podemos começar construir nossa URL:

javascript

Com nossa URL pronta, podemos começar a implementar o `XMLHttpRequest` conforme visto anteriormente:

javascript

Tudo pronto, certo? Entretanto nosso web service exige que o CEP venha apenas com números, em outras palavras, se deixarmos apenas os dados que estamos pegando do campo referente ao CEP, podemos enviar, por exemplo, um CEP com o seguinte formato `"12345-123"`, que é uma forma comum em formulários na web.

Caso isso aconteça nossa requisição irá falhar e não conseguiremos obter as informações... Como podemos resolver o problema? Precisamos de fato retirar a formatação do CEP antes de enviá-lo da seguinte maneira:

javascript

Realizamos um replace para retirar o `-` do CEP, agora para testar nosso serviço podemos informar o CEP 13845-373 em nosso formulário e clicar no botão, onde iremos ver a resposta do servidor:

javascript

Como podemos ver, através do [`responseText`] conseguimos obter a resposta do nosso servidor, porém o JSON está em formato de string, sendo assim, precisamos convertê-lo para um objeto JSON em Javascript, podemos fazer isso através do [`JSON.parse`]:

javascript

Ao mandar nosso formulário buscar o CEP novamente, iremos notar a mudança da saída em nosso console que agora passou a ser um objeto e não uma string:

javascript

Para finalizar, precisamos pegar os dados do objeto e passar para nossos inputs, para isso vamos criar uma função que recebe o JSON como parâmetro e popula nossos campos:

javascript

Nossa função completa fica da seguinte maneira:

javascript

Ao realizarmos a busca novamente iremos notar que nossos inputs serão preenchidos com a resposta do servidor:

![]

Veja que agora já somos capazes de realizar requisições AJAX do tipo GET com Javascript puro. Dessa forma evitamos a necessidade de depender de uma biblioteca para um simples recurso e conseguimos entregar a funcionalidade nova para nosso cliente.






imagem 

Já parou pra pensar no trabalho que o computador tem para mostrar, em tempo real o que está acontecendo dentro de um jogo?

Pense, por exemplo, no jogo "Desafio nas alturas" que criamos no curso **[Unity 2D parte 1]**. Nesse jogo, temos um avião sendo desenhado no meio da tela, junto com o cenário.

![]

Acontece que isso não é uma imagem estática e, quando clicarmos na tela, queremos que o avião vá para cima.

Mas o que é preciso para isso funcionar?

Vamos por partes, se antes eu tinha um avião 10 unidades para baixo do que ele está agora, a pessoa que está jogando precisa ver essa diferença na posição assim que mudarmos. Ou seja, precisamos desenhar um avião na posição nova.

![]

csharp

Me parece que só desenhar um avião na posição nova não ajudou muito. Agora temos dois aviões na tela e fica até confuso saber qual é o avião real.

Uma forma resolver isso é apagar o pedaço da tela onde estava o avião anteriormente e depois desenhar um novo avião na posição correta.

![]

csharp

Melhorou, mas agora apagamos parte do nosso cenário junto com o avião antigo. E olha que difícil vai ser para ver exatamente quais pixels estão brancos para depois desenhar a parte correta da imagem do céu nesses pixels.

Mas espera, quem faz esse trabalho todo é o computador. Por que não apagamos a cena inteira de depois redesenhamos cada um dos elementos do nosso jogo?

Fazendo isso nós vamos ter uma tela completamente branca e nela vamos desenhar o céu, o piso e o avião nessa sequência.

![]

csharp

Dessa forma, conseguimos desenhar o avião e o fundo do jogo juntos. E é exatamente isso que o nosso computador faz quando estamos jogando, toda vez que ele precisa mudar a posição de alguma coisa na tela, ele apaga ela inteira e redesenha todos os elementos.

Mas isso é só parte do que precisamos fazer para nosso jogo funcionar, como é que nós verificamos se nosso avião precisa ou não se movimentar?

Nesse curso, utilizamos a Unity e nela podemos criar comportamentos para nossos objetos e assim podemos verificar se o mouse está ou não sendo pressionado. Isso é comumente feito dentro do método \`**Update´.**

csharp

Esse código verifica quando o mouse foi pressionado e faz o avião subir 10 unidades dentro da nossa tela. E como já vimos, quando isso acontecer, precisamos desenhar a tela inteira novamente para que quem estiver jogando veja essas alterações em tempo real.

Acontece que um jogo tem muitas peças que precisam ser atualizadas e redesenhadas o tempo todo. Nesse caso do jogo "Desafio nas alturas", precisamos saber quando o mouse está pressionado e para ter certeza que não iremos perder nenhum clique, o computador está executando o método `Update` o tempo todo.

Mas o que significa "o tempo todo"?

Significa que, sempre que possível, o computador vai executar a função `update` dentro do script do avião e mover ele se for necessário. Importante ressaltar que é exatamente isso, **sempre que possível** ele vai atualizar o estado do jogo. Isso porque, se algumas dessas tarefas demorar para ser executada, vamos sentir nosso jogo lento e travando.

Essas duas tarefas - atualizar as informações dos objetos que estão na cena e redesenhar a tela - formam o que chamamos de **Game loop**

![]

Dentro da fase de atualização, o computador pega cada um dos elementos do seu jogo e verifica nas "regras do jogo" se algo precisa ser mudado de posição, destruído, começar uma animação, etc.Na fase de desenho, ele seleciona todos os elementos que podem ser desenhados e redesenha a cena inteira.

Legal, nosso jogo então roda em loop mas, quão rápido é isso?

Atualmente, os jogos tem uma taxa de atualização de 30 a 60 quadros por segundo, isso significa que nosso computador deve executar esse loop inteiro de 30 a 60 vezes por segundo.

Cada volta nesse loop demora algo entre 16 e 33 milissegundos. Se nós temos muitas verificações para fazer, ou muitos objetos para serem desenhados essa volta pode demorar mais e aí sentimos o jogo travando.

No caso que vimos aqui, o desafio nas alturas, estamos utilizando a Unity, uma game engine que facilita nosso trabalho porque não precisamos nos preocupar em desenhar a cena, só precisamos atualizar as informações de cada objeto e a própria unity cuida do resto. Essa mesma abordagem é encontrada em outras \*engines \*como a Cocos Creator, Construct, Scratch, etc…

Em outros casos, como no P5JS ou na própria API do canvas, o responsável por apagar e desenhar a tela somos nós mesmos. O que é uma experiência interessante de se fazer e ajuda a entender um pouco melhor como o computador funciona.

Falando em diferentes _engines_, aqui na Alura temos cursos de [**Unity**], [**Unreal**] engine e [**CocosCreator**] e, se você quiser conhecer o [**Construct**] ou o [**P5JS**], pode ver os cursos da Alura Start.





Se você é usuário Linux, quais tipos de extensão, para arquivos compactados, você costuma lidar? Será que é zip? Provavelmente não. Geralmente, encontramos arquivos com a **extensão `.tar.gz`**.

Mas por que `.tar.gz`? O que isso significa? Quando nos deparamos com arquivos do tipo `.tar.gz`, significa que dois processos ocorreram. O primeiro é o **empacotamento** dos arquivos no formato **`.tar`**. O segundo processo é a **compactação** no formato [**gzip**].

O `tar` apenas une todos os arquivos em um só. Mas o `tar` não aplica algoritmos de compactação para que o arquivo resultante fique menor. Para isso utilizamos um outro formato, como o `gzip`.

A vantagem é que o `tar` consegue manter as permissões dos arquivos, bem como links diretos e simbólicos, sendo interessante por exemplo para realizar **backups**.

Utilizamos o comando `tar` para realizar as compactações. A compactação do diretório `Projetos/` ficaria da seguinte forma.

sql

A primera coisa que você deve ter notado é que, diferente do zip, o comando `tar` não necessita do **`-r`**. Ele age de forma recursiva por padrão. **O `-c` é de create**, ou seja, para indicar que desejamos criar um arquivo. O **`-z` indica que queremos compactar com `gzip`**. Utilizamos o **`-f` (_file_), para que o comando crie o arquivo compactado**.

Para descompactar, basta utilizar o `-x` de extract no lugar do `-c`.

sql

O comando `tar`, ao contrário do `zip`, é silencioso (**quiet**) por padrão. Se quisermos que ele imprima os detalhes do que está fazendo, basta utilizar o argumento **`-v` (**verbose)**.

Se compararmos os tamanhos do arquivo `.zip` e do `.tar.gz` vamos perceber que nesse caso o `.tar.gz` ficou menor, mas isso não necessariamente irá sempre ocorrer.

[![comparacao_targz_zip]


Você pode aprender mais sobre esse e outro assunto [**na nossa formação Linux Essentials**].




É bem possível que você já tenha se deparado com pequenos erros de precisão com números float, isso aconteceu comigo

imagem 

quando trabalhei em uma aplicação em **Python** para controle de gastos e ganhos da empresa onde trabalho. 

A princípio, é simples, só guardo os valores em variáveis para depois passá-los para um banco de dados próprio. No mês de julho, tivemos 5 vendas de `R$ 99.91` e compramos 3 equipamentos de `R$ 110.10`:

python

A partir disso, os especialistas em finanças da empresa fazem análises para tentar melhorar nossos resultados.

Meu código é bem simples, mas tem uma lógica clara que deveria funcionar bem. Apesar disso, no final do mês a chefia acabou me dando uma bronca. Isso porque alguns cálculos não bateram com os resultados reais que tivemos. Fiquei confuso, e fui testar meu código para conferir se tudo está como deveria:

python

Olha os resultados que obtive:

python

Espera… o quê? Fazendo as contas manualmente, ou na calculadora, os resultados são outros: `499.55` e `330.3`. Por que o Python me entregou esses números compridos e, principalmente, **imprecisos**?

## O problema do float

A lógica das nossas contas está correta, o problema, como vimos, está nos próprios resultados que o Python nos dá. O Python não sabe fazer conta direito, é isso?

Bem, a resposta pode ser sim… e não! Em primeiro lugar, essa questão não é exclusiva do Python, mas sim da computação e de como ela lida com números de **ponto flutuante (nosso querido float)**. Além disso, não é exatamente um problema; vamos entender!

No mais baixo nível, computadores funcionam com a diferença de **dois** estados elétricos - baixa e alta voltagem, ligado e desligado, verdadeiro e falso. Daí temos o **binário**, o famoso **0 e 1**, e é por conta desse sistema que os computadores conseguem ser tão rápidos com algumas coisas.

Entretanto, utilizando o formato binário para os números de ponto flutuante, os computadores não conseguem representar com precisão exata algumas frações (como `0.98` e `0.1`). Desse modo, esses números são automaticamente arredondados para o mais próximo que se encaixe na possibilidade do binário, o que resulta em um pequeno erro de precisão.

No geral, esse erro é muito pequeno para ser considerado relevante, mas há situações em que não podemos desconsiderá-lo, como agora!

No nosso caso, como estamos lidando com dinheiro, precisamos de uma **precisão maior**. Já vimos [**como arredondar e formatar valores monetários**] antes, mas mesmo essa forma pode resultar em alguns pequenos erros de arredondamento que queremos evitar. E agora?

## Trabalhando com inteiros

Como estamos trabalhando com dinheiro, podemos rapidamente pensar numa alternativa que evitaria o problema dos números de ponto flutuante - trabalhar apenas com **números inteiros**. Mas como? Sabemos que **1 real equivale a 100 centavos**, então podemos, simplesmente, trabalhar com essa subunidade e evitar números quebrados.

No nosso caso, tínhamos `R$ 188.98` e `R$ 13.10` que também podem ser representados, respectivamente, por `18898¢` e `1310¢` - dois números inteiros!

Por estarmos trabalhando com o Python, ainda evitamos (a princípio) o problema de [**overflow de número inteiro**] padrão, que é muito limitado em algumas linguagens (como em Java, que só chega a **2.147.483.647**).

Como o banco de dados está guardando inteiros, agora, podemos simplesmente dividir por **100** no momento de imprimir os valores, o que resolveria os problemas. Olha:

python

E a resposta:

python 

Legal! Com o código arrumado, fui compartilhar com as filiais internacionais de minha empresa. Entretanto, rapidamente recebi diversas reclamações mostrando erros nos cálculos. Mas por quê?

A primeira reclamação veio direto de nossa filial na Tunísia. O programa estava apresentando cálculos claramente errados para eles - o banco de dados armazenava **10000 milim** e o valor impresso era de **100 [dinares tunisianos]**, quando deveria ser **10**. Isso é porque, na Tunísia (e em diversos outros países) a subunidade de moeda principal não vem do centésimo (**1/100**), mas do milésimo (**1/1000**) - **1 dinar tunisiano equivale a 1000 milim**.

Desse jeito, temos um grande problema em potencial com a internacionalização do código. Na verdade, mesmo que trabalhemos com apenas um local, o perigo continua. No mundo financeiro, subunidades mudam com o tempo, devido à inflação e deflação.

Se armazenarmos números inteiros, teremos que migrar os valores armazenados toda vez que houver uma mudança, o que pode atrapalhar bastante a manutenção de todo o sistema.

O ideal ainda seria conseguir trabalhar com a unidade principal da moeda, com números quebrados, **mas com exatidão**. Será que tem como?

## Trabalhando com precisão com o tipo `Decimal`

Por conta dessa necessidade recorrente de lidarmos com números não-inteiros exatos, a maioria das linguagens de programação nos disponibiliza tipos específicos para lidar com isso.

No caso do Java, por exemplo, temos o [**BigDecimal**]. No Python, temos todo o módulo [**decimal**] e, mais especificamente, o tipo **Decimal**. Importando-o, seu uso é direto:

python

Dessa vez, olha o resultado:

python

Exatamente como na calculadora! Os analistas da empresa não terão mais nenhum problema com os cálculos.

## Usando a precisão exata quando precisamos

Começamos com um problema o tipo **float**, do Python, não conseguia nos devolver um resultado exato de um cálculo. Logo entendemos que o problema não estava no Python, em si, mas no float e em como o computador lida com ele.

Como estávamos lidando com dinheiro, a precisão nos cálculos era fundamental. Assim, precisávamos de alguma solução. Demos uma olhada em como podemos transformar tudo em números inteiros (por exemplo, transformando o valor monetário de Real para centavos), o que, algumas vezes, pode ser uma boa saída.

Tratar todos os números como inteiros, entretanto, tem suas consequências negativas, como um possível overflow e problemas de manutenção de código. Queríamos uma solução melhor e… conseguimos!

Aprendemos que a maioria das linguagens de programação tem algum tipo numérico exato para evitar esse problema. No caso do Python, esse tipo é o **Decimal**, com [**precisão arbitrária**]. Com ele, nossos cálculos ganharam a precisão necessária e acabamos com todo o problema inicial.

Uma intuição natural depois de se conhecer os tipos numéricos exatos nas linguagens de programação, como o **Decimal**, é querer usá-los para tudo. Apesar disso, é importante sempre analisarmos se vale a pena - tipos exatos demandam mais tempo de processamento.

Normalmente, um pequeno erro na 10ª casa decimal de um número é irrelevante, e a precisão exata desnecessária. Por isso, temos sempre que analisar o contexto de nosso próprio programa antes de aplicar uma decisão.

Já conhecia o tipo **Decimal** antes? E toda essa confusão com o float? Escreva um comentário com sua opinião sobre o post e, se se interessar mais por Python, não deixe de dar uma olhada em nossa [**formação Python para web**]!




imagem 

A carreira de designer [está em alta no mercado], mas o esfriamento da economia e o grande número de profissionais na área tornam mais difícil encontrar emprego. Para contornar esse problema e conseguir uma vaga, assim como para evoluir em muitos outros pontos, investir na atualização profissional e em novos conhecimentos é a solução ideal.

Para contornar esse problema e conseguir uma vaga, assim como para evoluir em muitos outros pontos, investir na atualização profissional e em novos conhecimentos é a solução ideal.

## Melhores habilidades e técnicas

Uma das características marcantes da área de design é sua constante transformação técnica. Diariamente surgem novos softwares, atualizações dos já existentes, técnicas de aplicação ou mesmo novas disciplinas de design, como o [**UX/UI**] ou o motion design.

O profissional que se mantém antenado e busca atualizar seus conhecimentos ganha uma enorme vantagem sobre parte da concorrência, que não sai da zona de conforto e permanece com conhecimentos e conceitos datados.

Pense, por exemplo, no Photoshop. Não é difícil encontrar designers que aprenderam a usar o software em sua versão CS5, lançada há sete anos, e que não buscaram mais nada sobre o programa, que já sofreu duas grandes remodelações desde então.

Profissionais assim estão ultrapassados e terão sérias dificuldades para encontrar colocação no mercado, ao contrário daqueles que investiram no aprendizado dos softwares mais recentes.

## Destaque em meio à multidão

Como dito acima, ter um diferencial é um ponto essencial para o designer que deseja alçar altos voos em sua profissão: grandes empresas e agências procuram por profissionais que tenham algo a mais para oferecer, e não apenas o básico aprendido em universidades e colégios.

Um dos benefícios de estudar continuamente em busca de atualização profissional é justamente a aquisição de vários desses diferenciais, que certamente farão de você um designer único e desejado pelo mercado.

## Especialização

Outro aspecto notável no mercado de design é sua fragmentação. Com o surgimento de novas divisões além dos tradicionais design gráfico e industrial, demandas por profissionais especialistas em áreas como [**web design**], design automotivo e design de games começaram a aparecer.

Buscar uma especialização, tanto na área acadêmica, com mestrados e doutorados, quanto em cursos livres, inclusive cursos online, enriquece seu currículo, agrega novas experiências e traz mais vantagens na busca por um emprego ou na evolução na hierarquia da empresa.

É possível encontrar uma infinidade de cursos online e a distância, com materiais e professores de qualidade e que oferecem certificados que podem ser adicionados a seu histórico profissional.

## Melhores salários

Da mesma forma que profissionais graduados recebem mais do que aqueles que têm apenas o ensino médio, designers com uma vasta gama de conhecimentos e habilidades são mais valiosos e recebem consideravelmente mais ([até quase 20%]) do que aqueles sem tais atualizações.

Além dos salários mais atrativos, é por meio de pós-graduações e especializações que você pode ganhar posições dentro da empresa, chegando, por exemplo, a diretor de arte ou gerenciador de design da companhia.

## Reforço do networking

Participar de novos cursos e eventos da área facilita a aquisição de novos contatos profissionais e ajuda a expor seu nome de forma positiva, aumentando seu networking e suas chances de obter boas recomendações e colocação no mercado de emprego.

Invista também na publicação de seus trabalhos e no contato com outros profissionais da área em redes sociais especializadas, como o [**Behance**] ou o [**Dribbble**], em que a troca de conhecimentos e contatos é mais eficiente do que nas redes tradicionais, facilitando a criação de parcerias profissionais de sucesso.

## Maiores e melhores conhecimentos

Quando se fala em aquisição de conhecimentos, não é preciso restringir-se apenas ao design. Todo conhecimento é válido, desde saber os acontecimentos recentes da política mundial até os novos lançamentos da música pop. Um bom designer precisa ter seu repertório de referências e inspirações amplo — e manter-se informado é essencial para conseguir isso.

Procurar aprender ou melhorar a prática em idiomas estrangeiros também é uma boa ideia: além de um diferencial em um mercado em que profissionais fluentes em inglês ganham até [61% mais], dominar outras línguas permite o acesso a outras culturas e vivências, o que aumenta seu repertório cultural.

## Flexibilidade e controle de imprevistos

O design tem cada vez mais interligações com áreas como o marketing, a programação e a [**tecnologia**] da informação, e nada é feito sem a ajuda, mesmo que pequena, dos profissionais desses campos.

Sendo assim, torna-se extremamente importante que o designer moderno e atualizado procure saber mais sobre cada uma das áreas com as quais entra em contato no dia a dia de trabalho, desde noções de marketing digital até pequenos conhecimentos em linguagens de programação, como o PHP ou Ruby.

Além de proporcionar novas visões e ideias sobre seu trabalho, esses conhecimentos podem ser úteis em pequenos imprevistos cotidianos, como uma falha na programação de um site ou a necessidade de ajudar o pessoal do marketing a desenvolver uma nova estratégia de mídias sociais.

Desse modo, você ganha novas experiências e aprende novos meios de solucionar problemas, tornando-se um profissional mais completo, respeitado e altamente desejado no mercado de trabalho.

## Abertura a novas ideias e desafios

O processo de procurar cursos de especialização é, por si só, um grande desafio, que demanda tempo e investimento.

Além disso, continuar a estudar abre sua mente para novas ideias e modos de agir, estimulando o pensar fora da caixa, a procura de soluções que desafiem o comum e tragam algo de novo.

São designers com esse perfil que fazem a diferença no mundo profissional, oferecendo resultados que agradam aos clientes e dão bons retornos quando postos em prática.

**Neste artigo, você viu como a atualização profissional é importante para os profissionais da área de design, além de motivos pelos quais vale a pena se esforçar para sair da zona de conforto e buscar atualizar e ampliar seus conhecimentos. Com essas vantagens em mente, comece agora mesmo a procurar por cursos de especialização e a tornar-se um designer ainda mais competitivo!**

Gostou do artigo? Está animado a aprender cada vez mais? Então compartilhe nosso texto com os seus amigos pelas redes sociais!





imagem 

Você também já se pegou pensando em como encontrar soluções objetivas, elegantes e [**centradas no usuário**] como faz a empresa californiana? Entender o design da Apple é um estudo essencial sobre como transformar ideias em produtos que facilitam e encantam o usuário ao primeiro clique, ao primeiro toque.

Foi para te ajudar que criamos este artigo completo, com tudo o que você precisa saber sobre o design da Apple — desde seu início até se tornar uma referência de design para o mundo. Vamos lá?

## Apple: uma empresa de tecnologia com vocação para o design

O ano era 1973. Steven Paul Jobs, um estudante que havia largado a faculdade depois de um semestre, ainda perambulava de vez em quando pelo campus da Reed College, no Oregon. Depois de ter experimentado o ensino formal, achou que aproveitaria melhor as ideias que ferviam em sua cabeça se buscasse classes que fossem realmente significativas para ele.

Jobs queria aproveitar melhor o seu tempo, sem saber exatamente o que faria com todo esse conhecimento. O que ele queria era ter novas experiências.

Foi nesse período que o estudante por vocação buscou cursos dentro da faculdade que não o prendessem na rigidez do ensino superior. Uma dessas, a mais famosa de todas, foi a aula de caligrafia ensinada por um monge trapista.

Isso mesmo, caligrafia feita à mão. Naquela época, computadores ainda eram grandes armários cheios de válvulas que só empresas gigantes podiam se dar ao luxo de ter. Mas, como o próprio Jobs explica em seu famoso discurso de formatura em Stanford, ele só veria o valor dessas aulas, até então um interesse pessoal, dez anos mais tarde, quando o primeiro Macintosh estava sendo desenvolvido.

Jobs bateu de frente com os desenvolvedores da Apple por uma questão que parecia boba: ele queria que o novo sistema operacional tivesse fontes com curvas que se assemelhassem à caligrafia. Até então, todas as letras dos computadores eram pixeladas e monoespaçadas tinham todas a mesma aparência.

Por mais que pareça um detalhe, essa pequena característica definiu o que seria a Apple no futuro. As fontes em curva pareciam um luxo dispensável para muitos, mas para Jobs era uma visão de design: quanto mais a sua interface se aproximasse da realidade do usuário, se tornasse familiar, intuitiva e elegante, mais prazer ele teria de usar o computador e mais facilidade a empresa traria para a vida das pessoas.

### Pensando em design desde a concepção

Essa fixação por design e por uma boa experiência do usuário acompanha a Apple desde seus primeiros dias de existência, quando a empresa que hoje tem o maior valor de mercado no mundo era apenas uma garagem de subúrbio americano ocupada por dois apaixonados por tecnologia.

Steve Jobs e Steve Wozniak se destacaram por vender computadores fechados (o lendário Apple I), enquanto a cultura dessas pequenas empresas na época era vender as peças para que o seu público-alvo, entusiastas de computadores, tivessem o prazer de montá-los em casa.

Até hoje, a Apple recebe críticas por ter sistemas muito fechados, mas essa foi a grande sacada que popularizou os computadores no fim do século passado. Os dois Steves apostaram que, um dia, cada pessoa comum teria o seu próprio PC e eles não teriam esse interesse por aprender a montar e instalar uma máquina. 

Os designers de produto, de sistema e de interface teriam que ser pensados em conjunto para que qualquer pessoa tirasse o computador da caixa e começasse a usar imediatamente.

### Usando design para fugir da falência e se tornar a empresa de maior valor no mundo

E, desde então, a Apple é uma empresa movida por design. Esse é o legado de Steve Jobs, de Steve Wozniak e de tantos outros profissionais com esse perfil que passaram pela empresa.

Um grande exemplo disso é a contribuição do designer Jonathan Ive para o ressurgimento da Apple na década de 1990. Sim, a Apple já esteve à beira da falência. Desde 1992, quando ele foi contratado, até 1998, quando Steve Jobs voltou à empresa e se uniu a ele para mudar a imagem da companhia, Jony Ive reconstruiu a fundação de produto aliado à experiência que tornaria a Apple uma referência no futuro.

Essa é uma forma de olhar para a história da empresa de uma forma única. O valor da maçã foi construído pelo design. OSX, iPod, iPhone, iPad, iMac, Macbook, Apple TV... Todos esses dispositivos têm uma coisa em comum: eles unem ideias, conceitos, tecnologias e materiais existentes de uma forma inovadora para encantar e facilitar a vida do usuário.

E, se você parar para pensar, essa é exatamente a definição de design.

## Design da Apple: os conceitos que tornam essa empresa única

Então, se é para falar no assunto, vamos definir o que torna o design da Apple tão destacado dos concorrentes. Afinal, não é por falta de dinheiro, de talento profissional ou pesquisa tecnológica que outras empresas não alcançam o nível de refinamento e experiência da empresa californiana.

A diferença, na verdade, tem a ver com a [**cultura de UX**]. Quando a usabilidade rege seu pensamento criativo, coisas incríveis podem acontecer. Veja quais são esses conceitos cravados fundo no coração de todos os funcionários da Apple:

### Buscando a perfeição

O caso das fontes em curva no primeiro Macintosh são um exemplo da busca pela excelência em design que move cada novo desenvolvimento de produto dentro da empresa. Não se trata de supervalorizar seu aparelho ou usar o design como estratégia de venda, mas é uma forma de sempre pensar em como melhorar a experiência do usuário mesmo nos menores detalhes.

Steve Jobs era conhecido como um chefe implacável, insistente e até teimoso para incluir as funções que ele desejava ver em seus produtos. Embora sua conduta fosse questionável em alguns pontos, não dá para negar que essa busca obsessiva pela perfeição contribuiu para o desenvolvimento do design como ferramenta de UX em todas as áreas tecnológicas.

Não existe fórmula para uma boa usabilidade em smartphones, um software de computador ou um site na internet. **A experiência do usuário sempre vai ser o resultado de teoria de design com um toque de subjetividade para surpreender e encantar.**

Para conseguir esse objetivo, só existe uma forma: conceituar, testar, analisar seus resultados e repetir. Esse é o trabalho de um designer em busca do sucesso e o legado que a Apple deixa para a profissão.

É claro, ninguém consegue um trabalho perfeito, mas é a busca por sempre melhorar que destaca um profissional da média do mercado em que ele está inserido.

### Cultuando o pensamento fora da caixa

Quando Steve Jobs e outros funcionários da Apple entraram no escritório da Xerox no início dos anos 1980, eles foram apresentados a um protótipo que a própria empresa e outras gigantes como a IBM tinham descartado por não terem visto muita utilidade prática naquela tecnologia.

Qual era esse dispositivo inovador? Uma caixinha de plástico com um botão, com a qual o usuário podia controlar uma seta na tela do computador. Aquele retângulo bege ligado por um fio lembrava muito um ratinho de estimação e por isso ele ganhou o apelido de mouse.

**O mouse foi o dispositivo que permitiu a criação das interfaces gráficas, ou GUIs, que resultaram na criação do MacOS e do Windows e modelaram o Design Gráfico como conhecemos hoje. Mas por que algo tão revolucionário foi descartado por tantas empresas?**

A resposta a essa pergunta define o que é design e define o que se tornou o slogan da Apple por muito tempo: Think Different, ou pense diferente, em português.

Você já deve ter percebido que em todo lançamento de um novo iPhone os comentários são muito parecidos. A maioria fica indignada pela empresa apresentar como novidade tecnologias que já existem há mais tempo em outros celulares.

Mas a ideia que a Apple quer passar não é exatamente essa. **Criar e implementar uma tecnologia não é suficiente, ela precisa estar ali em função do usuário final, de uma experiência coerente e satisfatória**.

O design é e sempre foi a capacidade de aliar forma e função em torno de um objetivo: seja facilitar a vida das pessoas, criar formas de consumir conteúdo ou [**passar uma mensagem**].

Voltando ao mouse, onde a Xerox enxergou uma tecnologia curiosa sem valor de mercado, a Apple viu uma oportunidade de tornar o acesso e uso dos computadores universal, independentemente da familiaridade do usuário com a tecnologia.

Isso é pensar diferente, é praticar o design. Juntar referências de uma nova forma, que surpreenda o público, crie uma reação emocional e uma resposta imediata.

### Tirando da caixa pronto para usar

E por fim, de todos os objetivos da prática de design, o que torna a Apple única quando falamos em [**usabilidade**] é a busca por simplicidade, intuição e uma experiência controlada.

Falando outra vez de uma característica muito controversa da empresa — de dispositivos fechados, com pouca customização e possibilidade de intervenção do usuário na experiência, ela deve ser enxergada por designers não como um defeito, mas a fórmula para tornar a UX consistente e entregar ao público sua visão da forma mais completa possível.

Você já percebeu que as empresas com identidade mais forte no mundo são aquelas que controlam mais a sua experiência? Disney e Nintendo são exemplos de grandes companhias que preferem limitar suas interfaces e dispositivos (ou parques) para garantir que todos os usuários terão o mesmo encantamento quando entrarem em contato com a marca.

O design anda sempre em uma linha tênue entre ser um guia e ser interativo. Os dispositivos da Apple podem ser mais engessados, mas qualquer pessoa consegue usá-los sem muita dificuldade em 5 minutos depois de ligá-los pela primeira vez.

Ou seja, o design da Apple é conceituado em volta da usabilidade e praticidade, a essência dessa profissão. E a prova de que esse tipo de pensamento funciona e cria uma conexão emocional com o público é o quanto o mercado tenta reproduzir essas características a cada novo produto.

## Efeito Apple: como a empresa mudou o mercado e o consumo no mundo inteiro

Pode parecer estranho agora, mas houve um tempo em que a ideia de um ter um computador pessoal em casa parecia um absurdo. Houve um tempo também em que levar mais de quinze músicas para ouvir durante a caminhada era impensável e que smartphones eram coisa de executivos de Wall Street.

Uma a uma, a Apple vem nas últimas décadas quebrando teorias de mercado e mudando a forma como nós consumimos tecnologia. Veja como ela fez e ainda faz isso, usando seus principais sucessos como exemplo:

### Macintosh e o foco total no usuário

Antes da Apple, PCs eram feitos para entusiastas e profissionais da computação. Para conseguir um simples acesso à pasta onde estavam seus documentos, era preciso conhecer a linha de comando certa para chegar aonde queria.

O exemplo do mouse, que tornou a interface gráfica possível, é um exemplo de como a empresa muda o mercado a cada nova revolução. **Ao criar ainda no Apple II e depois aprimorar no Macintosh a usabilidade com foco no usuário, Steve Jobs e Steve Wozniak quebraram a barreira que existia entre a tecnologia e o público comum.**

Foi a partir daí que computadores puderam tomar conta do mundo, o que, consequentemente, tornou a internet possível anos depois. O consumidor não precisava mais de conhecimento técnico para manipular a ferramenta, logo os PCs puderam se tornar peças vendidas em supermercados, lojas de departamento e catálogos.

Desde então, a busca das empresas do ramo é por facilitar a vida das pessoas. Até hoje, esse é o argumento de venda de fabricantes de smartphones, computadores e wearables. O design voltado para a experiência do usuário tornou possível a era tecnológica em que vivemos.

### iPod e a vontade de mudar o mundo

Durante os anos 1990, a Apple caiu no ostracismo e quase foi à falência exatamente por perder sua essência: a vocação para tornar o design uma ferramenta de transformação.

Não é como se todas as peças de design que você cria precisassem ser significativas a ponto de mudar a vida das pessoas, mas o objetivo deve ser esse. **Facilitar, encantar, resolver, reinterpretar, são os verbos que movem a humanidade.**

O iPod é um grande exemplo de como boas ideias de design podem transformar o mercado e o consumo de uma mídia apenas por buscar solucionar problemas realmente relevantes para o público.

**A Sony já havia revolucionado o mercado ao criar o Walkman, primeiro dispositivo portátil para ouvir música.** Mas, pelas limitações da época, havia uma falha grave em seu design: as fitas cassete tinham uma qualidade baixa de som e cada uma suportava no máximo algumas poucas faixas. O Discman resolveu o problema da qualidade usando CDs, mas eles eram péssimos para a portabilidade, pelo tamanho e por interromperem a música a qualquer impacto.

A ideia da Apple, renovada pela volta de Steve Jobs no fim dos anos 1990, era usar design de produto para resolver o problema de uma vez por todas. E foi isso que aconteceu. Com a chamada atrativa de mil músicas no seu bolso, o iPod não só solucionou a portabilidade da música como mudou a forma de consumir a mídia em todo o mundo. O iPod foi a semente que possibilitou os aplicativos de streaming hoje em dia.

### iPhone e a experiência em primeiro lugar

E todas essas transformações podem ser resumidas nisto: **a preocupação com experiência do usuário é o que possibilita que a tecnologia esteja tão presente em nossas vidas**.

**A interface entre humano e máquina caminha para ser cada vez mais direta e simplificada. Hoje em dia, podemos fazer uma pergunta para a Siri ou o Google Now e receber uma resposta em um segundo.** Nossos dispositivos nos levam pelo melhor caminho entre casa e trabalho, nos ajudam a nos comunicar com parentes e amigos distantes e nos permitem assistir a um episódio de Game of Thrones junto a milhões de pessoas.

O iPhone original, se não foi o primeiro smartphone ou o mais capaz da sua época, com certeza foi o ponto de virada para a era mobile em que vivemos atualmente. Nenhuma tecnologia nele era nova, nenhum material exclusivo ou função que já não existia em outros aparelhos.

Mas a forma como a empresa criou o iPhone é emblemática para definir o que significa ser designer. Todas essas ideias estavam espalhadas pelo ar, mesmo que ninguém soubesse exatamente o que queriam de um smartphone para o futuro.

O que a Apple fez foi entender como juntar todas essas peças em um produto inovador, que facilitasse a vida das pessoas, encantasse com a sua experiência e que oferecesse um valor real para as suas vidas. Gostando ou não desses produtos, o design da Apple é um estudo fundamental para o profissional que deseja fazer a diferença no mercado e no mundo.

## Referência em design: por que a Apple continua sendo a empresa a ser batida

O ano de 2017 marca os dez anos do lançamento do primeiro iPhone e até hoje o aparelho é a referência tecnológica no [setor mobile]. Como isso é possível? Se tornar referência no mercado não se refere apenas à qualidade de um produto, mas também à sua relação com o consumidor e como sua marca é percebida pelo grande público.

Portanto, para terminar este artigo, é bom definir os elementos de design que possibilitam um reinado tão extenso em uma indústria que muda tão rápido:

### A criação de um paradigma

Quando se pensa em smartphone, se pensa em Apple. A grande vantagem de utilizar o design para resolver problemas de experiência é que sua solução se torna uma percepção de **exclusividade, inovação e satisfação**. Não importa muito quais são os novos recursos do aparelho ou as novas funções da interface; quem se apaixona pelo iPhone já foi convencido a comprar o próximo modelo.

O design significativo é aquele que muda paradigmas. 

Para quebrar o status do mercado, é preciso usar o que existe de referência para [**apresentar um trabalho inovador**], que apresente um novo caminho de usabilidade ao público. 

### O Design de Produto

Esse paradigma que tornou a Apple uma referência existe em duas pontas: o Design de Produto e o Design Gráfico. Mesmo que um complemente o outro, é possível separar os dois, começando pelo primeiro.

Um grande momento da conferência em que Steve Jobs apresentou o primeiro iPhone é quando ele mostra os smartphones líderes da época e separa a tela pequena do enorme teclado que eles possuíam embaixo. Nesse momento ele afirma que esse espaço todo está sendo perdido.

Design se trata de otimizar usabilidade, fazer mais com menos elementos. A forma como o iPhone implementou essa solução da tela de toque ainda está dando forma ao mercado dez anos depois.

A busca por experiência do usuário, por facilitar a vida de uma pessoa ao máximo com o mínimo de recursos é não apenas uma referência, mas um legado da empresa para o mundo.

### O Design Gráfico

Mas não é só nos aparelhos que essa filosofia criou paradigmas; a forma como a Apple enxerga a interface gráfica desde os anos 1970 é a prova de que o design pode e deve ser usado como uma fagulha para a transformação tecnológica e cultural.

**A filosofia de UX voltada à praticidade, elegância e objetividade está em todos os produtos da Apple e dita os rumos da área no mercado.** Desde a implementação das GUIs nos anos 1980, a facilidade com que se gerenciava suas músicas no iPod original até cada nova implementação do iOS no iPhone, a empresa se mantém uma referência no mercado porque sempre sugere formas mais intuitivas de passar mensagens, guiar o usuário e entregar uma experiência satisfatória.

Ao contrário do que muitas pessoas podem imaginar, **o design não se trata de beleza em sua essência, mas de** [comunicar com eficiência], criar conexões emocionais e guiar as pessoas para que elas consigam atingir seus objetivos por conta própria. Uma boa experiência dá poder ao usuário e é assim que se sente qualquer pessoa que utilize um dispositivo da empresa.

O design da Apple é uma compilação de todos esses conceitos de produto, interface e comunicação e é por isso que, gostando ou não de sua filosofia e de seus aparelhos, entender como seus funcionários pensam é uma forma de aprimorar a sua relação com uma profissão tão incrível.

Você curte a identidade visual da Apple? Que tal aprender a criar uma identidade visual de uma marca? Aqui na alura temos um [**curso de identidade visual**]. Nele você aprenderá a criar um logo de uma marca a partir de um briefing, a escolher a melhor tipografia e muito mais.




Promoção com viagem internacional por 5 reais? Ou ainda -5 reais? Tem campos que deveriam ser validados declarativamente, como o preço de um produto:

`sql `

MySQL ainda não suporta checks, bora [**aprender a usar Oracle**]? Postgre, SQL Server e outros também suportam :)

Seus dados possuem restrições que quer garantir a integridade no banco? **Use o CHECK constraint**.

Desafio: quero todos os livros ativos que estão baratos ou caros. Que caca eu fiz na query a seguir? Discutimos no próximo artigo!

sql





imagem 

Já imaginou ter que realizar um cadastro de informações suas e acabasse enviando as informações assim:

imagem e uma **mensagem de erro** que permanece visível enquanto não adicionarmos um e-mail válido, com o "@" e o domínio.

Mas ainda poderíamos deixar essa mensagem de erro ainda melhor!

Por padrão, temos uma mensagem bastante objetiva, em inglês, dizendo que "deve ser um e-mail válido". Porém, e se mudássemos essa mensagem para português (ou o idioma que fosse mais conveniente para a situação) e adicionássemos uma mensagem personalizada?

imagem, retornamos ao mesmo formulário vazio. Assim damos margem para o usuário se questionar: “Será que enviou mesmo? Ou devo preencher novamente?”.

E que tal se adicionarmos uma mensagem de confirmação de envio?

imagem, poderíamos deixar explícito também que existe um caminho ainda a ser percorrido, do tipo:

imagem




Tenho uma lista com todos os livros que comprei e quero saber quanto eu gastei no total:

java

Agora vou varrer minha lista e somar o preço de cada livro usando um for:

java

Agora eu sei quanto gastei! Porém, olha o tanto de parâmetro e código que tive que escrever...será que não tem uma forma mais simples de resolver? A partir do Java 1.5 foi disponibilizado o **enhanced-for** ou mais conhecido como **foreach**:

java

Veja que temos o mesmo resultado! Mas o que está acontecendo nesse código? Basicamente estamos pegando cada objeto(livro) contido na lista, ou seja, para cada (for each) livro some o seu preço com o total. Bem intuitivo e simples! Poderíamos até imprimir todos os livros usando o foreach:

java

A partir do Java 8 foi introduzido o método `forEach()` capaz de fazer iterações em lista de forma similar ao enhanced-for:

java

Bem mais simples! E tudo em uma única linha!

**E aí, gostou dessa nova implementação do Java 8? Quer conhecer mais sobre as novidades do Java 8? O criador da Caelum, Paulo Silveira, criou o [curso de Java 8] e suas bibliotecas com mais 1500 alunos e 99% recomendação.**




Você já deve ter lido, aqui no blog, depoimentos de alguns de nossos alunos. No post de hoje, vamos contar um pouco da trajetória de um membro do time Alura. Vamos conhecê-lo?

imagem profissional seria em uma empresa cuja atmosfera ronda a programação.

Meu lance sempre foi criar, me envolver de alguma forma com arte e me expressar através dela.

Minhas tarefas diárias no início eram bastantes mecâncias: escrever posts para nossas redes sociais ([Twitter], [LinkedIn] e [Facebook] ), montar newsletters que são enviadas semanalmente aos nossos alunos, além de responder dúvidas que chegam via chat e tweets.

## Mudança de área

Com o tempo, meu chefe direto notou que minha praia era mais a parte de arte/criação. Eis que ele me propôs cuidar da parte do design de social. Na hora meus olhos brilharam. Apesar de eu já criar conteúdo (redigir textos e produzir algumas imagens que ilustram os posts), eu queria mais! Criar mais!

## O que aprendi

Comecei então a fazer os cursos de [Photoshop] e [Illustrator] aqui da nossa plataforma. Devo dizer que eles contribuíram bastante para minhas habilidades nos softwares. Além disso, eu mal sabia abrir uma imagem no Ai, e hoje faço todas as imagens que vão pro nosso [Instagram].

## Saindo da caixa

Enfim, sou muito feliz com o trabalho que faço e sinto que cresço a cada dia, principalmente por ter saído de uma zona de conforto que eu nem sequer sabia que vivia. Se tem uma moral nessa história, é que toda experiência é válida contanto que você se sinta confortável naquilo que lhe é estipulado. Às vezes, pensar fora da caixa pode trazer mais sucesso do que você imagina!

Não poderia estar mais feliz em escrever este post (e logo depois já compartilhar nas nossas redes!) e saber que estou propagando uma mensagem de entusiasmo aos que – como eu,meses atrás estão a procura do tão sonhado estágio.

Aliás, tá procurando emprego? Já se cadastrou no [Hipsters.Jobs]? Tá cheio de vagas por lá! Se quiser anunciar oportunidades de emprego, lá é o lugar também! ;-)




Eu tenho uma lista de livros os quais já comprei:

java

Resultado:

```
 [TDD - Maurício Aniche, Java 8 - Paulo Silveira, C# - Everton Coimbra, REST - Alexandre Saudate, Android - João Bosco]

```

Agora testarei minha lista e verificarei se ela sabe conferir se um livro que já comprei está na lista:

java

Resultado:

```
 não contém

```

**Opa! Eu já comprei esse livro de TDD! Essa lista está doida? Ela não conseguiu verificar a existência desse livro, pois cada objeto possui um código chamado [hashcode] e é por meio desse código que qualquer objeto é identificado, por padrão. Vamos, por exemplo, imprimir dois objetos aparentemente "iguais" sem um `toString()` personalizado, ou seja, o padrão:**

java

Resultado:

```
 model.Livro@2a139a55 model.Livro@15db9742

```

Veja que, mesmo tendo as mesmas informações, as impressões foram diferentes! Por isso a lista informou que o livro de TDD não existia. Para personalizar a comparação de um objeto precisamos sobrescrever o método `equals()` herdado da classe `[Object]`:

java

Agora iremos implementar o método `equals()` informando que os livros são iguais desde que os nomes sejam iguais:

java

Testando a nossa lista novamente:

java

Resultado:

```
 contém

```

Maravilha! A nossa lista está conseguindo verificar se um determinado livro existe! Mas e se o autor for diferente? Ela vai informar que existe... Da mesma forma que informamos que queríamos a comparação do livro por meio do nome, podemos informar que queremos que o livro seja comparado pelo nome e autor, ao mesmo tempo:

java

Vamos testar nossa lista novamente:

java

Resultado

```
 não contém

```

Agora todos os objetos do tipo `Livro` são corretamente comparados e, assim, eu posso sempre pedir para a minha lista de livros verificar se eu já tenho um determinado livro antes de comprá-lo! Todas as vezes que precisarmos fazer comparação entre objetos, será necessário **sobrescrever** o método `equals()` herdado da classe `Object` e **implementar** qual é o tipo de comparação que você precisa, seja por 1 atributo específico, ou por 2, ou por todos.

E aí, gostou da forma que comparamos objetos em Java? Que tal aprofundar mais nos detalhes dessa linguagem? Pensando nisso o instrutor Guilherme Silveira, criou a [**Formação Java**] na **Alura**.




Porém, para conseguir evoluir na sua área é fundamental investir em capacitação e se manter atualizado para atender as demandas do mercado de trabalho. Essa recomendação é válida, especialmente, para quem atua com tecnologia.

Esse setor está em constante evolução e acompanhar essas transformações é obrigatório para oferecer um bom trabalho e conseguir as melhores oportunidades.

Para atingir a qualificação necessária, podemos destacar a importância da educação a distância, que é um meio para adquirir conhecimento por cursos feitos pela internet.

Essa é uma proposta arrojada, que tem métodos avançados, alta tecnologia envolvida e muito conteúdo de qualidade. Cada vez mais pessoas aderem ao EAD para fazer cursos com objetivo de atualizar e aprimorar seus conhecimentos em áreas como [**programação**], [**design e UX**].

Ficou curioso para saber mais? A seguir contamos todos os motivos pelos quais você deve investir em um curso a distância!

## 1\. É um modelo inovador e democrático

Imagine a possibilidade de acompanhar uma aula um dia no seu quarto, no outro em uma biblioteca e no outro durante um intervalo no trabalho? Incrível, não é? E é isso o que os cursos a distância favorecem: a mobilidade e a flexibilidade para acompanhar o conteúdo.

Essas características tornam esse modelo inovador para transmitir conteúdo e conhecimento. Além disso, contribui para uma maior democratização do acesso à educação.

Isso porque, existem profissionais que desejam aprender e se atualizar, mas que moram em regiões onde não há instituições de ensino com boa qualidade ou mesmo com variedade de cursos. Assim, a educação a distância apresenta-se como a melhor solução para adquirir conhecimento e capacitação para atender as demandas do mercado de trabalho.

Por esse motivo o ensino a distância é inovador, pois se vale de alta tecnologia para produzir e distribuir conteúdo, que exige apenas conexão à internet para que o aluno usufrua do conteúdo.

## 2\. Trabalha a autonomia e a responsabilidade do estudante

Outra vantagem de fazer um curso a distância é o desenvolvimento de duas habilidades muito valorizadas por gestores e empresas: a autonomia e a responsabilidade. Esse aperfeiçoamento se dá pelas características do próprio sistema de ensino.

No EAD quem dita o ritmo de estudos, ou seja, quem escolhe os horários para acompanhar as aulas ou decide a frequência é o próprio estudante. Com isso, terá que desenvolver sua capacidade de tomar decisões por conta própria, uma vez que não há lista de chamadas.

**Além disso, se não houver dedicação durante o período estipulado, o curso vai expirar e assim o estudante não poderá concluí-lo. Um curso a distância exigirá grande responsabilidade para não acumular materiais e aulas ou perder provas. Ou seja, o estudante amadurecerá muito nesse processo, algo que impactará positivamente na sua carreira e dia a dia no trabalho.**

## 3\. Favorece a conciliação entre trabalho e estudo

Você trabalha e estuda? Então, tenha muita atenção a esse tópico! Se estiver no começo de carreira, é bem provável que ainda esteja na graduação. Mas, mesmo aqueles que já têm alguns anos de estrada, também vivem essa rotina dupla, em busca de mais conhecimento.

Vamos falar a verdade, conciliar as duas obrigações de forma produtiva, às vezes, pode ser bem complicado. Por exemplo, quando precisa se deslocar até a escola para estudar, mas também necessita fazer hora extra no trabalho. E aí, como faz?  Nesse caso, o desempenho em um deles vai ser prejudicado.

Esse é mais um ponto em que a importância da educação a distância se destaca, pois, a possibilidade de estudar em horários, locais e dias determinados pelo próprio aluno permite que ele escolha os momentos em que está mais descansado e com mais disposição para acompanhar as aulas.

**Assim, ganha-se em qualidade e produtividade em ambas áreas, devido ao estresse ser menor, além de ser menos cansativo.**

## 4\. Possibilita que o conteúdo seja acessado a qualquer momento

Sabe aquela história de perder o exemplo ou explicação que o professor passou? No EAD isso não existe. O conteúdo estará 24 horas por dia disponível no ambiente virtual.

No momento em que desejar acompanhar uma aula ou revisar algo, todo o material estará organizado para que você acesse quantas vezes precisar. Prático, não?

## 5\. Ajuda a economizar tempo e dinheiro

Quem não gosta de economizar tempo e dinheiro, não é mesmo? Seguramente todos! Então, essa é outra vantagem dos cursos a distância. A economia financeira se dá devido as mensalidades que geralmente são mais em conta quando comparadas com as dos cursos presenciais.

Além disso, não há custos com transporte, estacionamento, lanches e outros gastos que normalmente temos quando precisamos nos deslocar para fora de casa.

Outra grande vantagem é não perder tempo parado em congestionamento ou dentro de ônibus cheios —algo que vamos combinar, é muito chato! Assim, ganha-se mais momentos com a família e amigos, que é o que todos desejam.

## 6\. Permite interação em cursos online

Tem muita gente que fica com receio de cursos online por acreditar que não há interação entre alunos e professores. Esse é o seu caso? Temos uma  boa notícia, a realidade é bem diferente!

Primeiro, os alunos podem sim enviar suas dúvidas para os professores, existem maneiras de interagir com a turma e tudo isso acontece dentro da própria plataforma de estudos.

Outra forma é por meio de [**fórum de discussão**], que acabam virando grandes comunidades para troca e compartilhamento de informações.

Além dessas, há outras maneiras de interação, como as redes sociais. É muito comum que as turmas criem grupos exclusivos para trocar ideias, dicas, dúvidas e também fazer amizades.

Então, pode ficar despreocupado, há muitas possibilidades de interação, que inclusive podem gerar grandes amizades fora da tela do computador!

## 7\. É muito positivo para o profissional de TI

Os [**profissionais de TI**] precisam ter muita intimidade com o mundo digital. Isto é, saber lidar de forma fluída com programas, linguagens e internet.

Ao escolher estudar por meio da internet, o aluno consegue adquirir mais desenvoltura para lidar com ferramentas tecnológicas, ou seja, aprenderá em um ambiente similar àquele que vai desenvolver seu trabalho.

Fora isso, como a área de TI exige diversos tipos de atualizações e conhecimento, geralmente, os profissionais emendam um curso na sequência do outro. Isso demanda agilidade no método escolhido para estudar. Nesse quesito o ensino a distância é imbatível!






imagem 

Olhe um screenshot do começo de 2016:

imagem

Obviamente o principal é ter a sua dúvida respondida. Nos últimos tempos isso melhorou bastante e continuamos implementando features internas para que possamos saber o mais rápido possível da sua dúvida, direcionar a pessoa certa e poder analisar da maneira mais satisfatória possível. A equipe está crescendo também, você vai ver caras novas cada vez mais frequente por lá.

**São milhares de mensagens trocadas todas as semanas. O que você está esperando?**





imagem 

No nosso jogo, **desenvolvido na engine Unity**, o Zumbi precisa perseguir a heroína, como fazer isso?

Como podemos observar na imagem abaixo, a heroína está na posição x = 100, y = 30 e o zumbi, na posição x = 200, y = 120.

imagem para a posição (100,30), precisamos alterar a posição do inimigo em dois eixos - horizontal e vertical. Vamos mover o inimigo apenas na horizontal, para depois mover ele no outro eixo.

Se eu estou na posição 200 e quero chegar na posição 100, qual a distância que eu preciso andar?

imagem. Por isso, na hora de atribuirmos a nova posição ao zumbi, utilizamos um `Vector3`.

csharp

O que acontece agora se testarmos nosso código?

imagem ou negativo(-).

Quando desenhamos o eixo horizontal, utilizamos uma seta (preta) para representá-lo. Ao mesmo tempo que usamos outra seta (laranja) para representar a distância que devemos andar.

imagem do eixo.

A seta que representa o caminho a percorrer aponta no sentido contrário do eixo, isso indica que queremos andar no sentido negativo (-) desse eixo. Como podemos mudar a conta que estamos fazendo para refletir isso?

A conta atual é:

csharp

colocando os valores ficaria:

csharp

O valor numérico dessa conta está correto, mas queremos o sinal contrário. Como a ordem dos valores de uma subtração importa, podemos inverter os valores da nossa conta para termos o resultado desejado.

csharp

Se voltarmos no nosso código, precisamos trocar somente a linha onde fazemos essa subtração.

csharp

Será que essa abordagem funciona também para o eixo vertical?

Vamos testar. No caso do eixo Y, a heroína está na posição 120 e o zumbi na posição 30.

Colocando esses valores na conta:

csharp

Chegamos ao número -90 e ele faz sentido, pois o zumbi tem que andar 90 unidades na direção oposta a direção de crescimento do próprio eixo Y.

Podemos então generalizar, ou seja, sempre que precisamos calcular o sentido e a distância entre dois pontos, precisamos subtrair a posição X e Y do nosso destino pelo X e Y da nossa origem.

Voltando ao nosso código da classe zumbi, adicionamos o cálculo da \*distânciaY \*para que o zumbi vá atrás da heroína.

csharp

Será que agora chegamos no comportamento desejado?

![]

Parece que não, agora o zumbi está se teleportando para a posição da heroína.

Resumindo: sempre que temos um comportamento de perseguição precisamos subtrair a posição do destino da posição da origem para achar a direção que temos que seguir e a distância que estamos do alvo.

Ao somar o resultado da subtração na posição do inimigo ele se moverá instantâneamente para o destino.

Como esse texto está ficando longo, resolver apenas esse problemas do perseguidor teleportar para a posição de destino em um outro post.Você conhece alguma outra situação onde podemos usar essa mesma lógica? Qual outro problema relacionado a jogos você gostaria de ver explicado aqui no blog? Deixa nos comentários!

Aproveita e olha lá no site da alura os [**cursos que temos sobre jogos**], tenho certeza que você vai encontrar algo interessante para aprender.




Vou iniciar com um questionamento. Você já parou para se perguntar qual é o tipo de **carreira em IA** que você deseja iniciar e o que irá fazer nela, seria coordenar? Programar? Inovar? Considero que todas essas coisas são possíveis. 

Na primeira, você gerenciaria um time de IA, na segunda faria parte desse time e na terceira trabalharia em um laboratório de inovação ou com pesquisa.

Antes de qualquer coisa, gostaria de dedicar este post ao Flávio Andre Virgilio, meu aluno da Alura e inspirador da resposta, à Mayra Oliveira, minha revisora, que me incentivou a fazer o post, e a todos aqueles que querem começar na área de IA, mas não enxergam uma direção clara.

Partindo disso e da minha experiência, é uma boa que você:

- **goste de lógica**. Algoritmos são a base da IA, quanto mais desenvolvido for o seu raciocínio lógico, melhor.

- **tenha interesse em questões filosóficas, de neurociência, matemática, física e até de psicologia**. Na Filosofia, além da área de Lógica, a de Teoria do Conhecimento propõe pensar como definir o que é conhecer algo, e isso é importante para IA.

- **saiba uma linguagem de programação**. Assim pode aplicar os algoritmos, a lógica e as teorias usando um computador. Aconselho **Node (para as APIs de serviços)**, **Python e Java (para os códigos e bibliotecas)**. **C ou C++** são uma boa também. Teste programar em algumas dessas linguagens e veja com a qual sente maior afinidade.

Considero esses 3 pontos básicos, até para saber se esse é o caminho. Ainda falando de modo pessoal, caso você seja apaixonado pelas coisas acima, continue. IA pode ter um mercado em expansão agora, **mas sempre seremos bons naquilo que amamos e somos felizes fazendo**.

## Agora vamos lá para as referências mais práticas.

Você já pensou sobre os pontos acima e sabe que tem um super interesse. Agora pratique. Procure pegar um problema simples e resolva-o até o final. E então pegue um próximo, outro, e assim por diante.

Isso é importante para que você sinta como é desenvolver uma solução.

## E como fazer isso?

- com a formação da Alura de [**Machine Learning**], e o de [Estatística].
    
- com os exemplos ou competições do [Kaggle] (em inglês).
    
- executando os exemplos da [Google AI] (em inglês).
    
- fazendo o curso de [Inteligência Artificial] do MIT (em inglês).
    
- também pelos cursos de Machine Learning e IA do [Andrew Ng] (em inglês).
    
- lendo e seguindo os exemplos do livro de [Inteligência Artificial] do Russell e Norvig (em português) ou free em inglês nesse site da [Universidade de Berkeley].
    
- estudando as apostilas do [Silvio do Lago Pereira] do IME-USP.
    
- explorando esse mapa mental do [Sci-kit learn] (em inglês).
    
Além disso, incentivo você a não parar por aí. Depois de ter concluído o primeiro projeto, compartilhe. Mostre para pessoas próximas, faça um blog, mande um link no twitter, participe de Meetups de IA na sua cidade.

Independentemente de como você classifique esse conhecimento que adquiriu, iniciante, intermediário ou avançado, é sempre bom que ele seja compartilhado e se multiplique.

Eu poderia adicionar referências a esse post eternamente, mas espero que tenha te dado algum norte para colocar as mãos na massa e começar.

Bora mandar bala em uns algoritmos! 




Se você editor de vídeo, já acostumado com o a interface e o workflow que o **Adobe Premiere** te oferecia há anos pode ter tomado um susto na sua última atualização, a _11.1.0_.

Além das melhoriais comuns, relacionadas a performance, trabalhos de mídias 4K e o refinamento do [**Dynamic Link**], o Premiere mudou a forma de interagir com elementos gráficos e texto dentro da sua edição.

## O Title agora chama-se TYPE TOOL

![]

A mudança vai diretamente ao comportamento que o recurso terá, onde anteriormente tinhamos a opção de **Title** sendo entendido como um painel, agora ele visa o uso a partir de uma ferramenta.

Notem que agora na sua **Tool Box**, temos a ferramenta de **Type Tool**, fazendo com que o trabalho de texto esteja diretamente ligado com o material que vem sendo editado.

![]

A ideia da _"nova ferramenta"_ é fazer com que o editor já insira as informações de texto sem sair da Timeline de edição, fazendo com o que o mesmo ganhe tempo em relação ao posicionamento do elemento no projeto.

> OK, entendi que virou ferramenta, mas cadê as propriedades de formatação?

## Propriedades de formatação

Seguindo a mesma linha de edição das propriedades de vídeo e áudio, a edição do **Title** irá depender do **_Effect Control_**.

![]

Notem na imagem acima, que ao ter selecionado o **Objeto Title**, o **_Effect Control_** nos mostra as propriedades de formatação e até mesmo os recursos relacionados a trabalhar com as formas básicas e o uso da _Pen Tool_.

Então para quem se assustou por não ter encontrado o **Title**, está ai o que aconteceu!





No curso de [**Android II Integração com apps e recursos do device**] desenvolvi a App Agenda para cadastrar alunos com o seguinte visual:

imagem 

imagem` do `AlunoAdapter` modificamos a referência da `ImageView` para `CircleImageView`:

java

Se executarmos a App neste instante temos este resultado:

imagem

## Cuidados com o rotacionamento

Entretanto, se rotacionarmos a nossa App nesse exato instante, o que será que acontece? Vamos testar!

java

Ops, recebemos uma exception! Por que será que aconteceu isso?

No curso, criamos dois layouts para o `list_item.xml`, isto é , o _portrait_ (retrato) e o _land_ (paisagem). Ou seja, se olharmos o XML para o modo land temos o seguinte conteúdo:

xml

Note que ainda estamos usando a `ImageView`, portanto, vamos modificar para a `CircleImageView` no layout land da mesma forma como fizemos no layout portrait:

xml

Agora se rodarmos a nossa App em modo land:

![]

Agora tanto o nosso layout portrait como land estão com as imagens circulares! :D

## Firulas da CircleImageView

Uma das coisas legais da lib `CircleImageView`, é que podemos chamar alguns atributos da View para ajustar mais ainda o design da nossa imagem, como por exemplo, adicionar uma borda. Vamos então adicionar uma borda para ver o resultado:

xml

Neste exemplo fiz uso dos atributos `app:civ_border_width` para adicionar a largura da borda e `app:civ_border_color` para colocar a cor. Por fim, rodando a App, temos a seguinte imagem circular:

![]

Neste post aprendemos como podemos fazer, de uma maneira fácil, para que nossas imagens fiquem circulares, bacana né?





imagem 

Estamos felizes em anunciar a chegada de uma série de novidades na plataforma de aulas da Alura. Isso mesmo: agora temos features para você extrair ainda mais dos seus estudos na Alura!

## Alura+

- imagem e outros conteúdos como artigos, podcasts e vídeos de uma forma que irá facilitar a organização dos seus estudos.

Gostou?

Pode usar os Planos de Estudo apenas para você mesmo ou compartilhar com o mundo inteiro, como uma recomendação sua, divulgando dessa forma o que você acha interessante de estudar dentro de uma determinada área.

Por exemplo, eu publiquei um [plano de estudos sobre performance de front-end] com coisas que acho bacana de estudar (segue lá!). Também, lançamos o [plano de estudos do(a) programador(a) iniciante], do William Oliveira.

[Crie já o seu plano de estudos na Alura.]

## Cursos e categorias novas

- imagem





imagem 

No blog da Caelum temos alguns posts bem longos sobre determinados assuntos que demandam muito conteúdo, mas isso deixa a rolagem da página gigantesca.

Isso é o que aconteceu, por exemplo, com o post que o Sérgio Lopes escreveu de **[Por uma Web mais rápida: 26 técnicas de otimização de Sites]**:

imagem para este elemento.

html

Neste caso foi adicionado o `id` como referência `habilite-gzip`, por exemplo. Cada caso irá pedir uma especificidade diferente.

Ok, definido isso, precisamos agora criar um link para o tópico dentro do texto, a partir do índice lá em cima.

Nos itens do índice adicionamos exatamente isso: links!

html

Note que não temos nenhum link para inserir em nossa referência de **link (`href`)**... Mas então o que entra na (`href`)?

Lembra que adicionamos uma identificação (`id`), específica para aquele tópico, na tag `h3`, que o envolvia? É exatamente essa referência que indicaremos no `href`.

html

Ou seja, para indicar que queremos pular dentro da página diretamente para a `id` indicada, foi adicionado um "#" antes da indicação (`id`).. Com isto, o link que criamos cria uma âncora dentro da própria página, varrendo toda a página até encontrar a `id` correspondente ao indicado na `href`. :)

Ao final, o índice ficará mais ou menos assim:

imagem

## Outros usos

Além desse índice de tópicos, encontramos por aí outras formas de utilizar a ancoragem, como em botões "Voltar para o topo". Algo como:

![]

Nesses casos, temos uma ancoragem também, porém que nos envia de volta para a origem.

Independente do caso de uso, é importante ressaltar que **esse tipo de recurso só é relevante em páginas com muito conteúdo**, isto é, páginas em que a rolagem é tão grande que o usuário poderá se perder no meio do caminho e, consequentemente, prejudicar a usabilidade do nosso site.

## Melhorando a navegabilidade

Se considerarmos que hoje os [**usuários são leitores com pouco engajamento na leitura de textos completos**], considerar a ancoragem de elementos dentro da própria página é algo muito interessante para conseguirmos uma melhor navegabilidade.

Desse modo, facilitamos a busca pelo que realmente interessa ao usuário, dentro da nossa página e aumentamos as chances de mantê-lo interessado no que consideramos importante para sua conversão.

Lógico que, apesar de ser um recurso interessante, é importante utilizá-lo com cautela, buscando analisar bem o contexto para validar se é, de fato, necessário utilizar esse mecanismo.

Para deixar suas páginas ainda mais completas, aprenda as diferentes especificidades que podemos encontrar em HTML, suas vantagens e desvantagens e muitas outras coisas legais na [**Formação FrontEnd**] da **Alura**!




Diz a lenda que o Mark Zuckerberg, fundador do Facebook, tem seu almoço definido por outra pessoa pois ele não quer gastar energia decidindo o que vai comer.

Eu ainda tenho muito prazer escolhendo meu prato ou sobremesa, mas extremos como este trazem a tona as dificuldades que enfrentamos na hora de escolher algo.

## Costumes do dia a dia

Se tenho três abas do navegador abertas e fecho uma pois terminei uma tarefa me pergunto: qual fazer agora? Tenho que analisar se vale a pena ir para uma ou a outra.

Tenho que mudar meu contexto de uma para a outra e, pior ainda, pode ser que no meio de uma tarefa eu vá para a outra e depois volte. Quanto mais escolhas, mais tempo gasto pulando entre uma e outra.

Por muito tempo tive a ilusão de ser multitarefa, até aprender que essa característica não funciona bem como imaginamos.

## Uma coisa de cada vez

O cérebro está trabalhando o tempo todo, mas não parece funcionar como um processador de computador: se o seu tem 8, ele faz 8 contas matemáticas diferentes ao mesmo tempo.

Eu mal consigo fazer uma conta de soma. Se fizer uma conta de mais ao mesmo tempo que tomo banho eu já não lembro se passei o shampoo ou não. Sempre bato na tecla de manter uma única aba aberta: feche todo o resto.

## Distrações do dia a dia

Mas mesmo assim ainda temos um momento de escolha muito duro no dia a dia. Quando abrimos uma nova aba podemos entrar no site do trabalho, ou digitar "face", enter. Ai abre outra aba depois...

O facebook está a quatro cliques de distância, como resistir? Se o seu vício não é o facebook, que seja o instagram, o twitter, o jornal, a revista científica online, o blog. Como resistir abrir ele no meio do período que quer focar em outra coisa?

## Aprenda a limitar suas distrações

O plugin [**StayFocusd**] para o Chrome permite configurarmos a URI de diversos sites, como `www.blogquesouviciado.com.br` e `www.sitequesouviciado.com.br`, e o tempo máximo que podemos passar neles por dia. Comecei com 15 minutos para meu facebook e jornais - para o dia inteiro!

Já no primeiro dia estourei o limite dos 15 minutos. Poderia ter configurado somente 15 minutos para o horário de trabalho, mas percebi que esses sites também afetavam minha vida pessoal em casa. Portanto são 15 minutos no máximo o dia todo.

Foi uma longa semana de adaptação, já durante a segunda semana não estourei o limite nenhuma vez. Na terceira percebi que alguns sites eu acessava somente para "matar o tempo"...

Exatamente aquele tempo que eu reclamava que eu não tinha. Eu devia estar gastando mais de 30 minutos por dia nesses sites, são 11 horas por mês, basicamente um dia e meio de crescimento na minha carreira e produtividade gasto completamente no facebook e sites para matar o tempo.

## Qual foi o resultado disso tudo?

**Hoje mantenho um uso mais saudável do site do facebook, menos de 10 minutos por dia. E os sites de matar o tempo foram completamente bloqueados em dia de semana. Tudo feito através do plugin.**

E no celular, quando estou numa fila, ou elevador? Tenho só duas opções: se vou ficar muito tempo em uma fila, estudo algo no site do Alura ou leio um livro através da Casa do Codigo ou do Kindle. Se é algo rápido, envio mensagem para minha família ou amigos.

Não tenho opções, eu fiz minha escolha meses atrás. Agora não gasto nem energia nem meu tempo. Não mato mais o meu tempo com pequenos vicios. Faço algo que me dá prazer e ao mesmo tempo enriquece minha vida.

**Claro, comece simples. Bloqueie os sites para 15 minutos diários (tenha coragem!), matenha o celular virado para baixo e sinta a diferença. Viva a vida, seu estudo e seu trabalho.**

Nos momentos entre focos, de transito ou de espera, pode usar o celular :)

Junte-se a mim, ao grupo que escolheu aproveitar o tempo com o que quer, e não matar o tempo com qualquer coisa.




**Como eu e meu irmão (o Paulo, fundador do [GUJ] e da [Casa do Código]), ele começou com aplicativos de locadora. A seguir ele nos conta um pouco da história dele. Vamos lá?**

# Me conta um pouquinho sobre sua história na programação?

_Comecei a programar com 13 anos por volta de 1993 com um amigo de infância. Fizemos um curso de Clipper Summer, depois um de clipper 5.2 usando com DBase III Plus. Criamos alguns aplicativos para video locadora e pizzarias do bairro._

_Depois trabalhei com VB 3 e 5 e com ASP clássico. Desenvolvi alguns projetos para Editora de lista telefonica, outro interno para o Santander e dei aula de VB 5 em uma escola chamada Sequencial. Depois resolvi ir para luz e desde que entrei no mundo Java X OpenSource, nem penso em trabalhar ou atuar fora desse mundo!_

_Trabalhei com java 5, 6 e agora com 7 e 8. Trabalhei com Spring 2.5 em uma consultoria que desenvolvia para o Banco do Brasil o Office Bank e outros aplicativos internos. Nos ultimos 4 anos estou atuando em um projeto na Prodesp como terceiro. Durante esse tempo passei por 5 consultorias e vou ficar até finalizar esse projeto._

_Estamos usando nesse projeto Java 8, Jsf 2, WilfFly 8 (vamos atualizar para o 10), BootStrap, DB2, Oracle 10G, SqlServer, Redis, Python, Rest, WebService, JMS, WebSphere, entre outras tecnologias necessaria para manter a parte legada._

(nota do Alex: Das 13 tecnologias citadas no projeto atual, só não temos curso no Alura de 2...ainda! :P )

# Como conheceu o Alura?

_Conheci o Alura através da Caelum._

_Sempre busco algo dinâmico bem explicado e sem enrolação. **Todos** os cursos que fiz no Alura dou nota 10 para conteúdo, explicação e professor. O estudo online é rápido e objetivo!_

_Como atualmente estou trabalhando em um projeto que mistura legado com codigo novo, muitas vezes não temos muito tempo para resolução de um problema. Por exemplo, tive que criar um robozinho para processar arquivos de log. Comecei fazendo em Java 8 mas não ficou muito performático! Como fiz o curso de Python do Alura, arrisquei a criar essa funcionalidade utilizando-o e no final os ganhos em performance foram notaveis._

_Além do Python o mesmo aconteceu com o Redis. Ao terminar de fazer o curso no Alura, me deparei com um problema no sistema e resolvi utilizando o Redis._

# Qual seu plano de crescimento para o próximo ano?

_Vou me esforçar ao máximo para adquirir mais conhecimento técnico. Isso é fundamental para tomar decisões sobre qual melhor tecnologia utilizar no projeto alem de definir pontos de falha e pontos que de atenção._ 3\. O que você sugere para alguém que quer se tornar um aluno de destaque como você?

_Estudar deve ser como uma religião: seja fiel a ela a recompensa virá com certeza!

Estudar, participar de foruns, estudar, ajudar outros alunos ou companheiros de TI, estudar, participar de projetos OpenSource, estudar, estudar..._

E ai, gostou da história do Cristiano? Também tem uma história bacana pra contar pra gente?

Você pode ver cursos das várias tecnologias que o Cristiano citou [**aqui na Alura**] :)




Pode parecer um clichê usar aquela máxima do pensador Confúcio, de que “uma imagem vale mais do que mil palavras”, mas nesse meio é uma grande verdade. O poder da imagem no marketing é forte.

As imagens têm um impacto bastante significativo por atingir um amplo número de pessoas e ter a sua “leitura” muito mais rápida, além de facilitar a assimilação do conteúdo. De fato, as pessoas se lembram de [**80% do que veem e apenas de 20% se elas somente leem**] uma informação. Com isso, o uso de recursos visuais é uma forma de fixar elementos, inclusive a sua marca.

Para saber mais sobre marketing, com foco no [**marketing digital**] e de conteúdo, e o poder da imagem dentro dessa área, acompanhe o post com a gente!

## Como o marketing funciona

O marketing e a comunicação abrangem áreas diversas, com o objetivo de tornar seus produtos, serviços ou mesmo a empresa mais conhecidos. O marketing ajuda a construir a imagem de uma marca, funcionando como uma espécie de elo entre ela e os clientes e sendo capaz de fortalecer essa relação.

### O marketing digital

Toda ação de marketing realizada online pode ser chamada de [marketing digital]. A internet traz vantagens como a interatividade, o alcance global em um curto espaço de tempo e as métricas, através do controle de acessos e compartilhamentos.

### O marketing de conteúdo

O [**marketing de conteúdo**] é responsável pelo maior engajamento entre as pessoas e uma empresa, pois gera conteúdos relevantes que atraem e agregam valor à marca. Isso porque o marketing de conteúdo pode trabalhar com dicas, soluções de problemas do cotidiano e outros tipos de informações que não necessariamente têm ligação com o que a empresa vende, o que gera maior confiança.

## Entenda o poder da imagem no marketing

Para atingir seus objetivos, o marketing utiliza diversos recursos, inclusive as imagens, para se comunicar diretamente com o público de interesse. É uma forma de complementar o que foi dito ou, como é mais comum, de chamar a atenção das pessoas.

Além do mais, nem todo mundo tem tempo de dedicar-se a uma leitura mais extensa de uma informação nos dias corridos de hoje. A rotina puxada exige uma comunicação rápida, de forma que chame a atenção para o conteúdo da maneira mais objetiva possível.

Como o cérebro processa as informações em imagens [**60 mil vezes mais rapidamente**], é uma forma de conseguir a melhor transmissão da informação, em muitos casos.

### O estímulo visual

Como 90% das informações transmitidas ao cérebro são visuais, as pessoas tendem a ser mais estimuladas visualmente.

Quem visualiza uma imagem que apresenta um conteúdo mais extenso, por exemplo, pode, diante dela, decidir se acessa o conteúdo e continua a leitura ou não.

Ou seja, no chamado marketing visual, a imagem se responsabiliza por transmitir uma prévia de tudo que a ação deseja comunicar. Além disso, ativa a curiosidade de quem visualiza e estimula a criatividade.

### A fotografia nas redes sociais

Se uma postagem tem uma foto, a interação com ela tende a ser maior. Por exemplo, [**em uma rede social**] como o Facebook, o engajamento dos posts cresce com a existência de uma foto, aumentando as curtidas e também os comentários. De fato, o envolvimento em posts com imagens [**aumenta em cerca de 230%**].

O mesmo acontece no Twitter, já que um tweet com foto recebe, em média, até [**35% a mais de RTs**]. Diante disso, é possível entender o sucesso de outra rede conhecida: o Instagram.

Se você deseja anunciar algo na rede, entenda que um dos pontos principais deve ser promover a identificação com o público. E, em geral, a imagem é uma ótima forma de conseguir isso.

## Boas práticas no uso das imagens no marketing digital

Para ter bons resultados, o uso de imagens não deve ser aleatório. Como toda informação a ser compartilhada com o seu público, ela também deve ser bem planejada. Além disso, é importante saber que a prática de utilizar imagens é relevante, mas pode não ser essencial em todas as áreas.

Com isso, é preciso ponderar e conhecer as boas práticas dessa possibilidade. Entre as questões mais destacáveis estão:

### Cuidado com o direito de imagem

Para evitar problemas, utilize apenas imagens próprias ou que tenham permissão para uso. Você pode pagar por imagens de qualidade em [**bancos de imagem**] na internet, por exemplo.

O importante é ter atenção à licença de atribuição. Algumas permitem o uso gratuito e livre, inclusive com modificação e para fins comerciais — e são estas que devem ser empregadas.

Também vale considerar fazer uma conta em um banco de imagens e pagar para ter o direito delas. Os planos são acessíveis e garantem que você possa utilizar os elementos dentro das regras.

### Atente para a edição

Para garantir o potencial dessa abordagem, não se esqueça de ter uma edição de imagem de alta qualidade. Se possível, conte com a ajuda de um profissional para conseguir resultados melhores.

Como a qualidade faz toda a diferença para a sua peça, tenha cuidado com a [**resolução**], com os elementos utilizados e até com o redimensionamento para que não fique desproporcional.

Além de tudo, busque a originalidade, de modo a imprimir a personalidade da sua marca no uso desses recursos.

### Dê um propósito útil às imagens

Estudos revelaram que as pessoas [**prestam mais atenção em imagens**], especialmente se elas carregam informações. Infográficos, por exemplo, possuem [**3 vezes mais engajamento**] do que qualquer outro tipo de conteúdo.

Com isso, também vale a pena pensar em dar um propósito útil e diferenciado para as imagens. Crie tutoriais, apresente dados e faça considerações importantes utilizando os recursos visuais.

Isso enriquece a sua estratégia de marketing e garante melhores resultados de alcance e de engajamento. Porém, é necessário usar isso pontualmente, quando realmente fizer sentido e não somente em busca de resultados.

### Pense na relação direta

Uma imagem que não seja convergente com o conteúdo ou com a identidade do seu produto ou serviço pode fazer com que o seu público se decepcione e deixe a página antes mesmo de saber mais. Por isso, desperte a curiosidade e cumpra com o que propõe.

Não use as imagens para ludibriar, como ao usar fotos que não correspondem ao assunto tratado ou, pior, que não são do seu produto. Aposte, acima de tudo, na confiança como um fator para o sucesso.

Para relacionar-se melhor com o consumidor um bom trabalho de marketing é fundamental. Utilizando o poder da imagem em suas ações, essa atuação pode ser ampliada.

Gostou do post? Aproveite para seguir a gente em nossas redes sociais: [Facebook], [Twitter], [LinkedIn]e [YouTube].



Se você tem um projeto ou um negócio, é provável que já tenha pensado em divulgá-lo usando algum meio digital. Quando pensamos em anúncios online, muitas vezes o que vem em nossa cabeça são as propagandas que vemos no **Facebook, Instagram ou Google Adwords**. Porém, atualmente, os anúncios no LinkedIn Ads têm ganhado força entre os profissionais de marketing digital.

## Alguns números sobre o LinkedIn

- Mais de 545 milhões de usuários do mundo inteiro;
- Mais de 26 milhões de brasileiros cadastrados;
- Cerca de 7 milhões de empresas presentes na plataforma.

Além dos números impressionantes, o LinkedIn é uma mídia social voltada aos negócios. Diferentemente do Facebook ou Instagram, em que as pessoas estão conectadas para se distrair ou ver as atualizações dos amigos, no LinkedIn estão presentes aqueles que procuram uma oportunidade de emprego, desejam fazer **networking** e, claro, conhecer soluções e negócios inovadores.

## LinkedIn para anúncios B2B (Business to Business)

Os anúncios do LinkedIn são grandes aliados para empresas que trabalham vendendo produtos ou serviços diretamente para outras empresas.  Como a mídia social é voltada aos negócios, profissionais de diversas áreas estão sempre acessando ao **feed** de notícias.

Sendo assim, é possível que você encontre a diretora de RH que está precisando adquirir uma solução para organizar seu quadro de funcionários, ou a gerente de marketing que precisa de uma agência especializada para realizar um evento da empresa. Isto é: é muito provável que você encontre alguém que precise exatamente do que você vende, dentro do LinkedIn!

Aqui na Alura e na Caelum, utilizamos bastante o LinkedIn para anunciar [**nossos materiais gratuitos para empresas**], pois os conteúdos são voltados a gestores dos mais variados negócios e áreas.

## LinkedIn para anúncios B2C (Business to Consumers)

Mas se engana quem pensa que o LinkedIn serve apenas para anúncios B2B. Empresas que trabalham com consumidores finais também podem se beneficiar com a publicidade na plataforma, como é o caso da Amazon, que utiliza os anúncios para [**divulgar novos serviços e promoções de livros**].

O LinkedIn possui diferentes opções de divulgação que se adequam a várias necessidades apresentadas pelas empresas anunciantes. Para as empresas B2C, que desejam anunciar nessa plataforma, é muito interessante entender qual tipo funciona melhor com seu público para ter uma maior garantia de sucesso.

## O sucesso dos anúncios no LinkedIn

É preciso estudar onde está o seu público e realizar testes para descobrir qual mídia social funcionará melhor para o seu negócio. Também é essencial que, ao escolher uma plataforma para divulgação, você entenda corretamente como utilizá-la.  

Se você ficou com vontade de conhecer mais sobre o LinkedIn Ads e quer descobrir se é uma boa opção para seu negócio, recentemente lançamos o [**Curso LinkedIn Ads: Novos clientes com anúncios otimizados e e-mails patrocinados**] na Alura. Você aprenderá quais são os tipos de anúncios possíveis e o passo a passo, desde a criação de uma **company page** até como realizar a otimização dos anúncios criados na plataforma.




Mesmo com um plano de internet rápido, a rede está instável e cai constantemente.

O que pode estar deixando a rede assim?

Bem, vamos dar uma olhada na rede para tentar identificar o problema:

imagem chega a ele, este tenta entregá-lo para todos os dispositivos conectados a ele.

Aquele que for o destinatário fica com a mensagem, porém quem não for recebe a mensagem da mesma maneira, apenas não responde:

imagem.

Quando dois pacotes chegam ao switch ele forma uma fila de pacotes. Esse tempo que o pacote espera na fila, causa atraso na sua entrega e, por consequência, a rede fica mais lenta.

Outro motivo que causa problemas na rede é a quantidade de dados que conseguem passar por segundo em um meio de transmissão.

Se em uma rede com uma internet de 10 Mbps algumas pessoas estiverem assistindo um curso da Alura em HD, outra estiver ouvindo um podcast do [**hipsters.tech**] e outra conversando via Skype. A rede ficaria mais lenta do que se tivessem 50 Mbps de internet, não?

Vamos entender o motivo disso ocorrer:

Pensemos o seguinte, uma pista com quatro faixas e outra com duas faixa.

imagem em inglês. A pista seria o meio de transmissão, enquanto os carros seriam os pacotes.

No caso da internet de 10 Mbps, o tamanho da "pista" seria mais estreito para passar esses dados, enquanto que em 50 Mbps, teríamos cinco vezes mais largura de banda para os dados trafegarem. O que deixa a rede mais fluída

## Para saber mais

Esses são alguns motivos que deixam a rede lenta, porém existem [outros] como:

- Interferência de sinal em redes sem fio;
    
- O cabeamento interno e a [impedância];
    
- Hardware de rede desatualizado;
    
- Tempo de resposta de outros hosts, como servidores.
    

Existem também outras diferenças entre os hubs e os switches. O primeiro trabalha na camada 1 (física) do [modelo OSI], enquanto o segundo funciona na camada 2 (enlace), alguns na [camada 3] (rede), ou seja trabalham com alguns protocolos dos roteadores.

O switch, ao contrário do hub, pode ser configurado da forma que melhor atender a rede. Uma configuração muito utilizada é a VLan, já que garante segurança e performance na rede, entre outras coisas.

## Conclusão

Nós tínhamos o problema da instabilidade da rede. Percebemos que os hubs causavam isso já que sempre encaminham os pacotes a todos os hosts na rede, além dos dados sofrerem danos.

Ao substituí-los por switches, notamos uma melhoria no desempenho na rede, já que os pacotes não sofrem tantos danos e não existe a necessidade de muitos broadcasts na rede.

Vimos também que alguns problemas nas redes estão associados a seus ativos, porém esse não é o único motivo. Tamanhos de pacotes, cabeamento, tempo de resposta, entre outros podem fazer com que a rede fique mais lenta e, ou, apresente instabilidade.

Curtiu essa parte de redes? Essa é apenas uma pequena introdução sobre o assunto. Aqui na Alura, temos uma [**formação em redes**] para você que quer se aventurar nesse vasto mundo.

Nesta formação, você aprenderá sobre os conceitos, como montar uma rede até um provedor de acesso, sobre lista de acessos, IPv6 e sobre segurança para defender sua rede de possíveis ameaças.




Estamos em um formulário de uma app Android e já preenchemos praticamente todas as informações, porém assim que viramos a tela do dispositivo acabamos perdendo tudo. Por que isso acontece? Vejamos o [**ciclo de vida**] da `Activity`:

Ao iniciarmos a aplicação é chamado o método `onCreate()`, responsável por construir toda a aplicação. Depois desse método, é chamado outro, o `onStart()`, que de fato inicia a aplicação. Depois de iniciada, o Android chama o `onResume()` que vai interagindo com o usuário, atualizando a aplicação na medida que é necessário.

Quando **viramos a tela** é chamado o `onPause()` que pausa a aplicação e em seguida o `onStop()` que pára tudo. Depois nossa activity é destruída através do método `onDestroy()` e em seguida é criada novamente, chamando o `onCreate()`.

Então podemos concluir que nosso formulário ao ser virado, perde todas informações pelo fato dele ser destruído. Mas como podemos resolver isso? Será que da pra salvar as informações contidas nele antes de virarmos?

Poderíamos simplesmente colocar no momento que ela é pausada, mas ainda não o seria adequado, pois a qualquer instante a aplicação poderia ser matada e assim nada seria salvo. Temos um método que poderá nos ajudar neste momento que é o `onSaveInstanceState()`, pois ele é chamado antes da `Activity` ser parada. O que faz dele ser tão poderoso?

O `onSaveInstanceState` recebe como parâmetro um `[Bundle]`. E como este `Bundle` pode nos ajudar? Podemos passar para dentro dele todas as informações que queremos salvar, e é exatamente isso que estávamos buscando! Mas como fazer isso?

java

Nesse caso nosso `Bundle outState` está usando o `putSerializable()` que funciona como um `Map`, passamos nossa chave e em seguida o valor. O bacana disto é que para nosso formulário teríamos vários `putSerializable`, para cada campo uma chave e valor.

Testando a nossa app, vamos girar a tela para ver o que ocorre. Usaremos o `Log` para verificar o que ele está salvando, no LogCat vemos o seguinte:

```


02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Salvando: Matheus 02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Salvando: 12345678

```

Estamos com todos nossos campos salvos agora, se rodarmos nossa app nesse instante e girarmos a tela veremos que nada aconteceu, ou seja, ainda estamos perdendo as informações! Por quê? Como apenas salvamos os campos, em momento algum os restauramos. Há um jeito de pegarmos essas informações ?

Existe um outro método que é chamado assim que iniciamos o ciclo, que é o `onRestoreInstanceState()`. Certo, como esse método funciona? É recebido como parâmetro um `Bundle` e da mesma forma que salvamos algo nele conseguimos retirar. Podemos pensar da seguinte forma: O `Bundle` é uma lavanderia, nossos campos são as roupas. Ao deixamos nossas roupas na lavanderia, deixamos algo que possa nos identificar quando formos retirá-las, por exemplo um telefone, cpf ou rg.

java

Aqui estamos usando essa ideia da lavanderia: assim como nós deixamos nossas informações na lavanderia no método `onSavedInstanceState()`, aqui estamos pegando o `savedInstanceState`, que é o nosso `Bundle`, e pedimos nossas informações de volta, passando para cada uma delas nossa identificação. Isto acontece quando usamos o método `getSerializable()`, que recebe nosso identificador.

Se rodarmos novamente nossa app, preenchermos o formulário e tentarmos rodar a tela, nenhum dado se perde:

```


02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Restaurando: Matheus 02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Restaurando: 12345678

```

Excelente! Agora podemos deixar nosso usuario rodar a tela infinitas vezes e não precisamos mais nos preocupar em perder os dados que ele já havia inserido!

Vimos então que quando nossa activity muda a orientação ela é destruída. Quando estamos tratando de formulários, temos dados que nosso usuario não gostaria de perder e vimos que para solucionar esse problema existem dois métodos: `onSaveInstanceState` e o `onRestoreInstanceStace`, que nos auxiliam a persistir o dados antes de nossa activity ser destruida e resgatarmos quando for reconstruida, respectivamente.

**Quer saber mais sobre Android e mobile? Aqui na Alura, dê uma olhada nos nossos [cursos mobile], que tem cursos que abordam esses e muitos outros assuntos para que você construa sua primeira app completa! Também, na **Caelum**, temos 2 cursos presenciais do básico ao avançando!**




A gestão colaborativa é um estilo de liderança, no qual todo mundo na empresa participa das decisões e do sucesso do negócio. Parece perfeito, não é mesmo?

Bom, mas… Como colocar isso na prática? Primeiro, vamos entender de onde apareceu a Gestão 3.0 e quais são os princípios deste estilo de gerenciamento das equipes.

## O que é Management 3.0

“_A gestão é importante demais para ser deixada apenas para os gerentes_.”

A citação acima é de Jurgen Appelo. Ele é um gerente, escritor, palestrante e faz-um-monte-de-outras-coisas holandês, que provavelmente estava muito cansado de ver as empresas falharem no gerenciamento de equipes ao repetir os mesmos padrões de sempre. Daí, ele criou um conceito que começou a chamar de Management 3.0.

Mas o que o Management 3.0 pode fazer para a sua empresa? Segundo Jurgen, o conceito traz uma gestão mais humanizada para a empresa, em que as pessoas devem ser o ativo mais importante da organização.

Um dos objetivos da Gestão 3.0 é engajar os/as colaboradores, e assim alavancar o crescimento do negócio, com todo mundo na empresa focado em um objetivo comum: entregas rápidas, eficazes e ágeis para a criação de produtos incríveis. Com isso, diminui também a rotatividade de pessoal e aumenta a satisfação.

Jim Highsmith, consultor executivo da Thoughtworks, diz que “_Management 3.0 serve aos líderes envolvidos na transformação Agile e Lean como um guia provocativo para que eles mesmos e elas mesmas tornem-se ‘ágeis’_”.

imagem, Appelo contextualiza as formas de administração de pessoas da seguinte maneira:

**Management 1.0**

Orientado por comandos, com baixa liberdade nas decisões e criações. O poder está nas mãos de poucas pessoas, a estrutura de decisões é de cima para baixo.

**Management 2.0**

Um estilo que procura trazer melhorias na gestão e desenvolve algumas novas técnicas mais eficazes de gestão, como a metodologia Six Sigma, Gestão de Qualidade Total (TQM) e outros. Mesmo assim, a estrutura de decisões ainda é muito vertical.

**Management 3.0**

Busca valorizar pessoas e times. O foco é criar um ambiente onde todo mundo é responsável pelo sucesso do negócio e cabe às equipes a forma como as tarefas são realizadas, tirando a verticalidade do sistema de gestão.

## 6 princípios do Management 3.0

Jurgen Appelo enxerga as empresas como redes e sugere aplicar 6 visões para o sucesso na gestão de equipes. Já que o holandês é famoso por seu senso de humor durante as palestras e workshops, no seu livro sobre o Management 3.0, ele ilustra este conceito de seis visões com este lindo desenho de um marciano:

imagem.

Na **Pixar**, sempre após um novo filme ser lançado, faz se uma apresentação sobre o que deu certo e o que deu errado neste projeto (_Melhorar tudo_).

A **Zappos** executa a visão 2 (_Empoderar pessoas_) com a não existência de um script para realizar atendimentos por telefone. Assim, as pessoas no call center lideram as chamadas de clientes com uma maior autonomia e têm confiança da gestão para fazer isso, precisando seguir apenas uma regra: servir bem ao cliente. Em 2018, a Zappos foi [premiada] como a marca com “melhor atendimento ao cliente” dos EUA.

imagem, mas ela também segue a visão de _Aumentar as estruturas_ ao concentrar seu maior foco para a excelência em softwares e ao sempre prezar por um crescimento sustentável do negócio.

## Por onde começar agora: ideias e cursos

Para ganhar _insights_ interessantes de quem trabalha com Management 3.0, escute o episódio sobre o tema no podcast [Hipsters.tech] com André Faria da Bluesoft e a Simone Pittner da Adaptworks.

Inclusive, André criou um curso para a Alura sobre Empreendedorismo, que não é só para quem quer ter o seu próprio negócio. Ele ensina também como se tornar um agente de inovação e mudança como colaborador(a) de uma empresa. Veja o conteúdo do curso [Empreendedorismo: da ideia ao plano de negócios] aqui!

Você se interessa por Métodos Ágeis e Scrum ou quer melhorar a gestão dos times na sua empresa? Confira a formação [**Agilista**] que contém vários cursos para te guiar no processo de se tornar especialista no Agile e Scrum!




Estamos configurando um novo servidor de banco de dados aqui na Alura para armazenar os dados dos alunos, vamos como configurar o IPTables no nosso servidor, bloqueando protocolos, portas e permitindo acesso de uma máquina. Na reunião ficou decidido, por questões de segurança que:

- Para que usuários maliciosos, ou vírus, não encontrem nossa máquina, não será possível realizar [**ping**];
    
- Para prevenir de hackers , ou vírus, tentar acessar nosso banco vamos **bloqueá-lo de acessos remotos**.
    

Legal, já que temos essas duas tarefas, começaremos pelo **ping**. Antes de tentarmos bloquear o ping, vamos verificar se o mesmo funciona, fazendo nossa máquina pingar (`ping`) o nosso servidor (`192.168.0.1`):

imagem que entrará (`INPUT`) no servidor , no topo da nossa tabela de regras, isto é, na posição `1`:

`# iptables -I INPUT 1`

Agora que indicamos a nossa ação de bloqueio, precisamos adicionar mais algumas informações para especificar o nosso objetivo, isto é, bloquear o ping.

Como o ping funciona pelo protocolo [**ICMP**], é ele que vamos indicar. Sendo assim, vamos bloquear o protocolo (`-p`) ICMP (`icmp`):

`# iptables -I INPUT 1 -p icmp`

Temos também que informar o tipo que queremos bloquear no protocolo, que no caso é a resposta do servidor `--icmp-type echo-request`, após isso, definimos a ação (`-j`) para bloquear (`DROP`) os pacotes :

`# iptables -I INPUT 1 -p icmp --icmp-type echo-request -j DROP`

Note que o nosso comando é um pouco grande, será que funciona? Vamos testar:

imagem a tabela que queremos, no nosso caso é a tabela de entrada (`INPUT`).

`# iptables -L INPUT`

imagem, que no nosso caso é o **localhost**, ou seja, o `127.0.0.1`. Lembrando que ao invés de bloquear (`DROP`), precisamos aceitar requisições, portanto `ACCEPT`.

Novamente, o comando completo fica assim:

`# iptables -I INPUT 1 -p tcp --destination-port 3306 -s 127.0.0.1 -j ACCEPT`

![]

> _Mas se eu colocar INPUT 1, não vai sobrescrever a outra regra?_

O comando `-I` insere uma nova regra, logo, quando digitarmos o comando acima, ele ficará na primeira posição de nossa tabela de regras, enquanto o que estava nessa posição irá para a segunda.

Vamos listar nossa tabela novamente para ter certeza disso:

`# iptables -L INPUT`

![]

Viram? Nossas três regras estão na tabela do firewall.

Bom agora que já temos todas as regras criadas podemos falar para o iptables salvá-las. Então `iptables-save` para salvá-las.

Agora todas as nossas regras estão salvas no servidor.

## Pontos de atenção

Vale lembrar que o **Linux** é um sistema **case sensitive**, isto é, letras maiúsculas e minúsculas são diferenciadas. Mudar um parâmetro pode fazer o comando não funcionar como esperado.

Também temos que lembrar que todos os comando acima são feitos como **superusuário**, ou seja, precisamos utilizar o `sudo` ou estar logados como root para funcionar.

Vale lembrar também que é preciso cuidado ao executar comandos como superusuário para não comprometer o sistema.

## Conclusão

Nesse artigo vimos como configurar um firewall no Linux utilizando o iptables. Bloqueando tanto um protocolo, quanto uma porta. Também vimos como aceitar a requisição de um endereço IP.

Gostou do IPTables? Esse é apenas o começo quando falamos de segurança. Existem muitas coisas mais.

Aqui na Alura temos um curso de [**segurança de redes com iptables e pfSense**]!

Nele você vai aprender a configurar um firewall para proteger seu servidor de possíveis ataques e ameaças, como trabalhar com virtualização, proteger sua instância na Amazon EC2 e muito mais.




Nesse artigo vou mostrar como trabalhar com gerenciador de dependência no ecosistema PHP.

Outro dia estava programando um site com PHP e fiz uma página de contato, e precisava de uma maneira que os dados do formulário fossem enviados para o meu e-mail depois de preenchidos.

Depois de uma pesquisa no Google, vi que uma das bibliotecas mais populares é a SwiftMailer, que é um dos componentes do **framework Symfony**.

Entrando no site da **SwiftMailer**, fui para a documentação e vi que a maneira de instalar ela é usando um tal de Composer, com o seguinte comando:

php

No entanto, se eu abrir a linha de comando do meu computador e digitar, ele não encontra esse comando com o nome de “composer”, o que é isso afinal?

# Apresentando o Composer

O Composer é um gerenciador de dependências. Ele cuida de baixar e gerenciar as bibliotecas que o seu programa PHP precisa para executar.

Ele é uma das ferramentas principais do PHP moderno, quase todas as bibliotecas e frameworks mais populares fazem uso dele.

O Composer é diferente de um gerenciador de pacotes como o **APT ou o Yum do Linux**, apesar de ambos tratarem com pacotes o Composer faz isso em um nível de projeto, instalando em um diretório. 

Por padrão o Composer não instala nada em nível global no sistema, mas possibilita essa opção caso necessite.

# Instalação

O Composer é um arquivo PHAR, que contém todo o programa em um único arquivo. Para quem veio do Java, é um equivalente ao Jar. 

Para utilizar o Composer então, só é necessário baixar esse arquivo PHAR que se encontra na página de download do site oficial do Composer.

 Você pode seguir as instruções para o seu sistema operacional específico ou simplesmente baixar o arquivo **PHAR** da versão mais recente que se encontra no final da página.

Legal! agora para executarmos o Composer, basta irmos no diretório onde baixamos ele, abrirmos a linha de comando, que no Mac e no Linux é acessada a partir de um programa chamado Terminal, e no Windows através do PowerShell, e digitar o seguinte comando:

php

E se tiver tudo certinho, serão exibidas os argumentos que o comando do Composer aceita! agora estamos prontos para usá-lo.

imagem

# Criando projetos com o Composer

Um uso bem comum do Composer vai ser para instalar **frameworks como o Symfony, Laravel e o Zend**, e para isso o composer oferece o argumento create-project, o que torna muito fácil a criação de um projeto.

Para criar um projeto Laravel usando o Composer:

php

Para criar um projeto Symfony usando o Composer:

php

Para criar um projeto Zend usando o Composer:

php

Você deve ter se perguntado “mas de onde ele tira estes arquivos?” E o Composer possui um repositório central de pacotes chamado **Packagist**. 

É dele onde o Composer baixa os seus pacotes, e toda a comunidade PHP adotou o Packagist como um lugar padrão para disponibilizar as versões novas das bibliotecas e frameworks.

O Composer também disponibiliza a opção de você utilizar o seu próprio repositório e armazenar o código no Git ao invés do Packagist.

# Instalando bibliotecas com o Composer

Se o seu projeto não usa o Composer ainda, você pode inicializá-lo com o comando init.

php

Ele fará umas perguntas, como qual o nome do seu projeto, se ele é uma biblioteca ou um projeto, e no final, gerará os arquivos necessários para a utilização do Composer! 

É interessante lembrar que frameworks como o Laravel, Symfony, Zend, e Slim já vem com o Composer habilitado.

Quando estamos em um projeto que faz uso do Composer e precisamos instalar uma nova dependência como o SwiftMailer, utilizamos o comando require:

php

Assim que adicionamos uma dependência, o composer cria um arquivo com o nome de composer.json onde ele adiciona todas as dependências dentro de uma propriedade chamada require. 

O Composer possui também uma propriedade chamada require-dev, responsável somente pelas dependências requeridas no ambiente de desenvolvimento, como o phpunit, phpspec, phpcs, que não devem ir para o servidor de produção.

Você pode também, ao invés de utilizar o comando require, alterar esse arquivo composer.json, adicionar a sua dependência e executar o comando:

php

O comando install baixará todas as dependências em uma pasta criada no **mesmo nível do composer.json chamada vendor**. Esta pasta vendor vai conter todos os arquivos baixados pelo Composer, as dependências de fato.

Se precisarmos de uma versão específica de uma dependência, por exemplo, se eu quiser utilizar uma versão do Laravel que tem LTS (Long Term Support), sendo que ela não é a versão mais recente, podemos especificar a versão logo depois do nome da biblioteca:

php

Isso serve tanto para o comando create-project quanto para o require, o asterisco significa que se for lançada uma nova versão que comece com 5.5 (como por exemplo: 5.5.1 ou 5.5.2), ela deve ser utilizada.

Se você usa o controle de versão Git no seu projeto com Composer, é muito importante que você coloque a pasta vendor para ser ignorada no arquivo .gitignore, esta pasta pode ficar bem grande e é uma boa prática não incluir ela no repositório.

Agora imagine o seguinte, especificamos que podemos utilizar todas as versões 5.5.* do Laravel, imagine que utilizamos a versão 5.5.2 para desenvolver na nossa máquina, um tempo se passou e quando o próximo desenvolvedor for clonar o repositório Git para desenvolver e executar o composer install, saiu a versão 5.5.3. 

Isso seria muito ruim, e poderia causar vários tipos de erros no nosso programa.

Para isso, o composer tem um arquivo que chama **composer.lock**, esse arquivo tem a finalidade de travar as dependências em uma versão específica. 

Quando instalamos uma dependência, precisamos com que todos os outros desenvolvedores tenham a mesma versão, independente se a dependência teve uma atualização. 

Com isso, podemos até remover a pasta vendor do nosso projeto e executar o comando composer install, que temos certeza que as dependências baixadas serão as mesmas versões que tínhamos antes. 

Mas se precisarmos atualizar uma versão de dependência, é necessário um outro comando:

php

Este comando vai atualizar todas as dependências do projeto para a versão mais recente disponível no Packagist e reescrever o arquivo composer.lock. 

No entanto, tome cuidado! se o seu programa não estiver preparado para lidar com as versões novas das dependências,ele pode causar erros. 

É possível também fazer o update de uma dependência só adicionando o nome dela depois do comando

php

E se precisarmos remover uma dependência, usamos o comando remove:

php

Acessando arquivos executáveis pelo Composer.

Em uma **aplicação real**, é muito comum precisarmos desenvolver testes para que a nossa aplicação não sofra com regressão de funcionalidade ou bugs que podem ser criados conforme vamos desenvolvendo. 

Uma biblioteca que auxilia com isso no PHP é o PHPUnit, e podemos instalar no nosso projeto utilizando o Composer.

php

Observe o --dev utilizado logo depois do require, isso é desejável nessa situação pois o PHPUnit é uma dependência que só faz sentido enquanto estamos no ambiente de desenvolvimento e ela não deve ser instalada no ambiente de produção. 

No ambiente de produção, o comando a ser digitado para instalar as dependências é:

php

O que instalará somente as dependências que podem ser instaladas em um ambiente de produção, excluindo as dependências de desenvolvimento e deixando o ambiente de produção mais enxuto.

Depois de instalarmos dependências que possuem arquivos executáveis instaladas pelo Composer, elas ficam acessíveis no diretório vendor dentro da pasta bin. 

Para executarmos o PHPUnit, faremos o seguinte:

php

imagem

Gostou deste post? você pode descobrir mais sobre o Composer olhando a [documentação oficial] e se você quiser conhecer mais sobre desenvolvimento de PHP moderno, acesse os [**cursos de PHP da Alura**].




É por meio de uma comunicação clara com o cliente que você terá ferramentas para fazer um bom trabalho, construir um bom portfólio, [**atrair freelas**] e ganhar mais experiência e [**credibilidade no mercado**].

Mas qual a diferença entre um briefing para design e um briefing para publicidade? Apesar de serem setores bem próximos um do outro, essas áreas possuem especificidades. Está preparado para conhecê-las? Vamos lá!

## Briefing para design

O briefing de design delimita os detalhes de um projeto que tem o papel de realizar uma comunicação estética específica. O design é uma ferramenta de resolução de problemas e é isso que faz com que o briefing de design seja tão importante. É ele que vai garantir que a mensagem correta seja passada e que o problema seja, de fato, resolvido.

Você, como designer, sabe bem que o nível de envolvimento do profissional dessa área com seus projetos, precisa ser grande. Afinal, é um trabalho de empatia. É preciso se colocar na pele do seu cliente e saber que, para pensar em soluções, você também precisa se colocar na pele do público-alvo.

Isso explica a importância do design na estratégia do cliente. Mais do que um simples prestador de serviços, o designer é um verdadeiro parceiro. Designer e cliente têm papéis relevantes para o sucesso do projeto.

Veja a seguir quais sãos os itens técnicos de um bom briefing de design e a importância de cada um deles.

### Questões básicas

- Informações base sobre a empresa contratante;
- Posicionamento de mercado da empresa;
- Informações sobre o consumidor ideal da empresa;
- Informações sobre concorrentes.

Essas informações são o ponto de partida de qualquer projeto de design. Para desenvolver uma arte, você precisa saber transmitir o DNA da empresa em sua criação, atingir o público correto, garantir que a peça esteja alinhada com o mercado da marca e, ainda, com vantagem competitiva em relação aos seus concorrentes.

Caso seu cliente envie qualquer uma dessas informações de maneira muito rasa, encoraje sempre que ele se aprofunde e atualize todos os aspectos. Dessa forma, será possível realizar um projeto coeso com o histórico da empresa.

### Detalhes estratégicos

- Especificações sobre a estratégia da qual o projeto de design fará parte;
- Os objetivos do projeto dentro da estratégia;
- Os meios a serem usados para alcançar os objetivos.

O escopo do projeto é o item protagonista do briefing como um todo. Sua definição deve ser feita com cuidado, pois todos as próximas etapas do projeto vão depender dele.

### Tópicos práticos

- Orçamento, custos e materiais;
- Plano de ação com prazos e prioridades;
- Definição dos responsáveis por cada etapa do plano;
- Identificação e prevenção de possíveis riscos.

É importante que o orçamento seja especificado pela empresa, para que o designer possa adequar o projeto à realidade. Isso nunca deve influenciar na [**qualidade do seu trabalho**] como designer — todo job deve ser feito da melhor maneira possível.

A partir disso, é possível definir prazos realistas, que atendam às necessidades do cliente. Você pode precisar priorizar jobs mais complexos e de maior custo, por exemplo, sem pecar na qualidade de um projeto mais simples. Por isso, é importante alinhar essas questões desde o princípio, para consolidar uma boa parceria com todos os tipos de cliente.

Além disso, um bom planejamento de prazos evita que o processo de produção de peças gráficas, por exemplo, sejam um empecilho. Leve em conta que alguns tipos de arte dependem de testes para serem aprovadas.

### Informações referenciais

- Referências;
- Especificações;
- Objeções.

Seu briefing deve possuir referências muito bem selecionadas e essa pesquisa deve ser feita, principalmente, pelo seu cliente. Ainda que você apresente referências como proposta, as referências do seu cliente são a melhor maneira de ele transmitir a ideia central do que espera do projeto. Afinal, nem sempre descrições por escrito são o suficiente.

Você deve solicitar tanto referências de projetos já realizados pela empresa, quanto referências externas que possuam algum aspecto do conceito do projeto a ser desenvolvido. Qualquer detalhe específico que deva ser especialmente evitado ou que seja pré-requisito para a aprovação do projeto, como algum elemento gráfico ou cartela de cores, deve ser explicitado no briefing de design também.

## Briefing para publicidade

O briefing para publicidade deve ser um guia para toda a estruturação e realização de uma estratégia de marketing de uma empresa. Peças de design, como dissemos, entram como uma ferramenta dessa estratégia.

Já deu para perceber que o briefing para publicidade precisará de informações adicionais, se comparado ao briefing para design. Veja a seguir quais seriam as principais delas.

### Questões básicas

Todas as informações básicas que citamos como necessárias no briefing para design também entram aqui. Porém, nesse caso, é preciso aprofundar mais. Solicite que seu cliente aborde questões sobre a história da empresa, sua fundação, sócios, conflitos, sucessos e mudanças.

A empresa também deve fornecer mais aspectos subjetivos e conceituais da marca. Isso deve ser levado em conta também na etapa de detalhes referenciais.

### Detalhes estratégicos

**Ao solicitar uma delimitação de público-alvo, busque saber quem é o cliente ideal. Quais são os seus problemas e quais são as soluções que a marca pretende solucionar por meio de seus produtos?** As respostas a essas perguntas não devem, de forma alguma, ser generalizadas.

Aqui, devem entrar todas as pesquisas de mercado recentes realizadas pela empresa e que tenham envolvido a participação de clientes reais. Dados de mídias sociais e informações valiosas dadas pelo time de vendas da empresa, por exemplo, também são boas fontes de informação.

Além disso, os concorrentes devem ser avaliados de acordo com exemplos de [**benchmaking**] que possam ser seguidos a aprimorados. Garanta que o seu cliente seja imparcial e verdadeiro sobre essas questões.

### Tópicos práticos

Esses são os aspectos que menos mudam de um tipo de briefing para o outro. Budgets, prazos e prioridades devem ser colocados na ponta do lápis de forma bastante realista, para evitar surpresas ao longo da realização do cronograma de ação.

### Informações referenciais

No caso do briefing para publicidade, as referências solicitadas ao cliente devem se estender um pouco mais. O padrão de publicidade da empresa ao longo dos anos deve ser levado em conta e revisado com cuidado, para que qualquer inovação seja feita de forma consciente e assertiva.

Agora que você já entendeu as diferenças entre briefing de design e briefing de publicidade, compartilhe esse post em suas redes sociais para que seus colegas também saibam essas informações valiosas!



Existe um programa chamado [**Samba**] que consegue realizar o compartilhamento de arquivos e impressoras entre **redes Linux e Windows.** Realiza isso por meio do protocolo [**SMB**].

imagem 


De conhecimento do Samba, quando uma empresa me contratou para resolver um problema com seu servidor de arquivos. o cenário era o seguinte: 

Toda a rede da empresa utiliza Linux, desde os servidores até as máquinas clientes. Contudo um sócio começou a trabalhar alguns dias da semana na empresa com seu notebook particular, que utiliza Windows como sistema operacional.

Ele precisa acessar alguns arquivos do servidor para realizar seu trabalho. Então vamos conectá-lo na rede e falar para tentar acessar o servidor via seu endereço:

imagem usados são diferentes. Logo lembrei do **Samba.**

Enquanto redes Windows utilizam o [**NetBIOS**] (**Network Basic Input/Output System**) para compartilhar os arquivos na rede, sistemas Linux utilizam o [**NFS**] (**Network File System**). Esses dois protocolos, por padrão, não conseguem se comunicar.
Sistemas Windows, por padrão, não conseguem se comunicar com sistemas Linux.

Esse protocolo permite a comunicação e compartilhamento de arquivos e impressoras na rede.

Mas, antes de mais nada, precisamos adicionar o samba em nossa máquina!

## Instalando o Samba

Para instalar o Samba basta abrir o terminal e falar para seu gerenciador de pacotes instalá-lo. No meu caso, o sistema do servidor é um Linux [**CentOs**] que utiliza o [**YUM**]. Portanto:

`yum install samba`

imagem do computador.

Podemos dizer isso para o Samba, especificando qual o grupo de trabalho do compartilhamento.

Mas temos que configurar esse grupo de trabalho em todas as pastas que forem compartilhadas?

Não, esses tipos de configurações globais podemos configurá-las uma única vez. Para isso abrimos uma seção global (`[global]`).

Neste caso, o nome do grupo de trabalho será o caminho do servidor no domínio:

sql

Como as máquinas Windows saberão quem é o servidor rede? Ele precisa de um nome certo?

O Windows utiliza uma [**API**] chamada [**NetBIOS**] para nomear as máquinas em sua rede. Como queremos dizer o nome do servidor, podemos usar o `netbios name`:

sql

Acabamos nossas configurações globais. Hum… mas ainda não especificamos qual será o compartilhamento… Como podemos fazer isso?

Para especificar o compartilhamento, basta abrir outra seção, como abrimos em `[global]` , só que agora com o nome do compartilhamento.

No meu caso, eu quero compartilhar a pasta pública, logo, vou chamar meu compartilhamento assim.

sql 

Mas não basta dizer qual o nome do compartilhamento, temos que dizer onde o diretório compartilhado se encontra no servidor. Ou seja, precisamos dizer o caminho (`path`) até a pasta.

Neste caso, a pasta se chama `publica`, e está dentro de outra pasta chamada `compartilhamento`:

sql

E como o computador Windows conseguirá achar essa pasta? Precisamos falar que esse diretório poderá ser encontrado (`browseable`):

sql

O sócio da empresa precisa salvar e alterar alguns arquivos que estão contidos nesta pasta. Logo ela precisa escrever (`writable`) essas mudanças, isto é, salvá-las de fato.

Ou seja, se ela consegue escrever essas informações, o diretório não é apenas para a leitura dos arquivos (`read only`).

sql

Configurações terminadas! Mas como o Samba vai saber que esta é a configuração para ser utilizada?

Nós podemos reiniciar o serviços que fazem parte do Samba, dessa forma ele já passa a usar a nossa configuração. O Samba usa dois serviços para realizar o compartilhamento. Um já vimos, é o **smb**, o outro é chamado de **[nmb]**.

O nmb é o serviço que entende as requisições feitas pela API NetBIOS.

Então vamos falar para o sistema (`systemctl`) reiniciar (`restart`) esses dois serviços (`smb.service` e `nmb.service`):

**`systemctl restart smb.service`**

**`systemctl restart nmb.service`**

imagem, que será permanente (`--permanent`) na zona pública (`--zone=public`) que adiciona o serviço do Samba (–add-service=samba):

**`firewall-cmd --permanent --zone=public --add-service=samba`**

Feito isso, temos que reiniciar nosso firewall:

**`firewall-cmd --reload`**

imagem:

`\\192.168.0.10`

imagem , do nosso serviço do tipo (`-t`) compartilhamento utilizando o Samba (`samba_share_t`) na nossa pasta pública (`/compartilhamento/publica`):

`chcon -t samba_share_t /compartilhamento/publica`

imagem, poderá receber membros fora do domínio, desde que estejam autenticados.

Bem para isso podemos usar a opção `Bad User`:

sql

A opção `Bad User` permite que um usuário acesse o compartilhamento depois de realizar uma autenticação.

Mas como o Samba realizará essa autenticação?

Nós podemos adicionar esse novo usuário no sistema e no Samba. Assim, quando o Samba exigir uma autenticação esse novo usuário poderá ser usado.

Vamos adicionar esse novo usuário no sistema (`adduser`). No meu caso, vou chamá-lo de **user**.

`adduser user`

imagem ele adiciona um novo usuário já cadastrado no sistema.

Assim, podemos adicionar o usuário que acabamos de inserir.

`smbpasswd -a user`

imagem com o parâmetro `-l` (lista longa).

`ls -l /compartilhamento`

imagem, as demais nos mostram as permissões. Essas são divididas em três partes, as do usuário dono, as do grupo dono e as dos demais usuários.

Cada letra significa um tipo de permissão:

- **r** → Leitura (read);
- **w →** Escrita (write);
- **x →** Execução (execute).

Caso não tenha essa permissão é apresentado como um traço (`-`) no lugar da letra.

Se analisarmos essas informações vamos perceber que nem o grupo dono do arquivo, ou os demais usuários conseguem escrever na pasta, isto é, criar diretórios ou arquivos. Para resolver esse problema, podemos utilizar um programa chamado **`chmod`(change mode)**.

Com esse programa, podemos falar que o usuário dono tem todas as permissões, escrever, ler e executar (u=rwx), o mesmo para o grupo dono (`g=rwx`) e para os outros usuários. (`o=rwx`):

imagem para todos os usuários, até a usuários desconhecidos no sistema. Por isso, por questões de segurança esse tipo de configurações devem ser evitadas.

Neste caso, nós utilizamos o `chmod` com suas opções simbólicas (`rwx`), porém poderíamos ter utilizado o modo octal (`0`, `1`, `2`, `4`).

Para evitar esse tipo de configuração, pode-se criar um grupo e colocá-lo como grupo dono da pasta compartilhada.

Esse exemplo é apenas um simples exemplo de compartilhamento. Podemos fazer muito mais como:

- Restringir o acesso a um diretório ou arquivo a um usuário ou grupo de usuários específicos;
- Criar pastas únicas para cada usuário no sistema;
- Bloquear alguns tipos de arquivos de serem salvos no sistema.

Além de compartilhar arquivos e diretórios, o Samba consegue fazer o papel de [**Active Directory**] nas redes Windows.

Veja que realizamos essa configuração como superusuário (**root**), logo, cuidado!

Neste caso, nossa pasta está apenas no servidor, porém conseguimos sincronizá-la com algum serviço na nuvem. Dessa forma podemos sempre acessar seus arquivos, ou pela rede local, ou pela nuvem.

## Compartilhando com todos os sistemas

Nosso problema era o compartilhamento de arquivos entre diferentes sistemas operacionais (Windows e Linux). Entendendo que o problema são os diferentes protocolos usados por esses sistemas, encontramos como solução o Samba.

Com ele conseguimos compartilhar arquivos e diretórios, além de impressoras. Isso porque o Samba utiliza o protocolo SMB para realizar o compartilhamento. Dessa forma, as máquinas Windows conseguem acessar os diretórios compartilhados no Linux.

Gosta de administração de servidores? Essa é uma parte muito importante se você quiser trabalhar como DevOps. Aqui na Alura temos uma [**formação DevOps**]. Nela você aprenderá sobre Linux, Git, Vagrant, entrega contínua e sobre cloud com a Amazon EC2.




imagem

Nos dias de hoje é cada vez mais comum vermos brasileiros morando e trabalhando no exterior. Essa emigração pode ter diversas razões, como intercâmbio para aprender uma língua, ser enviado pela empresa, ou mesmo simplesmente o desejo de viver novas experiências.

Porém, ao começar a pensar sobre isso é comum surgirem muitas dúvidas: "**Como criar o meu currículo?**", "**Quais idiomas precisarei saber?**", "**Vale a pena morar fora?**", entre outras. Neste artigo vamos dar cinco dicas (e mais uma bonus) que certamente te ajudarão muito nesse processo.

# 1 - Saiba muito bem porquê você quer ir

É comum ouvir histórias de brasileiros que se mudaram para um outro país e não muito tempo depois voltaram ao Brasil decepcionados.

Para que isso não ocorra com você, **é essencial entender bem as razões que te fizeram tomar essa decisão**.

Seria melhores oportunidades de trabalho para você? Vale ponderar que você vai estar longe de boa parte da sua família e amigos. Seria o desejo de adquirir um novo idioma? Considere também as dificuldades que o fato de não saber se comunicar muito bem pode trazer. Tudo isso tem que estar muito claro para você.

Algo que ajuda nesse processo é fazer uma listinha dos pontos positivos e negativos, e analisá-los profundamente um a um. Se no final dessa análise você ainda achar que vale a pena, será menor a probabilidade de que você se decepcione ao encontrar essas dificuldades.

# 2 - Pesquise o máximo possível sobre o país de destino

Hoje em dia é fácil diminuir consideravelmente as surpresas negativas que um país novo pode oferecer. Existem milhares de sites, blogs e canais de Youtube de **brasileiros que já saíram do país no passado** e hoje contam como é a vida no país, dão dicas de como lidar com a burocracia e facilitam muito a vida dos futuros expats.

Está pensando em ir pra Irlanda? O site [E-Dublin] tem todas as dicas que você precisa. 

Quer morar na Holanda? O site [Ducs Amsterdam] vai te ajudar a se preparar para essa aventura.

Assim como todos os outros que você pode encontrar por aí. Largue essa preguiça e pesquise bastante, assim a sua vida será muito mais fácil ao chegar no novo país.

# 3 - Aprenda pelo menos um pouco do idioma antes de ir

Todos sabem que, em muitos casos, o inglês funciona internacionalmente como a língua franca dos negócios. Por isso, **é essencial [aprender inglês] a um bom nível para ter uma boa posição no exterior**.

Porém, se o seu destino for um país cuja língua oficial não seja o inglês, vale muito a pena aprender também o idioma local, seja para tornar o seu currículo mais atrativo para recrutadores de lá, seja para ter menos dificuldades ao chegar no novo país.

Isso é algo que também vale bastante a pena pesquisar antes de se jogar de cabeça em uma aventura tão grande. Existem países como a Holanda, Suécia, Finlândia ou Singapura nos quais o inglês pode bastar para interações do dia a dia em restaurantes ou escritórios governamentais; porém, em lugares como Espanha, Itália, França ou Alemanha, isso muitas vezes não se aplicará. Por isso, a recomendação é **aprender pelo menos o básico do idioma do país** antes de chegar ao mesmo.

# 4 - Pesquise sobre o mercado de trabalho na sua área no país

Além de pesquisar sobre a parte burocrática e cultural do país, conforme mencionado no ponto #2, é muito importante também buscar mais sobre como funciona o mercado na sua área por lá.

Existem países que estão saturados com determinados profissionais; já em outros existe escassez desses mesmos - um exemplo são profissionais TI e programadores, que são escassos na maioria dos países ao redor do mundo, mas não na Finlândia.

Em outro exemplo, existem países nos quais o mercado está aquecido para tecnologias como Java; já outros que, no geral, buscam mais [programadores Python].

O podcast [Carreira Sem Fronteiras] é uma excelente fonte para buscar mais sobre isso, que toda semana **entrevista brasileiros que foram tentar a vida profissional em diferentes países ao redor do mundo**.

Existem outros sites que também dão dicas específicas, como o [Skills Panorama] da União Europeia, que destaca os setores que possuem maior escassez de profissionais ao redor da Europa.

# 5 - Otimize o seu currículo

Depois de pesquisar mais sobre todos os pontos acima, vai faltar a coisa mais importante: criar o seu novo currículo.

Se você estiver aplicando para uma vaga em uma empresa internacional, é comum que você tenha que **criar um currículo em inglês**. A Alura tem um curso fantástico de [como criar o seu currículo em inglês] para se aplicar a vagas no exterior - que também vai te ensinar como se comportar durante o processo, como funcionam as entrevistas, além de outros fatores que irão te ajudar nessa meta.

Outra coisa importantíssima e normalmente requerida é a famosa **Cover Letter**. Não sabe o que é? Esse artigo explica para que serve e [como criar a sua própria cover letter em inglês].

Vale também ressaltar que, em determinados países, um currículo e cover letter na língua dos mesmos será necessário. Todos esses dados ficarão mais claros depois da sua pesquisa sobre o mercado, mencionada anteriormente.

# Dica bônus - Conheça e demonstre interesse pela empresa

Não basta fazer tudo acima e simplesmente enviar currículos a esmo. Uma dica de ouro é **pesquisar também um pouco mais a fundo sobre as empresas para as quais você se aplicar**. Onde ficam os escritórios da empresa? Que tecnologias usam? Qual é a cultura da mesma?

Isso é algo que pode ser usado ao seu favor tanto na Cover Letter quanto em uma entrevista com seus futuros chefes, que certamente ficarão deliciados em conversar com um candidato que sabe do que está falando e conhece as tecnologias e cultura vigentes na empresa.

# Conclusão

Sair do país é definitivamente um grande desafio para qualquer pessoa. Porém, com essas dicas visamos tornar esse processo de procura de emprego e de adaptação ao novo país mais fáceis para você que se interessa por isso.

Boa sorte na sua busca! :)



imagem 

Estou com um cliente novo na minha empresa e iremos editar seus vídeos para serem publicados no Youtube. O pedido dele é que o resultado final do vídeo tenha entre 5 a 7 minutos no máximo.

Este foram os arquivos brutos (sem edição alguma) que recebemos e iremos utilizar na edição:

imagem, realiza a sincronização de áudio, caso tenha um arquivo de áudio que foi gravado separado do vídeo original, entre outras coisas.

Nosso primeiro passo é arrumar os dois arquivos de áudio (chamadas de track ou faixa de áudio), **sincronizá-las**, e decidir qual iremos utilizar, pois as duas são sobre o mesmo vídeo.

Mas uma foi gravado pela própria câmera (que normalmente não é muito boa, pois o foco da câmera é a imagem) e a outra em um gravador de áudio específico, que tem uma qualidade muito superior.

## Sincronizando os áudios do projeto

Agora que os arquivos já foram adicionados na timeline, conseguimos reparar que o áudio que gravamos separados está um pouco atrasado do áudio original em relação ao que foi gravado pela câmera:

<iframe src="https://streamable.com/s/4cc8x/eazstb" frameborder="0" width="100%" height="100%" allowfullscreen style="width:100%;height:100%;position:absolute;left:0px;top:0px;overflow:hidden;"></iframe>

Elas estão fora de sincronia e, como só vamos utilizar a segunda faixa (que é o áudio do gravador específico e, consequentemente, um áudio de melhor qualidade), podemos sincronizar ambos áudios e, após isso, descartar o áudio original que não será mais necessário.

Podemos utilizar uma funcionalidade já existente no Adobe Premiere, que é a opção [**sincronizar**], uma ferramenta precisa e que funciona na maior parte das vezes.

> Mas tome cuidado, o recomendável para ter uma melhor apuração com essa ferramenta, é utilizar no máximo duas faixas de áudio por vez para sincronizar. Mais do que isso pode ocorrer falhas ou até mesmo não funcionar.

Para aplicar a sincronização, podemos selecionar as duas faixas e apertar com o botão direito, escolher a opção de sincronizar. E o Premiere faz o trabalho para gente.

<iframe src="https://giphy.com/embed/4cUCFvwICarHq" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen></iframe>

[via GIPHY]

Agora temos ambos áudios sincronizados com os vídeos:

imagem e arrastar para a layer de cima e tirar esse espaço em branco, facilitando na hora de visualizar com o que estamos trabalhando.

imagem com a ferramenta de corte **C** selecionada. O mesmo vale para selecionar mais de um pedaço que foi recortado. Com a ferramenta de seleção **V** , segura o **CTRL** e selecione os pedaços que quiser.

Após fazer todo esse recorte e selecionar as partes em branco, podemos dar um **DELETE** .

Mas ficaram vários espaços em branco….E agora?!

imagem. Ou simplesmente clicar na parte vazia e dar um **delete** .

Podemos fazer isso para todo o restante do arquivo.

> Mas ainda há espaços "em brancos", pedaços que não contém nenhum conteúdo relevante, que podem ser retirados, por que não fizemos isso?

imagem

E se você tiver interesse em aprender ainda mais sobre os [**processos de edição de um vídeo**], com o pacote Adobe (After Effects, Premiere), você pode aprender com os cursos da Alura!






imagem 

Recentemente eu desenvolvi uma aplicação para descobrir qual seria o novo salário de um funcionário baseado na porcentagem de aumento que ele recebeu.

js

A resposta para o novo salário foi `3001500`! Esse resultado aconteceu porque os dados vieram de um formulário HTML e, em razão disso, a variável `salario` é uma **string**.

Apesar de o JavaScript ser uma linguagem fracamente tipada e conseguir fazer operações de subtração, divisão e multiplicação envolvendo strings, ele não entende uma operação de soma envolvendo strings. O que ele faz é **concatenar**, ou seja ele junta essas duas strings.

## As funções parseInt() e parseFloat()

Para que a lógica da aplicação funcione, a variável `salario` precisa ser transformada em um número.

Em JavaScript temos uma função chamada **parseInt()**, que vai, em outras palavras, analisar a string e retornar um número inteiro. Agora, com o uso da função, o código da aplicação ficou assim:

js 

Como cálculos envolvendo salário geralmente utilizam representação de pontos flutuantes, isto é, contém casas decimais, podemos utilizar a função **parseFloat()** que vai justamente analisar a string e retornar um número com representação decimal, ou seja, com ponto flutuante.

js 

## Conclusão

Podemos perceber que dependendo do tipo de entrada que a função recebe ela pode mudar de comportamento e afetar a nossa lógica dentro do sistema.

Tendo em vista que em algumas vezes iremos capturar dados dos usuários para realizar alguma operação de adição, temos que lembrar que em muitas dessas vezes esses inputs virão em formato de string.

Portanto, para não correr o risco de acabar concatenando esses dados ao invés de realizar uma soma, é sempre importante lembrar de utilizar as funções `parseInt()` ou `parseFloat()` dependendo do tipo de número que será utilizado para realizar as operações.

Se ficou interessado em como o JavaScript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação em desenvolvimento JavaScript**]. Nela, você verá como programar em JavaScript, utilizar expressões regulares, entre outras coisas.




Estou desenvolvendo um app para cadastrar todos os cursos do Alura que eu fiz ou estou fazendo, para que eu possa verificar quais são os cursos que eu já terminei ou se ainda precisa finalizar. Então inicialmente eu criei uma classe para representar meus cursos:

java

E um **`ENUM`** pra representar o estado atual do curso, ou seja, se ele está finalizado ou se está sendo feito:

java
## Adicionando a ListView no layout

Como fazemos para criar a nossa tela? Precisamos criar um **`XML`** para representá-la, certo? Então vamos criar esse `XML` na pasta `res/layout` com o nome `activity_lista_de_cursos.xml`:

xml

Muito bom, temos o nosso **layout**, porém precisamos associar esse layout a uma **activity**, como podemos fazer isso?

Bom, primeiro nós precisamos de uma activity, então vamos criar a `ListaDeCursosActivity` que estende a classe `Activity` ou uma de suas filhas, nesse caso, usarei a classe `AppCompatActivity` por questão de compatibilidade:

java

## Buscando a referência da lista

Agora que temos a nossa activity, podemos implementar o método `onCreate()` que irá **settar** o nosso layout e vai pegar a referência da `ListView`:

java

Settamos o nosso layout e pegamos a referência para a nossa `ListView` e agora nós precisamos pegar a nossa lista de cursos:

java

Temos a nossa `List` e a nossa `ListView`, porém, não existe um método da classe `ListView` capaz de adicionar uma `List`, uma pena... E agora? O que podemos fazer?

## Criando o Adapter da lista

No **Android**, existe um especialista em lidar com listas chamado **adapter** e, para nossa felicidade, a `ListView` consegue adicionar esse adapter! E como podemos criar um adapter? Por meio da **classe `ArrayAdapter`**:

java

Ops, há um detalhe na instância do `ArrayAdapter`, todos os construtores dele exigem pelo menos um **`Context`** que será a nossa activity e um `int` que será o recurso que representará cada item da lista.

### Inserindo um layout simples para cada item da lista

O Android disponibiliza para nós alguns recursos para utilizarmos, nesse caso, utilizaremos o recurso `android.R.layout.simple_list_item_1` que é uma representação bem básica para cada item da lista:

java

## Adicionando o Adapter da ListView

Certo, instanciamos o nosso `ArrayAdapter` só que ainda não informamos em momento algum que queremos que ele adapte a nossa lista de cursos! Como podemos passar a nossa lista para ele?

O `ArrayAdapter` possui diversos construtores e, para a nossa alegria, um deles recebe uma `List` que é justamente o que precisamos:

java

Certo, criamos nosso adapter, o que precisamos fazer agora? De alguma forma, nós precisamos fazer com o que a nossa `ListView` utilize esse adapter, mas como podemos fazer isso?

Sabemos que a classse `ListView` não é capaz de adicionar uma `List`, porém ela pode settar um adapter por meio do método `setAdapter()`:

java

Vamos testar a nossa app:

imagem`**?

Vamos então implementar o nosso `toString()` para que seja impresso as informações de um curso:

java

Agora se testamos a nossa app novamente:

imagem

## Resumo

Vimos que, para criarmos uma lista no android nós precisamos definir uma `ListView` no nosso `XML` que representará a nossa tela e referenciá-la na nossa activity.

Além disso, vimos que apenas a `ListView` não é o suficiente para que possamos adicionarmos a nossa `List` e por isso precisamos de um adapter que é especialista em lidar com `List` e informar para a `ListView` quais serão os valores de cada item da lista.

Vimos também que, quando passamos uma lista de objetos nossos, como por exemplo a classe `Curso`, por padrão será impresso o próprio objeto, ou seja, o `toString()` padrão e, se quisermos uma informação diferente, precisamos implementá-lo de acordo com a nossa necessidade.

## Código fonte

Caso tiver dúvidas ou simplesmente quiser consultar o código fonte do projeto utilizado como exemplo, fique à vontade de dar uma olhada no [**github**].

Quer aprender mais sobre Android? Que tal dar uma olhada na [**formação de Android**]? Neles ensinamos desde os conceitos mais básicos a avançados para que você construa a sua primeira App e inicie sua carreira como desenvolvedor Android!




Provavelmente não, mas saiba que houve um tempo em que isso acontecia. No lugar de notebooks e smartphones, as pessoas usavam enormes computadores e pen-drives do tamanho de um mouse pad. **O avanço tecnológico mudou a maneira como nós nos relacionamos com a tecnologia.**

Vivemos na era mobile e esse novo tempo transformou a experiência que cada uma das pessoas tem com as marcas e os produtos. O e-commerce que funcionava corretamente em um desktop, talvez já não seja mais capaz de ser acessado perfeitamente por meio de um dispositivo móvel, como o smartphone e o tablet. 

A experiência do consumidor ao usar produtos e serviços mudou e é por isso que precisamos conversar sobre design e UX.

Vamos juntos saber mais sobre essa relação?

## 1\. O papel do UX para o consumidor

UX é uma sigla, em inglês, que significa User Experience (experiência do usuário, em português). Trata-se da experiência que cada consumidor tem ao usar produtos e serviços. O papel do UX, no contexto da atualidade, é tão importante que até mesmo os profissionais de marketing estão se esforçando para entender o seu funcionamento.

**Isso ocorre porque o UX está diretamente relacionado tanto com as questões funcionais e práticas quanto o lado emocional da experiência.**

Antigamente, na hora de colocar um site na internet, os designers pensavam naquelas pessoas que precisavam sentar na frente de um computador, com mouse e teclado. A partir do momento em que a população passou a acessar conteúdo por meio de smartphones e tablets, esse pensamento mudou. Ao desplugar o usuário da frente do computador, o contexto passa a ser outro.

Agora, mais do que nunca, precisamos fazer alguns questionamentos em relação a quem está do outro lado da tela:

- Quem é essa pessoa?
- O que ela quer?
- Será que ela conseguiu resolver o problema dela?
- Se ela não resolveu, será que o problema está na navegação do site?
- Como foi a experiência de compra dela?
- Ela usaria o produto ou serviço novamente?
- Onde ela se encontra?
- Ela tem tempo para procurar bastante no site?

A experiência do usuário pode, muitas vezes, ser a diferença entre o sucesso e o fracasso do seu projeto. Na era mobile, além de considerar os questionamentos feitos acima, é necessário levar em conta todas as tecnologias que ajudam o usuário a ter uma experiência melhor. 

**Estamos nos referindo a pontos como geolocalização, acelerômetro, bluetooth, câmera e até notificações. O contexto entre a tecnologia e as informações de cada usuário leva você a criar boas experiências.**

Imagine-se em casa, deitado no sofá e com uma tremenda vontade de comer uma pizza. Você provavelmente vai pegar o smartphone, abrir algum aplicativo de delivery e selecionar a pizzaria que mais prendeu sua atenção. Ao efetuar o pagamento e o estabelecimento realizar a entrega da pizza, sua necessidade foi suprida. A partir do momento em que a situação é diferente, sua necessidade passa a ser outra também.

Agora imagine-se na rua, dirigindo e com uma tremenda vontade de comer pizza. Ao invés de efetuar o pedido pelo smartphone, sua necessidade passa a ser a de encontrar o endereço da pizzaria. 

Você busca no Google e encontra o site do estabelecimento, mas percebe que ele está em Flash, uma tecnologia antiga que não funciona nos navegadores dos smartphones e tablets. Nós sabemos que será impossível acessá-lo a partir do seu smartphone, portanto a sua necessidade não foi suprida. Percebeu a diferença?

Se, atualmente, há uma gama maior de dispositivos que acessam sites na internet, por que não há também uma gama maior de otimização para que cada um deles seja visto da maneira correta? Isso significa que um site que pode ser acessado por um smartphone precisa estar otimizado para mobile. Entre outras coisas, esse site precisa carregar muito rápido e estar de acordo com a média de velocidade de um telefone celular.

Coloque-se no lugar do consumidor. Você teria a paciência de esperar longos segundos (até minutos) para que uma página carregue no seu smartphone apenas para ver as ofertas de uma loja virtual? Com certeza não! 

Os consumidores, assim como você, preferem comprar produtos em lojas online que são fáceis de acessar, de navegar. Ao invés de mais problemas, como esperar, os consumidores desejam soluções que entendam o contexto no qual estão inseridos.

Enquanto uma marca ainda insiste em não se modernizar, suas concorrentes aproveitam a brecha para crescerem cada vez mais. Antes, para encontrar um concorrente, o consumidor precisava ir atrás, sair de casa e até pedir indicações para amigos. Hoje basta dar um ou dois cliques no mouse. O UX design significa o meio mais fácil que o cliente tem à disposição para simplificar seu dia e resolver problemas.

## 2\. Diferenças entre UI e UX design

É muito comum confundir UI com UX design. A incrível quantidade de nomenclaturas e termos existentes atualmente para definir as áreas que compõem o design, faz com que tenhamos certa dificuldade na hora de determinar cada coisa.

Em primeiro lugar, precisamos frisar que sim, existem diferenças entre os dois. Em segundo lugar, é importante ressaltar que eles se complementam. Por fim, em terceiro lugar, eles são fundamentais para um bom design.

### O que é UI design?

UI design, também conhecido como User Interface design, é um termo em inglês que significa Design de Interface de Usuário. Esse design é o meio pelo qual o consumidor ou o usuário interage e controla um software, um aplicativo ou até mesmo um dispositivo. O controle pode ser feito por meio de botões, menus e qualquer outro elemento que permita a interação entre o usuário e o software, o aplicativo ou dispositivo.

O projeto que tem como base um bom UI design consegue antecipar as necessidades do usuário, garantindo que a interface contenha todos os elementos que forneçam um acesso fácil e uma utilização intuitiva. 

É o que conhecemos como user-friendly, ou seja, uma experiência amigável e que não cause frustração ao usuário. Lembra do exemplo do site da pizzaria em flash? É isso! Se ele fosse mobile, com botões grandes e fáceis de identificar, seria user-friendly.

### Mais sobre a diferença entre eles

A experiência do usuário é uma forma de englobar todos os aspectos que envolvem a interação dele com uma empresa, marca, produto ou serviço. Ela é a responsável por buscar e fornecer as melhores maneiras de atender as necessidades desse usuário, deixando-o satisfeito com todos os processos. 

Uma verdadeira experiência do usuário vai além do fornecimento do que os clientes dizem querer. Ela deve proporcionar também o sentimento de realização.

Isso significa que, por meio da experiência do usuário, o consumidor deve se sentir feliz, contente por ter conseguido adquirir um produto ou serviço. Por isso que é necessário que o designer estude e avalie o comportamento dos usuários em relação a um sistema, site ou aplicativo.

Ele precisa levar em consideração uma série de aspectos, como a facilidade de uso, a percepção de valor em relação ao ambiente em que se está navegando, a utilidade, a eficiência na execução das tarefas e todas as outras características que dão os indícios necessários para que se encontre a melhor solução para os problemas dele.

## 3\. Impactos na experiência do usuário

Conforme vimos anteriormente, o [**UX design**] revoluciona a maneira como os consumidores são impactados por qualquer meio ou peça de comunicação. 

Antigamente, a agência de comunicação era a responsável por determinar os rumos da criação, com base em seus estudos, crenças e experiência. Além disso, o cliente tinha um poder de decisão muito forte, direcionando as peças e o meio para aquilo que ele acreditava ser o melhor.

O cenário, agora, é outro, ok? Agências de comunicação, profissionais e clientes que ainda têm esse pensamento atrasado, precisam urgentemente de uma reciclagem de ideias. A evolução das metodologias e dos materiais de comunicação foi imprescindível.

Hoje, existem consumidores conectados que buscam por simplicidade, produtos e soluções personalizadas, rapidez e respostas que rompem as barreiras da globalização.

Esses usuários conectados fizeram com que o design passasse por uma transformação, precisando ganhar:

- [estratégias omnichannel];
- sites otimizados para diferentes dispositivos;
- conteúdo que resolva problemas; e
- capacidade de medir resultados.

Os quatro pontos listados acima significam uma melhoria na experiência dos usuários. Quando eles obtêm uma experiência positiva, o resultado pode ser um grande impulso nas vendas. O raciocínio é simples: em uma loja física, você se sente à vontade para adquirir produtos que estão trancados em vitrines ao mesmo tempo em que nenhum vendedor se encontra por perto para lhe ajudar?

### A mesma linguagem

Você explicaria para uma senhora de 70 anos como funciona o aplicativo Instagram da mesma maneira que faria com o seu colega de classe? Não, né?! O primeiro impacto do UX design se dá quando a sua proposta de comunicação fala a mesma linguagem que o seu público-alvo utiliza. É dessa forma que você passa a conhecê-lo melhor e descobre quais são os seus problemas e necessidades.

### Estratégia digital

A partir do momento em que você conhece o seu target e sabe quais são os seus problemas e necessidades, torna-se possível criar uma estratégia digital. Quais são os objetivos do negócio para o qual você está trabalhando? Quais são as ferramentas que você tem disponíveis para alcançar esses objetivos? Qual será a metodologia mais adequada para tornar isso possível? Basta unir as respostas deste e do tópico anterior para dar início a sua estratégia.

### Arquitetura da informação

Por meio da arquitetura da informação, que é a responsável por estruturar, organizar e classificar todos os elementos que fazem parte de uma peça de comunicação, é possível direcionar sua estratégia digital para o sucesso. O foco, aqui, deixa de ser somente o layout e passa a ser na experiência que os usuários terão. Para isso, vale a pena colocar em prática uma série de testes A/B. Por eles, é possível identificar falhas e acertos.

### Design que promove a confiança

Quando o layout é concreto, limpo e claro, ele transmite confiança ao usuário. Existe uma pequena diferença que separa o layout que serve como apoio para chamar a atenção do consumidor daquele que serve como distração. O esquema visual, a paleta de cores, o menu de navegação, as imagens e o correto posicionamento dos call-to-actions são fatores decisivos para que o usuário consiga navegar e se interessar pela informação que está sendo oferecida.

## 4\. Importância do UX design para os negócios

Aprendemos, até aqui, que uma boa experiência serve para deixar as pessoas mais felizes, satisfeitas e motivadas para comprar mais. O UX Design ajuda no dia a dia dos negócios, fazendo com que as empresas faturem e lucrem mais, entregando com sucesso suas soluções, serviços e produtos para os consumidores. Os clientes precisam de soluções inteligentes e, ao mesmo tempo, experiências memoráveis.

Há quem encare o UX como um gasto, possível apenas para grandes corporações. Esse tipo de pensamento é equivocado. O UX deve ser visto como um investimento. Independentemente do tamanho de um negócio, o UX design tem a capacidade de levá-lo ao sucesso. Trata-se do momento em que o retorno de investimento (ROI) se faz presente. A ideia de que o design entra apenas como a camada final do processo se foi.

### Por que citamos aqui o ROI?

Em 2002, Aaron Marcus, diretor da revista User Experience, publicou [um artigo] falando sobre o ROI para a usabilidade do design da interface do usuário. Nele, o autor aponta quais são os tipos de retorno em cima do investimento que é feito em projetos que envolvam usabilidade e UX.

Veja quais são os indicadores de ROI interno:

- aumento na produtividade dos usuários;
- diminuição na quantidade e frequência de erros entre os usuários;
- diminuição do valor destinado para treinamentos;
- economia de dinheiro com alterações que evitam erros; e
- diminuição do valor destinado para suporte a clientes e usuários.

Ele também apontou os indicadores de ROI externo. São eles:

- aumento no total de vendas;
- redução de custos entre equipes de suporte e serviço de atendimento ao cliente;
- aumento na vida útil do produto; e
- redução do valor destinado para treinamentos de vendedores externos e implementação de sistemas.

Note que a palavra redução é citada algumas vezes entre esses indicadores. Essa economia de dinheiro significa mais verba no bolso do cliente, ou seja, ele tem como investir em outros pontos que, dependendo de sua situação, acabam sendo menosprezados. Conseguir gastar menos e ao mesmo tempo oferecer uma excelente experiência aos usuários é o sonho de qualquer dono de empresa. Só resta dar o primeiro passo dessa iniciativa.

Quando falamos sobre UX, estamos pensando em modos sobre como satisfazer as necessidades dos consumidores de uma forma agradável e, ao mesmo tempo, fluida. As metodologias que dão corpo ao UX design conseguem aumentar o grau de assertividade das soluções que uma companhia oferece. Para que você entenda a importância do UX design nos negócios, coloque-se no lugar do empreendedor.

A partir deste momento, você é o diretor de uma empresa e tem a necessidade de inaugurar o site que servirá de base para a comemoração dos 10 anos de sua companhia. Você contrata profissionais, ou uma agência, gasta uma grande quantidade de dinheiro e leva bastante tempo estruturando a ideia.

Quando o site está finalizado e vai ao ar, a quantidade de vendas despenca. Apesar de tecnicamente incrível, você descobre que ele não está perfeito aos olhos dos clientes. Você sabe o que significa isso? Um provável problema de usabilidade.

Talvez, em algum momento, você e sua equipe tenham ignorado o contexto dos usuários que compram seus produtos e serviços. Os feedbacks e as reclamações começam a chegar e você não entende, afinal, o site está incrivelmente perfeito! 

Tempo e dinheiro são destinados para corrigir a rota, explicando aos usuários como ocorre a navegação no site de sua empresa. Os desenvolvedores e a equipe de design precisam de mais verba para corrigir a rota traçada e reconstruir os pontos que estão gerando entrave.

Você notou como o jeito certo de se começar impacta diretamente na quantidade de verba que será gasta e no tempo levado para colocar um projeto no ar?

Vamos para outro exemplo. Ao comprar um smartphone, você costuma ler o manual do aparelho antes de ligar? 

Aposto que não! Os aparelhos fabricados e vendidos atualmente são tão fáceis de mexer que dispensam o manual do usuário que, diga-se de passagem, se transformou em um folheto chamado “Guia de Início Rápido”, apresentando basicamente as portas de conexão e a localização dos botões de cada telefone.

A facilidade em pegar um dispositivo novo na mão e sair mexendo significa que ele é intuitivo. Quando algo precisa de treinamento ou manual, isso significa que as chances de ele ser difícil e pouco intuitivo são grandes. Implementação, treinamento e criação de sistemas que fazem o papel de um manual significa gasto de dinheiro. É nesse ponto que o UX design também ajuda o empreendedor.

Alguns sites são tão complicados de se navegar que é preciso recorrer a tutorais na internet! Muitos empresários enxergam isso como uma mentira e alegam que “saber” é um dever do consumidor. Saiba que não é. A culpa pela falta de empatia com a navegação de um site, de um sistema ou de um aplicativo é, na maioria absoluta das vezes, da falta de uma boa experiência do usuário, ou seja, de quem fez.

O mesmo ocorre com os produtos. Já notou que alguns se vendem praticamente sozinhos? O UX design tem o poder de fazer uma validação social do produto ou serviço que o empreendedor tem. É algo tão positivo que aumenta a recomendação boca a boca, facilita a rotina dos vendedores e aumenta as vendas. Trata-se de uma [oportunidade única] para que essa marca consiga aumentar seu potencial de crescer diante do público.

## 5\. Tendências do UX design

Depois dos avanços significativos que o UX design teve nos últimos anos, em que pequenas e grandes empresas apostaram na melhoria da qualidade da experiência de seus usuários com foco em fidelização e satisfação, chegamos a 2017 com ainda mais foco no usuário. Para que você, designer, saiba os pontos importantes desse avanço contínuo, listamos abaixo [as tendências do UX design].

### UX design como parte fundamental do produto

A constante evolução tecnológica e o avanço das ferramentas de pesquisa que nos permitem conhecer cada vez mais os usuários fazem com que o UX design deixe de ser somente uma forma de melhorar seu produto ou serviço. Agora ele faz parte dele! A melhora da experiência do usuário passa a se dar desde o primeiro contato do cliente com a marca. Presente desde o projeto inicial, agora o UX o acompanhará por toda sua vida útil.

### Interface com cards, scrolling e parallax

Ao clicar para saber mais sobre um produto, o consumidor pode ter acesso ao [**card**]. Nele, informações mais detalhadas podem aparecer para que a leitura e a identificação do produto sejam mais precisas. Já o [**scrolling**]. 

Quando o site fica concentrado em uma só janela, permanecerá neste ano por causa do aumento do conteúdo produzido em vídeo. Por fim, o [**parallax**] trará mais inteligência às interfaces, deixando-as mais atrativas e dinâmicas. Esses recursos, quando bem implementados, se transformam em um forte elemento visual.

### Microinterações

As microinterações são interações diretamente com a interface. Elas são responsáveis em resolver tarefas simples e únicas: curtir uma rede social, responder uma enquete ou abrir uma galeria de fotos. Esta é uma tendência de UX Design, pois as animações e gestos mais humanizados, como as reações dos status do Facebook, fazem com que as interações ocorram com uma frequência cada vez maior.

### Aumento do design responsivo

A massificação do smartphone resulta no aumento da necessidade de designs mais responsivos. Ninguém mais tem paciência para visualizar, em uma tela de 5 ou 5,5 polegadas, a versão para desktop de um site. É horrível ter que dar zoom com a ponta dos dedos e tentar acertar a mira em botões minúsculos.

### Tempo de carregamento cada vez menor

A presença do smartphone em nossas vidas gerou outra tendência no UX design: um tempo de carregamento de páginas, sistemas e aplicativos cada vez menor. Além de um melhor posicionamento nas buscas do Google, o tempo de carregamento impacta diretamente na boa experiência do usuário. Quem, atualmente, tem tempo para ficar esperando que uma página carregue completamente por alguns minutos?

### Imagens e vídeos com peso maior na entrega de conteúdo

Eternas aliadas do design visual, [**as imagens**] abriram caminho para outro tipo de mídia: os vídeos. Com o aumento da velocidade de conexão à internet e uma maior oferta de planos com muitos dados, os vídeos trarão uma experiência cada vez mais dinâmica aos usuários. Eles ajudarão a transmitir a mensagem das marcas com mais sucesso na entrega de conteúdo.

Ao longo deste texto, mostramos um panorama sobre a relação entre design e UX. Você viu como ambos andam juntos em benefício da transformação e otimização da experiência do usuário, tornando os processos mais eficientes para o consumidor.





Lançar-se no mercado de trabalho é uma etapa da vida recheada de desafios e no [**ramo de design**] não é algo diferente. Porém, a trilha entre o início de carreira e a tão sonhada estabilidade profissional pode ser mais curta e simples se você tomar algumas atitudes. Nesse sentido, é interessante conhecer algumas estratégias para ditar seu próprio trabalho e ser um excelente freelancer de sucesso. 

Portanto, se você quer investir nessa possibilidade, não perca este post! Continue a leitura e descubra o passo a passo para se dar bem na profissão e garantir seu espaço no mercado de trabalho. Preparado? 

## 1\. Organize seu horário

Tudo bem que um freelancer geralmente não tem um horário fixo de trabalho, tem flexibilidade com o tempo e pode até trabalhar em casa, usando chinelo e bermuda. Mas isso não significa ele deve ter a agenda completamente desorganizada. 

Para ter um bom resultado, é preciso se comprometer a trabalhar por um mínimo de horas semanais. Você já tem o direito de fazer sua agenda, certo? Então, não há desculpas para não cumpri-la. 

**Se, por acaso, não tiver aparecido nenhum job para aquele período, não o trate como horário de folga. Aproveite para caprichar na elaboração do seu portfólio ou captar novos clientes. Você é o seu próprio patrão, mas se não for um chefe exigente, os resultados provavelmente ficarão abaixo das suas expectativas.**

## 2\. Crie um portfólio atraente

E por falar em portfólio, você já tem um? Principalmente para atuar como design, ele é completamente essencial. Lembre-se que seu trabalho é visual. Por mais que consiga explicar os detalhes de um projeto, será muito mais fácil fechar um contrato depois que o cliente visualizar o que você é capaz de fazer.

Procure elaborar layouts de estilos diferentes, pois existem mais chances de ele se identificar com algum deles. Também crie [**harmonia entre as cores**] e abra espaços para esboços e testes. Ah, e não se esqueça de se preparar para explicar como cada uma dessas funcionalidades ajuda a converter visitantes em consumidores! 

## 3\. Capacite-se para ser um freelancer de design

Obviamente, quem está começando ainda não tem todo o conhecimento esperado para a área. Portanto, é fundamental investir em capacitação. Conhecer as melhores técnicas e utilizar os programas mais eficientes podem ser diferenciais para o seu trabalho. Esse cuidado é o que garante destaque no mercado e rende muitas propostas de trabalho. 

**Essa prática não vale apenas para o início da carreira. A área de informática evolui rapidamente, e um profissional pode se tornar obsoleto em pouco tempo. Com isso, ele perde espaço para seus concorrentes. Portanto, comece sua vida profissional estudando e jamais entre na zona de conforto.** 

A atualização pode vir através de cursos, mas também existem outros meios de se manter antenado às técnicas e tendências do mercado: seguir designers bem sucedidos em redes sociais, inscrever-se em blogs de tecnologia 

## 4\. Tenha controle financeiro 

Em alguns momentos, você terá muito trabalho e uma renda significativa. Mas é provável que, também, passe por alguns períodos de menor procura. Isso é normal, mesmo para um freelancer mais conceituado. 

**Por isso, é importante ter um controle financeiro e não gastar todo o dinheiro que chega nos períodos das “vacas gordas”. Faça uma previsão dos seus gastos mensais, coloque uma margem maior e procure guardar o restante. Essa reserva vai garantir o cumprimento de compromissos financeiros nas épocas de menor procura, evitando as temidas dívidas.** 

## 5\. Cobre o valor justo pelo seu trabalho

Já que tocamos no assunto do dinheiro, é importante cobrar um valor justo pelo seu trabalho. Como iniciante, ele pode até ser menor (quando comparado ao valor cobrado pelos profissionais mais experientes do mercado), mas nunca muito inferior à média praticada. 

Cobrar baratinho só para conseguir o job, além de não pagar suas contas e não valorizar seu trabalho, é uma prática desleal em relação aos outros profissionais. A tentação, quando ainda não surgem contratos, é a de falar sim para qualquer valor mínimo, mas essa não é a forma mais eficiente de ser aceito e valorizado no mercado. 

## 6\. Adquira as ferramentas necessárias

Para fazer um bom trabalho, é importante ter as melhores [ferramentas] em mãos. Por isso, não adianta tentar progredir sem investir em programas ou equipamentos necessários.

**Antes de comprar algo, certifique-se de que aquela é a melhor possível — quanto a qualidade ou a durabilidade do equipamento. Para isso, evite realizar compras por impulso e baseie-se em avaliações.**

Nós já falamos que você deve se atualizar em outro tópico, certo? Então, diversos blogs relacionados a tecnologia falam dessas ferramentas e produzem resenhas sobre os equipamentos. Não é difícil encontrar descrições, configurações e materiais recomendados.

Para acertar na escolha, compare essas avaliações e, se possível, procure informações diretamente com quem usa a ferramenta em seu círculo profissional.

## 7\. Ouça o cliente

Antes de ter um projeto em mente, ouça o cliente e tente realmente entender suas necessidades. Essa é a única forma de garantir a satisfação dele. Então, por mais que suas ideias sejam incríveis, é importante não tentar forçar a barra para que o cliente assuma algo que não tem interesse. Por isso, mesmo que o cliente queira algo muito simples e o seu potencial permita fazer algo extraordinário, é a satisfação dele que importa, ok? 

## 8\. Legalize seu negócio

Por questões contábeis, várias empresas só contratam os profissionais que podem oferecer uma nota fiscal. Por isso, não perca tempo e legalize o seu negócio. Um CNPJ garante mais credibilidade, permite a emissão de notas fiscais. Hoje em dia é muito fácil conseguir um registro como [Microempreendedor Individual (MEI)], por exemplo.

## 9\. Forneça um atendimento impecável

Como freelancer de design, lembre-se que você é a sua empresa! Então, para encantar o cliente, não basta desenvolver um trabalho maravilhoso. É preciso caprichar no atendimento e em todas as etapas.

Desde o primeiro contato, da conversa inicial para conhecer as expectativas do contratante, o fornecimento de um orçamento detalhado, esclarecimento de dúvidas até a entrega do produto final, a experiência do cliente com você precisa ser realmente satisfatória.

Seja acessível, responda às mensagens prontamente, ofereça soluções em curto prazo e tenha paciência para lidar com o seu público — mesmo que às vezes tenha que gerenciar situações complexas. Em algumas situações, o cliente procura suporte mesmo que o serviço funcione bem. Você vai descobrir que, na verdade, atenção neste ponto faz toda a diferença.

## 10\. Cumpra prazos

**Nunca é demais falar: você é a sua empresa! E sabe do que uma empresa precisa diante do mercado? De credibilidade. Isso significa que você precisa cumprir o que prometeu, seja na qualidade do serviço prestado ou no prazo que foi fixado para a entrega. Então, não deixe o cliente esperando! Organize-se para realizar as tarefas no tempo programado.** 

Um ponto muito importante que precisa ser entendido é que o seu serviço pode ser uma pequena parte de todo um projeto ou estratégia do cliente. Se você atrasar a entrega, todo o processo dele fica comprometido. No mundo dos negócios, meu amigo, atraso é prejuízo! 

Aliás, se você conseguir surpreender o cliente e terminar o projeto antes da data, será perfeito! Essa sim é uma quebra de prazo que vale a pena! Pode ter certeza que vai ganhar muitos pontos e isso vai te render diversas indicações.

Quer ser um excelente freelancer de design? Então, coloque essas dicas em prática e prepare-se para garantir bons resultados.




Mas sabe o que é mais legal disso tudo? Eles compartilharam conosco como foi a experiência sobre o treinamento utilizando a nossa [plataforma]. Bacana, né? Então vamos dar uma olhada e ver o que aconteceu durante todo esse processo! Bora lá :)

## O jogo

O pessoal que participou do treinamento da Alura se reuniu para bater um papo e comer uma pizza. Para quebrar o gelo, eles fizeram uma dinâmica Jokenpô, em que os vencedores jogavam com outros vencedores até ter o último ganhador, que foi a Jacqueline Silva. Quem perdia tinha de gritar o nome de quem ganhava.

Em seguida, cada um recebeu um cartão com uma pergunta a ser feita para outra pessoa. Todo mundo perguntou e respondeu. Depois, foi só saborear a pizza e conhecer mais cada um. Valeu pelo apoio, Emerson Vieira. Valeu, Alureiros!!!

Edson Braga, Como você aplicou os conhecimentos nos projetos que participa?, 

> Na criação e manutenção de código, sempre procurando aplicar os conhecimentos obtidos nos cursos, principalmente dos cursos de design patterns que ajudam a melhorar a qualidade do código.

Claudinei Carlos Bonilha, Jacqueline Silva, O que você faria para melhorar os treinamentos na nossa área?

> O treinamento atualmente está muito bom, com uma mistura de cursos e participação nos projetos, não há o que acrescentar, é um treinamento dinâmico.

Jacqueline Silva, Gustavo Silva

> Qual foi o curso com melhor conteúdo?, Design Patterns 1.

Vinicius Rodrigues Justo, Felipe Santos 

> Como você se organizava para estudar na Alura?, No princípio, eu estudava e fazia as atividades dos cursos durante todo o período na 7COMm (das 9h às 18h) e, quando passei a realizar atividades dos projetos, separei o período da manhã para estudar (das 9h às12h) e o restante do dia dedicava a outras tarefas.

Marco Cauê Rodrigues, Matheus Cavalieri

> Quem foi o melhor instrutor?, Guilherme Silveira, um dos fundadores da Alura, se não me engano. Ele passa uma impressão de que conhece tudo sobre o que está dando aula. Em segundo lugar, o Maurício Aniche.

Matheus Cavalieri, Claudinei Carlos Bonilha

> Quais problemas você teve para fazer os cursos?, Tive problemas para visualizar as vídeo-aulas.

Emerson Vieira, Renan Ribeiro Silva

> Você acredita que o treinamento vai agregar conhecimento para suas atividades diárias?,Sim, pois todo recurso de conhecimento é bom para ajudar a me aprimorar em minhas atividades diárias e acredito que a Alura seja muito bom nesse aspecto.

Edson Braga, Vinicius Rodrigues Justo

> Qual foi o curso com pior conteúdo?, Na época em que fiz a Alura, o curso de Enterprise Java Beans não fornecia bons exercícios para fixar o conteúdo.

Felipe Santos Marco, Cauê Rodrigues

> O que tem feito para aprender depois que deixou a Alura?, Nas horas vagas, enquanto me desloco para o serviço ou faculdade, procuro sempre estar aprendendo de alguma forma, lendo livros, vendo alguma matéria em blogs, ouvindo podcast. Neste momento, estou lendo o livro "Como Mudar o Mundo: Gestão de Mudanças 3.0" e escutando podcats no Hipsters.tech e Nerdcast.


## Feedback do time

Sabendo dessa dinâmica superbacana que os estagiários participaram, aproveitamos também e fizemos algumas perguntas para entender a impressão de cada estagiário com a Alura. Então tivemos os seguintes resultados:

Quais cursos fizeram um grande diferencial na aprendizagem?
Para quem está começando, quais cursos vocês acreditam que sejam imprescindíveis?, Quais técnicas vocês utilizam para estudar?, Em relação ao que vocês já conheciam e ao que aprenderam conosco, quanto vocês evoluíram?

Gustavo Henrique da Silva

> Primeiros passos com Java, Design Patterns, Toda a trilha de certificação., Toda a trilha de Java., Acompanhar o código enquanto vejo o vídeo. Dependendo do curso, evoluir o projeto por conta própria., Tudo em relação a boas práticas, além de conhecimento mais detalhado sobre vários assuntos.

Matheus Cavalieri

> Os cursos de Design Patterns e SOLID me ajudaram bastante a pensar em abstrações. Também gostei dos cursos de MEAN Stack/Angular/Node.js, que me ajudaram a trabalhar com os projetos aqui., Não recordo o nome agora, mas os cursos introdutórios de Banco de Dados e OO são bastante necessários., Gosto de ouvir música enquanto leio a explicação., Saber programar eu sabia, mas algo que melhorou muito com a Alura foi o uso de melhores práticas.

Claudinei Carlos Bonilha

> Java., Lógica de programação., Praticar e sempre usar GUJ., 80% a 90%.

Jacqueline Cristina Silva

> JAVA II - Orientação a objetos., Lógica de programação., Assistir às vídeo-aulas, ler o conteúdo e, logo em sequência, treinar o que foi aprendido, além de sempre relembrar alguns tópicos importantes nos próximos dias., Como possuo pouco tempo de estudo na Alura, evoluí pouco, porém, já consegui aprender muitas coisas que ainda não sabia, além de aprimorar o meu conhecimento anterior.

Felipe Gonçalves dos Santos

> Os dois cursos de Design Patterns e SOLID., HTML/CSS, Javascript, Java I e II., Focar o máximo possível, fazer uma pausa sempre que for preciso para não tornar o estudo algo cansativo e maçante, e não deixar dúvidas para depois. Você pode pausar a aula e esclarecer pontos que não ficaram claros evitando que se tornem uma "bola de neve". E também praticar o máximo que puder., Posso afirmar que aprimorei todo o meu conhecimento com as aulas e exercícios além do conteúdo novo, que foi passado de uma ótima maneira.

Marco Cauê Borges Rodrigues

> Toda carreira Desenvolvedor Java Júnior., Lógica de programação, feito isso, cursos da trilha Júnior, independente da linguagem., Creio que estudar todos os dias, em um curto espaço de tempo e resolvendo exercício, seja eficaz., A evolução foi grande. Se antes tinha uma noção básica de Java, hoje já tenho conhecimentos que me possibilitam um maior raio de ação dentro da linguagem.

Lucas de Almeida Fernandes

> Design Patterns Java I: Boas práticas de programação, SOLID com Java: Orientação a Objetos com Java., Java I: Primeiros passos., Assisto às vídeo-aulas, respondo as questões e trabalho em um projeto pessoal ou no trabalho os conceitos vistos no curso para fixar o aprendizado., Aprendi toda a parte de boas praticas e técnicas mais avançadas de Java.

## Feedback do gerente

Além dos estagiários, o gerente também não fugiu! Em outras palavras, também ficamos bem curiosos em saber suas impressões sobre nós. Então, fizemos algumas perguntas para compreender como era a sua experiência ao utilizar a Alura como meio de treinamento. Veja só o feedback que ele nos deu:

### Por que preferiu a Alura como meio de treinamento para o time?

Precisávamos de uma forma, economicamente viável, para treinar os estagiários que chegam das universidades cada vez menos preparados para o trabalho. Algumas pessoas do nosso time tinham experimentado a plataforma (trial da alura) e pareceu promissor. Então, decidimos experimentá-la.

### Quais foram os resultados obtidos após o treinamento na Alura?

- Somaria mais de 300 cursos assistidos.
- Presença do colaborador na empresa 100% do tempo.
- Devido a essa presença, torna-se fácil preencher o tempo sem atividades de projetos.

São estudados cerca de 30 cursos em 3 meses. Não conseguiríamos passar tanta informação em tão pouco tempo apenas com treinamentos internos.

### Como gerencia o progresso dos estagiários?

Temos uma sequência de treinamentos que os estagiários devem seguir. São cerca de 30 cursos que devem ser concluídos aproximadamente em 3 meses. Toda segunda-feira, cada um compartilha no canal do Slack quais treinamentos serão feitos durante a semana. Também são feitas retrospectivas para levantarmos os pontos fortes e fracos do treinamento.

### Quais tipos de cursos os estagiários fazem mais? Programação? Front-end? Mobile? Ou outros?

A nossa principal stack é Java e, em segundo, Nodejs.

O que achou dessa experiência que a galera da 7COMm compartilhou? Bem legal, né?

Você, gestor, líder e desenvolvedor, que quer levar os treinamentos da Alura para dentro da sua empresa e ter as mesmas experiências e resultados que o pessoal da 7COMm, não deixe de entrar em [contato com a gente por aqui].




Olá, se vocês não viram o primeiro post da série clica [**aqui**] e dá uma lida nesse antes.

Bom, agora vamos resolver o problema dos **nomes das classes de CSS**, vamos recapitular o componente .box que eu criei:

css

Imagina agora que o nosso componente navbar tem seu próprio elemento título também, qual nome daríamos pra classe desse título?

css 

O problema de usar nomes tão genéricos é que nomes de classe assim vão conflitar uns com os outros, veja que tanto o componente `box` quanto `navbar` tem um `.title` declarado. Como podemos fazer pra resolver isso?

Gente pensa comigo, o titulo da navbar pertence a qual componente? A própria navbar!

O título do box pertence a qual componente? O próprio box!

css 

Agora sim! Os estilos vão ser específicos pros seus elementos!

Apesar da gente ter melhorado o código agora, esse código novo ainda vai entristecer muita gente, principalmente quem for dar manutenção no futuro.

Olha, vamos pensar o seguinte, lembra do nosso item ativo da navbar? Então, vamos pensar que o CSS do nosso modificador ativo tem de ser escrito por uma outra pessoa nova no projeto e que nós não fazemos mais parte desse projeto. A pessoa provavelmente vai escrever algo do tipo:

css 

Quando ela inserir esse modificador no elemento da navbar o que vai acontecer?

html 

Não acontece NADA.

EITA, como assim nada?

Pois é, no CSS existe uma coisa chamada especificidade, quanto mais específico for o CSS mais prioridade ele vai ter pra estilizar o elemento. Veja só isso:

html 

Quais são os seletores CSS que temos que estão estilizando o nosso link courses?

css 

Qual desses seletores você acha que é mais específico e vai ter mais prioridade?

css 

Pois é, um seletor com duas classes é mais específico do que um seletor com apenas uma!

O que vai acontecer é que a pessoa que criou o estilo do .active vai ter que deixar esse seletor igualmente ou até mais espeficífico que o seletor acima. Resultando em:

css 

E se depois disso outra pessoa quiser estilizar? Vai ter que ir ficando cada vez mais específico até chegar no.

.. 1 minuto de silêncio ..

**!important**

Isso é horrivel porque o **!important** é um curinga para burlar a especificidade, ou seja, se alguém quiser estilizar ainda mais o elemento vai ter problemas!

Se um dia você mexer com temas prontos do Wordpress e tentar customizar eles você vai sentir na pele todos esses problemas, confia em mim!

Bom, ok, mas como resolver esse problema ? Simples, deixando menos específicas as classes! Vamos tentar deixar apenas o NOME do seletor mais específico:

css 

Repare que agora temos uma classe só com nome composto! Agora .navbar-active sobrescreve .navbar-title!

Existe já um padrão pra isso e é o famoso Block Element Modifier, [**BEM**].

Explicando as siglas do BEM temos:

**(B)lock** - Esse seria basicamente o que o **SMACSS** chama de Módulo e o que chamamos aqui de componente também, isso seria qualquer componente que criamos que possa ser reutilizado em várias páginas, como o caso do nosso box ou da navbar.

De agora em diante quando eu me referir a block ou bloco vou estar falando de algum componente.

**(E)lement** - Esse seria um elemento que está dentro do nosso bloco, por exemplo tanto os nossos itens dentro da nossa navbar, quanto o title e a image dentro do box, lembra?

html 

css 

html 

css 

**(M)odifier** - Esse seria o nosso modificador, lembra do active? navbar-itemActive.

O que o BEM propõe é organizar esses nomes, que nomes vamos dar para os elementos? E os modifiers? E os blocks? Ele ajuda a gente a seguir um padrão. Para o BEM esse padrão seria:

`block__element--modifier`

Ou seja, refatorando nosso código a gente teria:

Para o block box:

css 

Veja que no exemplo do box não temos modifier, apenas o block box e os _elements_ `title` e `image`!

Vamos para o nosso block navbar agora:

css 

Lembra que active é o nosso modifier? Voilà!

BEMerizamos o nosso CSS! É assim que a gente faz na Alura hoje em dia, usando tanto as técnicas descritas nesse post como as técnicas descritas no post anterior de organização de arquivos do front!

Pessoal nesses dois posts falamos apenas de HTML e CSS, pro javascript já são outros quinhentos, quem sabe eu não escrevo um post falando um pouco do JS também no futuro!

Só vou complementar com algumas últimas informações:

O BEM não é restritivo, ou seja, se você separar os seus blocks dos elements e dos modifiers você já está seguindo um padrão BEM! Olha só, na Alura antes a gente seguia o padrão:

`Block-element--modifier`

Esse padrão funcionou durante um tempo mas conforme o código cresceu a gente começou a achar ele confuso, o element do modifier a diferença é 1 hífen só.

Isso começou a dar problema. Se vocês derem inspect em algumas páginas da Alura hoje ainda vão achar código assim!

Obrigado por lerem e forte abraço!





imagem 

A Olimpíada Brasileira de Informática traz diversos desafios de lógicas. Mas como podemos resolvê-los? Veja como se preparar para os desafios

Quando eu era mais novo, na época do segundo ano do ensino médio, estava decidido a fazer um curso técnico. Na época, estava indeciso entre dois cursos técnicos: química ou informática. Acabei optando por informática e gostei muito do curso.

A parte que mais chamou minha atenção foi a parte de programação. Criar códigos, resolver problemas. Até hoje eu adoro resolver problemas com os algoritmos que aprendi!

Na época eu não sabia, mas existem alguns campeonatosde informática, como a [**Olimpíada Brasileira de Informática**] (OBI). Nessa competição, alunos do ensino fundamental, médio e que cursam o primeiro ano de um curso superior competem com desafios de lógica e programação, cada um em sua respectiva categoria.

Na OBI existem duas modalidades: a de **iniciação**, onde as provas são feitas no papel, e a de **programação**, na qual as provas são feitas no computador.

Em ambas as modalidades resolvemos problemas que envolvem lógica. A diferença é que, na modalidade de programação, a gente pode utilizar linguagens como C, Java, C++, entre outras, para criar nossa solução. Mas como será a prova? Como devemos resolver os problemas?

Só temos acesso a prova no dia da competição, mas podemos ir praticando. No site da maratona tem uma [**seção com alguns problemas**] que podemos resolver. Vamos ver como é um desses problemas!

## O álbum da copa

Nos problemas de nível júnior, vamos escolher um problema de 2018 da primeira fase, [o Álbum da copa].

Temos um álbum de figurinhas da copa do mundo. O álbum possui um número total de figurinhas, que é a primeira entrada no programa. Nós podemos comprar figurinhas para esse álbum - a quantidade comprada é representada na segunda entrada.

Cada figurinha que compramos representa um espaço no álbum. Esse espaço é mostrado pelas próximas entradas.

A cada nova figurinha, completamos um espaço no álbum. Logo, faltam menos figurinhas para completar o álbum. Nossa meta nesse problema é **achar justamente quantas figurinhas faltam**:

```
Entrada: 
10 ← quantidade de figurinhas no álbum 
3 ← número de figurinhas que compramos 
5 ←número da figurinha no álbum 8 3

Saida: 7 ← figurinhas que restam para completar o álbum

```

Podemos comprar quantas figurinhas quisermos, mas elas podem vir repetidas:

a

Nesse caso compramos seis figurinhas mas quatro eram iguais, ou seja, conseguimos preencher duas figurinhas no álbum.

Como podemos começar a resolver o nosso problema?

Bem, estou utilizando a linguagem C para resolver esse problema, que é padrão nesse tipo de campeonato. Já que nosso programa terá entrada de dados, a primeira coisa que temos que fazer é incluir (**include**) a biblioteca padrão de entrada e saída (**stdio.h**):

c 

Agora, temos que começar a escrever o código da solução. Todo programa em C começa a rodar a partir da função principal, a **função main()**. Então, vamos declará-la para conseguir executar o código:

c 

Essa função deve retornar um número inteiro. Por padrão, no sistema operacional, quando um programa finaliza corretamente, isso é, sem erros, é retornado (**return**) o valor zero:

c

Bacana! Já temos a estrutura do projeto definida, agora vamos começar a escrever a solução.

## Começando com o álbum

Nós sabemos que receberemos três informações no começo:

- A quantidade de figurinhas no álbum;
- A quantidade de figurinhas compradas e
- O número dessas figurinhas.

Já sabemos que precisa armazenar essas informações, logo, podemos falar para o C guardá-las para a gente:

c

Para guardar as informações das quantidades de figurinhas, só precisamos declarar duas variáveis inteiras. Mas e para guardar o número das figurinhas que foram compradas?

Uma? Dez? Cem? Não temos como saber realmente quantas figurinhas foram compradas, então como podemos armazená-las?

O que nós podemos fazer é utilizar uma **coleção** que guarda as figurinhas que compramos. Essa figurinha terá, justamente, o tamanho do número de figurinhas que compramos. Mas quantas figurinhas foram compradas?

Antes de declarar essa coleção, precisamos captar o número de figurinhas compradas. Além desse número, precisamos também saber quantas figurinhas temos no álbum:

c

Dizemos para o C que **queremos escanear (`scanf`) valores numéricos (`&d`, decimal), que devem ser guardados (`&`) nas nossas variáveis**.

Bacana! Agora nós podemos declarar a coleção com o tamanho de figurinhas compradas.

c

Para declarar essa coleção, que no nosso caso é um vetor, utilizamos uma sintaxe parecida com a de variáveis. Porém, passamos entre colchetes (`[ ]`) o tamanho do vetor. Agora, podemos ler quais foram as figurinhas que compramos.

Isto é, para um índice, que começa em `0`, e enquanto esse índice for menor que o número de figurinhas compradas, vamos fazer alguma coisa. Depois disso, somamos 1 ao valor do índice, dessa forma vamos caminhando pelo vetor:

c

As figurinhas ficarão guardadas em um álbum, logo, podemos declarar um vetor para o álbum também:

c

No começo, não existe nenhuma figurinha no álbum, logo, podemos dizer que o valor de cada posição do álbum vale `0`, ou seja, nenhuma figurinha naquela posição.

c

Neste caso, também usamos a variável índice e, da mesma forma que fizemos com o outro vetor, iniciamos ela com o valor zero.

Só falta agora colocar as figurinhas no álbum. Como não precisamos contar as figurinhas repetidas, podemos simplesmente passar por cada figurinha que compramos e "colá-la" no álbum, ou seja, atribuir àquela posição do álbum o valor da figurinha.

Uma característica importante é que os vetores, no C, **começam na posição 0**. Ou seja, se a figurinha tem o valor cinco, no vetor ela deve ocupar a posição quatro, a quinta posição no vetor. Por isso, antes de atribuir a figurinha na variável, subtraímos 1 de seu valor :

c

Com esse código, estamos atribuindo o valor 1 para cada posição no álbum, isto é, estamos "colando uma figurinha" naquela posição. Ou seja, significa que completamos mais um espaço no álbum. Podemos declarar uma variável para contar quantas figurinhas diferentes temos e, a cada atribuição no **loop**, incrementamos 1 nela:

c 

O que vai acontecer quando rodar esse último loop? Vamos incrementar o número de figurinhas diferentes para todas as figurinhas que compramos. Ou seja, até mesmo as figurinhas repetidas serão contadas!

Mas não precisamos contar as figurinhas repetidas, precisamos contar apenas as figurinhas únicas, como podemos fazer isso? Uma das formas é colocar uma condição antes de atribuir os valores nas nossas variáveis, isto é, se (**if**) aquela posição do álbum estiver vazia (seu valor for 0) atribuímos e incrementamos nossas variáveis:

c 

Bacana! Aparentemente já conseguimos colar as figurinhas no álbum e contar quantas são diferentes. Sabendo quantas figurinhas são diferentes, podemos calcular quantas faltam para completar o álbum.

Agora, basta calcular a quantidade de figurinhas no álbum **menos** as figurinhas diferentes. Como o problema pede, vamos escrever na tela (`printf`) esse valor, que é um número inteiro:

c

Como podemos saber se o nosso sistema está funcionando? Testando! No site que apresenta o desafio tem alguns testes de como o algoritmo deve funcionar. Vamos nos basear nesses testes e ver se nosso programa apresenta o resultado esperado.

Antes de executar o código, precisamos compilá-lo, isso significa que estamos passando o código para uma linguagem que a máquina entende. No meu caso, estou utilizando um Linux, porém os passos no Mac e no Windows são parecidos.

Vou utilizar o **gcc** para compilar o meu código, que está no arquivo `album-da-copa.c`, e vou falar para ele criar o programa com o nome de `album-da-copa`:

imagem vem de algum desses arquivos:

![]

Legal! Nosso algoritmo passou nos testes. Mas esses testes são básicos, no [site do desafio] podemos submeter a solução. Basta informar a linguagem que utilizamos e o arquivo:

![]

Quando clicamos em submeter, somos levados a tela de resultados, o ponto significa que o resultado foi correto. No final podemos ver a pontuação:

![]

## Para saber mais

Olimpíadas de programação são muito legais. Elas nos ajudam a pensar em algoritmos eficientes, que resolvam de maneira simples e rápidas os problemas. Muitos programadores gostam de participar desses tipos de competição para praticar seu código.

Para quem gostou de resolver um problema da olimpíada de programação, no site deles existem diversos outros problemas de vários níveis diferentes.

Para quem quiser ir praticando e não sabe por onde começar, na [**Alura Start temos diversos cursos sobre a olimpíada de programação**] nos quais você pode ver os problemas, ver as possíveis soluções, além de praticar a parte da programação.

Se você se interessou por esse tipo de competição, mas não pode participar porque não está estudando ou já está em anos mais avançados da faculdade, existe a [**Maratona de Programação**], na qual cada equipe de diversas faculdades competem criando algoritmos.

Aqui na Alura existe um [**curso sobre a maratona de programação**]. Nele, você verá como se preparar para a prova, além de técnicas sobre como resolver alguns problemas.





imagem 

Programando em **Python** (ou, na verdade, em qualquer linguagem de programação!) você já deve ter se deparado com algumas mensagens de **erros e exceções**. Como podemos fazer nosso programa lidar com isso da melhor maneira?

Aqui na empresa, temos um programa em cada computador que registra, em um arquivo, as datas e os horários em que o computador foi ligado.

Recentemente, alteramos todo o registro de datas no padrão brasileiro (`DD/MM/AAAA HH:mm`) para o padrão ANSI (`AAAA-MM-DD HH:mm:SS`). Essa conversão de padrão foi feita utilizando [**geradores no Python**].

Entretanto, começamos a usar um novo programa que exige o registro no padrão brasileiro, porque foi desenvolvido por uma empresa nacional. Nossa solução, então, foi ter dois registros com padrões diferentes para os programas diferentes que usamos, em vez de salvar em um padrão ou outro.

Dessa forma, antes de tudo precisávamos de um outro arquivo `registros_br.txt` com todos os registros já salvos no `registros.txt`, mas convertidos ao padrão brasileiro. Por enquanto, temos um arquivo `registros.txt` assim:

 

Já sabemos [**como fazer esse tipo de conversão**] usando um gerador e a função `strptime()` do tipo `datetime`:

python

Legal! Mas dessa vez não queremos imprimir as conversões, não é verdade? Queremos apenas passá-las para nosso novo arquivo `registros_br.txt'`. E agora?

## Escrevendo em nosso arquivo

Para gravarmos os dados em nosso arquivo, temos que abri-lo com um modo diferente de `'r'`, para leitura, o `'w'`, para escrita! Dessa forma, podemos usar o método `write()` para adicionarmos texto nele.

Pensando nisso, podemos, também, usar uma função comum em vez de um gerador, para converter tudo de uma vez e passar para o novo arquivo:

python

Certo! Fui rodar esse código e olha o resultado:

python

Uma exceção gigante! Ela é do tipo **ValueError** e indica que a string `'Dia do Trabalho - FERIADO\n'` não bate com a formatação que a gente passou `'%Y-%m-%d %H:%M:%S\n'`. Realmente não bate, não tem nada a ver… De alguma forma precisamos arrumar isso.

## O problema do fechamento do arquivo

Antes de cuidar desse problema, porém, vamos checar como ficou o arquivo `registros_br.txt`, já que deu esse erro. Dei dois cliques no arquivo para abrir com o bloco de notas e olha o que aconteceu:

imagem`, e o problema é justamente esse - a função não foi finalizada.

> "Isso significa que a função ainda está sendo executada?"

Na verdade… não. A função foi encerrada, mas antes de chegar no final do código dela. E por quê? Por causa da exceção `ValueError` que tivemos! O Python não sabe como lidar com esse erro e simplesmente interrompe toda a execução do programa.

E agora? Bem, podemos pensar em alguma forma de evitar essa exceção, impedindo que isso acontecesse. Mas e se outro erro aparecesse? Novamente os arquivos ficariam abertos!

Seria bom se houvesse uma forma de garantir que as linhas que fecham os arquivos executassem, não importa o que aconteça… Mas como?

## Garantindo a execução de um código com um bloco **try**/**finally**

Por enquanto, temos uma linha do código que é suscetível a erros, como já vimos:

python

Repare que o que queremos é tentar (**try**) executar essa linha e, independente do que aconteça, executar, finalmente (**finally**), as linhas de fechamento dos arquivos. No Python (e em diversas linguagens de programação), temos uma maneira especial de cuidar das coisas dessa forma - com o bloco **try/finally**. Sua estrutura é a seguinte:

python

Vamos tentar executar nosso programa agora e ver o resultado:

python

Ok, o erro continua aparecendo, afinal não mexemos nisso, queríamos apenas garantir que os arquivos fossem fechados ao final. Fui tentar abrir o arquivo `registros_br.txt` e dessa vez… deu certo! Deu certo? Bem, conseguimos abrir, mas olha o conteúdo dele:

 

Ué! Só salvou a primeira linha! Vamos analisar mais um pouco a mensagem de erro que recebemos:

python 

Repare que o erro indicado ocorreu com a string `'Dia do Trabalho - FERIADO\n'`. Voltando lá em nosso arquivo `registros.txt`, vemos que essa linha era justamente a segunda!

Assim, a primeira linha passa pelo loop da maneira como queremos, mas logo a segunda já falha e interrompe todo o código, só executando o que vem no `finally`.

Precisamos, dessa vez, encontrar alguma maneira de contornar esse problema. Não quero remover essa linha do meu registro, pois nos ajuda a controlar as datas por aqui. Mantendo ela, o que podemos fazer?

Uma abordagem seria fazer uma verificação com `if`, checando se a linha é essa. Se for, queremos que ela fique igual no `registros_br.txt`. Vamos lá, então:

python 

Certo! Vamos executar novamente o nosso programa e ver o resultado:

python

Outro `ValueError`, mas dessa vez com a linha `'SÁBADO\n'`. Esquecemos de considerá-la na verificação. Olha como ficou nosso `registros_br.txt`:

```

30/04/2018 10:05
Dia do Trabalho - FERIADO
02/05/2018 12:30
03/05/2018 11:00
04/05/2018 15:00

```

Ainda incompleto… Podemos adicionar `'SÁBADO\n'` em nossa verificação, também. Mas aí teríamos que adicionar `'DOMINGO\n'`. E não poderíamos esquecer dos próximos feriados, como Corpus Christi, Independência do Brasil, e até o Natal!

Ficaria completamente inviável cobrir tudo isso com uma (ou mesmo várias) instruções `if`! Precisamos de uma maneira mais eficiente. Qual poderia ser a solução?

## Tratando exceções com o bloco **try**/**except**

Uma outra abordagem que poderíamos seguir seria nos basear pela exceção, não pela linha. Ou seja, em vez de "se a linha for x, faça y", tratar como "se uma exceção acontecer, faça y". Quem já é mais familiarizado com programação, talvez saiba que isso tem um nome - **[tratamento de exceção**] ou **exception handling**.

Com base no que fizemos antes com o **try/finally**, vamos pensar no que de fato queremos que aconteça.

Em primeiro lugar, queremos tentar (**try**) executar aquela parte do código, exceto (**except**) nos casos em que ocorra um erro, em que queremos mandar direto a linha para o `registros.txt`. No nosso caso, depois de tudo (**finally**) ainda queremos fechar os dois arquivos que abrimos.

Assim, temos a estrutura básica do tratamento de exceções com o Python um bloco **try/except**, ou, no nosso caso, **try/except/finally**. Olha como montamos o código:

python

Legal! O único problema é que o **except**, da forma que está, vai capturar toda e qualquer exceção que aparecer.

> "Mas, ué, não é isso que queremos?"

Será? Veja, as exceções que nos deparamos foram todas do tipo `ValueError`, indicando um problema na parte de formatação da data. Sabemos, então, que estamos falando, na verdade, desse único tipo de exceção, que é o esperado.

Da forma como está agora, erros mais graves, como a tentativa de fechamento do programa (**KeyboardInterrupt**) ou um problema na memória (**MemoryError**), passariam silenciosamente, sem sequer ficarmos sabendo. Como melhorar isso?

## Capturando exceções específicas com `except`

No Python, ainda podemos, então, especificar a exceção que queremos tratar, mudando o `except:` para:

python

Vamos rodar nosso programa e ver o que acontece. O código rodou sem erros e finalizou sua execução. Será que é um bom sinal? Vamos ver como ficou nosso arquivo `registros_br.txt`:

```

30/04/2018 10:05
Dia do Trabalho - FERIADO
02/05/2018 12:30
03/05/2018 11:00
04/05/2018 15:00
SÁBADO
DOMINGO
07/05/2018 09:20
...

```

Deu certo! Exatamente como queríamos, agora! O problema foi resolvido com sucesso, mas ainda há uma última coisa que me incomoda um pouco em nosso código…

Faz tempo que sabemos exatamente qual linha que estava resultando na exceção `ValueError`:

python

Ou seja, é apenas nessa linha que esperamos uma possibilidade de exceção. Entretanto, estamos englobando mais outras duas linhas, de formatação da data em uma string e de escrita no arquivo, no `try`.

Assim, o `except` vai procurar por um `ValueError` em qualquer uma dessas três linhas, quando na verdade só queremos na primeira, que é o que esperamos!

O ideal, então, seria deixar dentro do `try` apenas o trecho que sabemos que pode gerar uma exceção - a primeira linha. Mas se for assim, onde colocamos o resto do código?

## "E se tudo der certo?" com a cláusula `else`

Vamos novamente organizar, então, o nosso objetivo geral. Queremos tentar (**try**) transformar uma string em `datetime`, exceto (**except**) ocorra um ValueError, em que queremos que a string seja simplesmente gravada no arquivo `registros_br.txt`.

Caso não (**else**) ocorra esse `ValueError`, queremos formatar a data no padrão brasileiro e então mandá-la para o arquivo de registro. Finalmente (**finally**), precisamos fechar os dois arquivos que abrimos.

Assim, podemos completar nosso bloco de tratamento de exceção com a cláusula `else` (sim, igual aquela do **if**/**else**!), no qual o código dentro dela será executado apenas se o `except` não capturar nenhuma exceção:

python 

E nosso código está ainda mais efetivo e prático!

## Para saber mais: Gerenciadores de contexto

O tratamento de exceções se mostrou uma solução muito boa para os nossos problemas, mas sabia que há uma maneira mais simples de lidarmos com fechamentos de arquivos no Python? Com a palavra-chave `with`, podemos criar o que chamamos de **gerenciador de contexto**, que manterá o arquivo aberto apenas até o fim do determinado contexto criado:

python

E olha o resultado quando rodamos o código:

python

Os dois arquivos foram fechados automaticamente, sem a necessidade da chamada do método `close()` por nossa parte!

## Conclusão: Tratando erros com elegância

Nesse post, aprendemos sobre tratamento de exceções no Python, vendo como essa técnica pode resolver e simplificar muitos de nossos problemas, transformando erros em coisas menos assustadoras para nós, desenvolvedores!

Aprendemos que há diversas formas de estruturar esse tratamento, com blocos como **_try_**/**_finally_**, **_try_**/**_except_**, **_try_**/**_except_**/**_finally_** e ainda o mais completo - **_try_**/**_except_**/**_else_**/**_finally_**, em que conseguimos especificar com elegância o comportamento que queremos que nosso código tenha frente a uma exceção.

E aí, o que achou do tratamento de exceções no Python? Se gostou do conteúdo, que tal dar uma olhada também em nossos [cursos de Python] lá na Alura?




Onde eu trabalho, todos os links acessados por qualquer computador da empresa são armazenados em um mesmo arquivo de registro na rede, o `acessos.log`, para maior controle do que os funcionários andam acessando durante o horário de trabalho. O log está organizado desta forma:

python

Uma vez por semana, checamos todo esse registro. Uma das verificações consiste em ver quais sites foram acessados sem o [**protocolo de segurança HTTPS**].

Para facilitar isso, criamos um _script_ em Python utilizando nossos conhecimentos sobre [compreensão de lista], [leitura de arquivos] e o método de string **[startswith()]**, que verifica se uma string começa com uma determinada substring passada no parâmetro:

python

Podemos agora checar o primeiro link:

python

E temos como resposta:

python

Ok! Apareceu o primeiro site que foi acessado apenas com HTTP. Se quiséssemos saber os próximos resultados, poderíamos, também, fazer um laço sobre toda a lista.

## O problema da memória

Tudo certo, até que, por desorganização, ficamos algumas semanas sem fazer a checagem. Quando fomos verificar, o arquivo `acessos.log` já tinha mais de 5 GB! Tentamos rodar nosso código e olha o que aconteceu:

python

Recebemos uma exceção de tipo `MemoryError`! O Python não conseguiu fazer o que queríamos. Mas por que esse problema ocorreu?

Isso é porque a compreensão de lista armazena todos os valores de uma vez, ao mesmo tempo. Assim, se todos os links acessados fossem sem HTTPS, por exemplo, a memória RAM de nossa máquina ficaria ocupada de mais 5 GB, lentificando (e muito) nosso computador.

Como podemos solucionar todo esse problema, então?

## Imaginando uma solução com _lazy evaluation_

Por enquanto, lemos nosso arquivo de registro linha por linha e armazenamos as linhas em uma lista. Estamos, então, **iterando** sobre nosso arquivo, isto é, repetindo o mesmo procedimento sobre ele para se obter cada linha.

Conseguimos fazer isso porque nosso arquivo aberto no Python é um **iterável**, um tipo de objeto que possibilita a ação de repetição sobre seus elementos, como listas e strings.

No Python, um objeto é considerado iterável se ele implementa o método `__iter__`, permitindo, por exemplo, que um loop `for` seja executado sobre ele.

Sabendo disso e considerando nosso problema com a memória do computador, uma solução hipotética seria ter um iterável que nos permitisse gerar uma URL por vez a cada iteração, **à medida do necessário**.

Esse tipo de lógica, na computação, tem nome - **[avaliação preguiçosa]**, ou, em inglês, _lazy evaluation_.

A avaliação preguiçosa, como já indica o nome, atrasa o processamento de uma expressão até que o resultado seja de fato necessário. Então como podemos utilizar dessa técnica no Python?

## Implementando iteradores no Python

No Python (e, na verdade, em diversas outras linguagens), temos o conceito de **iterador**. **Um iterador é sempre um iterável**, mas que produz um valor a cada vez que é usado como argumento da função nativa `next()`.

Um iterador deve sempre implementar o método `next()`, no Python 2, ou `__next__()`, no Python 3. Esse método deve retornar a exceção `StopIteration` quando não há mais valores para o iterador produzir.

imagem`.

Mas como podemos criar um iterador que faça o que queremos, então? Temos que criar uma classe que contenha um método `__iter()__` para ser um iterável, e o método `__next()__` para ser um iterador.

Como o método `__iter__()` serve para retornar um iterador e nossa classe será, de fato, um iterador, faremos com que ele retorne o próprio objeto. No caso do método `__next()__`, implementaremos o código que devolverá uma linha que queremos por vez:

python

Assim, podemos ir pegando (e, na verdade, gerando) URL por URL com a função `next()`:

python

E o resultado é:

python

Certo! Mas o que acontece se tentarmos dar `next()` em um iterador que já acabou de produzir seus valores? Vamos ver:

python

E o resultado:

python 

Recebemos uma exceção do tipo `StopIteration`, nos indicando que já não há mais o que ser gerado pelo iterador, como previsto. Podemos evitar essa exceção passando um segundo parâmetro à função `next()`, que substituirá a impressão do `StopIteration`:

python

Dessa vez:

python

Como esperado!

Como um iterador também é um iterável, podemos passar pelos elementos dele com um `for`, de forma que esse problema da exceção já é automaticamente resolvido:

python

O resultado:

python

Deu certo! O que acontece é que o próprio `for` usa a função `next()` para ir pegando os valores, mas para de iterar quando não há mais valores para gerar.

Para entender de fato a diferença entre a iteração que fazíamos antes e a que estamos fazendo agora, vamos fazer uma simulação:

imagem que consegue poupar memória, trabalhando de outro jeito. Podemos até concluir que **é boa prática usar iteradores em leitura de arquivos**, por garantia.

Além disso, entendemos o que são iteráveis e iteradores, e até demos uma espiada nos geradores!

Quer aprender mais sobre conjuntos e listas no Python? Se se interessou pelo assunto e gostaria de entender mais sobre tópicos similares, dê uma olhada em nossos posts no blog sobre **[operações básicas com listas]**, **[como adicionar elementos em uma lista]**, **[ordenação de lista]** e **[compreensão de lista]**.

E aí? Gostou de conhecer essa funcionalidade no Python? Quer se aprofundar mais na linguagem? Na Alura, temos **[diversos cursos sobre Python]** que você pode aproveitar muito, confira!




Em um cenário como o atual, os cursos de capacitação têm se destacado em razão da sua qualidade de ensino e período de duração, que costuma ser curto.

Manter-se competitivo e atualizado é, hoje em dia, um pré-requisito para qualquer profissional em busca do primeiro emprego ou de uma posição melhor na organização em que já trabalha.

Isso não se deve apenas à crise econômica que enfrentamos no momento, mas também à rápida evolução de ramos como a tecnologia, por exemplo.

Ainda assim, uma dificuldade frequente das pessoas que buscam essa opção para se destacar no mercado de trabalho é organizar o tempo. Como buscar cursos extras, fazer faculdade e trabalhar, se dedicando a todas as atividades?

## 1\. Monte um calendário de estudos

Ter um [**cronograma de estudos**] é essencial para garantir que você aproveite seu tempo da melhor maneira possível. Na correria do dia a dia, é fácil se esquecer das prioridades ou perder a noção de quanto tempo é gasto com bobagens.

Por isso, todos os compromissos fixos devem ser anotados no seu calendário: academia, faculdade e, é claro, a hora de se dedicar ao curso. Em seguida, adapte os compromissos flexíveis, como festas ou compras no supermercado, aos horários que sobrarem.

Além disso, estabeleça metas diárias a serem cumpridas. Além de te deixarem mais motivado, as metas ajudam a quantificar com precisão como está sendo sua evolução.

Lembre-se de que, para esse método funcionar, é necessário ter disciplina para consultar e seguir à risca suas anotações.

## 2\. Escolha um bom local de estudo

Você provavelmente já passou pela seguinte situação: ao se sentar para estudar, começa a perceber todos os barulhos à sua volta. Pode ser a TV ligada com som alto na sala ou até mesmo uma obra próxima à sua casa.

Você tenta ignorar e começa a estudar, mas percebe que está lendo a mesma página pela terceira vez porque não consegue se concentrar.

O fato é que a grande maioria das pessoas não consegue focar nos estudos em ambientes barulhentos.

**Por isso, ter um lugar tranquilo para estudar, longe de qualquer tipo de distração, é essencial não só para conseguir focar na atividade, mas também para tornar seu escasso tempo de estudo mais produtivo.**

Ter uma mesa organizada e limpa, com todos os materiais necessários à disposição, também é muito importante nesse momento.

Caso não tenha um lugar assim em casa, uma boa alternativa é encontrar locais públicos silenciosos, como uma biblioteca municipal.

## 3\. Evite a procrastinação

Segundo especialistas, a melhor tática para conseguir motivação e evitar a procrastinação se baseia em três elementos: gatilho, rotina e recompensa.

- Gatilho é o elemento que faz com que seu cérebro perceba que é hora de iniciar determinada rotina ou tarefa. Para a maioria das pessoas, por exemplo, tomar café ao acordar é o gatilho.
- Rotina é o conjunto de tarefas que você precisa fazer com certa frequência, mas acaba adiando. Nesse contexto, a revisão do conteúdo de um curso de capacitação é a rotina.
- Recompensa é o benefício que você obterá ao conseguir cumprir sua rotina corretamente. No caso de se dedicar a um curso de capacitação, a vantagem em longo prazo é conquistar uma posição melhor no [**mercado de trabalho**].

Para ajudar na motivação, você pode estabelecer outras pequenas recompensas diárias cada vez que conseguir cumprir seu cronograma, também.

Quanto mais óbvia for a recompensa, mais fácil será vencer a procrastinação.

## 4\. Elimine as distrações

Depois de montar seu calendário com as metas estabelecidas e encontrar o lugar ideal para estudar, é hora de garantir que sua atenção está completamente voltada à atividade.

Por isso, nada de ficar com o celular na mão ou o Facebook aberto enquanto estuda, ok? Fazer isso pode parecer inofensivo, mas a verdade é que, toda vez que o cérebro desvia a atenção de uma atividade para outra, ele perde o foco.

Ao retornar à primeira atividade, você não vai continuar exatamente de onde parou, podendo levar alguns minutos para que isso aconteça. Somados, esses minutos podem representar um tempo precioso desperdiçado.

## 5\. Aproveite todos os recursos disponíveis

Você, melhor que ninguém, deve saber que a evolução da tecnologia trouxe diversas vantagens quando se trata de [**aumentar a produtividade**].

Existem aplicativos mobile, por exemplo, que podem ajudar a organizar melhor sua rotina. Abaixo, separamos 3 exemplos:

### 1\. inClass

Feito especialmente para estudantes, o aplicativo permite a criação de listas de tarefas, visualizador de horários e alarmes, garantindo que o usuário não se esqueça de nenhum prazo ou deixe alguma tarefa para a última hora.

O inClass ainda pode ser útil no momento de estudar para provas, pois permite anotações sobre a matéria e a inserção de fotos, áudios e até vídeos relacionados a determinado conteúdo. Disponível apenas para [iOS].

### 2\. RescueTime

O RescueTime vai te ajudar a seguir nossa dica sobre eliminar distrações: o aplicativo elabora um relatório semanal que analisa quantas horas você gasta online, com listas que especificam o tempo de navegação em sites e redes sociais.

Tendo essa visão, fica mais fácil descobrir como você está gastando seu tempo, com foco em aprender a se conectar de maneira mais produtiva. Disponível apenas para [Android].

### 3\. Audible

Quem precisa percorrer uma distância considerável até a faculdade ou o trabalho sabe como é sentir que está perdendo um tempo precioso que poderia estar sendo dedicado aos estudos.

Com a ajuda do Audible, é possível ouvir livros e artigos no trânsito — ou enquanto realiza várias outras tarefas —, otimizando seu tempo. O aplicativo está disponível para [iOS] e [Android].

Além do uso de aplicativos como esses, aproveitar todos os recursos disponíveis envolve explorar opções como os [**cursos de capacitação online**] na sua área.

Práticos e acessíveis, eles podem tornar seu currículo ainda mais impressionante. Considere mais essa vantagem que a tecnologia oferece para impulsionar sua carreira.

## 6\. Descanse

Reserve um tempo no seu planejamento semanal para descansar e se distrair. Essa pausa deve ser usada para relaxar, reunir-se com a família ou sair com amigos.

Não pense nesse tempo como “perdido”. Pelo contrário: ele é muito importante para que o cérebro e o corpo tenham energia para a próxima carga de estudos.

Além disso, não deixe de dormir pelo menos 6 horas por dia. Uma boa noite de sono é indispensável para um bom desempenho nos estudos, já que contribui para o processo de memorização sua principal aliada para se sair bem em avaliações.

O cansaço pode ainda comprometer a sua capacidade de raciocínio e causar um mau humor desnecessário.

Sabemos que organizar trabalho, faculdade e [**cursos de capacitação**] pode ser um desafio. Mas com as ferramentas certas, bastante disciplina e organização, você consegue conciliar todos seus compromissos e garantir que estará bem preparado para o mercado de trabalho.





Comecei a estudar [**Java**] recentemente na **Alura** e conforme o tempo foi passando descobri o que são IDE’s e para que servem. Depois de testar algumas delas como [IntelliJ] e [Netbeans], optei por utilizar o [**Eclipse**] como minha IDE principal, porque me senti mais confortável com ela.

Depois de algum tempo clicando nos ícones para salvar arquivos, gerar classes, e mais algumas outras operações, comecei a pensar se o Eclipse teria atalhos para fazer esses tipos de tarefa para mim, pois  eu não estava me sentindo muito produtivo durante o desenvolvimento.

Então comecei a pesquisar sobre os atalhos do Eclipse e me deparei com um [**keysmap**], ou mapa de teclas, onde se encontram todos os atalhos do Eclipse.O que vamos fazer agora é criar uma pequena aplicação onde vamos testar alguns dos atalhos mais utilizados no dia a dia.
Criando getter e setters

A primeira coisa que precisamos fazer é criar nossa classe `Desenvolvedor` que contém os atributos: nome, endereco, idade.

java

Com a classe já feita então temos que fazer os **Getters e Setters**.

Essa é a maneira com que eu normalmente faço, porém quanto mais atributos nossa classe possui, mais tempo eu demoro digitando os Getters e Setters. Imagina se a nossa classe `Desenvolvedor` tivesse 10 atributos o tanto de tempo que gastaríamos para fazer a mão.

Com isso vamos usar uma das keysmaps para fazer isto iremos apertar **CTRL + 3** e vamos digitar **ggas** para gerar os Getters e Setters ter o seguinte:

imagem.

Para não ter que digitar tudo, o eclipse nos oferece a opção de autocomplete, quando digitamos `main` uma caixa com algumas opções vai se abrir, vamos escolher a primeira e apertar `enter`.  

O Main é ele que determina o ponto de início de execução da nossa classe.

![]

Com isto vai ser gerado nosso método main e vamos instanciar o desenvolvedor passando o nome e o endereço e vamos mostrar o nome do desenvolvedor. 

java

![]

# Para saber mais

As vezes esquecemos quais são os parâmetros que devemos passar no construtor, então vamos navegar para a classe Desenvolvedor com o atalho **ctrl + shift + t** e vamos digitar o nome da classe.

![]

Aparentemente parece ser um exemplo bem bobo, mas quando estamos em grandes projetos pode ser de muita ajuda e com isso conseguimos ver os parâmetros que devemos passar no construtor

# Conclusão

Como vimos o eclipse tem uma série de atalhos para nós ajudar durante o processo de criação de software.

Se ficou interessado em como o **Eclipse** funciona e como você pode utilizá-lo melhor, aqui na Alura [**temos um curso falando sobre o aumento da sua produtividade**] com o eclipse onde vamos aprender vários atalhos que irão facilitar sua maneira de trabalhar com o eclipse.




Tive a chance de conversar com a Paula Nakayama, Analista de SEO e instrutora do curso de acompanhamento de métricas em SEO do Alura. Ela nos deu algumas dicas que fazem toda a diferença para quem está começando e quer seguir carreira como analista SEO.

http://www.youtube.com/watch?v=wtE4-wonI9E

- Quais dicas você tem para quem começa agora e quer se especializar como analista SEO?

A primeira coisa que você precisa fazer para trabalhar com SEO, para ser um analista, é realmente encontrar um curso básico, no mínimo, que irá [**ensinar desde rastreamento dos robôs de busca ao trabalho**]. Hoje existem vários no mercado, não é difícil de achar algum que tenha a sua cara.

- É importante para o analista SEO entender de programação e design?

O trabalho de um analista SEO está muito envolvido com outras áreas. Para você conseguir ter uma boa atuação é importante saber um pouco de HTML e CSS, pois essas linguagens impactam diretamente no trabalho que estamos fazendo. O modo como elas são implementadas pode fazer total diferença no trabalho de SEO. Também existe a integração com trabalhos de UX, uma área que nos ajuda a tomar várias decisões ligadas à melhoria de usabilidade para atendermos melhor o usuário e deixar um pouco de lado o motor de busca.

- Então entramos num conflito, pois um mesmo recurso deve atender tanto o robô quanto o usuário.

No geral, o trabalho de SEO precisa estar focado no usuário, nunca será somente para um motor de busca. Porém, no melhor dos cenários, conseguimos atender os dois públicos.

- A primeira coisa que vem na minha cabeça quando penso em SEO é uma busca orgânica e aquilo que apresentamos para o usuário é muito importante. Isso influencia o trabalho do analista SEO?

Sim, influencia. E um do pontos ligados a isso é o conhecimento que o analista SEO deve ter de marketing, é saber falar com o público-alvo e conhecer o negócio da empresa em que estamos atuando para ter maior probabilidade de conversão.

Para quem quer se tornar um analista SEO, o diferencial, então, é fazer um curso, mesmo que básico, entender **HTML e CSS**, para saber como nossas ideias estão sendo implementadas. Precisamos nos preocupar também com a usabilidade e conhecer muito bem o mercado e o produto.

Pensando nesses detalhes a Paula criou junto conosco um curso sobre [**métricas e relatórios SEO**].




Tudo pode virar um verdadeiro caos se não souber se dividir entre criar, vender, entregar, testar e até gerir as atividades financeiras.

Se você se identificou com essa situação, deve saber que a proposta certa aumenta significativamente as chances de conquistar novos clientes e melhora sua credibilidade, já que evidencia o verdadeiro valor do seu trabalho.

Por isso, não deixe de conferir estas dicas que preparamos para você se destacar na sua próxima proposta de design!

## 1\. Converse com o cliente

Antes de mais nada, você deve conhecer as expectativas do cliente e do que ele precisa para aquele momento. Por isso, agende um encontro, seja no próprio escritório do cliente, em um café ou por [**videoconferência**], se necessário.

Ao consultar o site ou o blog da empresa, reúna um [**briefing**] com informações relevantes para a conversa, como missão, valores e área de atuação. Identifique também seus concorrentes, pois isso é importante para levantar os diferenciais competitivos.

## 2\. Identifique o público-alvo

Para elaborar uma proposta de melhoria, é preciso conhecer o estilo de vida do usuário final, observando pontos como faixa etária, gênero, trabalho, hábitos de consumo, etc. Considere também questões como suas preocupações, dúvidas e aspirações diárias.

Isso te ajudará a identificar quais são as características desejáveis para o seu projeto de design, como qual material a ser utilizado, a textura, formas, cores, etc. Esse apelo emocional permite [**criar uma experiência**] única, marcante e duradoura.

## 3\. Defina os requisitos

Para facilitar o direcionamento da sua proposta, entenda a dimensão do projeto solicitado pelo cliente. Por exemplo, um projeto de redesign pode ser inteiramente novo ou com ajustes mínimos. Isso inclui avaliar o porte da empresa e o impacto do projeto no ramo de atuação dela.

De acordo com a [**ênfase do projeto**], liste preliminarmente quais materiais e recursos estão disponíveis e quais serão necessários para atingir o objetivo final da proposta. No caso de uma identidade visual, deve-se considerar logotipo, cartão de visita, folders, entre outros itens.

## 4\. Estabeleça os prazos

O cronograma é essencial para organizar as tarefas necessárias à concretização da proposta, assim como para manter o cliente informado sobre o trabalho. Depois de descobrir os prazos disponíveis, o ideal é sempre acrescentar um tempo para prevenir qualquer imprevisto.

Além disso, o calendário também ajuda a determinar o valor do seu orçamento de design.

Projetos de maior impacto requerem planejamento e dedicação completa em etapas específicas. Logo, seu custo será mais alto. Estabeleça também um prazo de validade para a proposta, pois essas metas foram baseadas somente nas necessidades daquele momento em específico.

## 5\. Elabore o repertório visual

Os [painéis semânticos (mood boards)] organizam visualmente toda a pesquisa informacional, servindo de [inspiração para o desenvolvimento criativo] de uma nova proposta. Eles podem ser agrupados em: estilo de vida do público-alvo, expressão do produto, materiais, cores, produtos similares, entre outros.

Esses painéis também são uma ótima pedida para explicar didaticamente o conceito da sua proposta ao cliente. Você pode utilizar plataformas simples de colagens como [Canva], [Google Fotos], e [Pinterest].

## 6\. Apresente a solução ideal

A solução deve focar nas aplicações práticas, com ambientações de uso e projeções futuras. Reforce suas vantagens apontando estatísticas e cases de sucesso.

Para expor sua ideia ao cliente, vale desde apresentações bombásticas até um miniportfólio por escrito.

O objetivo aqui não é a complexidade: às vezes, para conquistar um cliente, basta uma capa simples com dados de contato e sua marca pessoal, mostrando que mesmo uma documentação pode parecer personalizada e profissional.

Existem [algumas plataformas] que você pode utilizar para criar sua apresentação. Avalie o perfil de cada cliente e trace estratégias compatíveis. Recomendamos que inclua além dessas informações: descrição breve do seu currículo, [**principais trabalhos**] naquele segmento e até o seu [**processo criativo**].

## 7\. Defina um orçamento adequado

O orçamento de design deve considerar aspectos como segmento da empresa, dimensão do projeto e prazos disponíveis. Reserve essa etapa para o final. Dessa forma, o cliente absorve primeiro o valor do seu trabalho em vez de ater-se somente aos preços.

Isso também evita que, durante a pressa, você se esqueça de considerar alguns detalhes importantes: despesas com materiais e recursos, custos adicionais com o tempo de pesquisa e até mesmo a assinatura de um [**banco de imagens**].

[Calcule a sua hora de trabalho] a partir da sua carga horária disponível. Inclua também o seu próprio nível de experiência com aquele tipo de projeto, pois isso determina a dificuldade em desenvolvê-lo. Depois de considerar esses itens, é só fazer um orçamento com base no tempo médio que você levará para concluir o projeto solicitado.

Sempre que possível, separe os valores de cada item solicitado pelo cliente, pois isso o ajudará a entender a base do cálculo final do orçamento. Para facilitar a sua organização, você pode separar também pacotes de serviços que oferece, por exemplo, identidade visual ou desenvolvimento de site.

## 8\. Determine um roteiro próprio

Cada designer tem a liberdade de construir uma proposta conforme suas exigências e foco do projeto, seja ele de produto, seja de interface ou gráfico. Por esse motivo, não há um roteiro universal para elaborá-la: é preciso realizar um trabalho colaborativo entre você e o seu cliente.

Saiba que passar o orçamento de design logo na primeira conversa não é uma estratégia recomendada. Isso porque, na ansiedade de fechar o negócio, você pode se esquecer de detalhes que posteriormente te deixarão em desvantagem.

Considerando que o cliente sempre tentará pechinchar ao máximo, cabe a você manter o orçamento consistente.

Procure não negociar preços abaixo da sua [própria tabela], pois eles podem te render trabalhos no curto prazo, mas podem também desvalorizar o seu esforço. Não se esqueça: parte da sua motivação vem da quantia que você vai receber.





O **jQuery** já foi tão utilizado, que algumas pessoas achavam que ele era uma linguagem diferente do **JavaScript** que rodava na web. Hoje em dia apesar de **frameworks como Angular, React, Vue** e outros estejam em alta, ainda existam muitos projetos que utilizam essa ferramenta e é bem provável que na empresa onde você trabalha, você possa precisar mexer em algum projeto que esteja usando essa biblioteca.

Nesse artigo vamos fazer um tour por alguns dos recursos mais importantes que o jQuery possui e que podem economizar muito tempo de [**stackoverflow**].

[imagem do jQuery

Se quisermos selecionar todos os **links** de um site, via jQuery precisamos somente escrever o seguinte código:

js

imagem** no jQuery possui vários super poderes, mas os mais utilizados no dia a dia são os de **selecionar** elementos e o de criar estruturas HTML.

js

imagem basicamente diz que queremos pegar o primeiro item dentro do **"objeto jquery"** que estamos trabalhando.

Sempre que fazemos o uso do `$()` para criar ou selecionar um elemento o resultado da função parece um array, mas na verdade o jQuery sempre retorna um objeto com vários itens em uma estrutura que chamamos de **array-like**, pois ele parece um array mas não possui recursos como **.map, .filter** e outras funções comuns para um array de verdade. 

Caso queira percorrer uma lista de elementos com jQuery, o correto é utilizar a **função `.each`** como no exemplo abaixo:

js

### Adicionando eventos com jQuery

Para adicionar um **evento de click** ou qualquer outro tipo para uma tag HTML, tudo o que precisamos fazer é um dos códigos abaixo:

js

Por padrão o código anterior vai adicionar o evento para todos os elementos da página, por isso já deixo aqui que também [é possível trabalhar com o conceito de **event delegation**] que é mais performático que o mostrado no exemplo anterior, e vai funcionar perfeitamente em casos onde você tenha elementos que sejam adicionados dinamicamente na página.

Um outro tópico, importante de tomar cuidado é que como todas as alterações são feitas de forma global, é importante criar "escopos" prefixando seletores por página, seja trabalhando via módulos ou alguma outra estratégia que julgar interessante. Eu particularmente acho bem interessante o formato que o [pessoal do BootStrap criou os componentes jQuery dele na versão 3 da biblioteca sempre utilizando data atributos] para não ficar preso nas classes do CSS.

## Como trabalhar com "componentes jQuery" no estilo React?

Hoje em dia com recursos mais modernos na linguagem JavaScript como a **`template string`**, é possível criarmos elementos dinamicamente de forma bem similar a como é feito no **React**:

<iframe height="265" style="width: 100%;" scrolling="no" title="jQuery: React Like" src="https://codepen.io/omariosouto/embed/oNNaLym?height=265&theme-id=default&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
</iframe>

O array que usamos poderia ser a **resposta de uma API** qualquer e tudo funcionaria normalmente.

### Selecionando elementos antes e depois de ter um previammente um selecionado

Se a partir de um elemento você quiser fazer um **filtro** mais específico se aprofundando nos elentos filhos, basta utilizar a função **`.find()`**:

js

Já se a partir de um elemento filho você quiser **selecionar o elemento pai com um nível voltando para cima no html**, você pode utilizar o `.parent()` ou se quiser selecionar todos os anteriores, basta utilizar `.parents()`

js

Caso você queira procurar a partir de um filho o pai mais próximo subindo até a tag html na raíz de tudo, você pode utilizar o .closest();

js

### Alterando atributos de uma tag

Como disse anteriormente, o jQuery é simplesmente uma casca em volta das funcionalidades padrão do DOM e para alterar atributos, ao invés de utilizarmos .getAttribute ou setAttribute, utilizamos a função .attr()

js

> Existem diversas funções específicas para lidar com atributos que podem ser super úteis como [**addClass**] e [**removeClass**], mas no geral o attr vai resolver boa parte dos problemas.

## Como fazer AJAX com jQuery?

### $.getJSON

Hoje em dia é super comum trabalharmos com APIs para pegarmos dados de diversos serviços e só então mostrar algo para o usuário, muito antes da [**Fetch API**] ser muito usada ou o próprio [**axios**], o próprio jQuery já possuía uma alternativa embutida com a lib que facilitava trabalhar com as requisições entre browsers. Se quisermos só pegar dados de algum serviço podemos executar o código abaixo

js

### $.ajax

js

> Se você já teve problema com [**CORS**] o jQuery possui uma forma bem legal de resolver isso somente passando no objeto que o $.ajax recebe essa combinação de chave valor `dataType: 'jsonp'`

## Solucionando problemas comuns com jQuery

Históricamente o jQuery possui diversas soluções para problemas comuns da web, segue abaixo uma listinha com alguns dos mais comuns que ele resolveu com libs que funcionam muito bem até os dias de hoje.

### Trabalhando com mascaras de campos com jQuery Mask:

Para trabalhar com **máscaras** no jQuery, sem precisar de **regex** ou algo do tipo, tudo o que precisamos fazer é adicionar a lib **jQuery Mask** e executá-las ao carregar de uma página web um ou mais dos códigos abaixo:

js

Os **patterns** aqui ficaram super bem abstraídos e você pode [ver como usar melhor acessando a documentação da lib aqui]

### Outras bibliotecas úteis

- [**SlickJS**]: Sem dúvidas é uma das bibliotecas mais completas quando o assunto é criar aquele famoso componente amado por vários clientes e não tão puplar assim com o pessoal de UX para fazer os Carrosseis tanto com imagens como com elementos.
- [**SweetAlert**]: Eu tenho certezae que várias vezes você já pensou "Como colorir o alert do navegador?" essa lib sem dúvidas é uma resposta para essa pergunta, relativamente leve e super completa é uma alternativa quando você precisa dar um feedback mais bonitnho para o usuário e por algum motivo isso não foi inicialmente planejado no sistema (já passei por vários casos assim).
- [**FitText**]: Essa lib eu recomendo para alguns casos específicos, mas no geral ela pode ser uma boa saída quando você está fazendo alguma página que tem um layout muito específico e cada elemento texto precisa ocupar exatamente a quantidade de linhas especificadas no layout, não recomendo como solução para todo caso, mas é sempre bom saber que existe algo para ajudar.
- [**ScrollMe**]: Sabe aqueles sites que enquanto você da scroll vão fazendo uma série de mágicas e vários elementos pipocam na tela? Essa lib ajuda justamente a fazer isso.
- [**Parallax.JS**]: Quem já trabalhou em agência sabe que esse é o top 1 efeito solicitado e que da arrepios na espinha quando você vê alguém discutindo sobre ele, o tal do parallax. Essa lib tem uma solução bem legal e usei em vários projetos no passado
- [**ScrollMagic**]: Já acessou sites tipo o de campanhas de produtos novos da apple com diversas coisas surgindo como se fossem um filme e se perguntou como aquilo é possível de ser feito via Scroll? O scroll magic é uma lib que resolve justamente esse tipo de site e usa o jQuery. E caso você queira uma outra referência deixo a lib [**Skrollr**] que também resolve legal esse tipo de site.

## Conclusão

Mesmo com o uso da biblioteca não sendo mais tão popular assim em projetos novos, o jQuery possui um pacotão de soluções para facilitar a vida em diversos casos, seja para trabalhar com manipulação de elementos, ajax e até mesmo resolver diversos problemas comuns da web relacionados a **validação e componentes interativos**.

Ainda me arrisco a falar que em diversos casos onde você só precisa fazer uma coisa simples ele pode ser uma boa saída, ao invés de utilizar um framework JavaScript do momento. E caso você queira mais dicas sobre o mundo do Front End, da uma olhada na minha série aqui na Alura [**Fronteiras do Front End**]

E ai quer conhecer mais sobre o jQuery ?? Aqui na **Alura** temos uma [**Formação Front-end**] onde além de aprender HTML, CSS e JavaScript, você ainda vai aprender muito mais sobre o [**jQuery**]

Por hoje é isso, espero que tenha gostado, em breve trarei mais dicas sobre diversos outros tópicos relacionados a Front End, não deixe de me seguir nas [minhas redes sociais] e acompanhar meus outros artigos em meu site pessoal [https://mariosouto.com].




imagem 

Vamos imaginar uma empresa como o [Nubank], seu nome é ByteBank. A primeira vista ela vende cartões de crédito e possui uma estratégia de marketing de conteúdo para seus clientes (Business to Consumer, B2C).

Agora ela está lançando um novo cartão focado em empresas e quer criar uma estratégia de marketing de conteúdo para outras empresas (business to business, B2B).

Como eles podem criar essa estratégia? É possível utilizar ideias e ferramentas do marketing de conteúdo B2C para o B2B?

No marketing de conteúdo criado para B2C da ByteBank é muito enfatizado que as principais vantagens da empresa são:

- saber o limite na hora;
- não pagar qualquer tarifa e
- não ter que lidar com burocracia na hora de fazer o cartão.

Então, todo o plano é focado em criar conteúdos sobre questões relacionadas ao mundo financeiro, para mostrar que a empresa é especialista no assunto, transmitindo uma confiança aos clientes.

A equipe de marketing escreveu um texto no qual foram explicadas todas as taxas do cartão de crédito. Depois de explicar com detalhes o que é cada taxa, foi mostrado o porquê do cartão dessa empresa não cobrar nenhuma delas.

Para mostrar na prática o quanto o consumidor economizaria, eles deram como um exemplo que mostram o que pode ser comprado com o dinheiro economizado em tarifas do cartão. Veja como ficou o texto:

> Se a tarifa é de 30 reais por mês, depois de um ano: 30 (tarifa) \* 12 (meses) = 360, você gasta R$ 360,00 só em tarifas! Não seria muito melhor comprar um Kindle ou dois jogos para Playstation 4 ou, até mesmo, ir uma vez por mês ao cinema (e pagando inteira) com esse dinheiro em vez de pagá-lo em tarifas?

Será que se pode fazer a mesma coisa para o B2B, já que não existem tarifas para empresas também?

As empresas que querem comprar um produto precisam avaliar muito bem toda a compra, sempre se perguntando se aquele produto realmente compensa para ela, principalmente a longo prazo.

Então, e se fosse dito coisas que a empresa poderia fazer com o dinheiro que também vão trazer um retorno financeiro, ao contrário das taxas dos bancos? Como fazer pesquisas com usuários, desenvolver novos produtos, treinar pessoas para marketing, entre outras coisas?

Pensando nessas diferenças, utilizamos o mesmo exemplo: quanto seria economizado por ano pela empresa cliente. Porém, no texto inteiro, queremos também mostrar dicas de como ela pode poupar, de diversas maneiras, mesmo usando um cartão de crédito. Então, o exemplo de economia no texto ficou assim:

> Pensando que a tarifa para empresas é mais barata que para pessoas físicas, ou seja, de 30 reais, passa a ser 10 reais por cartão para cada colaborador, e dez cartões serão feitos, cada um pertencendo a colaborador, depois de um ano, serão pagos: 10 (de tarifa) \* 10 (quantidade de cartões) \* 12 (meses do ano) = 1200.
> 
> Assim, a organização gastaria R$ 1.200,00 para manter os cartões durante esse período. Agora, se os cartões não possuem tarifa nenhuma, em vez de pagar esse valor, a empresa economizará R$1.200,00.
> 
> Agora, com essa economia, você poderia investir em treinamentos ou eventos, que, após um tempo, poderiam aumentar ainda mais o retorno da empresa.

Foi usada uma linguagem mais formal do que a B2C porque quando estamos lidando com empresas temos que ser mais práticos e mostrar exatamente o que a empresa ganha, e, no caso, até como poderia ganhar mais depois.

Além dessa mudança na linguagem, tivemos ideias diferentes de conteúdo. No B2C foram apresentados conhecimentos a respeito de cada taxa, para que a pessoa entenda o que está pagando e confie em empresas que não cobra as taxas.

Agora para B2B foram apresentadas formas para economizar no cartão, pois, muitas vezes, os empresários sabem o que é cada taxa do cartão e tem que utilizá-lo mesmo assim. Então, mostramos como ele pode economizar e, uma dessas formas, é usar o cartão da ByteBank.

Nesse mesmo texto para B2B também acrescentamos o conteúdo de outra vantagem do cartão: poder determinar um limite de gastos para cada categoria nos cartões dos funcionários da empresa.

Dessa forma, os funcionários não podem gastar mais do que o determinado e, assim, a empresa consegue economizar e planejar os gastos e não extrapolar com compras dos funcionários.

O foco da comunicação B2B que utilizamos foi dar dicas para não cometer erros e economizar mais, para que a empresa perceba que utilizar o cartão é vantagem.

E caso a sua empresa seja diferente da ByteBank, seja só B2B e não tenha nenhum plano de comunicação focado para B2C para se basear?

Existem diversas empresas B2B:

- as que vendem tanto para B2B quanto para B2C, como a ByteBank;
- as que vendem para ambos os consumidores, mas possuem um foco maior no B2B, como a [Marmotex], que tem como serviço entrega de marmitas e entregam tanto para consumidores quanto empresas, mas possuem um foco maior em organizações e [catering] [] para eventos, ou seja, B2B
- as empresas somente B2B, como as de agências de publicidade.

Cada uma das empresas que são B2B possui um produto e um serviço para mostrar.

Então, caso você trabalhe em uma empresa que não possui um plano de marketing de conteúdo para B2C para se basear, [é só seguir a ideia do marketing de conteúdo], de passar informações relacionados a sua empresa, tornando-a uma autoridade no assunto. E, além disso, mostrar maneiras que o seu produto e/ou serviço pode ajudar a empresa em determinado tema.

No B2B, como no marketing de conteúdo focado no B2C, é importante frisar a importância e a relevância do produto e/ou serviço para o cliente. E, melhor, a longo prazo.

A empresa cliente precisa entender e saber que a vantagem trazida pelo produto será duradoura. Pois o processo de compra B2B é mais longo justamente porque há muito em jogo e muitas pessoas envolvidas.

Mudar de produto ou serviço é trabalhoso e pode causar prejuízo para a empresa, assim, eles buscam e precisam de garantias de que a solução funcionará por muito tempo.

Assim, como no marketing B2C, os tipos de conteúdo devem se atentar aos clientes em [cada fase do funil de marketing de conteúdo] para trazer o conteúdo certo para a empresa em cada momento da obtenção do cartão.

Para isso, a Bytebank utilizou dados, números, infográficos e mostrou com exemplos práticos maneiras de ajudar a contratante. Também escreveu conteúdos com histórias de empresas - os chamados _cases_ de sucesso - que obtiveram lucro ou sucesso com o produto/serviço.

Além disso, apresentou novidades e dicas tanto da sua empresa, que passou a fornecer uma conta para pessoas físicas e jurídicas, quanto do segmento dela, com informações que podem ser úteis ao cliente do setor financeiro.

Como vimos, as principais diferenças entre os conteúdos B2C para o B2B são a linguagem, que deve ser mais formal se for B2B e apelar para o emocional se for B2C.

No B2B você estará lidando com pessoas que tomam decisões nas empresas, então deverá mostrar como o produto pode ajudar a empresa, de preferência a longo prazo.

Fora isso, o tipo de conteúdo pode ser o mesmo do marketing de conteúdo B2C. Passando desde textos sobre novidades, inovações e dicas na área, até infográficos com dados de pesquisas, vídeos, áudios de podcast, imagens e publicações nas redes sociais.

Também, para conteúdo B2B, é muito comum encontrar whitepapers, grupos de usuários, meetups, cases de sucesso, trial gratuito, e até mesmo vídeos ou campanhas e posts de marketing com influenciadores.

Agora, se você quiser saber mais sobre marketing de conteúdo, pode fazer nosso [**curso de Marketing de Conteúdo**] e, também, conferir mais informações no livro da Casa do Código, [**Marketing de Conteúdo: Estratégias para entregar o que seu público quer consumir**].





imagem 

Se você é um **desenvolvedor Android experiente**, não é novidade que o SDK do Android não opera com as versões mais recentes do Java, em específico, atualmente temos 100% de compatibilidade com a versão 7 do Java.

Isso significa que [**as features legais que temos no Java 8**] ou mais, por padrão, não estão disponíveis!

Como uma alternativa, a própria comunidade desenvolveu libs capazes de trazer um pouco da experiência do Java 8 no Android, como é o caso do [**Retrolamba**] que permite o uso de expressão lambda para interfaces funcionais (Single Abstraction Method).

## Jack toolchain e o desugar

Com base no interesse da comunidade, a própria equipe da Google disponibilizou o _[**Jack**]_ (Java Android Compiler Kit), também conhecida como _Jack toolchain_, como uma alternativa experimental, para possibilitar algumas features do Java 8 'nativamente'.

Mesmo tendo uma proposta boa, a configuração via _Jack toolchain_ não era das melhores, como também, haviam outros [**impactos**] que o depreciaram :(

Então, a partir da versão 3.0 do Android Studio, a Google otimizou essa solução adicionando uma etapa a mais na transformação de bytecode chamada _desugar_:

![]

O desugar opera logo depois do código ser compilado pelo próprio compilador do Java, possibilitando o uso das features do Java 8 mesmo tendo a limitação de versão.

## Habilitando o Java 8 de maneira

Para habilitar as features do Java 8 com o desugar, precisamos apenas adicionar o seguinte script no arquivo de build do módulo:

java

Pronto, somos capazes de usar as features do Java 8 disponibilizadas.

> "Legal, mas em quais situações posso usufruir das features do Java 8?"

A mais comum está relacionada às interfaces funcionais, como é o caso de listeners, por exemplo, um listener de clique com expressão lambda fica da seguinte maneira:

java 

Comparando com a maneira 'tradicional':

java 

Bem mais simple, né?

## Limitações com o uso do Java 8

Entretanto, nem todas as features estão acessíveis para qualquer versão de SDK do Android, mas não fique triste, abaixo estão as features disponíveis em quaisquer versões:

- [Expressões lambda];
- [Referências de método];
- [Anotações de tipo];
- [Métodos de interface padrão e estáticos];
- [Repetição de anotações].

Da mesma forma, existem outras APIs, como é caso da classe [**Stream**], que só são suportadas quando utilizamos a versão 24 como SDK mínimo. Outro caso são as classes do pacote [**java.time**] que exige a API 26.

De qualquer forma, é possível verificar os pacotes acessíveis [**diretamente pela documentação do Android**]. Agora vem a questão:

## Vale a pena habilitar o uso do Java 8 no ambiente Android?

Caso o seu objetivo são features são suportadas por todas versões de SDK do seu projeto, faz muito sentido usufruir do Java 8.

Agora, se tiver que modificar o suporte mínimo, não é recomendável a mudança, afinal, você **vai deixar de atender mais usuários por algo que não trás tanto valor para o produto final**.

> "Puts, eu queria muito ter acesso à API do `Stream` ou `LocalDate`, mas não posso aumentar o suporte mínimo do SDK, e agora?"

Existem algumas libs que podem ser adicionadas, como é o caso da [**Lightweight-Stream-API**] e a [**joda-time**]. É importante ressaltar que elas possuem uma interface similar às do Java, mas a implementação pode ter diferenças, como a ausência de processamento paralelo.

## Abrindo portas para o Kotlin

Muito provavelmente, você já ouviu falar sobre a [**linguagem Kotlin**] para desenvolver Apps Android.

A partir dela, temos suporte a expressão lambda, métodos padrões de interfaces entre outras features que não existem na própria linguagem Java, como é o caso de extensão de função, funções de alta ordem entre outras que vemos [**formação desenvolvimento mobile**].






imagem 

Imagine que você está tentando fazer o download de um arquivo e se depara com esta situação:

imagem, deixa claro que você efetivamente realizou a ação de se inscrever e foi incluído na lista, assim como os 255 inscritos antes.

Tanto em Apps quanto em sites, existem detalhes que poderiam facilitar muito a compreensão das funcionalidades de nossos sistemas. Porém, costumamos negligenciá-los acreditando que são pontos tão pequenos que não demandam tanta atenção.

**Grande erro!**

Pensar em como extrair dos nossos Apps ou sites elementos para uma melhor experiência de usuário é muito importante. Ao criar uma boa experiência, teremos chances muito maiores de [**engajar nossos usuários**].

Mas quais os limites para as microinterações? O que posso considerar como um detalhe relevante de ser trabalhado?

## Criando microinterações

As microinterações podem acontecer desde o botão que liga ou desliga uma funcionalidade até um som de mudança de estado, como no caso do botão "curtir" do Facebook, apontado anteriormente.

É importante alinhar bem quais as funcionalidades (ou **regras**) do seu sistema, antes de mais nada, verificando quais as interações já existentes e como melhorá-las.

Com tudo isso alinhado, podemos definir quais serão os **gatilhos** para cada microinteração, se são cliques, gestos ou qualquer outro tipo de ação.

Depois de ativada, a microinteração gera **respostas** (sejam de confirmação ou erro), notificando o usuário do que aconteceu. Esta é uma boa prática para evitar que o usuário se sinta desorientado enquanto utiliza o aplicativo, reforçando que cada ação foi acionada.

E, por fim, temos que considerar os momentos em que o usuário será notificado para realizar uma ação, criando **ciclos de interação** e evitando que fique muito tempo sem utilizar nosso App (ou site).

Ou seja, seguimos algo como:

imagem

Quer também entender um pouco mais de práticas e conceitos de usabilidade? Na Alura temos um curso bem legal de [**UX Usability**] falando um pouco de prototipação e conceitos da [**Heurística de Nielsen**] de usabilidade.




Recentemente alteramos o Design da **seção interna** (onde os alunos fazem os cursos) da [Alura], sem criar novas funcionalidades. Mas infelizmente acabamos nos esquecendo de colocar o botão de editar um post no fórum do Alura.

imagem

Esquecemos do botão editar no fórum da Alura.

Esquecer do botão de editar não foi um erro só nosso.
Eu não me esqueço quando eu estava utilizando o app do Facebook e adicionava um comentário com algum erro. Eu tinha que correr pra versão desktop pra conseguir editar o comentário (tristeza no coração).

Se a gente for pensar, é um erro bem simples de resolver e também de esquecer de implementar. Pensando nesses problemas o **grande pai da usabilidade**, [Mr. Jakob Nielsen] criou o que chamamos de **10 heurísticas de Nielsen**, algo que vemos bastante no [curso de UX presencial da Caelum]. Bora entender cada uma delas pra ver se a gente consegue errar um pouco menos. 🙂

* Visibilidade de qual estado estamos no sistema
* Correspondência entre o sistema e o mundo real
* Liberdade de controle fácil pro usuário
* Consistência e padrões
* Prevenções de erros
* Reconhecimento em vez de memorização
* Flexibilidade e eficiência de uso
* Estética e design minimalista
* Ajude os usuários a reconhecerem, diagnosticarem e recuperarem-se de erros
* Ajuda e documentação

# 1. Visibilidade de qual estado estamos no sistema
É responsabilidade do sistema informar o que está acontecendo em real time pro usuário.

Quando estamos assistindo/ouvindo uma playlist do Youtube, do lado direito fica bem claro: qual vídeo estamos assistindo; qual é próximo; quais assistimos ou não.

imagem

# 2. Correspondência entre o sistema e o mundo real
Em relação ao **mundo real** podemos considerar: sons, visual e o tom de escrita que usuário utiliza para se comunicar. Implementamos bastante esta heurística quando utilizamos uma seta, ícones e utilizamos a cor vermelha para elementos negativos.

Um software que usa essa heurística é o Photoshop em sua barra de ferramentas.

imagem

# 3. Liberdade de controle fácil pro usuário
Essa foi a heurística que me motivou a fazer esse post. Nesta heurística, a preocupação é de passar pro usuário a liberdade de ele fazer o que quiser dentro do sistema com exceção das regras que vão contra o negócio ou interferem em outra funcionalidade.

Por exemplo quando criamos um tweet é bacana poder deletá-lo se estivermos afim. Mas não dá pra editar um tweet. Imagina se você dá um retweet e depois o usuário que fez o tweet muda o texto pra uma coisa que você não acha legal. Sacanagem né!

imagem

# 4. Consistência e padrões
É importante manter a consistência e padrão visual (texto, cor, desenho do elemento, som e etc).

Por exemplo, no fórum [GUJ](Grupo de usuários Java), quando vamos responder um post, o botão para enviar a resposta sempre é da mesma cor, tamanho e texto. O elemento para cancelar a resposta sempre tem seus padrões:

imagem

# 5. Prevenções de erros
Não é uma boa ideia deixar seu usuário errar sem explicar previamente o motivo do erro. Melhor do que isso, tente criar um interface que permite o usuário não errar.

A busca do Google faz isso de uma forma muito inteligente. No momento que começamos escrever nossa busca ele já te entrega algumas sugestões, mesmo se a gente escrever a busca com uma ortografia errada ele realiza a busca e pergunta se estamos procurando outra informação com a ortografia correta.

Realizando uma busca no Google:

imagem

Resultado da busca com erro de ortográfica:

imagem

# 6. Reconhecimento em vez de memorização
O usuário não tem obrigação de decorar qual foi o caminho que ele fez pra chegar até a página.

Por exemplo, quando você entra em um produto do site da Locaweb é disponibilizado o caminho que você fez pra chegar até ele. Nós chamamos isso de *breadcrumb*.

imagem

# 7. Flexibilidade e eficiência de uso
É importante deixar uma experiência boa com seu sistema desde o usuário mais leigo até o mais avançado.

Por exemplo, dentro do Trello (kanban de tarefas online com base em colunas free) quando você está com o foco em um cartão você pode utilizar o mouse para navegar em outros cartões, as teclas direcionais (setas pra cima e pra baixo) ou as letras j (para baixo) e k (para cima). Teclas que são por sua vez utilizadas no VIM, editor de texto famoso entre os desenvolvedores.

imagem

# 8. Estética e design minimalista
Por favor não encha linguiça. Toda informação extra que você deixar pro seu usuário pode na verdade adicionar mais uma dúvida, ou seja, deixe o seu layout e o conteúdo o mais simples e direto possível.

Um app que gosta muito dessa heurística é o da Nubank. Pra gerar o boleto de pagamento da sua fatura só são necessárias duas telas e elas são bem simples e realmente objetivas.

imagem

imagem

# 9. Ajude os usuários a reconhecerem, diagnosticarem e recuperarem-se de erros
As mensagens de erros tem que ser claras e próximas do conteúdo ou ação que causou o erro.

No formulário de cadastro do Spotify, caso você não preencha os dados necessários ele deixa bem claro quais campos estão faltando, com um mensagem clara e objetiva.

imagem

# 10. Ajuda e documentação
É uma boa não precisar dessa heurística. Implementar documentação e sistema de ajuda sempre é chato e muitos usuários têm o costume de ignorar ambos mas, se for realmente necessário, deixe a documentação próxima do usuário e do elemento ou ação que tenha necessidade de uma explicação mais detalhada.

Por exemplo, no formulário de pagamento do Walmart tem um campo pra preencher o código de segurança do cartão. Como não é algo muito óbvio, tem uma imagem próxima ao campo mostrando onde fica o código de segurança do cartão. Essa é uma boa forma de fazer uma documentação feliz.

imagem

Com o erro que cometemos no novo layout do Alura vimos que é uma boa passar pelas 10 heurísticas de Nielsen antes de subir um novo layout. Em que momento você acha bacana utilizar as heurísticas no seu projeto?





imagem 

Uma editora de livros possui em seu site uma página de fale conosco para melhor atender os seus cliente. Nesta página foi criado um formulário com nome, endereço e telefone.

O problema é que o campo de telefone está sem formatação permitindo que o cliente digite quantos números quiser. Com isso o campo pode receber um número como:

imagem, retornando somente aquele trecho que escolhemos.

Como vamos dividir a sequência de números em duas partes, criamos duas variáveis que vão receber essas partes e uma outra que será responsável por formatar os números:

- const parte1, que vai pegar a primeira posição até a posição 5
- const parte2, que vai pegar da posição 5 até a última posição
- textoAjustado, que vai interpolar o resultado das duas variáveis com o traço

js

Com o código pronto temos o seguinte resultado : ![]

Ótimo! Conseguimos fazer a formatação que queríamos. Agora, com lógica pronta precisamos encontrar uma maneira de disparar essa função toda vez que o cliente tiver digitado o telefone no campo.

## O evento onblur

O [**evento blur**] é acionado quando um elemento perde foco, ou seja logo após o cliente ter digitado o telefone e clicar em outro campo, o evento `onblur` é disparado chamando nossa função e realizando a formatação do telefone.

Passamos o `this` como parâmetro da função, para dizer que o parâmetro está dentro do contexto da nossa função.

html

## O evento onfocus

Com a função pronta, vamos uni-la ao [**evento onfocus**], que será responsável por disparar nossa função enquanto o campo do `input` estiver em foco.

html 

Como vimos as validações são sempre problemas complexos devido as inúmeras possibilidade de interação do usuário.

## Para saber mais

Outra possibilidade de fazer nossa formatação seria através das [**expressões regulares**], que nada mais são que combinações de caracteres que utilizamos para selecionar outros caracteres em strings.

No nosso caso poderiamos utilizar a seguinte expressão regular para formatar o número do celular por exemplo:

js 

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na **Alura** temos uma [**formação em Javascript**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, dentre outras muitas coisas.




Quero o nome, o preço e a categoria de um produto:

sql

Executo a **query** e por muitas semanas ela funciona lindamente em produção. Até que um dia o site começa a ficar lerdo... lerdo... lerdo... Mas local, funciona que é uma beleza.

Mas calma lá, eu disse que queria nome, preço e categoria, e eu - de maldade - abreviei a resposta lá em cima:

sql

O que eu fiz? Só quero nome, preço e categoria, mas estou trazendo tudo! Antes o produto não tinha campo descrição, e agora ele tem!

Imagine que tenho um banco pequeno, com 20 mil produtos. Cada produto tem um nome de 100 caracteres assim como a categoria. Isso quer dizer que eu queria transferir do HD do meu banco para a minha máquina cerca de 20000 \* 200 = 4 megas.

Mas na verdade eu fiz um `select *`!

Selecionei todos os campos! Se cada descrição completa de um produto tem 10 mil caracteres por causa do sumário do livro, temos então 20 mil produtos, cerca de 10 mil caracteres em cada um: 200 megas!

Boa sorte tirar tudo isso do seu HD. Boa sorte levar tudo isso pela rede de uma máquina para outra. Boa sorte construir as Strings em memória que representam estes valores.

`select *` é perigoso por diversos motivos. O consumo de memória e banda é só um deles... pense a longo prazo: se o banco mudar você vai trazer mais coisa do que queria, e esse mais coisa talvez seja demais.

sql

Novamente, com poucos caracteres, em determinados cenários, você muda completamente a eficiência de um banco de dados!

Gostou dessas práticas e dicas de [**SQL**]



Precisei entender as diferentes formas de arredondar e formatar números no **JavaScript**, prestei serviço a uma empresa que gostaria de saber quanto está pagando por hora de salário. Para isso, existe uma função que pega o salário do mês e calcula o custo hora:

js

Resultado da função:

js 

O valor por hora do salário seria: `17.045454545454547`. Mas, como estamos falando de um valor monetário, esse número deveria ter apenas duas casas decimais. Isto é, o que queremos é arredondar esse resultado para reduzir as casas decimais.

Como estamos utilizando o JavaScript, já existe um método da classe `Math` que arredonda os números, a **Math.round()**.

## Usando Math.round()

js 

Resultado da função, agora utilizando `Math.round()`

js 

O valor da resposta foi 17, já resolvemos o problema das várias casas decimais , mas ainda não está muito preciso.

Isso ocorre porque o método `Math.round()` retorna o valor de um número arredondado para o inteiro mais próximo.

## Formatando o resultado com ajuda do método toFixed()

Como estamos trabalhando com dinheiro é importante saber também os centavos, com o auxílio do método **.toFixed()** eu consigo controlar o número de casas decimais após a vírgula, de forma mais simples, indicando o número de casas que eu quero como parâmetro.

Como queremos deixar a resposta com duas casas decimais após a vírgula utilizamos`toFixed(2)`, um ponto importante de se observar é que o método `.toFixed()` arredonda o **número para cima**, isto é, se temos, por exemplo `11.123`, o valor fica `11.12`, já se temos `20.555`, o valor fica `20.56`. Outro ponto importante de se observar é que seu retorno será uma **string** representando o número.

js

Agora que deixamos o resultado da função com duas casas decimais, que tal deixar o resultado formatado na nossa moeda, o real ?

## Formatando o resultado para Real

No JavaScript temos um método chamado `toLocaleString()` que converte um número para uma string, já tratando a questão do arredondamento e convertendo para a moeda do país que queremos, no nosso caso, o real, tornando a tarefa do programador muito mais simples.

O método **toLocaleString()** recebe alguns argumento - um objeto literal com as propriedades -, no meu caso eu utilizei:

- `style` : Que é o estilo do formato a ser utilizado, aqui é permitido usar:
    
    - `decimal` para representar números simples.
        
    - `currency` que diz respeito ao formato monetário e que vai indicar a moeda que vai ser utilizada.
        
    - `percent` para formato percentual.
        
- `currency`: A moeda para usar na formatação monetária
    

js 

Utilizando a formatação do `toLocaleString` o resultado ficaria assim:

js

## Para saber mais

No JavaScript temos outros métodos que podem ser utilizadas para o arredondamento como:

- **Math.ceil()** que retorna o maior número inteiro que é maior que o número passado, por exemplo `Math.ceil(11.123`), o valor fica `12`
    
- **Math.floor()** que retorna o menor número inteiro que é menor que o número passado, por exemplo `Math.floor(11.789)`, o valor fica `11`
    

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**Formacao Front-end**]. Nela, você verá como programar em Javascript, utilizar expressões regulares, entre outras coisas.


 


imagem 

Um cliente pede a produção de um layout para blog e, na entrega final, as áreas de textos ficaram assim:

imagem


Repare que quando olhamos para este resultado temos um desconforto na leitura dos textos. Por que será que isso acontece?

A **fonte** muito clara em fundo branco, os buracos ao longo do texto, e mesmo as entrelinhas muito estreitas, geram uma dificuldade de leitura e, consequentemente, não nos sentimos motivados a ler o conteúdo da página.

Então, o que poderíamos fazer para melhorar essa página, pensando em usabilidade e legibilidade? Confira algumas dicas essenciais para fazer essas mudanças.

# 1. As cores e fontes corretas
O primeiro passo a considerar é se os textos estão **legíveis**, considerando alguns fatores como:
- Contraste de cores entre plano de fundo e texto;
- Tamanho da fonte;
- Tipo de fonte utilizada.

No layout anterior temos um texto com fonte **muito clara** sobre um plano de fundo igualmente claro. Isso gera um baixo contraste entre os dois elementos e torna difícil a distinção dos caracteres e palavras, comprometendo a leitura, como podemos notar neste fragmento do layout:

imagem



Ao passo que, a simples alteração da cor para uma outra um pouco mais escura, ou mais contrastante, seria o suficiente:

imagem

Outra questão é o **tipo de fonte** . Em qual das opções abaixo você acredita ser mais confortável a leitura?

imagem
imagem


No segundo exemplo, onde temos uma fonte mais básica, **sem serifa**, a leitura fica muito mais fácil. Isso porque, a menos que sejam frases curtas, utilizar fontes mais trabalhadas (com muitos detalhes, cursivas, etc) nos gera um maior esforço para ler grandes blocos de texto.

Devemos ter cuidado no momento da [**escolha da fonte**], pensando sempre na forma com a qual ela será aplicada, ou seja, se será utilizada em grandes blocos de texto, em títulos, com plano de fundo claro ou escuro, etc.

# 2. Espaços em branco
Um erro comum e que faz muita diferença no resultado final é pensar nos espaços em branco do layout.

imagem
imagem

Perceba que no primeiro exemplo quase não temos espaço entre os elementos e, no segundo, ao inserir os espaços, temos um respiro maior que gera também uma melhor compreensão.

Sem estes espaços, podemos dificultar a visualização geral do conteúdo, que não terá priorização. Separando adequadamente cada elemento, diminuimos o ruído visual e tornamos mais fácil a leitura.

Estes espaços não são simplesmente adicionandos como vazios aleatórios para distanciar um elemento do outro. Mais do que isso, os **espaços em branco são parte integrante do layout**.

Essa dica vale também, no caso dos textos, quando pensamos em entrelinhas.

Entrelinhas muito espaçadas ou muito estreitas, como no exemplo apresentado no post, causam uma sensação desagradável para a leitura.

imagem

Note que, no segundo exemplo, a leitura fica muito mais fluida.

Contudo, mesmo com essa mudança, percebemos que ainda há alguns espaços no texto que causam um desconforto na leitura. Estes são os espaços em braco indesejáveis, que ao invés de auxiliar na usabilidade, acabam deixando tudo mais complicado. E como resolver essa questão?

# 3. Alinhamento de texto
Existem 4 tipos de alinhamento possíveis para a web: **à esquerda, centralizado, à direita** ou **justificado**.

No layout que analisamos, o alinhamento está como justificado, isto é, busca-se preencher todas as linhas de texto de uma ponta a outra.

imagem

Porém, note que este **alinhamento** cria diversas lacunas ao longo do texto, já que, diferente dos textos impressos, os textos na web não se ajustam muito bem ao formato das caixas de texto, portanto, podem não ser uma boa escolha para utilizarmos.

Quanto ao alinhamento à direita e centralizado, temos novamente um problema na leitura de textos mais longos, já que nestes dois casos temos mais dificuldade de identificar o início e fim das linhas, tornando a leitura mais cansativa.

imagem

O ideal para estes dois casos é que sejam usados principalmente em pequenos textos.

Por fim, temos o alinhamento à esquerda:

imagem

Note que, além deste ser o alinhamento mais comumente utilizado, baseado no nosso sistema ocidental de leitura, da esquerda para a direita, o texto fica muito mais fácil de ser lido e não causa um desconforto para o usuário que lerá longos blocos de texto na página.

# 4. Tamanho das caixas de texto
Outro ponto importante a ser observado no layout é o tamanho que atribuímos às áreas de texto.

Caixas de texto muito largas, por exemplo, dificultam a leitura, uma vez que a orientação do olhar se perde mais facilmente ao percorrer linhas muito longas.

Da mesma forma, caixas muito estreitas causam um estranhamento ao quebrar os textos em pequenas frases, que tornam a leitura muito menos fluida.

imagem

Para não cair neste problema, evite caixas muito largas ou muito estreitas, distribuindo o texto em larguras mais confortáveis de ler e variando o tamanho dos elementos de texto, para criar um layout mais limpo e agradável de ler.

imagem

Ao adaptar nosso exemplo anterior, conseguimos agora uma aparência muito mais convidativa para leitura e, consequentemente, fomos mais eficientes quanto a usabilidade.

# 5. Hierarquia de informações
Até então, as dicas apresentadas foram basicamente para melhorar a usabilidade, no sentido de deixar a apresentação visual mais confortável para leitura, ou seja, trabalhamos com as questões de legibilidade.

Agora vamos fazer com que as informações contidas em nossos textos estejam adaptadas para, ao escanear uma página, o usuário ter o olhar guiado segundo uma ordem de priorizações que criaremos com a utilização de recursos simples: **tamanhos e cores de fonte**.

imagem

Veja que, inserindo cores para diferenciar links de texto e alterando o tamanho das fontes como **título, subtítulo e o corpo do texto** conseguimos diferenciar com mais facilidade cada campo.

Portanto, orientamos a leitura do usuário, deixando claro o que queremos indicar em cada parte do nosso **layout**.

# Conclusão

Ao aplicar as dicas apresentadas neste post você facilita ao usuário a leitura das suas páginas, eliminando alguns dos problemas mais comuns de usabilidade em textos da web.

Devemos, então, encarar o texto não apenas como o conteúdo da página, mas como uma interface de usuário, que influenciará, e muito, na usabilidade e legibilidade.

Para entender um pouco mais de textos e fontes para a web, a **Alura** tem um [**curso muito legal de Tipografia para web**], que além de tudo fala um pouco dos erros comuns neste tema e como podemos evitá-los. 😉




A tendência natural de um potencial comprador é visitar as primeiras páginas que surgem nas pesquisas que faz. Elas estão lá por algum motivo e, naturalmente, inspiram credibilidade.

Um bom **posicionamento em buscas tem o potencial de atrair um número muito maior de pessoas interessadas naquilo que está sendo oferecido**. Mais oportunidades de negócio são geradas a partir da aproximação que as diversas ações de marketing de conteúdo proporcionam.

Marketing de conteúdo e SEO andam de forma muito próxima, e uma estratégia digital assertiva jamais pode descuidar de otimizar o site da empresa.

No post de hoje vamos falar sobre essa relação inevitável e extremamente importante, mostrando como um contribui para o outro, e como um bom SEO é o caminho certo para sua empresa conquistar espaço no ambiente digital. Confira!

## O que é SEO e qual sua importância?

Podemos definir **SEO (Search Engine Optimization)** como uma série de aprimoramentos no código e no conteúdo de um site visando que ele seja encontrado mais facilmente e melhor avaliado por algoritmos de mecanismos de busca.

Uma otimização eficiente posiciona o objeto de análise no topo das páginas de resultado (um bom ranqueamento), podendo chegar até mesmo na primeira colocação. Quanto melhor for o ranqueamento, maior a chance de conquistar o clique do usuário.

## Por que otimizar um site para mecanismos de busca?

O marketing é um campo de trabalho que deve estar sempre atento às mudanças nas relações entre empresas e mercado consumidor. A mais relevante dos últimos tempos teve a internet como responsável e criou todo o segmento digital, já em estágios muito desenvolvidos.

A disseminação intensa de informações mudou parte da dinâmica do marketing. Além de serem valorizadas abordagens mais sutis de aproximação ao usuário, uma das grandes prioridades de uma estratégia passou a ser o destaque: seja o que se dá a um negócio ou a seu conteúdo, em meio a uma infinidade de informações em toda a web.

Os atuais consumidores priorizam a pesquisa online antes de tomar uma decisão de compra. É por isso que, posicionar bem um negócio em uma pesquisa, influencia diretamente na tendência do cliente em potencial de decidir contratá-lo. Estar bem ranqueado é um argumento positivo a ser levado em consideração.

## Como integrar SEO e marketing de conteúdo?

Vamos mostrar agora como o SEO e a produção de conteúdo relevante caminham juntas para promover uma empresa no ambiente digital. você perceberá que a otimização não gira em torno apenas de códigos **HTML**, mas também depende de como o conteúdo é produzido e promovido.

### Autoridade da empresa

Em termos de **marketing digital**, podemos definir a autoridade de uma empresa de duas formas, a depender do ponto de vista:

- do ponto de vista do cliente, é o know-how que a empresa demonstra ter, ou seja, a capacidade que mostra de constatar problemas pelos quais seu público passa e resolvê-los;
- do ponto de vista dos algoritmos de pesquisa, autoridade de página é uma espécie de avaliação que se dá por vários critérios, como quantidade e qualidade de cliques e links externos que direcionam para a página.

A autoridade para o cliente é construída por meio de produção consistente de conteúdo relevante, que atenda aos problemas de sua persona, e, consequentemente, do público que se aproxime de seu perfil. Fazer material de qualidade tende a gerar engajamento e, assim, visibilidade e credibilidade.

**Por outro lado, a autoridade para os mecanismos de busca depende da construção do tipo anterior, uma vez que o tráfego e as menções externas como em redes sociais ou outros blogs são fatores levados em consideração.**

Conteúdo relevante tende a ser um incentivo bem convincente para a conversão, a criação de vínculos ainda mais fortes entre o usuário e a empresa, motivada pela busca de mais informações.

Portanto, além de questões técnicas e menos diretas como o tempo de permanência na página, a relevância do material produzido atrai visitas de qualidade, beneficiando a empresa com [**um bom índice de conversões**].

## Qual a importância de utilizar palavras-chave relevantes?

Uma pesquisa de palavras-chave relevantes ao segmento de seu negócio em ferramentas como o Google Trends ajuda a planejar qual conteúdo será útil para seu público em determinado momento. Esse é um fator que contribui para construção da autoridade que citamos anteriormente.

Por outro lado, o que mais importa para o SEO é a presença das palavras-chave certas no conteúdo ao longo das páginas de seu site. Isso ajuda os algoritmos de busca a identificarem de que assunto ela trata e exibi-la como resultado de pesquisas por temas similares, buscando diretamente pelo termo ou por sinônimos.

Aliar a distribuição de palavras-chave úteis ao longo do texto a outros critérios técnicos de SEO são questões essenciais para construir a autoridade da empresa, posicionando-a bem em pesquisas.

## E onde entra a experiência de usuário?

Essa é a parte mais técnica do SEO, mas que também impacta uma estratégia de marketing de conteúdo de modo geral. A experiência do usuário, ou UX, é um fator determinante para que as pessoas que encontraram a página continuem navegando nela.

Esse cuidado passa por um [**web design amigável**] e funcional e, ainda mais importante, pela adaptação do site para acesso em dispositivos móveis: o chamado [**site responsivo ou mobile**].

De um lado, sites que oferecem uma experiência de usuário desfavorável acabam espantando novos acesso em potencial, seja por carregamento lento, tamanho de fonte ou layout de texto incompatível com seu dispositivo, áreas de toque muito próximas, etc.

Com isso, o conteúdo deixa de atingir seu destinatário e o processo de aproximação do visitante com a empresa é interrompido.

Do ponto de vista do SEO, sites adaptados para exibição em dispositivos móveis recebem avaliações mais favoráveis. E, se a página apresenta um conteúdo relevante, outro índice importante para melhorar o ranqueamento nos mecanismos de busca também é garantido: o tempo de permanência na página.

Portanto, ao se falar da importância do SEO em uma estratégia de marketing de conteúdo, percebe-se que otimizar um site é essencial para garantir uma presença digital efetiva. São esses fatores somados que vão atrair mais visitantes por meio de pesquisas, para conhecerem mais a respeito de sua empresa, construindo sua autoridade.

Esperamos que tenha curtido nossas dicas! 



Seja no cinema, na publicidade, nos jogos digitais ou até em projetos arquitetônicos, o uso do fotorrealismo e da animação em três dimensões é cada vez mais presente em diversos tipos de mídias. E não é para menos: os softwares 3D ganharam versões com melhor usabilidade e, consequentemente, conquistaram mais usuários.

Não são apenas os publicitários, designers, programadores, arquitetos e diretores de arte que utilizam esses recursos. Hoje, qualquer estudante competente é capaz de tirar seus desenhos do papel e começar uma [**carreira na área de 3D**].

## Conheça as tendências do mercado

Nos últimos anos, podemos notar o surgimento de novos caminhos no cenário do design digital, em que o minimalismo toma conta dos projetos. E a [**tecnologia 3D**] acompanha essa temática.

Nesse sentido, com a evolução tecnológica, é recomendado explorar abordagens que mesclam várias técnicas, como a programação e, principalmente, a impressão. Tais [**tendências do mercado de design**] podem servir como um guia de trabalho para os profissionais de criação que querem se manter atualizados e produtivos.

Por isso, não deixe de conversar sobre o assunto com os professores do curso de 3D que está pensando em fazer.

Dessa forma, você conseguirá saber se eles estão acompanhando as demandas do mercado de trabalho, e terá mais segurança para começar a exercer o ofício depois da finalização dos seus estudos.

## Defina qual é a área em que deseja atuar

Um profissional com especialização em animação e modelagem 3D pode desenvolver uma infinidade de trabalhos com objetivos diferentes, que vão desde a criação de anúncios publicitários até a confecção de projetos e desenhos industriais.

Sendo assim, a escolha do software — e, consequentemente, do seu curso — dependerá dos seus objetivos como especialista. Se a sua paixão são os games, por exemplo, um [**curso de 3ds max**] pode ser o mais indicado para sua formação. Engenheiros e projetistas, por outro lado, já vão preferir trabalhar com o [AutoCAD].

Os iniciantes que ainda não estão certos sobre qual caminho seguir podem investir em um [curso de 3D básico], que inclua conceitos de modelagem, texturização e iluminação a partir de esboços simples. Assim, será possível conhecer suas preferências e definir suas áreas de atuação com mais clareza.

## Valorize o ensino na prática

Dispense o curso de 3D que só te oferece uma apostila, e nada mais. Por ser um trabalho pouco teórico e muito prático, o método mais interessante para materializar seus projetos consiste mesmo em colocar a mão na massa, e incentivar o aprendizado por meio de tentativa e erro.

Além disso, essa metodologia também é vantajosa porque permite que você já construa um [**portfolio**] aos poucos, enquanto estuda.

Nesse sentido, o interessante é procurar um curso de capacitação online ou presencial de boa reputação, no qual você tenha acesso a instruções e tutoriais diretamente no software que pretende aprender a usar.

## Busque referências

Conhece alguém que já fez o curso em que você está pensando em se matricular? A instituição de ensino tem reconhecimento, ou algum prêmio na área de design? As avaliações e depoimentos nas redes sociais da escola são positivos?

Poste suas dúvidas em fóruns online, converse com profissionais, procure por recomendações, descubra quem são os coordenadores e professores do curso — e se eles atuam no mercado —, peça para assistir uma aula experimental.

Há espaços mais gerais, comunidades criativas intersetoriais que abrangem diversos softwares e áreas de conhecimento como o [Graphic Design Stack Exchange] e o [Creative Cow], mas também vale pesquisar se a própria equipe de desenvolvimento do software disponibiliza um espaço de discussão, como fazem o [Rhinoceros] e a [Autodesk].

Com certeza, com essas práticas você terá informações suficientes para saber quais opções valem a pena. E, por meio das referências positivas, você poderá construir confiança no curso antes de começar a estudar.

## Descubra o que combina mais com o seu perfil

Para quem deseja se graduar, de modo geral, os cursos mais indicados para iniciar uma carreira na área de 3D são: design gráfico, artes digitais, produção multimídia, audiovisual e jogos digitais. Contudo, é importante ressaltar, essas opções são mais abrangentes, e podem não focar nos assuntos que você deseja.

Se você tem a intenção de se inserir rapidamente no mercado ou já se graduou, uma boa opção é a pós-graduação em animação ou computação gráfica 3D. Apesar dos preços geralmente elevados e da alta demanda de tempo, essa especialização acrescenta muito valor ao currículo.

Outra opção interessante são os cursos livres e técnicos. Eles preparam o aluno para o mercado de trabalho de forma bastante objetiva, em um período otimizado e com um custo relativamente menor do que aqueles cobrados pelas faculdades.

Além disso, você tem mais [**flexibilidade de horários**] e conteúdo, além de não precisar frequentar aulas durantes todos os dias da semana. E, se o curso de 3D for online, as vantagens são ainda maiores, já que será possível montar a sua própria rotina de estudos sem sequer sair de casa.

## Verifique a qualidade da certificação

Na prática, o que vai contar mesmo para os seus futuros clientes ou empregadores é a sua competência, seu domínio de softwares e sua [**criatividade**]. No entanto, se você tem a intenção de se candidatar para empregos mais formais — sejam eles públicos ou privados —, a certificação também é importante.

Portanto, procure por cursos que ofereçam certificados com autenticidade garantida após a sua conclusão. Isso te permitirá provar que possui os conhecimentos requeridos para a vaga, além de fortalecer sua imagem profissional.

Mas é interessante que esse documento seja emitido por uma instituição reconhecida, e nele conste o número de horas/aulas do curso, bem como índice de aproveitamento e data de conclusão.

Nessa hora, vale ainda conferir a estrutura dos certificados de pessoas que passaram pelo mesmo programa que você quer realizar.

Enfim, a escolha do curso de 3D ideal para seguir uma carreira promissora pode mesmo não ser nada fácil. Mas, seguindo essas dicas com um pouco de persistência, você vai, com certeza, se deparar com muitas oportunidades de aprender bastante!






imagem 

Neste episódio do Alura Live, nossa co-host Giovana Delfino recebeu Vanessa Tonini, instrutora e desenvolvedora na Caelum e Jana Paradiso, desenvolvedora do time da Alura para falarem um pouco mais sobre esse assunto sobre fundamental de inclusão digital, que é acessibilidade na web.

Quer entender melhor como ajudar pessoas com deficiências? Assista e deixe suas dúvidas!

https://www.youtube.com/watch?v=vrLx1yJjsXU

Ainda ficou afim de saber ainda mais sobre esse tema? Assista a [live completa].

Saiba como seu site e outros da web estão quanto a acessibilidade [acessando aqui].

Conheça sites que foram premiados com o [Prêmio Nacional de Acessibilidade].

Extensão de leitura de texto para pessoas com deficiência visual: - [Chrome]. - [Firefox].

Vídeo com conteúdo impactante sobre acessibilidade na web: [Custo ou Benefício?]

Não deixe de nos seguir twitter: Giovana Delfino - Nossa diva da live não tem Twitter :’(, [Vanessa Tonini], [Jana Paradiso] e a [Alurinha]! :D





imagem 

Mais do que nunca, as empresas estão muito exigentes em seus processos seletivos. Sendo assim, estudantes e recém-formados buscam cursos complementares com o objetivo de se preparar para o mercado. Nesse cenário, as certificações de marketing digital ganharam destaque.

**Quer conhecer mais sobre a importância de ter uma certificação na área de marketing digital? Continue lendo e confira!**

## Por que trabalhar com marketing digital?

As empresas já se deram conta de que [**estar presente nas mídias digitais é fundamental**] para o crescimento. Nesta era em que os consumidores utilizam a internet para pesquisar sobre qualquer coisa, quem estiver de fora dificilmente sobreviverá nesse mercado competitivo.

No entanto, ainda temos um segundo problema: não basta estar inserido no ambiente digital, é preciso ser estratégico! Muitos ainda cometem erros terríveis por não se capacitarem ou não contarem com [**profissionais do ramo de marketing**].

É comum observarmos diversas empresas abrindo uma fanpage no Facebook e acharem que é o suficiente. Mas não é bem assim que as coisas funcionam. Além de não ser o bastante, poucos conhecem as melhores práticas para conseguir os resultados desejados nas mídias sociais.

Com a popularização dos dispositivos móveis, a contratação de especialistas para elaborar as estratégias de marketing digital se tornou ainda mais necessária. [**De acordo com uma pesquisa**], mais da metade dos brasileiros acessam a internet pelo smartphone. Ou seja, toda a forma de produzir conteúdos e anúncios precisou ser repensada para esse enorme público — e isso abriu novas oportunidades na área.

## Com que áreas o Marketing Digital se relaciona?

### Design

O designer é o responsável em cuidar da identidade visual da empresa nos meios digitais. As marcas precisam transparecer sua personalidade nas peças publicitárias, ilustrações publicadas nas mídias sociais, banners etc. 

Sendo assim, o profissional deve ser qualificado para garantir essa uniformidade e empregar as melhores técnicas. Além do designer gráfico, a profissão de webdesigner também é bastante requisitada por agências de marketing e demais empresas.

### UX (User Experience)

O Analista de UX é quem se preocupa com a experiência do usuário que acessa as plataformas digitais da empresa, como o site e aplicativos. Isso garante que os visitantes e frequentadores consigam navegar com facilidade em suas páginas e, dessa forma, passem mais tempo nelas. Caso a experiência seja negativa, objetivos como a conversão e a fidelização vão por água abaixo.

### Redação

O marketing de conteúdo é atualmente uma das estratégias mais utilizadas para as empresas gerarem tráfego para seus canais e criarem engajamento. Logo, um bom redator é indispensável. 

Como o volume das produções costuma ser grande, há bastante demanda para essa área. Porém, existem algumas técnicas específicas para a redação web, fazendo com que a especialização para produzir esses conteúdos seja tão importante quanto as demais.

### Social Media

Como dito anteriormente, não basta criar uma fanpage no Facebook, publicar o que vier à cabeça e esperar os resultados. Os [**analistas de mídias sociais**] estudam e fazem testes constantemente para garantir que as empresas tenham retorno com as ações. 

Portanto, além de conhecer quais práticas trazem resultados, é preciso monitorar e analisar as páginas.

### Programação

Quem trabalha com marketing digital está habituado a usar diversas ferramentas para executar diferentes projetos. É possível até mesmo criar um site por meio de um CMS (sistema de gerenciamento de conteúdo) em pouco tempo. 

Entretanto, devemos lembrar que cada projeto tem suas peculiaridades. O que funciona para um, pode não funcionar para outro. A presença de um programador é crucial para atender às exigências dos clientes.

### SEO

O [**SEO**] (Search Engine Optimization) pode ser descrito como um conjunto de técnicas que tem por finalidade deixar o seu site bem posicionado nos motores de busca como o Google e o Bing.

A vantagem em utilizar essa estratégia é ficar visível nos resultados orgânicos, e desse modo, diminuir o custo com os anúncios patrocinados. O Analista de SEO é quem vai analisar e implementar as ações para que isso aconteça.

## Por que as certificações de marketing digital são essenciais?

**O marketing digital** é uma área relativamente nova, e não há um curso de graduação específico para quem deseja ingressar nesse ramo. Podemos encontrar trabalhando em agências profissionais que cursaram publicidade, marketing, design, sistemas de informação, entre outros cursos. É necessário se especializar em algum dos segmentos para exercer a profissão.

Algumas especialidades são mais novas que outras, e sempre surgirão outras funções que hoje não existem. Como as tecnologias estão sempre sendo aprimoradas, é comum que isso ocorra. **Para isso, uma plataforma reconhecida de cursos online pode suprir essa necessidade de renovação, capacitando cada vez mais pessoas a prestarem esses serviços.**

**Não são apenas os recursos tecnológicos que sofrem modificações ao longo dos anos, mas também os hábitos dos consumidores.** Não é difícil perceber que, após sua popularização, os usuários puderam resolver inúmeras questões com alguns toques nas telas de seus aparelhos. Com essa comodidade em mãos, não há como voltar atrás, e as empresas precisam se adaptar à nova realidade.

**O certificado reforça que determinada pessoa está apta a desempenhar aquela função e, em um mercado altamente competitivo, estar atualizado das melhores práticas colocará você em uma posição privilegiada.** O arroz com feijão já não é mais o suficiente; se você deseja se destacar deve ter em mente que o estudo precisa ser constante!

Com tantas opções disponíveis, pode ser que você fique em dúvida de qual é mais vantajosa. **O ideal é estudar um pouco sobre cada área de atuação antes de decidir qual caminho seguir.** Agora que você já sabe qual a importância das certificações de marketing digital, busque aquelas que possam ajudá-lo a expandir seus conhecimentos.

E para ficar por dentro de todas as nossas novidades, assine nossa newsletter e receba tudo por e-mail!




Quantos usuários do Alura já compraram livros na Casa do Código e quantos não? Fácil, executa duas queries, cria uma stored procedure (aiiiiiii meu coração), devolve um divido pelo outro:

sql

sql

E uma stored equivalente a:

sql

Como diz minha sobrinha de 2 anos: -Uxi! E sai correndo, fugindo de medo.

Poderia agrupar, e fazer a divisão:

sql

E usar a mesma fórmula em procedure ou programação: uxi.

Podemos só contar o total :)

sql

Se o seu banco usa 0 ou 1 para marcar quem comprou, soma todo mundo:

sql

Calma lá, é só dividir quem comprou pelo total. Uma unica query:

sql

Tá lá, sem subquery, sem procedure, sem temporary table, doidice.

Desafio: e se o campo não fosse 0 e 1? Como você transformaria uma string 'S' e 'N' para a query acima funcionar? \*CASO\* você tenha uma sugestão, [compartilhe]!

Gostou do post? Quer aprender mais? Que tal dar uma olhada em nossos [**cursos de Banco de Dados?**]

ps: Essa boa prática é a primeira parte de uma super prática animal sugerida pelo aluno do Alura, [Silvio Silva]!




Inicio este post com o seguinte encontro:

> "Fernanda e Gustavo conheceram-se em uma conferência. Fernanda disse para Gustavo que era programadora front-end. Gustavo disse que tinha vontade de ingressar nessa carreira e não sabia por onde começar."

Apesar desse encontro nunca ter existido, Gustavo personifica bem com sua dúvida aqueles que .

## Passo 1: HTML5 e CSS3

O HTML é uma linguagem de marcação responsável pela estrutura de páginas web, dando significado para cada parte que a compõe, já o CSS é aquela tecnologia que aplica um atrativo estético na estrutura da página criada.

[**Aprender HTML5 e CSS3 criando uma página de barbearia**] é um bom começo, pois além de aprender os fundamentos, você terá algo prático já criado.

Depois de consolidar seus conhecimentos, poderá [avançar e aplicar novas técnicas] para aprimorar ainda mais esta parte.

Além do que vimos, saber criar um [web site responsivo], aquele com páginas que se adaptam do mobile ao desktop, é prática do mercado, não mais um plus.

Preparados para o passo seguinte?

## Passo 2: lógica de programação e JavaScript

A profissão programador front-end além de envolver os conhecimentos de HTML5 e CSS3 demanda também conhecimento da linguagem JavaScript.

Ela é a única linguagem efetivamente de programação (podemos declarar variáveis, loops, funções...) suportada pelos navegadores do mercado, inclusive este é um dos motivos de boa parte dos programadores, sejam de front-end ou não, terem algum conhecimento desta linguagem.

Contudo, sendo JavaScript uma linguagem de programação, é necessário conhecimento de lógica de programação, aquele que uma vez aprendido pode ser aplicado nas mais diversas linguages do mercado.

Para quem nunca programou na vida, [aprender e praticar lógica de programação] desde o fundamental até a [criação de animações e um jogo], o prepará ainda melhor para a linguagem JavaScript.

Com a parte da lógica de programação em dia, aprender [a linguagem JavaScript] completa a tríade de tecnologias mínimas que um programador front-end precisa ter. Contudo, a jornada não para por aqui. É preciso ir além!

## Passo 3: bibliotecas

O mercado de trabalho adora padronização e nós, desenvolvedores, queremos escrever cada vez menos.

Neste sentido, ter contato com bibliotecas e frameworks populares do mercado aumentará o seu índice de empregabilidade, além de dar subsídios para criar mais facilmente aplicações. No caso, focarei por enquanto nas bibliotecas.

O [Bootstrap] é sem dúvidas o framework HTML, CSS e JavaScript mais popular para criação de projetos _mobile first_, aquele no qual primeiro pensamos em nossas páginas em dispositivos móveis para depois adaptá-la em dispositivos maiores, como computadores Desktop ou até mesmo smart TVs gigantes.

[Criar um site com Bootstrap a partir de um layout já existente] é uma prática bem comum no mercado. Porém, ele faz uso de outra biblioteca que está no coletivo imaginário dos desenvolvedores, o [jQuery].

O jQuery é uma biblioteca que permite o programador front-end realizar mais facilmente modificações na página através das ações do usuário, como o clique de um botão que oculpa uma barra lateral ou até mesmo aquele banner rotativo lindão que dá vida à sua página.

Existem diversas maneiras de aprendemos jQuery, [inclusive criando jogos], dessa forma, tornando ainda mais divertida a aprendizagem. Independente do seu uso pelo Bootstrap, há muito código escrito no mercado com esta biblioteca.

## Passo 4: mais JavaScript

Hoje vivemos no [reino encantado do JavaScript]. A versão ES2015 (ES6) do JavaScript se popularizou rapidamente devido a introdução de novos recursos da linguagem que visam ajudar o desenvolvedor a resolver problemas do dia a dia.

[Criar um projeto do zero e ir aplicando gradativamente os novos recursos da linguagem] é uma forma de absorver as mudanças. Inclusive, o ES2015 é pré-requisto para aprender alguns dos mais famosos frameworks do mercado.

## Passo 5: frameworks

Uma biblioteca resolve um problema bem específico, já um framework pode ser considerado um conjunto de bibliotecas que visam resolver um problema maior.

Hoje no mercado há uma explosão de [Single Page Applications], páginas que não recarregam durante seu uso (parecem aplicações nativas como aquelas que rodam em seu smartphone) e que fazem uso pesado de JavaScript.

Frameworks como [Angular 1], [Angular 2] (hoje, chamado de Angular!) e [React] são os que invadem o coletivo imaginário dos desenvolvedores e das empresas

## Passo 6: (desejável): pré-processador

Aprender a utilizar pré-processadores CSS como [SASS] ou [LESS].

> Um pré-processador nada mais é do que um compilador que traduz uma sintaxe rebuscada que pode trabalhar com varíaveis e funções para um código CSS, aquele compreendido pelo navegador. Em suma, a ideia é darmos ao CSS poder semelhante das linguagens de programação como o próprio JavaScript que vimos.

Dependendo do escopo do projeto e da cultura da equipe, pré-processadores podem ser utilizados para tornar o trabalho mais produtivo.

## Passo 7: (desejável): ferramenta de build

Por exemplo, sabemos que um site depois de pronto precisa ainda passar por uma [série de otimizações]. Nesse sentido, dominar alguma ferramente de build como [Gulp] pode ser um diferencial na hora de concorrer por uma vaga de estágio ou emprego. A boa notícia é que essas ferramentas utilizam a linguagem JavaScript, aliás, uma linguagem bem onipresente no universo do desenvolvimento.

## Passo 8: (desejável): noção de como funciona um back-end

Ter uma noção de como funciona um back-end e como o seu trabalho de programador front-end se integra com ele o ajudará a ter mais confiança ao trabalhar dentro de uma equipe.

Nesse sentido, começar pelo [PHP criando um projeto web que se integre com o banco de dados] é um bom começo.

## Conclusão

Saber o essencial que é HTML5, CSS3 e JavaScript abre oportunidades tanto para estágio, como também, para ofertas de emprego. Além disso, nada o impede de trabalhar por conta própria como um freelancer.

Contudo, completar seu conhecimento com bibliotecas e frameworks populares do mercado ampliam ainda mais essas oportunidades.

Por fim, segundo [Rogers], o processo de aprendizagem ocorre de maneira particular em cada individuo e o papel dos educadores é facilitar a aprendizagem do aluno.

A sequência de passos aqui aprensentada é apenas uma proposta que pode facilitar sua aprendizagem, mas sinta-se à vontade de adequá-la ao seu _modus operandi_ de aprender.




Fui chamada por um amigo meu que trabalha em uma biblioteca para criar um sistema para que os funcionários tivessem controle do estoque de livros, quais eram emprestados, quantos haviam disponíveis, quando um novo livro fosse acrescentado ao inventário, entre outras coisas.

Sugeri de fazer um sistema no banco de dados, pois assim eles podiam fazer isso facilmente e teriam um sistema somente deles, no qual pudessem ter esse controle.

Comecei baixando o MySQL, configurei um servidor e criei **CREATE** uma `database biblioteca`, com o comando:

sql

Agora que a database, que é um banco de dados próprio da biblioteca, foi criado, devemos adicionar os dados dos livros. E como podemos fazer isso?

No SQL os dados são inseridos em tabelas, na qual cada coluna representa um dado e cada linha, um livro cadastrado.

# Criando tabelas com MySQL

Comecei a pensar o que teria que ter na tabela. Cheguei aos seguintes tópicos:

- Título
- Autor
- ISBN
- Edição
- Editora
- Ano publicação
- Páginas
- Gênero literário
- Idioma
- Quantidade de livros desta edição
- Quantidade de livros desta edição disponível na biblioteca

Porém, lembrei que antes de começar a criar qualquer coisa no banco de dados, devemos **informar qual database queremos usar**. Para isso, usamos o comando **USE** e o nome da database sempre que formos mexer nessa database. Então, escrevi:

sql 

A partir daí, comecei a escrever o código para criar `CREATE` a tabela `TABLE` e o nome da tabela, que será livros. Ficando:

sql

Para colocar as colunas, devemos abrir e fechar um parênteses e escrever as colunas entre eles, colocando o que é cada um.

Na frente do nome da coluna, precisamos colocar o tipo de informação que ela receberá.

Para começar, na coluna título e autor, como serão textos, e muitas vezes podem ser grandes, coloquei a categoria **text** que não precisa estipular um limite de caracteres. Aí ficou:

sql

Porém, nas colunas ISBN, edição e editora, que são informações que podem conter algum número ou caractere especial, coloquei na categoria **varchar**, e como não podemos deixar uma possibilidade enorme, coloquei um limite de 50 caracteres cada um. Ficando:

sql

Então, criei a coluna ano para indicar a data em que ano o livro foi publicado, sendo a categoria **year**, que aceita somente o ano e, assim não precisamos incluir a data inteira:

sql 

Para a coluna de páginas, como essa informação sempre será um número inteiro, coloquei a categoria **int** que indica que ali só serão acrescentando números inteiros.

sql 

Já na coluna de gênero, como sempre inserimos os mesmos tipos, coloquei a categoria **enum**, que só permite inserir um valor que está entre alguns que foram definidos na criação da tabela.

Assim, também podemos saber quantos livros de determinado gênero temos no estoque. E o como ficou como a seguir:

sql 

Na categoria de idioma, também coloquei varchar porque podemos receber livros de diversas linguagens. Ficando:

sql

Por fim, coloquei as colunas da quantidade total de exemplares daquele livro estão disponíveis na biblioteca e a quantidade que está disponível, que deve ser atualizada sempre que um livro for emprestado.

sql

## Mais colunas e chave-primária

A biblioteca quer uma coluna para a quantidade total e para a quantidade disponível para uma ser sempre atualizada, enquanto outra permanece com o mesmo valor desde que recebermos um livro, para termos um controle de quanto livros deveríamos ter - e saber se algum deles foi perdido.

Como só podem ser números inteiros também, já que não podemos ter meio livro, coloquei na categoria int:

sql

Além disso, no fim do insert, depois de fechar o parênteses, devemos finalizar o comando com ponto e vírgula (`;`), como devemos fazer no fim de todo comando em SQL.

O código inteiro para criar a tabela ficou assim:

sql

Antes de executar, pensei em criar uma coluna que na primeira linha ela tivesse o valor “1” e fosse aumentando os valores automaticamente para que, assim, esse número indicasse quantos livros a biblioteca tinha ao todo.

Pensando em como fazer isso, lembrei que na [**Apostila de SQL da Alura**] era criada uma coluna "id" que seria auto-incrementada com o comando auto_increment e ela seria uma **chave primária ou PRIMARY KEY**, que é uma coluna que possui um valor único em cada linha, o que as identifica.

sql 

E pronto! A minha tabela foi criada!

Agora com a tabela criada temos que adicionar dados nela! E como podemos fazer isso?

# Inserindo dados na tabela com INSERT

Para isso, eu usei o comando **INSERT**

Para usar o `INSERT` devemos escrever **INSERT INTO** e o nome da tabela. Depois colocar em parênteses as colunas que terão um valor inseridos, escrever **VALUES** e escrever em outro parênteses os valores que serão inseridos nas colunas.

Como a coluna id será auto-incrementada automaticamente, sempre que uma linha for adicionada, não precisamos inserir um valor nela.

Assim, iremos adicionar uma linha, que são os dados que terão na tabela:

sql 

Porém, apareceu o seguinte erro:

sql 

Quando procurei para saber mais, descobri que este erro acontece quando colocamos valores a colunas que não existem. Porém, todas essas colunas existem na minha tabela. Qual será o problema?

Analisando o comando, notei que não havia inserido nenhum valor na coluna idioma, mesmo tendo informado no comando que ela receberia um valor. Tentando novamente:

sql 

E deu certo! Assim, comecei a adicionar os as outras matérias daquele mês.

Porém, como eu podia fazer para mostrar a tabela na tela? Pensei que eu deveria selecionar a tabela inteira ou uma parte dela para mostrar, então, o comando é **SELECT**:

sql

Porém, apresentou o seguinte erro:

sql 

Isso significa que eu errei a sintaxe do SQL, ou seja, que o comando ou uma parte dele foi escrita errado. Foi então que eu procurei e descobri que no SQL o comando para selecionar todos é \*, então, coloquei:

sql 

E apareceu todas as coisas que eu cadastrei no banco de dados!

- ![]
    

# Deletando linhas de tabelas com DELETE

Porém, observando a lista, notei que havia adicionado duas vezes uma mesma edição em capa de Orgulho e Preconceito.

Como a questão é controlarmos a quantidade de título que temos, não tem necessidade de tê-lo duas vezes, quando a quantidade de livros está na tabela, certo? E como eu poderia apagar uma das linhas duplicadas?

Para deletar no computador usamos o **DELETE**, então, podemos usar o mesmo comando:

sql

Porém, percebi que não tinha indicado qual linha deveria ser deletada e utilizando o comando assim eu **poderia deletar toda a tabela**, ou seja, todos os dados que eu havia inserido nela.

Então, pensei em especificar qual linha era com ao menos um valor de uma das colunas. Na minha tabela, existe alguma coluna que possui um valor único para cada linha?

Lembra que quando criamos a tabela criamos a coluna id que teria um número que se auto-incrementaria e era a chave primária da tabela?

Essa é a coluna que devemos usar como parâmetro! Pois, se usássemos a coluna de nome, as duas linhas seriam excluídas e teríamos que incluir mais uma vez. Usando a coluna id, que tem um número diferente para cada linha, só a linha errada é excluída.

Então, usei mais uma vez o `SELECT * FROM livros` e vi na tabela o id da linha duplicada.

- ![]
    

Que no caso, o id é o 2.

Mudando o comando para deletar a linha da tabela, onde o id era 2, ficou:

sql

E funcionou! Vendo a tabela novamente, não existe mais a linha 2 e há somente uma linha para esta edição do Orgulho e Preconceito.

- ![]
    

E pronto! Agora a biblioteca começou a funcionar!

# Mudando dados da tabela com UPDATE

Os livros já estão sendo emprestados e como posso fazer para atualizar a quantidade de livros disponíveis na biblioteca?

Para mudar dados de uma coluna de uma linha de uma tabela em SQL utiliza o comando **UPDATE**. Porém, assim como `DELETE`, deve ser especificado para que não sejam alteradas todas as linhas.

Fui escrevendo o comando para atualizar a linha da coluna, utilizando como parâmetro o nome do livro.

sql 

Porém, temos diversas edições deste mesmo livro e, utilizando este comando, iríamos alterar a quantidade de livros disponíveis para todas as edições. Então, precisamos de uma informação da tabela que seja única em cada linha. Qual seria essa?

Sim! O id da linha, que é auto incrementado e tem um número específico para cada linha, permitindo que saibamos exatamente qual linha queremos alterar.

Assim, comecei a mudar os comandos, colocando como parâmetro de verificação da linha é o id, que é a chave primária da tabela, de cada um. Como aqui:

sql 

- ![]
    

Deu certo! E assim podemos atualizar a quantidade de livros disponíveis para aquela edição sempre que um for emprestado e devolvido!

# Mostrando dados da tabela com SELECT

Passado algum tempo com a biblioteca funcionando, uma pessoa veio questionar quantos livros de poesia a biblioteca possui, que tinham edições disponíveis para serem emprestadas. E como poderíamos saber esses dados para respondê-la?

Vimos anteriormente como mostrar todos os dados da tabela, que é com o `SELECT * from livros`.

Mas como podemos utilizar este comando para mostrar somente os títulos que são poesia e não todos os livros que a biblioteca possui, como o comando fará se o executarmos assim?

Para isso, precisamos utilizar o título do livro como parâmetro para que possamos selecionar somente as edições deste mesmo título.

Então, seguindo a ideia dos comandos de `DELETE` e `UPDATE`, onde devemos mostrar quais são as linhas que devem ser afetadas, vamos fazer o mesmo com o `SELECT`.

sql

E funcionou! Aparecem somente os títulos de poesia E que possuem edições disponíveis para serem emprestadas.

![]

Porém, assim, aparecem todas as informações do livro e quero saber somente o título, o autor, o gênero e a quantidade disponível, certo? Como posso utilizar o comando SELECT para mostrar apenas essas colunas?

Tentei o seguinte comando:

E deu certo! Apareceram somente essas colunas das linhas que são do gênero poesia.

- ![]
    

Agora que sabemos como criar uma tabela, inserir, deletar, mudar e selecionar dados dela,qual tabela você pode criar com o banco de dados? Acesse os nossos [**cursos de SQL**] e descubra o que mais você pode fazer com banco de dados!




Continuando o bate-papo com a especialista e analista SEO Paula Nakayama, corremos atrás agora de uma outra fase na vida de um analista SEO: já aprendi alguma coisas, já estou praticando a análise de SEO, talvez já tenha feito um curso ou outro...e agora? Quais práticas podem fazer uma grande diferença na minha carreira?

http://www.youtube.com/watch?v=ciNWdfVPh3s

- Agora eu já sei como implementar algumas técnicas de SEO para o meu site. Corri atrás de outras informações, aprendi HTML e CSS, dediquei-me a conhecer meu produto e meu mercado. Quero, agora, dar um segundo passo e me destacar ainda mais como analista SEO. O que posso fazer?

O importante, depois de implementar o site, é acompanhá-lo para ver se o que você fez agregou valor. Por meio de um relatório de acompanhamento, verificando se houve melhoras, se houve conversões, fazemos um monitoramento do crescimento de cada um desses pontos. Inclusive, se for o caso, o seu trabalho pode virar um _case_ de sucesso para sua carreira.

- Então o importante é medir o antes e o depois e poder compará-los, para termos uma referência?

Isso mesmo! É muito importante também se atualizar. Pois, a partir do momento em que você começou a se preparar para ser um analista SEO, os algoritmos dos motores de busca passaram por alterações (_updates_). Você precisa saber dessas mudanças o quanto antes para tomar ações e melhorar algo no seu site. Acompanhe as comunidades  - [**The Moz Blog**], [**Search Engine land**], [**Search Engine Journal**], [**Search Engine Roundtable**], etc - de SEO e veja o que estão falando sobre as novidades para estar sempre atualizado em relação ao mercado de SEO. O aprendizado do analista de SEO é sempre constante. Todas as semanas aparecem novos lançamentos e novidades.

- Como posso ficar sabendo dessas novidades do Google e de outras engines?

O próprio Google possui diversos blogs. Lá eles anunciam as mudanças de algoritmos e as melhorias que serão implementadas. Alguns deles são: [**Google Inside Search**], [**Google Webmaster Central Blog**] e o [**Google Analytics Blog**].

- Você utiliza alguma ferramenta para acompanhar os blogs ou acessa os blogs de tempo em tempo?

A maneira que achei mais fácil foi seguir todos esses canais pelo Twitter e praticamente todos os dias eu leio as novas informações desses sites para ver se existe alguma novidade que eu possa aplicar no meu site. Um outro muito bom é o [**Feedly**]!

Então, resumindo: agora que já dei o primeiro passo na minha carreira(fui além), entendendo um pouco mais do meu produto e do meu mercado e da parte do desenvolvimento em HTML e CSS, agora é hora de correr atrás da análise de tudo o que já fiz e do resultado que trouxe para a minha empresa. Outro ponto é estar sempre antenado a tudo que está acontecendo nesse meio tempo, seja através dos canais oficiais ou blogs não oficiais, os quais aglomeram diversas novidades acerca do SEO.

Pensando nesses detalhes a Paula criou junto conosco um curso sobre [**métricas e relatórios SEO**].




Vamos a um exemplo concreto de **datas** e **horários** para poder programar em Python e com o módulo `datetime`: Uma empresa nos contratou para implementar o sistema de pontos deles, controlando quando um funcionário chega e sai. O sistema deve exibir a data e a hora a cada registro, como confirmação para o funcionário.

# date do datetime

Conhecemos o módulo **[datetime]** da biblioteca nativa do **Python**, então até sabemos pegar a data atual através da classe **[date]**, basta a importarmos e chamarmos o método **`today()`**:

python
Como esperado:

python

Mas calma… como esperado? Seria legal se conseguíssemos imprimir a data no formato brasileiro **`DD/MM/AAAA`** para evitar confusões! O problema é que o **`date`** automaticamente força o padrão ANSI sempre que tentamos imprimir.

# Formatando nossa data em uma string

Como a classe `date` consegue nos fornecer separadamente cada seção da data, podemos resolver esse problema com uma simples **formatação de string**:

python
Que resulta em:
python

Já melhorou bastante, mas ainda não é exatamente o que queríamos. Repare que tanto o dia como o mês estão sem o prefixo **0**, saindo do padrão pretendido. Nesse caso poderíamos até contornar isso simplesmente adicionando um **0** antes:

python 

O que daria certo, mas traria problemas caso o dia ou o mês fossem maiores ou iguais a 10:

python 

São problemas e funcionalidades comuns que passamos durante nossos cursos da formação [Python para web] na Alura!

# Formatando datas em strings usando o método strftime()

Para evitar maiores complicações, a classe `date` soluciona isso com um único método - o **`strftime()`**, que toma como parâmetro a formatação que queremos em nossa string de data e, desse modo, nos dá maior liberdade para decidirmos como queremos exibir a data.

Esta formatação usa códigos melhor explicados na [documentação]. Ao final do texto, também damos uma explicação breve neles. No nosso caso fica assim:

python 

E agora sim:

python

Ou, no caso do nosso exemplo que resultou em `010/010/2018`:

python

Agora só precisamos dar um jeito de armazenar o horário também. Quem será que pode cuidar disso? Como você deve ter imaginado, o mesmo módulo `datetime` do qual importamos a classe `date` também possui classes que facilitam a manipulação de horários.

# O tipo datetime para cuidar de datas e horários juntos

Enquanto podemos sim usar o tipo **[time]**, destinado exclusivamente para horários, o módulo nos dá uma solução muito mais apropriada para o nosso problema com o tipo **[datetime]** - **sim, tem o mesmo nome do módulo, cuidado com a confusão!**

Uma das vantagens da classe `datetime` é que ela consegue cuidar da data e do horário ao mesmo tempo. A única diferença em nosso uso é que, em vez do método `today()`, usaremos o método **`now()`**:

python
O resultado é como o anterior:

python

Opa! Apesar de já estarmos usando a classe `datetime`, que incorpora o horário, precisamos declarar na formatação que passamos como parâmetro para o `strftime()` que queremos mostrar a hora e o minuto, também:

python

e agora sim:

python

Perfeito! Até agora aprendemos a pegar a data atual com a classe `date`, `datetime` e até aprendemos a **formatar datas**, transformando-as em strings. Mas e se precisássemos fazer o caminho contrário?

# Convertendo uma string em datetime

Se tivéssemos uma string de data e quiséssemos transformar em `datetime`, o que faríamos?Novamente, um simples método resolve tudo, dessa vez o **strptime()**, da própria classe `datetime`:

python

E tudo certo! Entretanto, o chefe da empresa foi testar o programa em outros computadores e alguns imprimiam horários diferentes. Por quê?

# O problema do fuso horário

Chequei as configurações de um desses computadores e descobri que o relógio dele estava com um fuso horário diferente do daqui de São Paulo, onde está a empresa.

Não podemos deixar que o **tempo no nosso programa dependa de cada máquina**, porque não temos como garantir que todas as máquinas que rodarem esse programa estarão com o fuso horário que queremos. O ideal, então, seria forçar o fuso horário de São Paulo.

# Fuso horário com a classe timezone

A partir do **Python 3**, temos a classe **[timezone]**, também do módulo `datetime`:

python

Vamos ver o que é impresso na tela:

python

A exceção **`TypeError`** que recebemos indica que o argumento **`offset`**, esperado no construtor `timezone`, não foi encontrado. Realmente, não colocamos esse argumento. Mas o que ele significa?

O parâmetro `offset` representa a diferença entre o fuso horário que queremos criar e o [Tempo Universal Coordenado] (UTC). No nosso caso, em São Paulo, temos uma diferença de -3 horas, mais conhecida como **UTC-3**. Sabendo disso, vamos tentar novamente:

python

Agora que configuramos o parâmetro `offset`, vamos ver o que aparece na tela:

python 

Dessa vez a mensagem da exceção é diferente, indicando que o argumento passado para o construtor `timezone` deve ser do tipo **`datetime.timedelta`**, não um número inteiro, que foi o que passamos.

# Calcular a diferença de horários com a classe timedelta

A classe **[timedelta]** tem a finalidade de representar uma duração e, no nosso caso, uma diferença entre horários. Vamos, agora, instanciá-la em uma variável e tentar imprimir, para ver o que acontece:

python

Olha o que apareceu:

python

Tudo bem, 0 dias, 0 horas e 0 minutos. Mas precisamos que nosso objeto `timedelta` corresponda à diferença do **UTC**, as -3 horas:

python

E agora, o que aparece?

python 

Mas o quê? -3 dias? A gente queria -3 horas! O problema é que o construtor `timedelta` recebe vários outros argumentos além da hora, nessa ordem:

- **_days_** (dias)
- **_seconds_** (segundos)
- **_microseconds_** (microsegundos)
- **_milliseconds_** (milisegundos)
- **_minutes_** (minutos)
- **_hours_** (horas)
- **_weeks_** (semanas)

Então se a gente só manda um **\-3** para ele, esse número é interpretado como se fosse em dias. Podemos passar **0** para os primeiros 5 parâmetros e **\-3** para as horas, mas isso é um pouco estranho, considerando que, de fato, **queremos definir apenas as horas**.

Usando a funcionalidade que o Python tem dos **parâmetros nomeados**, é possível especificar que estamos definindo o parâmetro de horas (_hours_), da seguinte forma:

python

E dessa vez:

python 

Ué, se a gente colocou `-3`, por que apareceu tudo isso? Acontece que o `timedelta` entende **\-3 horas** como **0 dias, 0 horas e 0 minutos - 3 horas**, ou seja, **\-1 dia,21 horas**.

# Resolvendo o problema do fuso horário

Vamos, agora, criar um objeto timezone correspondente ao **UTC-3**, indicando essa diferença do **UTC** como parâmetro do construtor:

python 

Temos justamente o que queríamos:

python

Finalmente, podemos converter o tempo da máquina para o de São Paulo, usando o método **`astimezone()`**:

python 

Agora está tudo padronizado:

python

Temos tudo resolvido com o fuso horário agora, mas e se fossemos mostrar nosso código para outro programador, ele entenderia o que significa o `-3`? Não fica muito fácil, né?

Aliás, para todo fuso horário teríamos que pesquisar qual a sua diferença do UTC, o que é um problema chato. Será que não há uma maneira mais simples e elegante para resolver essa questão?

# Resolvendo o problema dos fusos horários com o pytz

A comunidade Python, frente a essa necessidade, criou diversas bibliotecas para facilitar a manipulação de _timezones_, como a **[pytz]**. Para instalar a `pytz`, você pode usar o **[pip]** pelo terminal:

python

> A instalação em sistemas baseados em UNIX provavelmente necessitará de permissão `sudo`.

Instalada, podemos importar sua classe `timezone` e fica fácil de pegarmos o fuso horário que queremos:

python

Repare que nós colocamos o `timezone` como `America/Sao_Paulo`. Mas e se quisermos saber outras possibilidades? É possível ver a lista de fusos horários suportados pelo `pytz` iterando sobre o **`pytz.all_timezones`**:

python 

Trabalhar com datas pra gente não será mais um problema!

## Mais Python e Datas

Ao longo desse post, usamos diversas vezes alguns códigos de formatação de datas, como por exemplo o padrão `%d/%m/%Y %H:%M`. Mas o que significa isso?

Esses códigos são definidos pela **[documentação do strftime(3)]**. Os usados em nossos exemplos são:

- **`%d`** - O dia do mês representado por um número decimal (de 01 a 31)
- **`%m`** - O mês representado por um número decimal (de 01 a 12)
- **`%Y`** - O ano representado por um número decimal incluindo o século
- **`%H`** - A hora representada por um número decimal usando um relógio de 24 horas (de 00 a 23)
- **`%M`** - O minuto representado por um número decimal (de 00 a 59)

## Conclusão

Começamos o post com a necessidade de manipular datas com o Python e vimos como fazer isso utilizando o tipo `date`. Aprendemos a juntar nossa data a um horário através da classe `datetime`, e como formatar essas informações em uma string de fácil leitura para nós.

Acabamos tendo um problema com o fuso horário e vimos como resolver com a classe `timezone` no Python 3. Também vimos uma maneira mais simples de solucionar esse problema com a biblioteca `pytz`, feita pela comunidade Python.

E aí? Vai ser mais fácil lidar com datas usando o Python a partir de agora, não acha? Gostou? Quer aprender mais? Confira a formação de **[Python para web] na Alura!**




Para todo programa que faremos na vida de programador, precisaremos declarar variáveis e isso é tão comum que fazemos sem pensar. Em `Java` por exemplo, fazemos a declaração da seguinte maneira:

java

Mas, e na linguagem GO, com é feita essa declaração?

# Declarando variáveis em GO

Utilizamos a palavra **var**, o nome da variável que queremos referenciar e seu tipo. 

go

Um ponto interessante é que podemos estar no nível do pacote ou da função.

Mas que isso quer significa?

# Escopo de variáveis

Uma variável declarada dentro de uma estrutura de repetição como o **if, for, switch** ou qualquer outro bloco, não poderá ser acessada fora desse escopo, ou seja, só poderá ser acessadas apenas por escopos mais internos.

Já uma variável ou função criada fora de um bloco é atribuída ao escopo do **Package** ou Pacote, que nada mais é que uma unidade composta por diversos arquivos que juntos servem a um objetivo comum, e pode ser acessada de qualquer arquivo dentro do mesmo pacote.

Como no exemplo a seguir:

go
Ao executar esses códigos, temos o resultado esperado, porém, recebemos uma notificação:

go

Isso significa que devemos omitir o **tipo da variável int(inteiro)**, pois isso já será inferido. Ou seja, temos o mesmo resultado com este código:

go

Se o tipo da variável é inferido pelo compilador eu posso usar a mesma variável para tipos de dados diferentes? Por exemplo `nome :="guilherme"` e depois `nome =10` ?

**Mesmo o Go sendo uma linguagem compilada rápida**, de tipagem estática, ou seja, o compilador verifica os tipos usados em dados e variáveis para garantir que sempre está sendo usado um tipo que é esperado em todas as situações, não é aconselhável que isso aconteça. 

Mesmo em linguagens que possuem tipagem dinâmica ao invés de estática, ou seja, a verificação de tipo é feita em cima do dado em si, já que as variáveis podem conter qualquer tipo de dado, como o javascript por exemplo, é bom evitar essa prática, pois isso pode causar confusão por parte daqueles que trabalham no mesmo projeto.


# Mais exemplos de declaração de variáveis

Podemos criar mais de uma variável ao mesmo tempo, podendo especificar o tipo ou omitindo:

go

Podemos criar mais de uma variável também com tipos diferentes:

go

Ou, deixar o Go **inferir os tipos**, para ter o mesmo resultado:

go

Posso também utilizar o **Short variable declarations**, ou seja, declarações curtas de variáveis utilizando o sinal : seguido do =.

go

Está última abordagem com := (dois pontos, igual), usamos apenas quando vamos criar e atribuir um valor **dentro do escopo de uma função**. 

Quando a variável receber um novo valor, devemos utilizar apenas o sinal de = (igual). Caso contrário, receberemos a seguinte mensagem dizendo que não há novas variáveis seguido do **:=** 

go

# Não atribuir um valor ao criar uma variável

Quando criamos uma variável e não atribuímos um valor a ela, o Go se encarrega de atribuir um valor. Sendo assim, é uma boa prática sempre inicializamos as variáveis durante a declaração.

No C e C++ por exemplo se não inicializamos a variável, o compilador simplesmente pega o que tive naquele espaço de memória que ele alocou e usa como se fosse sua variável. 

Em linguagens mais modernas como o Go a própria linguagem se encarrega de inicializar as variáveis:

```
----------------------------------------------
| Tipo         | valor atribuído pelo Go     |
|----------    |-------------------------    |
| numérico     | 0                           |
| booleano     | false                       |
| string       | " "                         |
----------------------------------------------
```
É sempre bom fazermos nós mesmos a inicialização das variáveis para não correr nenhum risco dos padrões da linguagem mudarem e nosso programa parar de funcionar.

Como vimos, podemos criar variáveis de diferentes formas utilizando a linguagem GO. Caso queira ver todos os tipos com detalhes, <a href="https://golang.org/ref/spec" target="_blank">acesse este link</a>.
Quer aprender mais sobre Go lang? 

Na plataforma da Alura temos um <a href="https://www.alura.com.br/curso-online-go-lang-oo" target="_blank">curso de Go lang</a> ensinando mais sobre variáveis, fluxo de controle, convenções e muito mais. 
Também temos um<a href="https://www.casadocodigo.com.br/products/livro-google-go" target="_blank"> livro da Casa do código</a> , onde apresentamos os recursos da linguagem Go e importantes partes de sua biblioteca padrão, sempre incluindo exemplos relevantes que demonstram o uso de cada recurso. 








Query bonita escrita, executada, resultado zoado. 

Gostaria de trazer os livros ativos cujos preços tem algo de estranho: são muito baratos (< 10) **OU** muito caros (> 1000)

sql

Que caca! O espertinho trouxe um livro que está inativo. Mas eu pedi ativo, não pedi? Pedi ativo, sim:

sql

O que aconteceu? Opa! Como já dizia meu pai, **"e ou"** não é a mesma coisa que **"ou e"**. Vamos ver? Troco a ordem do nosso **AND OR** por **OR AND**:

sql

Opa lá! Não é mesmo! Para com isso!

Acontece que como em qualquer linguagem, SQL também segue padrões de precedência de operadores. Se quer forçar sua própria ordem, diga aos SQL como diria a sua professora de matemática: **use parênteses**.

sql

A sacada? Sempre que escrever uma regra que envolva um OR, utilize parentêses.

Gostou das boas práticas? [**recomende a lista para um amigo**]!

Desafio para a próxima: devo criar lógica de negócios complexa no banco? Quando usar a tal da stored procedure?





imagem 

Recentemente a Microsoft anunciou a entrada em produção da versão 2.1 para suas principais tecnologias: .NET Core, Asp.NET Core e Entity Framework Core.

No caso do **Entity** [algumas coisas bem interessantes foram disponibilizadas], como por exemplo a possibilidade de informar como o valor de um enumerado será convertido no banco de dados. Até a versão anterior (2.0.3), o EF Core não suportava essa conversão.

Nesse artigo quero mostrar essa limitação e como a versão 2.1 o supera. Para isso vou usar um projeto de cadastro da eficiência energética de equipamentos eletrodomésticos. Vamos lá?

Enfrentei essa limitação em meu curso na Alura sobre o uso do Entity Framework Core em bancos legados. Nele mostrei uma alternativa para superá-la. Se você tem acesso a Alura, mostrei esse tópico [nessa aula aqui].

## O problema em questão

Considere um banco de dados já existente com uma tabela que registra a eficiência energética de equipamentos eletrodomésticos. O script de criação desse banco é o seguinte:

sql

Repare que existe uma _check constraint_ na tabela. Ela restringe o valor que pode ser armazenado na coluna Eficiencia para os valores A até G.

Poderíamos criar em nosso programa uma classe que fosse mapeada nessa tabela assim:

csharp

E para incluir alguns registros nessa tabela usando o EF Core eu usaria o seguinte código:

csharp 

A classe de contexto está listada abaixo:

csharp 

Repare que começamos mapeando a propriedade Eficiencia, que é do tipo string, ao tipo nvarchar. Tudo bem até aqui. O problema é que, do jeito que a classe está mapeada, permitimos um código assim:

csharp 

Quando tentássemos incluir esse objeto no banco seríamos presenteados com o erro:

> The INSERT statement conflicted with the CHECK constraint "CHK_Eficiencia".

Isso aconteceu porque a check constraint limitou o valor X que foi colocado na propriedade Eficiencia do objeto.

Perfeito, a constraint funcionou! Mas como fazer com que os consumidores da classe SeloProcel não cometam equívocos ao definir valores para essa propriedade? Ora, se queremos permitir apenas alguns valores finitos uma boa opção será utilizar enumerados. Vamos experimentar essa idéia.

## Usando enumerados

Vamos mudar nossa classe principal para utilizar enumerados na propriedade Eficiencia. Para isso criamos o enumerado `EficienciaEnergetica`.

csharp

Legal! Agora o código usado para inserir a terceira geladeira nem compila! Alterando esse código para um válido...

csharp 

... posso em seguida persistir a geladeira no banco.

Contudo, ao executar o código continuo recebendo o mesmo erro de _check constraint_. Porquê? O que aconteceu?

## A limitação do EF Core 2 para converter enumerados e como superá-la

Quando vai persistir alguma propriedade do tipo enumerado o EF Core por convenção utiliza o inteiro referente ao valor do enum.

Por exemplo, para o valor `EficienciaEnergetica.F` ele vai usar o inteiro 5 (porque esse valor é o quinto elemento no enumerado). Por isso a check constraint impede a inclusão: o valor 5 não está entre os permitidos.

O problema é que a versão 2 do EF Core não oferecia possibilidade de alterar esse comportamento! O que fazer então?

Para superar essa limitação eu vou seguir a indicação descrita [nesta issue], registrada no repositório do EF Core no Github.

A solução que usei se dividia em 2 partes:

- Escrever uma classe de conversão usando métodos de extensão e um dicionário com o mapeamento
- Criar duas propriedades na entidade, uma do tipo string para ser persistida e outra do tipo enumerado para ser consumida no código

### A classe de conversão

A classe de conversão está listada abaixo. Ela utiliza dois métodos de extensão e um dicionário para fazer o de-para.

csharp

Para converter do enumerado para string fazemos `EficienciaEnergetica.B.ParaString()` e para converter de string para enumerado `"A".ParaEnum()` (repare que se tentarmos converter uma string não-mapeada uma exceção será lançada).

### Mapeando as propriedades no EF Core 2.0

Já a entidade precisa ser modificada para se adequar a essa limitação. Podemos começar abandonando o recurso de propriedades auto-implementadas em favor de um campo privado, onde faríamos o de-para nos métodos de acesso para leitura/escrita:

csharp 

Porém, o EF Core não suporta o mapeamento de campos privados! Uma pena, já que essa solução utiliza uma prática comum em orientação a objetos: o encapsulamento com um campo privado. O que fazer então?

Vamos tornar o campo privado uma propriedade pública com escrita privada. Por convenção o nome de propriedades começa com maiúsculas, então mudamos seu nome para `EficienciaString` (você com certeza vai pensar em um nome mais adequado que o meu!).

csharp 

Pronto. Agora podemos configurar o mapeamento adequado no EF Core. Primeiro iremos informar que é a propriedade `EficienciaString` que será mapeada no banco com a coluna `Eficiencia` e depois vamos pedir que o entity ignore a propriedade `Eficiencia`. Veja o código:

csharp

Agora se eu executar o código anterior para incluir a terceira geladeira eu terei sucesso, porque o EF está convertendo a propriedade para a string específica (B no caso) e a check constraint irá validar esse valor. Ótimo!

O único senão é o fato de expormos uma propriedade (EficienciaString) apenas para superar uma limitação em uma ferramenta. Um desenvolvedor que consumisse essa classe poderia ficar confuso ao ver duas propriedades relacionadas à eficiência. Qual delas utilizar?

Mas com a atualização do EF Core para a versão 2.1 isso não é mais necessário!! Agora o EF Core suporta a conversão de valores entre propriedades do modelo e colunas do banco. Vamos ver como isso é feito e substituir a solução acima.

## Como EF Core 2.1 converte valores

Segundo a documentação do EF Core 2.1 [sobre o assunto], agora é possível converter valores de propriedades ao ler e escrever na base de dados. Isso pode ser feito para converter valores do mesmo tipo ou tipos diferentes. Um exemplo da segunda alternativa é a conversão de um tipo enumerado em uma string.

Para realizar a conversão usamos o método `HasConversion()` no momento da configuração do modelo. Esse método faz parte da classe `PropertyBuilder` e tem 8 sobrecargas, cada uma com uma alternativas de conversão. Meu objetivo nesse artigo não é explorar todas as possibilidades. Se ficou curioso, dê uma lida na documentação através do link que disponibilizei.

A sobrecarga que vamos utilizar é uma que recebe dois delegates Func como entrada. Um para converter do enumerado para string e o outro na direção contrária. Vamos lá?

## Aplicando a nova solução

Primeiro vamos atualizar o EF Core para a versão 2.1. No Nuget Manager para o projeto, clico na aba Installed e depois em Update (certifique-se que está atualizando o EF Core para uma versão 2.1 ou superior).

Em seguida removo a propriedade `EficienciaString` e volto a propriedade `Eficiencia` para uma propriedade auto-implementada:

csharp 

Agora vou na classe de contexto e substituo o código anterior pelo código de conversão...

csharp

Beleza! Testo a aplicação com uma inclusão de ar condicionado e tudo funciona perfeitamente.

## Conclusão

É sempre importante buscar um código simples e conciso. Algumas vezes isso não é possível por conta de limitações nas tecnologias que usamos. Mas sempre que possível devemos revisitar nosso código para verificar se podemos refatorá-lo. Com a nova versão do EF Core 2.1, pudemos voltar ao design simples de um POCO (_Plain Old CSharp Object_), sem abiguidades ou dúvidas para os desenvolvedores que irão consumir a classe SeloProcel.

Também vale a pena ficar antenado nas atualizações das tecnologias que você utiliza em seus projetos, principalmente quando o time de desenvolvimento já houver sinalizado que iria implementar a solução dessas limitações em seu roadmap.

Se desejar baixar e conferir o código que utilizei nesse artigo, vá até seu [**repositório**] no Github.

Até o próximo artigo!



Durante o desenvolvimento de um projeto, é muito comum usarmos IDEs para facilitar todo o processo de build do projeto, seja para a realização de compilação de arquivos ou a execução da aplicação.

imagem 


Hoje veremos alguns truques e dicas do [**Intellij IDEA**] que faz parte de uma das mais famosas e poderosas IDEs do mundo Java.

> **Observação:** Vale lembrar que o IntelliJ em sua versão Ultimate, trata-se de uma ferramenta paga que possue um Trial de **30 dias**. Entrentato, existe também a versão free que é justamente a versão **Community** (comunidade). Se tiver interesse em saber a diferença entre as versões, [consulte o site da própria Jetbrains]. Caso não tenha o IntelliJ instalado, você pode seguir esse [**tutorial de instalação**] da própria Jetbrains ou utilizar o [**Toolbox**] que é um gerenciador de pacotes da Jetbrains, com ele é possível instalar todos os produtos facilmente.

Todos os exemplos que veremos no post serão baseados na versão Community, pois dessa forma você não vai precisar baixar a trial apenas para testar.

Além disso, irei considerar um projeto Java simples para um estoque, portanto, todos os exemplos serão voltados para esse projeto. Caso não tenha nenhum projeto, peço que crie um, [nesse link tem um tutorial explicando os passos]. Preparado? Bora começar então.

## Ajustando os atalhos do IntelliJ

Um dos grandes primeiros passos com o IntelliJ é ajustar os atalhos, no caso, o **_keymap_**. Nesse instante você deve estar pensando:

> "Então os atalhos não vem configurados?"

Sim, os atalhos já vem configurados, porém, dependendo da plataforma pode ser uma configuração diferente da padrão!

### Qual keymap devo escolher?

Ao ajustar o keymap, você verá diversas alternativas referenciando ferramentas como Eclipse IDE ou NetBeans. Quando eu comecei a aprender o IntelliJ eu estava acostumado a usar o Eclipse IDE, portanto, optei em usar o keymap **Eclipse**.

Alguns atalhos funcionam de forma parecida com os comportamentos do Eclipse, entretanto, durante o meu tempo de adaptação, haviam outros que só funcionavam conforme os atalhos padrões do IntelliJ, portanto, tive que me adaptar.

Nesse processo de adaptação (durou meses), decidi parar de usar os atalhos do Eclipse e migrei para os padrões do IntelliJ (Default), a princípio parecia contra-intuitivo, mas conforme fui treinando fui me acostumando...

Atualmente já estou bem acostumado com os atalhos do IntelliJ e me sinto produtivo, portanto, não sinto falta dos atalhos do Eclipse! Em outras palavras, não desanime logo de cara caso não se sentir produtivo, o aumento da produtividade vai surgir conforme for praticando!

Por experiência própria, recomendo para todos os devs que estão tentando migrar de uma outra IDE para o IntelliJ fazer o mesmo, ou seja, evite o uso de atalhos de uma ferramenta que já está acostumado, tente se adaptar praticando aos poucos com os atalhos padrões, conforme for praticando, perceberá que já se acostumou! 

## Configurando o keymap

Agora que fizemos o overview sobre os atalhos, vamos configurar o **keymap**. Portanto, no IntelliJ, vá no menu **File > Settings**:

imagem]. Para isso, selecione o **src** e use o atalho **Alt + Insert**:

imagem do IntelliJ que tem como objetivo criar algo.

Veja que ele apresenta como primeira opção uma classe do Java, pois ele acredita que seja a opção mais adequada nesse contexto, portanto clique ou tecle o **Enter** na opção **Java Class**. Em seguida dê o nome **Main**, pois será a classe para executar o nosso programa:

imagem e encontrar rapidamente o atalho que busco, seja pelo nome ou pelo próprio atalho.

Além disso, o keymap faz referência ao último keymap configurado, portanto, caso mudar o keymap, lembre-se de pedir a **Keymap References** novamente.

> **Recomendações**: Considerando que existem os atalhos padrões para cada plataforma recomendo que sempre avalie quais atalhos "default" fazem mais sentido pra você. Por exemplo, desenvolvedores que utilizam Mac OS preferem os atalhos padrões para Mac, pois são mais intuitivos. E claro, mantenha-se utilizando sempre o keymap reference para te auxiliar.

Agora que sabemos como buscar um atalho, vamos prosseguir com o nosso exemplo.

## Templates de código

De acordo com o que temos agora, queremos de fato executar a nossa classe `Main`, certo? Para isso precisamos implementar o método `main()`. A princípio você deve estar pensando:

> "Bom preciso apenas escrever o método `public static void`

Pois é, no IntelliJ é mais simples do que parece, basta apenas digitar as iniciais da assinatura do método `main()` que ele já sugere e faz o resto pra gente:

imagem` junto da mensagem, porém, veja o tanto que a gente tá escrevendo apenas com essa chamada!

Nem precisa falar que tem atalho, né? Digite **`sout`** e veja o IntelliJ completando assim como ele fez no método `main()`:

imagem` junto com o método de impressão sem muito esforço, mas como podemos fazer para executar o método `main()`?

A princípio pensamos em clicar no botão de play localizado no menu **Run > Run...** que serve justamente pra isso.

Entretanto, a ideia do uso de uma IDE, principalmente do IntelliJ, é fazer com que o uso do mouse seja raro ou inexistente justamente para aumentar a produtividade.

Sendo assim, para executarmos a nossa aplicação, basta apenas usar o atalho **Ctrl + Shift + F10**.

> Antes de executar deixe uma mensagem no `System.out.println()`, eu deixei "Rodando a aplicação estoque"

Na parte de baixo vai aparecer a saída conforme o exemplo abaixo:

imagem** para navegar no projeto por meio da barra de navegação:

imagem.

## Criando atributos e seus getters e setters

Agora que temos a classe `Produto` precisamos adicionar os atributos, portanto vamos considerar os atributos abaixo:

java

Legal, mas veja que agora teremos um trabalhinho para adicionar os métodos de acesso aos atributos, isto é, os **getters e setters**.

Mas como já sabemos, as IDEs estão aí para salvar as nossas vidas, portanto, é mais simples do que fazer na mão, basta apenas usar o atalho **Alt + Insert** novamente que ele vai abrir as opções `Generate`:

imagem` faça a instância da classe `Produto`:

java

Agora que temos uma instância precisamos de um objeto. A princípio bastaria apenas escrevermos algo como `Produto produto =`, certo?

Porém, podemos fazer isso de uma maneira mais fácil. Com o cursor em cima do `new` utilize o atalho **Alt + Enter**, veja que ele vai aparecer a opção **Introduce local variable** que vai atribuir a instância para o objeto do tipo `Produto` automaticamente:

java

Note que inicialmente o IntelliJ sugere o uso do nome `produto`, pois por padrão ele utiliza o nome da instância, mas nada impede de você editar conforme desejar :)

O atalho **Alt + Enter** é utilizado diversas vezes quando estamos dentro do código, é por meio dele que o IntelliJ nos sugere as dicas de possíveis ações baseando-se no local ao qual o cursor está, ou seja, já que ele estava no `new` ele sugeriu a introdução da variável, se fosse um erro de compilação, provavelmente, ele sugeriria outras opções.

## Alternando entre as classes abertas

Legal, temos o objeto, mas como podemos de fato criar um produto que tenha o nome de "refrigerante", valor "5.00" e quantidade "10"? Atualmente, precisamos utilizar todos os setters...

Uma abordagem mais objetiva seria criar de fato um construtor personalizado que já recebesse esses parâmetros, mas como podemos fazer isso no IntelliJ?

A princípio, bastaria irmos para classe `Produto` com o **Ctrl + N** e depois usar o **Generate** com o atalho **Alt + Insert**.

De fato funciona, porém, já que temos ambas as classes abertas, temos a capacidade de alternar entre elas de um modo mais simples. Basta apenas usar o atalho **Ctrl + Tab**:

imagem

Em outras palavras essa funcionalidade é conhecida como **find action**, ou na tradução, **encontrar ação**, portanto, podemos até mesmo criar um projeto apenas com esse atalho. A única coisa que ele vai exigir é um pouco do conhecimento de inglês para facilitar o uso.

## Conclusão

Nesse post vimos como o IntelliJ facilita a nossa vida durante o desenvolvimento de um projeto, entretanto, vimos apenas a parte básica na qual permite criar arquivos e navegar no projeto.

Vimos também como podemos usar o template de código para facilitar a implementação de códigos comuns, como é o caso do método `main()` ou o `System.out.println()`.

Além disso, aprendemos a gerar códigos comuns dentro de uma classe com o **Generate** e vimos que o IntelliJ também nos sugeres possíveis ações dependendo do contexto.

Por fim, vimos que temos a possibilidade de usar qualquer funcionalidade com apenas um único atalho! Bacana, né?

Quer aprender mais técnicas da IDE para aumentar a sua produtividade em projetos Java? Então não perca tempo e veja o [**curso de IntelliJ IDEA na Alura**].

Nele você vai aprender desde os conceitos mais básicos, conforme vimos nesse artigo, como também, técnicas que são bem eficientes em qualquer projeto Java, seja na busca, navegação, refatoração entre outras.




Na semana passada anunciamos no [blog da Caelum] que estou começando uma série de posts sobre Java 9, pra que todos possam acompanhar as novidades da linguagem até o seu tão esperado lançamento oficial.

 A [JEP 286, Local-Variable Type Inference]:

> "We seek to improve the developer experience by reducing the ceremony associated with writing Java code, while maintaining Java's commitment to static type safety, by allowing developers to elide the often-unnecessary manifest declaration of local variable types.

### Melhora contínua na inferência de tipos do Java

A idéia da JEP 286 é continuar o trabalho que já vem sendo feito nas versões anteriores da linguagem, que é diminuir verbosidade, reduzindo a quantidade de informações de tipagem que temos que declarar explicitamente em nosso código.

Quer um bom exemplo? O famoso _diamond operator_ do Java 7:

java

 

### Java 7 e o operador diamante

O operador diamante <> nada mais é do que um _syntax sugar_ dos tipos que tinham que ser declarados explicitamente no momento de instanciar objetos genéricos. Até então, o código anterior teria que ser escrito assim:

java

Foi um grande passo, mas a inferência de tipos ainda era bastante limitada.

 

### Java 8 e muitas novas possibilidades

No Java 8, novas JEPs foram aprovadas e parte do compilador foi reescrito, melhorando drasticamente sua habilidade de inferir tipos. A introdução das expressões lambdas foram um grande motivador. Um exemplo seria esse comparator, que mostramos anteriormente em nosso [**post de Java 8**]:

java

Apesar de ser possível, em nenhum momento precisamos declarar que a variável **s** da expressão lambda era do tipo _String_. Estamos ordenando uma lista que é do tipo _String_, portanto isso foi inferido automaticamente.

 

### A possível inferência de variáveis locais do Java 9

A proposta do Java 9 foi além, sugerindo que a seguinte sintaxe seja aceita:

java

Repare no uso do **var** e do **val**. A diferença entre essas duas palavras chaves é que a primeira, usada na lista de palavras, representas uma variável local, mutável, do tipo _ArrayList_. A segunda representa uma variável local imutável, isto é, final.

Seria equivalente a escrever:

java

 

### Mas isso só vai funcionar com listas?

Esse recurso não se limita apenas na declaração de listas e objetos genéricos...

java

Legal, não é? Ele pode ser usado desde uma simples _String_, um inteiro, ou até mesmo _Path_s, _InputStream_s, mapas, sets e outros.

java

### E qual é a opinião da comunidade?

O Brian Goetz, um dos arquitetos do Java, publicou uma pesquisa para coletar a opinião da comunidade a respeito dessa proposta. O resultado foi impressionante:

![survey result]

2.453 pessoas participaram e o entusiamo para adoção da feature foi evidente, 74.1% votaram a favor! Tiveram outras perguntas na pesquisa também, [você pode ver o resultado completo aqui]. E você, o que achou dessa proposta? Vale lembrar que ela ainda pode ou não ser aprovada, tudo depende da Oracle. Mas se você quiser, já dá pra ir brincando com [alguns builds não oficiais].

**Se você ainda não domina Java 8 e os recursos atuais da linguagem, com certeza vai gostar do nosso [curso da Alura] e também do [livro publicado pela Casa do Código]. A Alura usa Java 8 desde o lançamento final desta versão da linguagem, e com Java 9 não será diferente.**




Em um sistema desenvolvido para a área de telemarketing de uma empresa foi encontrado um bug na hora de mostrar a média das notas dos atendentes. Temos a seguinte tabela de notas para nos mostrar de forma visual o problema:

java

Note que, nesta tabela todos os valores estão vindo quebrados, com diversas casas decimais. Só que, para apresentar as notas aos funcionários, precisamos simplificar esse valor para que seja melhor visualizado.

Para consertar este bug, primeiro vamos observar o método que calcula e devolve a média:

java 

Realmente o cálculo da média não toma nenhum cuidado com o arredondamento. O `double` resultante terá a quantidade de casas decimais que chegue mais próximo do verdadeiro resultado da operação matemática, respeitando o limite de casas decimais do tipo primitivo `double`.

O primeiro passo para resolver esse problema é criar um método que cuida exclusivamente de arredondar o valor calculado pelo método `calculaMedia()`. Então, mesmo sem ter criado este método, vamos retorná-lo no `calculaMedia()`. Dessa forma:

java 

## Criando a função de arredondamento

Já dei spoiler de como será nosso método, ele recebe como parâmetro um `double` que é o resultado do `calculaMedia` e retorna um `double` também, que é o resultado do `calculaMedia()` arredondado. Então vamos começar a criar este método:

java 

Para arredondar nosso `double`, podemos usar o método estático [**round()**] da classe [Math]:

java 

Tendo como exemplo um funcionário que teve as seguintes notas: 4.0,3.7 e 7.8, representado por este código:

java

A média dele, na calculadora, seria: 5,166666667. Vamos ver o resultado que nosso método nos traz:

imagem` devolve o `long` mais próximo do valor real passado no parâmetro. No nosso caso, temos aproximadamente o valor real de 5,2. Portanto, o `long` mais próximo é o 5.

Esquecendo o 5 que obtivemos vamos tentar de novo com as mesmas notas que usamos no exemplo anterior, mas antes, vamos melhorar nosso método.

Para melhorar esse arredondamento, podemos usar uma gambiarra. Pensando que o método `round()` arredonda para o `long` mais próximo, podemos multiplicar a `media` por 100, usar o `round()` e depois dividir por 100. Fazendo isso no código, temos:

java

Executando o código, nosso resultado é:

imagem` que arredondou para o `long` mais próximo, 517, e por fim dividimos 517 por 100, obtendo 5,17.

Tudo certo, né? Vamos tentar agora com outros valores. As notas do funcionário agora serão: 3,1, 4,3 e 2,5. O resultado teoricamente seria 3,30. Vamos ver:

imagem]:

java

Nessa linha estamos dizendo que arredondaremos da metade para cima, ou seja, caso a média seja 3,625, ela ficará 3,63.

Por fim, vamos formatar nossa média usando o método `format()` e já retornar este valor. Dessa forma:

java

Perceba que ao fazer isso recebemos um erro de compilação. Isso aconteceu pois nosso método `arredondar()` espera retornar um `double`, mas o método `format()` devolve uma `String`. E agora?

Se pararmos para pensar, até faz sentido retornarmos uma `String`, pois já fizemos todas as operações matemáticas que precisamos fazer. Agora só precisamos devolver o valor formatado para o usuário ver. Logo, como não precisaremos mais operar sobre a `media`, retornar a mesma como `String` faz sentido sim.

> Mas não poderíamos apenas transformar essa String em um double e devolver este valor?

Sim, podemos, mas corremos o risco de perder a formatação feita, logo vamos optar por retornar uma `String` mesmo. Então, vamos mudar nossos métodos para retornar `String`.

## Conclusão

Pronto, formatamos os dados da maneira devida. Trabalhar com arredondamento às vezes é uma tarefa complicada, dependendo da situação precisamos de valores extremamente precisos, como, por exemplo, trabalhar com dinheiro.

Para manipular dinheiro o mais adequado é usar a classe [**BigDecimal que tem um alta precisão**].


Para entender melhor como é trabalhar com arredondamentos e principalmente quando o assunto é dinheiro temos o curso da Alura [**Curso Java Brasil: Formate datas, cpf e números nacionais**], onde é usado uma biblioteca externa que ajuda na hora de formatar valores de forma correta.





imagem 

Precisamos de ambientes iguais, tanto para desenvolvimento, testes e produção. Ou seja, em todos esses ambientes, a versão das bibliotecas, frameworks e demais dependências devem ser iguais. Do contrário, podem causar erros.

Mas como conseguimos ter ambientes iguais?

## Conhecendo os containers

Nós podemos criar especificações que devem ser seguidas para manter todos os ambientes o mais igual possível. Dessa forma, todos os desenvolvedores criam seus ambientes por meio dessas especificações, porém, isso pode levar muito tempo de todos os desenvolvedores.

Outra forma de fazer isso é criar apenas um ambiente e replicá-lo para todos do time. Ou seja, criamos apenas uma vez esse ambiente e ele é repassado para todos da equipe. Para isso, podemos utilizar **containers**.

Num primeiro contato, definimos containers como uma "virtualização não convencional". Isto é, em uma virtualização tradicional, colocamos outro sistema operacional em cima do nosso.

Esse sistema virtualizado possui o próprio kernel e hardwares virtuais. Já quando criamos containers, estamos compartilhando o kernel e o hardware da máquina com os containers.

Ou seja, nosso container possui apenas as bibliotecas e binários necessários para seu funcionamento. Por isso, são mais leves do que a virtualização tradicional.

Um desses sistemas de criação de containers é o [**Docker**]. Com ele conseguimos criar nossos containers a partir de imagens, que nada mais são do que especificações de containers.

Dessa forma, quando precisarmos testar nosso programa, basta criar um container (ou containers) baseado na nossa imagem. Portanto, precisamos criar uma imagem.

## Criando nossa própria imagem

Para criar imagens no Docker, podemos utilizar o `Dockerfile` para criar um imagem baseada em uma imagem existente.

Por exemplo, podemos criar uma imagem da nossa aplicação e rodá-la em um container. Para isso, vamos criar um arquivo chamado `aplicacao.dockerfile`.

Nesse arquivo, temos que falar qual a imagem que estamos nos baseando para criar nossa imagem. Como minha aplicação é em `Python`, vou dizer que ela se baseia (`FROM`) na imagem do `python`.

`FROM python`

Nossa aplicação utiliza um microframework Python para web chamado Flask. Ou seja, nossa imagem precisa ter esse framework para a aplicação funcionar. Logo, dizer para o Dockerfile rodar (`RUN`) o comando para instalá-lo:

`RUN pip install flask`

Queremos que o container rode nossa aplicação. Portanto precisamos copiar (`COPY`) o código da nossa aplicação para a nossa imagem. No meu caso, o código está na pasta `src`, logo, vou copiar esse diretório para o diretório `/src`:

`COPY src /src`

Temos que acessar nossa aplicação de alguma forma. Para isso, nós podemos expor (`EXPOSE`) uma porta do nosso container. Dessa forma, sempre que quisermos acessar a aplicação podemos utilizar essa porta do **container**.

Já temos o interpretador do Python, o código da aplicação e uma porta para conseguir acessá-la. Falta alguma coisa?

Falta iniciarmos a aplicação! Para fazer isso, podemos dizer que quando o container for criado, isto é, no seu ponto de entrada do container (`ENTRYPOINT`) vamos pedir para o `"python”`, executar nossa aplicação: `”/src/app.py”`

`ENTRYPOINT ["python", “/src/app.py”]`

Nosso arquivo final fica dessa forma:

python

Pronto! Temos um Dockerfile file especificando uma imagem. Contudo, perceba que não temos a imagem pronta. Para isso, precisamos falar para o Docker construí-la.

## Construindo uma imagem

Para construir nossa imagem, pelo terminal vamos até o diretório onde criamos o Dockerfile.

Lá pedimos para o Docker construir (`build`), baseado no arquivo (`-f`) `aplicacao.dockerfile`, com o nome (`-t`) que, no meu caso, vou chamar de `yurimatheus/app` (nome-do-usuário/nome-da-imagem) já que é um padrão no Docker.

Também precisamos dizer que todos os arquivos para construir a imagem estão neste diretório, para isso, utilizamos o ponto (`.`) no final do comando:

`docker build -f aplicacao.dockerfile -t yurimatheus/app .`

imagem um container baseado na imagem que acabamos de criar (`yurimatheus/app`):

`docker run yurimatheus/app`

Lembra que colocamos uma porta no container para conseguir acessar a aplicação? Logo, temos que mapear uma porta da nossa máquina host para o container. Isto é, dizer que quando alguém acessar uma porta na máquina host, na verdade estará acessando o container.

Neste caso, vou falar que a porta (`-p`) `8080` da nossa máquina host vai ser mapeada para a porta `5000` do container, que foi a porta que especificamos no Dockerfile:

`docker run -p 8080:5000 yurimatheus/app`

![]

Funcionou! Temos nossa aplicação rodando em um container com uma imagem que nós mesmos criamos.

## Para saber mais

Criamos um Dockerfile bem simples. Podemos criar Dockerfiles para criar imagens complexas, com diversos outros recursos.

Além de copiar arquivos para a imagem, podemos também criar volumes. Como o container é um processo isolado do sistema host, quando salvamos algo no container e este é reiniciado, ou desativado, nós perdemos esses dados.

É aí que os volumes entram em cena. Com volumes fazemos uma cópia dos dados do container na nossa máquina local. Dessa forma, mesmo se o container parar, ainda temos os dados disponíveis.

Podemos também utilizar o Docker para reduzir nossos gastos como, por exemplo, os gastos com servidores. Ao invés de ter um servidor para cada aplicação, podemos ter containers.

Podemos tem um container para cada ambiente, testes, homologação, produção. Ou então, podemos ter diversos containers nesses ambientes. Um para cada serviço, criando assim, uma [**arquitetura de microserviços**].

Para gerenciar esses diversos containers, o Docker nos oferece uma ferramenta chamada de [**Docker Compose**]. Com ele, conseguimos compor uma aplicação com diversos containers.

No [**curso de Docker da Alura**], além de aprender sobre como o Docker funciona, como criar suas imagens, a como subir seus container na nuvem, você também aprende a utilizar o Docker Compose.

Porém, quando o número de containers começa a crescer muito, mesmo com o Docker Compose é difícil de gerenciá-los. Por isso, foram surgindo outras ferramentas, uma muito utilizada é o Kubernetes.

Com ele conseguimos orquestrar nossos containers com base em um único arquivo de configuração.

Aqui na Alura, temos um [**curso de Kubernetes**], onde você aprenderá a realizar essa orquestração. A realizar a comunicação de containers da aplicação com banco de dados, a escalar seus containers e realizar o balanceamento de carga, entre outras coisas.





imagem 

Empresas como Amazon, Google, Microsoft, entre outras, fornecem parte da infraestrutura que já possuem para que nós usuários possamos utilizar em nossos projetos. Sendo assim, nesse artigo, vamos explorar os serviços da Amazon AWS.

Após meses de desenvolvimento em nosso projeto de _e-commerce_ de livros de tecnologia, feito com o framework do [**Spring MVC**], chegou o momento de levar esse nosso projeto para o ambiente de produção para que os usuários possam acessar nossa aplicação.

Para disponibilizar esse projeto na internet, precisamos de servidores, equipamentos de rede, alocação de endereços IP, etc, porém acaba sendo um custo muito elevado para nós, não é mesmo?

Dessa forma, justamente visando eliminar essa barreira inicial de investimento, empresas como Amazon, Google, Microsoft, entre outras, fornecem parte da infraestrutura que já possuem para que nós usuários possamos utilizar em nossos projetos. Sendo assim, nesse post, vamos explorar os serviços da [**Amazon AWS**].

## Cadastrando um livro

Nosso projeto tem como objetivo que os administradores da plataforma façam o cadastro dos livros, para que posteriormente esses livros estejam disponibilizados na _home_ da aplicação, fazendo assim com que todos os usuários possam visualizar os produtos que oferecemos e, eventualmente, realizar a compra desses livros.

imagem está dentro desse limite de uso gratuito e poderemos utilizá-lo para nosso teste.

Uma vez que terminamos o processo de criação de conta na Amazon AWS, seremos redirecionados para o painel inicial onde temos uma lista com os vários serviços disponíveis. Na aba de _Storage_ seremos capazes de visualizar o serviço do **S3**.

imagem que será responsável por armazenar as imagens de nossa aplicação. Para isso, clicamos no botão **Create bucket.**

imagem juntamente com as credenciais de acesso que foram configuradas no método **basicAWSCredentials()** que acabamos de criar. Ao final, nossa classe **AmazonConfiguration** deverá ter ficado dessa forma

java

Tendo o arquivo de configuração finalizado, devemos ir até a classe do projeto responsável pelo tratamento das imagens e fazer o uso dos métodos para enviar os arquivos para o _Bucket_ que criamos.

## Configurando classe de tratamento de imagens

Vamos até a classe de nosso projeto responsável pelo tratamento das imagens, chamada **_FileSaver_** e pedir para o Spring fazer a injeção do objeto do tipo **AmazonS3** que configuramos na classe **AmazonConfiguration**

java

Com isso, poderemos chamar o método **putObject** para fazer o envio das imagens para o _Bucket_. O primeiro argumento desse método espera receber um objeto do tipo **PutObjetctRequest**, onde deveremos passar as informações do nome do _Bucket_, nome com o qual o arquivo deverá ser salvo no _Bucket_, o fluxo de dados que compõem o arquivo e metadados de informação, caso seja necessário.

java

Por padrão, quando um arquivo é enviado para o _Bucket_, esse arquivo possui uma visibilidade privada e com isso nenhum usuário que for acessar a aplicação será capaz de visualizar a imagem das capas dos livros.

Dessa forma, nós precisamos alterar a visibilidade desses arquivos para que a leitura seja pública, ou seja, qualquer usuário que tiver a URL de acesso, conseguirá visualizar as imagens das capas dos livros.

Para isso, devemos chamar o método **withCannedAcl** e passar como argumento desse método uma _ENUM_ de leitura pública, com isso, quando as imagens dos livros forem cadastradas no _Bucket,_ terão uma visibilidade pública de leitura e todos os usuários irão conseguir visualizar as imagens.

java

Agora que as imagens das capas dos livros foram passadas para o _Bucket_, esse nosso método deverá retornar justamente a URL de acesso de cada uma dessas imagens para que seja _persistida_ no banco de dados, com as demais informações que compõem o livro.

Por padrão, os arquivos dentro de um _Bucket_ na Amazon seguem a seguinte estrutura de acesso: 
* http://s3.amazonaws.com/ \[Nome do Bucket\] / \[Nome do arquivo\]. Colocamos então:

java 

Com isso, nossa classe final responsável pelo tratamento das imagens cadastradas deverá ter ficado dessa forma

java

## Analisando resultados

Nós fizemos as configurações necessárias em nosso projeto para enviar as imagens das capas dos livros, falta somente nós testarmos a aplicação e ver se de fato as imagens estão sendo enviadas para o _Bucket_ e se conseguimos visualizar as imagens em nossa aplicação. Para esse teste, iremos utilizar a imagem do livro **Algoritmos em Java** do autor **Guilherme Silveira.**

![]

O que esperamos nesse momento é que ao clicarmos no botão **Cadastrar**, a imagem do livro seja passada para o _Bucket_ que configuramos no serviço do **S3** e que possamos visualizar essa imagem na home da aplicação.

![]

Veja que temos aqui justamente a informação que o livro foi cadastrado com sucesso, vamos conferir se a imagem do livro está no _Bucket_ que configuramos na Amazon?

![]

Vejam só o resultado, agora nesse _Bucket_ temos justamente um arquivo com nome **algoritmos_java.jpg,** que é justamente a imagem do livro que cadastramos, será que se formos na home de nossa aplicação, conseguiremos visualizar a imagem do livro cadastrado?

![]

Olha só!! Conseguimos ter a imagem do livro que cadastramos sendo disponibilizada na aplicação, com isso, todos os usuários da internet que forem acessar a _home_ serão capazes de visualizar as informações dos livros que acabamos de cadastrar.

Você pode encontrar a versão final do projeto com as alterações [**nesse link**].

Gostaria de aprender mais sobre a Amazon AWS e Cloud Computing? Na Alura temos [**cursos especialmente sobre Cloud Computing**] 




O principal objetivo dessa **mudança no Google** inibir páginas sem conteúdo relevante e favorecer aquelas que apresentam maior qualidade, variedade de informação e originalidade.

Inicialmente, Fred não foi apresentado como um nome oficial a Google não realizou uma notificação a respeito dessa mudança nem apresentou detalhes sobre ela. Esse nome foi dado inicialmente pela comunidade da [**área de Marketing Digital**] para a alteração no código,que pegou os SEOs de surpresa ao perceberem uma brusca redução do ranqueamento de diversos websites.

## Como foi dada essa descoberta?

Para se ter uma ideia, alguns SEOs se certificaram de que houve uma importante alteração por uma [troca de Tweets] entre o produtor de marketing digital Avinash Murty e o analista de tendências de Webmaster do Google John Mu.

Nessa conversa, entrou em pauta uma flutuação observada no ranqueamento de algumas páginas. O funcionário do Google disse que são feitas atualizações constantemente, e essa variação pode ter ocorrido em função de alguma delas.

De fato, a empresa realiza diversos updates em seu algoritmo de busca ao longo do ano. Alguns, que provocam mudanças mais importantes em termos de ranqueamento de páginas e na variação do tráfego, acabam se tornando mais conhecidos.

Temos como exemplo o [**Hummingbird**], que tornou a plataforma de busca mais rápida e precisa, e o [Panda], que passou a dar prioridade a conteúdos de mais relevância e qualidade.

## Quais as mudanças provocadas pelo Fred?

No caso do Fred, a mudança está relacionada aos critérios para a prioridade de exibição de páginas web.

O algoritmo faz um julgamento mais aprimorado da qualidade dos links criados que direcionam para a página (backlinks) e faz com que páginas mais focadas em serem encontradas por mecanismos de busca do que em criar bom conteúdo percam em termos de prioridade ou, até mesmo, não sejam listadas.

Para entender bem a questão, seguem alguns conceitos muito aplicados em [**marketing digital**] para aumentar o tráfego do site que estão relacionados ao Google Fred update:

### Keywords

São palavras, frases ou expressões relacionadas a um conteúdo em uma página WEB. Ajudam a resumi-lo e em sua identificação. Quando aplicadas em seus metadados, o mecanismo de busca qualifica melhor a página, conforme a pesquisa realizada por um usuário.

### SERPs

É a sigla para Search Engine Results Page (página de resultados de mecanismo de busca). É um tipo de plataforma onde se pode encontrar quais páginas serão listadas, em ordem de prioridade, por mecanismos de busca, a partir de consultas.

O ponto forte de um SERP é que ele pode realizar esse ordenamento por busca de keywords, o que ajuda a encontrar palavras chave adequadas para otimizar o tráfego na página.

### Rankings de websites

São os sites exibidos no topo quando se faz uma pesquisa em um mecanismo de busca como o Google.

### Otimização de páginas

A otimização de página se dá por meio de diversas técnicas de SEO, como criação de metadados, estilização de títulos, uso de palavras-chave e organização do conteúdo de uma forma que o mecanismo de busca não apenas entenda aquele conteúdo como ideal conforme a busca, como dê preferência a ele na ordem de exibição.

### Backlinks

São links adicionados em uma página que direcionam para outra página. São usados com muita frequência para indicar referências e facilitar a pesquisa do leitor da página que,ao clicar em um link, encontra com mais facilidade uma informação adicional.

Bons backlinks aqueles adicionados em páginas com conteúdo confiável e muito acessadas valorizam o site para o qual eles apontam.

Então, para aumentar o tráfego em uma página, o administrador adiciona, nos metadados e ao longo do texto, keywords identificadas como mais poderosas, para alavancar o número de acessos. Quando o mecanismo de busca as encontra, dá à página prioridade na exibição. Os SERPs são utilizados para encontrar as melhores keywords.

A página também é estruturada para facilitar o encontro das keywords e, sempre que possível, os geradores de conteúdo procuram colocar links para outras páginas e, assim, aumentar o tráfego.

Cabe ressaltar que o uso dessas técnicas é perfeitamente legal e, inclusive, são boas tanto para o usuário — que pode, com mais facilidade, logo ao realizar uma busca, encontrar na lista de resultados a página que mais o interessa — quanto para o produtor de conteúdos de qualidade, pois ele é encontrado e pode assim disponibilizar para o seu público informações que lhe interessa.

## O problema são os excessos!

É comum que uma página, principalmente aquelas que dependem de alto número de acessos e cliques em suas propagandas para sobreviverem, abuse desses recursos. Então, abrem mão da informação de qualidade em detrimento do uso de técnicas de SEO.

São considerados conteúdos de má qualidade aqueles que, em vez de conter informações que resolvem um problema relacionado à busca que o levou àquele artigo, foram tecnicamente elaborados apenas para [**aumentar o tráfego no site**].

Excesso de palavras-chave e de propagandas também reduzem sua nota.

Já os backlinks podem ser gerados de forma automática por bots. Eles colocam links em comentários de posts em diversas páginas, povoando a web de links para aquela página, ainda que sem um contexto apropriado.

## Como saber se a minha página foi afetada?

Consulte o [**Analytics**] e veja se ocorreu alguma redução no tráfego entre os dias 5 e 20 de março de 2017. Caso não tenha havido uma redução significativa do número de acessos, a qualidade dos links e de seu conteúdo está de acordo com os novos critérios.

Usando uma ferramenta para checar os backlinks, verifique se algum deles tem qualidade questionável. Verifique também se os backlinks considerados bons aparentam ser naturais.

## Como não ser afetado pelo Google Fred update?

A primeira consideração a ser feita é zelar pela qualidade do conteúdo. [**Adicione informações relevantes**] aos posts, que realmente interessem ao leitor que fora trazido até ela. Evite excessos de palavras-chave, a priorização do buscador em detrimento do usuário e repetição de conteúdo.

Seja criativo e procure apresentar diversidade de temas e tópicos relacionados ao assunto principal que a página aborda. Apresente as informações de maneiras distintas como guias, listas, comparativos de produtos e serviços. Enfim, ajude seu leitor a realmente conseguir encontrar ali o que precisa para resolver o seu problema.

Não use ferramentas que automatizam a criação de links e apenas os adicione quando for apropriado e de forma contextualizada!

Portanto, o Google Fred update é uma atualização do algoritmo de busca do Google que tem por objetivo filtrar páginas com conteúdo de baixa qualidade, porém, que eram bem-sucedidas em termos de ranqueamento por utilizarem de maneira abusiva técnicas que as favorecem.

Parodiando as torcidas do Fluminense e Atlético Mineiro, “O Fred vai te pegar” caso o conteúdo de sua página não seja realmente relevante para os leitores e os links criados para ela tenham sido criados por robôs, sejam descontextualizados ou excessivos.

Esperamos que com esse artigo tenhamos esclarecido o conceito do Google Fred update e como ele impacta no sucesso das páginas que geram conteúdo para Web.


Para ter sempre em mãos informações que contribuirão para o seu desenvolvimento profissional, assine a nossa newsletter!




imagem 

O que costumava ser um meio estático evoluiu para uma experiência muito rica e interativa.

No entanto, não importa o quanto tudo mudou no processo de produção, já que o sucesso de um app ou site ainda depende quase exclusivamente de uma coisa: UX Design (ou, em português, experiência do usuário). A cultura de UX está cada vez mais presente nos aparelhos que usamos diariamente, em especial nas interfaces digitais de computadores e smartphones.

Conheça, no post de hoje, como os celulares atuais têm evidenciado a _user experience_, ditando as necessidades do mercado atual:

## A experiência do usuário

A [**experiência do usuário**], do inglês _user experience_ (comumente abreviada como UX), diz respeito a como alguém se sente ao se conectar a um sistema. Esse sistema pode ser um site, uma aplicação web, um software desktop ou mesmo a interface que o conecta ao caixa eletrônico de seu banco.

Quem trabalha com [**UX Design**] estuda e avalia como os usuários interagem com essas interfaces, considerando coisas como a simplicidade de uso, percepção de valor, eficiência, utilidade, entre outros aspectos que tornam uma experiência positiva. O objetivo de tal avaliação é melhorar a satisfação e lealdade do cliente, criando produtos úteis, fáceis de se utilizar e altamente interativos.

Se UX Design é a experiência que um usuário tem ao interagir com seu produto, ele é também, por definição, o processo pelo qual determinamos (ou pelo menos tentamos antecipar) que experiência será essa.

## Smartphones e _user experience_: uma nova fronteira

O smartphone, como conhecemos, já existe há mais de uma década. Pode parecer para você que os últimos anos voaram, mas é mais provável que você sequer se lembre como era a vida antes do smartphone. É tão difícil imaginar como vivíamos antes destes dispositivos quanto imaginar o que virá a seguir.

Hoje, eles são onipresentes e tão bem-sucedidos em suas funções que é perturbador pensar em nossa rotina sem esses computadores de bolso. Desde que telefones começaram a se tornar inteligentes — e à medida em que a internet móvel ficou realmente rápida — a UX Design começou a decolar.

Designers tiveram a oportunidade realmente nova de pensar interações e estratégias para fazer as trocas homem-máquina com smartphones serem prazerosas. E o impacto de suas decisões foi tão grande que uma tendência hoje toma conta da _user experience_: o _mobile first_.

## _Mobile first_ e a mudança de paradigma

_Mobile first_ é exatamente o que seu nome indica: dispositivos móveis primeiro. Tendência popular nas comunidades de design e desenvolvimento, o conceito foi divulgado pela primeira vez na TechWeek de Chicago, em 2011 quando John Buda explicou como escrever [**websites responsivos**].

Essa ideia, de que você poderia aplicar JavaScript para dizer a um [**website que se adapte**] a qualquer dispositivo, foi revolucionária e se transformou em uma nova forma de entender usabilidade.

Entretanto, empresas como o Google já adotavam uma estratégia de _mobile first_ desde 2010, e, graças a elas, projetar primeiro para uma experiência em dispositivos móveis e depois para desktops passou a ser a norma entre as startups de tecnologia que queriam fazer produtos que funcionassem tão bem tanto em uma plataforma quanto na outra.

A abordagem exige um planejamento diferenciado, grande foco em UX Design e no desenvolvimento e desloca completamente o paradigma da _user experience_. Em vez de pensar primeiro nas exibições em desktop e nos ajustes que fariam dessas interfaces responsivas, designers passaram a levar em consideração especificamente o mobile em suas criações, criando a partir dele as soluções para desktops.

Se hoje a estratégia mobile first é adotada por muitos sites e aplicativos, não era assim no começo. Devemos entender que isso só aconteceu porque os dispositivos móveis são, atualmente, o principal meio pelo qual usuários acessam sites da web. Além disso, como o número de pessoas que usam smartphones segue crescente — e deverá aumentar ainda mais nos próximos anos, a tendência acabou por se instaurar em definitivo.

Essa é uma prova de como os smartphones colocaram a cultura UX em destaque. Levando desenvolvedores e designers a pensar primeiro na experiência para estes dispositivos, devido a sua popularidade, o advento desses aparelhos foi o bastante para gerar novas oportunidades de trabalho para designers ao redor do mundo.

Há, ainda, outro motivo para a _user experience_ se concentrar nesses dispositivos. O mero desenvolvimento de tecnologias como o HTML5 e o CSS3, que juntas oferecem novos recursos que suportam chamadas JavaScript sensíveis, fez com que fosse possível trazer a UX de aplicativos para o desktop.

Hoje, desenvolvedores podem dizer aos sites da web que se comportem de uma determinada maneira, tendo os recursos para otimizar seus [**layouts**] para dispositivos específicos. Isso permite a criação de aplicações ricas em contexto, um dos motivos responsáveis por tornar essa abordagem tão popular.

## _User experience_: do celular para o computador

Se no começo aplicávamos a linguagem dos desktops para os celulares na criação de designs, o que acontece hoje é o contrário: elementos de UX antes encontrados apenas em plataformas móveis estão começando a cruzar para os desktops, com [**excelentes resultados**].

Você já deve ter visto por aí, em páginas como o Medium, menus pop-up de texto selecionados. Pois bem, esses elementos surgiram no smartphone — mais especificamente no iOS 3. Ali, as funções de cortar, copiar e colar apareceram pela primeira vez em um menu contextual, função que foi copiada por outras desenvolvedoras e evoluiu até chegar no desktop.

Hoje, é comum que as novidades venham do mobile e se adaptem para as interfaces web. E por que elas funcionam bem em ambos os meios? Porque são baseadas na simplicidade.

O bom design é tão claro e reduzido quanto possível. Se no mobile somos obrigados a trabalhar com restrições extremas para produzir _user experience_ de ponta, é também ali que surgem soluções simplificadas e fáceis de usar que podem ganhar corpo e evoluir para outros meios.

## Como o celular colocou UX Design em destaque?

É exatamente por "forçar" essa simplicidade que o celular popularizou a cultura de UX. Antes dele, nunca foi tão relevante pensar soluções que exigem o mínimo de interação e produzem o máximo de resultado. Depois dele, no entanto, nenhuma de nossas experiências com interfaces foi mais a mesma.

Entendeu por que UX Design ganhou destaque com o advento dos smartphones? Aproveite e siga a Alura nas redes sociais para aprender tudo sobre _user experience_. Temos perfis no [Facebook], [Twitter],[Linkedin] e um canal no [YouTube]!




A compactação e descompactação de diretórios e arquivos é uma tarefa bastante comum no dia a dia. Podemos compactar um diretório para enviar para um amigo ou realizar um _backup_. Talvez para alguns usuários, mais comum que a compactação seja a descompactação: no nosso cotidiano podemos baixar arquivos compactados dos mais diversos tipos e, naturalmente precisaremos descompactá-los para que seja possível utilizá-los devidamente.

O objetivo da compactação é unir vários arquivos em um só, fazendo também com que o arquivo final fique menor e seja mais fácil de transferir. Isso é feito através de programas [compactadores de arquivos], que utilizam algoritmos para que seja possível reduzir o tamanho dos dados que serão compactados.

Um dos formatos de compactação bastante conhecido é o **zip**. Você certamente já viu algum arquivo com extensão `.zip` em sua vida. No Linux, para compactar no formato `.zip` utilizamos o comando `zip`. Tenho um diretório, dentro do diretório do meu usuário (`/home/nome_do_usuario`) que contém alguns projetos, vamos ver o conteúdo desse diretório através do comando `$ ls -l Projetos/`.

Note que utilizei o argumento `-l` junto ao `ls` para obter uma lista mais detalhada. O "d" no início de cada linha indica que temos dois diretório dentro de `Projetos` (`GeradorDeXML` e `GeradorDeJSON`).

imagem.

bash

Espera aí! Dentro do arquivo `projetos.zip` existe apenas o diretório `Projetos/`. O que houve com os diretórios `GeradorDeJSON` e `GeradorDeXML`?

Acontece que, por padrão, o `zip` não inclui os arquivos e subdiretórios de um diretório, por isso nosso `.zip` contém apenas o diretório `Projetos/` vazio. Para resolver isso é fácil: basta passar o argumento `-r` (_recursive_).

bash

Veja só! A saída do `zip` já foi diferente. Vamos listar o conteúdo do `.zip` gerado.

bash

Agora sim! Os subdiretórios foram incluídos. Perceba que o `zip`, por padrão, informa na saída do terminal todos os diretórios e subdiretórios que estão sendo compactados. O `unzip` funciona da mesma forma na descompactação. Para que isso não ocorra, podemos utilizar o argumento `-q` (_quiet_).

Vamos primeiro excluir o diretório `Projetos/` para que no momento da descompactação o diretório seja criado novamente.

bash

Pronto! O arquivo foi descompactado e temos a estrutura de diretórios de antes.

Vimos como utilizar o `zip` para compactação e descompactação de arquivos. Em breve um outro post será publicado onde será utilizado o `tar` para realizar a compactação e descompactação.

Cursos de uma série preparatória para a certificação [Linux Essentials] também estão sendo [lançados]!





imagem 

Estou **configurando a rede** em uma empresa. Nesta empresa, existem dez computadores e um servidor, ambos conectados a um **switch** que, por sua vez, está conectado a um roteador. 

imagem deve possuir um [**endereço IP válido**] para que exista comunicação.

Nesse caso, são onze máquinas (dez computadores e um servidor), mas poderiam ser vinte, cinquenta, cem máquinas. Teríamos que alocar todos, um por um? Isso, além de tomar muito tempo, pode causar alguns erros, como alguma máquina sem endereço ou com endereços repetidos.

Não existe alguma maneira de designar o endereço de todas as máquinas automaticamente?

Conseguimos fazer nosso roteador entregar os endereços IPs para cada máquina que fizer a requisição. Dessa maneira, não precisamos configurar máquina por máquina e, além de economizar tempo que seria usado para alocar os endereços, essa prática evita de ter endereços repetidos.

O protocolo que realiza isso é chamado de [**DHCP**].

## O que é o DHCP

DHCP (Dynamic Host Configuration Protocol) é o [**protocolo**]) que distribui endereços IPs, para as máquinas. Desta forma, cada máquina que fez a requisição recebe um endereço IP e um [**gateway**].

**Vamos especificar apenas o endereço do servidor manualmente.** Dessa forma o IP do servidor não mudará, já que, caso isso ocorra, alguns serviços providos podem ficar indisponíveis.

Colocarei o endereço do servidor como `192.168.0.2`, mas pode ser aquele que mais se adequa a seu projeto.

Agora vamos ver como configurar nosso DHCP!

## Configurando o DHCP nos roteadores Cisco

Para realizar a configuração do serviço de DHCP em um **roteador Cisco**, precisamos acessá-lo via terminal. No terminal temos que acessar o modo de usuário privilegiado. Para isso digitamos: `> enable`.

imagem via o terminal (`terminal`):

`# configure terminal`

imagem para a rede, que entregará os endereços (`dhcp`). Esse serviço terá o nome (`pool`) que, no nosso caso, será chamado de `REDE`.

`(config) # ip dhcp pool REDE`

imagem**.

Nossa rede pode ser qualquer uma que esteja dentro de um endereço de [**IP privado**]. Neste caso vou utilizar o endereço de rede `192.168.0.0` mas pode ser aquele que melhor se adequar ao caso (desde que seja um endereço válido).

`(dhcp-config) # network 192.168.0.0`

imagem é o que divide o endereço IP em duas partes: endereço da rede e endereço do host. Cada vez que na máscara conter um `255`, significa que aquela parte do endereço IP pertence a rede.

```
Rede: 10
Host: 0,0,0
Máscara: 255,0,0,0

```

Por exemplo, um endereço de rede igual a `10.0.0.0` e sua máscara de rede igual a `255.0.0.0`. Isso indica que todos os computadores com endereço 10.alguma_coisa pertencem a rede.

Isto é, o host `10.0.1.0` pertence a essa rede, da mesma forma que o host `10.1.2.3`. Já que o `255` indica qual é a rede:

Agora, se tivéssemos um host com o IP `11.0.1.2` ele não pertenceria a rede dos anteriores, pois o que indica a rede é o `10`, que representa o `255` na máscara.

Dependendo da máscara dizemos se o IP é de classe A, B, ou C. Em redes privadas funcionam basicamente assim:

- **IP da rede:** 10.0.0.0 à 10.255.255.255- IP classe A - Máscara padrão: 255.0.0.0
    
- **IP da rede:** 172.16.0.0 à 172.31.255.255 - IP classe B - Máscara padrão: 255.255.0.0
    
- **IP da rede:** 192.168.0.0 à 192.168.255.255- IP classe C - Máscara padrão: 255.255.255.0
    

Neste caso vou utilizar a padrão da [**classe C**] (`255.255.255.0`). Dessa forma, o endereço `192.168.0` pertence a rede.

`(dhcp-config) # network 192.168.0.0 255.255.255.0`

imagem.

Como queremos especificar qual o **roteador padrão** da nossa rede, basta digitar: `default-router` seguido do endereço IP do roteador, que no nosso caso é o: `192.168.0.1`.

imagem do nosso **pool** DHCP. Assim nosso roteador não o entrega:

`(config) # ip dhcp excluded-address 192.168.0.1`

imagem.

Para isso precisamos de um serviço chamado [**DNS**]. Ele nada mais é do que um outro protocolo de rede que **resolve** nomes de domínio, transformando-os em endereços IPs.

Por exemplo, o endereço `www.google.com.br` pode ser equivalente à 216.58.202.67. Esse é o processo de **resolve**.

Podemos deixar nosso roteador entregar o endereço do **servidor DNS (DNS Server)**, basta informar seu endereço.

Para isso vamos voltar ao seu modo de configuração, na parte que configura o serviço de DHCP, e digitar:

`(dhcp-config) # dns-server`

Precisamos informar o endereço IP do nosso servidor DNS. No meu caso, o endereço IP do servidor é aquele que removemos anteriormente do **pool** de entregas do DHCP: `192.168.0.2`.

`(dhcp-config) # dns-server 192.168.0.2`

![]

Pronto dessa maneira temos o serviço de DNS configurado. Vamos tentar acessar novamente o site da **Alura**:

![]

Sucesso! Agora temos todas as máquinas conectadas com seus endereços IPs, gateway e DNS sendo alocados dinamicamente.

## Conclusão

Tínhamos que configurar o endereço IP de vários hosts, vimos como realizar sua configuração de uma maneira dinâmica utilizando o DHCP.

Entendemos também como configurar o serviço de DHCP em roteadores Cisco, provendo endereços IPs, DNS e gateways para os computadores que requisitarem.

**Com o DHCP não precisamos especificar o endereço IP de máquina por máquina, ele faz isso automaticamente, o que nos poupa muito tempo.**

Gostou de redes? Essa é apenas uma parte desse vasto mundo de redes. Aqui na Alura, temos uma [**formação completa em Redes**]. Nela você aprenderá sobre **protocolos, como configurar roteadores e switches, sobre segurança da informação** e muito mais!




Todo [**designer**], redator, jornalista, freelancer ou qualquer outro profissional que trabalha com criatividade sabe a importância de manter essa habilidade em sua rotina. No entanto, para ser criativo, não é necessário ter nenhum dom especial, por mais incrível que pareça. Como ela não é inata, qualquer pessoa pode melhorar a criatividade. E estímulos constantes são essenciais para isso.

Muitos profissionais costumam passar por bloqueios mentais e criativos. Nessas horas, é normal entrar em desespero e achar que nunca mais vai conseguir criar como antes.

Prevendo esses momentos de “branco total”, fizemos uma lista com algumas dicas que podem ajudá-lo a recuperar a criatividade. Confira agora mesmo:

## Saia da rotina

Vá a outros lugares, passeie pelo parque ou shopping, mude o trajeto para o trabalho ou faculdade, faça coisas diferentes. A sua criatividade será melhor estimulada quando você ousar sair da rotina.

Procure novos cursos, seja de música, dança ou até mesmo de cuidador de idosos. Trabalhos voluntários também são bons meios de sair do cotidiano, além de fazer com que você se sinta útil e uma pessoa melhor.

## Escreva sobre outros assuntos

Se você trabalha mais com textos do que com imagens, que tal sair do lugar-comum e escrever sobre outros assuntos? Faça um diário ou um blog, escreva frases motivacionais para uma página do Facebook. Escreva não por obrigação, mas por prazer e você verá a diferença na hora de criar.

Está sem ideias? Pense naquilo que você mais gostava de fazer na sua infância. Esse pode ser um bom ponto de partida.

## Ande por lugares desconhecidos da cidade

Muitas vezes, fazer uma caminhada não é bom apenas como um exercício físico, mas também como um meio de exercitar a criatividade.

Vá para outros bairros, conheça novas praças e parques, explore o lugar onde mora. Com toda certeza, você não só vai descobrir espaços urbanos que nunca imaginou, como também terá novas inspirações para seu trabalho. Só tome cuidado com assaltos!

## Viaje para melhorar a criatividade

Gostou tanto de andar pela cidade que quer conhecer outros lugares? Então, aproveite o embalo e viaje! Pode ser uma viagem curta, por cidades perto de onde você mora, ou pode ser até mesmo uma internacional. O importante é conhecer novos ambientes, ampliar a sua cultura e conhecer novas pessoas.

Acredite, um intercâmbio cultural pode ser bastante benéfico para a sua saúde mental e social!

## Anote seus sonhos

Você sabia que, durante o sono, o seu cérebro permanece em atividade? Por isso, o seu processo criativo continua enquanto você dorme.

Portanto, quando você acordar e perceber que teve uma ideia genial enquanto dormia, não estranhe! Tenha um caderno e um lápis ao lado da sua cama e sempre anote sonhos e ideias que você teve durante a noite. Se não se lembrar, não se preocupe: anote as sensações que teve durante o sono.

## Descanse a mente

Após passar horas trabalhando em um processo criativo, você deve notar que, em algum momento, a sua mente não responde mais. Isso é normal, é sinal de que você precisa descansar o seu cérebro.

Leia algum livro interessante ou até mesmo gibis, vá assistir a sua série favorita, jogar ou dançar. Relaxe um pouco antes de voltar ao trabalho. Cuide, também, da sua alimentação e saúde.

## Durma bem todas as noites

Descansar só a mente não basta, o corpo também precisa de descanso. Você tem uma rotina diária de sono? Não? Então, é bom começar a se programar para dormir!

Procure sempre dormir em um mesmo horário, desligue aparelhos eletrônicos e todas as luzes indiretas. Evite, também, consumir comidas pesadas antes de ir para a cama e fazer exercícios estimulantes meia hora antes de dormir. Dessa forma, a sua criatividade e até mesmo a sua saúde agradecem.

## Mantenha-se informado

Esteja atualizado continuamente. Procure notícias, informações, saiba o que está acontecendo no mundo. Isso é crucial para ter uma criatividade ativa, pois você estará estimulando o cérebro sempre com novas informações.

No entanto, tome cuidado com o excesso e as fontes das informações que você busca, principalmente na internet. Informações são cruciais, mas é necessário saber filtrá-las.

## Conheça novas pessoas

Para desenvolver as suas relações pessoais, você não precisa estar sempre viajando. Afinal, você conhece todas as pessoas da sua cidade? Claro que não! Muitas vezes, não conhecemos nem os nossos vizinhos!

Sendo assim, procure por novas amizades, seja frequentando algum curso, um grupo religioso. Vá em busca de afinidades, nem que seja no supermercado ou na quitanda! Se você é tímido, um curso de teatro pode lhe ajudar a destravar e, ainda, a conhecer novas pessoas com a mesma dificuldade que a sua.

## Comece um novo hobby

Mesmo assim está difícil estimular a sua criatividade? Que tal começar um hobby? Inove em alguma atividade que nunca pensou em fazer. Ou melhor, sabe aquela atividade que você sempre quis fazer mas sempre teve receio? Comece por ela!

Faça artesanato, yoga, pilates! Quem sabe até algum [**curso**]de manutenção de residências? Invente! Muitas vezes, a sua criatividade não foi embora, ela só se escondeu até que você ouse fazer algo novo. Não hesite em, pelo menos, tentar!

As dicas acima procuram não consertar permanentemente a sua falta temporária de criatividade, mas são um suporte para lhe ajudar em alguns momentos críticos. Caso mesmo assim você não consiga [**melhorar**] a criatividade, é recomendável procurar uma ajuda especializada, como um psicólogo. Procure algum por indicação, seja de amigos ou de parentes, mas deve ser um profissional de confiança.

**Em casos mais graves, como perda de memória e cansaço, típicos de muito trabalho mental, a solução pode ser tirar umas férias do trabalho criativo e relaxar por alguns dias. Afinal, como o texto deixa bem claro, se você não relaxar, a mente não cria. A criatividade necessita, antes de mais nada, de um bom tempo livre. Há quanto tempo você não tira férias? Permita-se desligar um pouco, cuide mais de você mesmo!**





E se existem várias linguagens, [**quantas devo aprender?**] Uma, duas, três, todas que eu puder?.

Quando estamos ingressando nesse mundo de programação, essas são algumas perguntas que podem surgir. Por isso, ter em mente qual o seu objetivo, é muito importante no processo de aprendizagem.

Hoje em dia, grande parte das aplicações no mercado estão na web, sejam eles sites web ou aplicativos mobile utilizam esses serviços.

Se o foco é ingressar rapidamente no mercado de trabalho buscar uma linguagem que atenda esses quesitos é importante.

> _"Tudo bem, eu quero entrar no mundo de desenvolvimento web, o que devo fazer?"_

## O básico

O primeiro passo para se [**aprender qualquer linguagem é saber lógica de programação**]. Por mais que cada linguagem tenha suas singularidades, a lógica é a mesma para todas, apenas o modo de aplicá-la pode ser diferente.

## E como fica na parte de front-end?

Se o foco é estudar web, [**aprender lógica com Javascript**] pode ser um ótimo começo. Javascript é umas das linguagens mais utilizadas no mundo e a principal linguagem quando falamos de front-end.

Começar vendo lógica com Javascript pode encurtar o caminho para aprender outras tecnologias como Angular, React, ou NodeJS.

> _"Mas e se eu já sei Javascript e quiser migrar para o back-end?"_

Se você já sabe Javascript, você pode criar [**aplicações no lado do servidor usando NodeJS**], um framework usado por muitas empresas para desenvolver suas aplicações back-end.

Ou então, você pode [**aprender PHP, umas das linguagens de back-end mais utilizadas no mundo**]. Com PHP você pode começar a desenvolver para [**WordPress, o sistema de gerenciamento de conteúdo que roda por trás de grande parte dos sites do mundo**].

## Já no back-end...

Se estiver buscando algo mais voltado ao back-end, isto é, o código que roda no servidor, talvez aprender [**lógica de programação com Ruby e criar seu próprio jogo**] possa ser um bom caminho.

A linguagem Ruby possui o framework Rails, um frameworks muito utilizado no mundo back-end.

Temos também outras linguagens como Java, ou C# com .Net.

Com Java, além de desenvolver para [**back-end com JavaEE**] ou com o [**framework Spring**], você consegue [**desenvolver para smartphones Android**], ou então aprender [**Kotlin**] pode ser uma boa pedida.

No caso de querer se especializar apenas em uma plataforma, como o IOS, talvez [**aprender Swift**], a linguagem da Apple para desenvolvimento de seus apps.

Com .Net também temos uma linguagem muito usada no mundo corporativo, e também podemos desenvolver tanto para IOS quanto para Android, [**utilizando o Xamarin**].

Agora, se você seguiu como um desenvolvedor Javascript, você pode utilizar seus conhecimentos de front-end e desenvolver para [**mobile utilizando Cordova**], ou [**Ionic**].

## "E o que mais posso fazer?"

Além de programação, temos outras áreas no mundo de TI. Como por exemplo [**redes de computadores**].

Aprender mesmo que o básico de redes, como conhecer os protocolos, entender sobre roteadores e switches, é algo importante para o profissional de infra.

Entender como [**funciona um sistema operacional**] pode ajudar a preparar um servidor para receber uma aplicação.

Caso você queira integrar seus conhecimentos em programação com infra, talvez [**estudar para ser um DevOps**] é o caminho a se seguir.

DevOps nada mais é do que a integração da equipe de desenvolvimento (Dev) com operações (Ops), ou seja, com a equipe de infra.

Com o objetivo já definido fica mais fácil [**criar um calendário de estudos**]. E para você que quer entrar no mercado de trabalho, talvez [**utilizar o LinkedIn**] pode ser de grande auxílio para alavancar sua carreira.




Como criar uma campanha para oferecer seu serviço na Internet? O **Google Ads** pode ser intimidador. Há as variações de anúncios, keywords, search terms, landing pages, cpc, cpa, impressões, impression share e uma dezena de outras métricas para ficar atento, além de modos automatizados como DSA. Mas se quero criar uma simples campanha de bairro pra vender meu serviço, como do delivery do meu restaurante, ou dos serviços do escritório de odontologia, qual o caminho mais simples e o que preciso saber?


Exemplo de imagem

imagem




O que o código abaixo imprime no console?

javascript

A variável `x` é definida globalmente, fora da função com o valor `2`. Depois, é redefinida dentro da função com o valor `3`.

A resposta mais lógica é a seguinte: deveria ser impresso `2`, o valor da variável global, e depois `3`,o valor da variável local, depois da redefinição.

Mas será impresso:

javascript

Poxa... Mas por que?

O código JavaScript é executado em duas fases. Primeiro, é feito o **parsing**, em que são vasculhadas declarações de variáveis, funções e parâmetros. Só depois é feito a execução de fato.

O efeito disso é que é como se as declarações de variáveis fossem levantadas para o topo da função ou arquivo em que estão definidas. O nome chique para esse levantamento é **variable hoisting**. Coisa parecida é feita com funções...

Traduzindo o código para a maneira que o JavaScript vai executá-lo:

javascript

**JavaScript tem as suas pegadinhas... Para conhecer mais da linguagem, veja os [**cursos de Javascript**] da Alura.**




As razões para essa frase aparecer no **Manifesto Ágil** são várias, mas, para mim, a mais impactante é que, quando temos uma documentação extensa, frequentemente cria-se a ilusão de que não precisamos conversar com o cliente e entendê-lo melhor, já que o documento (supostamente) cobriria essa função.

No entanto, esse pensamento se baseia em pontos perigosos: assume-se que quem escreveu a documentação realmente entendia do negócio, que essa pessoa (ou comitê) conseguiu escrever de forma clara para todos os indivíduos que a consumirão, que esses indivíduos vão interpretar o texto bem e ninguém esquecerá de detalhes potencialmente muito importantes... e de que esse documento será sempre atualizado, conforme as mudanças aconteçam.

Na prática, a frase do Manifesto significa que evitamos desperdiçar tempo com documentações que não serão lidas ou que ficarão obsoletas rapidamente. Em vez disso, preferimos que o próprio software seja sua documentação, através de:

**Testes de unidade automatizados: código que verifica um método/função/classe que, para um dado cenário controlado, a saída esperada é tal. Essa é uma documentação para o desenvolvedor que for alterar esse código interno no futuro.**

Testes de aceitação automatizados: código que simula o que o usuário do sistema fará, seu comportamento usando uma funcionalidade. Essa é uma documentação para quando o time for alterar o que um determinado código faz.

Clean code: prática de trabalhar ativamente para deixar o código claro e coeso, para que o próximo que venha a mexer nele não precise gastar tempo desvendando o que ele faz. Esse é um guarda-chuva gigante de boas práticas no dia-a-dia de desenvolvimento.

Se o código ainda não está bom, a ponto de qualquer um entendê-lo... Documentação dinamicamente gerada: geração automática, através de ferramentas específicas de cada linguagem, da relação entre as partes e classes do sistema. Frequentemente, usa-se UML aqui, e há diversas ferramentas que analisam um código e geram os diagramas que refletem o estado atual do design e arquitetura do sistema.

É claro que, dependendo do seu contexto, você pode ser obrigado a prover certas documentações para, por exemplo, o cliente. Nesse caso, fazemos o possível para evitar trabalho desnecessário, mas... infelizmente, jogamos com a regra do jogo atual.

**Como é possível organizar essas documentações de software ao final de cada iteração?**

O método mais comum para nos certificarmos que uma certa documentação obrigatória seja entregue é acrescentar um passo ao nosso Critério de Pronto, para que todo o time saiba, claramente, que todo item desenvolvido precisa ser documentado e, também, para que eventuais gargalos nesse step fiquem explícitos para todos.

Gostou? Que tal dar uma conferida no meu [**curso de scrum**] na Alura? :)




Aqui na empresa em que eu trabalho, usamos um sistema de comunicação interna que, por alguns, já é considerado um tanto antiquado. É o [**IRC**], um protocolo de comunicação que funciona, principalmente, como bate-papo por texto, e que teve seu _boom_ lá pros anos 90. Com ele, podemos mandar mensagens privadas e conversar em grupos nos denominados **canais**.

Se é tão antigo, por que escolhemos continuar usando ele? A questão é que, mesmo antigo, ele ainda funciona muito bem! O protocolo é muito simples e leve, além de dar espaço para modificações e extensões diversas, o que torna seu uso bastante desejável.

Além de uma própria rede de IRC interna nossa, usamos um canal na conhecida rede [**Rizon**], o `#minha-empresa`, para facilitar a comunicação com clientes.

Este canal é nosso principal meio de comunicação com os clientes. O problema é que estávamos com poucos funcionários para acompanhar todo o conteúdo das mensagens de lá a todo momento.

Frente a esse problema, nosso time de tecnologia me encarregou de criar algo que poderia nos ajudar com a comunicação, não decepcionando os clientes - um [**bot de IRC**] que, automaticamente, mandaria uma mensagem de boas vindas a todo mundo que entrasse no canal.

A ideia é bacana! Mas como podemos implementar isso? Como fazer um programa que se conecte ao IRC e ainda envie uma mensagem específica para todos que se conectem a um determinado canal?

## Conhecendo os _sockets_

A primeira coisa que precisamos conseguir fazer com nosso programa robô é que ele entre em nosso canal `#minha-empresa` lá dentro da Rizon.

A questão é que, antes de entrarmos no canal em específico, precisamos começar alguma comunicação com o próprio servidor da Rizon. Mas como?

Nosso bot estará rodando em um processo em um servidor próprio da empresa, enquanto o servidor de bate-papo IRC da Rizon funciona em um processo completamente diferente, fisicamente em outra(s) máquina(s). De alguma maneira, precisamos fazer uma comunicação entre esses processos.

Tratando-se de comunicação entre dois processos diferentes, a saída quase sempre é a mesma - **[soquetes]**, ou, originalmente, _sockets_. Apesar de abstrato, esse conceito aparece para todos nós, usuários da Internet, cotidianamente!

O nosso navegador, por exemplo, utiliza _sockets_ para fazer **todo tipo de requisição web**. Quem trabalha com desenvolvimento de software ainda se depara com outros múltiplos exemplos, como na [**conexão a um servidor via SSH**] ou integração de um sistema a um banco de dados.

Tudo isso necessita do uso de _sockets_ para efetuar a comunicação entre dois processos diferentes (que, na verdade, podem até estar em máquinas diferentes!).

Então como é que o IRC entra nisso? A questão é que o protocolo IRC funciona com base no modelo [**cliente/servidor**], no qual os usuários usam uma aplicação cliente para, através de um **socket**, se conectar ao servidor. Em nosso caso, o bot é justamente a aplicação cliente! Mas como podemos fazer isso com o Python?

## Criando sockets com o módulo `socket` no Python

Assim como diversas outras linguagens de programação, o Python tem algumas especificações que nos permite trabalhar com _sockets_. No caso, temos um [**módulo inteiro**], o próprio `socket`.

O módulo `socket` abriga uma classe essencial, que representa, justamente, um _socket_. A classe tem o mesmo nome do módulo - `socket`. Assim, instanciá-la não deve ser muito difícil, certo? Basta importamos o módulo para nosso programa e chamarmos a função construtora dessa classe:

python

Testando o código, vemos que ele realmente funciona! É tão simples assim, então? Bem… mais ou menos!

Na realidade, não basta falarmos que queremos um _socket_ para ele magicamente aparecer. Precisamos especificar algumas definições. Afinal, como o computador vai saber como o _socket_ criado deve funcionar?

O que acontece é que, por padrão, o Python passa isso tudo automaticamente através de parâmetros padrões no construtor. Vamos entender isso.

### Especificações do socket

Em primeiro lugar, de alguma maneira o computador precisa saber, ao criar um _socket_, com o que ele vai conseguir se comunicar. Como já vimos, _sockets_ podem ter funcionalidades bem diversas - podendo se comunicar com processos dentro ou fora de uma mesma máquina.

Com o nosso bot, estamos tratando de comunicação remota. Nesse caso, temos uma constante própria que especifica isso, chamada de **AF_INET**.

Essa constante faz parte de um grupo denominado **famílias de endereços**, ou **_address families_**, que constitui exatamente o primeiro parâmetro opcional do construtor `socket`. A **AF_INET** abrange os endereços do tipo [**IPv4**], antigo padrão da Internet e, por isso, pode ser ideal para nós!

Além da família de endereços, precisamos especificar mais uma coisa - **o tipo do socket**. Como assim? O que acontece é que, na Internet, existem diversas formas e modelos para se efetuar uma comunicação. Assim, precisamos definir um, ao criarmos nosso objeto `socket`.

Em relação ao tipo do socket, existem duas constantes mais importantes - a **SOCK_STREAM**, que define _sockets_ de fluxo, e a **SOCK_DGRAM**, que define _sockets_ de datagrama. Mas, na prática, qual a diferença delas duas?

Basicamente, um _socket_ de fluxo se refere ao protocolo **TCP**, enquanto um _socket_ de datagrama, ao **UDP**. As diferenças entre TCP e UDP não são poucas, mas, no nosso caso, não precisamos ir tão fundo.

Queremos estabelecer uma **conexão** com o servidor do IRC. Entretanto, no modelo UDP não há conexão! É um protocolo chamado de _connectionless_, por isso. Mas como não há conexão?

O que acontece é uma troca de pacotes desordenada e pouco confiável. A vantagem fica na alta velocidade, como já discutimos antes.

No caso de um sistema de chat por texto, as desvantagens citadas acabam sendo extremamente negativa, tirando o sentido do uso desse protocolo. Assim, por padrão, o protocolo IRC usa o **TCP** e, assim, a constante **SOCK_STREAM**.

Agora já podemos criar nosso objeto `socket` no Python, com muito mais especificação:

python

Agora que temos nosso objeto `socket`, basta nos conectarmos ao servidor da Rizon. Mas como?

### Se conectando ao servidor de IRC

Com nosso objeto `socket` criado, partir para a parte de conexão não é difícil, basta um método - o `connect()`. E como o Python vai saber com quem se conectar? Bem, a princípio ele não sabe! Precisamos especificar isso através de um parâmetro na chamada do método.

Sockets da família AF_INET necessitam apenas de um parâmetro, que é justamente o endereço com o que queremos nos conectar. Esse endereço é uma [**tupla**] contendo o host que queremos nos conectar (pode ser desde um IP, a um _hostname_) e a porta pela qual queremos realizar a conexão.

Com uma rápida visita no [site oficial da Rizon], descobrimos que o _hostname_ padrão dessa rede é o **irc.rizon.net** e a porta oficial, assim como é por padrão em outras redes de IRC, a **6667**. Assim, podemos efetuar a conexão:

python

Com a conexão estabelecida, podemos partir para a comunicação!

## Comunicação com o `socket`

Agora que temos nosso objeto `socket` configurado e conectado a um servidor da Rizon, podemos começar nossa comunicação.

No geral, como clientes, começamos a comunicação checando se o servidor quer enviar algo pra gente.

Com um objeto `socket`, podemos fazer isso simplesmente pedindo para receber (_receive_), através do método `recv()`, que toma como parâmetro o número de bytes que queremos receber do servidor.

[**A própria documentação do Python**] nos recomenda usar, nesse parâmetro, uma pequena potência de 2, "para melhor compatibilidade com as realidades de hardware e rede". Assim, podemos usar um valor como **2048** (2¹¹):

python

> É importante notar que `recv()` é um **método blocante**, o que significa que todo o resto do programa vai esperar a execução dele para continuar rodando. Até recebermos algo, o programa vai continuar esperando.

Rodando esse código, recebemos a seguinte resposta:

python

De fato é uma mensagem, mas desse jeito fica difícil de ler… por quê? Acontece que, como o `b"` no começo indica, recebemos os dados em [**bytes**], não em string!

Para melhorar a impressão, podemos decodificar os bytes em uma string com o método `decode()`, que recebe como parâmetro o _encoding_ queremos usar. No caso, usaremos o **[UTF-8]**, por suportar [**Unicode**]:

python

Agora sim, olha o que apareceu:

python

Hum… por que todos esses "NOTICE" e ainda essa mensagem de erro, no final? A mensagem avisa que a conexão está sendo fechada porque o tempo de registro expirou. Ué, fizemos algo errado? Que registro é esse?

## Burocracias do IRC

O IRC é um protocolo há vários anos já bem definido, que especifica muito bem como uma conexão deve ser trabalhada com esse protocolo.

No [**seu primeiro RFC**], foi definido padrões de registro para todo usuário do IRC, uma série de passos que todo cliente deveria seguir ao se conectar a uma rede de IRC.

Esses passos se resumem a três comandos, nessa ordem:

- **PASS**, a senha de registro do nickname em uso;
- **NICK**, o nickname que será usado e
- **USER**, que especifica outros detalhes do usuário (como nome verdadeiro).

Sabendo disso, agora podemos fazer o registro!

### Registrando um usuário

Em primeiro lugar, precisaríamos enviar a senha. Como nem temos nick registrado, podemos simplesmente ignorar esse passo e partir para o comando **NICK**, com o nickname que queremos usar, que pode ser **BotDaEmpresa**.

A princípio, é só enviar o comando `NICK BotDaEmpresa` para o servidor da Rizon, através de nosso socket, mas na realidade não é bem assim… O que acontece é que o protocolo IRC carrega mais algumas burocracias para funcionar.

Uma delas, por exemplo, diz respeito a tudo que é enviado do cliente para o servidor - todos os comandos devem terminar com a sequência de caracteres especiais `'\r\n'`, representando um **ENTER**, o envio. Agora, podemos usar o método `send()` de nosso objeto `socket` para enviar o comando:

python

Quando rodamos um código… erro!

python

Assim como quando recebemos dados com nosso socket, precisamos enviá-los como bytes. O processo é similar ao que usamos quando decodificamos os bytes recebidos para uma string, mas dessa vez faremos o contrário, com o método `encode()`.

python

Certo! Podemos, agora, enviar o último comando de registro - o **USER**. O comando **USER** toma quatro parâmetros (_username_, _hostname_, _servername_ e _realname_), todos os quais podem ser resumidos pelo próprio nick que escolhemos.

Vale notar que esse último parâmetro, apesar de não ser importante para nós, deve ser precedido com um `:`, indicando que ele pode conter espaços (e que tudo depois do `:` faz parte de um único parâmetro):

python

Legal! Funciona, mas nosso código está começando a ficar feio, com tanta repetição da parte burocrática de enviar um comando…

Para simplificar o processo, podemos fazer algumas funções que fazem todo esse processo de envio de comandos e registro automaticamente:

python

Além disso, após a efetivação da conexão, vou fazer um loop que me permita sempre ver o que estou recebendo do servidor, dessa forma:

python

Será que agora vai? Rodamos o código e olha só o que apareceu na tela:

python 

Olha só! Dessa vez apareceu uma mensagem diferente, esse tal de **PING** com alguns números estranhos. Ao final de tudo, ainda recebemos aquele mesmo erro. Mas e agora? Não conseguimos fazer o registro?

### O comando **PING**

Na verdade, fizemos o registro adequadamente, e por isso mesmo recebemos a mensagem diferente de **PING**. O problema está justamente nela, ou, mais especificamente, no fato de a termos ignorado.

E o que significa esse **PING**? Esse tipo de comando é muito comum em sistemas que exigem a manutenção de uma conexão. Ele serve para que se teste a latência dela, isto é, quanto tempo demora para um conjunto de dados ser enviado de uma máquina a outra e receber uma resposta.

O IRC trabalha suas conexões através desse comando. De quando em quando, o sistema do servidor envia um comando **PING** seguido de uma mensagem (nesse caso, `3685587899`) e aguarda a resposta do cliente com essa mesma mensagem. A diferença é que a resposta do cliente, em vez de ir com o comando **PING**, deve usar o **PONG**.

Se o servidor não receber a resposta do cliente em um determinado tempo, a conexão é efetivamente encerrada, por isso recebemos aquela última mensagem de erro.

Precisamos já implementar um tipo de automatização - sempre que recebermos um **PING**, precisamos responder com um **PONG**. E como fazer isso?

Em primeiro lugar, precisamos conseguir identificar quais mensagens recebidas contêm um **PING**. Como vimos, mensagens desse tipo contêm o texto `PING :` seguido pelos dados que precisamos enviar de resposta. Para evitar complicações, podemos simplesmente verificar se esse trecho de texto existe na mensagem com o conhecido operador `in`:

python

Verificando que a mensagem recebida é do tipo **PING**, podemos enviar de volta o comando **PONG**. Mas como vamos capturar o que recebemos do **PING**? Existem, de fato, diversas formas.

Uma opção mais simples é cortar nossa string de mensagem na parte do `PING :` e, então, pegar o que vem depois dessa substring. Podemos fazer isso com o método `split()`, que toma, como parâmetro, a parte da string em que queremos fazer a separação e retorna uma lista com todas as partes separadas.

O código que temos que devolver no **PONG** vai ser o que vem depois da separação, ou seja, o último elemento da lista, podendo ser acessado pelo índice **\-1**:

python

Podemos até separar em uma função, para melhorar a organização:

python

Rodando esse código, olha o que recebemos, logo após o comando **PING**:

python

Deu certo! Podemos até checar se nosso bot está online usando, manualmente, o comando `/whois BotDaEmpresa` no IRC:

imagem`. Enfim, só precisamos enviar ao IRC o comando **PRIVMSG** especificando o canal, com a mensagem de boas vindas:

python

E olha só como deu certo agora:

![Bot funcionando]

## Sockets em todo lugar

O conceito de socket, por ser um tanto abstrato, chega a assustar alguns desenvolvedores. Mesmo assim, todos nós provavelmente nos deparamos com sockets todos os dias, ao utilizarmos a Internet!

Nesse artigo, enfrentamos um problema empresarial de automatização no contato com clientes através do protocolo IRC.

Assim, passamos pela superfície da ideia e do uso dessa tecnologia no Python, entendendo o porquê não devemos temer esse conceito tão presente em nosso dia-a-dia.

Se gostou do post e quer aprender mais sobre a linguagem Python, dê uma olhada em nossos [**cursos da Alura**]!




Atuar no mercado de edição de vídeos está cada dia mais vantajoso devido às inúmeras opções que a [**tecnologia**] têm a nos oferecer. Mas para obter sucesso é necessário estar focado nos estudos e sempre acompanhar as novidades que surgem a todo momento.

## [1\. Windows Movie Maker]

Esse programa para edição de vídeo é uma ótima opção para quem está iniciando, pois, além de ser muito prático e simples, é gratuito e já vem instalado no Windows. As suas instruções são todas em português e os caminhos são bem intuitivos aos usuários.

Um ponto fraco é que ele não é profissional, ou seja, se você deseja prosseguir na [**carreira**] de editor certamente chegará um momento em que as funções ficarão limitadas.

## 2\. iMovie

O [**iMovie**] é o editor de vídeos da Apple e suas funções são parecidas ao Windows Movie, porém é mais avançado. Sua interface é bastante explicativa e permite que o usuário consiga ter acesso a tudo que a plataforma oferece. Para quem não tem um MacBook, o programa possui também uma versão para iOS (iPhone ou iPad). Não é gratuito, porém tem um valor bem acessível.

## [3\. YouTube Vídeo Editor]

Essa ferramenta tem a vantagem de ser fácil e muito agradável para editar os vídeos. Não necessita de instalação, basta ter uma conta no Google ou no Youtube, e pronto! A ferramenta já está disponível para ser usada. O editor ainda se encontra em fases de testes, portanto é bem possível que novos recursos sejam adicionados futuramente.

## 4\. Collaaj

O [**Collaj**] além de funcionar no Windows e no Mac tem a vantagem de rodar em iPad. Tem um sistema muito interessante que permite gravar da tela do computador e da webcam. Quando forem realizadas, as gravações poderão ficar armazenadas nos servidores da Collaj, o que facilita muito a sua divulgação.

Esse programa é muito utilizado para a gravação de cursos e videoaulas. Na versão gratuita só é possível gravar 2 minutos, para ter um resultado mais compensatório é necessário optar por um plano pago.

## 5\. Lightwork

O [**Lightwork**] é um editor de filmes para trabalhos profissionais, ele é capaz de montar um projeto desde o início. O programa encontra-se disponível gratuitamente para Windows, Linux e Mac. É indispensável fazer um cadastro no site, pois só depois disso é enviado o link para o download.

Apesar de ser bem completo e cheio de opções, o usuário poderá precisar de um tempo maior para se ambientar ao sistema, pois ele não é tão autoexplicativo como os outros acima apresentados.

## 6\. Cyberlink PowerDirector

O [**Cyberlink**] é bem popular na área de edição de imagens, ele está no meio do caminho dos programas para iniciantes e dos programas para profissionais da área. Suas funções são completas e a velocidade de edição é bem superior aos outros programas, se comparada à dos concorrentes. Ele conta com opções para importação de vídeos do Youtube e Facebook, dentre outros sites. Todos os vídeos podem passar por um processo de tratamento para melhorar as imagens ou alterar a produção original.

Um detalhe importante desse programa é o recurso que permite que as produções sejam removidas para a tela do computador, fazendo com que as edições ganhem movimentação na área de trabalho.

## [7\. Sony Vegas]

Esse aplicativo oferece bons recursos para projetos audiovisuais. Não é muito complexo para ser utilizado, uma boa dica é tentar conhecer todas as suas ferramentas para poder usufruir de todos os seus benefícios.

A sua interface é composta por um menu logo no topo, onde estão disponibilizados todos os mecanismos para edição e um monitor que mostra as imagens gravadas na linha do tempo. Além de tudo na linha inferior da tela tem um recurso composto de imagens, textos, áudios e músicas que estão sendo trabalhados no momento.

## [8\. Final Cut Pro X]

Esse aplicativo faz parte de uma inovação que a Apple adotou para mudar o futuro das edições de vídeo não lineares. Ressaltamos que não trata-se de upgrade de sua versão anterior (Studio), mas de um novo programa, que de igual só tem o nome. Ele faz parte de uma nova geração de editores de vídeo que promete recursos poderosos para os profissionais da área.

Está disponível na [**Mac App Store**] , mas para quem já é usuário uma atualização já basta.

## [9\. Camtasia Studio]

Esse programa é ideal para a criação de slides e tutoriais de vídeos. É fácil de usar e possui a interface limpa, o que permite o uso de todos os recursos a partir da primeira utilização.

Umas das suas vantagens em comparação aos outros sistemas é poder escolher a resolução dos vídeos gravados sem perder a qualidade, o que facilita no momento de reduzir o arquivo de acordo com as necessidades de quem vai utilizá-lo.

A versão de demonstração é muita curta, só podendo ser utilizada por alguns dias.

## [10\. Adobe Premiere]

Este programa é bem conhecido por profissionais do ramo da edição de vídeos. É considerado um editor para quem necessita de uma ferramenta mais completa, que agrada a quem deseja um aplicativo mais simples e mais acessível.

As versões mais recentes do Adobe Premiere são as Creative Cloud, Creative Suite e Portable da Adobe.

Para baixá-lo é necessário comprar a assinatura, porém tem disponível para teste gratuitamente por 30 dias.

É importante deixar claro que não é apenas a escolha do software que te faz um bom profissional de edição. Diversos são os fatores que precisam ser observados também nesse processo de aprendizagem, como: perceber todos os detalhes que o cercam, estar sempre disposto a estudar sobre o que é do interesse comum e de tipos de filmagens que são mais raras de aparecer para edição. E ter sempre em mente que no decorrer do aprendizado, [**criatividade**] e dedicação são fatores primordiais para que o trabalho seja reconhecido.

Gostou do nosso post de hoje? Já sabe qual programa para edição de vídeo vai utilizar? Aproveite para nos seguir no [YouTube] e [Facebook], pois lá compartilhamos mais dicas e você pode acompanhar tudo em primeira mão!




Resolvi me aventurar no mundo do **Dockerfile** e entender para que ele serve efetivamente, quando usar, o que é, e o que faz cada uma das principais instruções do Dockerfile?

# Tudo começa com um Dockerfile

Meu objetivo inicial é rodar um container bem simples que contenha apenas o Ubuntu e tenha o Java instalado. Como posso executar essa tarefa?

Existem duas possibilidades: A primeira é escrever o Dockerfile e criar o container a partir dele. A segunda é utilizar o comando [**docker**]) run para que ele busque a imagem na internet e rode o container para nós.

Mas, quando se usa o comando docker run, ele vai até o Docker Hub, busca essa imagem e baixa para nós. E como essa imagem foi gerada? Isso mesmo, com um Dockerfile feito por outra pessoa!

# O que é o Dockerfile ?

O Dockerfile nada mais é do que **um meio que utilizamos para criar nossas próprias imagens**. Em outras palavras, ele serve como a receita para construir um container, permitindo definir um ambiente personalizado e próprio para meu projeto pessoal ou empresarial.

Há ainda um outro ponto muito interessante que deve ser explorado (vejo muitas pessoas confundirem quando ainda estão aprendendo) para entendermos melhor o conceito e começarmos a compreender o Dockerfile mais a fundo: qual é exatamente a diferença entre um container e uma imagem?

# Imagem x Container

Uma imagem nada mais é do que uma representação imutável de como será efetivamente construído um container. Por conta disso, nós não rodamos ou inicializamos imagens, nós fazemos isso com os containers.

O ponto que temos que entender agora é o seguinte: escrevemos um Dockerfile, construímos uma imagem a partir dele executando o comando **docker build**, e, por fim, criamos e rodamos o container com o comando **docker run**. O container é o fim enquanto a imagem é o meio.

imagem. Nele, adicione a seguinte linha: 

`FROM ubuntu:18.04`

Então, iniciei o processo de criação da imagem. Para isso, abri o terminal e acessei a pasta que contém o Dockerfile. Após isso, executei o comando **docker build .** (com o ponto) e o docker começou a construir a imagem a partir do arquivo.

Ao terminar o processo, executei o comando **docker image ls**, e obtive a seguinte saída:

imagem.

Se criarmos um container a partir dessa imagem, os dois comandos já terão sido executados, já que **esses foram executados no momento de criação da imagem, não da criação do container**. Então qualquer container criado a partir dessa imagem terá o repositório do Ubuntu na mesma versão e o Java 8 instalado!

Para criar um container utilizando a imagem gerada e podendo manter a execução do container, executei o comando passando o ID da imagem gerada na minha máquina através do comando `docker run-it 41afdc6b059f`.

O `-it` serve para rodar o container em modo interativo, ou seja, eu quero interagir com ele efetivamente. Caso não utilizasse esse parâmetro, o container subiria e cairia logo em seguida.

![]

Lembra lá no início da explicação sobre o `RUN` quando falei que ele podia ser usado uma ou mais vezes? Então, isso faz uma baita diferença na hora da criação de imagens, pois, como foi dito, cada `RUN` criará uma etapa na criação da imagem. Mas, o que isso muda?

O grande diferencial da instrução `RUN` é que cada camada gerada por ele poderá ser reutilizada na criação de outras imagens.

Então, para testar, alterei meu Dockerfile para criar uma imagem nova com elementos em comum da outra imagem:

```
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
RUN touch arquivo-de-boas-vindas
```

Ele conseguirá reutilizar diversas camadas e tornará o processo muito mais rápido.

Caso eu queira adicionar um comando novo qualquer, ao executar o comando docker build . para gerar essa nova imagem, vejam o resultado:

![]

Vejam só que elegante! O Docker conseguiu reutilizar as camadas de outra imagem através do uso de cache para construir uma nova, tornando o processo muito mais rápido, sem necessidade de fazer downloads repetidos!

O RUN aceita parâmetros de dois jeitos:

`RUN apt-get install openjdk-8-jdk -y` ou 
`RUN ["apt-get", "install" "openjdk-8-jdk" ,"-y"]`

Ou seja, podemos passar os comandos separadamente entre aspas dentro dos colchetes. O resultado é o mesmo

## CMD e ENTRYPOINT

Não há muito mistério na instrução **CMD**, ela na verdade é bem parecida com a instrução RUN, com algumas poucas diferenças. Vamos ver quais são!

A sintaxe é a mesma, podemos passar os parâmetros do mesmo modo que a instrução RUN, alterando o último RUN por um CMD:

```
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
CMD touch arquivo-de-boas-vindas
```

Se construirmos uma imagem com o Dockerfile acima, veremos que ele não executou esse comando na etapa de criação.

Isso aconteceu porque na verdade a instrução CMD executa o comando apenas quando criamos o container e não passamos nenhum parâmetro para ele, ou seja, quando executarmos o comando docker run -it nessa imagem.

Caso passássemos algo como `docker run -it <id da imagem> /bin/bash`, ele sobrescreveria o comando `CMD touch arquivo-de-boas-vindas` e executaria apenas o `/bin/bash`.

Um outro teste também poderia ser:

```
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
CMD touch arquivo-de-boas-vindas
CMD touch outro-arquivo
```

Ao inicializar o container vi que apenas o outro-arquivo foi criado, mas por quê? O que acontece é que podemos ter quantos CMD quisermos, mas no fim das contas apenas será executado o último CMD, sem nenhum erro aparente!

E o **ENTRYPOINT** ? Essa instrução faz exatamente a mesma coisa, porém seus parâmetros não são sobrescritos igual ao CMD.

## ADD e COPY

Os nomes dessas instruções são bem intuitivos.

**O papel do ADD é fazer a cópia de um arquivo, diretório ou até mesmo fazer o download de uma URL de nossa máquina host e colocar dentro da imagem**

Eu utilizei o ADD para copiar o arquivo chamado arquivo-host da minha máquina para dentro da imagem, com o nome arquivo-host-transferido:

```
FROM ubuntu:18.04
RUN apt-get update
RUN ["apt-get", "install", "openjdk-8-jdk" ,"-y"]
ADD arquivo-host arquivo-host-transferido
```

Se criarmos uma imagem e rodarmos um container, teremos o seguinte resultado:

![]

O arquivo está dentro do container

A instrução `ADD` também tem alguns efeitos interessantes, como: caso o arquivo que esteja sendo passado seja um arquivo de extensão tar, ele fará a descompressão automaticamente, além do fato já mencionado de poder fazer download de arquivos por URLS.

A instrução `COPY`, permite apenas a passagem de arquivos ou diretórios, diferente do ADD, que permite downloads. Como podemos ver abaixo:

```
FROM ubuntu:18.04
RUN apt-get update
RUN ["apt-get", "install", "openjdk-8-jdk" ,"-y"]
COPY arquivo-host arquivo-host-transferido
```

A próxima instrução mostrará como podemos documentar de maneira sucinta o nosso Dockerfile para quem for utilizá-lo.

## EXPOSE

Há uma certa dúvida quanto ao uso dessa instrução. Muitas pessoas pensam que o **EXPOSE** serve para definir em qual porta nossa aplicação rodará dentro do container, mas na verdade o propósito é servir apenas para documentação.

Essa instrução não publica a porta efetivamente, já que o propósito dela é fazer uma comunicação entre quem escreveu o Dockerfile e quem rodará o container.

```
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
EXPOSE 8080
```

Logo, o Dockerfile acima não faz a publicação da porta, apenas serve como documentação.

Agora vamos entender como podemos compartilhar informações entre o nosso container e nossa máquina host.

## VOLUME

Essa instrução cria uma pasta em nosso container que será compartilhada entre o container e o host, funcionando do seguinte modo:

```
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
VOLUME /foo
```

Quando criarmos um container dessa imagem, ele criará uma pasta chamada foo:

![]

Todo arquivo criado dentro dessa pasta será acessível a partir da máquina host no caminho `/var/lib/docker/volumes`!

Por fim, como pode ser feita a organização de trabalho do container? Será que devemos trabalhar em qualquer pasta indefinidamente?

## WORKDIR

Essa instrução tem o propósito de definir o nosso ambiente de trabalho. Com ela, definimos onde as instruções **CMD, RUN, ENTRYPOINT, ADD e COPY** executarão suas tarefas, além de definir o diretório padrão que será aberto ao executarmos o container.

```
FROM ubuntu:18.04
RUN apt-get update
RUN ["apt-get", "install", "openjdk-8-jdk" ,"-y"]
WORKDIR /pasta-qualquer
COPY arquivo-host arquivo-host-transferido
```

Ao acessarmos o container gerado por essa imagem, teremos o seguinte resultado:

![]

Ou seja, além de inicializarmos o container nessa pasta, o COPY colocou o arquivo dentro da pasta definida!

# Conclusão

O processo de criação de imagens é de suma importância para quem quer aprender Docker. Vimos que através do Dockerfile podemos utilizar diversas instruções para atingir um determinado fim, seja a instrução FROM para utilizar uma imagem como base para a nossa, a instrução RUN para definir as camadas da nossa imagem, CMD e ENTRYPOINT para configurar o container em sua inicialização, ADD e COPY para movermos arquivos de nossa máquina para o futuro container, EXPOSE para documentar as questões de portas do container, VOLUME para conseguir transitar arquivos entre a máquina host e virtual, e, por fim, WORKDIR para definirmos o nosso ambiente de trabalho.

Aqui na **Alura**, temos um [curso sobre Docker], nele você aprenderá tudo sobre o que é um container, como fazer eles se comunicarem, além de aprender como criar suas próprias imagens para personalizar seus container.





Em vários setores do mercado, especialmente de desenvolvimento de ferramentas, softwares e em muitas [**startups**], os empreendedores buscam entregar mais valor com o mínimo de recursos mas que pudesse ser testado, pra saber se há o **market fit**. Essa necessidade criou o conceito de **Minimum Viable Product** (MVP).

Traduzido livremente como **mínimo produto viável**, é um produto, uma app, ou um site com todas as características mais básicas necessárias para ser considerado como “entregável”. Claro que, com base nos padrões atuais, dizer que algo está “entregável” com algumas poucas funcionalidades pode soar estranho, mas faz uma grande diferença para a empresa.

Esse conceito pode ser um pouco difícil de entender a princípio, especialmente se você trabalha com a lógica de já entregar um grande projeto completo depois de anos de trabalho e **análise de requisitos**. 

## Entendendo um MVP

Para exemplificar melhor o que seria um “produto mínimo”, vamos usar um exemplo clássico e comum em vários contextos: um carro pessoal. Pare por um instante e pense no que você normalmente encontra dentro de qualquer automóvel. Talvez você tenha pensado em algo mais ou menos assim:

- motor;
- tanque de combustível;
- volante;
- bancos;
- rodas;
- estepe;
- rádio;
- carroceria;
- luz interna;
- faróis;
- setas;
- cintos de segurança.

A lista poderia ser maior, mas já é o suficiente para o nosso ponto. O próximo passo aqui é filtrar esses itens de acordo com a função mais básica de qualquer carro: andar e ser guiado. O que sobra aqui é:

- motor;
- tanque de combustível;
- volante;
- um banco, pelo menos;
- rodas;
- carroceria básica para sustentar as peças.

Esse é o Minimum Viable Product para um carro. Pode parecer absurdo pensar em vender um carro sem cinto de segurança, até pela especificação da lei. Mas, para todos os efeitos, este “carro mínimo” cumpre a sua função.

Não está convencido? Bem, digamos que você está inventando o primeiro carro da história e tem de convencer as pessoas de que vale a pena investir nele. Você precisa, antes de mais nada, provar que ele pode se mover sozinho em terra, algo inédito até o momento. Sua tarefa é focar nas características principais do produto e trabalhar apenas com elas. É isso que o MVP faz.

Depois de obter o reconhecimento que precisa, você pode pensar em atualizar seu produto, agregando mais valor e dando-lhe diferenciais de mercado. Inserir os cintos, mais bancos para passageiros, uma carroceria com melhor aparência, para-brisas, personalizar a carroceria etc.

Mas, em qualquer momento, você poderia apresentar o seu “carro mínimo” para possíveis compradores ou investidores como um produto minimamente viável.

A mesma lógica se aplica a vários tipos de produtos, como festivais, softwares, entre outros. Há uma série de componentes que podem ser considerados essenciais, enquanto outros atuam para complementar o produto e diferenciá-lo dos demais.

## Como o Minimum Viable Product impacta na organização

### Abordagem gradual do desenvolvimento

Como você já deve ter notado no exemplo acima, seu carro não caiu do céu já montado e com todos os detalhes de uma Ferrari. Ele foi desenvolvido passo a passo, com cuidado para que os componentes mais importantes recebessem mais atenção, e que os pontos adicionais fossem agregados com calma e qualidade.

A partir do momento que há um MVP estabelecido, não há necessidade nenhuma de sobrecarregar o setor de desenvolvimento. Todas as funcionalidades extras, seja em um carro ou em um software, serão adicionadas posteriormente, até que o prazo de entrega seja concluído.

### Facilidade para o período de testes

Da mesma forma que um Minimum Viable Product permite uma entrega rápida, ele também ajuda a dividir os estágios de desenvolvimento e possibilita uma realização de testes em menor escala. Talvez um produto mínimo não funcione da mesma forma quando todos os componentes forem agregados.

Com uma adição gradual, é possível detectar essas diferenças e ajustá-las de forma mais eficiente. Além disso, enquanto os primeiros [**clientes**] utilizarem a versão mínima do seu produto, você poderá coletar o feedback necessário sobre cada componente.

### Definição eficiente de prioridades

Um dos principais objetivos de um produto mínimo é delinear quais funcionalidades são as mais importantes. Centenas de projetos se perdem em meio a um milhão de componentes, que nem sempre são importantes para o cliente final. Qual é a utilidade, por exemplo, de adicionar três caixas de som a um automóvel quando a direção não está devidamente regulada?

A definição das prioridades no MVP serve como guia para os desenvolvedores. Evita que eles percam foco no que seus clientes finais realmente precisam e esperam. Mesmo as ideias mais inovadoras e brilhantes não podem simplesmente entrar na frente dos componentes mais básicos de qualquer produto.

### Possibilidade de venda em todos os momentos

Como já mencionamos várias vezes, um produto mínimo é um produto que pode ir para a venda.

Um software de chat online, por exemplo, não precisa ter uma centena de emojis embutidos,função de videoconferências e um editor de fotos. Nem mesmo uma função de agenda de contatos bem estruturada. Ele precisa apenas carregar mensagens recebidas e enviadas entre os destinatários.

**O caso dos softwares, é ainda mais específico.** Como é possível atualizar programas de computador e celular quase constantemente, não é necessário simplesmente cortar todas as funcionalidades que não foram adicionadas até o momento. Você pode continuar divulgando e vendendo o seu programa enquanto trabalha para torná-lo melhor e atrair novos compradores.

### Fidelização prévia de leads e clientes

Com um Minimum Viable Product em mãos, você já pode começar a atrair investidores, [**seus primeiros clientes e qualquer outro tipo de pessoa**] que acredite no que você está desenvolvendo.

Antes mesmo de adicionar as funcionalidades que considera como diferenciais, você já poderá manter um fluxo de caixa mínimo, reduzindo o custo de desenvolvimento e potencializando os resultados.

Além disso, clientes são uma das melhores fontes de divulgação disponíveis. Quando você consegue mais uma ou duas pessoas para utilizarem seus produtos, elas comentarão com amigos, familiares e sócios sobre suas qualidades.



Esse é o segundo post de uma série chamada **[Dicas de React]** que eu venho fazendo, se você não viu o [primeiro da uma olhada aqui] e para ver tudo confere [a listinha no meu site pessoal] :)[]

Esses dias estava fazendo uns testes com React em um freela que me apareceu pedindo um site multi linguagem (português e inglês pra ser mais específico). De início lembrei da época que trabalhava com o [**WPML**] para traduzir os projetos no WordPress e tentei replicar a ideia do que ele fazia lá e consegui um resultado bem satisfatório que gostaria de compartilhar com vocês :)

imagem. É legal você ter um conhecimento de JavaScript (objetos, arrays e como manipular esses tipos de dados).
- É legal você também conhecer o [**React Router, caso não conheça fica a dica desse outro post**]

## Problemas que precisamos resolver

Quando falamos de internacionalização (i18n é uma abreviação para "_Internationalization_" entre I e o N existem 18 letras) existem diversos tópicos para abordarmos como:

- [Tradução dos textos estáticos da interface]
- [Localização de moeda]
- [Alguns ajustes de CSS em caso de sites árabes por exemplo]
- [Timezone]

Entre alguns outros sub-tópicos, nesse post vamos focar em dois pontos.  
1\. Traduzir os textos de uma forma escalável  
2\. como resgatar o parâmetro via URL informando qual linguagem o usuário deseja visualizar.

## Resgatando o parâmetro do idioma e setup inicial do React Router para i18n  

Para não perdemos tempo configurando coisas, eu deixei tudo [pré-pronto esse repositório]  

Nele já temos uma app react com um sistema de roteamento configurado, e também o código dessa parte da explicação que irei comentar agora.  

O foco para começarmos a entender o projeto atual está no conteúdo do arquivo [./src/routes.js]

imagem
- Caso não aconteça nenhum dos casos citados o usuário é levado para a rota acessada normalmente e o atributo com o idioma é disponibilizado.

js

> Conversei bastante com o [Felipe Souto], e no meio da conversa a gente chegou no ponto que é ultra importante ressaltar que poderíamos pegar o atributo do idioma de várias formas diferentes.
> 
> Mais abaixo no post eu cito outras formas de pegar o atributo

**Importante**: Sempre que possível, planeje a internacionalização de um site desde o começo do projeto migrar essas coisas em um projeto que está rodando pode ser extremamente trabalhoso.

Um último arquivo que falta mostrar é o que vem por meio do **`import { LANGUAGES } from './_i18n/languages'`** que basicamente é um objeto com os idiomas que possuimos e um atributo com a linguagem default (para podermos acessar em diferentes locais do código)

js 

Agora que vimos uma forma de resolver o lance do parâmetro do idioma, vamos ver como traduzir os textos da nossa app.

## Traduzindo textos estáticos em uma app React

imagem recebemos o seguinte erro:

imagem, dado isso, precisamos carregar um pacote de configurações pra cada idioma que formos trabalhar (em nosso caso o pt de português), por padrão a lib só carrega as configs do idioma inglês. Dai vem a chamada da função **addLocaleData()**
- O código dentro do **componentDidMount()** faz com que caso não seja passado um atributo de idioma válido o usuário seja redirecionado para a home com o idioma padrão (lembrando que em seu sistema você pode implementar essa lógica do jeito que achar melhor)
- o **<IntlProvider>** é o provider da react-intrl que nós estamos configurando, ele recebe o objeto do JSON com as traduções do idioma (na prop messages), referente ao locale atual (que em nosso sistema varia de acordo com a URL)
- O **import translations from './src/_i18n/translations.json'** nos traz um JSON com o seguinte formato:

json 

- Aqui a chave do JSON é o idioma atual. Dentro do objeto de cada idioma a chave é a base para passarmos o **id=""** quando chamamos o componente para traduzir as mensagens: **<FormattedMessage id="Bem vindo!" />**. Muitas pessoas preferem ao invés de passar uma frase como "Bem Vindo!" passar algo como um id mesmo, algo como "header.bemvindousuario", na prática tudo funciona da mesma forma (a diferença nesse exemplo é que colando as chaves {} é possivel passar um valor dinâmico)

js

Agora ao abrirmos nosso projeto no navegador conseguimos alterar o idioma e ver tudo funcionando tranquilamente

imagem;
- Ter um subdomínio e extrair da url do site (pt.meusite.com e en.meusite.com);
- [Pegar um parâmetro da query string,] essa última o próprio google não recomenda caso você tenha intenção de trabalhar SEO [https://support.google.com/webmasters/answer/182192?hl=pt] (embora eles mesmos usem ¯\\_(ツ)_/¯ ).

Seja qual for a opção que você vá escolher, analise qual o melhor para o seu projeto e defina uma estratégia em cima.

## E os dados dinâmicos como eu pego?

Para pegar os dados dinâmicos no backend, primeiro a API que você está se comunicando precisa ter suporte para diferentes retornos baseados em um idioma solicitado, caso suporte vc pode usar o header: [**Accept-Language**]

Minha sugestão é você criar um [**BFF**] (**B**ack end **F**or **F**ront end), ele servirá como um meio de campo ente você e as API externas que você se comunica e via ele você pode configurar as traduções.  

## E se eu quiser carregar o JSON de traduções dinâmicamente?

Para isso você vai precisar mexer no \`IntlProviderConfigured.js\` e fazer um request que irá ti retornar as traduções. [Um código com um exemplo melhor disso existe na documentação do **react-intl**]

## Conclusão

Trabalhar com **SPAs i18n** exige um certo esforço, e espero ter conseguido dar um norte para você conseguir resolver os problemas em seus projetos atuais/futuros.

Espero que tenha gostado do artigo, em breve trarei mais dicas, se curtiu e quiser saber em primeira mão quando vierem novos conteúdos, [**me segue no meu twitter**]e pra acompanhar meus outros posts tá tudo centralizado em meu site pessoal [**https://mariosouto.com**] até mais \\o




Em um sistema de cadastro de produtos que estou desenvolvendo em Python, para um mercado,temos a seguinte classe que representa um produto:

python

Dentro desse sistema, recebi uma lista chamada `produtos`:

python

Contendo os seguintes produtos:

python

Porém, o dono do mercado pediu para verificar todos os produtos que estão acabando, ou seja, com quantidade menores que 100. Uma solução procedural para esse problema seria criar um `for`, e então, dentro dele, adicionamos um `if` que verifica os produtos com quantidades menores que 100 e, se for verdade, adicionamos a uma nova lista contendo todos os produtos que estão acabando. Por fim, devolvemos essa nova lista:

python

O resultado seria:

python

Para uma tarefa bem simples, escrevemos muito código... Em outras palavras, escrevemos 3 linhas de código para resolver um problema bem comum em uma lista! Será que tem como resolver isso de uma forma mais enxuta e objetiva?

No Python, além dos recursos básicos que encontramos em muitas linguagens de programação,isto é, instruções de `for`, `if` e `else` entre outras. Temos também um recurso bem interessante chamado [compreensão de lista], que nos ajuda, e muito, na manipulação de dados de uma lista. Por exemplo, para resolver o mesmo problema que acabamos de ver utilizando a compreensão de lista, faríamos da seguinte forma:

python

Vejamos o resultado:

```
Feijao, Cafe, Sabao em po, Requeijao, Cafe, caixa de bombom

```

Exatamente o mesmo resultado! Porém, veja que resolvemos dessa vez em uma única linha! E mais, sem a necessidade de criar uma lista vazia! Mas como isso aconteceu?

A compreensão de lista, itera sobre todos os elementos de uma lista e executa uma ação para cada item encontrado de acordo com o filtro que utilizamos. Em outras palavras, é descrita com a seguinte estrutura:

**ação a ser tomada, itens iterados, filtro**

- **ação a ser tomada**: Ação desejada para cada item. (Nesse exemplo só devolvemos o item).
- **itens iterados**: lista que queremos iterar e extrair seus itens.
- **filtro**: Onde aplicamos as condições para devolver os itens de uma lista.

Suponhamos que dessa vez, o dono desse mercado pediu para verificar todos os produtos com valores abaixo de R\$ 10,00, e então, para cada um desses produtos, acrescentar 10% ao valor original. Como faríamos isso? Será que apenas em modo procedural da certo? Para a nossa felicidade, por meio da compreensão de lista, podemos também realizar operações aritméticas! Vejamos como ficaria:

python

Se imprimirmos os nosso produtos:

python

Temos o seguinte resultado:

js

Como podemos ver, os produtos: "Feijao, Refrigerante, Cafe, Sabao em po, Requeijao, Leite, pao de forma, Cafe e caixa de bombom". Sofreram o acrescimento de 10% com um código de apenas 1 linha!

E aí, gostou da compreensão de lista? Que tal tentar agora mesmo substituir os seus `for`s e `if`s por ela? Quer aprender mais sobre os recursos do python? Então de uma olhada nos nossos [**cursos online de python na Alura**].





imagem 

Recentemente, estive trabalhando em um projeto de conversor de temperatura, de Celsius para Fahrenheit, para desenvolvimento de alguns programas com viés científico.

Lembrei da fórmula de conversão que me ensinaram na época de escola, na qual, sendo **F** a temperatura em Fahrenheit e **C** a temperatura em Celsius, tínhamos `F = 1,8C + 32` e `C = (F - 32) / 1,8`, e implementei o seguinte código:

python

O objetivo principal desse meu código era para ser usado em outros programas maiores, com um `import`. Apenas para testar, adicionei uma [**verificação do escopo de execução do programa**]:

python 

Rodando o programa com `python aluratemp.py`, recebo o seguinte:

python 

Certo, o código funciona bem! E se importarmos as funções pelo interpretador do Python?

imagem 2018 Yan Orestes

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge,publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
...

```

Legal, agora qualquer usuário vai saber se (e em quais condições) ele pode usar nosso software! Mas… espera, como as pessoas vão saber de que forma usar nosso código? Não tem nada em nenhum lugar ensinando a usar, nem dando nenhum exemplo… Será que tem algum padrão para isso?

### Explicando nosso projeto no _README.md_

Repare que, da maneira que estamos agora, alguém que baixasse meu software precisaria ler todo o código para saber como funciona, ou mesmo sobre o que se trata.

Assim, além de uma licença, é comum os projetos conterem um arquivo **[README]**, explicando o funcionamento do software, dentre outras especificações. Esse arquivo pode ter extensões diversas, como a `.md`, de [**Markdown**], que usaremos para simplificar a escrita do arquivo.

Faremos um README bem objetivo e curto, mas o ideal é que ele tenha informações suficientes para o usuário conseguir instalar, usar e entender seu projeto. Uma abordagem simples pode ser, também, usar uma [template pronta] com algum padrão de README.

No caso do **aluratemp**, deixei o _README.md_ simples assim:

python 

Olha como fica visualmente:

imagem` com seus devidos argumentos. Essa função pode ser importada, principalmente, de dois módulos - `setuptools` e `distutils.core`.

A própria documentação do Python nos incentiva a usar o `setuptools`, mas ele nem sempre vem instalado por padrão no sistema. Caso isso aconteça, podemos instalar com o seguinte comando no terminal:

python

> Dependendo do sistema, esse comando pode precisar de permissão de administrador (`sudo`) para funcionar propriamente.

Se não tivéssemos como usar o _pip_, a solução seria usar o `setup()` do `distutils.core`, mesmo. Isso implicaria em não poder aproveitar ao máximo essa poderosa função, se limitando aos [argumentos suportados por esse módulo].

Daqui para frente usaremos o `setuptools`, cuja [lista de argumentos suportados pelo `setup()`] é mais extensa.

Vamos começar a montar nosso código passando o parâmetro `name` para a função `setup()`, indicando o nome do nosso projeto:

python 

Tudo bem, passamos o nome de nosso projeto para o `setup()`. O problema é que apenas assim o código não funciona, porque precisamos de mais informações, como a versão (`version`), os autores (`author` e `author_email`) e os pacotes (`packages`, geralmente uma lista com o mesmo nome especificado em `name`):

python 

Agora sim! Isso é o básico que a função `setup()` deve receber. Porém, não seria legal poder passar, além desses, mais dados para aparecerem lá na página do projeto no PyPI e para facilitarem a busca? Mais uma vantagem da função `setup()` - em geral, podemos!

Por exemplo, podemos passar também uma curta descrição (`description`) para aparecer lá na página, em conjunto com uma mais longa (`long_description`).

Também podemos especificar uma URL (`url`)de página inicial para o projeto. No caso, vou colocar o repositório do GitHub onde o código se encontra. Em outro argumento (`project_urls`), podemos até passar um link de download:

python 

Podemos até passar a licença (`license`) que escolhemos (obviamente de maneira bem mais reduzida):

python 

Outras informações legais que podemos passar são as que influenciam diretamente na parte das buscas, como palavras-chave (**keywords**) e classificadores (**classifiers**). O próprio PyPI nos disponibiliza uma [lista completa de classificadores] para sabermos o que podemos usar para categorizar nosso projeto.

A lista de classificadores contém informações a respeito do status de desenvolvimento, de quem é o alvo do código, da língua nativa dele, dentre várias outras possíveis. No nosso caso ficou assim:

python 

Ao final, nosso código ficou assim:

python

Agora que temos nosso projeto já configurado, podemos continuar o processo de empacotamento e upload de nosso software.

## Empacotando nosso projeto

Já temos o projeto pronto, então o que fazemos agora? De alguma forma, precisamos passar para o PyPI algumas informações e metadados que permitam a instalação de nosso projeto pelo pip, ou ele não vai saber o que fazer com o nosso código!

Para isso, exploraremos o poder do arquivo `setup.py` que criamos e geraremos uma distribuição raiz, ou, tecnicamente, **_[source distribution]_**, também chamada de **_sdist_**, que é o mínimo que precisamos.

Para criarmos nossa _sdist_, basta um simples comando no terminal:

python

Rodando esse comando, olha como ficou a árvore do nosso diretório:

imagem para funcionar propriamente.

Com o twine instalado, usamos o comando `twine upload dist/*`. Como queremos primeiro fazer o upload no repositório teste, precisamos especificar a url dele (`https://test.pypi.org/legacy/`) com a opção `--repository-url`:

python

Teremos que digitar nossas informações de login e, enfim, [**o pacote já estará disponível no repositório teste**]!

Mas não é chato termos que ficar passando a URL e nossas informações de login toda vez que queremos fazer o upload? Podemos simplificar todo esse processo com um arquivo `.pypirc`, que deve ser armazenado na pasta HOME de nosso sistema:

sql

Assim, apenas com o comando `twine upload dist/* -r testpypi` já daria certo!

> Se não tivermos acesso ao pip, podemos usar o comando `python setup.py sdist upload -r pypitest`

Agora, e para o repositório oficial? O comando é mais simples ainda: `twine upload dist/*`, e pronto! [Nosso projeto já está disponível]!

> Se não tivermos acesso ao pip, podemos usar o comando `python setup.py sdist upload -r pypi`

Assim, meus colegas poderão usar as funções de conversão que eu criei apenas instalando o pacote com o pip e importando-as nos seus próprios programas Python!

## Compartilhando nosso código em prol da comunidade

Compartilhar nosso código com a comunidade pode não parecer necessário, nem muito útil, mas muitas vezes é uma atitude muito legal que podemos tomar! Uma das maravilhas da linguagem Python é justamente isso - a comunidade e todo o apoio que ela (**ou melhor, nós**) dá para si mesma.

Quando temos acesso ao código que outra pessoa fez, não precisamos mais ficar reinventando a roda, o que poupa nosso tempo e esforço. Se fizemos um código que pode ajudar outros, é sempre bom considerar compartilhar!

Nesse post, aprendemos como podemos fazer isso com o Python, utilizando ferramentas como o `setuptools` para configurar e empacotar nosso projeto e o `twine` para fazer o upload no PyPI - o maior repositório de código Python que conhecemos.

E aí? Que tal participar ativamente da comunidade compartilhando seus projetos pelo PyPI? Se você se interessa pela linguagem e quer aprender mais, dê uma olhada em nossos [**cursos na Alura**] e continue estudando!




E quando falamos em metas e objetivos, a primeira coisa é justamente definir o que é isso. Quando entendemos o que realmente queremos, o caminho para chegar até ele fica muito mais claro. Principalmente se estamos falando de nossos estudos.

## "Sei o que quero, e agora?"

Se quero aprender algo novo, nada mais justo do que organizar um planejamento que seja efetivo e eficiente, certo? Afinal, o maior risco que corremos quando criamos todas essas metas é atropelar algumas questões básicas que podem acabar nos deixando frustrados, seja pela não conclusão do objetivo ou por nem conseguir iniciá-lo.

A frustração é algo que pode nos abrir dois caminhos: ficar desmotivado e deixar aquele objetivo de lado, ou superar esse sentimento com a motivação de continuar tentando até conseguir.

Esses dois caminhos acontecem de forma muito relativa, dependendo do contexto em que cada pessoa está, as possibilidades existentes, a personalidade, enfim… Varia muito e não podemos prever como iremos lidar com esse sentimento.

Mas existem algumas coisas que podemos sim ter um maior nível de controle e evitar que a frustração apareça.

# Planejar passo a passo

## Definindo o objetivo

Se falamos em planejamento de estudos, precisamos entender que existem algumas etapas importantes a considerar. A primeira dela já sabemos: definir o que queremos.

Mas como definir? Bom, se estamos falando de metas e objetivos, nada melhor do que definir de forma objetiva, isto é, se queremos aprender sobre [**UX**], o que exatamente queremos aprender sobre isso? [**Pesquisas de UX**]? [**Testes de usabilidade**]? Especificar exatamente qual será o foco é importante para que não precise perder tempo depois afunilando o que realmente é do nosso interesse dentro desse tema tão amplo.

## Entenda sua rotina

Hoje em dia, uma das maiores queixas das pessoas é não ter tempo. De forma geral, nunca temos tempo para nada, certo? Sempre temos uma sensação de que "poderíamos ter feito mais".

> _"Estou sem tempo. Esta é uma frase que costumamos dizer e ouvir bastante. Seu significado é ‘não tenho prioridade suficiente pra isso neste momento’. Todos temos tempo, exatamente 24 horas por dia. O que podemos fazer então é gerenciar o tempo para otimizá-lo."_, cita [Dionatan Moura].

Pois então, depois de definida sua meta, comece a avaliar sua rotina.

Coloque no papel tudo o que você faz ao longo da semana, começando pelas atividades fixas e adicionando as variáveis depois. Agora, analisando o que você anotou, analise os melhores horários para incluir um momento de estudo. Se for 20 minutos ou 1 hora, não importa, todo momento de estudo é válido, contanto que você consiga [**criar um calendário de estudos**] regular e focado no que pretende estudar.

## Trace os pontos de estudo

Ok, já sei o que quero aprender e como me organizar nos horários para incluir momentos de estudo, posso agora incluir no calendário exatamente o que pretendo aprender.

Mas, antes, é importante pesquisarmos qual a melhor trajetória a seguir naquilo que queremos aprender. Pesquisar o que outras pessoas, que já passaram por esse caminho, recomendam pode encurtar muito o tempo que você gastaria tentando encontrar as melhores possibilidades.

Se quero ser um [**programador full-stack**], por exemplo, posso seguir por uma linha de aprendizado, enquanto um [**programador front-end**] pode ter uma outra rotina.

## Formando hábitos

Quando nos focamos em nossas metas, o maior desafio é a autodisciplina.

Alguns hábitos nós somos forçados a criar, como, por exemplo, a rotina de trabalho. Temos horários a cumprir e isso nos força a dedicar o tempo de forma mais focada a essa atividade, assim como cursos ou qualquer atividade de horário fixo.

Mas, [**se estamos falamos de hábitos**] em que o único que poderá cobrar resultados somos nós mesmos, o processo é muito mais desafiador.

Segundo [Dionatan Moura], algo muito comum é essa **Síndrome do estudante** que muitos de nós temos, em diferentes fases da vida. Essa nada mais é do que a prática de **procrastinar**, isto é, nós podemos facilmente criar o hábito de _deixar para depois_ nosso planejamento, usando qualquer distração ou dificuldade como desculpa.

Portanto, é interessante que essa cobrança aconteça de forma saudável, mas com frequência. Para isso, crie formas de [**manter-se produtivo em seu dia a dia**] de estudos.

## O principal é: Vamos começar!

Quem nunca fez mil planos para algo e nunca colocou efetivamente em prática? Planejamentos são ótimos, mas de nada adianta se não iniciarmos nunca, certo?

Já sabemos o objetivo, refletimos sobre nossa rotina e o melhor calendário a seguir e como manter essa rotina produtiva… Perfeito! Agora a ideia é concretizar tudo isso.

Todos temos receios quanto ao retorno que esse investimento de tempo nos trará, mas tenha em mente que todo aprendizado, seja ele pequeno ou grande, gera o enorme valor para todas as experiências que acumulamos.

Na **Alura** temos [**diversas formações e cursos**] justamente para possibilitar à todos os alunos a chance de encontrar todas as possibilidades de aprendizado que queira tentar. Sempre é tempo de começar a aprender algo novo!

E você? O que planejou para esse ano? E para o ano que vem? 




O jQuery é um framework **muito** bom. E com muitas funções. Mas muitos usam para coisas simples, por não saber fazer em JavaScript puro.

Selecionar elementos é uma dessas coisas. Em jQuery a gente faz:

js

Ou seja, passamos um **seletor CSS** e ele encontra os elementos na página pra gente. Mas quem manja de JS sabe que é fácil fazer sem jQuery, basta usar o querySelector:

js

jQuery é bom, mas melhor ainda é conhecermos JavaScript e saber usar os dois.




Você já precisou deixar um processo executando em um servidor remoto mesmo depois de fechar a conexão SSH? É muito frustrante termos falhas só por fechar o terminal ou a conexão com o servidor. 

imagem 


Recentemente, estive trabalhando em uma [**aplicação de agenda de contatos**] usando o [**Django**], da qual já fiz o [**deploy em um servidor remoto**] que eu aluguei.

Aparentemente, tudo estava certo, o site funcionava bem. Assim, fechei minha conexão [**SSH**] com o servidor, recarreguei a página aberta no meu navegador local e olha o que apareceu: 
imagem ao mesmo tempo e, no nosso caso, quando queremos que um programa não se inicie como filho do Bash, para que possa continuar rodando mesmo quando desconectarmos da máquina.

Existem diversas aplicações que funcionam como multiplicadoras de terminal, estando, dentre as mais famosas, o [**GNU Screen**] e o [**tmux**]. No nosso caso, usaremos o **GNU Screen**, por vir pré-instalado, por padrão, na maioria das distribuições Linux. E então, como podemos usá-lo?

## Usando o GNU Screen para preservar a execução de um processo

Estamos em nosso terminal, e agora? Como podemos usar o GNU Screen para separarmos a execução do Gunicorn? Bem, podemos começar rodando um comando para criar uma nova sessão, da qual vou chamar de `rodaGunicorn`:

```
screen -S rodaGunicorn
```

Podemos checar as sessões do Screen rodando com o seguinte comando:

 

E verificar que estamos vinculados (`attached`) à sessão `rodaGunicorn`: 
![Lista sessões do Screen] 

Vinculados à nossa nova sessão, podemos voltar para o nosso projeto Django e executar o Gunicorn: 

![Gunicorn em execução]

Legal! E agora? Ficamos presos nesta tela? Com o GNU Screen, isso é fácil! Vinculados a uma screen, podemos usar os comandos específicos do software através de uma tecla de escape, que geralmente é **Ctrl-a**. 

Para simplesmente nos desvincularmos da screen, podemos usar esta tecla de escape seguida da tecla **d**. Podemos checar novamente a lista de sessões e olha só: 

![Lista de screens detached] 

O Gunicorn continua rodando na screen que criamos!

Fui entrar no meu site pelo navegador e continuou dando aquele mesmo erro! Acabei me confundindo e esqueci que eu configurei meu servidor web para direcionar as requisições para a porta **8001**, não **8000**.

Precisamos reiniciar o Gunicorn com as configurações corretas. Mas como voltamos para a sessão onde o Gunicorn está rodando? Para nos vincularmos a uma sessão a partir do nome dela, basta usar a flag `-r` do comando `screen`:

 

Podemos encerrar o Gunicorn com o comando **Ctrl-C** e iniciá-lo novamente com as configurações corretas: 

![Reiniciando o Gunicorn] 

Dessa vez, podemos nos desvincular dessa screen e até fechar o terminal, que olha só: 

![Site funcionando!] 

Nosso site continua funcionando!

## Para saber mais: Múltiplos terminais em uma única tela com Screen

O GNU Screen, além do uso básico que acabamos de ver, em que temos sessões diferentes para diferentes processos, tem mais algumas funcionalidades muito úteis!

Uma muito bacana é a que nos permite dividir uma única tela de terminal em diversos pequenos terminais, mais ou menos dessa forma: 

![Divisões de tela com Screen] 

Para isso, basta usarmos [alguns comandos] de gerenciamentos de janelas e divisão de telas próprio do GNU Screen!

## Controlando múltiplos terminais com o GNU Screen

Muitas vezes, precisamos deixar um processo rodando em nosso terminal por tempo indeterminado. Inevitavelmente, chega um momento em que precisamos fechar o terminal, mas queremos que o processo continue executando, e aí?

Entendemos que os processos inicializados pelo terminal são filhos dele e, por isso, são encerrados assim que este é. Por conta disso, tínhamos um grande problema, afinal precisávamos manter o processo do Gunicorn rodando!

Assim, conhecemos o GNU Screen um multiplicador de terminal que nos permite separar nossos processos por sessões que não interferem uma na outra. Dessa forma, quando fechássemos o terminal, os processos dentro das sessões do Screen continuariam rodando!

Além disso tudo, ainda demos uma olhadinha no poder do GNU Screen, com sua funcionalidade de divisão de telas e janelas dentro de um único terminal.

E aí? Já conhecia o GNU Screen? Ele pode nos ajudar bastante, não acha? 





imagem 

Como podemos **salvar as informações com o Shared Preferences**?

No post onde mostro como podemos criar uma [**splash screen**], vimos que diversas Apps fazem uso desse tipo de tela, entretanto, já percebeu quantas vezes essa tela aparece para nós? Será que todas as vezes que abrimos a App? Algumas vezes? Apenas uma vez?

## Entendendo o problema de usar splash screen

Imagine se **todas as vezes que o usuário abrir a App**, tiver que esperar um determinado tempo para a App mostrar o conteúdo que ele vai interagir, sendo que ele **já sabe o que é a App e o que ela faz**. Será que ele vai gostar disso? Provavelmente não... Então como poderíamos resolver esse problema?

## Conceito para evitar o problema

Teoricamente, quando o usuário abrir a App, precisamos **armazenar uma pequena informação** indicando que o usuário já iniciou a App uma vez. Porém, no Android, como podemos armazenar dados ou informações?

Podemos optar por criar um banco de dados no [**SQLite**], e então, criamos uma tabela para armazenar essas informações. Entretanto, precisamos apenas armazenar uma informaçãozinha, ou seja, um `true` ou `false`, 1 ou 0.

Em outras palavras, qualquer dado que indica se o usuário iniciou ou não a App.

Considerando esse aspecto, faz sentido criar uma **estrutura complexa** como um banco de dados, apenas pra resolver isso? Aparentemente não... Então como resolvemos esse mesmo problema sem a utilização de um banco de dados?

## Conhecendo o Shared Preferences do Android

No Android, existem diversas opções de armazenamento, conhecidas como [**Storage Options**], dentre essas opções, temos a [**Shared Preferences**] que nos permite armazenar valores primitivos, como por exemplo, `booleans`, `floats`, `ints`, `longs` e `Strings` a partir de uma chave, por exemplo:

- **chave:** ja_abriu_app, **valor:** `true`

Bem legal, né? Vamos então adicioná-la na activity `SplashScreenActivity` que é a _LAUNCHER_ da App. Como podemos fazer isso?

## Utilizando o Shared Preferences

Simples! Primeiro chamamos o método `getSharedPreference()` enviando 2 parâmetros:

java

- **1º parâmetro:** nome da shared preferences que queremos buscar.
- **2º parâmetro:** modo de acesso (Por defautl utilizamos o [**MODE_PRIVATE**] pois ele restringe o acesso apenas para a App que está chamando ou para todas as Apps que tiverem o mesmo user ID)

Esse método nos devolve uma instância da classe `SharedPreferences`:

java

A partir do objeto `preferences` podemos verificar se existe uma chave com o método `contains()`. Portanto, antes de chamar o `postDelayed()` do `handler`, vamos verificar se existe a chave `"ja_abriu_app"`.

java

Caso exista, mostramos a tela de login:

java

Mas e se a chave não existe? O que fazemos? Adicionamos um `else` para mostrar a splash screen, certo?

Antes de adicionar o `else`, para facilitar a leitura e compreensão do código, vamos extrair o método `mostrarSplash()` enviando todo o código que cria a splash screen dentro dele. Então ficamos com o seguinte resultado:

java

Se executarmos a App, teremos o mesmo comportamento de antes, pois a chave que enviamos ainda não existe! Então o que precisamos fazer agora?

## Salvando informações no Shared Preferences

No momento em que o método `mostrarSplash()` for chamado, precisamos também armazenar essa chave no nosso `preferences`, certo? Então vamos adicioná-la!

Primeiro, vamos criar o método `adicionarPreferenceJaAbriu()` que recebe um objeto do tipo `SharedPreferences`:

java

Dentro do método `adicionarPreferenceJaAbriu()`, criaremos a chave `"ja_abriu_app"`. Mas como fazemos isso? A partir do `preferences` chamamos o método `edit()` que nos devolve um objeto do tipo `SharedPreferences.Editor()`:

java

Então, a partir do `editor` podemos adicionar um valor, por exemplo, para adicionar um `boolean`, utilizando o método `putBoolean()` enviando o nome da chave e o valor:

java

Por fim, precisamos utilizar o método `commit()` do `editor` para salvar a operação que realizamos:

java

> Nesse exemplo, adicionamos apenas uma chave antes de realizar o `commit()`, porém, poderíamos adicionar mais de uma antes de chamá-lo!

Por fim, basta apenas chamarmos o método `adicionarPreferenceJaAbriu()` enviando o `preferences` logo antes de chamar o método `mostrarSplash()`:

java

Executando novamente a App, temos o mesmo resultado de antes, pois **ainda não existe a chave**, porém, a partir da segunda execução, a App direciona direto para a tela de login!

Um detalhe importante sobre a Shared Preferences considerando esse nosso exemplo, é que não utilizamos em nenhum momento o seu valor, isto é, foi necessário apenas saber se a chave existia, afinal, caso ela exista sabemos que ele já abriu uma vez. Então vem a questão:

> Em quais casos seria interessante pegar o valor da Shared Preferences?

## Consideração do Shared Preferences

Atualmente, é muito comum abrirmos uma App, realizarmos o login e, em algum momento, fecharmos a App. Entretanto, quando abrimos novamente a App, não passamos mais pela tela de login, certo?

Como será que isso é feito? Provavelmente, existe algum tipo de _token_ identificador que verifica se esse usuário faz parte ou não do sistema.

Considerando o cenário acima, como faríamos para armazenar esse token na App? Por meio do Shared Preferences também!

Em outras palavras, o Shared Preferences pode nos auxiliar em diversos cenários no dia a dia considerando que precisamos apenas salvar um dado primitivo.

Entretanto, seu uso precisa ser consciente, pois se a sua intenção é armazenar configuração de preferência do usuário, o mais indicado é o uso da [**PreferenceActivity**] :)

## Conclusão

Nesse post vimos que além do SQLite, temos outras Storage Options que nos permitem armazenar dados nos dispositivos sem a necessidade de criar uma estruta de dados complexa como um banco de dados.

Dentre elas vimos a Shared Preferences que nos permite armazenar valores primitivos utilizando uma estrutura de chave e valor. O que achou da Shared Preferences? Teste na sua App e me conte o que achou! ;)

E que tal aprender a integrar a sua App Android com um Web Service? Seus problemas acabaram! Na Alura temos o [**curso de Android com Web Service**] no qual você vai aprender desde o zero como podemos fazer com que a nossa App Android se comunique com um servidor externo.




Unir o conhecimento com a técnica é essencial para o designer que deseja ingressar no mercado de trabalho. Até mesmo quem [**busca um freela**] precisa ir além da teoria e conhecer as ferramentas de web designer, itens importantíssimos que ajudam a colocar em prática tudo aquilo que você aprendeu nos livros e nas salas de aula.

## Adobe Photoshop

Sem dúvidas, esse você conhece. O [**Photoshop**] (PS) é o software de edição de imagens mais popular e mais usado no mundo.

Está no dia a dia tanto de designers gráficos quanto de designers digitais e apresenta recursos muito poderosos. Com ele, você pode criar uma infinidade de layouts de sites e fazer montagens e tratamentos de fotos, animações simples, ilustrações e muito mais.

Entre os profissionais experientes, há controvérsias quanto ao uso do Photoshop como melhor software para criação web. Alguns defendem o Fireworks, também da Adobe, alegando que o PS foi originalmente projetado para manipulação de imagens. Mesmo assim, o Photoshop é a preferência da maioria dos designers, pois esses profissionais já estão bem familiarizados com seus comandos e recursos.

Saber trabalhar com o Photoshop é obrigatório para quem é designer. Se você ainda não domina esse programa, [comece agora mesmo].

## Adobe Illustrator

Diferentemente do Photoshop, que trabalha com imagens bitmaps, o [Illustrator] é uma ferramenta que lida com [**imagens vetoriais**]. Os dois softwares formam a verdadeira dupla dinâmica no cotidiano do web designer.

No Adobe Illustrator, você pode desenvolver várias peças: ícones, ilustrações, infográficos, logotipos e layouts diversos. E o melhor: ele tem integração com outros softwares da Adobe, o que facilita bastante o trabalho.

## Heat maps

Os heat maps (ou mapas de calor) não são ferramentas para criação, mas são bem importantes porque indicam se os visitantes estão usando o site da maneira desejada. Afinal, de que adianta criar um design incrível se o mesmo não atingir os objetivos a que se propõe?

Esses softwares fazem um rastreamento individual de cada interação e representam, por meio de cores, o que as pessoas estão fazendo no site. Eles controlam, inclusive, cliques em locais que não são links e que podem estar causando confusão na cabeça dos usuários. Essas indicações são ótimas para que você descubra o que não funciona tão bem e que deve ser melhorado.

Para conhecer mais sobre o assunto, confira as ferramentas [**CrazyEgg**] e [ClickHeat].

## Testes de usabilidade online

Que tal colocar à prova a usabilidade do site que você desenvolveu? Isso é possível com testes online em estilo moderado ou não moderado. Além de mais rápidos do que os testes tradicionais, que recrutam pessoas, o modelo online economiza dinheiro e possibilita mais controle dos seus cenários.

No [UserTesting.com] (moderado), por exemplo, você pode estabelecer que o teste seja feito por usuários pré-selecionados. É possível segmentar por faixa etária, gênero, país e outros critérios para se escolher quem deve participar da avaliação. Já com o [ClickTale] (não moderado), a navegação dos visitantes é anonimamente monitorada, registrada e estudada. Nesse caso, os participantes são selecionados de forma aleatória dentro de uma base de cadastrados na própria ferramenta.

Os testes de usabilidade permitem que você observe os acessos dos usuários e descubra como eles se comportam. Os resultados indicarão quais recursos devem ser abandonados ou priorizados e apontar outras soluções centradas no usuário.

## Testes A/B

É muito provável que você já tenha passado pela seguinte situação: criou dois ótimos e diferentes layouts, mas não consegue decidir qual é o melhor. Para sair desse dilema, faz uma “votação” entre seus colegas de trabalho.

Hoje, já existem alternativas tecnológicas que eliminam essa dúvida. São os testes A/B, ferramentas para web designer que permitem que você implemente vários projetos do mesmo site, mostrados aleatoriamente aos visitantes. A ideia é fugir do “achômetro” e ajudar a determinar qual opção é a mais eficaz.

Os testes A/B são muito usados no e-commerce. Numa loja virtual, pequenas alterações podem [**influenciar na performance**]. Uma simples troca da cor do botão “Comprar”, por exemplo, pode ser o que faltava para melhorar as vendas.

Se quiser saber mais sobre os testes A/B, conheça o [**Google Web Optimizer**].

## Editores de código fonte

Com frequência, o web designer precisa [**trabalhar com programação**] e também há softwares que o auxiliam nessa tarefa. Dentre eles, temos as IDEs (do inglês, Integrated Development Environment ou Ambiente Integrado de Desenvolvimento) que fazem parte de um conjunto de ferramentas organizadas para facilitar o trabalho do desenvolvedor.

O [Sublime Text 2] é uma aplicação que surgiu dessa tendência e com o intuito de fazer a programação se tornar mais simples e adaptada à forma de trabalho do usuário. Na prática, ele é um editor de texto leve e com interface fácil de usar.

Vale lembrar que o Sublime Text 2 é uma ferramenta paga, porém há outras alternativas gratuitas que cumprem bem o mesmo papel. É o caso do [Brackets], da Adobe, e do [Visual Studio Code].

## Just My Type

Se você é um designer apaixonado por tipografia, com certeza vai gostar do site [Just My Type]. Ele permite que você teste várias fontes populares e veja a que melhor se encaixa no seu layout. As opções vão desde os estilos antigos até os mais modernos. Para surpreender, explore também o font pairing, uma técnica para sair do lugar-comum, misturando dois tipos de fontes diferentes em uma mesma frase.

**Essas são as ferramentas que destacamos para você e que vão ajudá-lo na criação e desenvolvimento de um bom trabalho de design. É claro que, sozinhas, elas não fazem milagres. O profissional é uma peça-chave no processo e precisa ser criativo, organizado e interessado em estudar, pesquisar e aprender cada vez mais, principalmente numa área multidisciplinar como a de design.**







imagem 

Usar muitas imagens separadas com `<img>` pode ter um custo de performance. Mas transformá-las em sprites pra usar com CSS pode ter um impacto semântico, em SEO e acessibilidade? E técnicas como LazyLoad?

Essa excelente pergunta foi trazida no [**fórum da Alura**] pelo [Guilherme Battoni]. No cenário dele, ele tem uma galeria de muitas fotos e quer melhorar a performance sem prejudicar a semântica.

## SEO/semântica vs performance

No fim, existem duas coisas conflitantes que precisamos pesar, neste caso tanto o lado do **SEO** como também o de **performance**, vamos entender cada um deles:

### SEO

Do ponto de vista de SEO, você precisa sempre colocar a foto no `src` do `<img>`. Qualquer outra coisa e o Google não vai indexar a imagem corretamente (seja sprite, seja o lazyload). Se SEO é importante pra você, coloque as imagens do jeito tradicional.

### Performance

Pra performance, pode não ser tão interessante carregar tudo em `<img>`. Então se o SEO não for tão importante, podemos pensar nos truques. Meu favorito é o _Lazy Load_ (carregar a imagem com JavaScript só quando ela for necessária). Inclusive no [**curso avançado de Performance Web**] a gente fala disso.

## Vale a pena fazer sprites com muitas imagens?

Fazer sprites com muitas fotos eu já não acho uma boa ideia. Em geral fotos são grandes e a sprite final vai ficar gigantesca. Isso vai demandar mais memória pra processar e um download muito maior.

A compressão pelo fato de juntar várias fotos não vai ser tão boa assim porque em geral o conteúdo é diferente. E é bem possível que certas fotos fiquem piores visualmente que outras no meio dessa sprite gigante (pela forma que o JPEG comprime).

## Como devo lidar com imagens grandes?

Agora, o importante também é medir o impacto real na performance sentida pelo usuário. A gente se assusta com imagens grandes mas em geral elas são o menor dos problemas. **Imagens são baixadas de forma assíncrona e não bloqueiam nada na renderização.**

Então desde que você priorize os downloads de forma correta (baixar as imagens mais importantes antes), em geral não é tão negativo ter vários requests de imagens.

Você só precisa ver se esses requests de imagem não estão bloqueando a fila de downloads do browser e impedindo que coisas mais importantes como CSS e JS sejam baixados (nesse caso, colocar as imagens num hostname separado ja aliviaria).

Mas claro, tudo isso pensando em performance de carregamento/execução. Se a preocupação for com o total de bytes baixados (economizar banda, não parecer rápido), aí a conversa é mais na linha do Lazy Load mesmo.

Aliás, Lazy Load é um bom exemplo de técnica que prioriza algo (consumo de banda) em detrimento de outras coisas (percepção de performance, SEO).

## Resumo

Tudo depende, e você vai precisar quebrar a cachola um pouco pra ver o melhor pro seu cenário.




A maioria dos usuários de WordPress gasta boa parte de seu tempo interagindo com o editor visual da plataforma. Não é difícil entender porquê. A ferramenta é extremamente poderosa e oferece o ambiente ideal para produzir e [**publicar conteúdo**], o que tornou essa plataforma a número um para criação de sites e blogs no mundo!


## 1\. Domine o WordPress com atalhos de teclado

Para utilizar ao máximo as capacidades de seu blog no WordPress, será preciso conhecer alguns dos atalhos de teclado que tornam a postagem, edição e compartilhamento de seu conteúdo menos complexos.

É irritante mover o mouse toda hora apenas para deixar um texto em negrito ou adicionar um link, certo? O editor visual tem inúmeros atalhos de formatação que vão tornar a escrita mais intuitiva.

Utilizando _ctrl_ + as seguintes letras, você consegue:

- **c:** copiar
- **v:** colar
- **x:** cortar
- **a:** selecionar tudo
- **z:** desfazer a digitação recente
- **y:** refazer a digitação recente
- **b:** colocar o texto selecionado em negrito ou **começar a escrever em negrito**
- **i:** colocar o texto selecionado em itálico ou _começar a escrever em itálico_
- **u:** sublinhar o texto selecionado ou começar a escrever sublinhado
- **1, 2, 3, 4, 5, 6:** criar um título diferenciado, com as formatações H1, H2, H3, H4, H5 ou H6
- **k:** inserir ou editar um link

## 2\. Altere o espaçamento entre parágrafos

Você sabe criar parágrafos e utilizar quebras de linha no WordPress? Cada vez que você pressiona a tecla _enter_, um novo parágrafo com espaçamento duplo é originado no editor visual.

Se preferir utilizar espaçamento simples, não se preocupe: pressione _shift + enter_ na hora de escrever seu texto e _voilà_!

## 3\. Copie um texto sem a formatação

Quando copiamos trechos de textos da internet e colamos num post por meio do editor visual, a formatação dele vem junto. Nem sempre isso é o ideal, já que seu blog tem uma identidade e estilo próprios.

Para resolver o problema, pressione o botão _"Paste as text"_ no editor visual. É aquele identificado pelo símbolo da prancheta.

## 4\. Adicione caracteres especiais à sua postagem

Precisa adicionar símbolos, como o _copyright_ (©), e não sabe onde encontrá-los? Dentro do editor de textos, você tem um mapa de caracteres especiais para tornar esse trabalho mais simples. Ele está identificado pela letra grega **Ω** (ômega), que também é um caractere especial!

## 5\. Reorganize o editor de textos para deixá-lo do seu jeito

Você pode reorganizar a tela do editor de postagens do WordPress como quiser. As _metaboxes_, que incluem categoria, informações sobre o autor e outros campos úteis, como dados de plugins que você adicionou a seu website, podem ser organizadas para ficar com a sua cara.

Uma área de escrita livre, por exemplo, pode ajudar a se focar no conteúdo. Clique e arraste o título de uma dessas caixas para mudar sua posição.

Acha que não precisa de alguma delas? Clique no botão de opções, no canto superior direito da tela, e escolha quais ocultar ou exibir.

## 6\. Escreva em tela cheia se preferir não se livrar das metaboxes

Tem hora que [**precisamos realmente focar no conteúdo**] e se livrar das _metaboxes_ pode não parecer o suficiente. Para isso, uma das nossas dicas do WordPress é utilizar o modo de tela cheia, que oferece um editor sem distrações.

Clique no botão "tela cheia" e produza posts com mais agilidade. Não se preocupe, todos os instrumentos de edição visual, como a opção de mudar seu texto para negrito ou itálico, ainda estarão lá.

## 7\. Destaque seus títulos alterando o tamanho deles

A tipografia é fundamental para enriquecer um conteúdo na web e, na maioria das páginas que visitamos, ela compõe quase todo o layout. Você pode querer utilizar diferentes tamanhos de fonte para capturar a atenção do leitor ou destacar seções diferentes de um artigo.

Por padrão, o editor visual do WordPress permite que você escolha o tamanho da fonte em parágrafos, cabeçalhos e rodapés. Selecione o texto desejado e edite a informação na caixa _"Paragraph"_.

## 8\. Insira tabelas e organize seu conteúdo

Precisa incluir uma tabela no seu post, mas não sabe como? Alguns temas vem com essa opção de fábrica, mas, para todos os outros, um plugin simples como o TablePress pode ajudar. [Faça download do arquivo aqui] e, depois, entre na sua página de plugins.

Lá você encontrará a opção de fazer o upload de um novo plugin. Indique o caminho do arquivo e, após a instalação, ative-o. Pronto! Agora o TablePress está instalado e você poderá incluir tabelas em seus novos posts.

Para criar uma tabela, vá até a aba do plugin (no canto esquerdo da tela) e selecione _"add new table"_. Dê à sua tabela um nome, escolha o número de linhas e colunas e insira os dados necessários. Quando quiser adicionar essa tabela a um post, basta clicar no novo botão que aparecerá em seu editor de textos: _insert a table from TablePress_.

## 9\. Integre vídeos ao seu website pelo WordPress

Não é uma boa ideia fazer upload de conteúdos em vídeo direto no WordPress. Carregar esses arquivos em sua própria instalação vai custar largura de banda e, provavelmente, exigir que você instale e configure alguns plugins adicionais para que o conteúdo seja exibido corretamente.

A melhor coisa que você pode fazer é incorporar vídeos do YouTube em sua página, consumindo assim a largura de banda de terceiros.

Faça upload do seu conteúdo no YouTube e, em seguida, copie a URL encurtada do vídeo. Para inserir o conteúdo em seus posts, basta colar esse endereço no editor visual de conteúdo.

## 10\. Alterne para o editor de HTML

O editor visual do WordPress é extremamente poderoso, mas pode ser que você queira incluir seu próprio HTML para tornar posts e páginas ainda melhores. Às vezes, quando lidamos com o alinhamento de imagens e textos, o melhor é recorrer ao código para trabalhar com mais velocidade e controle.

Alternar entre o editor visual e o HTML é muito simples: basta clicar no separador _"text"_.

E aí, o que achou das nossas dicas do WordPress? Elas vão facilitar (e muito!) a construção do seu site, deixando o trabalho ainda mais intuitivo. Que tal conhecer agora alguns [**hacks de Illustrator**] que vão permitir que você crie imagens incríveis para deixar seu novo blog do seu jeito? Confira!





imagem 

Veja como usar o git e  aplicar versionamento em seus projetos.

Estou em um projeto para um mercadinho e agora estou desenvolvendo uma página web em HTML com o intuito de listar todos os produtos do mercado. A princípio cheguei no seguinte resultado:

imagem o gerenciamento do projeto:

`git init`

imagem o nosso arquivo `produtos.html` para ser salvo:

`git add produtos.html`

Pronto! Com isso nosso arquivo foi marcado pelo Git, porém, ainda precisamos marcar os arquivos que estão no diretório `css` e `js`. Mas para isso eu preciso adicionar todos os arquivos contidos neles um por um?

Não necessariamente, você pode adicionar um arquivo por vez passando o caminho até ele, mas se você quiser adicionar todos os arquivos de um diretório, basta dizer isso para o Git:

`git add css/`

Dessa forma, todos os arquivos dentro da pasta `css/` foram adicionados ao Git. Mas se no meu projeto eu tiver muitos arquivos e diretórios, preciso adicionar um de cada vez?

### Adicionando todos os arquivos de uma vez

Considerando que precisamos **fazer isso para todos**, podemos dizer para o Git adicionar (`add`) todos os arquivos modificados (`.`):

`git add .`

imagem indicando o que esse estado significa.

python

imagem:

imagem

## Adicionando uma imagem ao produto

Por fim, vou adicionar a imagem no produto e realizar o mesmo procedimento:

imagem

## Para saber mais

Além de um VCS, o Git também é conhecido como um SCM do inglês Source Code Management ou gerenciamento de código fonte. Além dele, também existem algumas alternativas com o mesmo objetivo:

- [**SVN**]
    
- [**Mercurial**]
    
- [**Perforce**]
    

Basicamente, essas ferramentas são capazes de aplicar todos os conceitos que vimos durante o texto, porém, uma acaba tendo alguma vantagem em relação a outra, como também, a adoção da comunidade de desenvolvedores.

> Legal, mas qual dessas ferramentas vale a pena eu aprender?

Uma das maneiras que podemos verificar, é justamente o quão usada é uma ferramenta em relação a outra. Para isso, temos a possibilidade de visualizar a popularidade de cada uma delas [**nessa pesquisa feita pela RhodeCode em 2016**].

Além dos tópicos que vimos anteriormente, um uso bem comum em ferramentas como o Git é justamente manter a disponibilidade do nosso projeto de forma remota para qualquer desenvolvedor que for participar do projeto.

Em outras palavras, deixar o nosso projeto em um **repositório online** como é o caso do [**GitHub**], [**GitLab**] ou [**BitBucket**]. Então, se precisar baixar o projeto ou pegar as últimas atualizações que foram feitas, basta apenas consultar esses repositórios remotos!

A mudança é uma característica comum durante o desenvolvimento de um projeto e, para lidarmos melhor com esse tipo de situação temos os VCS como é o caso do Git.

Esse é uma pequena parte do mundo de versionamento, ainda existem técnicas e conhecimentos essenciais para usarmos essas ferramentas de maneira eficiente.

Se quiser aprender mais sobre versionamento, aqui na Alura temos um [curso de Git] e na Casa do Código também temos um [livro sobre Git e Github].

Lá você verá tanto essa parte de versionamento do projeto como também técnicas mais avançadas que podemos aplicar durante o desenvolvimento em time que é algo muito comum no dia a dia.






imagem 

Do que se trata a **User Experience (UX)** ?

## O que é UX?

Quando lançamos um aplicativo, um site, ou algo do tipo, nunca partimos do zero.

Afinal, se temos, por exemplo, um app de banco, que realiza diversas transações e atividades muito importantes, faria sentido que o app fosse cheio de recursos visuais decorativos que deixassem a navegação toda confusa?

Ou ainda, será que o usuário de um app desse tipo se sentiria confiante em realizar ações tão importantes ali dentro, se nem conseguisse encontrar as páginas e campos que precisa para concluir o que começou?

A user experience é a área que justamente pensa em todos esses processos, desde a arquitetura da informação, o tipo de público que se pretende atingir, os recursos de interface e interação que facilitarão a usabilidade e mesmo conseguir aplicar todos esses conceitos de estratégia aliados aos interesses do cliente ou da marca.

**Pensar em user experience é passar por diversos processos**, construindo e planejando a experiência do usuário até a validação e implementação de todas essas ideias.

Ainda assim, em UX lidamos com **um processo contínuo de refatoração**, criando e remodelando o que lançamos de acordo com a respostas dos testes com o usuário.

Isto significa que os processos em UX são diversos e cíclicos, exigindo **expertises bastante distintas em cada etapa**.

> _"Tudo bem, mas que expertises são essas?"_

## O time de UX

É comum encontrarmos vagas de emprego por aí que exigem milhares de pré-requisitos para o profissional de **UX**.

Geralmente essa pessoa precisa saber lidar com todo o planejamento estratégico, além de ser designer e desenvolvedor também, que projeta e implementa o projeto, realizando os testes e todo o acompanhamento do produto.

Mas, dificilmente alguém com uma sobrecarga tão grande de funções seria capaz de realizar, em um período saudável de trabalho, todas essas funções com tanta assertividade e qualidade.

Para isso, constroem-se times de pessoas experientes com os processos de UX, que vão desde marketeiros, gerentes de produto, designers e programadores, incluindo ou subtraindo algumas funções dependendo da demanda de cada projeto.

Quando dividimos os times dentro de expertises específicas, o trabalho fica muito mais direcionado e completo. **Tiramos o melhor de cada processo com pessoas especializadas naquela função.**

## O que todo o time de UX precisa

Entendemos que profissionais de diversas áreas participam de times de UX.

Vale lembrar também que a participação de **times interdisciplinares gera brainstorming de ideias muito mais rico**.

Não é necessário que todos os profissionais sejam multi tarefas, capazes de realizar com maestria todos os processos, mas é muito importante que um profissional de UX consiga entender todas as etapas do projeto, alinhando suas atividades com a do restante do time para criar um produto mais consistente.

Para entender um pouco mais de todos os processos, na **Alura** temos uma [**formação  de UX Designer**] explicando em mais detalhes toda essa parte. ;)




Vamos ensinar o nosso programa quais comentários são permitidos e quais não são. Isto é, podemos dar para ele um monte de comentários dizendo quais são ofensivos ou não. Com isso, quando um novo comentário aparecer, ele saberá como classificá-lo.

## Ensinando a máquina

Eu já tenho aqui no meu computador um arquivo **CSV** com vários comentários já classificados para ensinarmos nosso algoritmo. Já que vamos utilizar esse arquivo, precisamos abri-lo.

Uma maneira de abrirmos esse arquivo é utilizar a biblioteca [**Pandas**]. Essa é uma biblioteca muito utilizada por pessoas que fazem análise de dados ou aprendizado de máquinas, pois ela fornece uma série de funções e classes que nos ajuda a manipular os dados.

Podemos instalar essa biblioteca com o comando `pip`:

python

Já temos o Pandas instalado no nosso computador. Vamos falar para o Python começar a usá-lo no nosso código. Logo, falamos para o Python importá-lo (`import`). Pelo fato do Pandas ser uma biblioteca muito utilizada, é quase que uma convenção importá-lo como (`as`) `pd`.

python 

Vamos falar para o Pandas ler o nosso arquivo de comentários (`pd.read_csv()`) e atribuí-los a uma variável:

python 

Nesse arquivo CSV, temos os comentários e suas classificações. Para ensinar nosso algoritmo, precisamos passar esses dados separadamente, isto é, precisamos dizer para ele quais são os comentários e quais são suas classificações. Já que vamos precisar desses valores, vamos atribuir cada um em uma variável:

python 

Quando formos ensinar nosso algoritmo ele pegará cada texto e classificação e aprenderá se aquele comentário é ofensivo ou não… Cada texto? O que torna um comentário ofensivo é o comentário em si, isto é, o texto puro, ou as palavras contidas nele?

Cada **palavra em um comentário tem um peso**, ou seja, não podemos olhar um comentário como um todo, mas cada palavra que compõem este comentário. Logo, vamos falar para o Python pegar essa nossa string (`str`) de comentários e separá-la (`slipt()`):

python 

Para ensinar nosso algoritmo, precisamos contar quantas vezes cada palavra apareceu em um comentário. Isto é, do nosso conjunto de palavras, temos que contar quantas vezes cada palavra aparece. Mas já temos esse conjunto de palavras?

O que temos até então são os textos dos comentários quebrados em palavras. Nós podemos falar para o Python criar um conjunto (`set`) de `palavras` e para cada palavra nos `textos_quebrados`, atualizar esse conjunto:

python 

Um [**conjunto**]), ou um `set`, é uma estrutura de dados que guarda apenas uma ocorrência de cada objeto, que no nosso caso é uma palavra. Ou seja, se tivermos dez comentários com a palavra `legal`, no nosso conjunto, essa palavra aparecerá somente uma vez.

Mas se nossa palavra só aparece uma vez em nosso conjunto, como vamos saber quantas vezes ela apareceu?

Temos que contar quantas vezes cada palavra apareceu no texto, nós podemos criar uma função para isso. Nossa função criará uma lista com o número de vezes que cada palavra apareceu no comentário.

Para contar as palavras, precisamos saber qual é a palavra. Ou seja, podemos usar a posição da nossa palavra no conjunto:

python 

Quando executamos esse código, recebemos um erro:

imagem`. Mas teremos que fazer isso para cada palavra?

Nós podemos criar uma função que se encarrega dessa tarefa, porém, o Python nos fornece muitas funções, inclusive uma que faz exatamente isso que estamos querendo.

Queremos criar um índice para as nossas palavras, uma maneira de fazer isso é utilizando a função `range`. Com ela, conseguimos criar uma sequência de números, por exemplo, podemos falar para a `range` criar um série de números baseada no tamanho (`len`) do nosso conjunto de palavras:

python 

Se nós imprimirmos essa variável, teremos o seguinte resultado:

imagem cada palavra com um número:

python 

Com nossas palavras agrupadas com um número, nós podemos criar um tradutor, isto é, um dicionário para cada (`for`) `palavra, indice` em nosso agrupamento (`zip(palavras, indices)`):

python 

Bacana! Agora cada palavra de nosso tradutor tem um índice, podemos finalmente começar a escrever nossa função para contar as palavras.

## Vetorizando um texto

Nossa função terá que pegar todas as palavras do nosso tradutor e nos devolver uma lista com a contagem de cada palavra naquele comentário. Para isso ela deve receber um texto, ou seja, o comentário, e o nosso tradutor:

python 

Nossa função precisa contar cada palavra que aparece no comentário, para isso, podemos criar uma lista que tem o tamanho do nosso tradutor:

python 

E, para cada palavra, checar se ela está no nosso tradutor, se sim, pegamos a posição desta palavra e incrementamos o valor naquela posição do nosso vetor:

python 

Já temos a função para vetorizar nossos textos. Agora podemos falar no nosso script principal para vetorizar cada comentário, em nossos `comentarios_quebrados` utilizando nosso tradutor:

python 

Vetorizamos nosso texto, agora precisamos ensinar os algoritmos.

## Criando nossos modelos

Já temos nossos textos vetorizados, agora temos que treinar nosso algoritmo. Existem vários algoritmos que podemos utilizar. Um algoritmo muito utilizado quando queremos classificar algo é o [**Teorema de Bayes**]. Podemos utilizar o módulo [**naive_bayes da biblioteca scikit-learn**].

python

A classe **MultinomialNB** é uma implementação do algoritmo de Bayes. Nós podemos usar ela para treinar (`fit`) nosso modelo:

python 

Legal, nosso modelo está treinado, agora já podemos falar para ele predizer (`predict`) um comentário, basta separar cada palavra do texto e vetorizá-lo.

python

**O método `predict` nos devolve um array do Numpy com a nossa classificação.**

## Para saber mais

Classificar comentários é apenas uma tarefa que conseguimos realizar com aprendizagem de máquina. Com um código parecido com o que realizamos, podemos classificar se uma mensagem é spam ou não. Podemos verificar se o texto se trata de um assunto financeiro ou não, entre várias outras possibilidades.

Esse nosso algoritmo já funciona muito bem, porém podemos melhorá-lo. Se dermos uma olhada no nosso conjunto de `palavras` veremos algo como:

`{‘bom’, ‘Bom’, ‘carros’, ‘carro’, ...}`

`Bom` é `bom` são as mesmas palavras. A diferença é que uma está em caixa alta e a outra não. Pelo fato do Python ser uma linguagem `case-sensitive`, ela diferencia letras maiúsculas de minúsculas e isso pode afetar o modo que nosso algoritmo classifica os dados.

Para resolver isso, podemos converter todas as letras para minúsculo no momento que estamos quebrando os textos, por exemplo:

python

Se olharmos nosso conjunto de palavras agora, veremos que nosso conjunto só contém uma palavra `bom`:

`{‘bom’, ‘carros’, ‘carro’, ...}`

Mas ainda temos algumas palavras no plural, como será que podemos resolver isso?

Nós podemos ir de palavra em palavra checando se ela é plural ou não, porém isso é um pouco trabalhoso. Uma outra maneira é utilizar uma biblioteca para transformar nossas palavras em uma só, isto é, extrair a raiz da palavra.

Uma biblioteca muito utilizada para isso é a [**NLTK**]. Essa biblioteca nos permite manipular textos de várias formas. Podemos extrair a raiz das palavras, retirar pontuações e até mesmo verificar e excluir termos comuns, como artigos e preposições.

Ou seja, podemos melhorar muito nosso algoritmo retirando "sujeiras" que podem atrapalhar nosso modelo na parte de aprendizagem e predição.

Aqui na **Alura**, temos uma [formação em Data Science]. Nela você aprenderá como funciona algum dos algoritmos de classificação, como utilizar a biblioteca NLTK e muiot mais.





imagem 

Neste episódio do Alura Live, Gabs Ferreira recebeu Thuany Serpa, UX/UI designer na Lambda3 pra falar um pouco desse assunto que vem cada vez mais ganhando espaço no mercado de trabalho geral e para desvendarem um pouco dessas dúvidas entorno desse tema.

https://www.youtube.com/embed/InGacP20a14?rel=0

Ficou interessado em saber mais? [Assista a live completa!]

- Links comentados no vídeo: [Google Design.] [Mergo UX. ] [UX.blog.] [Livro UX Design]: Introdução e boas práticas em UX Design. [UX Design CC.]
    
- Cursos de UX da Alura: [UX:] do briefing ao protótipo. [UX mitos:] os erros frequentes de usabilidade e as boas práticas. [UX Produto:] monitore, mensure e teste o seu projeto.
    
-  Pensar designer é pensar soluções que facilitam a sua vida e a do usuário, então que tal investir em uma: [**Formação UX Designer.**]
    

Siga a gente no Twitter: [Gabriel Ferreira], [Thuany Serpa] e a [Alurinha]! ;)




Quem começa na área criativa de **design gráfico** sempre se pergunta: primeiro **digital**? Ou é melhor aprender design para **impressos** antes?

A **carreira** de design ajuda todos nós a entender um produto da maneira que ele foi concebido, e para ajudar aqueles que querem começar na área, ou curiosos de outras áreas, criamos um guia de 3 passos.

## 1. Design e Gestalt

Para entender o que pode ser um bom ou um mal design dentro de um contexto precisamos aprender como o ser humano reage a aquilo que ele vê. A base para se tornar [**um designer começa no curso de Design e Gestalt**], onde profissionais criativos e interessados em comunicação visual compreenderão na prática a Teoria da Psicologia de Percepção das Formas, afim de adquirir a convicção de realizar bons trabalhos e avaliar materiais.

## 2. Os caminhos se partem

Com a base de como o ser humano reage às informações visuais, você pode escolher qual tipo de trabalho deseja realizar. Ao escolher uma área que deseja seguir, é mais fácil conseguir seu primeiro trabalho criativo, seja freelancer, estagiário ou designer júnior em uma empresa, oportunidades de trabalho que existem em abundância no mercado.

imagem não têm essa verba. A internet possibilita divulgar produtos e serviços por valores menores, direcionados a regiões e públicos-alvo específicos. É possível anunciar em quase todas as partes da internet: dentro dos sites, nas pesquisas do Google, no Facebook, por e-mail, etc.

Um **designer** que trabalha com a criação de peças publicitárias na internet desenvolve banners estáticos e animados, imagens para conteúdo de redes sociais, diversas imagens para anúncios e arte de e-mail marketing / newsletter. Muitas vezes esse profissional acompanha de perto os resultados das campanhas e participa das melhorias com idéias em reuniões, o que o torna mais próximo do **Marketing**.

### UX Design

[**UX Design com Axure: protótipo para App mobile**] 

[**UX Writing**]

O design da experiência do usuário é uma área que ganhou muita visibilidade nos últimos tempos. As empresas cada vez mais reparam que é importante cuidar da qualidade da interação do usuário com seus produtos e serviços. O profissional de usabilidade cuida menos de questões artísticas da interface, sua atenção está voltada para o bom desempenho do usuário nas ações que deve tomar. 

O UX designer deve imaginar caminhos, ações, questões de acessibilidade, tamanhos adequados para botões, textos com linguagem adequada para o seu público alvo e, o mais importante, trocar e alinhar informações com toda a equipe.

### Vídeo e animação

[**Introdução ao After Effects**]

[**Screenflow: Crie seus screencasts e vídeos**]

O design audiovisual é, sem dúvida, uma das formais mais completas que existe para comunicarmos algo. Hoje em dia não temos apenas as demandas das emissoras de televisão, temos telas em toda parte, até em nosso bolso. Para tudo que envolve comunicação hoje em dia o audiovisual é útil: publicidade, entretenimento, informação, arte, educação, etc. É importante que o profissional de motion design entenda como produzir , editar e finalizar filmes, mas também saiba realizar animações diversas.

### Webdesign

[**Photoshop para Web I: Desenhando suas páginas**] 

[**Photoshop para Web II: Layouts avançados**]

[**Illustrator: Crie layouts fantásticos para a Web**] 

[**HTML5 e CSS3 I: Suas primeiras páginas da Web**]

Esta é a área que faz fronteira com a programação **Front-end**: o webdesigner cria layouts adequados e o Front-end traduz a informação visual para a linguagem da internet. Aqui o importante é saber realizar boas composições, tornar a interação do usuário agradável e otimizar as imagens para que tenham qualidade e, principalmente, sejam leves. 

Uma boa experiência na web está diretamente associada ao tempo gasto para realizar determinadas ações, à familiaridade do usuário com a página e, logicamente, à uma boa sensação **visual**. Como em qualquer outra área, não podemos nos restringir ao que já aprendemos, o aprimoramento desta área se dá com o aprendizado de Front-end. HTML e CSS são conhecimentos importantes para que o webdesigner converse com os desenvolvedores e crie trabalhos de implementação viável.

## 3 Seu portfólio

[**Wordpress: primeiros passos**]

Diferente da maioria das carreiras, no Design é necessário que você mostre o que sabe fazer, afinal seu trabalho é, na maior parte, visual. Você precisa mostrar o que já produziu, mesmo que sejam apenas peças acadêmicas ou pessoais. As empresas sempre solicitam portfólio, antes mesmo da entrevista. O Wordpress é um sistema prático para divulgar seu trabalho na internet e atualizar seu conteúdo é ideal para divulgar os seus projetos caso você não seja o "ás" do front-end, mas não dispense uma boa apresentação. 

E se você não precisa esperar, reúna seu projetos e monte já seu **portfólio**.




Um primeiro ponto mais importante do que aprender a linguagem é **entender lógica**. É entender como podemos modelar os nossos problemas de uma maneira lógica.

https://www.youtube.com/watch?v=uXHRqIrZ3Y8

Tudo bom, Henrique? Esta é uma pergunta bem válida: vale mais a pena aprender logo de cara duas linguagens ao mesmo tempo ou me aprofundar em apenas uma e só depois começar uma segunda?

No final das contas é **definir algoritmos**. Isto pensando em uma linguagem para, aí sim, estarmos prontos para ir para uma próxima.

Se vou, por exemplo, contratar uma pessoa, tendo conhecimento básico ou avançado, mais importante que o domínio de uma linguagem, é a pessoa ser capaz de entender aquilo que estou passando para ela e traduzir para uma linguagem.

Tendo isso em vista e voltando para sua pergunta, eu focaria primeiro em uma linguagem, ser capaz de responder diversos tipos de problemas em uma para passar para a próxima.

Quando estamos nessa transição, percebemos algumas características que mudam na maneira de modelarmos o algoritmo ou uma solução. Um `if` ou um `else` podem ser muito parecidos de uma linguagem para outra, mas as soluções podem ser completamente diferentes.

Se não temos bem claro em nossa cabeça como resolver um problema em uma linguagem, teremos mais um problema se tentarmos com outra linguagem. Vence uma barreira por vez.

Isso não significa que você deva esperar 5 anos para começar a aprender uma segunda linguagem, até porque a maior parte das aplicações do mundo tem alguma conexão com a Web. Ou seja, se faz necessário saber uma linguagem _back end_ e outra _front end_, como Java e Javascript respectivamente.

Perceba que esta já é uma oportunidade de modelar problemas em linguagens diferentes, como _queries_ em SQL e HQL, por exemplo. Ou ainda surgirão problemas como analisar, filtrar, selecionar, somar, agrupar elementos em Java e, ao mesmo tempo, pegar esses elementos da minha página e fazê-los interagirem com o usuário em Javascript.

Perceba que já existirão diversos desafios. Por que, então, eu iria querer aprender alguma outra linguagem _back end_ nesse instante? Repare que no primeiro ano de aprendizado, por exemplo, se estou no mercado Web, já tenho, no mínimo, 3 linguagens para aprender:

- Uma para o _Back End_
- Uma de _Query_ para o banco de dados
- Uma para o _Front End_

Pra que aprender mais uma? Nos primeiros seis meses, se você se dedicar muito para aprender uma linguagem, mas muito mesmo, tudo bem. Talvez valha a pena aprender mais uma.

Veja que se em um ano você aprender bem essas três linguagens você estará na frente de muita, mas muita gente mesmo. Isso acontece porque não é costume nos dedicarmos tanto assim no primeiro ano.

Então minha sugestão é essa: em vez de aprender Java e C#, ou Java e Ruby, etc ao mesmo tempo, escolha uma para o _back end_, uma para o _front_ e uma para o banco de dados e se dedique a essas três. Você irá perceber o quão melhor você vai ser depois de seis meses ou um ano.

**No fim das contas, minha sugestão ficou em você aprender três linguagens que sigam esta ideia: uma para cada parte dos processos. Quando se sentir confortável, passe para a próxima linguagem. Até lá, aprofunde-se!**




A Alura já conta com mais de 180 cursos de programação, design e tecnologia. Toda semana novos cursos são criados ou atualizados na plataforma: foram mais de 80 cursos durante esse ano... 19 cursos só nesse mês de Dezembro! 

### Cursos com 100% de recomendação

[Além dos cursos mais concluídos de 2015], sabemos também os cursos mais recomendados pelos alunos, de acordo com a nota de sua avaliação final. A própria página do curso mostra essa porcentagem, junto como a quantidade de inscritos:

imagem curso(s) anterior(es): nesse caso [Java I: Primeiros Passos].

![Screen Shot 2015-12-28 at 17.07.27]




A experiência do usuário não pode e nem deve ser avaliada apenas desse ponto de vista.  

Existe um viés de confirmação implícito que sugere que UX Design é pensada apenas para soluções de tecnologia. Isso confunde as pessoas que estão entrando agora na área ou mesmo as que já estão, mas que ainda não refletiram com profundidade sobre o que experiência significa.

[**No curso de Design Thinking da Caelum**] ministrada pela [Carla de Bona], ela mostrou um exemplo do quão abrangente pode ser uma solução pensada na experiência das pessoas. O Exemplo usa a tecnologia como suporte, não como alvo.

O exemplo apresentado pela Carla é de surpreender. A solução usa a capacidade da tecnologia de [**Realidade Virtual**] ou VR para transformar o processo de vacinação de crianças em algo divertido.

Para quem estiver curioso sobre a solução, há um vídeo de apresentação da mesma no YouTube

https://www.youtube.com/watch?v=VgCPMkNlkSI


É em exemplos como esse que vidas são transformadas pelas soluções de UX que contam com o apoio da tecnologia.

[**Don Norman**], uma excelente referência de usabilidade descreve UX como a experiência que temos do mundo, da vida, do serviço. É relativo a tudo que nos rodeia.

https://www.youtube.com/watch?v=9BdtGjoIN4E
*Don Norman: The term UX.*

Quando nos desapegamos do enviesamento comum de pensar em sites e aplicativos revolucionários, podemos pensar em soluções de impacto que podem ou não serem tecnológicas, mas que com certeza podem tornar a vida das pessoas mais agradáveis.

E você? Como tem observado o mundo ao seu redor e como essa observação tem levado seus pensamos a iniciarem com frases do tipo: “Se … fosse da seguinte forma, … , seria muito melhor”.

Em suma, a direção é essa. Não se trata de tecnologia de forma isolada. É sobre pessoas, sobre suas dores e insatisfação. A solução pode ser um aplicativo ou site? Sim, mas também pode ser simplesmente como falamos com as pessoas.

Fica a reflexão. :)


Num ambiente competitivo uma marca é capaz de se destacar através de um design de qualidade e a inovação pode trazer singularidade para um projeto. Um dos passos mais importantes é a escolha das fontes tipográficas. 

O avanço tecnológico vem possibilitando o surgimento de fontes tipográficas de alta qualidade e fazendo com que os designers saiam da zona de conforto do uso das fontes clássicas.

**Explorar a variedade que cresce cada vez mais pode proporcionar encontros bem sucedidos**, resultando em peças de design interessantes e com personalidade. As tipografias clássicas sempre serão boas opções, mas vale a pena compreender o porquê das mudanças que vêm acontecendo no Design Gráfico a fim de explorar os novos recursos e ampliar seu repertório tipográfico.

## Os novos tempos para a Tipografia

Você provavelmente já ouviu falar na icônica fonte *Helvetica* se não ouviu falar com certeza já viu ela por aí, seja em logotipos de grandes corporações, como Jeep, Panasonic, American Airlines, 3M, entre outras, ou até nos seus dispositivos iOS do passado. Ela foi projetada em 1957 visando a criação de uma tipografia neutra e clara.

imagem

*Famoso estilo de camisa estampada com a Helvetica.*

Depois de um longuíssimo relacionamento com as grandes marcas, **a Helvetica, assim como outras fontes muito difundidas no passado, começa a sair de cena para dar lugar à novas fontes tipográficas.** A Apple percebeu que a fonte não adequa-se tão bem aos novos suportes digitais e por isso, encomendou uma fonte exclusiva para substituí-la.

Desenvolvida pela própria empresa com o nome que homenageia a sua cidade natal, a fonte San Francisco, implementada em 2015, apresenta um design sem serifas, limpo e compacto que possui uma ótima leitura até nos menores dispositivos, como o Apple Watch.

imagem

*A família tipográfica San Francisco completa.*

imagem

*Apple Watch com a nova tipografia aplicada.*

A Apple, apesar de ser uma grande referência em Design, não foi pioneira na criação de sua própria tipografia: a Google já utiliza a sua família tipográfica Roboto desde 2011. Desenvolvida inicialmente para o Android, a fonte hoje ocupa todas as plataformas Google.

imagem

*A família tipográfica Roboto completa.*

Outras grandes empresas, como a IBM, a CNN e a Coca-Cola, também passaram a utilizar recentemente tipografias feitas sob medida para si. **Seja por necessidades técnicas ou para ampliar o alcance de marcas, é notável que novas tipografias vêm surgindo e mostrando-se muito eficientes para tomar o lugar de outras que já fizeram a sua história.**

<iframe src="https://player.vimeo.com/video/164342604" width="640" height="360" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
<p><a href="https://vimeo.com/164342604">CNN Sans</a> from <a href="https://vimeo.com/cnncreativemktg">CNN Creative Mktg</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
*Apresentação da nova fonte utilizada pela CNN. O anúncio demonstra como a questão tipográfica transborda do Design para o Marketing.*


## Explorando os novos recursos
A Helvetica não é a única a ficar para trás nos tempos atuais. Durante um longo período **os designers não saíam da zona de conforto** que fontes como a Futura, Gotham e Frutiger proporcionavam pelo seu bom funcionamento e legado.

O limite do uso de qualquer tipografia, sejam elas clássicas ou atuais, é a **coerência** com o projeto que se está desenvolvendo:

O tipo é uma imagem e uma imagem sempre terá **significados intrínsecos**, sejam eles sutis ou mais efusivos. O designer deve sempre questionar se o significado desta imagem **condiz com o conceito do projeto que está desenvolvendo**.

Existem fontes adequadas para **telas** por permitirem, a partir de sua forma, uma leitura mais clara em um ambiente display. Existem fontes adequadas para **impressos**, que podem funcionar para textos de grande volume, como corpo de texto em livros por exemplo, ou não, apenas para títulos. 

É importante conhecer as diferentes características que determinaram se a fonte é adequada para display ou para impressos. O mais importante é testá-las e avaliar se a tipografia escolhida possui **boa leitura** no suporte em que ficará situada.

O livro **Pensar com Tipos**, da autora **Ellen Lupton**, é um ótimo guia para decisões tipográficas. Lá é possível conhecer a **História da Tipografia** e ter informações profundas sobre a destinação dos mais diferentes tipos de fontes.

## Baixando fontes
Para auxiliá-lo na busca e download de boas fontes tipográficas diante da vastidão de opções que existem por aí, indicamos o [**Google Fonts**].

As vantagem de utilizar o Google Fonts começam no fato do usuário ter a garantia de que todas as fontes ali disponíveis funcionam - diferente do que pode acontecer em outros sites onde é comum baixar-se fontes com problemas. 

O Google Fonts oferece um visual limpo, o que traz mais foco para o assunto principal: as fontes oferecidas. Sua navegação é bastante intuitiva e é possível testar várias tipografias sem precisar mudar de tela para isso.

imagem

*Página inicial do Google Fonts com testes de fontes tipográficas.*

O Google Fonts está alinhado com as tendências tipográficas mais atuais e traz opções de ótima qualidade para os mais diferentes projetos.

Preparamos também um pacote de fontes para download com excelentes fontes, algumas gratuitas e outras pagas, em versão trial, para os mais diferentes projetos. É importante saber muitas fontes de qualidade não são gratuitas, mas que valem muito a pena por ser um investimento importante para quem deseja trabalhar como designer.

> **OBS importante:** Sempre que desejar utilizar uma fonte em trabalhos comerciais pesquise quais são os limites dos seus direitos de uso.

imagem

[**Clique aqui para baixar!**]

A [**Alura**](www.alura.com.br) oferece ótimos cursos para quem deseja aprimorar seus conhecimentos em Tipografia:

- [**Tipografia: Conhecendo o que há por trás dos tipos**]
- [**Tipografía para web: trabalhe com fontes para compor páginas**]


Além disso selecionamos sites que tratam do tema Tipografia e que valem muito a pena acessar tanto para **buscar referências** quanto para **imergir nesse universo**:

- [We Love Typography]
- [fridayfonts]
- [Daily Type]
- [typegoodness]
- [Typographica]
- [Typography Daily]
- [Type Theory]
- [Type for you.]




imagem 

Quando vamos acessar um sistema web, é bem comum passar por uma tela de login, na qual colocamos nossas credenciais para ter acesso ao sistema.

Essas informações devem ser sigilosas, porém, quando fui tentar logar em uma aplicação web que estou desenvolvendo, tive o seguinte resultado:

imagem foram passados pela URI, o que não é muito seguro não é? Geralmente quando fazemos login em alguns sites isso não acontece, pelo menos na maioria deles.

Essas informações na URL ficam expostas, não apenas caso alguém esteja perto e veja o que você digitou. Mas também quando essas informações trafegam na internet. O que é uma vulnerabilidade na segurança.

O que define o local onde os parâmetros são passados é o [**protocolo de comunicação**] da web, o HTTP.

## Conhecendo o HTTP

O **HTTP** é o protocolo responsável pela comunicação de sites na web. Quando acessamos um site, é esse protocolo que utilizamos. Esse protocolo possui alguns métodos, ou, como também são chamados, verbos.

Os verbos HTTP definem qual ação deve ser realizada e, dependendo do verbo, o servidor pode dar uma resposta diferente.

## Conhecendo os verbos

Um dos verbos mais comuns do HTTP é o **`GET`**. Quando utilizamos o `GET`, os parâmetros são passados no cabeçalho da requisição. Por isso, podem ser vistos pela URI, como no caso do nosso formulário de login.

Esse verbo é o padrão para enviar dados quando submetemos um formulário HTTP. Por isso no exemplo acima, foi utilizado o GET. Contudo, conseguimos alterar esse comportamento dizendo para o formulário qual do método (`method`) ele deve usar.

No caso de formulários web, é muito comum que esse método seja o **`POST`**:

html 

O `POST`, ao contrário do `GET`, envia os parâmetros no corpo da requisição HTTP. Escondendo eles da URI:

![]

Então isso significa que se utilizarmos o `POST` protegemos os dados submetidos pelo formulário, já que eles não aparecem na URI?

Não exatamente. A única coisa que o `POST` faz é enviar os parâmetros no corpo da requisição. Se inspecionarmos a requisição, conseguimos acesso a eles:

![]

Se quisermos proteger, de fato, nossa aplicação, precisamos utilizar a ["versão segura" do HTTP, o HTTPS]. Com ela, conseguimos criptografar os dados enviados.

Ambos os verbos são muito utilizado em formulários na web e possuem algumas outras diferenças entre si.

Como o `GET` envia os dados no cabeçalho da requisição, ele tende a ser, não é uma regra,um pouco mais performático que o `POST`.

Porém, por enviar os dados no cabeçalho da requisição, o `GET` tem um tamanho máximo de dados que podem ser enviados, que no geral é de `255` caracteres. Com `POST`, podemos enviar informações um pouco maiores, como imagens. Ou seja, se tentarmos passar uma grande quantidade de informações via `GET`, algumas partes podem ser perdidas no caminho.

Com isso você pode estar pensando que utilizar o `POST` é o melhor caminho já que ele encapsula os dados no corpo da requisição e consegue transportar mais dados que o `GET`, portanto, vamos utilizar o `POST` em todo lugar.

Porém, se existem dois verbos diferentes, é porque eles foram feitos para serem utilizados em locais diferentes.

As requisições do tipo `GET` são recomendadas para obter dados de um determinado recurso. Como em um formulário de busca ou em uma listagem de todos os produtos cadastrados.

Já as requisições `POST` são mais utilizadas para para enviar informações para serem processadas, como por exemplo, criar algum recurso, como um produto, ou um cliente.

## Conhecendo outros verbos

Além do `GET` e do `POST`, existem outros verbos HTTP que podem ser utilizados. Por exemplo, se quisermos deletar algum recurso, podemos utilizar o verbo `DELETE`.

Já se quisermos atualizar os dados, podemos utilizar o `PUT`, que substitui todas as informações de um determinado recurso, por exemplo um produto. Ou então utilizar o verbo `PATCH` que atualiza parcialmente os dados de um produto.

Todos esses verbos são muito utilizados no mundo web. Principalmente quando estamos utilizando o [**modelo REST**].

Conhecer o protocolo HTTP e seus verbos é muito valioso para um desenvolvedor web. Já que podemos construir aplicações melhores. Por isso, aqui na Alura temos um [**curso sobre o protocolo HTTP**].

Nele você aprenderá como a web funciona, verá verbos como o GET e o POST, aprenderá sobre o modelo REST e sobre o HTTP/2, a nova versão do protocolo.




**Role models** que podemos seguir e admirar. A área de tecnologia ainda é composta por uma maioria de homens, e as mulheres podem e devem ter mais reconhecimento e representatividade.

Repare que alguns momentos históricos na computação foram protagonizados por mulheres e esperamos que essas histórias inspirem vocês, assim como nos inspiram constantemente:

imagem] que foi lançado recentemente nos cinemas.

* * *

imagem foi Ph.D. em Matemática, analista de sistemas da Marinha dos Estados Unidos nas décadas de 1940 e 1950 e almirante.

Foi ela quem criou a linguagem de programação [Flow-Matic] (hoje extinta) que serviu como base para a criação da linguagem COBOL (Common Business Oriented Language) devido a necessidade de criar uma linguagem orientada para negócios comuns. Pois é! Essa linguagem que domina muitas áreas dos grandes bancos tem uma mulher com papel de protagonista.

No começo dos anos 1950 ela desenvolveu um compilador operacional, naquela época acreditava-se que computadores só podiam realizar operações aritméticas. Depois como diretora de programação automática, seu departamento divulgou algumas das primeiras linguagens de programação baseadas em compilador. Isso mesmo: considerada uma das mães dos compiladores.

* * *

imagem é uma cientista da computação que formou-se, com honras, na Universidade de Stanford, com mestrado e doutorado em Ciências da Computação. Seu trabalho na área acadêmica resultou em várias patentes na área de inteligência artificial.

Entrou no Google em 1999 como funcionária nº20 e sendo a primeira mulher engenheira. No Google teve cargos chave nos principais serviços da compania, com destaque no time de Google AdWords, que é o coração financeiro da empresa, e por fim vice-presidente de serviços geográficos e locais.

**Hoje é CEO e faz parte da diretoria do Yahoo! onde promoveu mudanças radicais em vários produtos e na compania, como a melhoria política de maternidade, e compra de diversas empresas como o Tumblr.**

Foi diversas vezes presente em ranking de mulheres de negócios mais poderosas do mundo. Mesmo com o Yahoo! estando numa situação complicada entre os gigantes de tecnologia, Marissa é referência mundial em liderança e tecnologia.

* * *

imagem, foi uma matemática e escritora inglesa. Ela foi a primeira a reconhecer que máquinas poderiam ter aplicações além de puro calculos e criou primeiro algoritmo para ser processado por uma máquina, a [máquina analítica] de [Charles Babbage].

Durante o período em que esteve envolvida com o projeto de Babbage, ela desenvolveu os algoritmos que permitiriam a máquina computar os valores de funções matemáticas, além de publicar uma coleção de notas sobre a máquina analítica.

Por esse trabalho é considerada a **primeira programadora de computadores** de toda a história. Vale lembrar que ela escreveu o programa em um papel, com as instruções de como programar a máquina analítica, que nunca chegou a ser construída em seu tempo de vida. A Ada é até mesmo uma referência da cultura pop.

* * *

imagem (Paoli, 1936) é matemática, cientista da computação, engenheira de software e empresária.

Foi diretora da Divisão de Software no Laboratório de Instrumentação do MIT, que desenvolveu o programa de voo usado no projeto Apollo 11, software que impediu que o pouso na Lua fosse abortado por falha humana. Você entendeu bem: sem o programa que ela escreveu, nada de "pequeno passo para o homem, grande passo para a humanidade". Foi um grande passo para as mulheres também.

Em 1986 ela fundou sua própria empresa, a Hamilton Technologies Inc com sede em Cambridge. Onde desenvolveu seu paradigma para Sistemas e Design de Software, o [Development Before the Fact].

Além de ser creditada por ter criado o termo "engenharia de software", foi uma das desenvolvedoras dos conceitos de computação paralela, priority scheduling, teste de sistema, e capacidade de decisão com integração humana, tais como mostradores de prioridade que viriam a ser o fundamento do design de software ultra confiável.

Foi premiada com a Medalha Presidencial da Liberdade pelo presidente dos EUA Barack Obama, maior honra a um civil daquele país.

## Ficamos por aqui?

Não! Isto é um pequeno passo perto do muito que ainda precisa ser feito para aumentarmos a participação de mais mulheres na área de tecnologia, e também para manter as que estão,através reconhecimento de seu trabalho e respeito.

Tecnologia é um campo fascinante, e realmente queremos trazer mais mulheres para trabalharem com a gente: temos muitas vagas, é desafiador e possibilita que você use suas capacidades criativas, não só técnicas.

**Vem trabalhar com tecnologia! Tire dúvidas comigo e com outras mulheres da área.... computação é sim para você também!**

Nesse mês de março todas pessoas que assinarem Alura irão ganhar stickers bacanas, sendo 5 deles com essas 5 mulheres incríveis e uma carta de nossas desenvolvedoras reforçando a importância da participação das mulheres no campo de tecnologia.

Aproveite também e conheça um pouco mais das mulheres na tecnologia nesse [**podcast**] do Hipsters Ponto Tech.





imagem 

No dia a dia profissional lidamos com diversos desafios relacionados à profissão que escolhemos, porém existem algumas situações que acontecem de maneira muito semelhante com pessoas dos mais diversos cargos e áreas de atuação.

Um exemplo comum que faz parte do cotidiano de todo profissional é lidar com pessoas. Seja por meio de atendimento ao cliente, reuniões ou até mesmo a convivência no escritório, o tempo todo lidamos com pessoas que possuem jeitos, opiniões e experiências de vida diferentes.

Uma outra situação que ocorre tem a ver com produtividade. No ambiente de trabalho, é comum encontrarmos pessoas reclamando sobre não se sentirem produtivas, ou dizendo que estão com muitas tarefas e não sabem nem por onde começar.

## Lidando com essas situações

Nessas e em muitas outras circunstâncias precisamos ter empatia, foco, uma boa comunicação, senso de liderança e diversas outras habilidades que são conhecidas como **Soft Skills**.

As _Soft Skills_ tratam de habilidades ligadas à interação e relação com as pessoas e também se estendem a aptidões como foco e produtividade. Isto é: são competências importantíssimas para quem deseja se desenvolver profissionalmente e até mesmo levar alguns aprendizados para a vida pessoal.

Comunicar-se bem, lidar com opiniões divergentes, manter o foco, conseguir se organizar e desenvolver liderança são habilidades que elevarão sua carreira, melhorando seu dia a dia profissional.

## Desenvolvendo as Soft Skills

Para alcançar bons resultados é preciso dedicação. _Soft Skills_, assim como todos os outros tipos de habilidades, exigem estudos e treinos diários para que o aprendizado seja colocado em prática.

Então, se você se interessou sobre o assunto e quer obter essas aptidões, aqui na Alura possuímos [**uma série de cursos de Soft Skills**] que vão aprimorar sua carreira!




Durante o meu treinamento para certificação da Oracle surgiu o seguinte problema:

Imagine que temos a classe telefone:

java

Ótimo, agora vou cadastrar um telefone de São Paulo (SP):

java

vou adicionar mais 2 telefones, um de Salvador(BA) e outro de Refice(PE):

java

Ué, o telefone de Recife não compila? Como assim? Deixa eu imprimir o telSP e o telBA:

java

Resultado:

```
 > (9) 33229000 (57) 55339000

```

9? 57? Como assim?! Que estranho. A variável do tipo `int`, além de receber inteiros, aceita números octais, hexadecimais e até mesmo binários!

Nesse caso, quando utilizamos o 0 na frente do número, indicamos que estamos lidando com números na base 8, ou seja: estrutura de números entre 1, 2, 3, 4, 5, 6 e 7, por isso os valores foram 9 e 57. Isso também explica o motivo de não compilar o código de Recife(081), já que em octal, não existe o número 8 ou 9. Então se tentarmos compilar um telefone de Campinas(SP):

java

Não compila também! Para resolver esse caso, bastaria retirar o 0 em cada um dos ddds:

java

Verificando o resultado:

```
 > (11) 33229000 (71) 55339000 (81) 22669000

```

Agora o meu sistema cadastra os telefones conforme o esperado!

Vimos que nem sempre os valores que esperamos dar certo funcionam e por isso é importante compreender todas as restrições que as nossas variáveis possuem. Ficou curioso a respeito de outros valores interessantes que a variável int e as demais podem receber? Dê uma olhada nos [**nossos cursos da formação Java.**]




Estou programando um sistema de agenda de contatos telefônicos em **Python**. Para isso, preciso armazenar os números dos contatos. A princípio, podemos pensar em usar uma lista:

python

Tudo bem, temos os números de telefone armazenados. Mas… qual o sentido de termos uma lista de números soltos? De quem é o número que está na segunda posição?

Precisamos, de algum modo, conectar os telefones a seus respectivos contatos. Já conhecemos um tipo que pode nos ajudar com isso **[a tupla]**:

python 

Para não precisarmos de uma variável para cada contato, podemos colocá-los direto em uma lista de contatos:

python 

Ok! Se quisermos acessar o número de telefone da Marina, podemos fazer:

python

E o resultado:

```
8877-7788
```

Conseguimos! Agora, o número do Pedro: … Mas espera, qual é mesmo a posição do Pedro na nossa lista de contatos?

Repare que do modo como está, mal faz diferença ter os nomes dos contatos salvos, porque só conseguimos acessar cada contato pela sua posição na lista. Será que não há um jeito melhor?

## Mapeando contatos com um dicionário

Até agora temos uma lista de contatos em que, ao menos, cada contato tem seu nome e telefone conectados. Entretanto, por enquanto, só conseguimos acessar um contato individualmente pela sua posição na lista, e não pelo seu próprio nome.

O ideal seria mapear o nome de cada contato com seu telefone, evitando outros problemas.

Por exemplo, podemos falar que o contato `Yan` tem o número de telefone `1234-5678`. Assim, quando quisermos saber qual o n de telefone do Yan, basta ir até o seu nome. Dessa forma, não precisamos decorar qual a posição na lista que o telefone se encontra, basta sabermos seu nome de contato.

Veja que, nesse caso, estamos criando uma espécie de dicionário, parecido com os dicionários de língua portuguesa, ou inglesa. Nesses dicionários, temos uma chave que é a palavra que estamos a buscar, que no nosso caso é o nome de contato.

Quando achamos essa palavra, podemos ver o seu significado, isto é, o valor daquela palavra na língua, que no nosso caso, é o número de telefone.

Esse tipo de estrutura é muito utilizado em diversas linguagens de programação (mas normalmente tem outro nome, como **[array associativo]**. Com ela, conseguimos ter um comportamento parecido com o de dicionários.

Bem, vamos falar para o Python criar um desses dicionários para a gente. No Python, usamos **chaves** (`{}`) para construir nossos dicionários. Neste caso, falamos para o Python, que a chave `'Yan'` possuí (`:`) o valor `1234-5678` como seu telefone:

python

E olha o tipo da variável `contatos` que acabamos de criar:

python 

**`dict`** - de fato um dicionário. Mas será que vamos ter que redigitar todos os dados de contatos que já colocamos em nossa lista de contatos? Também podemos criar um dicionário usando sua função construtora `dict()` e passando, como parâmetro, uma lista de tuplas, como em nosso caso:

python 

E agora:

python 

Certo, temos nossa estrutura pronta! Mas espera aí, o nosso dicionário não está ordenado em ordem alfabética, ele não tem ordem nenhuma… Como podemos acessar seus itens?

## Acessando os itens de um dicionário

Podemos acessar os valores dele de forma similar a como acessamos os valores de uma lista, por exemplo, com a diferença de que usamos as chaves que definimos no lugar dos índices numéricos:

python 

E o resultado:

 

Tudo bem! Até que, depois de um tempo, quis ver se eu encontrava o telefone de um velho amigo João. Fiz o seguinte:

python 

Mas olha o que apareceu na tela:

python 

Hum… uma exceção de tipo **`KeyError`** indicando que a chave `'João'` não foi encontrada. Mas é um pouco estranho imprimir toda essa mensagem para o usuário, não é? Pode ser confuso... Será que não podemos substituir isso?

Os dicionários possuem um método específico para busca de valores, o `get()`, no qual podemos passar como parâmetros a chave que queremos e um valor padrão para retornar caso essa chave não seja encontrada:

python 

E o resultado:

 

Muito melhor agora!

Também podemos verificar se um contato está em nosso dicionário através da palavra chave **`in`**:

python 

E a resposta:

python

Como esperado!

Esses dias, achei um número solto aqui e quis verificar se ele estava em minha agenda:

python 

Dessa vez, olha o resultado:

python 

Ué! Mas esse número está sim na agenda, é o número do Pedro! Por que será que o resultado foi `False`, então?

Acontece que o `in`, usado dessa forma, verifica apenas as **chaves** do dicionário, não os valores. Para obtermos valores, podemos usar o método **`values()`**:

python 

E a resposta:

python 

Agora sim! Temos nossa estrutura de mapeamento e já conseguimos visualizar os dados dela. Mas e agora, o que mais conseguimos fazer?

## Adicionando valores ao dicionário

Encontrei meu amigo João e, finalmente, decidi adicionar o número dele na minha agenda. Mas… como posso fazer isso com nosso dicionário de contatos? Fui tentar usar um método **`append()`**, como nas listas, e olha o que apareceu:

python 

Esse método não existe… Ainda tentei criar um outro dicionário e fazer uma soma, mas o resultado foi esse:

python 

Também não funciona! A sintaxe de adicionar um item em um dicionário é um pouco diferente de que em outros tipos do Python, mas também bastante objetiva. Por exemplo, se queremos adicionar o João no nosso dicionário de contatos, basta atribuir seu telefone na chave `'João'`:

python 

Agora olha como está o dicionário:

python

Deu certo!

## Removendo itens do dicionário

Infelizmente, minha amiga Marina perdeu o celular e, consequentemente, não era mais dona do número salvo em meu dicionário de contatos. Precisamos, agora, apagar o item que corresponde a ela. Mas como?

Uma maneira simples é usando o **_statement_** `del`, dessa forma:

python 

E agora, nosso dicionário:

python 

Certo! Mas e se tentarmos remover um item que não existe?

python 

Olha o que acontece:

python

Um `KeyError`, como aquele que obtivemos ao tentar pegar um item que não existia! Para evitar essa exceção, também temos um método de dicionário que pode nos ajudar - o **`pop()`**.

O método `pop()`, além de remover o elemento com a chave especificada do dicionário, nos retorna o valor desse elemento. Também podemos definir um valor padrão de retorno, para caso a chave não seja encontrada:

python 

E o resultado:

python 

Tudo certo, agora! Uma pena que tenho poucos contatos na agenda...

## Juntando dois dicionários

Pedi para meu amigo Pedro me ajudar a aumentar minha agenda, adicionando mais alguns amigos como contatos. Ele me passou a agenda dele:

python 

Mas e aí? Como adicionamos todos esses contatos em minha agenda? Podemos tentar fazer um `loop` passando pelos contatos do Pedro e os adicionando um a um:

python 

Agora vamos ver meu dicionário:

python 

Certo, funcionou! Mas será que não tem um jeito mais simples de fazermos isso, evitando o laço **`for`**?

Repare que queremos juntar nossos dois dicionários em um só - o primeiro. Queremos atualizar o primeiro dicionário para que contenha também os valores do segundo. Para isso, temos um método próprio - o **`update()`**. Podemos substituir o loop pela chamada do método:

python 

E o resultado continua certo, com um código mais sucinto!

## O problema do prefixo `9` e compreensões de dicionário

Fui tentar ligar para meus amigos e em todas as minhas tentativas recebi a mensagem de **número não existente**. Mas ué, por quê? Eu sei que os números estão corretos…

Pesquisei e descobri que os números de celular precisam ter o prefixo `9` hoje em dia, e eu tinha esquecido de atualizar isso! Mas e agora? Será que vou precisar usar o método `update()` para mudar todos os valores? Não faz muito sentido…

O ideal seria ter uma lógica mais objetiva, que simplesmente copiasse todo o dicionário de contatos, mas adicionasse um `9` a cada valor. A princípio, uma ideia é fazer isso com um `for`, o que deve funcionar, mas será que não tem forma mais simples?

Mais sintático e elegante que um loop `for` tradicional, entretanto, é o que podemos fazer com o que já conhecemos da sintaxe de **[compreensão de lista]**, mas dessa vez aplicado aos dicionários **compreensão de dicionário**. A ideia é a mesma e a sintaxe parecida:

python 

E o resultado:

python 

Conseguimos! Agora já conseguimos manipular bem nossa agenda!

## Para saber mais

### Dicionários são mutáveis

Um detalhe que talvez você tenha percebido até aqui é que ao longo do post, normalmente modificamos (seja adicionando, removendo, ou atualizando de fato) o dicionário no próprio local, sem a necessidade de criar um outro objeto.

Isso se dá porque os dicionários, assim como as listas, são **mutáveis**. É importante ter noção disso, para não nos atrapalharmos nas possíveis complicações que a [diferença de mutabilidade] implica nos objetos no Python.

### _Views_ vs. listas

Usamos o método `values()` para verificar se o dicionário tinha um valor específico, mas não chegamos a ver o que ele retorna. Vamos testar:

python 

Aqui chegamos em um ponto interessante. Ao rodarmos esse código no **Python 2**, olha o que aparece

python 

Uma lista contendo os valores, certo. Agora, no interpretador do Python 3:

python

O resultado é parecido, mas de outro tipo  **`dict_values`**. O que é isso? Essa classe é o que chamamos de **_[view de dicionário]_**, que nada mais é que uma janela para os valores do dicionário.

**_Views_** geralmente são vantajosos, comparados às listas, justamente porque são apenas uma abertura, não uma estrutura em si. Assim, eles estão sempre atualizados:

python 

No interpretador do Python 2:

python 

A lista ficou como a anterior. Já no do Python 3:

python 

A variável `valores` atualizou junto! Além dessa vantagem, também economizamos memória com as _views_, já que elas sempre ocupam o mesmo espaço, como uma janela:

python 

Com a lista no Python 2, o resultado:

 

Agora, com a _view_ no Python 3:

 

Bem menos!

## O tipo de mapeamento no Python

Tuplas e listas podem nos ajudar bastante a organizar nossos dados nos programas, mas, às vezes, precisamos de um tipo mais direto e específico para mapeamento com base em chave e valor.

Para essa necessidade, no Python temos o tipo **dicionário**, que é mutável e nos provê diversos métodos para facilitar o manipulamento dos dados nessa estrutura.

Nesse post, aprendemos não só a criar um dicionário, mas a acessar itens dentro dele, adicionar outros, remover, e até juntar um dicionário com outro. Outra funcionalidade legal que pudemos explorar é a de compreensão de dicionário, que nos permite uma criação de dicionário poderosa com sintaxe mais simples.

Gostou do conteúdo? Esse novo tipo pode te ajudar bastante como desenvolvedor Python! Se quiser se aprofundar mais na linguagem, dê uma olhada na nossa formação [**Python para web**] e continue estudando!




Se você esteve antenado durante esses dias, provavelmente soube da notícia do jovem Bruno de Melo Silva Borges que [desapareceu no Acre]. Neste caso o jovem deixou diversas mensagens criptografadas com símbolos, "textos" e objetos.

Entretanto, o diretor da Antecipe (startup de segurança da informação) Igor Rincon, e o líder de desenvolvimento, Renoir dos Reis, ambos alunos da Alura criaram o site [Decifre o livro] com o objetivo de descriptografar as mensagens codificadas pelo rapaz desaparecido. Incrível, né? :)

Fizemos algumas perguntas sobre como tiveram a ideia de criar o site, como também, como eles chegaram nesse resultado. Quer saber como foi? Então bora descobrir!

### Olhando apenas as imagens na TV, não havia dificuldade?

> _Sim, inclusive esse é o maior desafio da nossa [comunidade], o pessoal tenta pegar os frames dos videos e melhorarem a qualidade._

Embora a ideia tenha partido deles, veja que temos também uma grande colaboração da comunidade! Um trabalho e tanto! Mas por que será que eles criaram esse site? É hora de entedermos seus motivos.

### Por que criaram o Decifre o livro?

> _Meu sócio Igor Rincon começou a traduzir um texto e logo eu fiquei bastante intrigado com aquilo._ _Quando vi que começamos a formar um alfabeto me veio o desafio de criar um teclado que transformava aqueles códigos em um texto legível para humanos._ _Com isso poderíamos fazer com que a comunidade acelerasse o processo de decodificação e trabalhasse apenas no que falta ao invés de cada um tentar decifrar o que já foi decodificado._

Veja que, mesmo a troca dos caracteres parecer uma tarefa simples, eles tiveram que implementar tudo isso. Como será que a implementação foi realizada? Vamos descobrir o que está por de baixo dos panos!

### O que usaram no site do Decifre o livro?

> _Inicialmente utilizamos [bootstrap] cruzão com ecmascript 6, sempre tentando aplicar o que eu aprendi nos curso de [Javascript avançado da Alura] (o qual eu ainda não terminei), a grande sacada foi liberar o código para a comunidade, o que fez com que o desenvolvimento fosse bem ágil e a melhoria do sistema foi exponencial._

**Mas não podemos esquecer** que estamos em um **caso grave** que envolve o desaparecimento de um jovem, portanto, esperamos que o Bruno seja encontrado o quanto antes e sua família seja amparada.




Foi criado um App de previsão do tempo e o resultado ficou mais ou menos assim:

imagem.

E como será que ficaria aquele primeiro exemplo nesse novo contexto?

## De volta ao exemplo inicial

Se aplicarmos estes novos conceitos ao exemplo que citamos anteriormente, teríamos algo assim:

![]

Perceba que agora, com um design limpo e alinhado com a proposta do App, criamos uma experiência muito diferente da anterior.

A imagem no início remete ao tema do App, por exemplo, bem como as cores de background para dia ensolarado e chuvoso, reforçando a ideia que queremos passar e deixando o visual muito mais bonito.

A ideia aqui é deixar claro para o usuário que nós nos preocupamos com o nosso produto, mas além disso, esperamos que esse produto se conecte bem com os interesses dele e torne essa experiência mais interessante e prazerosa através de um [**design consistente e atrativo**].

## Foco na experiência

Sabendo de todos estes conceitos, chegamos à conclusão de que UX envolve todo um universo de possibilidades a serem consideradas além da usabilidade, se quisermos construir uma experiência satisfatória ao usuário.

Se nos dedicarmos a preencher cada um dos níveis da pirâmide com qualidade, aliando o conceito do negócio com as necessidades do usuário, teremos um produto consistente e pronto para competir com a concorrência no mercado.

Existem outras coisas muito importantes de se considerar quando desenvolvemos um produto pensando em UX. Confira o curso [**10 heurísticas de Nielsen**] da **Alura** e entenda como evitar erros comuns de UX.





imagem 

**HTTP** é um protocolo, uma forma de conversa entre duas máquinas, que permite transferir hiper-texto de um lado a outro. Daí o nome Hyper Text Transport Protcolo. 

É o protocolo que te permite comprar passagens de avião pela internet, conversar com amigos pelas redes sociais e assistir mandar videos de gatos para sua familia. É o protocolo por trás da Web. Com ele, é possível que um estudante num café em São Paulo leia um artigo sobre o império mongol que está armazenado em um servidor nos Estados Unidos.

Entender bem o protocolo HTTP pode te ajudar a desenvolver melhores aplicações web e a debugá-las quando as coisas derem errado. Para entender bem o HTTP, vale entender **como o navegador web funciona**:

https://www.youtube.com/watch?v=kDy62zaCHZE

# Recursos, URLs  e URIs

A parte que conhecemos melhor do protocolo HTTP é o endereço HTTP de um site. Por exemplo, quando quero comprar pomada para o meu bigode, abro o navegador e digito, por exemplo, _http://pomadasparabigode.com_. Meu navegador entende a sintaxe e faz uma requisição para um servidor chamado _pomadasparabigode.com_.

O endereço _http://pomadasparabigode.com_ é o que chamamos de URL - **U**niform **R**esource **L**ocator(localizador de recurso uniforme). Ela representa um recurso específico na web. Recursos são coisas que eu quero interagir, como: imagens, páginas, arquivos, e videos. Neste caso, o recurso é a página inicial do site _pomadasparabigode.com_, normalmente um HTML.

Imagine a seguinte URL, que representa umaa fictícia Pomada do Bem: _http://pomadasparabigode.com/produto/pomada-do-bem-10773_

Podemos quebrar ela em 3 partes: 

- `http`, a parte antes de "://" é o que chamamos de **URL Scheme**_**(esquema da URL). O esquema descreve **como** acessar um recurso em particular.  Nesse caso, estamos falando para o navegador usar o **Hypertext Transfer Protocol**, o HTTP. Existem outros esquemas, tais como: https, TCP, FTP, maito. Tudo que vier depois de "://" é específico do protocolo que estiver sendo utilizado. 

- `pomadasparabigode.com` é o nome do **host**(servidor), que seria o nome do computador que armazena nosso recurso. Nosso navegador vai realizar um processo conhecido como DNS Lookup para traduzir _pomadasparabigode.com_ em um endereço de rede. E vai enviar a requisição para esse endereço. 

- `/produto/pomada-do-bem-10773` é o que chamamos de **URL Path** (caminho da URL). O servidor irá identificar qual é o recurso especifico que deve devolver para este caminho quando a requisição chegar. URLs podem apontar para arquivos físicos, como por exemplo _http://pomadasparabigode.com/foto.jpg_ provavelmente para um arquivo físico do servidor, uma foto em formato jpg. Já no caso da URL http://pomadasparabigode.com/listar-pomadas provavelmente não aponta para um arquivo físico diretamente. 

Nesse caso, provavelmente o que vai acontecer é: uma aplicação desenvolvida em alguma tecnologia como ASP.NET, PHP, Rails, Java irá tratar a requisição no servidor, fará uma consulta em um banco de dados e o recurso que será devolvido vai ser construído dinamicamente por esta aplicação.

# Números de porta

`http://pomadasparabigode.com:80/listar-pomadas`

Esse número `80` representa o número da porta que o servidor está usando para "ouvir" requisições HTTP. 80 é a padrão e é opcional no caso do uso do endereço em um navegador, então normalmente você não vê esse 80 nas URLs. É mais comum especificarmos esta porta quando estamos testando a aplicação em ambiente de homologação/testes. O `443` aparece para o `https`.

# Query strings

`http://pomadasparabigode.com/busca?nome=pomadalegal`

Tudo o que vem depois da `?` é o que chamamos de **query string**.  Nesse caso `?nome=pomadalegal`. Geralmente colocamos na query string informações que serão interpretadas de alguma forma pela aplicação que é executada no servidor. Não existe uma regra formal de como as query strings são montadas, mas a forma mais comum de utilização é através de pares chave-valor, separados por `&`, como em `?nome=pomadalegal&tipo=2&categoria=bigodesruivos`:

`http://pomadasparabigode.com/busca?nome=pomadalegal&tipo=2&categoria=bigodesruivos`

# Fragmento

`http://pomadasparabigode.com/produto/pomada-especial#descricao`

Esse `#descricao` na URL não é interpretado pelo servidor, mas sim pelo navegador do usuário. Depois de carregar o recurso que é especificado através dessa URL, o navegador irá procurar um elemento com o id `descricao` na página e irá posicionar a barra de rolagem a partir do início dele, ou seja, onde começa a descrição do produto.

Resumidamente, uma url pode ser quebrada então no seguinte formato:

> \[**esquema**\]://\[**servidor**\]:\[**porta**\]/\[**caminho**\]?\[**querystring**\]#\[**fragmento**\]

## Media Types

Um recurso pode ser várias coisas diferentes: imagens, arquivos HTML, XML, videos e muitos mais. Pra que um servidor possa **servir** um recurso e para que o cliente possa consumi-lo apropriadamente, as partes envolvidas(cliente e servidor) têm de ser específicas e precisas quanto ao tipo do recurso. Afinal, não faz o menor sentido que meu navegador tente renderizar como imagem um arquivo XML, certo?

Quando um servidor responde uma requisição HTTP, ele devolve o recurso e o seu tipo - chamado de **Content-Type**(também conhecido como media type). Para especificar tipos de recurso, o HTTP usa um outro protocolo(que inicialmente foi feito para comunicação através de e-mail) chamado **MIME**: **M**ultipurpose **I**nternet **M**ail **E**xtensions.

O `content-type tem` duas partes: tipo e subtipo. Por exemplo:, um servidor pode devolver uma imagem no formato png. O content-type da resposta viria como `image/png`. Se fosse um jpg, o content-type seria `image/jpg`. E se fosse um arquivo html? `text/html`. E um json? `text/json`. O navegador olha o Media Type para saber o que fazer com um arquivo.

## Content Type Negotiation

Como já falamos, um recurso pode ter diferentes representações. Vamos pegar como exemplo a URL que representa o manual de como cuidar do seu bigode:

`http://pomadasparabigode.com/comocuidardoseubigode`

Este manual poderia, por exemplo, ter diferentes representações no site para diferentes idiomas. Poderia até ser disponibilizado em diferentes formatos: _PDF, DOC, html_. Neste caso, seria o **mesmo recurso**, mas em **formatos diferentes**.

Como o servidor vai saber em que formato deverá enviar o recurso? É aí que entra o mecanismo de [Content Negotiation] especificado pelo protocolo HTTP: quando um cliente faz uma requisição, ele pode especificar quais Media Types ele aceita. Desta forma, aplicações diferentes podem solicitar o mesmo recurso - mas em formatos diferentes. Se o servidor irá conseguir devolver o recurso naquele formato já é outra conversa, que cabe a quem desenvolver o serviço que roda no servidor :)

## O processo Request-Response

Se você chega e me pergunta: _Qual a próxima turma de C# na escola Caelum?_

Para que eu possa responder essa pergunta corretamente, são necessárias algumas coisas: 

-  eu preciso entender a sua pergunta. Se você me perguntar em um idioma que não conheço, provavelmente não conseguirei te dar uma resposta; 
- preciso de acesso a algum lugar que conste as próximas turmas da Caelum.

O HTTP funciona mais ou menos desta mesma forma: um cliente precisa de um recurso que está em um outro computador. Então, o cliente você faz uma requisição (**request**) para um servidor usando uma linguagem e vocabulário que espera que o servidor consiga entender. Se o servidor conseguir entender sua requisição e tiver o recurso disponível, ele irá responder com uma resposta(**response**). Caso o servidor entenda a requisição mas não tenha o recurso, provavelmente ele vai responder que não tem. Caso ele não entenda a requisição, você pode não ter resposta.

Request e Response são dois tipos de mensagem diferentes quando falamos de HTTP. A especificação HTTP diz exatamente o que podemos colocar dentro de cada um destes tipos de mensagem para que todos que "falem" o idioma HTTP consigam trocar infomações corretamente.

Uma requisição HTTP tem o seguinte formato:

imagem

E ai curtiu? Fique atento para o próximo post! E se quiser saber ainda mais sobre HTTP, temos [um curso no Alura] que fala especificamente sobre isso :)


Temos [um curso sobre HTTP] que te ensina o protocolo HTTP por baixo dos panos. 

Mais? Leia sobre as [diferenças dos métodos HTTP](/artigos/diferencas-entre-get-e-post), em especial GET e POST. Também aqui na Alura um artigo sobre a [diferença entre HTTP e HTTPS](/artigos/qual-e-diferenca-entre-http-e-https).




As funções **`input`** e **`raw_input`** podem trazer confusão quando programamos em **Python**. Onde utilizar cada uma?

Tenho um sistema escrito em Python, para o terminal, que precisa das credenciais de login do usuário para funcionar:

python

Quando rodo no meu computador, digito meu login e recebo em resposta:

python 

Exatamente o que eu tinha digitado, capturado pela variável `usuario`!

Fui levar o programa para a empresa, mas quando fui testar, digitei meu login e olha o que apareceu:

python

Ué, *"mas funciona no meu computador"*! O que significa esse **`NameError`** que tivemos como resposta ao rodar o código no computador da empresa?

Esta exceção indica que estamos tentando usar uma variável que não foi definida, nesse caso, `yanorestes`. Mas `yanorestes` é o login em uma string, não uma variável, então por que isso acontece?

Vamos checar as versões do Python em cada computador para ver se tem a ver com isso. Primeiro, no meu computador:

python

Agora, no computador da empresa:

python 

Ah! Então realmente há uma diferença nas duas versões, como suspeitávamos.

## A função input() no Python 2

Por que recebemos o `NameError`, então? A questão é que **a função `input()`, no Python 2, não transforma a entrada do usuário em string, mas tenta avaliar, calcular ela:**

python 

Por exemplo, se mandarmos `3 + 5`:

python

Então quando tentamos mandar o usuário `yanorestes` para o `input()`, ele trata como se fosse uma variável. Como essa variável não existe, recebemos o `NameError`.

Por conta do pouco uso desse comportamento, **ele foi removido no Python 3**. Ainda assim, podemos simulá-lo através da função **[eval()]**, dessa forma:

python

E então, como no exemplo anterior:

python

Mas, então, como podemos fazer no **Python 2** o que a função `input()` faz no **Python 3**?

## A função raw_input() no Python 2

**No Python 2, em vez da função `input()`, utilizamos a função `raw_input()` para pegar a entrada do usuário como string**, veja:

python

Agora sim:

python 

No **Python 3**, a função `raw_input()` foi simplesmente renomeada para `input()`.

## O que fazer a respeito da diferença de versões?

Como você deve ter percebido, há uma inconsistência aqui - se quisermos capturar uma entrada do usuário como string, não há um código único que simplesmente satisfaça ambas as versões 2 e 3 do Python.

Nesse momento, nós, como programadores, devemos tomar uma decisão pensando nos benefícios de cada versão do Python e, principalmente, na maioria de nossos usuários.

> "Mas e se eu precisar que o meu programa funcione em qualquer das duas versões?"

Se quisermos dar uma volta nessa incompatibilidade, é possível checar a versão do Python através do atributo `version_info.major` do módulo **[sys]**, o que nos dá a possibilidade de criar uma condição `if` e ficar em cima do muro, como no exemplo:

python 

## O perigo de executar uma entrada do usuário

É importantíssimo notar o quão perigosas são as funções `input()` no **Python 2** e `eval()` em ambas as versões!

Executar algo digitado pelo usuário abre uma tremenda brecha na segurança do programa e até do computador em que o programa está sendo utilizado.

Veja [nesse artigo de Ned Batchelder] um pouco mais dos perigos do `eval()`. Um simples exemplo:

python

Isso listaria os arquivos no diretório raiz de nosso computador.

E se, em vez de listar, usássemos o comando de deletar? Todos os arquivos e diretórios de nosso computador seriam apagados, sem mais nem menos!

**Por isso, sempre devemos lembrar de tomar cuidado ao executar uma entrada do usuário.**

## Conclusão

Nesse post, aprendemos as diferenças entre as funções `raw_input()` e `input()`, como isso muda do **Python 2** para o **Python 3** e até um pouco sobre `eval()` e seus perigos!

E aí? Resolveu essa dúvida cruel? Se está interessado em Python e quer aprender mais, que tal dar uma olhada na nossa [**formação Python para web**]?



Nesse artigo conto como decidimos parar de seguir essa metodologia em cascata e seguir uma metodologia mais fluída.

Uma vez fui contratada por uma empresa que desenvolvia softwares e aplicativos para outras empresas. Nela, um dos meus primeiros trabalhos era auxiliar no desenvolvimento de um aplicativo que visa permitir que as pessoas encontrem restaurantes baratos perto de onde ela se encontra.

Quando conheci o time, já me explicaram que eles seguiam uma estrutura clássica: **planejamento, análise, design, documentação, codificação, realizar testes, implementar e, caso necessário, fazer a manutenção do aplicativo**.

Essa é uma metodologia de desenvolvimento chamada **em cascata**, que significa que o processo é realizado por meio de fases e uma delas só é iniciada quando a anterior termina e, assim, não é necessário retornar a um trabalho, já que ele já foi completamente finalizado.

Porém, levamos muito tempo na etapa de planejamento, análise e documentação de todo o projeto e o cliente ficou impaciente de não mostrarmos nenhuma novidade à ele.

Além disso, o que havíamos feito não poderia ser apresentado para o cliente, já que a documentação é para consulta de analistas, arquitetos, desenvolvedores e testers do projeto, ou seja, não era para o cliente.

Então, ele nos informou que o software agora tinha uma finalidade diferente da inicial. Tentamos mudar, porém, precisaríamos analisar, planejar e começar a documentação toda de novo. Pensando no tempo que demoramos para fazer isso, o cliente cancelou e, assim, o trabalho inteiro foi jogado fora.

Vimos que este método não estava mais funcionando. E qual foi o nosso erro?

# Agilidade

Começamos a pensar em maneiras que poderíamos agilizar ainda mais os próximos projetos. Então, decidimos parar de seguir essa metodologia em cascata e seguir uma **metodologia mais fluída**.

Mas aí como podemos fazer isso? Acabar com todas as regras?

Pensando nisso, dividimos as tarefas entre todos os integrantes da equipe. Assim, decidimos que cada pessoa pegaria uma questão definida para ser feita naquele mês e iria desenvolvê-la.

E quando começamos o projeto fomos o desenvolvendo desta maneira: as tarefas foram divididas e cada uma atribuída a quem tinha mais facilidade em desenvolvê-la.

Porém, como a equipe se dividiu, não sabíamos o que cada um estava fazendo e qual parte estava pronta ou não. Isso, com o passar do tempo começou a nos deixar perdidos em qual fase estávamos e quando podíamos começar a desenvolver um outro requisito.

E piorou quando fomos apresentar ao cliente, pois como não sabíamos como estava cada fase, tinha parte que estava completamente avançada e outras que estavam no início.

Sem contar que algumas pessoas estavam tendo muita dificuldade em realizar suas tarefas, porém, não conseguiam pedir ajuda, pois não havia uma **comunicação entre a equipe**.

Também, tínhamos os **requisitos**, mas não sabíamos o porquê eles eram necessários e isso nos deixava perdidos em como fazê-lo da melhor forma para o usuário.

Percebemos que um método sem regras não estava funcionando também. E como poderíamos resolver? Voltar para as regras que também não haviam funcionando?

Então, decidimos tentar colocar algumas premissas para serem cumpridas durante o processo.

## Os indivíduos e as interações entre eles mais que os processos e as ferramentas

Como percebemos que estava havendo um obstáculo para a equipe falar para todos em que ponto estava tendo dificuldade, decidimos que deveríamos ter mais integração entre nós, por meio de almoços e conversas durante o café.

E, além disso, conhecer o trabalho um do outro, por meio de reuniões onde cada um poderia dizer o que estava fazendo, o que iria fazer a seguir e se estava tendo alguma dificuldade ou facilidade. Nelas planejamos o que iremos fazer a seguir, além de integrar toda a equipe no processo de desenvolvimento.

Pensamos que processos e ferramentas são importantes, mas eles são feitos e utilizados, respectivamente, pela equipe e a interação entre ela deve estar fluida e equilibrada para que a eficácia dos processos e ferramentas ocorra sem grandes problemas.

Além disso, para cada requisito, ao invés de escrevermos o que precisamos fazer, como por exemplo adicionar um campo de busca, escrevemos como aquilo ajudará o usuário, como por exemplo o usuário precisa pesquisar termos para encontrar as funcionalidades do software de maneira mais rápida.

## Software funcionando mais do que documentação completa e abrangente

Como perdemos muito tempo com a documentação, decidimos que nosso **foco** seria mais no desenvolvimento, pois ela não agrega muito valor ao **cliente**.

Assim, quando recebemos um projeto, analisamos como cada requisito pode ajudar o usuário e começamos a desenvolvê-lo.

Desta forma, temos menos trabalho com documentação, já que fazemos por partes, ao mesmo tempo que desenvolvemos o _software_ e apresentamos ao cliente.

## A colaboração com e dos clientes mais do que negociações e contratos

Também definimos que o cliente deveria estar mais presente em todo o processo de desenvolvimento, avaliando o que foi feito e nos indicando as próximas prioridades.

Além disso, desta forma, caso o projeto precise de qualquer outra coisa, ele pode facilmente nos avisar, pois o cliente faz parte do projeto e participa de cada etapa.

Para ter essa colaboração frequentemente marcamos uma reunião por mês com o cliente. Nela, mostraremos o que foi feito, receberemos novas demandas ou alterações de anteriores de forma frequente e sem precisar jogar o projeto inteiro fora, pois, caso tenha alguma mudança saberemos logo.

## Resposta a mudanças mais do que seguir o plano inicial

Como as necessidades do cliente e do projeto mudam, precisamos sempre estar atentos. Assim, ao invés de planejarmos todo o projeto de uma vez, agora planejamos cada etapa individualmente e em conjunto com o cliente.

Por termos esse contato mais direto com o cliente e por fazermos parte por parte, podemos nos adaptar a mudanças de forma mais rápida já que teremos que replanejar somente uma parte e não o todo.

Depois de alguns meses, essa nova forma estava apresentando resultado por conta dos benefícios trazidos por aquele método, que entre eles foram: satisfação do cliente; melhor gestão de prioridades; melhor visibilidade dos projetos, já que todos sabiam o que estava acontecendo nele; maior produtividade da equipe, pois ela estava mais motivada por seguirmos um ritmo saudável e simplificado de desenvolvimento.

Foi quando um novo integrante para a equipe foi contratado e assim que explicamos como tínhamos organizado as tarefas, ele nos respondeu que era **uma metodologia ágil**, e que **a maneira que fazíamos seguia os valores do manifesto ágil**. Confira essa entrevista do nosso **CEO Paulo Silveira com Alexandre Magno da Emergee**:

https://www.youtube.com/watch?v=j5mCirZD-0s

# Manifesto Ágil

O [**Manifesto para o Desenvolvimento Ágil de Software**] foi escrito em 2001 por um grupo de 17 desenvolvedores. Eles agruparam e aprimoraram diversos conceitos de metodologia de desenvolvimento ágil no manifesto.

Esses conceitos iam pelo caminho contrário ao método em cascata, ou seja, rígida, onde as regras e etapas devem ser seguidas, e contra o método sem qualquer regra ou definição, que fica perdida. A metodologia ágil fica no meio termo entre o rígido e o livre.

Esse manifesto conta com **quatro valores e doze princípios** que devem ser incluídos na rotina da empresa.

Os valores, que já estávamos seguindo são:

- os indivíduos e interação entre eles mais que os processos e ferramentas
- software funcionando mais do que documentação completa e abrangente
- a colaboração com e dos clientes mais do que negociação
- contratos e resposta a mudanças mais do que seguir o plano inicial

E não que somente a parte antes do “mais do que” seja importante, porém, ela é uma prioridade maior que o que vem depois.

Agora, os [**princípios**] por trás dos valores, que sempre devem ser mantidos em mente enquanto o software estiver sendo desenvolvido são:

- A maior prioridade é satisfazer o cliente, através da entrega adiantada e contínua de software de **valor**;
- Aceitar mudanças de requisitos, mesmo no fim do desenvolvimento. Processos ágeis se adequam a mudanças, para que o cliente possa tirar vantagens competitivas;
- Entregar software funcionando com frequência, preferencialmente em semanas;
- Cooperação diária entre pessoas que entendem do ‘negócio’ e desenvolvedores;
- Projetos surgem através de indivíduos motivados, entre os quais existe relação de confiança.
- A maneira mais eficaz e eficiente de transmitir informações são através de conversas cara a cara;
- Software funcionais são a principal medida de progresso do projeto;
- Processos ágeis promovem um ambiente sustentável. Os patrocinadores, desenvolvedores e usuários, devem ser capazes de manter indefinidamente, passos constantes;
- Contínua atenção à **excelência técnica e bom design, aumenta a agilidade**;
- Simplicidade é essencial. Cultivar a arte de maximizar a quantidade de trabalho que não precisou ser feito;
- As melhores arquiteturas, requisitos e projetos emergem de equipes auto-organizadas;
- Em intervalos regulares, o time reflete em como se tornar mais efetivo, então, se ajustam e otimizam seu comportamento de acordo.

O manifesto ágil é como se fosse o embasamento filosófico para as metodologias ágeis e, baseado nesses valores e princípios, muitas foram criadas. Entre elas, o [**Scrum**], [**Kanban**] e o [**EXtreme Programming, conhecido como XP**].

Agora que nossa equipe já conhece os valores do manifesto ágil, podemos utilizar algumas das metodologias para seguir no dia-a-dia do desenvolvimento.E agora que você já sabe um pouco sobre Metodologia Ágil, o que acha de conferir [**nossa formação de Gerente Ágil**] para colocar em prática as metodologias ágeis na sua equipe?




No artigo sobre como [**criar uma aplicação Java Web**] utilizando Servlets, fizemos uma aplicação bem básica que imprimia apenas uma mensagem no navegador, porém, eu havia dito que eu queria criar uma aplicação que permitisse o cadastro dos meus livros, e então, listá-los!

Na Web, como fazemos para mandar informações para a aplicação? Utilizamos um formulário em HTML, certo? Para a nossa felicidade, Já temos um modelo de formulário em HTML para cadastro de livro que é explicado com mais detalhes nesse [post] que escrevi! Então vamos reutilizá-lo:

Formulário de cadastro de livros

Livro  Autor  ISBN  Valor  Data da compra   
Cadastrar

Precisamos adicionar esse formulário e uma página HTML, portanto, vamos criar uma página HTML no nosso projeto, podemos inserir esse arquivo na nossa pasta "WebContent/WEB-INF" com o seguinte conteúdo:

html

Ótimo, mas como podemos acessar o nosso formulário? Precisamos de uma Servlet que represente esse formulário, então vamos criar a `FormularioServlet`:

java

E como fazemos para exibir HTML usando Servlet? Pelo método `println()` do tipo `PrintWriter`, certo? Porém, dessa vez, não queremos escrever o HTML, pois já temos um arquivo pronto!

O que queremos fazer é, no momento em fizermos uma requisição para essa Servlet, exibir esse nosso arquivo! Para isso, precisamos indicar qual o local que está esse arquivo por meio do método `getRequestDispatcher()` do objeto `HttpServletRequest req` que representa a requisição dessa Servlet:

java

Por fim, precisamos dizer para ele avançar com essa nossa requisição, ou seja, direcionar para essa página chamando o método `forward()`:

java

E como podemos acessar agora essa nossa Servlet? Lembra que precisamos adicionar no nosso arquivo `web.xml`? Então vamos adicioná-la:

java

Vamos testar nossa aplicação? Clique com o botão direito no projeto "Run as > Run on Server", escolha o seu Tomcat conforme havíamos configurado e clique em "Finish":

imagem` desse parâmetro e retornar o valor do `input` por meio do nome dele!

java

Agora que temos as informações do livro, que tal mostrá-las na página de cadastro? Dessa forma verificamos todas as informações do livro enviado! Primeiro, vamos indicar que a nossa resposta será em HTML ao invés de texto:

java

Modificaremos o primeiro texto também:

java

Por fim, vamos imprimir as informações do livro:

java

Reiniciando o Tomcat e enviando o mesmo formulário de antes:

![livro-enviado]

Excelente! Agora sim nós conseguimos enviar uma informação desse livro para o nosso servidor!

Nesse post, aprendemos como podemos direcionar uma requisição para uma página HTML que está contida no nosso projeto. Além disso, vimos também que, a partir da API de Servlet 3.0, podemos registrar uma Servlet utilizando a anotação `@Webervlet`. Por fim, vimos que, para mandar as informações para o servidor a partir de um formulário em HTML, precisamos informar a URL por meio do atributo `action` da tag `form`.

E aí? Curtiu a API de Servlets? Quer aprender mais a fundo sobre Servlets? Pensando nisso, o instrutor Guilherme Silveira, criou o curso de [**Servlets e fundamento de Java web**], onde ele aborda toda a base para desenvolvermos uma aplicação de Java Web!




Criar um projeto [**Angular**] partindo do zero não é tarefa fácil, existem diversas dependências e integrações necessárias que precisam ser configuradas para que a inicialização da aplicação ocorra corretamente.

A princípio, quando o Angular ainda estava em suas primeiras versões de desenvolvimento, a própria documentação quickstart do framework sugeria o clone do projeto semente (seed project) através do repositório oficial no GitHub.

Mas será que não temos uma alternativa mais objetiva?

## Conhecendo o Angular CLI

A partir da versão 2, o framework JavaScript Angular vem com uma interface de linha de comando (command line interface) para facilitar e acelerar a criação de nossas aplicações, conhecida como [**Angular CLI**].

Quando a versão 1.0 final do CLI foi lançada, ele se tornou a forma oficial para iniciar um novo projeto em Angular.

O Angular CLI é baseado no [**Webpack**], uma ferramenta que ajuda a processar e agrupar nossos diversos arquivos TypeScript, JavaScript, CSS, HTML e imagens. Por baixo dos panos, o Webpack é responsável por estruturar o ponto de entrada da aplicação, ou seja, a raiz contextual (arquivo de inicialização).

> O Angular CLI não é obrigatório para desenvolvermos com Angular, porém é uma ferramenta produtiva que automatiza a criação de arquivos com código estrutural base que repetimos diversas vezes durante o desenvolvimento, como por exemplo, a criação de _components_.

## Instalando o CLI Angular

Para instalar o Angular CLI usamos um ambiente de tempo de execução JavaScript (JavaScript runtime environment) chamado Node.JS junto com o seu gerenciador de pacotes Npm (Node Package Manager).

javascript

Utilizamos o comando `npm` para invocar o Node Package Manager (gerenciador de pacotes do Node.JS) e através do parâmetro `-g` definimos que o pacote `angular-cli` deve ser disponibilizado globalmente em nosso computador.

Se a instalação ocorrer com sucesso, uma mensagem deve ser exibida conforme imagem abaixo:

imagem em sites como [**Heroku**], [**AWS**], [**Azure**] ou qualquer outro.

Todavia, subir nossa aplicação para esses servidores não é uma tarefa muito prática. Durante o desenvolvimento do projeto é mais comum (e rápido) utilizar um servidor web local.

Para iniciarmos um servidor local usando o Angular CLI utilizamos o comando `ng serve`:

imagem, um para a página (HTML), um arquivo de testes (spec.ts) e o próprio arquivo TypeScript (.ts) do _component_.

Por convenção, os nomes dos arquivos são separados por `-`, mas o nome lógico não:

![]

Além disso, todo o código gerado por meio da ferramenta segue o [**guia oficial de estilos do Angular**] e já vem com arquivos de teste. Sempre que o CLI detecta alterações em qualquer arquivo, todos os testes são re-executados por baixo dos panos para garantir a qualidade do projeto.

## Build do projeto

Vimos que o comando `ng serve` faz um ótimo trabalho ao fornecer um servidor web local, porém isso é apenas para desenvolvimento. Eventualmente, precisaremos hospedar nossa aplicação em outro servidor e para isso, é recomendado gerar o build do projeto, ou seja, compilar, comprimir e empacotar.

Para gerar um _build_ para produção, podemos executar:

`ng build --prod`

O comando acima agrupa todos os nossos JavaScript, CSS, HTML em um conjunto menor de arquivos que podemos hospedar em um servidor externo. Esses arquivos são gerados na pasta dist:

![]

## Conclusão

Nesse post tivemos uma visão geral dos principais comandos do Angular CLI. Para descobrir mais detalhes sobre cada comando, além de como personalizar seus comportamentos, podemos executar `ng help`.

Existem diversos outros comandos que podem ser aprendidos na [documentação oficial do Angular CLI].




No meu sistema de cadastro de alunos eu recebo um aluno com os seguintes atributos:

java

Ao imprimir os dados de um aluno:

```
 Nome: Alex2016 Sobrenome: 12Felipe Telefone: 11992232121455

```

_Alex2016_? _12Felipe_? E esse telefone bizarro? Esse aluno contém informações que não fazem sentido...

Como posso fazer para impedir que esses tipos de dados sejam inseridos no meu sistema?

Vamos tentar validar esses dados criando um método que valida o aluno:

java

Vamos começar pelo nome do aluno. Não queremos que tenha números nem no começo e nem no final do nome! **Como** podemos fazer isso?

Vamos extrair tanto o primeiro caracter quanto o último por meio do método `charAt()` da classe `String`:

java

Para verificar se um caracter é uma letra, podemos usar o método estático `isAlphabetic()` da classe `<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html">Character</a>`:

java

Implementamos nossa primeira validação! Vamos agora adicionar um `sysout` dentro de um `if` para testarmos:

java

Vamos testar um nome que começa com um número, no caso "1Alex":

```
 aluno 1Alex é inválido

```

Ótimo! Funcionou como o esperado. Mas, e se o número estiver no final? Por exemplo, o que foi apresentado no começo: "Alex2016". Vamos ver o resultado:

```
 aluno Alex2016 é inválido

```

Aparentemente tudo está funcionando conforme o esperado! Agora, e se um número estivesse no meio do nome? Por exemplo "A1ex":

```
 aluno A1ex é válido

```

Eita! Não pensamos nesse caso! Como podemos fazer com que o nome do aluno não tenha nenhum número? Precisaremos "varrer" toda a nossa `String`, caracter por caracter e verificar se é válido:

java

Se testarmos novamente com o nome "A1ex":

```
 aluno A1ex é inválido

```

Ótimo! Agora o nome do meu aluno está sendo validado conforme o esperado! E se recebermos um aluno que tenha inserido o nome com apenas uma letra? Como "A" por exemplo... o que aconteceria?

```
 aluno A é válido

```

Hmmm, mas com certeza para o meu sistema não faz sentido um aluno com o nome de apenas 1 letra...então adicionaremos mais uma condição no nosso validador:

java

Se testarmos agora:

```
 aluno A é inválido

```

A nossa validação por enquanto está funcionando, mas olha o tamanho que ficou o método:

java

À primeira vista conseguimos entender o que está sendo feito? Provavelmente não.

Note também que **a cada validação** que precisamos fazer são mais `if`s que precisamos adicionar. Será que existe outra forma mais simples para validarmos esses dados? A resposta é **sim**!

Podemos utilizar **expressões regulares** por meio do método `matches()` da classe `String`. Vamos definir nossa expressão regular para validar o nome do aluno:

java

Certo, essa expressão regular significa que esperamos **apenas 1 única letra do alfabeto**. Mas o que queremos é que tenha pelo menos 2, certo? Simples! Basta adicionar chaves (`{}`) e informar a quantidade de repetições que você deseja:

java

Nesse exemplo estamos informando que queremos **apenas** 2 repetições, ou seja, a quantidade **não pode ser maior ou menor** e sim **igual a 2 letras**! Com certeza não é isso que queremos! E agora? Como podemos dizer que queremos pelo menos 2 letras?

Quando utilizamos as chaves podemos passar 2 parâmetros: o primeiro significa a **quantidade mínima** e o segundo a **quantidade máxima**. Ou seja, se adicionarmos apenas uma ",":

java

Nesse instante estamos dizendo que esperamos pelo **menos 2 letras** e a **quantidade máxima não tem limite**!

Se testarmos o nome "Alex":

```
 aluno Alex é inválido

```

O que aconteceu? Não era pra ser válido? A nossa expressão regular diz que espera pelo menos 2 letras, porém **letras minúsculas**! Agora, como podemos fazer com que a nossa expressão regular espere uma letra maiúscula no começo? Da mesma forma que pra letras minúsculas usamos `[a-z]` podemos usar `[A-Z]` para letras maiúsculas:

java

Agora a nossa expressão regular está esperando uma `String` com a primeira letra maiúscula e por isso precisamos apenas garantir que terá pelo menos 1 letra minúscula depois! Se tentarmos rodar novamente:

```
 aluno Alex é válido

```

E se tentarmos com aqueles nomes inválidos? Por exemplo: "A1ex", "1Alex" e o "Alex2016"? Vejamos o resultado:

```
 aluno A1ex é inválido

```

```
 aluno 1Alex é inválido

```

```
 aluno Alex2016 é inválido

```

Excelente! Tudo funciona como o esperado e de uma forma mais clara e de fácil manutenção! Se um dia precisarmos **modificar nossa validação**, basta adaptar a nossa expressão regular para a nova regra de negócio :)

O que achou da expressão regular? Que tal um desafio? Faça a definição de uma expressão regular para **validar um telefone** que aceite apenas telefones nesses 2 formatos: (11) 1111-1111 ou (11) 11111-1111. Comente o seu resultado!

E aí, curtiu expressões regulares? Que tal aprender mais sobre o assunto? **Na Alura, o [curso de expressão regulares] aborda mais detalhes sobre esse recurso poderoso que facilita, e muito, a vida do programador na hora de realizar diversas validações!**





imagem 

Criatividade e inovação são fundamentais para o trabalho de um [**designer**]. Afinal, é por meio desses elementos que torna-se possível produzir soluções originais, surpreendentes e mais efetivas em seu trabalho. 

**A inspiração não é algo que simplesmente aparece quando bem entender, mas surge como resultado de uma busca ativa.** Quando procuramos por novas fontes de informação, nós ampliamos o nosso leque de referências e, consequentemente, nos expressamos de forma mais criativa.

Sendo assim, separamos algumas maneiras que podem ser adotadas para incrementar sua inspiração para design. Não deixe de conferi-las!

## 1\. Observe o espaço ao seu redor

Ser observador é essencial para ativar a inspiração. Estamos rodeados por tantos elementos, cores e formas, que acabam estimulando a criatividade e gerando alguns **insights**.

Então, por que não juntar essa prática com uma volta pela cidade? Na correria da rotina acabamos esquecendo de observar os lugares ao nosso redor, mas as cidades têm referências riquíssimas que podem ser utilizadas como inspiração para o design.

Não deixe de observar a arquitetura das construções, outdoors, cafés e, principalmente, a [**natureza**]. Todos esses elementos podem ser uma fonte inspiracional poderosa. 

Essa prática ainda é uma ótima maneira para espairecer a cabeça, o que pode ajudar na hora da criatividade.

## 2\. Assista a filmes e vídeos

Há uma infinidade de elementos que podemos usar como referência ao assistir a [filmes] e vídeos.

Você pode ver documentários mais específicos do design, como o "[**Abstract: The art of Design**]", ou até mesmo buscar vídeos mais conceituais no Youtube.

Quando fizer isso, preste atenção nos detalhes, na luz, na fotografia, no modo como a produção foi gravada etc. Esse é um bom exercício para buscar uma inspiração mais visual.

## 3\. Leia bastante

O profissional do design precisa estar [**constantemente atualizado**], e a leitura é uma boa fonte de informação e aprendizado, além de exercitar a criatividade. Por isso, tente se habituar a ler regularmente, e não apenas livros focados em design. Eles são importantes, porém, soluções surpreendentes também podem surgir de fontes inesperadas.

Encontre outros temas que despertem seu interesse, e que mostram perspectivas diferentes daquelas que você está acostumado a ver. Vale ler livros de romance, ficções científicas, revistas, comics e o que mais desejar.

## 4\. Pesquise a história de tudo

Nos dias de hoje, o design segue algumas tendências e moldes que, muitas vezes, combinam e dialogam com nosso jeito de viver, socializar ou consumir.

No entanto, não foi sempre assim. A sociedade se modificou ao longo do tempo e a tecnologia avançou, gerando inúmeras possibilidades. Cada período histórico teve sua própria cultura, estilo de vida, arte e arquitetura. Então, por que não buscar inspiração no passado?

Podemos criar muitas ideias originais ao pesquisar sobre movimentos sociais e artísticos,vestimentas, propagandas e por aí vai.​

## 5\. Escute música

Mais do que inspirar, a música também pode deixar você no humor certo para ser mais criativo. A dica aqui é criar playlists que que gerem sensações prazerosas e deixem você animado ou alegre.

Outra forma de inspiração para design com a música consiste em observar como os artistas estão se comunicando visualmente. Como são os clipes musicais, a capa do seu álbum de músicas e sua página no Facebook, por exemplo.​

## 6\. Anote tudo

Tenha sempre um bloquinho em mãos. Escrever exercita a memória e faz com que você não esqueça nenhuma ideia que surgiu de modo inesperado.

É possível ir além. Tente escrever com frequência, crie um diário de ideias ou esquemas, escreva versos e histórias, não se limite. Esse exercício por si só já pode ser uma fonte rica de inspirações. Além disso, as suas anotações podem ser importantes para estimular a criatividade no futuro.

## 7\. Respeite o seu momento de descanso

Você já sabe que a inspiração depende de uma ação intencional. Portanto, ela demanda esforço e trabalho.

Sendo assim, respeite os momentos de descanso do corpo e da mente. Evite dormir poucas horas ou passar noites em claro. O cansaço é um verdadeiro inibidor da criatividade, então, se você deseja se manter inspirado, nunca deixe de fazer pausas.

## 8\. Invista em técnicas criativas

Existem técnicas em que se pode investir para inspirar, libertar a criatividade e solucionar os problemas de forma inovadora.

O [**Mindmapping**] (ou Mapa Mental) serve para organizar visualmente as ideias conforme elas vão surgindo. Essa dinâmica possibilita uma maior fluidez do pensamento e, por ser um mapa, pode ir guiando você em direção a mais inspirações.

Já o [**Brainstorm**] (ou Tempestade de Ideias) consiste em produzir ideias sem julgamentos, para depois avaliá-las. O ideal para a prática é que seja feita em grupo, por isso convide amigos e colegas e faça o teste.

Essas são ótimas técnicas para se inspirar de forma surpreendente, por meio de ideias que poderiam ser absurdas, mas que em realidade podem ser bem viáveis.

## 9\. Curta os momentos de ócio

A distração e a diversão são fundamentais para qualquer ser humano. Em meio ao dia a dia,é preciso encontrar tempo para deixar a mente ocupada com momentos prazerosos e de lazer.

Esses intervalos podem ser muito mais produtivos do que você imagina. O cérebro continua bastante ativo nesses momentos e pode ser que em um deles uma grande ideia apareça! Por isso, não tenha medo de aliar a rotina de trabalho com momentos divertidos e devaneios.

## 10\. Inspire-se em outros trabalhos e designers

Não deixe de aprender com trabalhos já feitos por outros profissionais. Dê uma olhada no [**portfólio**] de designers e artistas famosos — eles podem ser uma ótima referência para o seu processo criativo.

Aproveite para conversar com seus colegas de profissão. Pergunte o que estão fazendo e onde buscam suas inspirações também. Inspirar-se de forma colaborativa pode ser uma ótima ideia!

**Essas foram algumas dicas que podem ajudar você a se inspirar mais facilmente e ativar a criatividade. Aplique-as no seu cotidiano profissional e veja qual se encaixa melhor ao seu perfil. A prática de encontrar a inspiração para design é única e é assim que se criam trabalhos originais e surpreendentes.**

Interessou-se pelas dicas? Então compartilhe este post nas suas redes sociais e ajude a inspirar mais pessoas!




O uso de autenticação é praticamente unânime em qualquer aplicação. Seja um fórum, uma rede social, internet banking ou o sistema da empresa.

Ao desenvolver uma aplicação, precisamos tomar muito cuidado com o login e senha dos usuários. É comum encontrarmos tabelas como esta abaixo por aí, em vários sistemas:

python

O que aconteceria com a reputação de nosso produto caso algum invasor tenha acesso a essa tabela com usuários e senhas?

> _“Oras, mas o banco de dados não é exposto na internet pública, fica em rede local”._

Será que isso é o suficiente? Em geral, as empresas que trabalham com desenvolvimento isolam os ambientes de desenvolvimento e produção. Inclusive, para as pessoas desenvolvedoras programarem, é comum usar um banco de dados com dados como email, telefone, etc. falsos, para garantir uma maior privacidade do usuário final.

Mas, estes dados ainda são visíveis para administradores de sistemas e o time de infraestrutura. E se algum funcionário, buscando prejuízo da empresa, executar um `select * from Usuarios` e publicar estas informações?

> Moral da história: **nunca guardar uma senha bruta no banco de dados!**

Se não vamos guardar a senha em formato bruto, o que podemos fazer? Podemos guardar um texto bagunçado difícil de reconhecer. Algo como:

python
O nome disso é hash! Uma função que gera o hash recebe como entrada um texto qualquer, e o mapeia para uma cadeia de caracteres com tamanho fixo. Por exemplo:

- Hash de `"minha_senha_segura"` = `4f24ed619ffb73b8792e3f74e5ffa3bb`;
- Hash de `"sp23494"` = `de1dc74c5561739cbe4c6368f78e9b6f`;

A partir de `de1dc74c5561739cbe4c6368f78e9b6f` é inviável descobrir a senha original!

Mas, peraí, o usuário ao fazer login não vai digitar esse código gigante, né? Na verdade, quando recebemos uma requisição de autenticação, o código da aplicação irá calcular o hash da senha informada e comparar com o que está no banco de dados!

Desta forma, iremos comparar hashes e não mais senhas brutas, nos poupando do problema de guardar esta informação sensível no banco de dados.

Mas…Será que isto está seguro mesmo? As pessoas que conseguirem acesso a esta tabela não poderão saber qual senha é qual, mas poderão calcular o hash das senhas mais usadas no mundo, como `abcdef` ou `123456`:

- Hash de `"abcdef"` = `e80b5017098950fc58aad83c8c14978e`;
- Hash de `"123456"` = `e10adc3949ba59abbe56e057f20f883e`;

Se fizermos uma busca em nossa tabela pelos usuários que possuem esses hashes, saberemos quem possui a senha `abcdef` ou `123456`! Ops, nada bom, né? E se não calcularmos mais os hashes nos baseando apenas na senha bruta, mas a concatenando com algo mais? Dessa forma, não calcularemos o hash do texto `abcdef` e sim o hash do texto `abcdef + <Texto aleatório>`. Por exemplo: `abcdef+HjJK8L`. Teremos um hash totalmente diferente!

Mas, isto só vale se houver um texto aleatório diferente para cada usuário, senão nosso invasor poderá calcular o hash das senhas mais comuns com este mesmo texto aleatório.

Essa porção a mais que colocamos na senha antes de calcular o hash se chama [**salt**])! Então nossa tabela de usuários será:

python

Se houver **informações internas vazadas**, será difícil manter a segurança total. Mas, com esse gerenciamento de senhas mais robusto, podemos dificultar ao máximo que pessoas mal-intencionadas tenham acesso a informações sensíveis.

Talvez você esteja pensando que melhor que isso só se guardarmos as senhas criptografadas. Será?

A criptografia, por definição, deve ser reversível! A partir da chave de criptografia e do texto cifrado, voltaremos ao texto original, ao contrário do hash, em que não podemos voltar ao texto original.

Se nossa tabela de senhas cair em mãos erradas, será necessário apenas descobrir a chave de segurança. Uma chave fraca pode ser obtida com força bruta e uma chave forte ainda precisa ser armazenada e visível para alguma pessoa, não? E se essa pessoa usar ou compartilhar a chave com alguém? É por isto que usamos hash e salt!

Gostou de ver um pouco sobre segurança e algumas vulnerabilidades que podem existir na aplicação? Na **Alura**, falamos mais sobre segurança no curso [**Segurança Web: Vulnerabilidades do seu sistema e OWASP**]. Temos também este artigo do que fala sobre como implementar os [**recursos de Hash**].




**O design da experiência do usuário (ou UX design) é o processo que visa melhorar a satisfação do usuário com um produto ou serviço, melhorando a usabilidade, a acessibilidade e até mesmo a satisfação proporcionada na interação.**

Trata-se de um campo amplo, que abrange o design tradicional de interações homem-máquina e o prolonga, abordando todos os aspectos pelos quais um serviço ou produto é percebido pelo usuário.

Ao longo deste artigo, você vai compreender o que a UX design significa e descobrir por que ela é tão importante! Vamos lá?

## O que é UX design?

Segundo o estudo [**Interacting With Computers**], do Oxford Journal, o principal objetivo da UX design nos negócios é melhorar a satisfação e a lealdade do cliente, tornando suas interações com produtos ou serviços mais simples e prazerosas.

Podemos entender, então, que esse é o processo de concepção (digital ou física) de mercadorias úteis, fáceis de utilizar e prazerosas de se interagir.

Sua função é melhorar a experiência que os usuários têm ao interagir com um determinado produto, mas infelizmente essa não é uma explicação boa o bastante para que você saia por aí se dizendo um especialista.

O termo experiência de usuário, abreviado como **UX** (**U**ser e**X**perience), refere-se ao que uma pessoa sente ao interagir com um sistema — que pode ser um site, aplicativo web ou software para desktop. Mas pode ir para o mundo offline também, pense na última vez que você entrou em uma determinada rede de supermercados ou como foi atendido por um médico, tudo isso envolve UX.

No contexto moderno, UX diz respeito a todas as interações homem-máquina possíveis: desde os comandos de voz que um usuário dá para seu celular executar determinada função (a Siri no iOS por exemplo) até a [**posição dos botões**] em um aplicativo.

## O que faz um designer da experiência do usuário?

Aqueles que [**trabalham com UX**] estudam e avaliam como os usuários se sentem a respeito de um determinado sistema, olhando para questões como a facilidade de uso e a percepção de valor, utilidade e eficiência na execução de tarefas, entre outros.

UX [**designers**] também se dedicam aos subsistemas e processos dentro de um sistema, como o checkout de um e-commerce, para garantir que os usuários considerem o processo de compra fácil e agradável.

## Como e quando surgiu o termo?

Comparada com muitas outras disciplinas, a UX design é relativamente nova. O termo foi cunhado pelo [**Dr. Donald Norman**] no começo da década de 90 enquanto trabalhava na Apple, um pesquisador de ciência cognitiva que também foi o primeiro a descrever a importância de um design centrado no usuário. Em 2016 a NN Group publicou um vídeo com Norman comentando sobre o termo:

https://www.youtube.com/watch?v=9BdtGjoIN4E

Hoje, descrever e justificar a importância de projetar e aprimorar a experiência do usuário parecem ações quase desnecessárias, entretanto na sua época não era bem assim.

Até pouco tempo atrás quem tem experiência na indústria deve lembrar —, costumávamos fazer interfaces de uma maneira bem diferente. Pense nos sites dos primórdios da internet. Antes de compreendermos o valor do usuário, tomávamos decisões com base apenas em dois itens: o que achávamos bonito e o que o cliente queria ver.

Construíamos interações a partir do que pensávamos que funcionava, desenhando para nós mesmos. O foco estava na estética e na marca, com pouquíssima gente pensando em como as pessoas que usariam o site se sentiriam a respeito.

Mas depois que a web se tornou onipresente (e os sites, ambientes complexos), os projetos tiveram que mudar de foco. Passamos a nos conscientizar da importância de características como acessibilidade não só para aqueles que têm necessidades especiais, mas também para quem acessa um site de um dispositivo que não seja o computador.

**As mudanças no acesso, como a popularização da banda larga e do smartphone, fizeram com que sites bonitos fossem substituídos pelos agradáveis de usar, independentemente da plataforma escolhida para receber tal conteúdo.**

O fator impulsionador para construirmos páginas hoje é a experiência que queremos dar aos nossos usuários.

## Por que a UX design é importante?

O termo é usado para se referir às abordagens e aos métodos utilizados para se certificar que um [**site**] é totalmente adaptado e personalizado para seu público-alvo. A eficácia de uma plataforma online depende de um fator-chave, que é a experiência do usuário.

De maneira simples, podemos dizer que a satisfação do cliente é tudo. Portanto, um site deve ser fácil de navegar, simples de operar e oferecer aos usuários benefícios e vantagens únicas.

Quando falamos apenas em plataformas web, já há algumas complicações, mas imagine que tablets, smartphones, wearables e outros dispositivos já fazem parte da malha digital e precisam ser levados em consideração por designers na hora de lançar um novo produto.

A experiência do usuário deve ser ótima em cada um destes canais e é por isso que o papel do UX designer é tão importante.

A qualidade do uso é tão essencial quanto os componentes estéticos de um site. Você pode ter uma das melhores plataformas online ou [**apps**] no mercado, mas, se os clientes não conseguirem aprender rapidamente a utilizá-los, pouco adianta.

Embora a UX tenha um papel vital no desenvolvimento de todos os recursos digitais, sua importância é ampliada quando falamos de sites, aplicativos, softwares corporativos ou interfaces que usamos todos os dias, como a do caixa eletrônico de um banco.

Quanto mais complexo é o processo, mais importante se torna o design da experiência do usuário, pois ele ajuda seu público-alvo a navegar e a executar processos. Isso pode ser simples, em projetos de nicho, ou extremamente desafiador quanto maior for o número de pessoas que deve ser atendido por aquela configuração. Uma dica é pensar em personas ou [**proto-personas**] para nortear um pouco mais seu caminho.

A importância da UX cresce ainda mais no caso de empresas jovens e startups, porque geralmente falta uma reputação robusta para servir de suporte. As chances de sucesso se concentram na qualidade de suas plataformas e na primeira impressão que conseguem provocar nos clientes.

## Por que sua implementação é um desafio?

O design da experiência não funcionará em todas as situações para cada pessoa porque, como seres humanos, somos todos diferentes. O que dá certo para um indivíduo pode ter o efeito oposto em outro.

O melhor que podemos fazer é projetar experiências específicas e promover certos comportamentos, embora não possamos fabricar, impor ou prever comportamentos reais que vão ocorrer durante o uso.

Não é possível determinar a eficiência da UX design com base apenas em estatísticas, como exibições de página e taxas de conversão ou rejeição.

Podemos, sim, fazer suposições com base nesses dados e pedir aos usuários evidências, mas não instalar um aplicativo que grave automaticamente as impressões do uso diretamente. Por isso é tão desafiador desenhar a experiência do usuário.

## UX design é o mesmo que usabilidade?

UX design e usabilidade tornaram-se sinônimos por aí, mas são campos distintos. A UX se refere a como um usuário se sente ao usar algo, enquanto a usabilidade é sobre a eficiência da interface em si.

Se um sistema se propõe a funcionar como uma lista virtual de afazeres e os usuários conseguem adicionar tarefas e marcar aquelas que completaram, tem uma boa usabilidade. Entretanto, isso não significa que a mesma ferramenta ofereça uma boa experiência a eles.

**Embora a usabilidade constitua grande parte da UX e desempenhe um papel importante em sua avaliação, fatores antropológicos, ciência, psicologia, arquitetura da informação e princípios de design centrado no usuário também merecem destaque.**

Pensando no exemplo anterior, você pode ter usuários que consigam fazer uso de um sistema, mas que não se sintam confortáveis com isso por algum motivo.

Seja em função das cores que não oferecem um contraste suficiente, devido à complexidade das etapas para cada ação ou, ainda, pela inexistência de uma hierarquia entre as tarefas criadas: muitos são os motivos que podem fazer de uma interface com boa usabilidade uma péssima experiência.

Em geral, os dois itens caminham juntos. Não é possível um sistema oferecer uma boa UX sem ter sua usabilidade bem pensada. Mas o contrário pode acontecer.

Gostou de saber mais sobre a UX design? Então siga nossas redes sociais ([Facebook], [Twitter], [Youtube] e [Linkedin]) e continue aprendendo conosco!




Dessa vez, o nosso aluno Wanderson Macêdo, compartilha a forma como estuda e descreve uma de suas técnicas de aprendizagem que faz muita diferença para o aprendizado! Bora dar uma olhada?

imagem, lido livros e já estava no 7º semestre da faculdade (e ainda estou). 

Eu poderia ter ido direto para os cursos mais avançados, mas não, comecei pelos básicos e mesmo achando que aquilo não somaria em nada nos meus conhecimentos eu os fiz e disse para mim mesmo: **Vou fazer esse curso aqui só para revisar, eu já sei disso**. O que me impressionou? **As dúvidas básicas no fórum em que eu não tinha certeza da resposta**. Pois é, acabei aprendendo um monte de coisas “novas”.

No vídeo, com o instrutor, que já domina o assunto, você aprende, faz os exercícios e absorve aquele conhecimento passado pelo instrutor. No fórum, você discute e vê problemas sobre a perspectiva de outras pessoas, problemas que talvez não tenham acontecido com você e que você pode ou não ter a resposta. Podemos chamar isso de: **segunda parte do aprendizado**. 

E esse segundo passo é muito importante para fixação e compreensão do assunto estudado, você pode estar ensinando e/ou aprendendo com mais alguém sobre determinado assunto sobre outra perspectiva que antes você não havia pensado.

Se você é aluno do Alura, assim como eu, explore um pouco o fórum, caso tenha problemas, procure uma solução lá, caso não tenha, abra um tópico! Dessa forma, alguém que já sabe pode lhe mostrar no caminho das pedras para resolver seu problema ou alguém que está aprendendo pode entrar na discussão também e aprender porque aconteceu o problema e como resolver.

**É Aluno da Alura também e tem uma história bacana pra nos contar? Conta que publicamos seu depoimento aqui! Envie um email para gabriel.ferreira@caelum.com.br**




Na maioria das linguagens de programação, o escopo das variáveis locais é vinculado ao bloco onde elas são declaradas. Sendo assim, elas “morrem” ao final da instrução em que estão sendo executadas. Será que isso se aplica também à linguagem JavaScript? Vamos verificar:

javascript

Estamos declarando duas variáveis em blocos de código diferentes, qual será o resultado? Vamos testar:

javascript

Se `mensagemDentroDoIf` foi declarada dentro do `if`, por que ainda temos acesso a ela fora do bloco desta instrução?

## Utilização antes da declaração

Vejamos abaixo outro exemplo de código em JavaScript:

javascript

Observe que estamos declarando a variável `mensagem` apenas depois de atribuir um valor e exibí-la no log, será que funciona? Vamos testar!

javascript

Funciona! Como é possível usar a variável `mensagem` antes mesmo de declará-la? Será que o escopo é garantido apenas dentro de onde a variável foi criada?

## Hoisting

Em JavaScript, toda variável é **“elevada/içada” (_hoisting_)** até o topo do seu contexto de execução. Esse mecanismo move as variáveis para o topo do seu escopo antes da execução do código.

No nosso exemplo acima, como a variável `mensagemDentroDoIf` está dentro de uma _function_, a declaração da mesma é elevada (_hoisting_) para o topo do seu contexto, ou seja, para o topo da _function_.

É por esse mesmo motivo que “é possível usar uma variável antes dela ter sido declarada”: em tempo de execução a variável será elevada (_hoisting_) e tudo funcionará corretamente.

## var

Considerando o conceito de hoisting, vamos fazer um pequeno teste usando uma variável declarada com `var` antes mesmo dela ter sido declarada:

javascript

No caso da palavra-chave `var`, além da variável ser içada (_hoisting_) ela é automaticamente inicializada com o valor undefined (caso não seja atribuído nenhum outro valor).

Ok, mas qual é o impacto que temos quando fazemos esse tipo de uso?

Imagine que nosso código contenha muitas linhas e que sua complexidade não seja algo tão trivial de compreender.

Às vezes, queremos declarar variáveis que serão utilizadas apenas dentro de um pequeno trecho do nosso código. Ter que lidar com o escopo de função das variáveis declaradas com `var` (escopo abrangente) pode confundir a cabeça até de programadores mais experientes.

Sabendo das "complicações" que as variáveis declaradas com `var` podem causar, o que podemos fazer para evitá-las?

## let

Foi pensando em trazer o escopo de bloco (tão conhecido em outras linguagens) que o ECMAScript 6 destinou-se a disponibilizar essa mesma flexibilidade (e uniformidade) para a linguagem.

Através da palavra-chave `let` podemos declarar variáveis com escopo de bloco. Vamos ver:

javascript

Qual será a saída do código acima?

javascript

Veja que quando tentamos acessar uma variável que foi declarada através da palavra-chave `let` fora do seu escopo, o erro _Uncaught ReferenceError: escopoBloco is not defined_ foi apresentado.

Portanto, podemos usar tranquilamente o `let`, pois o escopo de bloco estará garantido.

## const

Embora o `let` garanta o escopo, ainda assim, existe a possibilidade de declararmos uma variável com `let` e ela ser _undefined_. Por exemplo:

javascript

Supondo que temos uma variável que queremos garantir sua inicialização com um determinado valor, como podemos fazer isso no JavaScript sem causar uma inicialização _default_ com _undefined_?

Para termos esse tipo de comportamento em uma variável no JavaScript, podemos declarar constantes por meio da palavra-chave `const`. Vamos dar uma olhada no exemplo:

javascript

O código acima gera um _Uncaught TypeError: Assignment to constant variable_, pois o comportamento fundamental de uma constante é que uma vez atribuído um valor a ela, este não pode ser alterado.

Assim como as variáveis declaradas com a palavra-chave `let`, constantes também tem escopo de bloco.

Além disso, constantes devem ser inicializadas obrigatoriamente no momento de sua declaração. Vejamos alguns exemplos:

javascript

No código acima temos o exemplo de uma constante `idade` sendo declarada e inicializada na mesma linha (constante válida) e um outro exemplo onde o valor não é atribuído na declaração de `pi` (constante inválida) ocasionando o erro _Uncaught SyntaxError: Missing initializer in const declaration_.

É importante utilizar `const` para declarar nossas variáveis, porque assim conseguimos um comportamento mais previsível, já que o valor que elas recebem não podem ser alterado.

## Conclusão

Aqui tem um resumo do site [constletvar.com]:

![]

Graças ao _hoisting_, variáveis declaradas com a palavra-chave `var` podem ser utilizadas mesmo antes de sua declaração.

Por outro lado, as variáveis criadas com `let` só podem ser utilizadas após sua declaração, pois, apesar de serem elevadas, elas não são inicializadas.

Além das variáveis declaradas com `var` temos a possibilidade de usar constantes por meio da palavra-chave `const` ou utilizar variáveis com escopo de bloco através da `let`.

Mais JavaScript? Vemos essas e outras características profundas do ECMAScript nos nossos cursos de [**JavaScript avançado**]. Aqui também um video do Zac Gordon para resumir o que vimos:

https://www.youtube.com/watch?v=pcxR1iMegfU




**O perfil do consumidor de informação mudou muito.** Existiu um tempo em que os textos cativavam a atenção das pessoas, no entanto esse período ficou no passado. Dessa forma, o vídeo vem se tornando uma ferramenta de marketing vital em qualquer esfera mercadológica.

O objetivo neste artigo é expor as opções de atuação promovidas pelo mercado e mostrar como o profissional da área deve manter-se informado acerca dos novos métodos e tecnologias existentes. Confira!

## O futuro do Marketing

Sem dúvida, pode-se dizer que os principais meios de comunicação existentes no Brasil são a televisão e a internet sendo, esse último, o que vem apresentando maior crescimento nos últimos anos.

Em consequência disso, o perfil dos usuários tem passado por inúmeras mudanças. Mesmo os consumidores mais antigos, adeptos dos jornais impressos e do rádio, têm se guiado pela facilidade das informações disponibilizadas em vídeo.

## O perfil do consumidor de conteúdo

Como já mencionado, o perfil dos consumidores de conteúdo vem se transformando nos últimos anos, mesmo entre aqueles habituados exclusivamente aos textos impressos e disponíveis em meio digital.

Muitas pessoas estão cansadas de ver materiais que dialogam em sentido único. A busca por conteúdos interativos e o **desejo de ouvir um interlocutor falando sobre os assuntos de seu interesse têm sido os principais motores dos usuários pela demanda audiovisual.** Nesse sentido, o vídeo torna-se uma ferramenta ideal na aproximação do espectador com o conteúdo disponibilizado.

## As opções de mercado para o profissional de edição de vídeos

Até agora mencionamos os motivos que fizeram com que o mercado de edição de vídeos estourasse no Brasil, entretanto, ainda não demonstramos as opções que esse ramo de atuação proporciona.

O mercado de edição de vídeos é muito amplo, oferecendo oportunidades diversas aos mais variados tipos de profissionais. Algumas delas são:

### 1\. Redes de televisão

O nicho televisivo é, sem dúvida, o mais visado pelos profissionais de edição de vídeos. São várias as atividades que necessitam dele. A edição de telejornais, programas de auditório e telenovelas são exemplos de áreas que o editor de vídeos pode atuar no âmbito das empresas de televisão.

### 2\. Marketing Digital

Um segmento de mercado que vem se destacando e [**crescendo consideravelmente**] [no Brasil] quando começou a ser explorado massivamente é o de marketing digital, em especial aquele realizado [**por meio de blogs**] e de redes sociais, como o Facebook.

O marketing digital é uma área que tem se valido, cada vez mais, dos produtos audiovisuais, principalmente, devido à crescente demanda dos consumidores.

Dificilmente você encontrará uma página de vendas ou apresentação de conteúdo sem, no mínimo, um vídeo. **Isso porque, informações escritas não geram o mesmo impacto que as informações audiovisuais e, dificilmente, proporcionam a conversão desejada pelo proprietário.**

### 3\. Filmes e documentários

Outra área de atuação que necessita de profissionais de edição de vídeos altamente qualificados é a produção audiovisual de filmes, documentários e curtas-metragens.

### 4\. Canais do YouTube

Recentemente, presenciamos o surgimento e o sucesso de várias personalidades do mundo digital que conquistam milhares ou até mesmo milhões de pessoas no Brasil com os mais variados tipos de conteúdo em vídeo publicados no YouTube.

Como a demanda desses materiais cresceu muito – o que pode facilmente ser percebido em uma simples consulta no YouTube consequentemente, a qualidade dos vídeos também teve de melhorar.

Com isso, abre um novo mercado para os profissionais de edição de vídeo, que podem atuar em conjunto com os chamados "YouTubers", objetivando transformar suas apresentações na internet mais profissionais.

### 5\. Jornalismo

Outra área de atuação para o profissional de edição de vídeos é o jornalismo. Os portais de notícia, tanto online quanto televisiva, sempre precisam de bons profissionais para realizar o tratamento nos conteúdos que serão disponibilizados à sua audiência. Assim, o profissional de edição de vídeos também poderá explorar essa área do seu mercado.

### 6\. Criação de vinhetas em vídeo

**As propagandas que são transmitidas nos canais de televisão, abertos ou fechados, necessitam passar pela edição de vídeos feita por um bom profissional da área. Abrindo assim, mais uma oportunidade de trabalho.**

Existem empresas especializadas na criação de vinhetas em vídeo. Essas organizações são uma excelente opção para o ingresso nesse mercado.

### 7\. Criação de efeitos visuais e acabamentos

Outra área de atuação dos profissionais de edição de vídeos é a confecção de efeitos e acabamentos em conteúdos diversos, para terceiros não vinculados a empresas de televisão ou grandes portais de marketing de conteúdo.

Existem profissionais dessa área que atendem pessoas que necessitam criar efeitos diversos em vídeo para alguma apresentação mais profissional em empresas, eventos ou reuniões. O profissional de edição de vídeos pode oferecer os serviços de freelancer para atender a essa demanda.

### 8\. Grandes portais de internet

Outro ambiente que necessita de um bom profissional de edição de vídeos é o de empresas que possuem grandes portais na internet, como por exemplo: Terra, Uol, MSN Brasil, Globo.com, entre outros.

Esses canais são repletos de conteúdos em vídeo, ou seja, uma ótima opção para quem deseja atuar nesse ramo.

## Os desafios do profissional de edição de vídeos

Na mesma proporção em que cresce o mercado de edição de vídeos, aumentam as exigências em relação ao profissional que exerce essa função. Aquele que não se adaptar às constantes mudanças do mercado, fatalmente sucumbirá diante das exigências e demandas.

Além do conhecimento das diversas [**ferramentas de edição de vídeo**] e [**imagem**], o profissional deve estar atendo às variáveis que permeiam os vídeos promocionais, publicitários ou jornalísticos.

Algumas dessas variáveis estão ligadas ao uso das cores, à execução de pequenos cortes no meio do conteúdo, à inclusão de frases e informações distribuídas ao longo do vídeo e, principalmente, à qualidade visual do material trabalhado.

Com a vinculação massiva dos conteúdos audiovisuais, os consumidores passaram a adotar uma postura cada vez mais exigente. Sendo assim, publicar um vídeo sem qualidade de edição pode não produzir o resultado esperado, mesmo que o conteúdo incorporado seja de extremo valor para o usuário.

Dessa forma, investir na qualidade da edição de vídeo pode determinar o sucesso ou o fracasso do tema associado. O profissional de edição de vídeos é tão importante, quanto aquele que produz o conteúdo que será transmitido e, como tal, merece o reconhecimento pelas técnicas utilizadas e pela qualidade obtida.

Entretanto, não custa repetir: a capacidade de se adaptar às constantes mudanças e transformações que permeiam o mercado digital, pode ser determinante para o seu sucesso. A demanda por criação de material multimídia é abundante e um profissional qualificado tende a ser disputado pelos vinculadores de conteúdo.





Estou fazendo um aplicativo de finanças e uma das funcionalidades dele é calcular o valor total de todas as minhas compras em um dia. Para isso, tenho um método que recebe um array com os valores de cada uma das compras que eu fiz no dia:

java

O método percorre o array de valores, incrementa a variável `totalHoje` com o cada um dos valores e imprime em meu log o que ele está fazendo.

Se testarmos esse método passando o array: `double[] gastos = {30.0, 10.0, 20.0, 15.0, 25.0};` olha só o que acontece: imagem. E o segundo é que eu levei um `ArrayIndexOutOfBoundsException`, ou seja, tentei **acessar uma posição do array de gastos que não existe**. O que será que está causando isso no meu código?  
Verificando melhor o meu método, percebi que o culpado de isso ter acontecido é que eu usei um `++indice` em vez de usar `indice++` para incrementar a variável índice!

Você sabe qual é a diferença entre eles? Vamos lá!  

- `++indice` vai incrementar o valor de indice e me retornar o valor já incrementado.
- `indice++` vai me retornar o valor de indice no momento em que é chamado e depois incrementar esse valor.

  
Mas, calma aí, como isso funciona na prática? Vamos ver o exemplo abaixo:

java

Como eu chamei o `++indice` no método, logo a primeira vez que ele entrou no `while` o valor de indice era 1, por isso ele "pulou" a primeira posição. E o segundo problema foi que meu índice ficou maior que o tamanho do array de gastos antes de ele passar pela condição do `while`.

Então para eu consertar o meu método basta eu trocar `++indice` por `indice++` e agora, olha o resultado:

imagem eu incrementar o número de compras e usar o getter para me retornar esse número atualizado.  

Vimos que as vezes são os pequenos detalhes que fazem toda a diferença em nosso código e que precisamos prestar atenção no comportamento de cada um dos comandos que usamos para garantir que o código vai funcionar da maneira que esperamos. Você já sabia dessa diferença?

**Você pode aprender mais sobre esse e outros comandos comuns à diferentes linguagens de programação no nosso curso de [Lógica de Programação I: comece na carreira com JavaScript]. Ainda, para garantir que bugs como esses não vão acabar indo pra produção você pode fazer nosso curso de [Testes: TDD com Java].**




Fui contratado por um e-commerce para criar modelos de inteligência artificial que ajudam a entender melhor os clientes.

Esses modelos serão usados para saber quanto vai custar o frete de um produto, ver se um cliente vai comprar ou não e agrupar clientes com gostos parecidos.

Mas como funcionam esses algoritmos? Teremos apenas um para fazer todas essas funções? Temos que treinar cada algoritmo?

## O aprendizado de máquinas

Em todos os casos queremos ensinar a máquina a trabalhar com os nossos dados. Por exemplo, para calcular o preço de frete de um produto. O frete pode ser diferente dependendo da taxa de cobrança para a distância e quantidade de produtos.

Essa taxa não tem um valor fixo, ela depende de outros fatores do mercado como o preço do combustível, os impostos em cima dos produtos, entre outras coisas. De toda forma, quando um usuário pedir para calcular o frete, a gente deve poder estimar um valor.

Porém, como podemos estimar o frete se a taxa pode mudar? Mesmo com a taxa mudando o seu valor, podemos utilizar valores dos fretes passados como forma para estimar o frete futuro. Ou seja, podemos ter um modelo, **um algoritmo de inteligência artificial**, que estimará o frete para a gente.

Para isso, basta treinar esse algoritmo com os fretes antigos, ensinar a ele como eles foram calculados. Quando um frete novo for ser calculado ele pode utilizar esses dados para descobrir o valor que queremos.

Nesse caso, estamos ensinando a máquina como trabalhar com os nossos dados, logo, estamos supervisionando o aprendizado da máquina. Por isso, dizemos que esse algoritmo é um algoritmo de **aprendizado supervisionado**.

No aprendizado supervisionado passamos todos os dados para treinar o modelo. Isto é, passamos os dados e os resultados. Com base nisso, o algoritmo descobre uma forma de trabalhar com os dados.

Vimos que podemos utilizar esses tipos de algoritmos para prever o preço do frete, mas ainda temos que classificar os clientes e agrupá-los por seus gostos, como podemos fazer isso?

## Classificando os dados

Temos que descobrir se um cliente que vai comprar ou não um produto no site. Para isso, podemos utilizar algumas informações como se ele veio de um link externo, como e-mail, ou um anúncio, se ele olhou a descrição de outro produto, se ele tem cadastro.

Podemos utilizar dados de acesso dos usuários para treinar o modelo a classificar se o usuário pode comprar ou não. Podemos pegar esses dados e falar para o nosso algoritmo: olha, esse usuário veio de um link externo, não olhou a descrição, tem cadastro e comprou o produto.

Já esse outro, não veio de link externo, olhou a descrição, não tinha cadastro e comprou o produto. Para cada um dos comportamentos no site, treinamos a máquina com os dados e com os resultados. Quando um novo usuário acessa a página, podemos falar para o modelo qual foi o seu comportamento.

Assim, o modelo consegue predizer se esse novo usuário comprará ou não. Nesse caso, assim como no frete, estamos passando os dados e os resultados para treinar nosso algoritmo. Contudo, ao contrário do outro, não estamos tentando prever um valor e sim uma **classificação**.

Estamos querendo classificar um usuário em vai comprar ou não vai comprar. Portanto, esse tipo de algoritmo - que também é um algoritmo de aprendizado supervisionado, já que estamos passando os dados e os resultados para ensinar o modelo - é chamado de **algoritmo de classificação**.

Enquanto que o algoritmo para calcular o frete é chamado de **algoritmo de regressão**. Esses dois tipos de algoritmo são os mais conhecidos, e mais utilizados, algoritmos para o aprendizado supervisionado.

Todos esses algoritmos, como o aprendizado de máquina no geral, utiliza de funções matemáticas para treinar os modelos. No nosso primeiro exemplo, podemos utilizar, por exemplo, a [**regressão linear**], enquanto que para classificar, nós podemos utilizar o [**algoritmo de Naive Bayes**], por exemplo.

Legal! Vimos como resolver dois dos nossos problemas. Basta agora, descobrir como podemos agrupar os clientes.

## Criando grupos

Olhando para os algoritmos que conhecemos, podemos pensar que criar grupos de clientes é um problema de classificação. De fato, podemos aplicar classificação para criar grupos para a gente, mas que grupos teríamos?

Grupos de clientes que compram eletrônicos? Grupo de clientes com até quarenta anos? Grupo de clientes da região norte? Podemos utilizar esses grupos para enviar e-mails especiais para cada um deles, mas e se esses clientes só tiverem isso em comum?

Isto é, talvez nem todos os clientes que compram eletrônicos ou os clientes que moram em uma determinada região tenham gostos parecidos.

Mas então, como podemos agrupar os clientes? Vimos que podemos classificar nossos dados, mas isso poderia gerar grupos não muito próximos ao que queremos. E se, ao invés de nós criarmos os grupos, falar para o modelo agrupar os dados da maneira que ele achar melhor?

Dessa forma, por meio do algoritmo implementado, o modelo associa um dado a outro e dessa forma cria os grupos.

Ao contrário da classificação, estamos passando para o modelo apenas os dados e não os resultados. Ou seja, não estamos supervisionando o aprendizado, logo, dizemos que esse é um algoritmo de **aprendizado não supervisionado**.

Diferente do aprendizado supervisionado, neste tipo de aprendizado nós não passamos os resultados para ensinar o algoritmo. O próprio algoritmo pega o conjunto de dados e descobre como trabalhar com eles. Os tipos de algoritmos mais utilizados nesse tipo de aprendizado são o [**clustering**] e as [**regras de associação**]. Um exemplo de algoritmo é o [**K-Means**].

## Para saber mais

Além desses tipos de algoritmos, existem também o chamado aprendizado de reforço. Nele a máquina interage com o ambiente.

Essa interação gera um feedback, positivo ou negativo. Caso seja um feedback positivo, a máquina grava que pode realizar essa ação novamente, em caso de feedback negativo, o modelo sabe que não pode executá-lo novamente.

Essa foi uma breve introdução sobre o tema de aprendizado de máquina. Para cada conjunto de dados, podemos aplicar diferentes algoritmos e modelos para alcançar os melhores resultados.

Aqui na Alura temos a [**Formação Machine Learning**].

Nesta formação, você verá algoritmos de classificação e algoritmos não supervisionado. Aprenderá sobre processamento de linguagem natural, validação e otimização de modelos. Além de sistemas de recomendação e redes neurais.





imagem 

Quando estamos fazendo um jogo do tipo _tower defense_ cada torre dentro do nosso jogo precisa verificar qual o inimigo mais próximo dela, com o intuito de atacar ele. Para isso, podemos implementar um comportamento de **Radar** nessas torres.

imagem, ela pare e então, no frame seguinte (dia seguinte), ela volte para esse método a partir do ponto em que parou. Como faremos isso?

Normalmente, quando queremos interromper a execução de um método ou função, usamos a palavra-chave `return`, e assim o compilador já sabe que ele deve sair daquela função. Mas dessa vez, não queremos que ele somente saia, precisamos que o computador salve o ponto onde ele parou para poder voltar depois, e por isso, precisamos usar outra palavra-chave junto com o return.

Essa palavra-chave é o **yield**. Como não queremos retornar nenhum valor de fato, vamos apenas adicionar a linha `yield return null` no final do loop `for`, assim, toda vez que o computador executar essa linha, ele deve sair dessa função e aguardar o próximo frame para continuar executando ela.

csharp

Para executarmos uma `coroutine` utilizamos o método `StartCoroutine`, passando a função como parâmetro.

csharp

Dessa forma, o loop dará apenas uma volta antes de parar, e isso acaba demorando demais para completar. Podemos dar mais voltas nesse loop antes de pararmos.

csharp

Assim, temos um processamento mais uniforme, e se olharmos de novo na janela do _Profiler_ da Unity, veremos que o _framerate_ do nosso jogo fica ali em torno dos 4000 quadros por segundo.

![]

Dessa forma, podemos utilizar coroutines para dividir o processamento de tarefas em mais de um frame e assim não temos uma queda brusca na atualização do jogo porque alguma função está demorando muito para ser executada.

Veja os [**cursos de jogos**] que temos aqui na Alura, com certeza você vai achar algo que te interesse. Além dos cursos de [**Unity**] temos outras ferramentas como [**Cocos Creator**] e [**TIC-80**].





imagem 

Não falo dos Estados Unidos ou da Europa, onde existe esse problema em grau menor, mas existem outros, como o dump de uma tecnologia (preparar o jovem para ser um bom consumidor dos produtos de uma empresa através da doação pela empresa de equipamentos, softwares e conteúdos e, consequentemente, com o conhecimento da dobra mais escondida da alma do aluno).

Numa palestra perguntaram como um software pode ser usado em escola sem verba suficiente? Com simplicidade, a palestrante respondeu: há escolas que compram quantidade de equipamentos menor do que o número de alunos e os alunos os utilizam em dupla, em trio…

Isso dá oportunidade para trabalhar a colaboração, um comportamento esperado para cidadãos do seculo XXI. (A oportunidade nasce das deficiências. Com isso não estou dizendo que se quer a deficiência, mas quando ela existe, procura-se ver nela a oportunidade).

É isso que encontramos no fórum, por exemplo, da Alura. Procuramos entender a questão de um problema em diversas perspectivas; diversos sào os alunos, diversas as posições. Procuramos discutir os diversos caminhos de soluções. Encontramos diversas solucoes e adotaremos uma delas pelo tempo em que ela for uma solução.

E dessa forma também flutuam as empresas modernas. Como casamento. Unimo-nos para expandirmo-nos.

E assim desatamos o nó górdio.

Quando falamos em relacionamentos interpessoais, é importante entender um pouco mais a fundo como lidar uns com os outros e dar um feedback da maneira correta. Na Alura temos um curso de [**Relacionamentos pessoais**] que fala exatamente disso. :)





-  "Quero ser mais saudável." 

-  "Quero mudar de trabalho."

-  "Quero fazer uma especialização na minha área profissional." 

-  "Quero viajar mais." 

-  "Quero ter mais tempo livre." 

-  "Quero ver mais meus amigos."

- "Quero trocar de carro."

Podemos fazer listas com metas em qualquer período do ano, mas parece que Dezembro é um mês onde as pessoas mais se inspiram para pensar no que elas querem fazer de diferente a partir do ano novo.

A pessoa está motivada e tudo vai muito bem, até que um dia ela não consegue cumprir algo que estava na lista… Pronto! Esse é o motivo que bastava para ela deixar a sua meta de lado e pensar:

> _"Ah! deixa, não ia dar certo mesmo..."_

## 1\. Um novo hábito deve partir de uma decisão consciente.

Criar listas é muito simples: você simplesmente anota tudo o que espera conquistar em um determinado período de tempo. Até aqui ok. mas e depois?

Quando você falar alguma frase relacionada a uma mudança de hábito, como por exemplo "quero emagrecer" ou “quero aprender inglês”, lembre-se que isso requer que você tome uma atitude e pense a respeito para preparar um plano de ação.

Uma sugestão para você começar a criar o seu plano de ação agora é pensar em objetivos e metas. Então se eu quero emagrecer vou pensar da seguinte forma:

> _"Meu objetivo é perder 6 quilos em 3 meses"_

Perceba que além do que você espera alcançar é interessante determinar um prazo também, isso te ajudará a manter o foco. Agora vem as metas:

> - _"E para isso vou me matricular na academia para fazer musculação 3 vezes por semana e aula funcional 2 vezes por semana."_
>     
> - _"Também, vou fazer mais caminhadas porque em breve quero ter condicionamento para correr aquelas corridas de rua de 5 km._
>     
> - _" Então para me ajudar a acompanhar esses quilômetros percorridos vou usar um aplicativo no celular, como o [**NikeRun**] por exemplo, onde posso criar treinos iniciantes com foco em aumentar a intensidade das corridas."_
>     

Agora se você quer aprender inglês (ou outro idioma), siga o que fizemos no exemplo acima, primeiro o objetivo:

> _"Meu objetivo é aprender o básico de inglês em 6 meses."_

Então vem a meta:

> _"Para isso, vou estudar uma unidade por dia no [**Duolingo**], assistir filmes em inglês com legenda para me familiarizar com o idioma, e logo assistir sem legenda para ver como vai a minha compreensão."_

Tem pessoas que estudam ou se exercitam melhor durante a manhã, outras à noite, cada um precisa experimentar diferentes horários para ver como se adequam.

Muitas vezes também temos limitação de tempo, concordo com você que fica difícil conciliar tantas coisas. Para nos ajudar neste ponto, lembre-se de priorizar as coisas que você tem que fazer e desenvolva muito a sua disciplina.

Vai ter dia que a preguiça vai querer te dominar? Vai, mas lembre-se que se você não tiver foco e disciplina as coisas não mudarão.

Ter consciência das coisas nos ajuda a evitar lançar palavras ao vento. Então quando você pensar em adotar um novo hábito, questione-se o porquê ele é importante, o que você espera conquistar e principalmente como fará e em quanto tempo.

No caso de eu querer emagrecer, por exemplo, é importante porque quero me sentir melhor, ser mais saudável.

E quero aprender inglês porque estou programando uma viagem para fora do Brasil e quero me virar bem ou porque quero me destacar na minha carreira, afinal de contas muitas vagas de trabalho requer inglês e eu não quero perder oportunidade porque não tenho conhecimento neste idioma.

## 2\. Desaprender um hábito antigo

Muitas vezes fazemos tantas coisas porque nos acostumamos, então, perdemos a noção de que algo poderia ser feito diferente.

Imagina uma pessoa que vai dormir tarde e que precisa acordar cedo, mas como ela sempre acaba perdendo a hora (ou saindo da cama praticamente se arrastand0, sempre bate aquele arrependimento e ela diz:

> _"Hoje vou dormir cedo."_

Ao chegar em casa ela repete o seu ritual e pronto: mais uma vez ela vai dormir tarde.

Se você se identificou com este exemplo saiba que nem tudo está perdido.

Existem técnicas que podem nos ajudar a lidar melhor com isso, mas antes tenha consciência sobre o que te incomoda e pense em alternativas para reverter esse quadro.

A disciplina é um elemento fundamental neste processo. Uma pessoa pode querer dormir mais para ficar mais disposta no dia seguinte. Legal, isso indica que ela tomou consciência de que dormir poucas horas tem prejudicado o seu rendimento ao longo do dia.

Mas quando chega a hora de dormir ela pensa:

> _"Queria dormir, mas não tenho sono, vou continuar acordado."_

**Resultado**: mais uma manhã repleta de sacrifícios para se levantar.

Então na próxima vez, que tal se ela agir diferente?

Ela pode agir assim:

> _"Preciso dormir porque amanhã terei um dia longo, e vai se deitar."_

Uma hora o sono chega e ele consegue dormir.

## 3\. Tenha paciência

Tudo é muito imediato. Se você espera uma página web abrir em 3 segundos já é motivo para se incomodar. Agora imagina deitar na cama para dormir sem sono? Provavelmente você vai se levantar e ficar até tarde esperando o sono chegar.

Então lembre-se que toda vez que você quiser **adquirir novos hábitos é importante ter paciência**, porque podemos fazer uma ação por tanto tempo que leva mais tempo para o nosso corpo e mente se acostumar com essas novas rotinas. Mas lembre-se: **não desista**.

## 4\. Repita, repita e repita

A repetição é um importante elemento para nos ajudar a consolidar novos hábitos. Então você pode pensar:

> _"Priscila, eu fiz tudo bonitinho por uma semana e teve um dia que eu não fiz e pronto… Parece que regredi tudo."_

Aquisição de novos hábitos não é uma ciência de tudo ou nada, se um dia você deixou de fazer algo, respire fundo e pense:

> _"Amanhã farei melhor ainda."_

Quanto mais você repetir o hábito, maior serão as chances de você fortalecer aquilo que você quer mudar.

## 5\. Crie recompensas

A vida é muito curta para fazer algo legal e não receber uma recompensa. E não pense que elas precisam ser coisas caras ou complexas.

Eu por exemplo adoro comer chocolate, mas para eu seguir meu Projeto Verão (que na verdade chamo de projeto de vida) diminuí muito a quantidade de doces.

Estou tão disciplinada que mereço um chocolate! Brincadeiras à parte, faça algo que você goste e que além de ser uma recompensa, pode te estimular na aquisição de novos hábitos.

Existem outras maneiras de nos ajudar a criar hábitos melhores e se você quer entender mais o que está por trás dos nossos hábitos e como melhorá-los, conheça o curso [**Hábitos: da produtividade às metas pessoais**].

Gostou deste post?

Aproveite e compartilhe com seus amigos, pode ser útil para eles também :)

Aproveite para nos seguir nas redes sociais para ter acesso a outros conteúdos como este! Estamos no **[Facebook]**, no **[LinkedIn]**, no **[Youtube]** e no **[Twitter]**.





imagem 

Em jogos, é comum termos sempre muitos arquivos de áudio sendo executados ao mesmo tempo,alguns deles são efeitos sonoros (passos, ataques, inimigos, ambiente, etc…), já outros compõem a trilha sonora.

Com tantos objetos de áudio dentro de uma cena, como controlamos o volume do jogo de forma centralizada? Pense em uma tela de configurações onde temos dois _sliders_, um para controlar o volume da música do jogo e outro para ajustar os efeitos sonoros.

imagem’ to script”.

![]

Uma vez que a variável foi exposta para o código, ela fica visível na aba "exposed parameters" - parâmetros expostos - no canto direito da janela do audio mixer, é aqui que podemos renomear esses parâmetros.

![]

Agora, criaremos um script que recebe um mixer e o nome do parâmetro que queremos alterar para que possamos usar essas informações e ajustar o som do jogo de acordo nosso slider.

Para isso, vamos criar uma função `MudarVolume` que recebe como parâmetro um valor do tipo float. Sabemos que esse valor está entre 0 e 1, uma vez que quem vai chamar esse método é o próprio componente **Slider**. Assim, calcularemos o volume desejado utilizando a função `Mathf.Lerp` e passar o valor calculado para o _mixer_ utilizando o método `SetFloat` dele.

csharp

![]

Como falamos, utilizaremos o componente **Slider** para chamar o método `MudarVolume` e faremos isso utilizando o evento "On Value Changed" - Quando o valor mudar - do próprio componente **Slider**.

Para adicionarmos uma "resposta" a um evento podemos clicar no “+” logo abaixo dessa propriedade. Com isso, podemos fazer com que esse evento chame o método “mudarVolume”.

![]

Fazendo isso para os dois **Sliders**,temos cada um deles controlando um grupo diferente o volume da música e dos efeitos sonoros separadamente.

Você conhecia os mixers de áudio da Unity? Já tinha utilizado em algum projeto? Como você costuma separar os grupos do seu programa?

Aproveita e passa lá na [**Alura**] para conferir os cursos de Unity que temos!




No dia 27 de Janeiro a Oracle anunciou o fim do suporte ao plugin do Java nos navegadores. Isso causou muitos rumores e um pouco de confusão por parte de alguns desenvolvedores.


https://youtu.be/EZR7CZ8oWqg

Quer aprender mais sobre Java? Temos uma [**Formação Java**] somente sobre o assunto!

Siga os istrutores no Twitter: Gabriel Ferreira - [http://twitter.com/devgabsferreira] Alberto Souza - [http://twitter.com/alberto_souza].




Esse é o terceiro post da [série dicas de React] e hoje vamos falar de padronização de código com **ESlint**, **EditorConfig**, **Prettier** no **VSCode**

É bem comum que ao trabalhar com um time em um projeto em algum momento você passe pela situação de sem olhar no github o histórico de quem escreveu um código (famoso git blame)você identifica o desenvolvedor dono do código pelo estilo de como ele separa o if, se ele usa ponto e vírgula, se ele prefere aspas simples ou não e em alguns casos o pessoal fica horas e horas discutindo sobre quem estaria certo com relação a esse tipo de coisa.

Na prática o que realmente tem valor nessas discussões é quando a gente para e faz o commit para entregar a feature que estava em desenvolvimento, mas é inegável que ter uma padronização de código ajuda a dar manutenção e nesse post vamos falar de algumas ferramentas que vão ajudar a não ter a carga mental de pensar em diversas dessas coisas além de automatizar todo o processo de correção do nosso código dentro do **Visual Studio Code**.

## Preparando tudo

Para esse post é legal você já ter trabalhado com react ou em projetos JavaScript e conhecer o [**create-react-app**] que inclusive é o que vamos usar para criar um projetinho novo para esse post.

imagem. 

O ponto é, cada um tem suas preferências uns preferem que os códigos usem espaços, outros preferem usar tabs. O [**editorconfig**] serve como um guia para que seu editor favorito consiga saber qual padrão de espaçamentos ele deve usar. Por exemplo muitas pessoas gostam de usar 2 espaços, outras 3 espaços ou 4.

Se alguém do seu time usar algum editor que tenha algum tipo de autoformatação baseada nas preferências pessoais de 2 espaços, fizer um commit isso vai pro seu histórico do versionamento normalmente. 

Quando algum outro dev que mexer nesse arquivo tiver configurado no seu editor 4 espaços e também usar um autoformatador essas edições irão aparecer no seu commit como alterações poluindo assim o histórico do seu projeto.  

Para prevenir isso, sempre que criar um projeto novo crie um arquivo **.editorconfig** na raíz do mesmo com pelo menos algo próximo das configurações abaixo.

`./.editorconfig`

```
// Remova os comentários quando for usar em seu projeto :)
root = true // especifica que seu projeto inteiro a partir deste ponto irá ter um padrão baseado nas configurações deste arquivo

[*] // Aqui estamos dando match em TODOS os tipos de arquivos, mas você poderia especificar passando algo como: [*.{js,py}]
indent_style = space // Força que mesmo que alguém aperte tab, ele seja convertido para espaços isso ajuda a padronizar o tamaho da distância entre todos os editores já que o tab varia muito o espaçamento
indent_size = 2 // Aqui estamos forçando que mesmo que o usuário de um tab ele seja equivalente a 2 espaços
charset = utf-8 // Forçamos o encode utf-8 
trim_trailing_whitespace = false // Aqui estamos removendo espaços desnecessários que ficam no final de uma linha
insert_final_newline = true // Isso aqui é uma coisa que eu não sabia mas envolve que algumas ferramentas antigas ignoravam a última linha de arquivos caso elas não fossem preenchidas
```

imagem, assim todo mundo vai ter um código padronizado onde isso é garantido a cada save que você der em um arquivo.

imagem

imagem  
    

imagem




Minha amiga que possui um clube de assinaturas começou a utilizar o [**Growth Hacking**] após conhecer um pouco mais sobre ele.

Ela pediu a minha ajuda para ver como poderia começar a resolver um problema: a maioria das pessoas, que experimentavam o período gratuito do clube, não continuavam a assinar, ou seja, não pagavam pelo clube.

Queríamos entender o momento específico em que o usuário pensava em cancelar o plano e, nessa fase, abordá-lo com alguma ação que ajudasse a reverter a situação. Ela queria dar um empurrãozinho, ajudá-lo a entender o produto e, com sorte, manter a assinatura.

Mas será que existe alguma forma de entender o caminho que o usuário percorre e identificar com precisão esse momento em que ele desiste? Com isso poderíamos definir ações para este momento, fazendo com que os clientes continuem com o clube de assinatura.

Então, ela decidiu desenvolver essa trajetória dos clientes, da forma que acreditava que acontecia.

Começou a escrever em um papel as fases que ela acreditava que o cliente passava para assinar o clube de assinaturas:

- Interesse, no qual o cliente descobre o clube;
- Análise, onde o cliente começa a considerar assinar, mas ainda está avaliando;
- Assinatura gratuita: quando o cliente assina o clube, mas durante o período gratuito;
- Assinatura paga: quando cliente começa a assinar, de forma paga.

Nós avaliamos segundo o que acreditamos acontecer, mas, assim como um dos autores do livro "Hacking Growth", [**Sean Ellis**] diz, Growth Hackers não adivinham, testam.

Então, não conseguimos definir nada a respeito do nosso produto com precisão, baseadas no que achamos que acontece. Precisamos de algo que traga valores mais concretos do próprio usuário.

E como podemos fazer isso?

## Afunilando os dados

Assim como no [**marketing de conteúdo**], **existe um funil no Growth Hacking**, que vai mostrando os passos do cliente para nos ajudar a perceber os momentos em que os usuários se interessam e nos quais desistem de assinar. E que era muito diferente do pensado por ela.

Ela pensou que o funil era assim:

![]

Quando, na realidade, ele é dividido nessas etapas:

![]

**O funil de Growth Hacking**, em vez de nos apontar qual tipo de conteúdo devemos criar em determinada etapa - como é no funil de marketing de conteúdo -, ele nos mostra exatamente essa etapa em que poderíamos estar perdendo os clientes, para que, então, possamos definir ações e experimentos de Growth Hacking para melhorar essas etapas.

**As métricas** utilizadas para avaliar cada fase do funil variam de acordo com a forma com que a empresa lida com os clientes em cada fase, não sendo exatamente a mesma para todas as empresas. Assim, a empresa deve escolher quais são as métricas que combinam com o objetivo dela naquela etapa.

Então, o que precisamos de fato considerar quando montamos nosso funil?

# Funil do Growth Hacking

O funil de Growth Hacking possui cinco fases:

## Aquisição

A aquisição é a fase na qual o usuário começa a conhecer o clube de assinaturas. Esse conhecimento pode acontecer por meio de uma propaganda nas redes sociais, publicação de algum parceiro do clube, um conteúdo sobre clubes de assinatura, a busca da pessoa por chocolate ou até mesmo a publicação de outro usuário que decidiu compartilhar sua experiência.

Nessa etapa, as ações de Growth hacking são focadas em todo conteúdo e páginas que mostram como sua empresa, produto ou serviço podem auxiliar a pessoa, conquistando o cliente.

Então, quais métricas minha amiga poderia utilizar para avaliar o desempenho dessa fase?

As métricas que minha amiga decidiu avaliar foram:

- o número de visitantes no site, principalmente nas páginas de informações e depoimentos,
- gastos com propaganda e quantidade de pessoas que clicavam na propaganda.

## Ativação

Na ativação devemos proporcionar uma boa primeira experiência para o usuário. Então, a primeira página que ele acessa deve carregar rapidamente, ter um design que agrade e informações e conteúdos que chamem a atenção dele.

Além disso, nessa etapa, é quando o cliente realmente demonstra um interesse maior em adquirir o serviço. No caso do negócio da minha amiga, é quando eles fazem os testes e se inscrevem na newsletter para receber novidades do clube.

Logo, a métrica avaliada por ela nessa fase é a quantidade de pessoas que se inscrevem na newsletter de acompanhamento, na qual ela só envia conteúdos a respeito de chocolates e curiosidades a respeito do alimento.

## Retenção

A retenção é a etapa na qual o usuário se inscreve no clube de assinaturas pelo período gratuito de um mês ou assina a newsletter disponível no site. Isso quer dizer que ele se interessa e que quer estar sempre em contato com a empresa.

Nessa fase, minha amiga avaliou a quantidade de pessoas que se inscreviam para o período de teste de um mês gratuito do clube de assinaturas e de onde elas vinham. Analisava quantas pessoas se inscreviam sem participar da newsletter e quantas se inscreviam depois de receberem a **newsletter**.

## Faturamento

Nessa fase é quando o cliente sai do período de teste, ou acaba o mês gratuito do clube de assinaturas, e ele continua a fazer parte do clube, pagando para receber mensalmente a caixa de chocolates em sua casa. Dessa forma, ele passa a gerar um faturamento para o clube, tornando-se realmente cliente.

Então, ela começou a analisar exatamente este número: quantas pessoas, depois do período de teste, continuavam a assinar o clube e começavam a pagar para receber a caixa com chocolates.

## Indicação/Recomendação

Essa etapa é quando o cliente que já assina o clube compartilha sua experiência e indica o serviço para alguém. Pode ser por meio de alguma publicação nas redes sociais ou até mesmo recomendar diretamente, tanto por conversa com a pessoa quanto pela interface do clube, que permite que a pessoa convide amigos usando o e-mail.

Como não tem como fazer uma análise completa com o número de todas as pessoas que indicam o clube, pois muitas indicações podem acontecer pessoalmente e não dê para medir realmente, ela tentava acompanhar através dos compartilhamentos nas redes sociais do site e dos perfis do clube de assinatura.

Além disso, nessa etapa, ela sempre investiu bastante em trazer um bom atendimento para as pessoas, tanto no site, e-mail, quanto nas redes sociais.

Desta forma, ela passou a cultivar um contato com os clientes, criando um relacionamento. Assim, os clientes conheciam o clube, criavam uma simpatia e tinham mais propensão a indicá-lo para outras pessoas.

# Análise do funil de Growth Hacking

Diferente de um funil de vendas, as etapas do funil de Growth Hacking não são delimitadas e seguidas exatamente dessa maneira por todas as empresas.

No Growth Hacking, uma empresa pode ter duas etapas em uma, como a de retenção e faturamento, por exemplo: assim que uma pessoa começa a consumir, a empresa já começa a faturar.

Outro exemplo é a indicação vir antes do faturamento, que acontece quando uma pessoa conhece a marca, e mesmo sem comprar nada, se identifica e a indica para outra pessoa.

Analisando o funil, qual é a etapa em que o clube de assinaturas da minha amiga apresenta mais problema?

Já que os clientes desistem quando devem começar a pagar pelo clube, as primeiras ações no Growth Hacking do clube de assinatura devem ser focadas na etapa do faturamento.

Devemos pensar em pequenas mudanças na página de pagamento, nas formas de pagamento, analisando o custo de aquisição do cliente o quanto custa para que o cliente assine, desde propagandas até hospedagem, o valor da assinatura e toda a interface que diz respeito a essas etapas.

Assim, o funil de Growth Hacking, nos mostra o caminho que o usuário percorre até adquirir o seu produto, ou serviço. Desta forma, podemos identificar em qual fase desse trajeto o cliente está desistindo do clube de assinatura e criar experimentos e ações focados neste momento da compra do cliente para que ele continue com o clube.

Então, o próximo passo é criar experimentos e ações focadas nessa fase, para gerar a atenção do cliente para começar a pagar pelo clube.

Quer saber mais ainda sobre Growth Hacking? Que tal fazer o nosso [**curso Introdução ao Growth Hacking: crescimento para negócios digitais**]?




Cada vez mais comum no Brasil, a modalidade de [**trabalho freelancer**] requer alguns cuidados tanto da parte da empresa, quanto da parte do contratado.

Por ser uma relação onde não há vínculo empregatício, o freelancer tem a possibilidade de desenvolver seu trabalho [**para várias empresas ao mesmo tempo**].

Porém, muitas vezes o freela aceita fazer o trabalho sem a formalização do vínculo temporário. Ou mesmo a própria empresa contratante não toma esse cuidado, o que pode trazer várias complicações chatas.

Por isso, é importante elaborar um contrato de freelancer para firmar o acordo de trabalho temporário e, assim, evitar dores de cabeça.

Mas você sabe como elaborar esse documento? Continue com a gente e descubra!

## Identifique as partes envolvidas

Assim como todo contrato, é importante identificar corretamente e com detalhes tanto o profissional contratado quanto a empresa contratante. Isso quer dizer incluir dados como nome, endereço, documentação (CPF e RG para pessoas físicas e CNPJ para pessoas jurídicas), nacionalidade e estado civil.

## Descreva o trabalho

Uma descrição completa do que irá ser realizado pelo freela é um dos itens mais importantes do contrato. É essencial que todo o trabalho a ser entregue seja descrito com o máximo possível de detalhes, para que não existam reclamações de nenhuma das partes. Lembre-se de citar quaisquer [**tarefas a serem cumpridas pelo freelancer**], desde a mais básica até a mais complexas.

## Especifique as obrigações

Como qualquer contrato, cada uma das partes possui obrigações a serem cumpridas ao longo do desenvolvimento do trabalho. Seja um compromisso de viagem da parte do freelancer, por exemplo, seja o dever de fornecer estrutura por parte da empresa, é essencial descrever esses pontos detalhadamente.

## Estipule um prazo

Como o contrato de freelancer é feito diretamente para a execução de um trabalho específico, isso significa que ele deverá ter um prazo para acabar. Caso as tarefas tenham um cronograma de entrega ao longo da duração do trabalho, é importante também incluir esses prazos na cláusula. Lembre-se: quanto mais claro e detalhado for o contrato, melhor para ambas as partes.

## Defina a forma de pagamento

Essa cláusula deve conter valores a serem pagos ao freelancer, bem como a forma como esse pagamento será feito. Basicamente, esse item pode ser construído de duas maneiras:

- descrevendo o pagamento no final do contrato, onde é importante incluir datas e valores;
- ou detalhando a periodicidade dos pagamentos, no caso de um trabalho recorrente.

## Estabeleça regras para a rescisão

Uma das cláusulas mais importantes em qualquer contrato, a rescisão deve ser detalhada e estabelecida de maneira justa para ambas as partes, determinando sanções e multas para quando houver quebra unilateral. Ela deve conter apontamentos como devolução de valores, cobrança de multas e, principalmente, motivos que levem à rescisão contratual.

## Acrescente condições gerais

**Todas as outras condições contratuais devem entrar em cláusulas detalhadas. Elas irão variar muito de acordo com o tipo de trabalho a ser executado. Analise tudo que irá envolver a relação de trabalho freelancer-empresa e coloque no contrato caso seja necessário.**

## Inclua informações do foro

Como todo e qualquer contrato, é importante incluir as informações do foro onde o contrato será assinado. O foro deve ser definido a partir de um acordo entre as duas partes, sendo que quando empresa e freelancer são da mesma cidade, normalmente se usa o foro em questão. Nele serão decididas possíveis divergências entre as partes.

## Tenha atenção às características do contrato de freelancer

Apesar de não existir no Brasil uma legislação que regule o trabalho de freelancer, alguns pontos precisam ser respeitados. E o principal deles é: não deve haver nada que caracteriza vínculo empregatício entre as partes.

**Isso significa que não deve haver subordinação em nenhum nível na relação contratante-contratado. Como o freelancer não faz parte do corpo de funcionários da empresa, ele não deve ter obrigações de horários, uso de uniforme, ou controle de frequência, por exemplo.**

Em contrapartida, a empresa que decide contratar um freelancer também não tem nenhuma obrigação trabalhista com o mesmo. Por serem trabalhadores independentes e autônomos, freelas têm apenas os direitos estabelecidos em contrato, não cabendo a exigência de nada existente em contratos regulados pela CLT, como férias, FGTS, seguro-desemprego, auxílio de transporte, entre outros.

O profissional independente pode, apesar de tudo, se aproveitar da condição de empresário para emitir notas fiscais. No Brasil, esse modelo é regulado a partir do MEI (Micro Empreendedor Individual), pelo qual o freelancer poderá pagar seus impostos de previdência social, além da emissão de notas.

**Apesar de não possuir direitos regulados por uma entidade externa, tanto freelancer quanto a empresa contratante podem entrar com uma ação na justiça caso sejam lesados por descumprimento do contrato.**

## Busque orientação jurídica

Fuja daqueles modelos prontos que normalmente são encontrados na internet. Muitos deles possuem furos que podem ser explorados por qualquer uma das partes.

O ideal é buscar orientação jurídica para construir um contrato-padrão, o qual será adaptado de acordo com as especificações de cada trabalho. Geralmente, boa parte do contrato será a mesma para qualquer trabalho freelancer. Para cada trabalho a ser realizado, pequenos detalhes serão alterados, sendo que o grosso do contrato permanecerá o mesmo, garantindo mais segurança na relação.

**Se você trabalha ou é dono de uma empresa que tem o costume de contratar freelancers, essa tarefa talvez seja mais fácil para você, uma vez que o profissional muitas vezes terá que se adequar ao seu modelo já pronto de contrato.**

Caso você seja um profissional liberal que tem o costume de trabalhar para muitas empresas, também é importante ter um modelo de contrato. Ele será usado com empresas que não fazem uso do documento, além de ser uma boa maneira de argumentar com empresas que não possuem um contrato bem elaborado, ou mesmo abusivo.

## Formalize o contrato

Por último, mas não menos importante, é essencial que seu contrato de freelancer seja reconhecido em cartório. Apesar de, infelizmente, não ser uma prática muito comum para contratos mais simples, registrá-lo formalmente evita questionamentos em caso de divergências.

Mantenha uma cópia do contrato com você e outra com a outra parte envolvida. Assim, todos podem consultá-lo em caso de dúvidas, além, é claro, de ter o instrumento legal em mãos, caso seja necessária uma ação judicial.

É importante lembrar de **sempre consultar um advogado** na hora de criar seu modelo de contrato de freelancer!

Aproveite e siga a Alura no [LinkedIn], [YouTube] e [Facebook]!




Escutamos o tempo todo sobre os obstáculos e dificuldades que podemos encontrar quando decidimos começar nossa carreira… Mais ainda se já estamos em alguma atividade e optamos por migrar para alguma outra.

Em função disso, muitas dúvidas e receios acabam surgindo e a maior questão é:

> Como me preparar para enfrentar essa realidade?

A primeira coisa que todos precisamos ter em mente quando decidimos enfrentar o mercado de trabalho é que devemos estar dispostos a arregaçar as mangas e correr atrás do nosso foco.

Ok, isso parece uma dica bastante óbvia, mas muitos acabam se perdendo nesse caminho e perdem o foco do que realmente queriam conseguir. Saber o que realmente quer é essencial para começar.

E, certamente, existem alguns passos que precisamos entender melhor antes, afinal, o que seria “correr atrás”? Sair fazendo todos os cursos da minha área? Tirar todas as certificações possíveis? Será que o meu conhecimento já é suficiente para trabalhar na área?

O Yuri Bett, um dos alunos da Alura, nos contou um pouco dessa trajetória dele até conseguir seu emprego dos sonhos (dreamjob). Falou das suas experiências e processos, além de dicas interessantes para quem se encontra na mesma situação que ele há um tempo atrás.

> “Tem que realmente mergulhar de cabeça nos estudos, ser fora da média para se destacar dentre tantos nesse mercado tão concorrido e conseguir o emprego dos sonhos.”, comenta Yuri.

Ficou interessado? Confira então um pouco mais da história do Yuri baixando nosso Ebook!

[**Como profissionais de tecnologia se preparam para o mercado de trabalho**]




Em meu preparo para a certificação da Oracle, tive que lidar com a complexidade dos imports. Vamos verificar essa classe `Aluno`:

java

Agora vou adicionar os alunos em uma lista para formar uma turma. Para adicionar todos os alunos de uma vez usarei o método `addAll()` da interface `List`:

java

Analisando um pouco o nosso código, veja a quantidade de imports que tivemos que fazer do mesmo pacote. Será que não tem como importar as 3 classes de uma única vez? E se tentarmos:

java

Mas não compila! Vamos tentar de outra maneira:

java

Também não compila! Para **importarmos classes específicas** precisamos sempre de um import cada uma para delas ou então podemos **importar todas de uma vez** utilizando o "\*":

java

Agora teremos acesso a todas as classes do pacote java.util. Vamos supor que o meu sistema tenha as seguintes classes:

java

Se eu tentar **importar todas as classes** do pacote dao:

java

Terei acesso a todas as classes? Inclusive as classes de subpacotes? A resposta é... Não! Se quiser todas as classes de um pacote, precisa especificar **SEMPRE** qual o pacote que você quer:

java

Agora sim podemos acessar todas as classes do pacote dao e do pacote factory!

O que achou dos imports do Java? Não sabia o quão restrito poderia ser? Quer saber mais? Pensando nisso, o instrutor Guilherme Silveira criou a [**os cursos de certificação Java**] que especifica todas as peculiaridades da linguagem Java com 9 cursos preparatórios para a certificação da Oracle!




Mauricio Linhares, engenheiro de software da Digital Ocean, tem uma longa história até ir trabalhar nos Estados Unidos, mais especificamente na Philadelphia. Ele começou como muitos começaram: [trabalhando remoto](trabalho-remoto-e-home-office) para uma empresa de fora do Brasil, mas fazendo isso da sua própria casa em João Pessoa. Depois de uma jornada aparece a oportunidade de trabalhar fora. Dada a experiência com o inglês e de já estar ambientado a cultura de uma empresa americana, os próximos passos ficaram mais fáceis.

Quais tecnologias estudar? Como se preparar para pedir um visto de trabalho fora do país? Quando de inglês preciso saber? Mauricio Linhares conversa comigo desses assuntos nesse vídeo:

https://www.youtube.com/watch?v=TVQioHZi2S0

#Carreiras de brasileiros no exterior

Há um podcast que conta [histórias de brasileiros no exterior]. No carreira sem fronteiras você pode ouvir muitas pessoas que foram trabalhar com tecnologia, como o Felipe que foi para a Austrália ser programador:

<iframe src="https://open.spotify.com/embed-podcast/episode/5YiIGMYpmC9pWVkyhrQi4Z" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

Tem também a Andressa, que é cientista de dados no Canadá:

<iframe src="https://open.spotify.com/embed-podcast/episode/2bX9S7u3e8LJ96mIAxC1tE" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

E a Giovana, que é desenvolvedora no Facebook em Londres e já trabalhou com a gente na Alura quando morava no brasil:

<iframe src="https://open.spotify.com/embed-podcast/episode/3dDXAdCx2vSBpP2sAy3mus" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe>

E outros episódios com artistas, designers e jornalistas que decidiram encarar o desafio de uma outra cultura e outra língua! Vale conferir!




Quem opta por seguir uma carreira de freelancer tem vários benefícios, como flexibilidade de horários, não enfrentar congestionamentos diários no trânsito e liberdade para programar alguns dias de folga durante a semana.

No entanto, assim como todo trabalho, esse tipo de profissional também enfrenta diversos desafios. Afinal, manter a organização, a concentração e a produtividade são verdadeiros obstáculos.

Para cumprir as demandas diárias, é necessário planejar sua rotina, definir prioridades e programar cada tarefa para que ela seja concluída sem estresse e com qualidade. Mas como fazer isso?



## 1\. Escolha um local de trabalho

[**Quem trabalha em home office**] precisa organizar não só a rotina, mas também seu ambiente de trabalho. Uma boa organização dependerá do local que você escolher  em sua casa como seu escritório. 

Quando você escolhe onde executará as suas tarefas diárias, seu cérebro consegue entender que aquele momento é para trabalho e não para lazer. Além disso, outra vantagem desse espaço é que ele estará sempre preparado para você desenvolver suas atividades.

## 2\. Defina seu horário de trabalho

Ter flexibilidade de horários é o sonho de qualquer profissional freelancer, não é? Mas, para que você consiga entregar suas demandas, é crucial estipular qual será o horário do seu expediente. Geralmente, quando uma pessoa trabalha em home office, ela se perde facilmente entre o trabalho e lazer.

Uma rotina desorganizada leva o profissional a trabalhar várias horas por dia, inclusive à noite e aos finais de semana. E isso, obviamente, é muito ruim, pois o período de descanso é essencial para qualquer ser humano.

Nesse sentido, ao estipular um horário para trabalho você terá os seguintes benefícios:

- mais produtividade;
- mais tempo disponível para lazer;
- melhor planejamento da sua vida social.

## 3\. Crie um ritual diário

Qual é horário em que você acorda? Quando você faz o seu horário de almoço? Ter respostas para essas perguntas é muito importante para que você organize melhor o seu dia. Afinal, será mais fácil definir quando é o momento para trabalho e quando é o momento para lazer.

Então, aplicando esse ritual no seu cotidiano, você consegue cumprir as suas demandas com mais facilidade e evita a famosa procrastinação — que tanto prejudica aqueles que seguem carreira como freelancer.

## 4\. Estabeleça suas prioridades

De fato, grande parte dos freelancers ainda comete um grave erro quando organiza o seu dia de trabalho: não estabelecer prioridades para as suas demandas.

Não adianta pegar uma agenda e sair anotando as suas tarefas. Elas não possuem a mesma importância e, assim, você perderá tempo com um trabalho que poderia ser executado em outro momento. 

Contudo, existem alguns critérios que você pode utilizar para escolher as demandas mais urgentes. Os principais, em ordem de importância, são:

- **Prazo da tarefa**: produza primeiro os conteúdos que possuem um prazo menor para ser concluído. Nunca é demais lembrar que a pontualidade é essencial para um freelancer. 
- **Nível de dificuldade da tarefa**: suas produções estão em dia? Então, avalie a qualidade da tarefa para descobrir por onde começará o seu trabalho. Recomendamos que você inicie o seu dia com as tarefas mais complicadas, afinal, você terá mais energia para pensar nas melhores ideias. As fáceis deixe por último, pois o seu cérebro estará cansado e não será necessário pensar muito sobre um determinado projeto. 
- **Conhecimento prévio: **inicie o seu dia com as tarefas que exigem mais pesquisas. Com o corpo mais descansado, sua mente estará mais tranquila para absorver as informações e você estará mais disposto a conhecer novos assuntos.

## 5\. Programe cada atividade

Desafios e surpresas são bem comuns no dia a dia de um freelancer, pois é difícil prever se cada job será fácil ou difícil. E o tempo necessário para concluir cada demanda dependerá da complexidade do material.

Então, para evitar que você demore muito tempo em uma tarefa e prejudique sua rotina, crie o hábito de programar as suas atividades.

Dessa forma, além de avaliar a sua produtividade com mais clareza, você poderá organizar sua rotina com mais praticidade, já que terá conhecimento sobre o grau de dificuldade das suas tarefas.

## 6\. Estabeleça limites para as suas tarefas

O excesso de tarefas também pode prejudicar a sua rotina: não adianta ter várias demandas se você não consegue entregá-las dentro do prazo.

Quando você não cumpre com o combinado, certamente a sua credibilidade será afetada. Como consequência, terá menos trabalhos para criar no futuro, pois a confiança entre você e seu cliente ficará estremecida.

Portanto, ao listar quais tarefas serão executadas ao longo do dia, considere somente aquelas que você tem certeza de que concluirá.

## 7\. Fique longe dos vilões da organização

É maravilhoso quando você consegue colocar todas as orientações no papel, não é? Ao lado da organização, aparece a produtividade e mais qualidade de vida!

No entanto, tudo isso pode se perder se você não conseguir vencer os vilões da produtividade. E, para isso, é necessário manter a disciplina, pois eles são muitos e bem tentadores.

Estes são apenas alguns deles:

- televisão ligada;
- redes sociais (facebook, twitter...);
- serviços mensageiros (whatsapp, telegram...);
- videogame;
- preguiça;
- relacionamento com familiares e outros membros da casa.

De fato, uma das maiores dificuldades de quem segue carreira como freelancer é explicar para seus familiares ou membros da sua residência como ocorre a sua rotina. Afinal, apesar de você trabalhar em casa, eles não podem perturbá-lo toda hora. 

## 8\. Dê presentes como prêmio para si mesmo

Nada é mais gratificante para um freelancer do que quando ele consegue terminar uma tarefa para um cliente, que a aprova sem nenhuma alteração. E um desempenho como esse merece ser comemorado, então, aproveite a oportunidade para se dar um presente!

Os benefícios podem ser variados. Já que o seu escritório é em casa, passe um tempo com a família, jogue um videogame ou assista a sua novela preferida. Qualquer coisa que te relaxe pode ser interessante.

E não use o tempo livre para adiantar outras demandas. Lembre-se: é importante reservar um tempo para si mesmo.

## 9\. Reserve um período para se organizar

Essa dica pode até parecer estranha. De fato, com a correria do dia a dia, esse detalhe passa despercebido e informações importantes podem se perder em rascunhos, arquivos ou papéis.

Mas é mesmo essencial separar um período do seu dia para organizar como será a sua semana. Só assim será possível economizar e preparar o seu tempo.

Use o domingo à noite ou a segunda de manhã para deixar tudo em ordem, pois nesses dias você já sabe como será sua semana. E não se esqueça de reservar um espaço para imprevistos — eles sempre acontecem, e podem prejudicar o seu trabalho.

## 10\. Use a técnica Pomodoro

Por fim, há uma técnica que vale muito a pena indicar. Desenvolvida pelo italiano Francesco Cirill, a técnica pomodoro se baseia na teoria de que, quando dividimos o fluxo de trabalho em blocos, tanto a nossa produtividade como nosso foco aumentam em um dia de trabalho. E, nesse caso, cada bloco é denominado de Pomodoro.

Então, para aplicar essa técnica em seu dia a dia, siga os seguintes procedimentos:

1. enumere suas tarefas que ainda não foram finalizadas;
2. com o auxílio de um cronômetro, programe o tempo limite para concluir sua tarefa. Estabeleça 20 minutos;
3. execute uma tarefa e termine-a sem interrupção. Para isso, lembre-se de eliminar os vilões da organização;
4. quando o tempo terminar, faça uma pausa de cinco minutos. Aqui é permitido caminhar pela casa, interagir com a sua família ou até conversar com amigos nas redes sociais;
5. assim que concluir sua tarefa, lembre-se de riscá-la da sua agenda;
6. depois, continue o seu trabalho. E, novamente, aplique a técnica por mais 25 minutos;
7. quando concluir quatro “pomodoros”, estabeleça uma pausa de 30 minutos.

Por fim, para conseguir resultados com essa técnica na carreira de freelancer, coloque no papel quantos pomodoros foram necessários para finalizar as suas tarefas. E não se esqueça desse procedimento, pois ele ajuda a entender quanto tempo foi necessário para terminar as demandas. 

Então, agora que você já sabe como deixar a sua [**carreira como freelancer**] mais organizada, sugerimos que pratique essas técnicas diariamente. Afinal, a prática leva à perfeição! E, caso você tenha alguma dúvida relacionada ao assunto, aproveite a oportunidade e deixe o seu comentário! ;)





imagem 

Estamos desenvolvendo um sistema web para uma empresa de ensino online. Nesse sistema é necessário que o usuário preencha um cadastro inicial, nada muito trabalhoso, apenas o nome, data de nascimento e o estado onde ele reside.

Temos o seguinte formulário de cadastro:

imagem**] da classe `Map`. Ele nos devolve um [**Set**], que, basicamente, é uma coleção de elementos únicos, logo, não se repetem.

Agora vamos iterar sobre o retorno desse método para vermos se nosso método está realmente retornando todas as siglas:

java

Ao executar esse código, obtemos o seguinte resultado:

imagem**] da classe `Map`. Ele nos devolve um `Set<Map.Entry<K, V>>`, onde K e V são os tipos da chave e do valor respectivamente do nosso mapa. Esse retorno nada mais é do que uma entrada contendo a chave e seu respectivo valor.

Vamos iterar esse `entrySet()`:

java

Como resultado desse código, temos o seguinte:

imagem**] e [**getValue()**] de [**Map.Entry**]:

java

E como resultado, temos:

imagem**] que retorna uma coleção contendo os valores do mapa. Assim:

java

Ao executar esse código:

imagem**] da interface `Map` para pegar seu respectivo valor. Dessa forma:

java

Para testarmos, vamos mandar a sigla RJ:

java

O resultado é exatamente o que esperamos:

imagem`

java

Se quiser conhecer mais sobre as milhares de funcionalidades trazidas pelo Java 8 confira o curso [**Java 8: Tire proveito dos novos recursos da linguagem**] da Alura.

Quer dominar de vez mapas e coleções? Aqui na **Alura** temos uma [**formação em Java**]. Lá é mostrado a fundo cada coleção e, também, possui um capítulo só sobre mapas. Vale muito a pena dar uma conferida.




Quando estamos desenvolvendo um aplicativo temos uma grande possibilidade de ter que consumir dados de algum servidor, portanto precisamos fazer alguns códigos para fazerem a comunicação e, por boa prática, centralizamos esse código numa classe especialista para realizar a comunicação :

java

Até a versão 4.0 do Android estavámos acostumados a utilizar a [biblioteca da Apache] para fazer essa comunicação. Após a versão 4.0, foi recomendado usar a biblioteca nativa do java. Vamos ver como fazer um **GET & POST** utilizando essa biblioteca, vamos adotar que no **POST** enviaremos um JSON.

java

Geralmente a nossa classe `WebClient` fica mais ou menos com essa carinha, uns métodos a mais para fazer outros tipos de requisição. Contudo, essa classe está muito verbosa, estamos digitando bastante. Deve ter alguma forma de melhorar esse código e é o que iremos fazer.

Vamos usar a [biblioteca OkHttp] para facilitar nossa vida !

Para trazermos ela para nosso projeto temos que registrá-la no nosso **gradle** :

java

Para conseguirmos usá-la, teremos que criar um objeto do tipo `OkHttpClient`, que será responsável pela comunicação.

java

Temos que pedir para nosso client fazer a requisição ao servidor, para isso usaremos o método `newCall()`, que quando for executado devolverá a resposta do servidor :

java

Estamos fazendo uma chamada que faz a requisição, mas não definimos qual é a requisição que queremos fazer. Portanto temos que criar a nossa requisição :

java

Como vimos no código, criar uma requisição na mão daria muito trabalho, por esse motivo estamos usando um `Builder`, atráves dele passamos as informações que são necessárias, como a URL. Para escrever no corpo do nosso POST usamos o objeto `RequestBody`, para criar este objeto usamos o método estático `create`, que recebe um identificador do tipo do arquivo, representado na classe `MediaType`, e recebe o objeto que será escrito no corpo.

Agora com o corpo da requisição pronto, temos que informar ao nosso `Builder` que nossa requisição será um POST, passando o corpo da requisição. Com isso pronto, basta criarmos a requisição, atráves do método `build()`.

Feito tudo isso, falta agora pegarmos o corpo da resposta e devolver como resposta do nosso método, igual fazíamos antes :

java

Para pegarmos o corpo da resposta, temos o método `body()`, que retorna um `ResponseBody` e para transformarmos ele em `String` usamos o método `string()`. Desta forma, o nosso **POST** está terminado, ficou faltando fazermos o **GET** :

Java

Como podemos ver, não muda praticamente nada do que fizemos anteriormente, exceto por não termos que falar que estamos fazendo um GET, pois já é definido por padrão.

Qual você prefere, a utilização da biblioteca nativa do Java ou usar a biblioteca `OkHttp` ? Vimos aqui como utilizar a biblioteca do OkHttp 3 para facilitar nossas requisições, evitando muito código e de leitura bem mais simples !

Quer saber mais sobre Android ? Aqui no Alura temos alguns cursos bem bacanas, confere [clicando aqui] !





imagem 

Uma empresa de estacionamento precisa registrar o dia e hora de entrada e saída dos carros e, atualmente, realiza esse processo manualmente, inserindo no sistema cada informação em um campo separado:

Entrada:

csharp

Saída:

csharp

No final do mês, ao analisar em uma tabela a lista de entradas e saídas tínhamos alguns valores meio estranhos:

```
Data (entrada - saída)| Hora (entrada - saída)
----------------------------------------------
12102000 1210000      | 12h30 - 11h30
----------------------------------------------
08/03/2019 10/02/2019 | 11:00 - 11:00
----------------------------------------------
01-02-2015 05/08/2019 | 10:00h - 10:30h
----------------------------------------------
00-00-0000 20/02-2006 | 23:00h - 14:30h
----------------------------------------------
31-12-2012 30-12-2012 | 12:00h - 13:00h
----------------------------------------------
2018/02/24 2018/03/07 | 11:00am - 22:00pm 
----------------------------------------------
```

Essa tabela tem algumas datas que estão com os valores formatados sem padronização, além de ter valores que não têm sentido, por exemplo:

- Entrada com data posterior a da saída (ENTRADA: 31-12-2012, SAÍDA:30-12-2012);
- Entrada com valores zerados, como (00-00-000);
- Horário com padrão americano (am e pm), indicação de horas com "h" e sem, etc. americano.

Então, para evitar este tipo de erro, podemos deixar uma formatação já pré-definida, ou seja, podemos criar um padrão para que esses valores sejam recebidos sempre da mesma forma. Assim garantimos que apenas surgirão valores padronizados e essa confusão deixa de existir. Mas como fazemos isto em C#?

Atualmente, o valor recebido de data e hora está contido em uma **String**. Com isto nós podemos colocar qualquer valor nela seja em texto ou em número, mas a String pode conter erros de formatação e, além disso, do jeito que está implementada agora não contém nenhuma validação.

Utilizar String para fazer a formatação e validação demandaria muito tempo e código, pois teríamos que fazer a formatação muito detalhada, validando cada fragmento de data e hora, como por exemplo funções para validar se está com os valores corretos. Felizmente, no C# temos um tipo específico para fazer essa validação e formatação de data

## Formatação de data e hora

No C# temos o **DateTime** que é uma classe específica para trabalhar com data e hora e também formatar de maneira mais fácil e ainda contém algumas funções para data e hora.

Vamos utilizar a instância direta do DateTime:

csharp

E teremos esse resultado:

csharp

Este não é o resultado que nós gostaríamos. Este valor é retornado quando não passamos nada no **construtor**, pois é a data padrão que está no definida no DateTime. Então vamos passar os valores para o construtor desta vez e ver como fica. Ele espera os valores de: ano, mês, dia, hora, minuto, segundo.

Então vamos usar como por exemplo a data: 01/05/2019 e a hora 13:52:22. Quando colocarmos os valores no construtor, a **variável** terá, por padrão, os valores que estão definidos no construtor.

Depois disso criaremos as variáveis de ano, mês e dia para o código ficar mais legível e atribuir elas no construtor do nosso DateTime.

csharp

Mas como mostramos nosso horário formatado na tela? Usamos o **Console.WriteLine** para isto.

csharp

Nosso valor de saída então vai ser:

csharp

Porém com isto a hora está com os valores padrão do construtor, então vamos colocar a hora, minutos e segundos, então vamos fazer o mesmo procedimento atribuindo os valores nas variáveis e colocar os valores no construtor.

csharp

Nossa saída vai ser:

csharp

Nossa saída está de acordo com data, hora e formato o nosso sistema operacional ou seja se por exemplo nós rodamos este mesmo código em um [**compilador online**] que a data, hora e formato está com formato americano qual vai ser nossa saída?

A nossa saída vai ser em formato americano, pois está pegando de acordo com o que está definido no sistema.

csharp

Para que isto não aconteça vamos definir o locale da queremos a data, como podemos fazer isto? Vamos primeiramente importar duas bibliotecas a **Threading** que é a de criar um thread (um novo processamento, no nosso caso para a formatação) e o **Globalization** para definirmos a região que queremos.

Para importar as bibliotecas temos que fazer assim e vamos por no topo do nosso código para que fique mais organizado:

csharp

Como no compilador online não funciona, vamos testar mudando o nosso horário, que está com o formato brasileiro, para o formato americano, passamos no construtor o formato que queremos, "en-us," e o outro se é necessário usar as configurações de cultura do sistema.

Então vamos colocar a modificação do horário antes da formatação da data.

csharp

Sendo assim nosso código fica do seguinte jeito:

csharp

E teremos a seguinte saida:

csharp

Vamos fazer a troca do **en-us** para o pt-BR para que sempre que tivermos uma data ela fique no padrão brasileiro.

csharp

Mas toda vez que a gente tiver uma entrada ou saída nova temos que declarar isso no construtor e ainda assim continua um processo manual, podendo acontecer erro mais uma vez.

Para que este processo não seja todo manual, temos que procurar uma função que pegue o valor atual da hora e data para fazer essa atribuição. Mas qual função usar?

## Vamos trabalhar com o Now

Vamos utilizar a função **Now** do Datetime, que pega a data e hora atual do seu sistema operacional, com isto ele faz a atribuição do horário para variável de maneira automática.

E como definimos para pegar a formatação do Brasil, não precisamos nos preocupar como vai vir a data e nem se ela será digitada errada.

csharp

Nosso valor de saída vai ser a hora atual do meu sistema.

csharp

## Conclusão

Nós começando com datas mal formatadas, onde não havia padronização e nenhum tipo de validação para saber se a data está certa, o que dificultava o trabalho de quem precisava analisar esses valores depois.

Poderíamos utilizar uma **String** para fazer esta validação e formatação de data, mas isto seria muito complicado, pelas questões de tempo e de código, que ficaria gigante.

Para isso utilizamos o **DateTime**, que formata nossa lista de uma maneira mais padronizada e de fácil compreensão para quem vai analisar ela, as data vão ficar formatadas de maneira correta e de mais fácil compreensão.

E aí, o que achou do post? Fica até mais fácil trabalhar com datas no c# agora, não acha?Se quiser continuar estudando sobre o assunto, dê uma olhada em nossos cursos na Alura de [**C#**] continue aprendendo!




A **JTA** é uma especificação do Java que facilita o trabalho com transações distribuídas, geralmente entre um servidor de aplicação com um banco de dados relacional. Além de interfaces e métodos, há anotações do Java que facilitam o trabalho, evitando que seu código fique cheio de 'commits' e 'rollbacks' óbvios espalhados por aí.


# Obtendo uma transação manualmente

User managed transactions

(exemplos de codigos curtos com cada cenario)

no hibernate/JPA? 

no Spring?

no Container CDI?

# rollback e timeout



# Container-Managed Transactions e suas anotações





imagem 

Uma editora de livros é seguida nas redes sociais por jovens entre 20 e 34 anos (principalmente) e suas publicações são somente textos que dizem coisas como:

> "Um novo livro foi lançado hoje com a propositura de apresentar um novo mundo de fantasia para os leitores ávidos por essas aventuras".

Esse texto possui uma **linguagem muito formal** para se comunicar com jovens. Entender a linguagem com a qual devemos conversar com o nosso público-alvo é essencial, porque será por meio dela que um relacionamento entre a marca e o cliente será criado para que, eventualmente, ocorra a venda.

Fazemos parte da equipe de marketing dessa editora e vamos utilizar um método para definir qual a melhor linguagem para o seu público e, dessa forma, conectar-se com ele.

## Primeiro passo: Conhecendo o público

Pensamos em três formas para conhecer nosso público. A primeira foi entrar em alguns perfis de pessoas que nos seguem nas redes sociais, principalmente aqueles que mais interagem com o perfil da editora.

Assim, começamos a anotar como a maioria delas se comporta em cada rede social. Notamos que muitas utilizam gifs no twitter, imagens mais elaboradas e textos mais longos no Facebook, e imagens bonitas com frases curtas no Instagram.

A segunda forma foi analisarmos nossos números e **métricas** de cada rede social. O Facebook e o Instagram apresentam, em uma ferramenta própria deles, qual a faixa etária e a cidade da maior parte do seu público.

Por último, montamos um formulário que enviamos para quem já é cliente da editora, possui uma conta na loja e já efetuou ao menos uma compra. O objetivo do formulário era conhecer mais os clientes, seus hábitos de leitura e de compra.

Fizemos as seguintes perguntas no formulário:

- nome,
- idade,
- gênero,
- região em que mora,
- profissão,
- quanto tempo passam na internet,
- quais as redes sociais que estão cadastrados,
- gênero literário favorito,
- por qual meio compram livro normalmente - online ou livraria/sebo
- quantos livros compram, em média, por mês e
- quantos livros leem por mês
- se compram mais e-book ou livro físico
- qual outro hobby eles praticam, além de ler.

A partir das respostas do formulário, vimos quais são as redes sociais mais usadas pelos nossos clientes e quais os principais interesses da maioria deles analisando qual a resposta escolhida pela maior parte. Assim, fomos capazes de traçar, cada vez com maior precisão, o perfil de nosso público para, assim, saber como será nossa comunicação com ele.

Com essas informações das pesquisas, tanto do questionário quanto nas redes sociais, descobrimos que nosso público mudava bastante do Facebook para o Twitter.

Também levamos em conta a questão dos canais pelos quais queremos nos comunicar com as pessoas. Cada um tem um tipo de público, que, por sua vez, possui um tipo de linguagem. Então, em cada canal devemos ter uma **linguagem diferente de acordo com a maior parte do público que o utilizada e com o nosso objetivo naquele canal.**

Por isso, decidimos focar primeiro em criar toda nossa linguagem para somente uma rede social. A escolhida foi o Twitter, já que notamos que a maior parte da nossa interação direta com as pessoas acontecia naquele perfil.

## Segundo passo: Criando personas

Outra dado que descobrimos foi que a maioria das pessoas que respondiam que gostavam mais de mexer no Twitter eram mulheres, universitárias, que leem mais livros impressos.

Quando fomos analisar as métricas e o perfil dos nossos seguidores no Twitter, essas informações bateram! Revelando que a maioria dos perfis que nos seguem são mesmo de mulheres, o que mostra que nossa análise está dando certo!

Então vamos fazer uma abordagem mais focada na linguagem que a maioria dessas pessoas usam.

Entrando no perfil de algumas delas também vimos que a maioria era comunicativa, sempre entrando em contato com as marcas e empresas que acompanhavam. Além de sempre compartilharem os livros que leem, fazendo pequenos comentários com fotos e gifs.

Não seria mais fácil então definir a linguagem que vamos utilizar se fossemos falar com uma pessoa em específico, a qual conhecemos os hábitos e gostos?

E se pegarmos essas informações da maioria do nosso público, principalmente aquele que interage com nossas redes sociais, e criássemos uma pessoa que poderia ser nossa cliente?

Assim, focando em uma pessoa em específico, podemos ter uma visualização e ideia mais concreta de para quem estamos vendendo, causar mais empatia pela pessoa e, neste caso, descobrir uma maneira correta de nos comunicarmos com ela.

Com todas as informações que coletamos, criamos, então, a cliente fictícia abaixo para definir nossa linguagem no Twitter e escolhemos a seguinte imagem para representá-la.

![]

> _Laura Cordeiro, 22 anos, estudante da faculdade de Letras, solteira, mora com os pais. Tem como hobbies ler, viajar, fotografar, ir aos museus, navegar pelas redes sociais, principalmente o twitter. Família de renda média alta, está em um estágio na sua área, prefere ler livros impressos e tem uma estante cheia deles. Compra de 5 a 8 livros por mês, porém, lê cerca de dois por mês. Lê em todo lugar possível: casa, faculdade, metrô, ônibus, entre outros. Cresceu lendo livros como Harry Potter e Senhor dos Anéis e, por isso, gosta muito de livros de fantasia, porém, segundo ela, não consegue mais encontrar livros bons desse gênero. Também encontra dificuldades em carregar livros muito grandes, já que passa o dia inteiro fora de sua casa. Gosta de piadas e memes atuais que estão em alta nas redes sociais. Queria encontrar mais livros de fantasia e descobrir novas maneiras de ler mais, entretanto sem carregar muito peso. Quer momentos agradáveis lendo livros, que ela possa ler em qualquer lugar, afinal gosta muito de ler e qualquer tempo livre disponível, ela aproveita para fazer isso._

Essa pessoa que criamos para representar nossos clientes, com características da maioria deles, é a nossa **persona**.

Existem outras formas de criar uma persona, como, por exemplo, [**a proto-persona**], mas optamos por somente descrever as características e personalidades dela e definir uma foto, para que possamos vê-la e saber cada vez mais com quem estamos conversando.

Legal! Agora já temos nossa persona, mas como será a linguagem que vamos utilizar para falar com ela? Depois de sabermos todas as características dela, não é mais fácil saber qual o melhor tipo de conteúdo que podemos criar para ela?

## Terceiro passo: defina a linguagem

Com uma pessoa em vista, que no caso é a **persona** que criamos, pensamos com mais detalhes no tipo de abordagem que usamos para nos comunicar com ela.

Primeiro, refletimos a respeito de qual nosso objetivo de nos comunicarmos com essas pessoas, que, no caso, é nos aproximarmos dos clientes por meio desses canais para, no fim, vendermos mais livros.

Como uma das questões da personalidade dela é gostar de piadas e memes, incluindo gifs, pensamos em utilizá-los bastante, para chamar a atenção e, então, provocar uma interação. Laura também procura mais livros com novas aventuras de fantasia, então, queremos apresentar livros exatamente como os que ela procura.

> Você já pensou em conhecer um universo completamente novo? Conheça mais sobre a galáxia Lix, o cenário desse novo livro que vai te surpreender!

Para este post, como é um novo universo e propomos para a pessoa explorá-lo, consideramos que isso seja incrível e deixe a pessoa surpresa. Ultimamente, quando há algo que choque, as pessoas dizem que aquilo "explode a mente". Pensando nisso, utilizamos um gif no qual alguém faz o movimento típico dessa expressão.

<iframe src="https://giphy.com/embed/26ufdipQqU2lhNA4g" width="480" height="480" frameborder="0" class="giphy-embed" allowfullscreen></iframe>

[via GIPHY]

Assim, definimos que a nossa linguagem no Twitter será informal, recheada de sugestões de leitura e gifs.

Porém, como já dissemos antes, nosso público muda do Twitter para o Facebook, por exemplo. Como podemos definir, então, a linguagem para o Facebook?

No caso do Facebook, no qual há uma variedade muito grande de usuários, criamos mais de uma persona. Assim, podemos diversificar entre os vários tipos de linguagem que poderão agradar a todos.

E, se depois de um tempo, o nosso público nas redes sociais mudar? Podemos continuar com a mesma linguagem ou será que isso afastará essas pessoas?

Como sabemos que é importante ter uma linguagem para cada tipo de público, percebemos que é muito importante validar e atualizar essas personas de tempos em tempos. Nosso público pode ter mudado ou pode ter mais pessoas que darão base para uma nova persona. Assim, deverá ser definida uma nova linguagem para conversarmos com eles.

Definimos que a cada três meses iríamos fazer essa validação, por meio de pesquisas sobre os nossos seguidores das redes sociais e reenviando o formulário, principalmente, para os novos clientes. Assim poderemos, se necessário, Recriar as personas já feitas e definir novamente a linguagem.

Percebemos, então, a necessidade de escolhermos nossa linguagem nas redes sociais, pesquisando mais sobre nossos clientes e o público-alvo, por meio de envio de formulários e análise de pesquisas. É importante definir para qual canal será criada determinada linguagem, e criarmos uma persona de acordo, que é um cliente fictício validado a partir das informações dos clientes reais. A partir disso, saberemos como nos comunicar com essa pessoa, com base em como ela fala, se comporta e vive.

Se você quiser saber um pouco mais sobre marketing de conteúdo, confira no curso [**Marketing de Conteúdo: Uma introdução ao Marketing de valor**]. Caso também queira saber mais sobre personas e até mesmo como criar uma, faça o curso [**UX Strategy: divergindo e afunilando ideias**], que fala sobre a criação de personas para a experiência do usuário.




Me interesso muito por edição de vídeos, já aprendi os princípios e ferramentas básicas e gravei as primeiras cenas de um curta-metragem sobre cachorros que estou desenvolvendo,
agora vou começar a trabalhar no processo de **colorização na pós-produção**.

Minha equipe utilizou duas **câmeras** de marcas diferentes para capturar o vídeo e assim registrar dois **ângulos diferentes** dos nossos personagens em ação. A ideia era que na pós-produção, na hora de editar o curta, fizéssemos os cortes e juntássemos estas duas imagens, concebendo a cena desejada.

Quando subimos o material para a edição percebemos uma diferença sutil nas imagens das duas câmeras:

imagem, e podia ser assistido em um aparelho chamado **kinetoscópio**, sendo um processo muito artesanal, lento e dispendioso, mas que revelava um novo mundo para a história dos filmes.

Passando pela colorização de três películas da **Technicolor** até o primeiro longa-metragem colorido que arrebatou as bilheterias dos cinemas da época, "…E o vento levou", de 1939, hoje temos inúmeras possibilidades de colorização que crescem cada vez mais com o avanço das tecnologias, e neste processo surgiu o **colorista**: profissional especializado em tratamento de cores na pós-produção de vídeos.

imagem que diz em inglês: No novo esplendor da tela… A imagem mais magnífica de todos os tempos!”, se referindo às cores apresentadas.

Alguns diretores têm como marca registrada o uso de cores, como Wes Anderson. Em seus filmes cada personagem possui a sua própria paleta,geralmente em tons pastéis e suaves que acompanham o personagem nos cenários onde passa e em seu figurino durante toda a narrativa. Seus filmes são conhecidos pela harmonia de cores e suas paletas são sua [assinatura] artística.

imagem, de Wes Anderson._

A liberdade de uso de cores é tão ampla nos dias de hoje que filmes recentes foram pós-editados em preto e branco, como "O Artista" (2011), de Michel Hazanavicius, e "Roma"(2018), de Pablo Berger. Por uma questão conceitual do roteiro os filmes foram mostrados ao público em escala de cinza, remetendo à tempos antigos, porém, com um balanço de tons impecável gerado pelas possibilidades tecnológicas.

imagem, de Alfonso Cuarón._

E aí? O que achou desse artigo? 

Para se aprofundar ainda mais no tema conheça [**o curso da Alura**] num software promissor que está sendo muito difundido no mercado e perfeito para executar tratamentos de colorização: o **DaVinci**.





Será que existe alguma maneira de reverter os caracteres de uma String em JavaScript?

javascript

É... Parece que não...

Mas um Array tem essa função de reverter:

javascript

**Poderíamos transformar a String em Array com `split`, reverter esse Array e transformá-lo novamente em String com um `join`.** Tipo:

javascript

Funcionou!

Seria legal se pudéssemos colocar esse nosso código na String do JavaScript... O incrível é que podemos!

javascript

No código anterior, usamos o `prototype` de String: um objeto compartilhado por todas as Strings do JavaScript. Ao colocar a nova função `reverse` como propriedade desse `prototype` das Strings, estamos colocando essa nova função para todas as Strings!

javascript

Essa técnica de mudar detalhes da linguagem (como String), colocando código a mais é chamada de **Monkey Patching**, ou **remendo** em bom português. O pessoal mais experiente recomenda que você **não use** isso em seus projetos. Poder pode, mas não deve... Imagine se todas as bibliotecas que você usa fizessem esse tipo de coisa com a String... Ia virar uma bagunça!

**Aprenda mais sobre a linguagem Javascript com [nossos cursos de Javascript]. Se preferir cursos presenciais, temos a [Formação Front-End] na Caelum.**




Bom, mais um dia na vida do desenvolvedor e, ao chegar no trabalho, no mural de tarefas, temos a criação de uma feature nova.

imagem on <a href='https://codepen.io'>CodePen</a>. </iframe>

Observe que nesse arquivo adicionamos apenas classes para estilizar a nossa página.

Como nossas tags html já foram criadas com classes baseadas no que cada elemento seria, fica mais fácil de estilizar no CSS só chamando a classe usando o ponto (`.`) antes do seu nome.

## Infelizmente nem tudo são flores...

Embora tenha ficado fácil estilizar, quando salvamos o código e testamos o novo pedaço da interface no ambiente de desenvolvimento, ele apresenta um conflito visual com algo que já havia sido implementado.

imagem.

## Momento análise

O conjunto do html e do css para gerar a parte visual do _infousuario_, pode ser representado de que forma?

> _"Ahh, ele é um pedaço dela!"_

Isso! Nosso arquivo **infousuario.css** junto com o trecho HTML referem a um pedaço do site, algumas pessoas chamam de **bloco** outras de **componente**.

No geral, esse é o cara responsável por vários elementos dentro dele que compõem o que iremos ver sobre o usuário. Tendo isto em mente, tudo que tiver dentro desse cara deve ser estilizado a partir dele, como por exemplo:

css

Mas veja que do jeito que está, ainda temos o risco dos aninhamentos que sobrescrevem coisas!

## Utilizando o padrão BEM

Para fugirmos desse caso de sobrescrita dos nossos estilos, podemos utilizar um padrão de escrita de seletores que vem sendo bastante utilizado pela comunidade de front-end chamado [**BEM**]:

css

Nesse cenário temos uma classe ao invés do aninhamento, os dois underlines podem até soar estranho de início, mas o BEM estabelece por meio deles uma relação de elemento pai e elemento filho sem aninhamento. Sendo o pai um **b**loco e o filho um **e**lement (**be** que vem do **BE**M).

Do jeito que fizemos aqui já estamos evitando conflitos de CSS com uma classe `.avatar` que estiver solta pelo código :)

imagem on <a href='https://codepen.io'>CodePen</a>. </iframe>

Agora nosso CSS não está mais conflitando! \\o/

> _"Mas, e se eu quiser reaproveitar algum estilo?"_

Boa pergunta! Um cara perfeito para analisarmos o reaproveitamento é o nosso avatar.

css

Quando definimos o `border-radius` como `50%`, estamos deixando o avatar sendo um circulo por padrão, mas caso quisermos que ele seja assim apenas em determinados casos, podemos dizer que, ser circular é uma **modificação** deste **elemento** dentro do **bloco** `infoUsuario`.

Para criar o seletor dele nós escrevemos as classes com dois hífens, `.avatar--circular` utilizando assim o M do BEM (modifier) que serve para representar a modificação de um elemento (nesse caso para deixar circular ou em um menu para deixá-lo ativo). Isso deixaria nosso CSS assim:

css

<iframe height="500" scrolling="no" title="#03  - CSS do BEM" src="https://codepen.io/soutomario/embed/WENymv/?height=265&amp;theme-id=0&amp;default-tab=css,result&amp;embed-version=2" frameborder="no" allowtransparency="true" allowfullscreen="true" style="width: 100%;">See the Pen <a href='https://codepen.io/soutomario/pen/WENymv/'>#03 - CSS do BEM</a> by Mario Souto (<a href='https://codepen.io/soutomario'>@soutomario</a>) on <a href='https://codepen.io'>CodePen</a>. </iframe>

## Criando componentes reutilizáveis

Agora nosso avatar tem seus estilos bem definidos e fica mais fácil trabalhar com ele, mas o avatar circular é utilizado em diversos pontos no site da alura: infosUsuario, header, forum…

O que podemos fazer ao invés de reescrever toda vez o `border-radius` em cada um dos lugares que ele aparece?

> _"Podemos criar um componente avatar!"_

Exatamente! Um único ponto que precisamos levar em conta é que, o estado de ser um círculo e ter a borda borda azul alteram um estado padrão do avatar. Seguindo essa linha, temos o seguinte resultado:

css

Agora a única propriedade CSS que precisamos alterar no nosso **infousuario.css** é o margin-top:

css

Com isso nosso componente está pronto! Também estamos com tudo certo para adicionar as novas funcionalidades nos nossos projetos com um código reutilizável e se esquivando com sucesso de conflitos.

<iframe height="500" scrolling="no" title="#04 - CSS do BEM" src="https://codepen.io/soutomario/embed/eRqrgY/?height=265&amp;theme-id=0&amp;default-tab=css,result&amp;embed-version=2" frameborder="no" allowtransparency="true" allowfullscreen="true" style="width: 100%;">See the Pen <a href='https://codepen.io/soutomario/pen/eRqrgY/'>#04 - CSS do BEM</a> by Mario Souto (<a href='https://codepen.io/soutomario'>@soutomario</a>) on <a href='https://codepen.io'>CodePen</a>. </iframe>

Caso queiram ir mais a fundo no BEM, deixo o link da [**documentação para vocês conferirem**], espero que o artigo ajude vocês em seus projetos e não deixem de compartilhar o que vocês fizerem :)

Ahh, e caso queiram ir um pouco mais a fundo no assunto organização de CSS conhecendo outras formas além do BEM, deixo [este ótimo post] do [@marcobrunobr].

Se vocês quiserem aprender mais sobre CSS, HTML, Javascript e outras tecnologias que fazem parte da web, aqui na Alura temos uma [**Formação Front-end**]. Nela você aprenderá sobre HTML e CSS, Javascript, aprenderá frameworks como jQuery e como criar sites responsivos.

Sintam-se a vontade para comentar, dar críticas ou sugestões!




Pode passar uma semana afastado pois teve um pepino ou outro...mas ele volta, continua e retoma o ritmo. Eu também sou assim, todos somos.

Por todo seu esforço junto a plataforma ele foi escolhido para ser [moderador no Alura] e compartilha conosco um pouco de sua experiência, de como se motivou a crescer na área e como outras pessoas também podem encontrar seu caminho nesse nosso mundo de desenvolvedores.

Compartilho com vocês um pouco da história do Romário...

\---

# **Do jogo ao código**

Bem, meu gosto por programação começou a partir de Games e etc.. Sempre gostei de Jogos Online, principalmente MMORPG, em especial Ragnarok.

**Porém, assim como em vários MMORPG, existem servidores privados, ou seja: servidores customizados. Então, de tanto jogar neles e por discordar de algumas coisas na forma como os responsáveis pelos servidores administravam o jogo, resolvi criar meu próprio servidor. A partir daí tive meu primeiro contato com algumas linguagens ([HTML], [SQL] e etc..).**

Mas eu sempre tive meio que um prazer pelo conhecimento, então não me contentei em apenas saber o básico para fazer o jogo e sempre fui atras do significado das coisas e assim comecei a estudar sobre programação.

Sou autodidata e assim sempre procurava conteúdo sobre programação para estudar e saber mais. Desta forma encontrei e fiz cursos de várias empresas como Treehouse e Codeacademy,mas estes cursos são em inglês e por mais que eu soubesse bastante inglês, sempre escapava alguns detalhes. Assim, passei a procurar uma escola nacional e então cheguei ao Alura.

Eu sempre busquei cursos que pudessem me trazer mais conhecimentos. Muitos dos que fiz eram superficiais e apenas básicos. No Alura, eu pude aprofundar mais meus conhecimentos e então parti para livros mais complexos de programação.

# **O futuro**

Recentemente fui aprovado na universidade no vestibular de Medicina. Então, atualmente estou com bastante tempo livre e pretendo investir todo esse meu tempo nos meus conhecimentos de programação e na carreira como programador. Futuramente, pretendo exercer as duas funções: Medico e Programador. Pretendo conciliar as duas quando possível. Para o próximo ano, então, pretendo aprofundar e melhorar meus conhecimentos em programação e investir mais nessa área.

# **O aprendizado online**

Creio que o estudo online é uma nova modalidade de ensino que tende a crescer devido a maior comodidade e controle que o usuário tem da forma como irá estudar. Através do estudo online eu pude adquirir diversos conhecimentos. O Alura, por exemplo, ajudou-me a aprimorar meus conhecimentos sobre programação e hoje estou mais ativo e mais empenhado em trabalhos nessa área.

Creio que a melhor sugestão para quem está começando nos estudos da área seja: determinação.

Seja determinado e nunca se canse de aprender, também nunca se contente com o que você sabe. Seja determinado em sempre buscar ser o melhor naquilo que você quer fazer.

Muitas pessoas não conseguem o que desejam por falta de determinação. Já dizia o escritor francês Vitor Hugo: "As pessoas não carecem de força, carecem de determinação."

Então, seja determinado naquilo que você deseja e o sucesso será consequência.




Então você já aprendeu os básicos do **After Effects** e a partir desse ponto é muito comum que uma pergunta apareça na sua cabeça: “Será que eu estou usando o máximo do AE?”. Não, não estou falando de instalar plugins e nem sobre aprender mais uma técnica complexa para virar um mago do After Effects.

Essa dúvida tem mais a ver com o que você poderia estar fazendo mais rápido, que atalhos poderia estar usando e coisas assim. Para te ajudar a usar o software melhor e aumentar sua produtividade, decidi separar “5 truques do After Effects que você precisa saber”.

## Atalhos

O After Effects possui muitos **atalhos**, isso você já sabe, mas quais deles são realmente indispensáveis? Quais deles vão aumentar seu aproveitamento do software?

Sendo bem direto, quais são as principais coisas que costumamos utilizar em uma animação? **P**osição: só apertar **P**, **T**ransparencia: só apertar **T**, e**S**cala: só pressionar o **S**, **R**otação: se utiliza o **R**.

imagem**, ou até mesmo colocar a arte no lugar e, antes de exportar, remover as referências. Mas é possível deixar a arte referenciada sem precisar apagar depois?

Sim! É só usar as Guide Layers, que são fáceis de serem ativadas e desativadas, para transformar um layer em uma **Guide Layer** é simples, só selecionar a Layer a ser utilizada, clicar com o botão direito e selecionar a opção Guide Layer.

![5_truques_after6]


## **Mask como Motion Path**

Então você precisa que um item de sua animação percorra o caminho de um quadrado perfeito? Sem problemas: são quatro Keyframes, um pouco de paciência e tudo certo! Agora precisa fazer uma bola? Ok: quatro Keyframes, muita destreza e paciência e tudo certo novamente! Que tal fazer isso com um shape maluco que seu designer criou?

É, realmente ficou dificil. O ideal seria copiar o caminho desse **path** e usá-lo para “mandar” na nossa posição! E é isso ai! Não sabia que era possivel? É só copiar o caminho e colar na posição daquilo que se quer mover e todos os Keyframes estarão lá. Dá pra usar com todo tipo de **Shape**. Adeus tempo perdido!

![5_truques_after7]

Gostou das dicas? Quando montei meus cursos de After Effects para a **Alura**, fiz questão de ensinar além da ferramenta. **Ensinar dicas bacanas, workflow entre o After Effects, Photoshop e Illustrator** e muitos toques sobre como trabalhar com vídeo. Se você é um principiante e quer começar a trabalhar com Motion Graphics, recomendo que você de uma olhada nos cursos [**After Effects I**] e [**After Effects II**].




Estamos sempre buscando melhorar a nossa plataforma para deixar o ambiente de estudos cada vez mais fácil de usar e possibilitar que o aluno aprenda de maneira rápida. Esse ano já reformulamos todo o nosso fórum, melhoramos a página de cursos colocando mais informações e incluindo uma seção de perguntas frequentes.

Agora, nós **redesenhamos toda a tela de aula**! Deixando ela mais bonita e melhorando a usabilidade.

imagem

Para aproveitar ainda mais todo o espaço da tela, removemos o header que aparece nas outras páginas e movemos os links importantes para o final do menu lateral.

![]

Além disso, o menu está sempre acessível em qualquer parte da página, essa técnica é chamada de Sticky Menu. Mesmo que você esteja no final de transcrições grandes, é possível usar o menu para navegar sem ter que fazer o scroll até o topo da página.

![]

O espaço que antes era vazio, agora sempre está preenchido e facilita a navegação.

![]

## Questões de alternativas

Nas questões com alternativas, o aluno recebe um feedback imediato

![]

Antes ele precisava ir para outra página para saber se tinha acertado ou não.

![]

## Transcrições

A transcrição, que antes ocupava um espaço muito grande na tela agora ocupa um tamanho menor até o aluno decidir que quer ler mais.

![]

Os alunos já estão usando essa tela nova e já recebemos vários feedbacks de pessoas que gostaram. Se você tem alguma sugestão, não deixe de nos avisar!




A área de desenvolvimento de jogos é algo que atrai o interesse de muita gente: fazer algo divertido e ganhar dinheiro com isso é algo realmente bacana. 

Essa semana entrevistamos o Julius, um aluno da Alura lá de Brasília. O Julius é o responsável pelo desenvolvimento do [**Wingbirds**], um jogo para Android inpirado no famoso [Flappy Bird]. Atualmente desempregado, ele usa o tempo livre de forma extremamente produtiva: estuda para prestar concurso e pega firme para aprender desenvolvimento Android.

Aos 40 anos, o Julius nos contou que ele ainda é um novato na área. Algumas pessoas às vezes tem um pouco de receio de começar a desevolver depois de uma certa idade, mas para ele e isso não é empecilho não! Confira a seguir o bate-papo que tivemos com ele :)

**Fala Julius, beleza? Diz pra gente o seu nome completo, por favor.** Julius de Sousa Lima

**Mora em qual cidade atualmente?** Brasília, DF.

**Estuda? Qual instituição e curso?** Estudo para concurso. IMP concursos. E no momento, estou procurando me desenvolver profissionalmente na criação de aplicativos para Android.

**Trabalha atualmente? Qual o seu cargo?** Não. Estou desempregado. Trabalhava com manutenção de máquinas hospitalares. Sou Técnico em Eletrônica e recentemente, me formei em Análise e Desenvolvimento de Sistemas.

**Como foi seu contato com a área de TI?** Sempre gostei de computadores, informática, desenvolvimento, montar, desmontar, entender... Na década de 80 fiz por curiosidade, um joguinho do tipo Enduro usando o GWbasic (o Basic), na tela "verde" de um PC XT da IBM e lamento muito, por nunca ter procurado me desenvolver nessa área. Mas hoje a "coisa toda" é muito diferente.

Em 2011, depois de trabalhar 14 anos com manutenção de máquinas hospitalares, entrei na faculdade de Análise e Desenvolvimento de sistemas pensando em programação como na época do PC XT e percebi que tudo havia mudado muito, os conceitos, a forma de trabalho, as necessidades, os ambientes... tudo!

**E porque começou a desenvolver para Android?** Já conhecia o sistema operacional Android por causa dos smartphones que sempre usei. E associei de certa forma a "liberdade" que o Android dá, com a "liberdade" das distribuições Linux que uso e que permitem uma interação com um ambiente em desenvolvimento constante. Dessa forma, a vontade de aprender a desenvolver foi crescendo cada vez mais.

**Seu objetivo aprendendo Android sempre foi criar jogos?** Não só jogos, mas aplicativos úteis e que possam ajudar. O WingBirds foi o primeiro aplicativo e o primeiro joguinho que desenvolvi. Fiz na "mãozona"...sem frameworks, apenas com o Android Studio. Achei muito legal o resultado desse primeiro trabalho.

Gosto da ideia de criar jogos pela possibilidade de colocar minha imaginação para fora e de certa forma mostrar para os outros o que penso, como penso e o que considero importante, criando apps que possam entreter, animar e ensinar.

**Por optou por Android e não outra plataforma?** Acho que o Android tem mais abertura e flexibilidade para o desenvolvimento de aplicativos de o uso corriqueiro e também maior alcance em diversos níveis. Considero que o aspecto "liberdade" pesa muito quando se pensa em globalização e compartilhamento. Além de me parecer uma excelente opção para início de carreira na área.

**Quais foram as maiores dificuldades que você teve durante toda a sua trajetória? Ou seja, desde seus estudos até o desenvolvimento do seu jogo** A maior dificuldade é pessoal... a falta de apoio. Estou mudando de área num momento não muito favorável a isso. Outra situação é a falta de experiência, com tempo de serviço em outra área, e a idade. O mercado não quer se arriscar e a única opção que resta é se desenvolver por conta própria e mostrar serviço. Já com o aprendizado e profissionalização, a dificuldade é prevista. Basta estudar e se interessar. E nesse ponto não falta disposição e reconheço, até certa facilidade em aprender.

**Quais são seus planos para o futuro?** A verdade é que comecei há pouco tempo na área. Estou conhecendo ainda o mundo do desenvolvimento.

Nessa construção de uma nova carreira, primeiro quero me aprofundar mais no Android e pouco a pouco nos outros sistemas. Desenvolver aplicativos úteis, comercializá-los e entrar no mercado de desenvolvimento com alguma parceria válida.

O desenvolvimento multiplataforma é inevitável. Alguns softwares desenvolvidos para dispositivos específicos acabam sendo "empurrados" para uma realidade mais abrangente e acabam sendo atualizados em diversas plataformas. Tenho grande interesse em começar a desenvolver com essa finalidade e logo vou procurar conhecer ferramentas e softwares que possam impulsionar meus conhecimentos e atuação nesse sentido.

**Existem outros projetos que você está desenvolvendo ou pretende desenvolver atualmente?** Sim. Além das atualizações do WingBirds, vou desenvolver aplicativos comerciais, deliverys e outros com os quais possa iniciar um negócio. O WingBirds foi um "startup" para meu desenvolvimento.

**Para quem quer começar a fazer um jogo para Android, o que você sugeriria?** Existem opções diversas para se criar aplicativos comerciais em Android e em outros sistemas. Particularmente, acho que não são opções que lhe dão liberdade total de criação e limitam em vários aspectos.

Mas para jogos, existem várias ferramentas que ajudam no desenvolvimento de aplicativos Android. Antes de tudo, acho que a pessoa que tem interesse em começar a desenvolver jogos, tem que se preocupar em aprender alguma linguagem de programação que lhe seja útil. Na maior parte das vezes, é necessário o conhecimento básico de programação. E para que o profissional seja completo, isso é indispensável.

Então, procure por ferramentas que lhe permitam iniciar o desenvolvimento e que lhe dêem uma visão geral do ambiente de desenvolvimento, identifiquem a necessidade de uma linguagem que lhe permita continuar o trabalho e procure cursos específicos que possam lhe auxiliar nesse sentido. Comecei com o Java na faculdade e posteriormente na Caelum, onde tive a oportunidade de conhecer um pouco mais sobre a linguagem. Quando iniciei com o Android no Alura, tinha uma boa noção da linguagem e isso me ajudou muito. Todo o desenvolvimento do WingBirds foi feito com essas bases, sem outras ferramentas além do Android Studio.

**Daqui para frente, claro, é fazer curso em cima de curso, aprender novas linguagens e ampliar minhas possibilidades. Talvez, uma outra faculdade, o que com certeza ajuda muito. Além de cursos diversos, mesmo que online, a exemplo do Alura que nos oferece várias opções de aprendizado.**




Aprenda como manipular array de um modo **funcional** em Javascript, utilizando os métodos map, reduce e filter.

Na empresa onde trabalho começamos um [Coding Dojo], que é basicamente uma reunião com programadores e programadoras a fim de resolver desafios e aperfeiçoar as habilidades com algoritmos.  
  
O desafio dessa semana foi o seguinte, dado o array \`empresas\`: 

javascript 

Tenho que exibir as seguintes informações:

- Empresas criadas depois dos anos 2000.
- O nome de cada empresa e de seu CEO.
- O valor de todas as empresas somadas.

A primeira coisa que precisamos mostrar são as empresas criadas depois dos anos 2000. O que podemos fazer nesse caso é criar uma maneira de filtrar o array para conseguir exibir essa informação.

## Filter

Por sorte já existe um método para fazer esse tipo de filtro e adivinha o seu nome ? Isso mesmo [**filter**]. Ele vai percorrer todo o array e criar um novo com todos os elementos que passaram no teste implementado, no nosso caso, quando ano de criação for maior que 2000.

Como temos objetos dentro do array, precisamos acessar suas propriedade para fazer o filtro. Para isso basta chamar o nome do array seguido da notação de ponto e logo após, o nome da propriedade.

Então para acessar a propriedade `anoDeCriacao` fazemos:

javascript

Agora basta criar a condição para exibir o\`anoDeCriacao\` maior que 2000, dentro do `filter`:

javascript 

Como resultado temos:

javascript 

Conseguimos realizar a primeira tarefa, agora para a segunda temos que exibir o nome das empresas e de seus CEOs. Seria interessante criar uma função que extraia esses dois valores para nós.

## Map

Felizmente temos esse método pronto e ele se chama [**map**], com ele é possível percorrer todos os item do array, executar alguma transformação nesses itens e retornar um novo array sem modificar o atual.

No nosso caso vamos percorrer o array e dentro de cada objeto vamos pegar as propriedades nome e CEO de cada empresa.

javascript

Temos como resposta:

javascript

Mais um item do nosso checklist concluído, agora falta exibir o valor de todas as empresas somadas. Seria interessante se já tivéssemos algo parecido com os dois últimos métodos, mas para somar todos os valores.

## Reduce

E temos, o método [**reduce**] passa por cada item do array fazendo uma expressão escolhida, e no final vai devolver um único valor. Exatamente o que precisamos para fazer a soma do valor de mercado das empresas.

Ele recebe dois valores, um acumulado e um atual, no nosso caso o acumulado irá somar com o atual. Como no primeiro loop da soma não temos nenhum valor acumulado, então precisamos passar como segundo parâmetro esse valor, que no nosso caso vai ser 0.

Se não tivéssemos passado um valor de acumulado o \`reduce\` pegaria o primeiro item do array, tomando o como se fosse o valor acumulado.  
Nosso código ficou terminado ficou assim:

javascript

Como resultado temos:

javascript

Com a utilização dos métodos como `map`, `filter` e `reduce` foi possível realizar todos os desafios propostos no Coding Dojo com códigos semânticos, simples e funcional.

Se ficou interessado em como o Javascript funciona e como você pode utilizá-lo melhor, aqui na Alura temos uma [**formação front-end.**] Nela, você verá como utilizar outros métodos do Javascript moderno, conhecer boas práticas e muito mais.




Aproveitando essa parceria, tivemos uma conversa com a Ulli Olivetti (colaboradora da ITA Júnior) que topou fazer uma entrevista conosco falando um pouco sobre como é trabalhar na **ITA Júnior** e compartilhando os seus desafios do dia a dia.

Curioso para saber mais sobre a nossa conversa? Então acompanhe e descubra:

## O que faz o ITA Júnior?

> A ITA Júnior é uma empresa formada unicamente por alunos do ITA. Nosso principal objetivo é desenvolver o estudante por meio da vivência empresarial e da execução de projetos vendidos ao mercado. Ao mesmo tempo, incentivamos o empreendedorismo na região. Isso porque nossos projetos têm custo mais baixo, dado que possuem tributação menor, sendo voltados, principalmente, para micro e pequenas empresas que não teriam condições de obter um serviço de consultoria sênior. Hoje em dia, fazemos projetos em TI e em otimização. Basicamente, podemos fazer desde o site da sua empresa ou a plataforma web que nosso cliente sempre sonhou, até a análise de como melhorar o seu negócio e otimizar seus processos para diminuir desperdícios.

## Como você começou a participar da empresa?

> Assim que entrei para a faculdade, fiquei sabendo da ITA Júnior e da oportunidade que eu teria de desenvolver habilidades interpessoais e de entrar em contato com o mercado, sem me afastar da engenharia! Sempre fui uma pessoa tímida, então essa ideia me atraiu muito. Fiz o processo seletivo e consegui entrar no início de 2016. Na época, não poderia imaginar o quanto aprenderia na empresa e o quanto a ITA Júnior me amadureceria como pessoa.

## Quais as tecnologias que vocês usam mais atualmente?

> Para os projetos de web, utilizamos muito [HTML, CSS], [jQuery], [JavaScript], [Angular] e [Node]. Em otimização, usamos muito [Excel], [VBA], [Access] e conhecimentos de [Lean]. Grande parte da nossa capacitação vem da Alura. Com a plataforma, conseguimos que nossos membros tenham o conhecimento e a segurança para executar os projetos de maneira contínua, sem que esse aprendizado se perca ao longo das gestões.

## O que acham interessante na proposta da Alura?

> Muita coisa (rs). Primeiro, o fato de ter cursos de diversos assuntos de qualidade garantida em um só lugar facilita muito o estudo. Os instrutores também são muito bons e todos os vídeos são acompanhados de vários exercícios, o que permite que uma pessoa sem conhecimento nenhum no assunto se torne um bom profissional após concluir o curso. Os cursos também estão sempre se atualizando, seguindo a tendência das linguagens de programação. Além disso tudo, a plataforma é super amigável e o atendimento ao cliente é excelente. Olhando para trás, adotar a Alura foi a decisão mais acertada que tomamos na ITA Júnior dos últimos tempos.

## Vocês participam de eventos, fóruns e listas?

> Sempre incentivamos nossos membros a participarem de tudo que a Alura oferece. Os tópicos são sempre bem interessantes para nossos projetos e os fóruns são uma ótima maneira de tirar dúvida rápido, já que o suporte é bem ágil. Acreditamos que devemos aproveitar tudo que é oferecido para ter uma capacitação completa.

## Quais são os maiores desafios do dia a dia?

> A ITA Júnior compartilha de muitos desafios comuns das empresas juniores. Hoje em dia, a gente tem certa dificuldade para fazer os empresários da região nos conhecerem. Queremos atingir mais pessoas e fazer mais projetos, para conseguir impactar mais o mercado e ajudar mais empresas a crescerem. Mas ainda não conseguimos encontrar a melhor forma de atingir nosso público.





A **média ponderada** é utilizada quando precisamos considerar **pesos para as diferentes medidas.** Por exemplo, se eu quero calcular o meu preço médio de vendas do primeiro bimestre do ano, e eu sei que em janeiro o preço médio foi R$10,00 e em fevereiro foi R$8,00. 

Se eu usar a média simples, o preço médio das vendas do primeiro bimestre seria R$9,00. Isso só vai ser verdade se eu tiver vendido exatamente a mesma quantidade nos dois meses que estamos analisando. Mas e se eu vendi 10 unidades em Janeiro, e 30 em Fevereiro? 

Se eu for ponderar pela quantidade vendida, minha média deveria ficar mais perto de R$8,00 do que de R$10, afinal, vendi mais em fevereiro.

Uma forma de descobrir o nosso preço médio do primeiro semestre, é primeiro descobrir o valor total das vendas, e depois dividir pela quantidade total das vendas. Ficaria assim:

• **Valor das vendas em Janeiro:** R$10,00 * 10 unidades = R$ 100,00;

• **Valor das vendas em Fevereiro:** R$8,00 * 30 unidades = R$ 240,00;

• **Valor das vendas no primeiro bimestre:** R$100 + R$240 = R$340;

• **Quantidade total das vendas:** 10 + 30 = 40;

• **Preço médio do primeiro bimestre:** R$340 / 40 = R$8,50.

# Média ponderada no excel

Agora vamos aumentar nosso exemplo, e tentar calcular o preço médio das vendas do ano, a partir da tabela de quantidades, e preço médio por mês:

imagem

Tem duas formas de fazer esse cálculo no Excel. Vamos começar com o caminho mais longo e depois mostramos o atalho usando a função **SOMAPRODUTO (ou SUMPRODUCT)**. 

Se a gente fizer igual ao primeiro exemplo, o primeiro passo vai ser calcular o valor total das vendas por mês, adicionando a coluna **“Valor das vendas”**:

imagem

Depois, **adicionamos uma linha com os totalizadores de quantidade**, com a **função SUM (ou SOMA se o excel estiver em português):**

imagem

O mesmo para o **total do valor das vendas**:

imagem

E chegamos ao **preço médio com a divisão simples**:

imagem

E chegamos no valor de R$8,35 de preço médio no ano.

# Média ponderada no excel usando somaproduto (ou sumproduct)

O Excel nos dá um atalho para calcular o valor total das vendas, sem precisar calcular o valor da venda de cada mês para depois somar. Como o próprio nome já diz, **a função somaproduto já calcula a soma dos produtos de dois conjuntos (ou arrays).**
No nosso exemplo, o primeiro array são as quantidades, e o segundo são os preços médios:

imagem

**O resultado vai ser o mesmo que tínhamos calculado antes:**

imagem

Agora é só dividir pela quantidade, e temos nosso preço médio! Pra tabela ficar mais fácil de ler, vou colocar as duas fórmulas juntas, na célula C14:

imagem

E chegamos nos mesmos R$8,35, c.q.d. :)

# Google Spreadsheets

Esse passo a passo, assim como as fórmulas, também funcionam no Google Spreadsheets. Vou deixar um link aqui embaixo com o resultado final: 

imagem

Você pode acessar a tabela através do link: https://docs.google.com/spreadsheets/d/19-MH0kn6v64MbyoCT4FBrfBbY4osEP8vWwW2VU2d360/edit#gid=0

Gostou desse artigo? [**Inicie em excel ou aprimore seu conhecimento com a Alura**]. 



Durante os meus estudos para certificação da Oracle, surgiu uma questão bem interessante... O que um arquivo .java precisa para compilar? Vamos verificar com a classe Teste.

java

Se eu tirar o método `main`:

java

E tentar compilar:

![compilando-arquivo-java] Ele compila conforme o esperado! Certo agora eu acho que não tem mais nada que possa retirar... Mas e se eu tirar a classe inteira? Ele compila? Sim? Não? O que você acha?

Vamos tentar compilar sem a classe, ou seja, um arquivo vazio:

![compilando-arquivo-java2]

Compilou??? O que!? Isso mesmo, compilou! Para **compilarmos** um arquivo .java não precisamos de nada em específico, ou seja, não precisamos de uma classe, método ou qualquer conteúdo. Simples assim!

Caiu na pegadinha e quer se preparar mais?  Pensando nisso o instrutor **Guilherme Silveira** criou a [**Formação Java**] na **Alura**.




imagem 

Na criação de aplicativos quantas vezes caímos na necessidade de manter dados salvos para economizar o pacote de dados dos usuários ? Acredito que a resposta deve ser bem próxima de "muitas vezes" ou até mesmo "sempre".

A parte mais chata é que toda vez que queremos manter um cache de nossa aplicação precisamos criar uma classe que extenda de `SQLiteOpenHelper`. Aí que os problemas começam, quando eu tenho mais de uma tabela, como eu faço?

Precisaria criar um monte de DAOs que tenha como atributo a classe que faz o acesso direto ao banco. Isso seria um grande trabalho, além de ter muito código repetido pra lá e prá cá, o que a galera geralmente chama de _codigo boilerplate_.

Pra solucionar esse problema a galera do google criou uma serie de bibliotecas que fazem parte de um conjunto de ferramentas denominadas **Architecture Components**. Dentro dele podemos encontrar um `ORM` , cujo nome é Room.

Já falei bastante dele no meu curso aqui na Alura, mas ficamos bem na base dele lá, vimos como ele facilita e muito o desenvolvimento.

Agora estou querendo evoluir um pouco da conversa. Lá fiz um sistema com apenas duas entitidades, `Prova` e `Aluno`, bem similar a isso aqui:

java

É bem comum pensarmos agora que uma nova tarefa seria implementar o relacionamento de ambas as entidades, até mesmo, porque um aluno realiza uma prova. Essa junção pra gente, representa o `Resultado` e como parece ser bem importante isso para nosso sistema, seria legal gerar uma nova entidade para ele:

java

Ai é quando caímos numa das pequenas ciladas que o mundo android nos dá. Estamos tão habituados a fazer esse tipo de relação no mundo web que não pensamos duas vezes fazes antes de efetivamente transcrever isso para esse mundo.

A biblioteca **não consegue fazer esse "inferimento automático"**. Precisamos deixar claro pra ela que existe uma relação entre as tabelas. Primeiro precisamos mudar o tipo dos objetos, mapeando exatamente como será o banco de dados em si:

java

Com isso o Room já vai ficar feliz por saber como precisa criar a tabela, contudo ainda não falamos que ambos ids são chaves estrangeiras. Para isso, precisamos colocar uma anotação que vai deixar claro e criar todas as constraints para nós, contudo fazemos isso na declaração da entidade:

java

Dessa forma o Room já criou nossa tabela, mas há outro detalhe que é legal ficarmos de olho: se alguma prova ou algum aluno for removido da base, ficaremos com dados totalmente inconsistentes. Para resolver esse problema, podemos adicionar uma condição exclua junto o resultado, essa ação é conhecida como **ação em cascata**:

java

Agora basta criarmos nosso DAO para manipular nossos resultados. Mas, se formos parar novamente para pensar, quando formos fazer uma busca no banco e usar os resultados, como vou saber quem é o aluno com o id 1 por exemplo?

Acho que vai ser bem difícil isso. Trazer o aluno com suas informações, é nessa parte que precisamos fazer uma busca um pouco mais inteligente. Já pensando que precisamos trazer os dados tanto da prova quanto do aluno junto com o resultado.

Uma query com joins já resolve esse problema, mas e agora? Como fazemos para representar isso no nosso sistema?

A solução proposta pelo Room é que a criação de um objeto que represente exatamente a busca que estamos fazendo, algo similar a isso:

java

Com isso, podemos montar nossa query da seguinte forma:

java

Contudo, quando executarmos o código e pegarmos essa lista, vamos ver que não terá nada! Esquecemos um detalhe bem importante: toda vezes que tivermos mapeando um objeto dessa maneira, precisamos deixar claro para o Room que dentro do resultado haverão nossos objetos. Fazemos isso através da anotação `@Embedded`

java

Rodando agora nosso aplicativo teremos o resultado que estavámos buscando!

E ai gostou de saber um pouco mais sobre o Room? Não conhecia ainda, corre lá e faz meu [**curso de Room na Alura**] :D.

Nele você vai ver como automatizar a criação do seu banco sem muitos problemas, fazer um crud de maneira simples e objetiva e fazer queries dinâmicas, além disso vai aprender diversas boas práticas de programação mobile.





imagem

Programação funcional é o processo de **construir software através de composição de funções puras, evitando compartilhamento de estados, dados mutáveis e efeitos colaterais. É declarativa ao invés de Imperativa** Essa é uma definição do [Eric Elliott] que eu gosto muito. 

Mas confesso que tem muita informação nesse parágrafo não é, então vamos começar do começo.

## Da onde veio a ideia de programação funcional ?

A inspiração do **paradigma funcional** veio dos matemáticos teóricos que lidam com grandes abstrações:

imagem

Eles costumam trabalhar com sistemas complexos e a maneira como eles encontraram para se manterem organizados e chegar no objetivo final foi através das funções. Se trouxermos para nosso mundo de desenvolvimento, existe uma certa analogias de que trabalhamos com sistemas complexos e com **abstrações**.

Então o paradigma funcional foi inspirado nesse modelo de trabalho onde as funções são utilizadas para lidar com abstrações e aplicou no desenvolvimento de sistemas. 

Agora que já entendemos um pouco da história, vamos ver os **conceitos fundamentais começar a desenvolver de modo funcional**.

## Composição de função

**Composição de funções** é criar uma nova função através da composição de outras. Por exemplo, vamos criar uma função que vai **filtrar** um **array**, filtrando somente os números pares e multiplicando por dois: 

js
# Funções Puras

**Uma função é chamada pura quando invocada mais de uma vez produz exatamente o mesmo resultado**. Isto é, o retorno da função é sempre o mesmo se você passar os mesmos parâmetros, então ela não pode depender de valores mutáveis. Por outro lado, ela não pode causa efeitos colaterais externos, pois se ela imprime uma linha de saída, altera algo no banco, lança um foguete para o espaço, ao invocá-la a segunda vez ela vai causar um novo efeito.

js
Se imprimirmos: 
js
A função `verifica_se_e_maior_que()` é pura porque atende todos os requisitos listados. Por não causar efeito colateral e por não usar valores mutáveis compartilhados, seus resultados podem ser cacheados e ela pode ser executada em paralelo sem maiores preocupações.

# Imutabilidade

**Imutabilidade** significa que uma vez que uma variável que recebeu um valor, vai possuir esse valor para sempre, ou quando criamos um objeto ele não pode ser modificado.

O objeto **string do Javascript** por exemplo é imutável: 
js

## Efeito Colateral

**Efeito colateral é toda interação da nossa função com o mundo externo** No nosso dia a dia fazemos coisas como:

- Acessar banco de dados;
- Realizar chamadas assíncronas, 
- Alterar propriedades de objetos entre outras tarefas 

E nem sempre podemos prever esse resultado.

Mas dissemos antes que funções puras não possuem efeito coleateral certo ? Mas programamos para um mundo onde dados mudam constantemente.

Então a programação funcional não elimina efeitos colaterais totalmente, mas tentam confiná-los. Como fazemos interface com o mundo real, algumas partes do programa vão ser impuras então o papel é minimizar essas partes e separá-las do resto do programa.

## Imperativo x Declarativo

É muito comum aprender a programar de forma **imperativa**, onde mandamos alguém fazer algo. Busque o usuário 15 no banco de dados. Valide essas informações do usuário.

Na programação funcional tentamos programar de forma **declarativa**, onde declaramos o que desejamos, sem explicitar como será feito. Qual o usuário 15? Quais os erros dessas informações?

## Estado Compartilhado

**Estado compartilhado** é qualquer valor que está acessível por mais de um ponto de uma aplicação. Por exemplo: 

js
Neste caso a função `calculaIdadeDosIrmaos()` utiliza uma variável externa que está fora do seu escopo e não depende apenas dos argumentos passados.

Quer saber a opinião de especialistas que trabalham com programação funcional no dia a dia,
participe da nossa [semana da programação funcional]!

E se você gostou e quer conhecer mais, pode começar pelos nossos [][cursos de programação funcional de clojure].

Pode também ouvir um podcast focado em Clojure:

spotify:0yAvwgYYl1w6dzCZnENFI1

E outro de linguagens funcionais no geral, com equipe da Alura e outras empresas:

spotify:6CJmqvJA6Tk6QZBKPwRl5z







Se você desenvolve pra web é mais do que comum querermos centralizar elementos na tela, certo? Vamos imaginar que temos a seguinte _div_:

 html
Se você quiser centralizar o **texto dentro da div**, pode fazer: 

`.container { text-align: center; }` 

Você pode ver esse código funcionando aqui [**aqui**]. 

Esse código funciona para centralizar qualquer elemento que seja _inline_ (você pode ver quais são [inline]) ou _inline-block_.

Ah, mas e se eu não quiser centralizar o conteúdo, mas sim a _div_ na tela? Desse jeito que fizemos, não vai funcionar. Nesse caso, temos que fazer basicamente duas coisas: 

dar um tamanho para a _div_ e setar as margens esquerda e direita para _auto_: 

css

Você pode ver um demo desse código [aqui]. 

Esse código funciona para qualquer elemento [**block**].

E aí, gostou? Quer aprender mais? Dá uma olhada na nossa [**Formação Front-End**]!





imagem 

Hoje na Alura todos nós usamos o [**Slack**] como ferramenta interna de comunicação da empresa. E, se é uma ferramenta de comunicação, a primeira coisa que pensei é em instalar o app também no celular e poder acompanhar de qualquer lugar as mensagens.

Só que, quando instalei o app, algumas coisas eu ainda não sabia do que se tratava… Na verdade, eu sabia bem pouco de como era a ferramenta. Então, eu teria dois caminhos a seguir:

- Aprender no dia a dia, usando o app, de fato;
    
- Olhar a documentação;
    

No primeiro caso, eu poderia levar pouco ou muito tempo, dependendo da minha familiaridade com esse tipo de ferramenta.

Já no caso da documentação, apesar de ser útil para sanar algumas dúvidas pontuais, são tantas informações sobre todo o app que provavelmente usaria algumas delas para atender minhas necessidades e outras nunca chegaria a usar.

Mas será que não tem um jeito de informar somente as coisas mais básicas para o usuário de primeira viagem?

## Apresentando seu app ao usuário

Se queremos apresentar algo novo a alguém, uma boa forma de conduzir esse primeiro contato é apresentando as informações mais básicas sobre o que estamos falando.

Isto é, se são as informações mais básicas, precisamos selecionar o que consideramos ser mais relevante para o usuário num primeiro momento de interação.

Por exemplo, se o Slack é uma ferramenta de comunicação, pode ser interessante apresentar as especificidades da ferramenta antes mesmo de abrir o app propriamente dito, certo?

Nesse caso, a apresentação do app acontece apenas na primeira vez que o usuário abre o app.

imagem e fácil para realizar pesquisas internas (**uma feature relevante** para quem busca esse tipo de ferramenta de comunicação).

Além disso, os recursos visuais utilizados nessa tela mostram que essa ferramenta não existe apenas para a versão mobile, mas também em outras plataformas, como o desktop.

> Escolher bem o apoio visual para a mensagem é essencial, uma vez que a informação a ser passada deve ser enxuta e objetiva. Portanto, escolha com cuidado, utilizando imagens como ilustrações, animações, prints da tela ou quaisquer recursos visuais que auxiliem na compreensão da ideia.

imagem, descrito como uma espécie de "grupos de conversas".

Essa é uma feature interessante a ser apresentada, uma vez que o conceito de canais difere um pouco do que conhecemos como "grupos" em apps de comunicação que precisam de um convite do membro administrador do grupo para permitir a entrada de novos membros.

imagem poderiam ter uma experiência desagradável com esse primeiro contato desgastante e longo com o app.

Portanto, **resumir em poucas telas** é uma dica importante.

Além disso, é também uma prática comum deixarem um botão estratégico para aqueles que, independente de qualquer coisa, não quiserem passar pela apresentação do aplicativo:

imagem elimina a etapa da apresentação e direciona o usuário direto para o aplicativo.

Ainda que isso gere o risco de perder algumas informações relevantes, é interessante deixar ao usuário a escolha de passar por esse processo ou não, porém não é uma regra.

## Resumindo…

As telas de apresentação de apps fazem parte de uma série de recursos que podemos utilizar para planejar a primeira interação do usuário com nosso app, isto é, o **onboarding**, que engloba todo o processo de experiência do usuário aprendendo a utilizar o produto.

E, para criar um Walkthrough eficiente, precisamos considerar estes fatores:

- As informações apresentadas precisam ser enxutas;
    
- O conteúdo deve apresentar o produto e suas features mais relevantes;
    
- Descreve-se em poucos passos o que pode ser mais relevante ao usuário saber antes de entrar no app;
    
- Recursos visuais podem ser muito relevantes para apoio da mensagem passada, sejam prints, fotos, ilustrações ou animações.
    

Cada passo no processo de UX é muito importante para entender no que apostar ou não em nosso produto.

Conhecendo bem cada etapa, conseguimos visualizar melhor o que precisamos, testar e reformular novas tentativas, para isso, temos na Alura [uma formação dedicada a ensinar diversas dessas etapas de UX].





O pessoal estava trabalhando nesta versão desde o fim de 2014. Os desenvolvedores dizem que esta versão é mais rápida do que a anterior e que ela foi desenvolvida com retrocompatibilidade em mente - ou seja, o que você já usava na antes continuará funcionando.

Vários workarounds(também conhecidos como _gambiarras_) feitas especificamente para as versões mais antigas do IE foram **removidas** e a biblioteca agora utiliza recursos das APIs mais modernas onde faz sentido.

A ideia é que atualizem as versões anteriores caso hajam correções críticas a serem feitas, mas elas não vão ganhar mais novas funcionalidades. A versão 3 é o futuro do jQuery.

Você pode pegar baixar a versão mais nova aqui: [https://code.jquery.com/jquery-3.0.0.js] Versão minificada: [https://code.jquery.com/jquery-3.0.0.min.js]

E pode ler muito mais detalhes do que mudou e tem de novo [aqui].

**Ainda não manja de jQuery? [Temos um curso] especial para você na Alura :)**




No passado, a pesquisa de imagens no [**Google Imagens**] tinha um sistema de paginação mais ou menos assim:

![]

Para pesquisar imagens de qualquer tema precisávamos seguir um processo de scrollar a página até o limite de resultados e passar para a página seguinte com mais resultados. A cada nova página isso se repetia.

Depois de muitas páginas continuava a fazer as buscas pelas referências que queria, em um exaustivo processo de recarregamento de página para cada nova leva de resultados, além de quebrar meu ritmo nas buscas.

Se me apresentam uma grande quantidade de informações e não sei onde está o que procuro, uma boa forma de facilitar a interação com todo esse mar de dados seria permitir que o conteúdo fosse apresentado organicamente, de forma organizada e contínua, em que eu não precisasse sempre carregar uma nova página para ver uma nova informação, já que esse é justamente meu objetivo desde o início.

E como poderia conseguir isso?

## Automatizando o carregamento de resultados

Com o passar do tempo, a página do Google Imagens sofreu várias alterações, chegando ao que temos hoje:

<iframe src="https://streamable.com/s/x3jry/julplo?muted=1" frameborder="0" width="100%" height="100%" allowfullscreen style="width:100%;height:100%;position:absolute;left:0px;top:0px;overflow:hidden;"></iframe>

Perceba que agora nem percebemos muito bem a quebra de carregamento de novos resultados, seguindo **um ritmo muito intuitivo e contínuo** na busca e tornando o processo de busca mais fluido ao usuário.

**À medida que descemos a página temos o carregamento de mais imagens**, isto é, novos resultados são apresentados por padrão a mim, diminuindo minha necessidade de recarregar novas páginas. Agora, apenas o conteúdo que estou buscando vai surgindo na minha tela.e, quando atingimos uma grande quantidade de imagens, nos deparamos com este botão:

![]

Nesse momento o Google nos para e, agora sim, decidirmos se queremos ou não continuar as pesquisas, dando maior **sensação de controle** da ação.

Em sistemas com muitos dados a apresentar, como nesse caso, a scrollagem infinita pode ser uma boa pedida para melhorar a UX.

Porém, existem algumas ressalvas a considerar, antes de sair adicionando esse recurso em qualquer lugar.

## Quando scroll infinito é uma boa ideia…

Se a intenção aqui é deixar o caminho aberto **para que o usuário navegue em uma grande quantidade de informações**, um scroll que automaticamente oferece novos resultados pode ajudar muito.

Mas, além disso, **se temos um conteúdo dinâmico**, que pode ser alimentado diariamente com mais conteúdo, a scrollagem contínua dessas novidades ajuda a manter o sentido da interação mais natural, mantendo o foco do usuário naquela atividade específica.

O Facebook, por exemplo, também é um site que precisa apresentar uma infinidade de dados diariamente na timeline do usuário.

![]

Deixar esse caminho orgânico faz com que a única necessidade do usuário seja continuar seu caminho pelas novidades que tem interesse em visualizar.

Isto é, sites que possuem uma _timeline_ de informações que cresce constantemente são potenciais bons exemplos para essa função, assim como Pinterest, Twitter, Instagram…

Em todos esses casos a scrollagem infinita é muito bem aproveitada.

## … e quando não utilizá-lo?

Queremos sempre facilitar a vida do usuário e ter uma usabilidade eficiente que melhore a experiência como um todo, mas a scrollagem infinita de páginas pode nem sempre ser uma boa pedida.

Um desses casos é justamente **quando recarregamos a página e perdemos toda a scrollagem que fizemos antes**, voltando ao início dos resultados buscados anteriormente. Ou seja, voltar para algum ponto depois de reiniciar a interação na página pode gerar muita frustração para o usuário, a menos que faça a [**implementação de um recurso em JavaScript que altera a URI à medida que scrolla a página**].

Para contornar essa situação, no próprio Google Imagens, quando selecionamos uma imagem para abrir e visualizá-la, automaticamente somos redirecionados para uma nova aba. Isto evita o problema de recarregamento da página.

Mas, além disso, carregar **tantos elementos na mesma página pode sobrecarregar o desempenho do site** e tornar a performance bem ruim, uma vez que o [**DOM fica carregado demais**].

E, depois de tudo isso, ainda podemos estar sacrificando um ponto importante do nosso site: o **footer**, que geralmente servir de complemento às informações referentes ao site.

Com a scrollagem infinita precisamos ter cuidado e pesar se é ou não relevante para o nosso negócio aderir a essa feature.

## Aplicando scroll infinito em sites e apps

Ainda que possa parecer um recurso interessante para agilizar o processo de busca por resultados em um site, precisamos sempre levantar se nossa página precisa ou não desse recurso.

Em apps, por exemplo, podemos ter uma necessidade muito maior de utilizar essa ideia por se tratar de um dispositivo que se adequa bem a esse tipo de interação devido à gesturização que, diferente de botões, é muito mais simples de ser utilizada em diferentes tamanhos de tela.

Para implementar essa feature em nossas páginas podemos, inclusive, [**utilizar apenas JavaScript puro**], de forma simples, ao invés de recorrer a bibliotecas pesadas que também prejudicariam a performance.

Mas ainda assim, existem contextos em que a paginação pode ser uma solução mais eficiente para uma apresentação modular do conteúdo, principalmente se aquele que estiver acessando o conteúdo tenha filtrado a busca em um funil mais específico e focado no que se pretende encontrar.

![]

Note que, depois de categorizados e afunilados, os resultados buscados nesta página de e-commerce recebem justamente essa paginação para facilitar a interação com os produtos apresentados.

Isso considerando também que o conteúdo apresentado não tenha tanta prevalência da ação de retorno ao que já foi visualizado, uma vez que esse retorno se torna cada vez mais complicado à medida que mais resultados são carregados. Portanto, analisar e dosar a utilização segundo o que faz sentido é essencial.

Se retomarmos toda a ideia até agora, podemos sumarizar como vantagens desse padrão:

- Em páginas de conteúdo muito dinâmico, conseguir um flow contínuo na interação;
    
- Pode criar no usuário a sensação de estar perdido, sem controle do que está acontecendo;
    
- Facilitar a busca por novos resultados sem ter que carregar sempre uma nova página.
    

E quanto às **desvantagens** da utilização:

- Prejudicamos a UX se não criarmos um mecanismo eficiente que permite ao usuário voltar ao ponto que parou;
    
- Podemos acabar prejudicando a performance;
    
- Sacrificamos o footer do site.
    

Para entender se isso faz sentido ou não dentro do seu sistema, é normal fazer apostas iniciais, [**testes AB**] ou mesmo testes de usabilidade, e na Alura tem um curso muito interessante de [**UX Produto**] que mostra algumas das possibilidades que temos para fazer esse contínuo acompanhamento de como o usuário vê nosso produto.

**Qualquer nova feature é importante ser testada e analisada.**




imagem 

Para entender melhor como funciona cada um dos protocolos, vamos tentar enxergar uma situação prática onde cada um deles pudesse fazer diferença: o **UDP** e o **TCP**.

Recentemente, eu estive trabalhando em uma aplicação de bate-papo online, para treinar minhas habilidades de programação. Para testá-la, enviei o programa para um amigo para tentarmos conversar através dele.

Quando começamos a conversar, logo notei que havia algo de muito estranho - as mensagens do meu amigo não faziam muito sentido. Não só isso, mas ele parecia não conseguir entender o que eu estava dizendo também! Olha só como estava a conversa para mim:

imagem]

Mandei para o email dele esse screenshot de como a conversa estava aparecendo pra mim, para ele entender minha confusão e ele respondeu meu email com a imagem de como a conversa estava para ele:

imagem]

Agora sim fiquei confuso! Para mim, a conversa estava de um jeito, mas para meu amigo estava de outro… O que será que estava acontecendo com o meu programa?

A princípio, pensei que podia ter alguma relação com a nossa Internet, mas a conexão estava muito boa e, ainda, as mensagens estavam chegando bem rápido. O que, então, poderia ser?

Depois de diversas pesquisas, consegui entender qual era o problema - **o protocolo que eu estava utilizando na camada de transporte**. Mas como assim, um protocolo? Na camada de transporte? O que é tudo isso? Vamos com calma!

## A camada de transporte

A Internet se baseia, no geral, em requisições e respostas. Se pensarmos na Web, temos um exemplo bastante concreto - usamos um navegador (como o Google Chrome ou o Mozilla Firefox) para fazer uma requisição para um servidor de determinado site. Se tudo der certo, esse servidor me devolve uma resposta com a página web que eu procurava.

Mas como é que funciona, de fato, uma requisição? O que está por trás disso?

Para descrever os passos de uma requisição, existem diversos modelos que descrevem os protocolos (isto é, as regras) por trás desse processo. Os modelos mais conhecidos são o [**OSI**], que é dividido em 7 camadas, e o [**TCP/IP**], que é dividido em 5 camadas.

Em ambos esses modelos, há uma mesma camada que é fundamental a [**camada de transporte**]. Nos dois casos, a camada de transporte é, como o próprio nome indica, a responsável pela transferência de dados entre diferentes máquinas (seja um servidor, ou mesmo um computador pessoal).

A respeito dessa camada, temos dois protocolos principais: o **TCP** e o **UDP**. No programa de bate-papo que eu fiz, utilizei o UDP, simplesmente porque pensava que não havia muita diferença. Afinal, foi justamente esse o meu erro!

## O protocolo UDP

O protocolo UDP (sigla para _User Datagram Protocol_) tem, como característica essencial, um atributo que pode parecer esquisito para os iniciantes no tema - a **falta de confiabilidade**.

Isso significa que, através da utilização desse protocolo, pode-se enviar [**datagramas**] de uma máquina à outra, mas sem garantia de que os dados enviados chegarão intactos e na ordem correta.

Além do mais, o UDP é um protocolo que não é voltado à conexão. Isso significa que o "aperto de mão", ou, tecnicamente, _[**handshake**]_, não é necessário para que se estabeleça uma comunicação.

Dessa forma, com o UDP é possível enviar, pela mesma saída, dados para diversas máquinas diferentes sem problema algum.

> Podemos fazer um paralelo com aqueles anúncios em alto-falante. O anúncio consegue sair em busca do destino, mas não temos certeza se o destinatário da mensagem conseguiu ouvi-la.

Entendendo o UDP, fica claro nosso problema - a falta de confiabilidade dele fez com que as mensagens trocadas pelo bate-papo se corrompessem de diversas formas! Mas se isso é natural desse protocolo, por que alguém escolheria usá-lo?!

As características já descritas do UDP podem parecer contraprodutivas no geral, mas elas formam um outro atributo que dá muito poder ao protocolo: a velocidade! No geral, o protocolo UDP permite uma comunicação bastante rápida, o que é muito vantajoso.

Velocidade alta mas confiabilidade baixa, ainda parece suspeito - não funcionou no nosso caso. Acontece que o UDP justamente não é feito para esse tipo de caso! Na verdade, o UDP tem sua grande vantagem quando se trata de serviços cuja velocidade é fundamental e a perda mínima de dados não muito desvantajosa.

Um exemplo é com jogos online, em que é normal alguns _bytes_ se perderem na comunicação,mas que é sempre importante que a aplicação continue rodando com rapidez (sem se importar tanto com as perdas e falhas), para que não ocorra o famigerado _[**lag**]_.

Mas e agora? Se o UDP não serve para a gente, o que podemos usar em seu lugar?

## O protocolo TCP

O protocolo TCP é, talvez, o mais utilizado na camada de transporte para aplicações na Web. Diferente do UDP, o TCP é voltado à conexão e tem como garantia a integridade e ordem de todos os dados.

Para manter a confiabilidade dos dados, o TCP utiliza um aperto de mãos de três vias, o _[**three way handshake**]_, também chamado de **SYN,SYN-ACK,ACK**.

O nome **SYN,SYN-ACK,ACK** é uma resumida descrição de como esse _handshake_ funciona. A conexão entre dois hosts começa com o primeiro enviando ao segundo um pacote de sincronização (**SYN**chronize).

O segundo host recebe esse pacote e responde com a confirmação do sincronização (**SYN**chronize-**ACK**nowledgment). O primeiro host, por fim, manda uma confirmação (**ACK**nowledge) para o segundo, assim estabelecendo a conexão.

Com o TCP, de fato temos uma conexão entre um ponto e outro, comumente chamados de **servidor** e **cliente**. É interessante notar que o TCP permite o envio simultâneo de dados de ambos os pontos ao outro, durante todo o fluxo de comunicação.

Desse modo, o TCP é ideal para casos em que a confiabilidade dos dados é essencial, como quando se trata de mensagens de texto! Trocando o uso do UDP pelo TCP em minha aplicação,tudo vai funcionar bem, mesmo que com uma velocidade possivelmente um pouco menor.

Afinal, o importante é que a troca de dados, ou seja, de mensagens, seja efetuada com sucesso, de modo que quem está se comunicando consiga se entender!

## UDP ou TCP?

É certo que não existe um protocolo certo ou errado, nem um melhor ou pior que outro por essência. O que existe são situações diferentes, e essa é a chave para trabalhar com aplicações que se comunicam com diferentes máquinas.

Nesse post, entendemos algumas das diferenças entre os dois principais protocolos da camada de transporte dos modelos da Internet: o UDP e o TCP. Assim, entendemos a importância de ambos os protocolos e quando devemos preferir um ou outro.

Ao final, como resumo, podemos entender que o UDP serve melhor casos em que a integridade constante dos dados não é essencial (é menos importante que a velocidade da comunicação), como em livestreams de vídeos e jogos online.

Por outro lado, o TCP funciona melhor em casos que a confiabilidade do transporte de dados é o foco, como quando trabalhamos com comunicação em texto ou com documentos.

O mais importante, portanto, é entender as diferenças entre os protocolos e, assim, saber qual utilizar em cada caso. Assim, teremos uma aplicação mais funcional!

E aí, achou o tema do post interessante? Então dê uma olhada em nossa [**formação de administrador de redes**], em que você se aprofundará ainda mais em redes de computadores e como elas funcionam!




**Boa parte dos designers mais experientes ainda confunde esses dois conceitos. Inclusive há muitas vagas por aí que pedem "designer UX / UI", o que leva a crer que é a mesma coisa.**

E isso te dá um ótimo motivo para ler este texto: sabendo o que cada uma dessas coisas significa, você vai estar à frente de muitos profissionais antigos no [**mercado de design**], pelo menos nesse quesito.

Pronto para acabar com essa dúvida de uma vez por todas? Então confira o que UX e UI têm de parecido e de diferente, entenda a aplicação dos conceitos e como atingir bons resultados em cada um, nos seus [**futuros jobs de design**]! Vamos lá!

## Os significados de UX e UI

A confusão já começa pelo nome. São duas siglas parecidas, e isso, por si só, já induz ao erro. Vamos esclarecer o significado em inglês, sua tradução e as interpretações corretas:

### User Experience (UX)

[**UX significa user experience ou, em bom português, “experiência do usuário”**]. A palavra “usuário” aqui é muito importante, e pode ser a chave para que você nunca mais confunda os dois termos.

Quando falamos de experiência do usuário, estamos falando de algo subjetivo.

Isto é, por mais que um designer ou web designer se esforce, ele não tem 100% de controle sobre aquilo que as pessoas vão sentir quando experimentarem um produto que projetou.

Uma parte da opinião das pessoas vai ser sempre emocional, momentânea e até impulsiva, em alguns casos. Isso significa um certo grau de imprevisibilidade na aceitação desse produto.

### User Interface (UI)

Já a sigla UI significa user interface, o que, traduzido para o português, ficaria “interface do usuário”. Neste caso, estamos falando de algo bem mais objetivo e controlável.

O UI Designer cuida daquela parte em que o usuário interage com um site (no caso do web design), layout ou produto.

Os botões de ligar e desligar de um celular são visíveis? O layout e as cores de um trabalho gráfico deixam à mostra todas as informações que o público deve visualizar? O software é intuitivo? A ordem dos comandos se mantém na memória do usuário entre uma utilização e outra?

Todos esses detalhes fazem parte do UI Design.

## Como esses dois conceitos são aplicados

UX e UI são utilizados juntos para melhorar os efeitos do design sobre quem tem contato com ele. **Assim, uma forma didática de encarar suas diferenças seria pensando que você melhora a interface do usuário (UI) e, com isso, tenta criar uma melhor experiência do usuário (UX).**

Não custa repetir: você nunca mais vai fazer confusão se pensar que pode controlar a interface de um produto ou site, mas não pode ter total certeza de quais efeitos isso vai causar em quem está do outro lado.

Melhor dizendo, você não tem certeza antecipadamente desses efeitos. Mas, uma vez que um produto é colocado em circulação, é interessante recolher feedbacks de quem o utiliza e, a partir deles, entender o nível de experiência do usuário do seu produto.

Se essa experiência não estiver no nível esperado, você faz novas alterações ou cria uma nova interface, coloca essa nova interface em circulação e mede os resultados dela na experiência mais uma vez.

Se for possível repetir esse processo várias vezes, é certo que o nível de experiência do usuário do seu produto vai subir consideravelmente.

Esse é um processo bem simples e que faz parte da rotina de qualquer designer. Automóveis, sapatos, roupas, artigos esportivos e qualquer outra coisa em que as técnicas de interface do usuário podem ser aplicadas seguem essa lógica.

Até mesmo o design gráfico e o web design, com seus layouts de blogs e [sites], material gráfico impresso ou para divulgação na internet.

## Como fazer uso de UX e UI para uma experiência completa do usuário

Se você parar para pensar, um produto com bom nível de experiência do usuário tem enormes chances de se tornar um sucesso.

Por outro lado, ainda que obedeça a diversos critérios técnicos — isto é, técnicas de UI como consistência, bons feedbacks, atalhos claros e mensagens de erros compreensíveis —  dificilmente ele vai emplacar se as pessoas não se envolverem emocionalmente com ele.

Alguns exemplos mostram como essa relação é curiosa. Se pensar em uma plataforma de armazenamento em nuvem, como o Dropbox ou o Google Drive, você vai ver que eles não alcançaram lugar de destaque entre a concorrência apenas por requisitos técnicos. Foi preciso um algo mais para cativar seus usuários. Já viu como foi o [**MVP do Dropbox**]?

Muita coisa da experiência do usuário, por exemplo, não tem a ver tanto com as funcionalidades.

O site da [**MailChimp**] é bem funcional, mas tem um aspecto do seu design — como as interações com o chimpanzé, mascote da empresa — que transformam o envolvimento com a marca em algo absolutamente emocional.

Essa plataforma, que oferece um software de e-mail marketing, brinca com as expectativas das pessoas ao disparar e-mails. Por exemplo, ela exibe animações bem-humoradas que suavizam o medo de que haja um erro num e-mail antes de um disparo para milhares de pessoas.

Quem a utiliza tende a perceber essas brincadeiras como uma descontração em um momento de tensão. Ou seja, a plataforma é vista como amigável e humana, o que vai muito além do quanto seus botões ou layout são práticos.

É possível, aliás, que haja produtos com boa interface, mas uma experiência do usuário pobre.

E vice-versa: um produto tecnicamente ruim pode ter boa aceitação e experiência do usuário porque as pessoas o acham bonito ou porque ele é uma reedição de algo que foi lançado quando elas eram crianças, por exemplo.

Mas tenha em mente que, embora subjetivo, o UX Design não é imprevisível. Há formas muito eficazes de compreendê-lo e aplicá-lo com sucesso. Caso contrário, não haveria especialistas nesse conceito, como é o caso de [Dain Miller]. Veja como captar e prever a experiência do usuário:

- Estudando o gosto do consumidor por meio de pesquisas: sempre que uma empresa te contratar para desenvolver um produto, pesquise as preferências das pessoas que vão utilizá-los.
- Mantenha um canal aberto com os usuários, em que eles possam dar feedbacks constantes. Criadores de software e aplicativos fazem uso desse recurso há um bom tempo.
- Seja fiel aos resultados da experiência do usuário (UX), mesmo que elas contrariem algumas regras básicas de praticidade. Como dissemos há pouco, nem tudo no sucesso de um produto vem do lado racional do usuário.

Tomara que, depois de ler este texto, a confusão entre essas duas categorias seja coisa do passado para você. E, que, além de tirar as suas dúvidas, você tenha se divertido com a leitura!

Ao escrevê-lo, tentamos usar tudo que sabemos de interface do usuário: organizamos o conteúdo e colocamos as informações numa linguagem que soasse o mais próxima possível de você.

Será que deu para entender como é possível estender esses conceitos até para outras áreas fora do design?

E que tal compreender essa diferença mais a fundo com o nosso curso [**UX: o que é experiência do usuário?**] **Tire suas dúvidas sobre UX e UI, aprenda sobre Gamestorming, usabilidade e muito mais!**


Descubra as **vantagens do Branding** para o seu negócio!

Se você está lançando a sua marca, se está pensando em empreender ou tem uma empresa que está passando por dificuldades em se destacar entre os concorrentes, você vai precisar de uma estratégia forte para que os seus produtos e serviços entrem na mente e no coração dos futuros clientes.

Quando a sua empresa ou produto conseguem a lealdade dos consumidores, [**isso gera um maior valor à sua marca e você pode aumentar a margem de lucro mais rapidamente.**]

## Gestão de marca: por que você deve se preocupar com ela?

Para ganhar clientes fiéis é necessário gestionar a marca de maneira bem pensada: considerar não só as funcionalidades dos seus produtos, mas também **elaborar cuidadosamente algumas ideias que a marca quer transmitir ao seu público** e levar em conta o estilo de vida ao qual ela estará ligada.

O que a empresa quer que as pessoas sintam ou façam ao usar os produtos e o que elas podem conseguir com eles?

O conjunto de ações para se trabalhar a marca é chamado de **branding** ou _brand management_. E não se deixe enganar: não só grandes empresas devem se preocupar com o posicionamento de suas marcas, mas também **pequenos empreendedores e marcas ainda novas precisam ter um excelente branding**, pois os consumidores cada vez mais querem **relacionar-se com as marcas**, e não apenas comprar.

Ao diferenciar sua marca das demais, você consegue garantir uma conexão duradoura com o seu público, tal como fizeram diversas marcas famosas. Mas como isso é possível?

## O segredo para se construir uma marca forte

**Vamos imaginar agora que você criou a sua marca de capacetes e acessórios para ciclismo de rua**, chamada _Urban lovers_.

Você tem ótimos produtos criados com materiais de alta qualidade e com um design notável e está pensando em como vendê-los. O problema é que **a sua empresa não é a única que oferece capacetes e as pessoas não conhecem as vantagens de usar os seus**.

Nesse cenário, você tem que trabalhar a marca e construir a identidade dela.

Pare por um minuto e pergunte-se: o que os produtos da _Urban lovers_ podem trazer para os amadores de ciclismo? Claro, no caso dos capacetes, o que vem em primeiro lugar é a segurança, certo? **O fato de que um produto pode salvar a vida pois protege contra lesões graves da cabeça já deve ser um ótimo argumento para a compra, não é mesmo?**

Com certeza. Mas **os ciclistas não querem ter um acidente de bicicleta**. E as empresas que fabricam capacetes também não. Então, precisaremos considerar outros atributos de um capacete que podem ser importantes para o consumidor, e mais, veremos quais ideais este acessório consegue trazer para ele.

Você já ouviu falar sobre o “Círculo dourado” do Simon Sinek? Ele é um especialista de branding e _storytelling_ que se tornou conhecido após a sua palestra do TED, chamada “_Comece com o porquê_” ou _Start With Why_ no original.

Sinek mostra que algumas marcas famosas e queridas pelos consumidores ao redor do mundo, tais como a Apple, apostaram nas estratégias de **sempre pensar primeiro no propósito da sua marca**, no porquê de sua existência. Confira na ilustração a ideia do “Círculo dourado”, com o mais importante no centro.

imagem

E sim, você acertou: conseguir que a sua marca torne-se referência para seus potenciais clientes requer esse **apelo emocional**, algo que move os consumidores e deixe-os sentindo-se especiais.

Atenção aqui: **as boas práticas do branding não só envolvem o produto**! Você também pode se destacar por seu atendimento na hora da compra e por fazer uma ótima experiência no pós-venda.

### Receita de bolo?

Uma vez que cada marca é um pouco diferente e cada negócio tem suas particularidades, **não existe um manual completo para se desenvolver uma marca de sucesso**. Não há mágica de só brincar com as emoções dos consumidores, e uma ação de branding que deu certo para uma empresa pode não funcionar para outra.

Entretanto, vale a pena investir em branding e desenvolver uma proposta única do seu negócio, sem dúvida alguma. Uma marca verdadeira é a que tem alma e o público consegue perceber isso muito bem.

Lembre-se: **todos compramos o porquê**.

## Branding: pessoas em primeiro lugar

Mesmo que a receita de bolo não exista no caso da gestão da marca, tem algo que, sim, costuma funcionar para que a empresa ganhe a atenção dos consumidores: **antes de falar sobre o seu produto, foque nas pessoas**. As marcas de sucesso fazem isso muito bem. Veja o seguinte exemplo da **Starbucks**.

Quando visitamos qualquer franquia dessa rede de cafeterias, **nem precisamos gostar de café**, de fato. Estamos lá nos divertindo com os amigos, lendo um livro ou até fechando um negócio, comendo um lanche gourmet e tomando uma xícara de nossa bebida preferida, personalizada com o nosso nome.

O espaço das cafeterias é quase um refúgio. E a Starbucks sabe disso, logo, o posicionamento da rede é: “_Inspirar e nutrir o espírito humano_.”

Um colaborador da rede, Howard Behar, descreveu o negócio da empresa assim: “_Não estamos no setor de café, servindo pessoas. Estamos no setor de pessoas, servindo café.”_

Não é exatamente essa **preocupação com as pessoas** que faz da Starbucks uma marca de sucesso?

![Branding - Como criar uma marca forte]

Outro caso de sucesso é o da **Heineken**. A marca fez com que milhares de pessoas se tornassem suas fãs com um único vídeo, em que não vemos sequer uma única gota de cerveja.

O filme curto _The candidate_ documenta a jornada de um candidato desde a primeira entrevista até a contratação em um processo de recrutamento nada convencional, mostrando que, antes de qualquer coisa, são as pessoas, suas ações e seus valores que importam mais na realidade da empresa. Concorda que essa é uma ótima maneira de se promover uma marca?

Como podemos ver, o branding não se limita aos atributos do produto. O segredo de encantar os clientes - e torná-los, de fato, seus fãs - é **fazer o não esperado**, causar **sentimentos novos** e oferecer **experiências inesquecíveis**.

Conheça as estratégias para construir uma marca forte no [**curso online Branding: Criando uma marca forte**], em que a instrutora Tuany **cria uma marca do zero** e mostra **cases inspiradores de empresas famosas por terem um ótimo relacionamento com o seu público**, chamadas também de _Lovemarks_. Bora aumentar o valor da sua marca e conseguir clientes apaixonados de verdade pelo que você oferece?




Essa combinação resultou em plataformas mais amigáveis, simplificando a identificação dos elementos necessários, a interatividade e a navegação, sem falar na versatilidade para adaptação aos diversos tamanhos e formatos das telas que usamos hoje.

A [**usabilidade**] foi o principal combustível para tanta mudança, considerando que a experiência do usuário é mais importante do que shows pirotécnicos aquelas interfaces pesadas e cheias de recursos.

## Minimalismo

Em um passado recente, quando a internet começou a integrar o cotidiano das pessoas, os profissionais de web design desenvolviam projetos com o visual mais realista possível.

Os elementos tinham uma sobrecarga de sombreamentos, chanfros, relevos, formas elaboradas, fundos poluídos e fontes rebuscadas. Era uma linguagem que tentava transferir as sensações do mundo real para o digital a fim de criar uma atmosfera familiar ao usuário.

Surgiu, então, o flat design como contraponto a todo esse movimento de ilustrações chamativas e animações pesadas, que dificultavam o carregamento e a navegação dos sites.

Além disso, os excessos de ornamentos em projetos digitais não possuem funcionalidade, servindo apenas como distração ao usuário. Assim, sua experiência é prejudicada, impedindo o alcance dos objetivos procurados.

É por essa razão que o caráter minimalista do flat design é tão importante. Ele tem a finalidade de reduzir todo o excesso e contribuir para uma funcionalidade efetiva.

Mas nem por isso o flat deve ser visto como um estilo monótono — ao contrário, para compensar a ausência de adornos, os elementos recebem atenção especial, principalmente nas cores.

## Cores

Ao minimizar os efeitos realistas dos layouts, as cores podem ser usadas sem cerimônia — porém com bom senso, sempre. **Os tons vibrantes e sólidos (sem degradê) são predominantes e, normalmente, usados em combinações alegres, diversificadas e contrastantes.**

Aliás, o simples uso de contrastes entre as cores cumpre o papel de fazer com que ilustrações e botões chamem a atenção e guiem o olhar do visitante pela tela.

Vale lembrar que as [**cores possuem a importante função de transmitir sensações e emoções**], influenciando na forma como o usuário interage.

## Elementos geométricos

Botões, abas e campos com textos sofreram mudanças significativas nessa nova tendência. Adquiriram formas geométricas simples como triângulos, quadrados, círculos e retângulos combinadas com cores sólidas.

Com essas alterações, a ideia é comunicar mais com menos. Por isso, projetar esse tipo de design não é tão fácil quanto parece. O resultado deve ser prático, mas também atrativo, vibrante e agradável.

Em razão disso, os designers especialistas nessa área precisam cultivar um conhecimento profundo sobre a dinâmica dos elementos empregados — cores e formas — para dar um significado impactante e facilitar a compreensão das interfaces.

## Tipografia

Para compor uma interface perfeitamente alinhada com o flat design, as fontes devem seguir a mesma linha dos demais elementos. As mais simples, limpas e sem serifas são perfeitas para esses projetos.

Já as fontes mais elaboradas, como as serifadas, display e script (escritas à mão) podem ser usadas, mas com cautela: apenas em projetos que estejam perfeitamente ajustados a esses estilos.

A filosofia do flat design é simplificar e facilitar. Nesse sentido, os textos devem ser compreendidos rapidamente — inclusive nas telas menores, como smartphones.

## Compreensão rápida

A mudança na forma dos [**ícones**] é bastante expressiva. Eles passaram a ser representados com imagens simples e limpas, para ajudar a transmitir as mensagens de forma mais clara.

Levando em conta que esses elementos são projetados para indicar ações ou propósitos universais de compreensão instantânea, a solução encontrada foi a simplificação, embora a percepção da mensagem esteja sujeita à bagagem cultural de cada pessoa. Dessa forma, desenhos simples com blocos de cores adequados ao significado do ícone tendem a ser rapidamente percebidos.

## Reflexões sobre o uso

Conforme já dito antes, o flat design conquistou uma legião de adeptos pela sua praticidade e usabilidade. Porém, será essa sempre a melhor forma de comunicar uma ideia ao usuário? Façamos algumas pontuações sobre o assunto:

### Flat design é apenas uma tendência

É importante saber distinguir tendência de regra. As tendências chegam para dar uma nova roupagem, um jeito diferente de fazer as coisas, com o intuito de despertar o público para o consumo de algo inédito e sair da mesmice.

É nesse contexto que o design plano se encaixa. Por isso, é fundamental pensar bem antes de aplicar tal conceito em tudo o que se quer realizar no mundo do design. Um logotipo, por exemplo, pode estar defasado daqui a algum tempo, já que foi concebido com apoio em uma tendência.

### A experiência sensorial pode ser afetada

A sensação visual de uma textura pode ficar consideravelmente prejudicada se substituída por uma cor sólida. Imagine que uma paisagem cheia de natureza verdejante seja representada por um desenho chapado e minimalista. Isso, sem dúvida, muda completamente a percepção do usuário com o conceito e a atmosfera que se pretende passar.

Nesses momentos críticos, é sempre bom ponderar sobre o uso do flat e aderir a uma boa foto para ilustrar seu trabalho.

### A perspectiva espacial desaparece

Esse é um fator agregado à experiência sensorial. Novamente, a cor chapada empobrece a experiência de sentir os diferentes planos e dimensões de profundidade.

É claro que o design plano trouxe uma revolução em termos de usabilidade, e seria muito útil se o conceito continuasse a fazer parte dos projetos de design. No entanto, é preciso estar atento ao equilíbrio e dar uma chance às alternativas que podem enriquecer seu trabalho. A fotografia, aliada aos layouts limpos, é um exemplo disso.

O uso excessivo do flat design deve ser ponderado, uma vez que o principal objetivo dos designers despertar emoções e sensações no público-alvo precisa ser priorizado. A experiência sensorial com imagens e fotografias causa uma impressão bastante particular e muito positiva se bem aplicada.

Quer ficar por dentro do que há de melhor no design, na programação e na tecnologia? Siga-nos no [Facebook], [Twitter], [LinkedIn] e [YouTube] para não perder nenhuma novidade!




 Afinal, as opções são tantas que costumam até ser motivo de discussões acaloradas entre os profissionais da área de criação! E não é à toa: a escolha da fonte ideal para cada trabalho é fundamental e não pode ser encarada como algo secundário.

Cada [**projeto de design**] é elaborado a partir de um conceito, e a fonte eleita deve estar de acordo com ele. Em outras palavras, todo o conjunto do projeto precisa interagir harmonicamente, o que inclui o uso certo da fonte tipográfica.

De fato, no Brasil, a falta de valorização do trabalho dos type designers ou tipógrafos demonstra negligência com a tipografia. Com isso, muitos trabalhos deixam evidente a necessidade de um acabamento melhor, comprometido pela falta de importância dada a esse detalhe.

Mas, ao contrário do que muitos pensam, o design de tipos é uma especialidade. E, nesse sentido, é importante que profissionais e leigos passem a rever sua postura e entender que esse ramo do design é indispensável.

Então, se você quer entender de vez qual é a importância da tipografia para design e conferir algumas dicas para escolher a fonte certa em seus projetos, continue lendo este post!

## A evolução da tipografia

[**O processo de criação tipográfico**] é minucioso e milimétrico, em que as fontes são desenhadas uma a uma. Um verdadeiro trabalho de “formiguinha”, do qual poucos entendem o valor talvez por estarem habituados ao acesso fácil e uso corriqueiro.

Nesse sentido, a arte nem sempre foi descomplicada e, muito menos, acessível a todos. No entanto, com a chegada da computação gráfica aos lares e escritórios, o uso da tipografia realmente se popularizou.

Todos agora podem se servir das mais variadas fontes, compondo textos e layouts do jeito que bem entenderem. E essa abundância de fontes disponíveis aos designers e aos leigos é incalculável, se contarmos tanto os trabalhos altamente qualificados quanto os amadores e experimentais.

Inclusive, muitas vezes, tipos criados exclusivamente para determinados projetos podem acabar atendendo a outras finalidades. É o caso das fontes criadas para os filmes Vida de Inseto e A fantástica Fábrica de Chocolate, por exemplo, usadas hoje com frequência em títulos e até fachadas de comércio.

## A escolha ideal da tipografia para design

Bom, sabemos que o trabalho profissional sempre requer muito estudo e bom senso. Quando chega a hora de lidar com a tipografia, todo designer se vê diante do dilema: que fonte escolher agora? E não é raro que essa etapa consuma bastante tempo e energia.

Como dissemos, as características essenciais de cada tipo devem estar alinhadas ao conceito e imagens usadas nos projetos. Assim sendo, esse árduo (mas prazeroso) processo de escolha da melhor fonte pode ter início no entendimento de questões puramente técnicas relativas aos estilos que existem atualmente.

É o caso, por exemplo, da [**classificação dos tipos em grupos**], conhecidos como: serifados, sem serifa, cursivos, display (decorativas) e suas variações. A partir desse conhecimento, então, pode-se entender qual estilo se aplica melhor ao trabalho que está sendo desenvolvido.

O caráter de uma composição deve ser definido pelo conjunto integrado da escolha da fonte, [**as cores e técnicas de design**], para contribuir com a compreensão do leitor a respeito do conceito empregado no projeto.

Além disso, lembre-se de que a interpretação da mensagem também está sujeita a fatores psicológicos, filosóficos e culturais de uma época, bem como de quem a percebe. Assim, é preciso relacionar tudo isso aos elementos gráficos do projeto e ao público a ser alcançado.

### Tipografia em design gráfico

Em trabalhos de design gráfico, é muito comum vermos a criação de logotipos apenas com a fonte, dispensando o uso de símbolos e desenhos representativos. Os exemplos disso são incontáveis, mas podemos citar alguns famosos: Google, Dove, Canon, Toyota e Faber-Castell.

Desses logotipos, alguns mantêm as formas originais das fontes tipográficas, outros, modificam algumas linhas. É frequente também a criação de fontes exclusivas para uma determinada marca, como a VAIO, da Sony, a Disney e a Coca-Cola.

E, nos layouts de peças publicitárias, o papel dos tipos não é menos importante. Para cada tema é necessário adaptar o texto ao conceito empregado, e o uso de imagens, ilustrações, cores e fontes também devem conversar de forma equilibrada.

Isso vale até para o projeto gráfico de um livro: o uso de uma fonte de características clássicas como a "[**Garamond**]", por exemplo, complementa o conceito de um romance do século XIX ou mais antigo. Já uma tipografia mais irreverente como a "[**Brushstroke Plain**]" se encaixa melhor em um anúncio de temática jovem e descontraída.

### Fontes para textos

Na composição de textos, é importante considerar os dois grandes grupos de fontes disponíveis: as serifadas e as não-serifadas. Como o próprio nome diz, eles dizem respeito à existência, ou não das serifas — pequenos prolongamentos posicionados no final das hastes dos caracteres.

Isso pode até parecer uma constatação insignificante, uma vez que ninguém pensa nesse detalhe enquanto está lendo. Porém, a fonte certa para cada tipo de texto influencia muito na satisfação de quem está lendo.

A explicação para o uso de fontes serifadas em textos é o entendimento de que as serifas deslizam o olhar do leitor pelas páginas, proporcionando maior conforto visual. O exemplo mais usual desse tipo de fonte é a Times New Roman, muito utilizada em blocos de textos longos, principalmente livros impressos.

Já as fontes não-serifadas são mais enxutas e retas. Assim, tendem a ser usadas em textos curtos, títulos e legendas, valorizando as palavras individualmente.

Seja qual for o tipo, escolher a opção mais adequada permite que os leitores tenham uma boa experiência de leitura. E, além dessas questões práticas, também é conveniente adaptar o estilo ao gênero literário que está sendo abordado no livro.

No caso de jornais e revistas, por exemplo, a atenção tende a se voltar para o tema desenvolvido. E tudo sempre amparado nas ilustrações e no contexto.

Atualmente, entre as fontes mais recomendadas para textos longos impressos, podemos citar: Book Antiqua, Georgia, Adobe Garamond Pro, Goudy Old Style, e outras similares.

### Tipografia para web

[**Na web, a mesma lógica do conforto visual**] deve ser levada em conta na hora de compor os textos apresentados. Mas, nesse caso, as fontes mais limpas sem serifa funcionam melhor para a experiência do usuário de internet, incluindo as telas pequenas como as dos smartphones e tablets.

Os tipos mais comuns são Arial, Lato e Helvetica fontes mais limpas, fluidas, e que permitem uma leitura leve, sem incômodos visuais para leitura em ambiente digital.

Na internet também é importante considerar os conceitos empregados em sites e tipos de negócios para adequar as fontes ideais. Em sites institucionais, por exemplo, é sugerido o uso das mais simples e básicas como Arial, Palatino e Verdana devido ao seu desenho sóbrio.

Para sites de varejo, por outro lado, fontes com mais “personalidade” podem cumprir melhor o papel desse segmento de negócio, como a Lucida Grande. Já em plataformas referentes a entretenimento e artes, é possível ousar um pouco mais.

De toda forma, lembre-se sempre de garantir o melhor conforto visual ao visitante. Afinal, no ambiente digital é muito mais fácil para o usuário desistir de uma página para, imediatamente, escolher outra mais amigável.

Enfim, como vimos, a tipografia para design sempre teve um papel extremamente importante ao longo da história.

Hoje, as possibilidades de uso criativo são infinitas, assim como são vastas as regras e padrões a serem seguidos. Assim, escolha a sua e use com cuidado, impulsionando cada vez mais seu trabalho e sua posição no mercado!

E aí, gostou deste post? Quer saber ainda mais sobre design lendo outros posts como este?Então, siga-nos nas redes sociais e fique pode dentro das próximas novidades: estamos no [Facebook], [Twitter], [LinkedIn] e [YouTube]!




Conversando com os alunos que mais estudam na plataforma, nosso aluno Henrique Lopes me enviou três perguntas sobre a carreira de um desenvolvedor que está começando.

Considerando as três perguntas, resolvi fazer um vídeo respondendo todas as dúvidas com a minha experiência como programador.

Não perca tempo! Veja agora mesmo o vídeo:

https://www.youtube.com/watch?v=VL3XTtHJLJQ&feature=youtu.be

O que achou das dicas? Compartilhe nos comentários sua experiência :)

Está querendo fazer cursos para alavancar sua carreira porém não sabe por onde começar? Pensando nisso preparamos [**Formações**] com diversos cursos tanto para programadores que estão começando agora, como também para os mais experientes.




Quando desenvolvemos nossos sistemas, é normal que a gente faça pensando no usuario final. Portanto, ao criar um formulário de login que verifica um email e senha no banco de dados já temos em mente o que precisamos fazer no back-end:

- Escolher uma extensão para conectar com o banco de dados (Se você não sabe qual usar, dê uma olhada no meu post sobre [**como acessar o banco de dados com PHP 7: mysqli ou PDO?**])
- Escrever uma query buscando pelo email e senha
- Executar a query

Neste post vamos trabalhar com PDO. Com essa extensão, teríamos algo como:

php

Beleza, assim conseguimos verificar o email e a senha. Para um usuário comum, nosso método funciona perfeitamente!

Mas, um usuário malicioso, com um pouco de conhecimento, pode tentar passar códigos SQL nos inputs do form, como por exemplo:

- no campo email: qualquercoisa@aleatoria.com
    
- no campo senha: `' or id = '1`
    

Nossa query completa ficaria:

`SELECT * FROM Usuario Where Email = 'qualquercoisa@aleatoria.com' AND Senha = '' or id ='1'`

Ou seja, estamos selecionando tudo da tabela `Usuario` onde o email é igual a "qualquercoisa@aleatoria.com" e senha é vazia OU o id igual a 1.

A setença `OR ID = 1` será verdadeira se houver o registro no banco. Como os valores de id, normalmente, são auto incrementados isso fará com que o usuário malicioso entre no nosso sistema como o usuario de id = 1.

Mudar a query desta forma é o que chamamos de [**SQL Injection**]. Existem diversas formas de lidar com isso, a mais comum é usar [**prepared statement**], uma forma de escrever queries passando atributos ao invés de concatenar as variáveis com a string.

Com PDO, nosso prepared statement ficará:

php

Ao invés de usar a função query da conexão, podemos usar a função `->prepare()` e então passar os valores de `Email` e `Senha` pelo método `->bindValue()` que realizará uma verificação do conteudo das variáveis `$email` e `$senha` evitando os casos mais comuns de SQL Injection.

Somente após, associamos aos atributos `:email` e `:senha` da query e, por fim, é executada a query!

Além disso, aumentamos a semantica já que usamos parametros na query ao invés de concatenar os valores das variáveis `$email` e `$senha` na string `$query`.

Nesse momento, nossa query está algo como:

`SELECT * FROM Usuario Where Email = 'qualquercoisa@aleatoria.com' AND Senha = ' or id =1'`

Ou seja, estamos procurando na tabela `Usuario` a instância de email "qualquercoisa@aleatoria.com" e senha "or id =1". Logo, a senha não será validada e nosso usuario malicioso não entrará em nosso sistema!

É extremamente importante pensarmos em todos os tipos de usuario quando desenvolvemos nossos sistemas. Por isso, temos que estar sempre atentos ao desenvolver nossas queries e nos proteger contra SQL Injection.

E você, o que achou de SQL Injection? Gostou de prepared statements? Compartilhe sua opinião com a gente!

Quer aprender mais sobre PHP? Conheça a formação [**desenvolvedor PHP junior**] aqui da alura! Ou então, que tal ir além e conhecer mais a fundo a extensão PDO, suas vantagens e desvatagens? Faça o curso de [**PDO**] com a gente aqui na Alura!





imagem 

Estou trabalhando em um projeto [**PHP**]. Só que quando tento acessá-lo pelo navegador vejo o seguinte erro:

imagem, o grupo dono do arquivo (que pode conter vários usuários), e as dos demais usuários que não pertencem ao grupo dono.

Essas permissões podem ser de leitura (`r`, read), escrita (`w`, write) e execução (`x`, execute).

A permissão de leitura (`r`) permite visualizar o conteúdo de um arquivo ou diretório, já a permissão de escrita (`w`) serve para alterar o conteúdo de um arquivo e diretório.

A opção de execução serve para tornar o arquivo um executável, ou, em caso de diretórios, para poder [acessá-lo] e usar comandos, como o `cd`.

Certo, já sabemos o que são e quais são as permissões, mas como podemos saber quais estão sendo usadas neste arquivo?

## Visualizando as permissões

Para visualizar a permissão de um diretório, podemos ir até o local onde esse diretório se encontra.

O comando `cd` (change directory) pode nos levar até esse local, que no meu caso fica em `/var/www/html`. Portanto:

`$ cd /var/www/html/`

imagem o conteúdo deste diretório:

imagem.

`$ ls -l`

imagem ou um diretório (`d`).

Os nove caracteres restantes nos mostram as permissões do usuário dono, grupo dono e outros usuários respectivamente:

imagem é apresentado.

Sabendo disso, já conseguimos dizer qual a permissão do nosso projeto loja. O usuário dono tem todas as permissões (`rwx`), enquanto o grupo dono e o demais usuários não possuem nenhuma permissão (`---`).

Mas, se eu criei os arquivos e tenho todas as permissões, por que não consigo acessar a página pelo navegador?

Quando acessamos uma página pelo navegador, por padrão, o servidor não sabe quem é o usuário, ou seja, quem acessa a página web utiliza a permissão **outros**.

Como o diretório do projeto não possui permissões disponíveis para o grupo de usuários **outros** não conseguimos acessar a página pelo navegador.

Logo, precisamos alterar as permissões desse diretório para conseguir ter acesso pelo navegador. Mas como podemos fazer isso?

## Alterando permissões

Para alterar as permissões de um arquivo ou diretório, temos que alterar o modo (`chmod`, change mode) que elas estão organizadas.

Queremos que os outros usuários (`o`) tenham acesso de leitura (`r`) no diretório, assim conseguirão visualizar os arquivos neles. Então podemos dizer para o terminal:

`$ chmod o=r loja/`

imagem.

Já sabemos como alterar a permissão de uma pasta, então basta dizer que queremos adicionar (`+`), a permissão de execução (`x`):

`$ chmod o+x loja/`

imagem no diretório `loja/`:

`$ chmod -R o=rx loja/`

imagem. O que fazer caso eu queira alterar as permissões do usuário e do grupo dono do arquivo?

## Alterando a permissão do usuário e do grupo dono

Antes de mostrar como alterar a permissão do usuário e grupo dono de um arquivo ou diretório, vamos criar um arquivo de texto em qualquer lugar do sistema para ser usado como teste. No meu caso vou criar esse arquivo na área de trabalho:

imagem tenha, além dessas permissões, a permissão de executar o arquivo.

Então eu posso falar para o `chmod` acrescentar (`+`) a permissão de execução para o usuário dono (`u`):

`$ chmod u+x teste.txt`

imagem a permissão de escrita do grupo dono (`g`):

`$ chmod g-w teste.txt`

imagem, acrescentar as opções de escrita e execução para o grupo dono (`g+wx`) e deixar os demais usuários apenas com a permissão de execução (`o=x`):

`$ chmod u-x,g+wx,o=x teste.txt`

imagem, o `chmod` aceita também alguns números. Quando utilizamos números para alterar as permissões, dizemos que estamos utilizando o **modo octal**.

## Entendendo o modo octal

O modo octal recebe este nome, pois utilizamos oito números, de 0 à 7, cada um desses números correspondem a uma letra, ou a um conjunto de letras, no modo simbólico:

- 1 → Representa a opção de execução (`x`) no modo simbólico;
- 2 → A opção de escrita (`w`);
- 4 → A opção de leitura (`r`).

Quando utilizamos o modo octal, podemos passar o modo de permissões de cada grupo de usuários. A ordem é sempre: usuário dono, grupo dono e outros usuários.

Então eu posso falar para o `chmod`, por exemplo, colocar a permissão de leitura para o usuário dono (`4`), para o grupo dono a de escrita (`2`) e a de execução para os demais usuários (`1`):

`$ chmod 421 teste.txt`

imagem e escrita (`2`), basta somar o valor dessas permissões. Portanto teríamos `6`.

Já se queremos tirar todas as permissões, basta colocar `0`.

Para fazer o usuário dono ter todas as permissões (`7`) no arquivo, o grupo dono ter as permissões de leitura e escrita (`6`) e os demais usuários não tenham nenhuma permissão (`0`). Basta dizer isso ao `chmod`:

`$ chmod 760 teste.txt`

imagem

## Para saber mais

Além do `chmod`, outro comando muito utilizado quando é o [**chown**] (change owner). Esse comando consegue mudar o usuário e grupo dono de um arquivo ou diretório e só pode ser executado pelo superusuário, ou pelo usuário administrador utilizando o comando `sudo`.

**Devemos ter muito cuidado em dar permissões para os usuários que não fazem parte do grupo dono**, ou não são donos dos arquivos ou pastas. Pois, dependendo da permissão, esses usuários conseguem ter acesso a um diretório ou arquivo no sistema. Conseguindo visualizar, alterar, ou até mesmo excluir seu conteúdo.

## Tem permissão de prosseguir?

Permissões fazem parte do sistema. Sem elas não conseguimos visualizar, alterar ou executar arquivos, entrar em diretórios ou listar seu conteúdo. Até mesmo para acessar um site na internet precisamos de permissões.

No Linux, conseguimos alterar a permissão de arquivos e diretórios usando um comando próprio para isso, o `chmod`. Esse comando nos permite alterar as permissões do usuário e grupo dono do arquivo ou diretório e dos demais usuários.

Mas antes de alterar, temos que entender quais são essas permissões e como podem ser representadas.

Gosta de Linux? Aqui na Alura temos uma [**formação completa**] no sistema. Nela, você aprenderá comandos do sistema, sobre a árvore de diretórios, alguns comandos de rede, como adicionar usuários e grupos, além de muito outras coisas.




Bom, tanto em empresas, quanto no dia a dia de nossas vidas, nos deparamos com diversas situações que demandam muito de um pensamento criativo e jogo de cintura.

Para isso, existe uma prática chamada **Design Thinking** que, assim como diz o nome, nos faz "desenhar o pensamento", alinhando as condições reais de algum contexto, que ajudam a compreender melhor as ações e resultados esperados.

É importante esclarecer que não se trata de um método fechado, pois é muito comum associá-lo a fórmulas prontas e testadas para aplicar em qualquer situação, sem distinção. Não é o que acontece nesse caso

## Como funciona o design thinking

Alguns profissionais possuem um jeito próprio de conduzir o pensamento, apontando para o desconhecido e desafiando as regras convencionais aplicadas a tudo. Refletem livremente, buscando soluções de forma colaborativa para uma determinada questão, em fontes completamente distantes daquilo que pretendem criar ou resolver.

É uma condição que aprimora a criatividade, tornando-a mais completa e efetiva. Sair da zona de conforto, sem medo dos obstáculos que possam surgir no trajeto, é uma atitude necessária para conceber algo novo e melhor. Os designers são especialistas nisso.

A intenção é criar o máximo de empatia com o público-alvo, uma vez que as pessoas são o centro da preocupação durante o desenvolvimento de um projeto. O processo inclui não apenas o usuário final, mas toda a equipe multidisciplinar envolvida.

Esse trabalho colaborativo é essencial para encontrar soluções inovadoras. Os diversos ângulos abordados pelos membros da equipe oferecem interpretações variadas sobre as questões e contribuem de forma mais assertiva para o resultado.

O objetivo durante o processo é mergulhar na experiência cultural dos indivíduos e compreender sua visão de mundo e suas reais necessidades. Dessa forma, é possível identificar as barreiras e encontrar alternativas acessíveis para derrubá-las.

Esse é o caminho para mudar em definitivo o jeito de buscar e encontrar novos rumos para uma trajetória de sucesso e satisfação. Seu desdobramento ocorre em etapas. Confira:

## Etapas de aplicação do design thinking

A aplicação do design thinking exige um conhecimento profundo sobre a abordagem utilizada no design, de acordo com as seguintes fases aqui descritas resumidamente:

### Imersão

Nessa etapa, a equipe procura mergulhar na vida das pessoas e estudar seus padrões e necessidades. São analisados perfis de usuários diferentes para viabilizar a criação de soluções específicas.

As informações são coletadas pelos membros da equipe, que vão ao encontro do público para interagir com ele. Os questionamentos se relacionam com o que as pessoas falam, como agem, o que pensam e como se sentem.

Assim, é possível ganhar empatia, entender a visão do público, identificar suas crenças e anseios para nortear a segunda fase do processo — a ideação.

### Ideação

Essa fase, normalmente, tem início com a equipe realizando um brainstorming (técnica de geração espontânea de ideias). O objetivo é explorar o tema com a participação dos indivíduos envolvidos no processo, ou seja, usuários e profissionais de áreas pertinentes ao projeto em desenvolvimento.

As ideias eleitas são armazenadas para futura validação em reuniões com o cliente e posterior utilização na fase de prototipação — produto de trabalho na fase de testes de um projeto.

### Prototipação

Nesse momento, as ideias validadas na fase anterior passam da abstração à forma física para representar a realidade. É a hora de verificar se o produto está de acordo com o projeto e fazer ajustes, se for necessário.

Essa etapa é submetida à equipe multidisciplinar e ao usuário. Juntos, poderão interagir com o modelo e avaliá-lo, contribuindo com informações para evolução e aperfeiçoamento do protótipo.

Embora seja apresentada como a última fase do projeto, a prototipação pode acontecer durante as fases anteriores. As ideias que forem surgindo podem ser testadas e, até mesmo, implantadas.

### Realização

Por fim, a implementação do projeto é realizada nessa etapa, por meio do lançamento do produto ou serviço.

Vale reforçar que o design thinking pode ser usado em qualquer setor de negócio, na educação, na vida pessoal e em diversas outras áreas, por qualquer pessoa que conheça bem a técnica.

## Design thinking nas relações empresariais

A forma original de pensar e de agir atribuída aos designers foi percebida por gestores e administradores, que vislumbraram um novo horizonte para inovar no setor empresarial.

Hoje, um dos maiores desafios das corporações é a crescente pressão por resultados imediatos com o máximo de eficiência e mínimo de erros. Por exemplo: é muito comum designers se depararem com uma forte pressão para desenvolver, em pouco tempo, um projeto complexo que necessita de tempo e dedicação.

Nesses casos, não é raro que o resultado saia incompleto e precisando de diversos ajustes. Se houvesse menos pressão para o término do projeto, as chances de concluir um produto sem erros seriam bem melhores.

O maior problema, que ainda resiste em muitas empresas, é o cultivo de um método de trabalho em que não prioriza as necessidades das pessoas, mas o produto final e seus lucros. Essa prática é um resquício da primeira fase da [**revolução industrial ocorrida entre os séculos XVIII e XIX.**]

Nos dias atuais, o cenário empresarial vem mudando rapidamente e as novas formas de negócio trazem um perfil de [**profissional diferente**], mais participativo e proativo.

A criação de lideranças sustentáveis requer mudanças fundamentais nas regras de engajamento nos setores de trabalho. É preciso valorizar a empatia com as necessidades humanas básicas.

Considerando as características do design thinking, sua contribuição nas corporações pode servir para criar um ambiente mais cooperativo entre colegas de trabalho e líderes. Esses novos valores tendem a gerar resultados diferenciados para as empresas, partindo do desenvolvimento de soluções especialmente focadas nos usuários.

## Como o design thinking pode ajudar na sua vida pessoal

O planejamento e a organização da vida pessoal podem adquirir uma qualidade infinitamente superior com a adoção da abordagem do design thinking. Seu conceito não linear tem a capacidade de auxiliar na descoberta de possibilidades nunca consideradas antes.

É uma técnica muito útil para ajudar a otimizar melhor o cotidiano das pessoas usando as mesmas etapas — imersão, ideação e prototipação.

Por exemplo: comece o processo fazendo um balanço entre sua vida pessoal, familiar e profissional. Analise quanto tempo está sendo dedicado a cada uma das áreas da sua vida. Quanto é dedicado ao trabalho, ao convívio familiar e ao cultivo de atividades para sua própria satisfação e evolução pessoal.

Esse procedimento pode ser realizado por meio de anotações e esquematizações que facilitem a análise posterior. O objetivo principal é aperfeiçoar o dia harmoniosamente pensando no equilíbrio que essa abordagem pode trazer para a sua vida.

O passo seguinte é analisar as informações da fase de imersão e, na geração de ideias, criar a melhor solução para resolver os problemas encontrados. É uma forma de questionar e rever o estilo de vida adotado até esse momento e tentar se reinventar para ter uma vida mais plena.

## O design thinking aplicado na educação

Convém destacar a contribuição expressiva que o design thinking pode dar à educação, ilustrando seus benefícios por meio de uma iniciativa da [**IDEO**] empresa de consultoria global de design — que popularizou o termo ajudando organizações empresariais em seus projetos. A IDEO criou e disponibilizou um material para educadores e professores que, juntos, formularam um método denominado “aprendizagem investigativa”.

Segundo esse método, o aluno deixa de ser um mero receptor de informações para participar ativamente da formação do conhecimento. É um exemplo interessante de como é possível reestruturar as salas de aula tanto fisicamente quanto nos processos de aprendizagem.

Apoiada na premissa de que o design thinking é uma abordagem centrada nas necessidades humanas, a IDEO fundamentou seu projeto no desenvolvimento da aptidão de cada aluno de expressar seu pensamento e inovar.

A partir disso, ele será capaz de criar condições de contribuir melhor e com mais independência para um mundo mais pleno, independentemente da profissão que exerça na sociedade.

Entender o que é design thinking já faz parte das melhores práticas em todas as áreas do conhecimento. Seu conceito e aplicação tornam todos os tipos de relações mais dinâmicas e leves ao mesmo tempo. Agora, com base nas aplicações do design thinking, você pode começar a inovar de forma diferenciada.

Quer ficar por dentro das novidades do mundo do design? Siga-nos no [Facebook], [Twitter], [LinkedIn], [Google] e [YouTube]  e mantenha-se atualizado!

Curtiu essa nova maneira de resolver problemas? Aqui a **Alura** temos uma [**Formação em Design thinking**]. Nela você aprenderá sobre o processo de Design thinking, como solucionar problemas de maneira assertiva, como trabalhar com sua ideia e construir protótipos e muito mais.



Para realizar a comunicação entre os containers, podemos utilizar uma ferramenta do próprio Docker chamada de [**Docker Compose**]. Com o Docker Compose podemos criar um arquivo e especificar as propriedades de cada container, como comandos, **variáveis de ambiente**,…
   
Estou com um **container** com uma aplicação PHP que se comunica com um **banco de dados** para efetuar alguns testes antes de ir para produção. Então, fui rodar o container, porém quando realizei o login me deparei com os seguintes erros:

imagem que o Compose vai subir**.

Temos dois serviços que queremos subir, o banco de dados e a aplicação web. Então vamos começar especificando o serviço da nossa aplicação.

Neste caso, vou nomeá-la como `app`.

sql 

Nossa aplicação está baseada na **imagem** (`image`) `yuri/web`, e podemos dar o nome (`container_name`) de `app` por exemplo:

sql 

Nós precisamos também mapear as **portas** (`ports`) que nosso container vai usar. Neste caso, vou mapear a porta `8080` do nosso host, para a porta `80` do nosso container:

sql 

Bom, nosso **container depende (`depends_on`) de um banco de dados**, então vamos falar isso em nosso arquivo do Compose. Neste caso, vou falar que ele depende do serviço `db`:

sql

Mas o que é esse `db`?

**`db`** é o nome do nosso serviço de banco de dados. Ele nada mais é do que outro container, logo, podemos especificar no mesmo arquivo `.yaml` do serviço de aplicação.

sql 

Se ele também é um container, então é igualmente baseado em uma imagem. Neste caso, nosso banco de dados será baseado na [**imagem do MySQL**]. E vou nomeá-lo de `db`

sql 

Mas como conseguiremos acessar nosso banco de dados? Ele precisa de um usuário, correto?

Quando a imagem do MySQL está subindo como um container, ela lê algumas **variáveis de ambiente (`environment`)**. Essas variáveis definem algumas informações como usuário, senha, entre outras. Podemos especificar essas variáveis no próprio arquivo do Compose.

Neste caso, por se tratar de um teste, vou utilizar o usuário \*\*root \*\*(`MYSQL_USER=root`) e não vou alocar nenhuma senha (`MYSQL_ALLOW_EMPTY_PASSWORD=yes`). Mas lembrando, nunca devemos usar isso em produção por motivos de segurança:

sql

Também podemos falar para o Compose criar o banco de dados automaticamente quando ele subir o container. Neste caso, vou criar o banco de dados `loja`:

sql

Pronto! Configurações terminadas. E agora como conseguimos fazer o Docker subir esses dois containers?

No terminal conseguimos falar para o `docker-compose` baseado no arquivo (`-f`, file) `aplicacao.yaml`, subir (`up`) os containers especificados:

imagem** um **terminal (`-t`) interativo (`-i`)** com o nosso container, `db` no caso. Mas qual terminal vamos executar?

Neste caso, podemos executar o **`bash`**:

`docker exec -it db bash`

imagem `root` que teremos acesso ao banco de dados.

Nele, nós podemos criar nossas tabelas.

Agora se tentarmos logar em nossa aplicação, obteremos sucesso:

imagem** e atribuir nossos container a ela. Contudo, com o Docker Compose, temos mais facilidade para a orquestração desses containers.

Aqui na **Alura** temos uma [**formação DevOps**] que nos mostra como utilizar o Docker Compose, como criar nossas imagens, entre muitas outras coisas.






imagem 

Agora que minha amiga começou a utilizar [**o processo de Growth Hacking no marketing**] em seu clube de assinatura de chocolates e entendeu em [**qual fase do funil do Growth Hacking**] ela deveria focar suas ações para resolver o problema do clube, ela passou a documentar em uma planilha tudo relativo aos testes que seriam realizados.

Ela colocou em linhas o objetivo, o período que o teste iria ficar na plataforma, os resultados esperados e os experimentos que seriam feitos dentro deles.

- imagem;
- A métrica: indica quais dados que irão medir para avaliar se o experimento funcionou. Nesse experimento é a quantidade de clientes que clicam no link para começarem a pagar pelo clube.

Ao fim de cada explicação, como parte do **processo de avaliação dos experimentos**, ela pediu para todos os membros da equipe darem uma nota de 0 a 10 para o experimento baseados em três parâmetros:

## Valor

Esse parâmetro significa, realmente, o **valor** que cada integrante acredita que aquele experimento irá trazer para o negócio. Sendo zero nenhum valor e 10 muito valor.

## Confiança

Representa o nível de **confiança** que cada pessoa tem de que esse experimento realmente funcione e traga o resultado esperado por ele.

O zero indica que a pessoa não tem confiança que o experimento funcione e 10 que a pessoa tem muita confiança que funcione.

## Facilidade

Por fim, cada pessoa tem que definir o nível de **facilidade** que acredita que aquele experimento possui. Sendo zero muito difícil, e 10 muito fácil.

Como a equipe conta com cinco pessoas: Letícia, Yuri, Yan, Giovanna e Felipe, a planilha com as notas dadas para cada parâmetro ficou assim:

imagem,** que calcula uma média de Valor, Confiança e Facilidade (VCF).

Dentro da estratégia, ela serve para indicar um maior sucesso ou fracasso de um experimento utilizando esses três valores. **Quanto maior o valor do VCF, maior a probabilidade do experimento dar certo**, quanto menor o valor, menor a chance.

Também, através desse número, podemos avaliar quais experimentos devemos fazer primeiro, priorizando os que possuem um VCF maior.

Essa média se dá com a soma dos valores apresentados para cada parâmetro por todas as pessoas da equipe de Growth Hacking.

Ou seja, o Valor representa a soma das notas dadas pela equipe a este item, da mesma forma para Facilidade e Confiança. Depois soma-se esses valores e divide-se por três, que é a quantidade de parâmetros.

A fórmula fica assim:

- ![]

Assim, toda a equipe de Growth Hacking do clube de assinatura de chocolate foi calcular o **VCF**. A soma de Valor deu 32, a de Confiança 32, também, e a de Facilidade 50. Assim, a fórmula para este experimento ficará assim:

- ![]

E continuando a conta:

- ![]

* ![]

Então, o valor final do VCF foi 38, o que adicionamos à planilha.

- ![]

E está pronto o VCF para este experimento!

Por fim, temos que avaliar esse número de acordo com a média máxima que poderia ser dada pela quantidade de integrantes na equipe.

Como temos uma equipe com cinco pessoas, a média máxima seria 50. Se fosse uma equipe com seis integrantes, a média máxima seria 60, se fosse de dez, a média máxima seria 100, e por aí vai.

Desta forma, temos que verificar a porcentagem que demonstrará o quanto o experimento poderá funcionar.

Para isso, podemos utilizar uma simples regra de três.

Se a média máxima é 50, esse número representa o 100%.

- ![]

Se a média dada para o experimento foi 38, então, temos que descobrir qual porcentagem esse número representa, o que mostrará a probabilidade do experimento funcionar. Como ainda não sabemos esse número, colocamos o x.

- ![]

Cruzando os números, iremos multiplicar o 38 por 100 e o 50 por _x_.

- ![]

O que resultará na seguinte fórmula, na qual 50 multiplica o _x_ e 3800 é o resultado da multiplicação do 38 por 100.

- ![]

Para descobrir o _x_, que será a porcentagem que o VCF tem em relação à média máxima, devemos passar o 50 que o está multiplicando para o outro lado do sinal de igual, o que fará com o 3800 seja dividido por 50.

- ![]

Dividindo 3800 por 50, descobriremos a porcentagem do valor de VCF de dar certo.

- ![]

Então, descobrimos que esse experimento tem 76% de chance de funcionar!

Assim, analisando cada experimento e sua chance de dar certo, ao fim da reunião, eles definiram quais deles deveriam ser priorizados, além de terem uma ideia de quais poderiam dar mais certo.

# O que é VCF

Então, resumindo: o VCF é um cálculo utilizado para **analisar as probabilidades de um experimento funcionar ou não**, por meio da percepção de todos os membros da equipe de Growth Hacking.

Pois, todos darão uma nota para o **Valor**, **Confiança** e **Facilidade** de cada experimento e a soma de todos as notas dividida por 3 determinará o valor do VCF.

 Quanto mais próximo da média máxima, que é determinada pela maior média que poderia ser dada pela quantidade de integrantes da equipe, maior a chance do experimento funcionar e, por isso, deve ser priorizado em meio a tantos outros.

Se quiser saber mais sobre VCF, faça o nosso curso de [**Introdução ao Growth Hacking: crescimento para negócios digitais**], que aborda cerimônias do Growth Hacking e estratégias para algumas fases do funil de Growth Hacking.




No desenvolvimento de uma aplicação, é muito comum utilizarmos estruturas condicionais como, por exemplo, `if`s e `else`s ou `switch case`. Porém, em algum momento da nossa vida, provavelmente, um desses testes que realizamos é tão simples que retorna um valor para apenas duas possibilidades.

Por exemplo, suponhamos que precisamos criar uma funcionalidade para gerar uma bonificação e a regra para essa funcionalidade é a seguinte:

- Se o salário for maior que R$ 1000, o bônus é de 10%
- Se o salário for menor ou igual a R$ 1000, o bônus é de 15%

Uma solução seria utilizar um `if` e `else` como já conhecemos, como por exemplo no Java:

java

Nesse exemplo o resultado é `150.0` pois o salário é menor que R$ 1000.0, ou seja, bônus de 15%.

Entretanto, perceba que o que estamos fazendo é apenas um teste bem básico que tem apenas uma única linha de código dentro do `if` ou do `else`. Será que não existe uma maneira mais simples de resolver o mesmo problema?

Em um cenário similar a esse, podemos também utilizar o [**operador ternário**] que funciona com o mesmo conceito do `if` e `else`, porém, a única diferença é que precisamos devolver um valor após o teste **estritamente** em uma única linha!

java

Com esse código acima temos o mesmo resultado de antes, ou seja, `150.0`. Mas como funciona esse operador ternário? A estrutura de um operador ternário é compreendida da seguinte forma:

> **condição**? **valor se for verdareiro** : **valor se for falso**

Portanto, inicialmente temos um teste (podemos adicionar um teste qualquer), ou seja, qualquer teste devolve um valor _booleano_, então, definimos o primeiro parâmetro que é justamente o valor que será retornado caso o teste for verdadeiro e o segundo que será retornado caso for falso!

Justamente pelo fato de realizar essas 3 operações, o chamamos de operador ternário. Mas isso é só em Java? Não! Diversas linguagens implementam esse mesmo recurso! Vejamos alguns exemplos:

**C**:

c

**Ruby**:

ruby

**C#**:

csharp

**JavaScript**:

javascript

**PHP**:

php

Observe que mesmo sendo linguagens diferentes, o recurso do operador ternário contém a mesma estrutura! Entretanto, em algumas linguagens de programação, temos algumas variantes, ou seja, o mesmo conceito do operador ternário que vimos, porém, com algumas diferenças na syntax. Vejamos alguns exemplos:

**Lua** 
js

**fortran 
js

Achou interessante? Então dê uma olhada na quantidade de operadores ternários que a linguagem python nos fornece resolvendo o mesmo problema:

python

Entretanto, é sempre importante lembrar que a utilização dessas variantes do operador ternário pode ser problemático, pois dificulta a compreensão de desenvolvedores que não estão acostumados ou simplesmente não conhece.

Portanto, recomendamos que evite o máximo possível a utilização dessas variantes. O que achou do operador ternário? Está pronto para utilizá-lo no seu próximo algoritmo?

**Que tal aprender mais sobre programação? Na Alura, temos diversos [cursos online de programação] de diversas linguagens! Abordamos o conteúdo desde cursos mais introdutórios, como [introdução a lógica com JavaScript] a cursos de desenvolvimento de aplicações para [dispositivo móveis] (Android e iOS) ou [aplicações web].**



Nesse artigo, enumeramos algumas dicas para quem está começando nessa carreira. Pare tudo o que está fazendo e leia agora mesmo!

imagem 


## 1\. Esteja sempre aberto ao novo

Em todos os momentos da sua vida, é sempre bom ver o mundo como um aprendiz e estar aberto às novidades. Procure basear o seu trabalho em algum profissional que você admira. Peça as opiniões dele, mande suas dúvidas e troque ideias. Mesmo que ele seja de outro país, o Google Tradutor pode ajudar você nessa tarefa, certo? Aproveite as facilidades da tecnologia para conhecer o trabalho de outros profissionais da fotografia.

A humildade é fundamental em qualquer profissão, por isso, reconheça as suas habilidades, mas tenha sempre em mente o que pode e deve ser melhorado. Para isso, faça cursos e procure sempre se aprimorar na carreira. Além disso, procure sempre conhecer a fundo o seu equipamento. No caso da máquina fotográfica, procure fotografar nos diversos modos que ela apresentar, dando preferência ao manual, para conhecer melhor as suas habilidades. No celular, busque conhecer os modos que ele apresenta e veja qual o melhor para o seu estilo.

## 2\. Treine bastante e sempre

Pense em todos os seus amigos. Perceba o quanto eles são diferentes e cada um tem uma beleza única. Que tal presentear eles com um ensaio fotográfico? Você poderá treinar seus recursos fotográficos de forma abrangente e confortável, e a intimidade entre vocês vai favorecer o momento.

Construa um conceito legal, busque uma locação bacana e vá com tudo! Aproveite datas festivas e sugira ensaios temáticos — essa ação vai aumentar a exposição do seu trabalho, além de possibilitar a montagem de um [**portfólio**] bacana, tanto para você, fotógrafo, quanto para seus amigos modelos. Além disso, festas infantis na família, viagens, seu quintal — tudo pode servir para você treinar o seu olhar.

## 3\. Invista em aprendizado

Antes de tudo, procure estudar um pouco de como funciona a fotografia, as ferramentas disponíveis, as funcionalidades da câmera ou como controlar o resultado que esperamos na fotografia final. 

Por exemplo, saber as diferenças entre [**diafragma, obturador e ISO**] é essencial. Estes são os conceitos mais básicos para entendermos um pouco melhor o resultado que teremos.

Se você for trabalhar com celular, saiba antes se ele tem ferramentas parecidas com essas.

Tente tirar algumas fotos para treinar. Além disso, pode ser bom investir em cursos online, se você não tem muito tempo. Atualmente existem muitos cursos bons e baratos de fotografia com os quais você pode aprender com praticidade e qualidade.

## 4\. Fotografe bastante

O tempo para desenvolver o olhar fotográfico depende de cada pessoa. Entretanto, se você tiver uma boa câmera — profissional ou não — ou, até mesmo, a do seu celular, já dá para começar a treinar. Faça experimentos com lentes, zoom, tempo de exposição, brinque bastante com as luzes e formas e conheça o seu material de trabalho a fundo.

**Use sempre uma mesma câmera, para você se familiarizar com ela, mas invente, ouse e procure novos ângulos, lentes e lugares.** É ótimo saber dominar a técnica que é necessária para o seu estilo. Saber exatamente como calcular a distância perfeita do objeto e qual será o resultado disso faz uma enorme diferença.

Mesmo que você queira fazer fotos do seu celular, o seu olhar deve ser treinado do mesmo jeito. Fique atento!

## 5\. Trabalhe a composição e a luz

Sabe a [**regra dos terços**]? Ela é fundamental para quem está começando no mundo da fotografia conseguir compor uma foto de forma harmônica.

A regra se baseia em linhas que dividem a composição em terços na horizontal e na vertical e que dão referências para a composição das imagens. Com o tempo, você fará isso automaticamente, mas enquanto não pega o jeito, tente dividir, mentalmente, a imagem que você quer fixar em três partes iguais e fotografe.

Agora vamos pensar na luz: **pode ser natural, como o sol, ou artificial, como lâmpadas incandescentes e de led.** Procure sempre iluminar bem sua foto, independentemente da luz utilizada.

Antes de fotografar, observe a intensidade e a distância da luz para a pessoa ou objeto que deseja registrar. Isso interfere diretamente na imagem que você quer fazer.

Luzes mais fortes e diretas tendem a gerar sombras mais contrastadas e marcadas. Um bom exemplo é a luz do sol ao meio-dia. Ela é bem intensa e pode auxiliar ou prejudicar as suas fotos. Por isso, fique atento a esses detalhes.

## 6\. Varie o local de trabalho

Procure explorar melhor esse ramo e comece trabalhando de forma individual. Lógico que alguns fotógrafos preferem exercer seus serviços para uma empresa como um profissional contratado, mas se esse não for o seu foco, você poderá facilmente trabalhar como um fotógrafo [**freelancer**], prestando serviços por conta própria a várias pessoas.

Assim, é possível oferecer seu trabalho de forma independente para vários clientes diferentes sem ter nenhum vínculo com eles. Nesse caso, a melhor forma de ser visto é fazer uma autopromoção, pois assim será possível encontrar potenciais clientes e trabalhar com fotografia.

Procure fotografar cenas simples e do seu cotidiano, como crianças brincando no parque, a natureza em um final de semana e seus amigos se divertindo. Isso tudo pode gerar boas [**imagens**] para você começar a sua carreira. Não necessariamente essas imagens vão ser o seu portfólio pra sempre, mas elas vão te auxliliar a conhecer a camera melhor e assim saber as possibilidades que pode se obter. 

Logo logo voce conhecerá o seu estilo e poderá apresentar um portflólio bem trabalhado com base nos cursos que fez e em todo o conhecimento que foi adquirindo fotografando as cenas simples do cotidiano.

Como você pode ver, para começar a trabalhar com fotografia não é necessário ter equipamentos sofisticados ou fazer cursos no exterior. Basta ter disposição, disciplina e, é claro, um grande amor pela profissão!

Gostou dessas dicas? Quer ler mais conteúdos interessantes? Então assine a nossa newsletter e fique sempre por dentro das novidades do mundo por trás da câmera!




Todos os livros do meu sistema precisa de um nome, autor e um código de categoria. Para identificar o código da categoria eu tenho a classe `CodigoCategoria` no pacote _br.com.caelum.alura.codigo_:

java

E também tenho a minha classe `Livro` no pacote _br.com.caelum.alura.model_:

java

Certo, agora irei criar um livro novo na classe `Main` no pacote _br.com.caelum.alura.main_:

java

Ué, não compila... Como podemos ver, a classe `Livro` e a `Main` estão em pacotes diferentes, então precisamos importar a classe `Livro`.

java

Eu não sei qual é o código para livros de Java, então eu vou pedir para a classe `CodigoCategoria`. Vamos importá-la:

java

Verificando as informações do livro:

```
 > nome: Livro de Java autor: João da Silva codigoCategoria: 4

```

Ótimo, eu consegui criar meu livro, mas agora eu quero fazer uma lista de livros:

java

Consigo criar quantos livros eu quiser sem me preocupar com o código da categoria! Porém ainda tem um detalhe... Veja que todas as vezes que queremos um código, precisamos sempre utilizar o prefixo "CodigoCategoria.", não seria melhor simplesmente digitar JAVA e a classe já saber qual é o código? Já que todas as constante da classe `CodigoCategoria` são _static_, podemos fazer o _import static_. Certo, da mesma forma que nos métodos, sempre usamos o _static_ antes, então faremos static import também:

java

Ops! Não compila! Para fazer **qualquer import**, **SEMPRE** escreva a palavra import antes:

java

Resolvemos o problema, porém agora eu terei que digitar uma a uma...poxa, muito chato isso, né? Da mesma forma que importamos mais de uma classe usando o "\*", podemos importar todas as constantes estáticas da classe `CodigoCategoria`:

java

O código continua funcionando da mesma forma! E se precisarmos de uma outra categoria? Basta chamar pelo nome da categoria! Simples assim.

E aí, gostou do import estático? Quer aprender mais a fundo a linguagem Java? Pensando nisso o instrutor Guilherme Silveira criou a [**certificação Java**] que aborda todas as peculiaridades da linguagem Java com o intuito de preparar o aluno para a certificação.




Como podemos criar um gráfico usando o Google Charts e obter os dados no Google Spreadsheets?

Recebi dados de uma produtora de cinema em uma planilha do _Google Spreadsheets_, e agora irei fazer um gráfico para visualizá-los:

imagem` que irá conter todo o nosso código, o primeiro passo será buscar os dados da planilha do _Google_:

javascript

Esse objeto de busca irá buscar os nossos dados dentro da planilha.

Em seguida, envio esses dados para serem processados com o método `.send()` da API, por uma função que irei chamar de `processaDados`.

javascript

A função `processaDados` vai receber o resultado da busca, que são os nossos dados da planilha. Para popular a tabela, vamos usar o método `getDataTable()` do _Google Charts_.

javascript

Até aqui já conectamos com a planilha do _Google_, buscamos, processamos os nossos dados e os colocamos em uma tabela, agora vamos falar qual tipo de gráfico é esse.

Vou fazer um gráfico de linhas, para isso, dentro da variável gráfico, vou instanciar outro objeto do _Google Charts_ e dizer que é um gráfico de linha, que em inglês fica _line chart_. Também vou dizer que sua identificação no html é `graficoFilmes`.

javascript

Em seguida, preciso pedir para que o _Google_ desenhe esse gráfico na tela do navegador. Desenhar em inglês é _draw_, então vou digitar `grafico.draw()` e passar a minha tabela para esse método da API.

javascript 

Agora podemos visualizar o nosso gráfico.

imagem, largura (_width_) e título (_title_). Vou também passar essas opções para o método `draw()` junto com a tabela.

javascript 

Vou atualizar o navegador, e repare que já conseguimos ler o gráfico.

imagem` da API passando a função que desenha o gráfico:

html

E claro, para carregar as bibliotecas em JS usadas pelo _Google Charts_, adicionamos também as tags script para o carregador de gráficos ou `loader.js` e para o _jQuery_ na versão minificada:

html

## Como a empresa gerou o link para mim

Para que eu fizesse o gráfico, a empresa gerou o link do _Google Spreadsheets_ pra mim. Para fazer isso, sei que eles clicaram no botão de **compartilhar**, e em **avançado**.

![]

![]

Em seguida, clicaram em **alterar** na tela de configurações de compartilhamento.

![]

Ao fazerem isso, selecionaram a opção de **qualquer pessoa com o link** e clicaram em **salvar**.

![]

Então, copiaram o link gerado pelo botão de **copiar link**.

![]

E, ao obterem este link

```

https://docs.google.com/spreadsheets/d/1BEtiBqFgOuFMe7K_9THV4vgaLCG8yRr-pQ-HrkvxckE/edit?usp=sharing

```

alteraram o final do link a partir de

javascript

para

js

ficando com

```

https://docs.google.com/spreadsheets/d/1BEtiBqFgOuFMe7K_9THV4vgaLCG8yRr-pQ-HrkvxckE/gviz/tq?range=A2:D16

```

## Carregando dados

Ao invés de carregar de um _Spreadsheet_, também podemos trazer os dados manualmente usando o objeto `DataTable`:

js 

## Para saber mais

Quer criar outros tipos de gráficos usando _Google Charts_? Dê uma olhada na [documentação]. Há uma seção para cada tipo de gráfico.

Você também pode ver quais gráficos estão inclusos no pacote `corecharts` que usamos [neste link].

Aproveite e faça os curso de [**Google Charts parte 1**] e [**Google Charts parte 2**] na Alura para aprender mais técnicas e reforçar o aprendizado.





imagem 

Em um site de vendas online adicionaram um carrossel logo na primeira página do site:

imagem segue também essa hierarquia de importância.

Isto é, costumamos deixar sempre os elementos principais logo no início para que, quando o usuário decidir interagir com algo, passando para outra página interna ou mesmo saindo do site, ele tenha ao menos visto o que consideramos mais importante.

Quando falamos em destacar muitos elementos de uma vez e utilizamos essa distribuição, podemos acabar sacrificando alguns elementos que ficam mais ao final.

> _"Mas em um carroussel isso também não aconteceria?"_

Pois é, sim. O carrossel é uma alternativa legal quando queremos deixar os destaques concentrados em um único lugar. **Mas**, desde que esses elementos sejam em uma quantidade reduzida.

## Defina o que realmente é importante

Como já diziam por aí, "se tudo é importante, nada é importante". Grande verdade! Nesse mar de informações que nós estamos imersos hoje em dia, queremos sempre tentar capturar o máximo de pessoas possível atirando para todos os lados.

Mas aí vem o questionamento: Melhor uma quantidade x de conversões efetivas ou 10x de pessoas que apenas visualizaram e pararam por aí?

Assim como [algumas pesquisa sobre carrossel apontaram], a maior parte das pessoas não passa do primeiro banner até interagir com alguma outra coisa.

Justamente por isso, a primeira coisa antes de decidir usar um carrossel no seu site é encontrar no máximo 3 ou 4 produtos ou chamadas a serem apresentadas ao usuário.

No caso do exemplo anterior, conseguimos reduzir para estes anúncios:

imagem





imagem 

Estava fazendo algumas alterações no meu sistema quando precisei alterar minha senha de usuário. Como estou utilizando um Linux, abri o terminal e digitei o comando para alterar a senha:

imagem para mim este arquivo com as informações sobre as permissões (`-l`).

`ls -l /usr/bin/passwd`

imagem? Será que ela indica que o dono do arquivo é o superusuário (`root`)?

## Conhecendo o SUID

Se listarmos outros arquivos cujo o superusuário é o dono, vemos que essa letra não aparece.

imagem. Ela é uma propriedade para arquivos executáveis do sistema.

Quando um programa é executado, o dono deste processo é o usuário que executou o programa. Porém, com arquivos com a propriedade SUID, esse comportamento é um pouco diferente.

Quando executamos um arquivo com a propriedade SUID, o usuário dono do arquivo é também o usuário dono do processo em execução.

Isso faz sentido quando pensamos no comando `passwd`. Apenas o superusuário tem permissão para editar o arquivo `/etc/shadow`, que é o local onde ficam armazenadas as senhas atuais de cada usuário.

Então, quando executamos o `passwd`, na verdade estamos executando o comando como superusuário, por isso, conseguimos alterar a senha do nosso próprio usuário.

> Legal, mas se eu quiser criar um arquivo e atribuir nele o SUID?

Da mesma forma que atribuímos as permissões de leitura, escrita e execução, podemos atribuir a propriedade SUID.

Por exemplo, eu criei um script para atualizar o sistema operacional. Porém, não quero que qualquer usuário consiga executar este script pois apenas o superusuário pode atualizar o sistema. Então vamos colocar o SUID nesse script.

Primeiramente, veremos como estão as permissões desse nosso arquivo:

imagem a propriedade SUID para esse arquivo (`u+s`).

Como estamos modificando as propriedades de uma arquivo, precisamos utilizar o `sudo`, ou estar logado como superusuário.

`sudo chmod u+s atualiza-sistema`

imagem. Ela tem o mesmo comportamento que a SUID, porém funciona com grupos.

Sempre que um programa que tiver a propriedade SGID for executado, o grupo dono daquele processo será o mesmo grupo dono do arquivo.

Da mesma forma que a propriedade SUID, os arquivos marcados com a propriedade SGID apresentam um `s` nas permissões, porém na parte que corresponde ao grupo.

Então, podemos atribuir uma propriedade SGID nele para que quando ele for executado, o grupo de desenvolvimento seja o dono do processo.

O processo de atribuição é parecido com o da propriedade SUID, porém, ao invés de adicionarmos ao usuário, adicionamos ao grupo (`g+s`).

`sudo chmod g+s prepara-ambiente`

imagem. Para quem acrescentaremos essa propriedade? Para o usuário dono, para o grupo dono, ou para os demais usuários?

Essa propriedade impede que os outros usuários apaguem arquivos que não lhe pertencem então, temos que aplicar essa propriedade aos outros usuários (`o`). Mas antes vamos ver como estão as permissões:

imagem.

Dessa forma, sua execução será mais rápida da próxima vez.

## Para saber mais

Além da forma simbólica, podemos também utilizar a forma octal para atribuir essas propriedades.

Na forma octal, a propriedade SUID tem valor `4`, a SGID valor `2` e a Stick Bit tem o valor `1`. Para utilizar essa forma, basta colocar esses valores antes das permissões padrões.

Por exemplo, se quisermos atribuir o SGID e o Stick Bit para o diretório desenvolvedores utilizando o modo octal, basta somar os números de suas formas octais (2 + 1):

`sudo chown 3775 desenvolvedores/`

![]

As permissões e propriedades dos arquivos são muito importantes para quem quer administrar sistemas Linux. Uma das bases do sistema são as propriedades e permissões.

Aqui na Alura, temos uma carreira na [certificação LPI Essentials]. Nela você aprenderá sobre a filosofia open source, sobre arquivos e diretórios, sobre como buscar ajuda no sistema e muito mais.




Ao desenvolver um site para uma empresa, a equipe chega ao seguinte questionamento:

> Devemos desenvolver um site único, responsivo para diferentes tamanhos de tela, ou um site dedicado especialmente para desktop e outro para mobile?

Para entender as diferenças em cada possibilidade, desenvolveram os seguintes layouts:

imagem a esta conclusão.

## Site único responsivo vs. Site mobile dedicado

Para deixar mais claro quais são as diferenças encontradas em cada um, podemos analisar o quadro a seguir:


**Design**, Os layouts acabam sendo mais simples para facilitar a adaptação dos elementos em diferentes tamanhos de tela, Maior liberdade na criação do layout, uma vez que cada um funcionará em paralelo

**Domínio**,Utiliza um único domínio, facilitando o compartilhamento de endereços web,Utiliza subdomínios como _”m.”_, redirecionados do domínio principal, o que pode resultar em um pouco mais de tempo para ser acessado pelo usuário.

**SEO**,Segundo o próprio [Google], recomenda-se a utilização de sites responsivos, principalmente, porque economiza recursos quando o Googlebot rastreia o site. Apesar de passar no teste do Google de Mobile Friendly Websites, os sites mobile dedicado só serão [**bem ranqueados**] se todas as versões do site oferecerem uma boa experiência de usuário. Além disso, com diversas URLs o rastreamento do Googlebot pode ficar mais lento e comprometer a atualização frequente do ranqueamento.

**UX**,Se as adaptações do layout não forem feitas cuidadosamente, pensando exatamente nos ganhos e perdas que cada dispositivo pode ter, a experiência do usuário na interação com o site pode ser comprometida,Uma vez que o layout será criado focado para o dispositivo, as chances de conseguir aproveitar o máximo possível dos recursos e limitações do dispositivo é muito maior, o que não significa que a simples criação de um layout dedicado irá solucionar automaticamente essa questão, dependendo muito de como isso foi pensado pelos designers.

**Manutenção**,A manutenção é feita diretamente na estrutura do site principal, que atualiza todas as versões aos mesmo tempo, facilitando a manutenção.,O fato de ter mais de uma página para lidar faz com que a manutenção seja mais complexa. Atualizar a página principal não tira a necessidade de atualizar as demais versões do site.

Por último, temos um tópico muito importante a ser considerado: a Performance. Justamente por isso, este tema ganhou um parágrafo dedicado especialmente para deixar claras as diferenças para cada um.

De um lado, temos o site único responsivo, que possui longos códigos HTML/CSS, conteúdo e imagens mais pesadas (uma vez que são utilizados tanto em desktop quanto em mobile) e que podem prejudicar a velocidade de carregamento.

Contudo, sempre que falamos de performance temos que tomar cuidado (o Guilherme Silveira aqui pega no pé de todos nós em relação a isso), o site _pode_ ter uma boa performance melhor **se** o [código] e as [imagens] forem otimizados - no caso das imagens, otimizadas para cada media query também.

Ou seja, podemos ter uma performance melhor, porém teremos um pouco mais de trabalho.

Por outro lado, o site mobile dedicado é criado já para o contexto mobile e, além de ter um código HTML/CSS menor, carrega imagens menores e, consequentemente, menos pesadas, pensadas especificamente para este contexto, que tornam o carregamento mais rápido.

Ainda assim, é importante lembrar que, mesmo sendo pensadas para este contexto, se o designer não otimizar estas imagens corretamente, cairemos novamente no mesmo problema de peso das imagens.

Então, depois de analisar o quadro comparativo e as últimas considerações, já podemos chegar a uma conclusão, certo?

Será mesmo?

## Qual opção escolher, afinal?

Depois de todas essas definições e comparação, chegamos à conclusão de que não existe uma resposta definitiva. O que existem são pesos e medidas a serem analisadas antes da tomada de decisão final.

Isto é, sempre que formos escolher uma linha para a produção de um site é importante fazer algumas considerações para entender o fator determinante para a proposta do site, como:

- Qual o objetivo do site?
- Qual o perfil do público desse site: mais usuários de desktop ou mobile?
- Quanto temos de verba?
- Como funcionará a atualização do site? Demanda de atualização contínua?

Essas e muitas outras perguntas ajudam a entender melhor qual a melhor solução para cada caso. Portanto, antes de iniciar seu projeto, é importante que tudo isso esteja bem alinhado com a equipe e o cliente.

Você já passou por uma situação assim em seus projetos? O que pensa sobre o assunto? Compartilhe suas ideias com a gente nos comentários abaixo!

Dentro do universo mobile existem ainda diversas outras questões a serem exploradas e que podem ser muito interessantes para você que trabalha (ou pretende trabalhar) nesta área.

Na Alura temos um curso muito legal sobre [**Web Design Responsivo**] e, para quem quiser se aprofundar mais ainda nos estudos, a dica é ler o livro [**A Web Mobile**] do Sérgio Lopes. ;)




Você é daqueles(as) que está sempre pensando com a tão sonhada oportunidade de emprego na área? Se prepare que hoje temos algumas dicas que podem ser úteis para sua carreira.

Ficou interessado em saber mais sobre a trajetória dele como: dificuldades, desafios e estudos? Então não perca tempo e veja como foi:

imagem. Tenho um carinho enorme com essa linguagem. Foi através do RoR que consegui a vaga de emprego. Quero me dedicar e aprender mais com essa linguagem.

O que achou da história do Fabiano? Bacana, né? Aproveite e deixe o seu comentário :)

Quer compartilhar também a sua história conosco? Então entre em contato com a gente por meio do e-mail **contato@alura.com.br**.




Estou desenvolvendo um sistema web que armazenará todos os livros que comprei para poder realizar consultas e verificar se já tenho um livro ou não. Porém, preciso criar um formulário de cadastro em HTML para enviar esses livros para o servidor. Para fazer um formulário precisamos utilizar a tag `form`:

html

Já indicamos que estamos criando um formulário, agora vamos adicionar os campos necessários para fazer o cadastro de um livro! Preciso do nome do livro, nome do autor, data da compra, valor e ISBN. Mas como adicionamos esses campos no HTML? Para adicionar campos de texto, podemos utilizar a tag input``





imagem 

Fiz um teste de usabilidade com um app de compartilhamento de imagens que estava desenvolvendo. O teste aconteceu com o protótipo, antes mesmo de ser lançado, e já foi suficiente para que encontrasse alguns feedbacks muito relevantes sobre o projeto.

Os usuários que testaram o protótipo identificaram que o processo de postar arquivos na timeline não fazia muito sentido. Pareciam etapas muito repetitivas:

imagem, novas opções surgem: - Abrir câmera - Adicionar da galeria.

Se abríssemos a câmera poderíamos: - Tirar a foto, - Verificar e mandar para a timeline.

Ao passo que adicionar da galeria seguiria os passos de **escolher pasta** e então **escolher o arquivo** antes de lançar o post.

Note que, se esse é o mesmo roteiro que faríamos para tirar foto ou gravar um vídeo, o processo se torna redundante, dado que faríamos os mesmos passos de ir tanto para a câmera, quanto para a galeria.

Ao analisar novamente o app, fiz uma anotação do que precisava ser alterado:

> Retirar passos que se repetem e transformar em um único passo.

Só que, quando passei para a fase de prototipação, todos ficaram confusos. Tiveram dificuldade em identificar onde e como colocar essas mudanças.

Pensei, então: Como poderia fazer com que essas mudanças ficassem mais claras para toda a equipe? O correto seria deixar o planejamento mais redondo antes de passar adiante!

## Esquematizando um fluxo

Voltamos para a etapa de sinalizar as alterações que precisávamos colocar no app.

Ao invés de simplesmente escrevermos que alterações deveriam ser feitas, colocamos todas as telas desse processo problemático em uma tela:

imagem

E se você quiser entender um pouco mais sobre os [**processos de UX**], temos uma formação muito legal que passa por diversos cursos e complementos de estudo!




Estou desenvolvendo um sistema para computar todas as vendas de uma empresa. Atualmente, estou representando cada funcionário da seguinte forma:

java

O atributo `cargo` é um _enum_ que listará todos os cargos diferentes do sistema:

java

Além da representação do funcionário, eu também fiz a representação de uma venda, que possui um funcionário e o valor da venda:

java

Porém, cada vez que uma compra for realizada, eu preciso calcular a comissão do funcionário de acordo com o seu cargo, por exemplo, se o funcionário for um atendente, a comissão será de 10% do valor da venda, se for vendedor 15% + 5 reais e gerente 20% + 10 reais. Então vamos criar o método `calculaComissao()` na classe `Venda`:

java

Certo, agora vamos implementar o método para calcular a comissão. Bom, podemos pegar o cargo do funcionário e fazer um `if` para verificar qual é o cargo dele e então realizar o calculo da sua comissão:

java

Conseguimos calcular, porém precisamos retornar a comissão da venda, então vamos alterar a assinatura de `void` para `double` e então, retornamos a variável `comissao`:

java

Ótimo, agora precisamos fazer uma simulação para verificar se está funcionando! Então vamos lá:

java

Verificando o resultado:

java

Para um atendente o valor da comissão é de 10%, e 10% de 200 é realmente 20! Então está funcionando como esperado! E se tentarmos a mesma venda com um cargo de vendedor?

java

15% de 200 é 30, mais 5 reais fica 35! Por enquanto tudo certo! Vamos verificar o último cargo, ou seja, o de gerente:

java

Excelente! Conforme o esperado, foi impressa uma comissão de 20% que equivale 40, somou 10 e resultou em 50! Aparentemente a minha implementação está impecável! Sem nenhum problema! Só que não! :(

## Entendendo o problema dos ifs

Consegue imaginar o que está sendo tão problemático? Vejamos novamente a nossa implementação da `calculaComissao()`:

java

Veja que, para cada cargo, estamos fazendo um `if` que identifica qual cargo se refere, e então, calculamos a sua comissão. Vamos supor que a empresa que solicitou uma adição de 3 cargos diferentes, que são: ajudante (8% + 1 real), recepcionista (5%) e diretor (25% + 20 reais):

java

Como ficaria o nosso método `calculaComissao()`? Vejamos:

java

Observe que o nosso método `calculaComissao()`, atualmente, **tende a crescer e muito**! Com certeza essa é uma **má prática**, pois se um dia adicionarmos um novo cargo e esquecermos de adicionar nesse conjunto gigantesco de `if`s e `else`s, o nosso sistema apresentará um _bug_ facilmente...

Além disso, e se quisermos reutilizar esse método em uma outra classe qualquer? Teremos que fazer um **_copy_ e _paste_ de todas essas condições** e, se um dia mudar a regra de negócio e tiver um reajuste na comissão? Teremos que **mudar em todos os pontos** do nosso sistema que está utilizando esse tipo de implementação...

Veja quanta complicação! Com certeza é uma solução trabalhosa e não tão inteligente! Sabendo desses problemas, como poderíamos resolver isso?

## Separando as responsabilidades

Que tal isolarmos a responsabilidade de calcular a comissão para cada cargo? Mas como assim isolar a responsabilidade? Exatamente isso, fazer com que o próprio cargo saiba calcular a sua comissão, ou seja, podemos fazer com o que cada enum já implemente um método `calculaComissao()`!

java

Repare que, ainda existe um grande problema, pois da forma que está atualmente, o nosso enum compila nesse instante, porém quebra todos os pontos do sistema que o chama, pois não é garantido que todos os valores do enum tenham esse método!

Precisamos, de alguma forma, garantir que todos os cargos tenham um método `calculaComissao()`!

## Garantido a chamada de métodos por meio de interface

E agora? Como podemos fazer isso? Da mesma forma que em classes, nós podemos fazer com que o enum implemente uma interface que obrigue a implementação do método `calculaComissao()`! Então vamos criar essa interface:

java

Agora que temos a interface `Comissao`, basta implementá-la no enum e sobrescrever o método para todos os cargos:

java

Certo, definimos o método `calculaComissao()` para cada cargo, e como ficaria o método `calculaComissao()` da classe `Venda`? Vejamos o que muda:

java public class Venda {

Cade aqueles `if`s e `else`s??? Será que ainda funciona como antes? Vamos testar novamente, para todos os cargos para uma compra no valor de 200:

Atendente (10%):
java

Vendedor (15% + reais):
java

Gerente (20% + 10 reais):
java

Ajudante (8% + 1 real): 
java

Recepcionista (5%): 
java

Diretor (25% + 20 reais): 
java

Excelente! Está funcionando conforme o esperado, porém agora, nós podemos calcular a comissão de um funcionário chamando apenas 1 método e em qualquer lugar!

E se agora precisarmos fazer aquele reajuste?

Basta alterar apenas no enum e funcionará da mesma forma para todas as classes que chamarem o método `calculaComissao()`!

## Todo conceito por de trás da nossa implementação

A solução que utilizamos não é uma invenção minha, isso é um **_Design Pattern_** (na tradução, padrão de projeto) chamado **_Strategy_** que, por meio de _polimorfismo_, nos permite adicionar/alterar implementações de um método em comum, deixando-as [**encapsuladas**], sem que impacte as chamadas realizadas pelo cliente.

Em outras palavras, podemos fazer diversas variações de um mesmo método em comum (por exemplo, o `calculaComissao()`) que precise de um comportamento diferente para cada situação, nesse caso, o calculo de comissão para cada cargo diferente!

A implementação demonstrada no artigo é **uma das possíveis implementações do Strategy**, ou seja, existem diversas outras!

Isso significa que **é muito mais importante entender o conceito utilizado para resolver o problema com o Strategy** do que apenas a implementação, ou melhor dizendo, identificar uma situação que apresenta muitas variações para uma determinada funcionalidade que por sua vez, são condicionais, como foi o caso do calculo de comissão ser diferente para cada cargo diferente, e então aplicar o Strategy!

E aí, o que achou do Strategy? Nunca havia pensado que os `if` algum dia poderiam sumir? 

**Quer aprender mais sobre Design Pattern? Na Alura, temos o curso de [Design Pattern em Java] que demonstra tanto o Strategy como outros Design Patterns, explicando como cada um funciona e aonde podemos aplicar cada um deles!**





imagem 

Copia, cola no editor de texto. E nós ganhamos tempo. Copia, cola na caixa de mensagem. E nós perguntamos da festa para quem ontem estava no enterro. Copia, cola acontece também no nosso comportamento.

No consultório, o médico me prescreveu anti-inflamatório. Levantei a questão se tal remédio poderia ser ineficaz ou fazer-me mal:

“Doutor, fiz cirurgia por causa do câncer e me tiraram o estômago. O senhor acha que…”

”Quando você for tomar o remédio", interrompeu-me o doutor, "sempre o faça com o estômago cheio.”

“Com a barriga cheia, né, doutor?" comentei rindo. Não discuti com quem copia,cola. Não havia nenhuma fresta para pensar. Somos todos iguais perante o copia,cola. Tudo é igual perante o copia,cola.

Nas empresas onde trabalho, a Caelum e a Alura, damos forte ênfase à acolhida do aluno. Esse acolhimento do aluno que chega para o início da turma ou que chega para uma longa caminhada através de inúmeros cursos, foi construído por diversas pessoas que participaram da história da **Caelum e da Alura**, e hoje tem uma estrutura. Estrutura é como hábito. Muito bom. Muito ruim quando adota apenas o copia/cola.

[**Seth Godin**] diz... Já foi feito... Trabalhos, tarefas em que replicamos o processo em vez de inventá-lo… Podemos criar importante valor para a tarefa quando a fazemos num momento em que nos é exigido explorar a situação e criar nova solução. 

Rotina, não. Explorar, sim. Isso significa que faremos uma tarefa que não foi feita antes, algo que pode até não funcionar. Essa simplesmente é a forma como devemos implementar a tarefa, o trabalho.

Copia, cola não, e sim… ”a melhor aula da vida do aluno”.

Como andam seus hábitos? Entenda [**como criar metas que façam sentido para você**] e melhore sua produtividade. :)





imagem 

Fomos contratados para desenvolver um software em Java para uma empresa e a instalação do nosso programa é feita via console.

Para conseguir usufruir do nosso produto o usuário precisa ler e aceitar os termos de uso, caso contrário não podemos permitir que a instalação continue.

Além disso, para estatísticas internas da empresa, após aceitar os termos o usuário também deve nos informar seu nome completo.

Vamos então começar criando a funcionalidade do usuário poder aceitar ou não os termos de uso do nosso produto.

Após a criação, testamos e obtivemos o seguinte resultado:

imagem**]). Este método lê a próxima entrada do usuário.

java

Pronto, agora nosso `leitor` foi atribuído a um objeto e usamos o método `next()` para pedir ao usuário que ele digite uma resposta. Vamos testar:

imagem` é chamado.

Para resolvermos essa situação vamos primeiro atribuir a resposta do nosso usuário a uma variável para não perder a entrada lida pelo nosso `leitor`:

java

Hmm… já está melhor, mas isso ainda não resolveu nosso problema, ainda temos que processar a informação recebida, pois nosso programa não é mágico, precisamos mostrar pra ele qual direção seguir, ou seja, se ele continua a instalação ou não.

Para verificar a resposta, vamos criar uma condição que vai comparar se a `resposta` é ‘S’ para que seja concluída a instalação. Como queremos [**comparar dois objetos**], podemos usar o método `equals`, que faz exatamente isso:

java 

Ao olhar o código, pode não parecer natural chamar o método equals a partir de uma string [_hard coded_], mas fazer isso é uma boa prática, pois temos certeza que a string ‘S’ não é nula, logo nos prevenimos contra `NullPointerException`.

Pronto, vamos testar e ver se tudo está funcionando:

imagem dentro de um método e apenas chamá-lo, inclusive é uma boa prática fazer isso.

Para fazer essa refatoração, primeiro criaremos um método e jogaremos toda nossa lógica de validação de resposta dentro dele:

java

Agora vamos apenas chamar esse método:

java

> Caso queira saber mais sobre refatoração, código limpo e etc, deixarei o link de um [**artigo**] que trata exatamente sobre esse assunto, vale a pena dar uma olhada.

Agora que já conseguimos implementar a primeira _feature_ que consistia em receber uma resposta do usuário para aceitação ou não dos termos de uso, vamos para a segunda parte, no caso, implementar uma função para receber o nome do nosso usuário.

Começaremos pedindo ao usuário para nos fornecer seu nome, mas antes de implementar tal funcionalidade, vamos pensar: Onde devemos escrever esse código?

Faz sentido pedir o nome do usuário que digitou ‘N’ ou o usuário que digitou uma resposta inválida? Não, né? Logo, nosso programa só deve perguntar o nome para os usuários que digitaram ‘S’, portanto, devemos codificar essa nova funcionalidade dentro do bloco `if` onde a condição verifica se a resposta é igual a 'S'.

Agora sim podemos implementar esse código. Como estamos fora do escopo do nosso `leitor` teremos que instancia-lo novamente, já que só o usaremos uma vez podemos instanciar a classe `Scanner` e já chamar o método que queremos, no caso o `next()`, e já salvar em uma variável. Por enquanto nada novo né?

Logo, dentro de `validaResposta()`, teremos o seguinte código:

java

Repare no nosso resultado:

imagem e ver o que realmente está sendo armazenado.

java

Agora só falta testar:

imagem` lê apenas, e somente apenas, a próxima entrada, por isso, se o usuário tiver um nome composto, não vamos conseguir o resultado esperado.

Para resolver tal problema podemos usar outro cara da classe `Scanner`.

## O método nextLine

Precisamos de um cara que leia a linha inteira e esse cara é o método [`nextLine()`]). Sendo bem técnico, ele pula a linha que está e lê tudo o que foi pulado. Vamos lá!

java

Agora nos resta testar:

imagem consegui entender o problema. Vamos destrinchar esse erro.

O método `next()` é o culpado da situação, como já foi falado ele lê a próxima entrada e só. Nessa linha, onde o usuário aceita os termos, temos duas entradas a ser lidas.

> "Tá doido? Só tem uma, ou é ‘S’ ou é ‘N’”

Concordo, só tem uma entrada visível a ser lida, mas após a resposta do usuário temos uma quebra de linha certo? Essa quebra de linha é representada por `\n`, que nada mais é do que uma sequência de escape para o compilador, isto é, quando o compilador vê o `\n` ele pula para a próxima linha.

Então, esse `\n` não foi lido pelo `next()` e ficou para ser lido pelo `nextLine()` que vem em seguida, logo o `nextLine()` lê o resto da linha vazia e termina a execução do nosso programa, ele nem sequer chega a ler o nome.

Para exemplificar melhor vou mostrar com um desenho de qualidade:

imagem` para receber o nome.

Podemos abordar essa situação de duas formas:

Adicionando um `nextLine()` logo após o `next()` para que após a primeira resposta do usuário o nosso `leitor` já seja posicionado na linha seguinte, deixando nosso código desse jeito:

java

Vamos testar e ver se realmente essa abordagem funciona:

imagem` pelo `nextLine()`, ficando assim:

java

Novamente, vamos testar e ver se conseguimos o resultado esperado:

![]

Tudo certo aqui também. Nos dois casos, temos o mesmo resultado, mas a primeira abordagem não é recomendada, pois estamos usando um método a mais sem necessidade. Com a segunda abordagem nosso método fica mais limpo.

Parabéns!!! Conseguimos criar todas as funcionalidades pedidas e "blindamos" nossa aplicação contra cenários problemáticos que podem surgir durante o uso do nosso software.

Eai, já teve problemas em receber entradas dos seus usuários? Compartilhe sua experiência aqui nos comentários.

## Expandindo seu conhecimento sobre a classe Scanner

Além de usarmos a classe `Scanner` para ler entradas do teclado, podemos usar também para ler arquivos externos. Para saber mais a respeito acesse esse post onde é mostrado [**como ler e processar arquivos externos**] usando a classe Scanner.

Aprenda outras funcionalidades bem úteis para o seu dia a dia na [**Formação Java**], onde você vai aprender técnicas tanto básicas quanto avançadas para criar suas aplicações.




Quando o site da startup Armazém de Ideias foi ao ar, perceberam que a página, ao ser requisitada, apresentava o seguinte comportamento:

imagem, JPG, PNG e GIF, e o das imagens vetoriais, SVG.

Falando de forma simples e objetiva, as **imagens raster** são compostas de pixels, que dependem da resolução e tamanho da imagem para ter qualidade na visualização, enquanto as **imagens vetoriais** são baseadas em fórmulas que recalculam os valores da forma sempre que redimensionada, preservando a qualidade.

imagem ou sem perda de qualidade (lossless).

Alguns sites de [compressão de imagem] já possibilitam esse tipo de escolha, mas também temos como fazer essa alteração manualmente, no momento em que salvarmos o arquivo no [Photoshop] ou até mesmo os arquivos SVG no [Ilustrator].

_"Mas o que, de fato, muda quando otimizo uma imagem?"_

Para entender melhor a ideia, vamos aplicar uma compressão lossy e uma lossless em uma mesma imagem, para visualizar as diferenças em cada tipo:

imagem. :)

O que achou deste post? Conta pra gente suas experiências e sugestões sobre o tema!

Entenda mais sobre boas práticas e técnicas para melhorar a Performance Web neste curso da Alura e deixe suas páginas muito mais rápidas e otimizadas. ;)




**`List` é uma coleção de objetos que mantém a ordem em que eles foram adicionados**. Qual estrutura de dados estamos usando por trás de uma lista? Quando utilizar? É o que veremos aqui com códigos direto em C#.

Fomos chamados para resolver o problema de uma loja que está com dificuldade de armazenar os dados de seus produtos, pois eles já tem um sistema em produção. Porém ele não engloba a parte de armazenamento de produtos

Por conta disso, acabam tendo dados perdidos ou incorretos como, por exemplo, a quantidade de produtos no estoque não bate com as anotações. Analisando todo o contexto, decidimos utilizar **C#** para ter compatibilidade com o sistema que a empresa já tem.

A primeira coisa que vamos fazer é olhar como os dados estão armazenados do caderno.

```
Nome    | Quantidade 
------------------
Maçã    | 100
------------------
Abacaxi	| 50
------------------
```

Quando olhamos esses dados pensamos: O que podemos utilizar para armazenar isto?

Assim como nas anotações, podemos utilizar um recurso parecido com essa tabela que, no caso do C#, seriam as **listas**. Mas por onde devemos começar?

# Começando a implementação

Poderíamos começar criando uma aplicação console e analisando o que sabemos. No caderno tem as propriedades: **Nome e Quantidade**. 
Então vamos partir do ponto que temos que criar uma classe onde tenha os dois atributos juntos.

Qual nome devemos dar para esta classe? Um bom nome seria Produto, pois, estamos deixando claro o que a classe representa.

csharp

Esta classe vai ter que ter os atributos de nome e quantidade, com seus respectivos **getters e setters**.

csharp

Com a nossa classe criada vamos começar a trabalhar com a listas, no nosso Arquivo Program.cs.

Como queremos trabalhar com listas vamos primeiro criar uma lista de produtos para conseguir armazenar da mesma forma que estava no caderno.

csharp

Com esta lista criada, precisamos colocar elementos dentro dela para ver se está funcionando da melhor maneira possível, mas como podemos adicionar elementos a essa lista?

Temos que instanciar o Produto e adicionar valores a cada atributo para adicionar a lista

csharp

Bem agora só falta adicionar na lista para fazer isto temos que chamar o **método add** dela.

csharp

Temos que mostrar os valores que estão na lista, e como vamos fazer isto? 

Podemos utilizar o **foreach** para percorrer a lista a mostrar o valores que estão contidos na lista. Vamos precisar falar que queremos que um produto que está em lista fazendo.

csharp

# Alterando lista

Queremos além disso alterar os elementos que estão dentro desta lista, pois, escrevemos maçã de forma errada, está escrito maca e não é desta forma que se escreve, mas para alterar os dados, podemos fazer de qual maneira?

Quando criamos uma lista, ela tem uma coisa chamada **índice**, este índice é a numeração que está dentro da lista ou seja sempre que criamos algum item dentro da lista, ele vai ter um índice.

Vamos então fazer esta alteração a partir do índice, onde vamos mudar maca para maçã, primeiro vamos pegar a nossa lista que contém apenas um índice e mudar o nome que esta contido dentro da lista.

csharp

Com isso mudamos o nome que está na lista, mas precisamos ver está alteração foi bem sucedida. Então vamos percorrer a lista novamente e mostrar os valores que estão nela.

csharp

Após isto vamos fazer a análise do itens que estão no caderno, mas descobrimos que pararam de vender maçã nesta loja. Então vamos ter que remover este item da nossa lista, mas como podemos fazer isto?

# Removendo item da lista

Para fazer a remoção temos que duas maneira para se fazer isto, podemos remover pelo índice ou podemos remover o produto direto. Então vamos mostrar das duas maneiras.


Vamos começar adicionando mais um item na nossa lista para conseguir demonstrar dos dois modos.

csharp

Com um novo item adicionado na nossa lista, vamos pensar de qual maneira nós já conhecemos? Bem nós já conhecemos como os índices funcionam. Então vamos começar removendo desta maneira, passando o índice que está na lista como parâmetro.

csharp

Aqui nós removemos pelo índice, agora vamos remover passando o produto que queremos, para fazer isto temos que utilizar a função Remove está função nos espera um dos objetos que estão dentro da lista.

csharp

# Conclusão

Com isto resolvemos o problema que tivemos em relação a perda de dados ou dados errados.

Com listas aprendemos como podemos armazenar, alterar, remover.

Se ficou interessado em como o C# funciona e como você pode utilizá-lo melhor, aqui na **Alura** temos uma [**formação .NET**]. Nela você verá como criar aplicações, persistir os dados, dentre outras coisas.





imagem 

Um site responsivo vende a ideia de se adaptar a todo tipo de resolução. Mas é mesmo **todo** tipo? E os extremos? Telas muito pequenas e telas muito grandes? Como lidar? Ou melhor, como adotar uma estratégia pragmática com relação a isso?

Essa excelente pergunta foi trazida ao [**fórum da Alura**] pela Luana que estava fazendo nosso [**curso de Web Design Responsivo**].

## Entendendo os sites únicos e responsivos

Os sites únicos responsivos são uma resposta a prática que tínhamos antes de "criar um site pra cada aparelho". A ideia era que antigamente pessoas faziam sites diferentes pra mobile, pra desktop e até pra tablet (os famosos sites **m.**).

E isso na prática é impossível de se fazer. Há muitos dispositivos diferentes. Então preferimos a ideia de um site único que se adapte a diferentes resoluções de tela.

Essa adaptação é feita com **design responsivo**:
* um design base com pequenas adaptações feitas nas media queries.

## Sites responsivos no mundo ideal

No mundo ideal, todos os sites do mundo deveriam se adaptar a todas as resoluções do mundo. Isso seria o mega responsivo ideal. Que ninguém faz.

Na prática, estabelecemos limites que nosso site deve suportar. Isso dentro dos limites do nosso público e do que acreditamos ser prioridade hoje.

Vejo da mesma forma como nenhum site hoje suporta IE4 mais; não faz sentido. No mundo ideal, suportaríamos todos os browsers e resoluções de tela possíveis.

## Então o que devo fazer no mundo real?

No mundo real, priorizamos pra suportar o máximo possível dentro dos critérios do projeto.

Então como não dá pra suportar todos os tamanhos de tela (esse número seria infinito) é comum fixar um valor máximo pra suportar.

Por isso o site da Alura por exemplo não fica legal em 2000px. E, se for ver, não fica legal em telas pequenas de 200px também.

**O site é responsivo entre os limites de 320px e 1400px**. Fora deles, quebra.

Inclusive eu gosto de explicitar esses limites em código pra deixar bem claro o intervalo de resoluções que aquele projeto suporta (e, de novo, cada projeto deve priorizar do seu jeito):

css

Na **Alura** temos uma [**Formação Front-end**] que foi pensada para você começar do zero e se tornar um profissional de ponta. É um guia de estudos com um passo a passo pensado com carinho pela equipe da Alura.





imagem 

No projeto de um app mobile de ecommerce, chegaram ao seguinte layout de busca de produtos:

imagem.

imagem, que são separados como a atividade específica de cada usuário ou página. Podemos curtir, compartilhar e comentar cada conteúdo específico.

Além disso, assim como no exemplo inicial, podemos utilizar cards como forma de facilitar a busca do usuário quando navega por diversas informações diferentes.

imagem





imagem 

Também conhecido como _M-learning_, ele é uma forma de aprendizado por meio de dispositivos móveis e uma nova maneira para treinar e capacitar equipes de todas as áreas.

Muitas organizações ainda enxergam o _smartphone_ como um inimigo para a produtividade. Porém, esse dispositivo pode ser um grande aliado na hora de capacitar seus funcionários.

O _Mobile Learning_ é um método de ensino que utiliza dispositivos móveis, como smartphones e tablets, para treinamentos e cursos a distância. Isto é, o aluno aprende a qualquer hora, em qualquer lugar e de maneira individual.

Esse modelo de aprendizagem traz diversos benefícios tanto para as empresas quanto para os seus colaboradores, pois ambos ganham com o aproveitamento da mobilidade. Mas afinal, quais são esses benefícios de implementação do _Mobile Learning_ dentro de uma cultura empresarial?

**Para as empresas**

- **Equipe mais motivada** – Em treinamentos corporativos convencionais, é frequente vermos uma sensação de obrigação por parte dos funcionários para realizá-los, enquanto que, com o _Mobile Learning,_ essa sensação diminui por conta da flexibilidade.
- **Capacitação de forma rápida** – O tempo é otimizado com treinamentos a distância, pois o funcionário não precisa necessariamente estar na empresa para se capacitar.
- **Diminuição de gastos** –  Não são necessários materiais ou espaços físicos da empresa para realizar os treinamentos. O colaborador pode aprender acessando a plataforma direto de seu próprio celular, de qualquer lugar.

**Para as equipes**

- **Aprender onde quiser** – Situações que antes eram improdutivas, como esperar em uma fila de banco ou o trajeto entre casa e trabalho,  tornam-se grandes oportunidades de aprendizagem com o _Mobile Learning_.
- **Dinamismo** – Com o _M-learning_, o colaborador tem uma participação ativa e desafiadora, enquanto que, em treinamentos corporativos tradicionais, eles ficam passivos diante das informações que recebem.
- **Individualidade** – Este método se adapta a qualquer estilo de vida, servindo às mais variadas rotinas e dispensando planejamentos especiais para a realização dos cursos.

Estes são apenas alguns dos muitos benefícios que o _Mobile Learning_ traz. Se você deseja conhecer mais sobre o assunto e descobrir como explorar o poder desse método, recomendo que leia o eBook gratuito [**Como explorar o poder do Mobile Learning**].

Quer implementar essa cultura em sua empresa? Na [**Alura**], além da plataforma web, temos um app com todos os nossos cursos e exercícios disponíveis. Inclusive, ele conta com a possibilidade de download das aulas para você assistir offline, assim é possível aprender a qualquer hora e em qualquer lugar. :)




Na Web, todas as vezes que entramos em um site, utilizamos o protocolo HTTP (Hypertext Transfer Protocol) como por exemplo uma requisição para o [site do Alura]:

imagem e clicar na aba **"network"**:

![pagina-do-alura-no-modo-network]

Se realizarmos uma nova requisição a página do Alura vejamos o que acontece:

![refresh-na-pagina-do-alura]

Observe que apareceram 3 items, ou seja, 3 requisições realizadas ao carregar a página do Alura:

![items-da-requicao]

Ao clicarmos no item **www.alura.com.br**:

![informacoes-da-requisicao]

São exibidas um monte de informações sobre essa requisição, porém, por enquanto, vamos verificar apenas a informação abaixo:

- **Request Method:** `GET`

O que significa esse **Request Method**? E esse valor `GET`? Parece bem confuso... Quando falamos sobre request method, nos referimos aos verbos que utilizamos para nos comunicarmos com o servidor, nesse caso, o servidor do Alura! Mas o que isso significa?

O Request Method indica quais são as nossas intenções quando fazemos uma requisição ao servidor, por exemplo, se estamos **apenas** pegando informações do servidor, como foi o caso da requisição ao site do Alura, utilizaremos o verbo `GET`.

Porém, qual seria uma situação que não pegaríamos uma informação do servidor? Um formulário de cadastro seria um bom exemplo! Vamos pegar um formulário de um site qualquer na internet, por exemplo, a [página de cadastro do github]:

![pagina-de-cadastro-github]

No momento que chamamos pela primeira vez a página, estamos **apenas pegando** as informações do servidor, ou seja, o verbo será o `GET`. Agora, vamos tentar criar um novo cadastro colocando um e-mail que já existe no sistema deles:

![pagina-de-cadastro-github-no-post]

**Observe que, ao clicarmos no botão "Create an account" o request method utilizado foi o `POST`! Mas porque agora foi o `POST` e não o `GET`? É justamente porque nós queremos criar, adicionar, enviar informações ao servidor!**

**Além do `GET` e do `POST`, existem outros verbos como o `PUT` que indica uma alteração de um recurso existente, `DELETE` para deletar um recurso existente.**

Esses e demais verbos são definidos com mais detalhes na [especificação da W3C] para definição de métodos.

Não tinha nem ideia que existia toda essa padronização por de baixo dos panos em aplicações Web? Que tal aprender mais sobre o protocolo HTTP? Pensando nisso, criamos o [**curso de HTTP**] que explica com mais detalhes o protocolo HTTP e seu funcionamento no mundo Web.




Entender o que significa "mais popular é um desafio" que descrevo já já, primeiro vamos aos resultados. Utilizei o número de alunos inscritos dividido pelo tempo de existência de um curso na plataforma em 2015:

10. [MySQL 1: Iniciando suas consultas] 

9. [Bootstrap: velocidade no front-end] 

8. [Gestalt: desmistificando o Design] 

7. [Java I: Primeiros passos]

6. [Oracle II: Consultas Complexas] 

5. [Refatorando na prática] 

4. [Spring MVC I: Criando aplicações web]

E o top 3, todos com mais de 10 novos alunos inscritos por dia: 

3. [HTML5 e CSS3 I: Suas primeiras páginas da Web] 

2. [Android I: Crie sua App fantástica] 

1. [NodeJS: Inovando com Javascript no backend]

Ficou curioso em relação ao conteúdo e depoimentos dos alunos sobre estes cursos? Basta seguir o link deles para encontrar informações sobre cada um deles.

### As grandes áreas de tecnologia

A grande sacada? Diversas áreas da carreira na tecnologia estão representadas nesses 10 cursos: o mundo mobile, o frontend, o backend tradicional, o backend moderno, os bancos relacionais e o design (Gestalt, já falei que é um curso genial). Uma área muito recente,de SEO e Marketing Digital ainda não aparece nos top 10... mas aposto em mudanças para 2016.

### Desafios ao buscar o Top 10

Como essa é uma normalização, essa tabela não indica os cursos mais estudados ou terminados, que também são dados interessantes, mas é uma maneira razoavelmente justa de indicar a popularidade de um curso através de um ano.

O ramo de estudo desses tipos de estatística é chamado de learning analytics, e existem diversos detalhes extremamente importantes para se levar em consideração antes de julgar um curso como sucesso/fracasso na educação da população (lembra? nosso objetivo é alavancar a qualidade do mercado de trabalho!).

A conta que usei, inscritos/dias_de_curso_no_ano, é justa pois indica a popularidade do curso nesse período, mas um pouco injusta pois um curso sempre tem um boom inicial logo após lançado - um pouco refletido nos cursos de NodeJS e Gestalt, lançados mais próximo do final do ano.

**Toda medida tem suas vantagens e desvantagens, seus erros e muito mais. Neste ano de 2016 teremos nossos primeiros cursos de machine learning e data analysis. Sempre focando na prática, mostraremos como levar em consideração diversos desses problemas de medição e como corrigi-los para entendermos realmente o que acontece.**

### Parabéns!

**Mas este era um artigo de mais populares do ano? Sim! Então parabéns a todos os dez cursos,seus criadores e mantenedores, além dos alunos que fazem parte da revolução da educação através da didática Caelum, aplicada na Alura.**

Quais cursos você esperava ver entre os mais populares? E quais espera ver em 2016?




Que o mercado de trabalho tem mudado por causa da tecnologia, você já deve saber. Nos últimos 20 anos, pelo menos, ela se tornou um grande diferencial competitivo e aumentou a importância da capacitação profissional, principalmente para quem trabalha mais diretamente com as inovações.

O que quase ninguém comenta é o quanto as pessoas também mudaram com essa modernização.

Se é por causa dela que todos temos de passar por aprimoramento profissional, é também ela o fator que simplifica esse aprimoramento e pode te transformar não apenas em um profissional de tecnologia melhor, mas em uma pessoa mais produtiva, dinâmica e proativa, no geral.

Pronto para aprender sobre novas tendências, [**ferramentas importantes**] e entender por que o Ensino a Distância (EAD) revoluciona o mercado profissional e pessoal, interferindo até mesmo na busca por melhores empregos e na competitividade? Então siga a leitura até o fim!

## 1\. Estar por dentro das tendências do mercado de tecnologia

A primeira necessidade que o mercado de trabalho dos dias de hoje coloca é a de nos atualizarmos constantemente.

Afinal, as novidades não param: quase todos os dias há novos aparelhos, softwares e soluções desenhadas para deixar a vida e o trabalho das pessoas mais práticos. Isso significa mais comodidade, mas também pode deixar muitos profissionais perdidos.

Afinal, como é que você vai escolher, dentre tantas opções, as melhores ferramentas para executar suas tarefas profissionais? Esse é um bom exemplo de como precisamos aprender a lidar produtivamente com as tendências do mercado de tecnologia.

### 1.1 Tecnologia muda pessoas e pessoas mudam o trabalho

O desenvolvimento tecnológico imprimiu uma velocidade muito grande de transformação na sociedade. E quando dizemos sociedade, não queremos dizer apenas mercado de trabalho, mas, principalmente, pessoas.

Use a si mesmo como exemplo: quando você compra alguma coisa, hoje em dia, são grandes as chances de que faça isso direto do seu computador.

Por meio dele, você pesquisa um novo produto, compreende seus benefícios e limitações e até colhe opinião de gente que já comprou. [As vendas pela internet aumentam a cada ano], e você se assustaria de saber quanta gente já escolhe e compra um produto direto do celular, sem nem mesmo usar um computador de mesa ou notebook.

Tantas facilidades e transformações têm uma consequência principal: tornar o consumidor mais exigente. E se o consumidor fica mais exigente, o mercado de trabalho também fica. Afinal, serão necessárias pessoas mais qualificadas nas empresas para atender a esse novo tipo de consumidor.

O resultado disso é que as empresas adotam um modelo de marketing mais qualificado (e substituem o marketing tradicional pelo digital, mais barato e funcional), um processo de venda mais atento à necessidade dos clientes e todos os serviços acabam precisando ser aprimorados.

E sabe como isso chega até você? Simples: todas essas mudanças acirram a concorrência no mercado de trabalho e aumentam a importância da capacitação profissional e tecnológica, transformando-a em um diferencial precioso para o primeiro emprego.

Para responder a essas necessidades, a primeira coisa que você deve fazer é se manter atualizado.

### 1.2 Novas habilidades são valorizadas

Quer mais um exemplo de mudança que ocorre por causa das novas tecnologias? Mais do que qualquer outra coisa, [o trabalho freelancer vem sendo cada vez mais valorizado].

Uma boa parte das tarefas das empresas que mais crescem no país é desempenhada por esse tipo de autônomo, que costuma responder melhor a mudanças, ser mais independente e gerar menos custos empregatícios.

Mas, não é só pelos [**freelancers**] ganharem melhor e gerarem menos custos que o trabalho deles vem crescendo.

A verdade é que as pessoas que trabalham por conta própria, muitos deles de casa mesmo, costumam apresentar algumas das qualidades mais valorizadas pelas empresas nos dias de hoje. Eles são dinâmicos, bem informados e, principalmente, proativos e independentes. Antigamente, as instituições adotavam modelos de equipes muito pouco proativas e que apenas executavam o que era proposto pelo chefe.

Nesses tempos de mudanças constantes, o perfil do “funcionário ideal” mudou muito. Ele passou a ser aquele que sabe cumprir o que é exigido, mas que questiona regras e propõe soluções que façam mais em menos tempo e gastando menos.

Esse novo colaborador pensa por si próprio, participa nas decisões da empresa e tem um senso de trabalho em equipe muito grande. O sonho de todo empresário é que todos os membros do seu time tenham espírito crítico e que cada um entenda bem o todo da empresa, de forma que suas opiniões contribuam pra melhorá-la.

Se o que você busca é um diferencial competitivo, fique de olho nessas novas habilidades. Não pense nelas como qualidades com as quais as pessoas nascem. Elas podem e devem ser treinadas no dia a dia, em casa ou no trabalho.

### 1.3 Novidades devem ser acompanhadas

Designers, profissionais de marketing e programadores além de outros tantos trabalhadores que dependem mais diretamente da tecnologia para trabalhar devem se manter informados sobre as novidades tecnológicas da sua área.

A mídia digital e impressa dá destaque para essas inovações, e não é difícil ficar antenado. Se você já sabe em que área pretende trabalhar, pode focar suas pesquisas na direção certa, buscando informações sobre o mercado em que atua e as ferramentas tecnológicas mais usadas, por exemplo.

Junte as informações que conseguir lendo jornais e revistas com as de blogs especializados e você vai ter bons critérios para direcionar, testar, decidir e melhorar suas aptidões nos softwares e ferramentas que vai utilizar profissionalmente.

E por falar em softwares e ferramentas, essa é uma questão crítica para se aperfeiçoar tecnologicamente e criar um poderoso diferencial competitivo.

## 2\. Ter mais domínio das ferramentas importantes para o trabalho

Boas ferramentas tecnológicas são as maiores responsáveis pela sua produtividade. Embora o uso delas seja abordado durante os anos de universidade, o mais comum é que os formandos saiam de lá se sentindo despreparados.

Há algumas razões para isso: softwares de computador são ferramentas complexas em muitos casos, e apenas uma abordagem genérica — a única possível na ampla grade curricular dessas instituições — não prepara os alunos para a sua utilização.

Além do mais, nem sempre as disciplinas instrumentais no ensino superior são desenvolvidas por especialistas no uso desses softwares. Veja algumas dicas para melhorar suas aptidões com as principais ferramentas do seu trabalho:

### 2.1 Evite trocar de ferramentas o tempo todo

O que não faltam são boas ferramentas tecnológicas para todas as profissões. Se você é do tipo apaixonado por novidades, isso pode se transformar num problema: quem não fica tentado a usar sempre o software mais atual, os aparelhos mais recentes e que disponibilizam mais funcionalidades e opções?

Se deixar ser levado pela impulsividade, pode ser que isso afete seu rendimento negativamente. Pergunte aos especialistas da área que você pretende seguir e eles vão te responder que as melhores ferramentas tecnológicas são aquelas que você domina.

Claro, há alguns critérios para se levar em conta: quanto mais intuitivo e fácil de aprender um software for, melhor.

Mas, no fundo, o que mais importa é que você escolha a ferramenta que melhor se adapta às suas necessidades e continue trabalhando com ela por muito tempo, o que permite criar uma rotina e dominá-la de verdade.

### 2.2 Invista em cursos para se aprofundar nessas ferramentas

Uma coisa é fato: não dá pra escolher um software desses só lendo a respeito. Também não é muito recomendável decidir com base apenas em umas poucas experiências em casa, tomando uma decisão rápida sobre um programa com milhares de possibilidades.

Se você quiser chegar a uma decisão consciente e escolher a melhor opção — que, por sinal, vai te acompanhar por anos a fio — o melhor é mesmo fazer cursos e aproveitá-los para experimentar cada uma dessas ferramentas.

Vamos tomar a [**profissão de designer**] como exemplo: alguns profissionais dessa área preferem criar todo o material gráfico no [**CorelDraw**]. Outros argumentam que algumas funcionalidades desse programa o tornam ultrapassado e preferem usar opções como o [Adobe Illustrator] ou o [**Adobe InDesign**].

Há também quem prefira aliar o que cada um desses softwares tem de melhor com funcionalidades básicas do Adobe Photoshop, por exemplo. Eles argumentam que aprender um pouco de cada software — em vez de dominar apenas um — torna seus trabalhos mais versáteis.

E como você vai ter a sua própria resposta para uma pergunta dessas? Só mesmo experimentando cada uma dessas ferramentas de forma orientada, com organização didática e podendo contar com a ajuda de professores que são especialistas.

## 3\. Adquirir um forte diferencial competitivo

Se você é como a maioria das pessoas, só de ler o título deste tópico uma palavra bem específica veio à sua mente: “currículo”.

Não há como negar que ele ainda é importante. A seleção de um bom profissional de tecnologia mudou muito por causa dos motivos que discutimos anteriormente. Entretanto, essas mudanças não foram tão radicais a ponto de a velha fase da “análise de currículo” ser extinta do processo seletivo das empresas..

E, convenhamos: a maior parte dos currículos é bem parecida.

Se formos nos ater apenas aos candidatos como você, que estão prestes a iniciar no mercado de trabalho, eles são quase idênticos. Mesmo nível de escolaridade, pouca ou nenhuma experiência profissional, idade e objetivos bem parecidos.

Sabe onde um diferencial competitivo mais pesa nessa etapa? Naqueles cursos específicos na área de tecnologia.

E esses, quanto mais objetivos forem, melhor: você aprende novas habilidades tecnológicas valorizadas pelos seus empregadores, estudando em cursos que realmente te capacitam e vão direto ao ponto.

Saiba um pouco mais a respeito de como fazer da capacitação profissional na [**área de tecnologia**] um diferencial competitivo de verdade:

### 3.1 Mostre que você é um profissional de tecnologia que gosta de aprender

Como dissemos, as empresas querem profissionais qualificados para responder às mudanças constantes pelas quais o mercado de trabalho passa e vai continuar passando.

Por outro lado, qualquer diretor de Departamento Pessoal sabe o quanto é difícil recrutar gente que realmente gosta de aprender. As pessoas, por mais capacitadas que sejam, acabam sempre se acomodando e tratando o conhecimento que têm como verdade inquestionável.

Em uma época em que a tecnologia muda as coisas da noite para o dia, esse passa a ser um péssimo defeito.

E é por isso que o seu empregador vai entender claramente como você tem sede pelo conhecimento, quando ele tiver em mãos o seu currículo com pouca experiência de trabalho, mas já com diversos cursos tecnológicos concluídos.

Um dado interessante e que vai te convencer disso é que, via de regra, sai muito mais barato para uma empresa investir na qualificação dos seus funcionários do que contratar novos colaboradores, por mais qualificados que sejam.

Resumindo: faça vários cursos tecnológicos, melhore o seu currículo e ainda tenha a certeza de estar entre os nomes que ultrapassam essa etapa e são chamados para uma primeira entrevista.

### 3.2 Trabalhe em empresas que são a sua cara

É sempre bom lembrar que o principal critério de seleção das organizações, hoje, é o quanto um candidato aparenta apresentar os mesmos valores pessoais e profissionais que ela.

O que queremos dizer com isso é que os exames frios baseados em dinâmicas de grupo genéricas tendem a acabar. Os profissionais da área de Recursos Humanos têm desenvolvido a percepção de que todo candidato apresenta defeitos e qualidades, e que não é isso que define a sua escolha, mas sim a afinidade dele com aquela instituição.

Isso é uma ótima notícia para você: se souber passar a impressão certa em um exame de seleção, você será o escolhido para trabalhar em uma empresa que é a sua cara!

E se o seu conhecimento e aptidões tecnológicas forem treinados o suficiente, isso é garantia de trabalhar em uma empresa tão apaixonada pelo mundo digital e tecnológico quanto você. Quer coisa melhor?

## 4\. Facilitar a recolocação profissional

Se você encontrar de primeira a empresa dos seus sonhos para trabalhar, ótimo! Mas, o mais provável é que você precise passar por várias experiências profissionais antes de isso acontecer. Pode ser também que o seu destino seja abrir o seu próprio negócio ou [**atuar como freelancer**].

Não importa. Se investir na sua capacitação profissional na área tecnológica, estará um passo à frente quando precisar de uma recolocação profissional.

Avalie desta forma: hoje é difícil encontrar mão de obra qualificada para atuar nos diversos segmentos ligados direta ou indiretamente à tecnologia.

E, uma vez que as mudanças sociais e do mercado de trabalho estão em aceleração constante, isso deve se acentuar daqui a uns anos.

Se quiser tirar esse problema de letra quando for mudar de emprego, invista na sua capacitação agora e continue trabalhando nela mesmo quando estiver empregado. Do jeito que o mundo do trabalho mudou, é bem provável que seja do interesse da próxima empresa em que você for trabalhar investir na sua formação.

Tire proveito disso e direcione seus esforços de aprendizado para a área de tecnologia. Compreenda o mundo digital, as ferramentas mais usadas no seu ramo e também a lógica de pensamento por trás das novidades tecnológicas como um todo.

Independentemente da área em que você atue, há certos conhecimentos que começam a fazer parte de uma formação mais geral para o mercado de trabalho. Saber conceitos básicos de [programação], [design], webdesign e até mesmo noções elementares de [**marketing digital e empreendedorismo**] só têm a acrescentar à carreira de qualquer profissional.

E vão te deixar anos-luz à frente dos concorrentes quando, por um motivo ou outro, precisar de recolocação profissional!

## 5\. Entenda por que investir em capacitação por EAD

Se a sua rotina de estudos é corrida ou se você mora longe dos grandes centros urbanos, pode ser que tenha acompanhado tudo o que falamos até aqui com um pé atrás.

E é justamente em casos como o seu que o Ensino a Distância cai como uma luva. A desconfiança que esse tipo de instrução despertou nos seus primeiros anos já caiu por terra há um bom tempo. Hoje, os cursos a distância são vistos com muitos bons olhos pelos empregadores e funcionários..

Podemos mesmo falar que ele seja uma das mais promissoras mudanças que a tecnologia tem promovido no aperfeiçoamento profissional.

Se você é do tipo que só se convence com [números], aqui vão alguns bem animadores: a estimativa é que o Ensino a Distância (EAD) dobre no Brasil em apenas 5 anos. Além disso, eles são, em média, 4 vezes mais baratos que o ensino tradicional.

Nada mal, não é mesmo? Confira outros benefícios do EAD que podem te convencer de que esta é uma excelente alternativa de capacitação:

### 5.1 Os horários são flexíveis

Até nisso o mundo mudou. Por assim dizer, é como se o dia das pessoas tivesse menos horas. Transitar pelas cidades grandes ou mesmo pequenas é demorado, cansativo e estressante.

E nada disso condiz com um bom aprendizado, que requer concentração e resistência mental. A dica de ouro é estudar sem precisar sair de casa, na frente de um computador, smartphone ou tablet.

Pela forma como os cursos à distância são elaborados, você não perde o contato com professores experientes e material de primeira qualidade. E ainda pode contar com flexibilidade total de horário. Basta uma senha de acesso à plataforma onde estão os seus cursos e você decide se estuda de manhã, tarde, noite ou madrugada.

Se precisar se deslocar por algum motivo, basta uma boa conexão de dados móvel para fazer os seus cursos de dentro do carro ou ônibus.

### 5.2 Os cursos são econômicos

Como dissemos, o EAD custa, em média, um quarto do que você pagaria em um curso convencional.

E a economia não para por aí: o material didático é digitalizado, evitando os gastos com as fotocópias que tanto consomem os recursos dos alunos. Outros custos pesados do ensino tradicional também podem ser evitados com o EAD, como é o caso do transporte e da alimentação.

Coloque tudo isso na ponta do lápis e você vai entender por que a cada ano mais gente adere à praticidade e economia dos cursos à distância.

### 5.3 A rotina de estudos se adequa ao seu ritmo

Tem gente que detesta acordar cedo. Outros não têm resistência mental à noite e, se tiverem que frequentar um curso nesse horário, fatalmente terão seu desempenho comprometido. Há, ainda, os que preferem estudar todo o conteúdo diário de uma vez para ficarem livres. Outros, assimilam melhor fazendo pequenos turnos de meia ou uma hora e descansando em seguida.

Como você deve ter notado, uma sala de aula jamais vai atender as necessidades de todos os alunos, já que eles são tão diferentes entre si.

Este talvez seja o maior benefício dos cursos a distância: só eles podem se adaptar ao ritmo de cada estudante, possibilitando um rendimento melhor e também a oportunidade de ele conhecer e testar seus próprios limites no aprendizado.

### 5.4 A interação entre alunos e professores não é necessariamente menor

Da forma como a maioria das plataformas de EAD é concebida, a interação entre alunos e professores acaba sendo bastante incentivada, ao contrário do que se imagina.

A troca de opiniões, materiais e informações sobre os cursos também é parte integrante do Ensino a Distância. Afinal, o aprendizado é muito mais efetivo se feito em conjunto, não é verdade? E o conhecimento é algo construído socialmente.

A tecnologia não mudou o mercado de trabalho. Ela mudou as pessoas e as pessoas mudaram o mercado de trabalho. A maneira como compramos, vendemos, trabalhamos e estudamos é um reflexo de quem somos.

É por isso que tantos entre nós são tão apaixonados, a um tempo, pela tecnologia e pelo conhecimento. Porque sabem que ambos são muito parecidos na forma como podemos usá-los para nos transformarmos em pessoas melhores e, por consequência, em profissionais melhores.

Como toda certeza, compreendendo a importância da capacitação profissional e fazendo uso do ensino a distância, você vai caminhar junto com as tendências do mercado de tecnologia. O que, no futuro, será o seu maior diferencial competitivo e humano.






A ByteBank - uma empresa que faz cartões sem tarifa, como a [Nubank] - está começando a produzir marketing de conteúdo focado no B2B (empresa para empresa, Business to Business). [O setor de marketing já escreveu um texto] onde explica as diversas maneiras para a empresa economizar usando o cartão de crédito.

Além disso, **a equipe de marketing escreveu diversos conteúdos**, como casos de empresas que conseguiram alavancar sua renda com a economia feita utilizando os cartões, infográficos da expectativas do setor financeiro e de prospecções de investimento.

A empresa também criou textos com passo a passo de como definir os limites de gastos com as categorias relativas à empresa, apresentando as novidades do setor econômico e outros com dicas de como organizar as finanças da empresa.

Apesar de possuir diversos conteúdos prontos, a equipe de marketing da empresa de cartões não está sabendo como melhor entregá-los para os clientes e possíveis clientes que ainda não conhecem o cartão de crédito sem tarifas.

> E agora? Como e por onde pode-se entregar essas informações para as empresas?

[**No Marketing de conteúdo existem diversos canais para entregar o conteúdo**] da nossa empresa para as pessoas. Porém, isso vale tanto para B2B quanto para B2C?

Sim! E os mesmos canais podem ser utilizados! Só é necessário se atentar ao nicho da empresa que irá criar o conteúdo e às fases no funil de marketing de conteúdo das empresas que são suas clientes.

A ByteBank, que é do nicho financeiro, pode criar diversos conteúdos e imagens para diversos canais, eles pensaram em utilizar os mesmos que já usavam para o B2C, analisando quais já eram usados e como podem usar essas formas na entrega de conteúdo B2B.

Caso fosse uma empresa pequena, de desenvolvimento de software, no qual não possuem tanta interação com seus clientes ou até mesmo questões visuais, eles poderiam empenhar-se mais em blogs com conteúdos de como o porquê softwares que otimizam o trabalho de uma empresa são importantes.

## Blog

Mesmo que o **blog** seja focado para conteúdo B2C, foi criada uma tag "**para empresas**" no menu, na qual ficariam reunidos todos os textos e conteúdos focados para as empresas.

Dessa forma, os textos focados para as corporações ficam agrupados e possuem um espaço no menu, sem ser necessário que a pessoa fique buscando esse conteúdo por muito tempo.

Assim, nessa parte, podem ser publicados todos os textos criados para o B2B, desde o texto sobre como economizar com o cartão de crédito, até outras dicas, infográficos, novidades e curiosidades sobre o uso do cartão por uma empresa.

## Whitepapers

Percebeu-se também que muitas empresas tinham diversos problemas financeiros que poderiam ser resolvidos, ou pelo menos poderiam receber uma ajuda, com um material que possuísse um conteúdo mais completo e que solucionasse uma dificuldade.

Assim, começaram a disponibilizar no **site um conteúdo diagramado** para as pessoas baixarem no qual é apresentado um problema e sua solução.

Eram diversos conteúdos sobre as principais dificuldades financeiras de empresas: como fazer fluxo de caixa, investir o dinheiro da empresa, como criar um sistema de gestão financeira, organizar as contas da empresa, fazer diversos cálculos para analisar se está havendo lucro ou não.

Além disso, também foram publicados casos de sucesso, de outras empresas que conseguiram economizar usando o cartão. Para mostrar que, realmente, usar o produto traz resultados e benefícios.

Mesmo sendo muito semelhantes ao e-book, a principal diferença é que em vez de somente apresentar um tema, os [**whitepapers**] ajudam a solucionar um problema.

Para fazer o download, as pessoas devem disponibilizar algumas informações para entrarmos em contato com elas, como nome, e-mail, tamanho e segmento da empresa. Assim, podemos enviar por meio de newsletter um conteúdo mais segmentado.

Se quiser ver na prática, [**a Alura tem vários whitepapers**] para ajudar as empresas que assinam nossos cursos e apresentar como podemos ajudar as empresas que ainda não contrataram a alura :)

## E-mail/Newsletter

Depois de obter os contatos das pessoas das empresas, por meio do whitepapers, e-books e compras do cartão, a ByteBank começou a enviar uma newsletter semanal para diversas listas, que dispunham as empresas de acordo com o segmento de cada uma delas, com as novidades no cartão e no setor financeiro que melhor se enquadra a elas.

As listas também eram organizadas [**pela fase do funil do marketing de conteúdo no qual a empresa se encontrava**]:

- se ela estava atraída pelo produto
- se já havia se inscrito na newsletter e/ou feito o download dos whitepapers, quase sendo convertida
- se já havia começado o processo de pedir o cartão
- ou se estavam quase pedindo o cartão e se já haviam pedido - e já estavam usando

Também foram enviados alguns links dos últimos posts do blog da empresa de cartão e alguns links de veículos de comunicação que falavam sobre o setor financeiro, para a pessoa ler.

Os conteúdos escolhidos para cada e-mail variavam de acordo com o tamanho da empresa e com a fase em que estavam, reunindo dicas às formas de economizar e lucrar, como o cartão poderia ajudar e quais as novidades para quem ainda não era, e para quem já era, cliente.

Assim, os e-mails foram disparados de uma forma mais segmentada e com os assuntos que interessavam para aquele grupo de empresas. Assim poderíamos acompanhar a empresa, fornecendo um conteúdo certo para ela, para que ela possa ver nossos serviços e querer contratar, ou continuar usando.

## Redes sociais

A ByteBank começou a publicar alguns conteúdos **B2B nas redes sociais**, as quais antes eram focadas no B2C. Os posts B2B eram feitos uma vez a cada 15 dias.

De forma sutil, as publicações eram acompanhadas da frase "sua empresa" como se estivesse falando com uma pessoa que, por um acaso, possui uma empresa que poderia se beneficiar com os serviços.

Entretanto, no Linkedin, que possui um foco maior para questões empresariais e de carreira, a maior parte das publicações eram voltadas ao B2B, sempre compartilhando os posts do blog, novidades, dicas e passo a passos.

## Planejamento e resultados

A ByteBank, então, criou um planejamento de conteúdo e publicações em cada um desses canais. Mesmo assim, não realizaram vendas B2B logo no início.

Porém, lembrando que [**o processo de compra B2B é mais longo**], não desistiram e continuaram com o planejamento.

Depois de alguns meses, compartilhando conteúdo em posts do blog, whitepapers, newsletters e publicações no Linkedin, conseguiram aumentar, pouco a pouco, as vendas B2B. E, com um pouco mais de tempo, começaram a notar um bom retorno do marketing de conteúdo focado para B2B.

Caso a sua empresa utilize outros canais, e funcione, é melhor ainda!

O principal objetivo é se comunicar com o público e mostrar as vantagens do seu serviço e produto. Lembre-se que o processo é demorado, mas pode trazer ótimos resultados a longo prazo!

Quer saber mais sobre como você pode alavancar o seu negócio e ter sucesso com o marketing de conteúdo? Conheça [**o curso de Marketing de Conteúdo**]. E também confira o livro da Casa do Código, [**Marketing de Conteúdo: Estratégias para entregar o que seu público quer consumir**].




# Introdução

Se você conhece alguém ou é da área de **data science**, já deve ter escutado sobre um tal de [Jupyter Notebook]. O **Jupyter é uma aplicação web interativa que permite a criação e compartilhamento de documentos com código dinâmico**, amplamente usada na área de dados, facilitando sua visualização, limpeza e exploração. Além de permitir a mescla de células de código e texto, otimizando a criação de apresentações e relatórios, já que pode se fazer tudo em um só local.

Jupyter se mostra tão relevante para a comunidade que em 2017 foi agraciada com o prêmio [ACM Software System Award], um dos mais importantes na área da computação. Entre os projetos que também já foram agraciados, estão nada mais, nada menos que Java, Unix, TeX e a “pouca” utilizada Web, isso mesmo, o famoso www. Mas o Jupyter que se “cuide”, pois não é apenas o Google com o Colaboratory que está nessa briga. 

A **Netflix** entrou em campo lançando no dia 23/10/2019 o [**Polynote**], um notebook poliglota com a intenção de simplificar a ciência de dados e o workflow de **machine learning.**

Neste artigo vamos realizar um overview sobre os aspectos mais interessantes dessa nova ferramenta que já está fazendo barulho na comunidade e empolgando muitos(as) cientistas de dados por aí.

# Um notebook Poliglota

A Netflix é uma das defensoras da **programação poliglota**, isso é, da **prática de escrever códigos em múltiplas linguagens  para capturar funcionalidade e eficiência adicionais** que não estão disponíveis em uma única linguagem de programação. Visando facilitar a vida dos adeptos a programação poliglota, o Polynote permite codar em diferentes linguagens em um mesmo notebook, até o momento apresentando suporte a Scala, Python e SQL. Como as células compartilham um mesmo contexto, as variáveis declaradas em linguagem podem ser utilizadas uma em outra e vice versa.

imagem

**Referência:** https://towardsdatascience.com/trying-polynote-from-netflix-a-better-notebook-for-data-engineers-5107277ff2e5 

# Um notebook com “jeito” de IDE

Se você está habituado com IDEs como Pycharm e editores como VScode, deve estranhar um pouco codar em um notebook. Já ví muita gente por aí codando em IDE e só colando o código em um notebook como o Jupyter e Colab (apelido carinhoso do Colaboratory) da google. Claro que o Polynote não tem a intenção de ser um  uma IDE completa, mas traz um design diferente dos notebooks “tradicionais” e mais próximo de uma IDE, não é apenas o design que está próximo de uma IDE. 

Algumas funcionalidades como auto-complete, [**lint**]) e e um rico editor de texto com suporte a Latex torna mais evidente a diferença entre Polynote e o Jupyter. 
Por trás do editor do Polynote está o [**Monaco**], que está por trás do **VScode**, então ainda podemos ter um avanço incrível nas melhorias do notebook.

Na parte visual, o **Polynote** pretende deixar os processos que ocorrem no kernel mais transparentes, evitando a necessidade de se aprofundar nos logs. Com esta finalidade o Polynote fornece uma variedade de informações visuais sobre o kernel, por exemplo, uma lista de tasks a serem executadas pelo kernel facilitando acompanhar o progresso de execução e uma tabela das variáveis e seus tipos.

imagem

imagem

**Referências das duas imagens acima:** https://polynote.org/

# Reprodutibilidade

Nós já falamos sobre a visibilidade (transparência dos processos) que é um dos grandes princípios do Polynote, mas tem outro princípio que guiará o desenvolvimento do notebook da Netflix, a reprodutibilidade. Se você já trabalhou com algum notebook, seja o Jupyter ou o Colaboratory do Google, provavelmente se deparou com a situação onde desenvolveu seu modelo ou análise sem nem um problema. A surpresa vem só quando reiniciar a execução desse notebook e do “nada” ele está quebrado. Se já passou por isso, fique calma(o) que você não foi a(o) primeira(o), eu garanto!

Relembrar o que são os notebooks é importante para compreender o porquê são tão suscetíveis a erros. Os notebooks são uma coleção ordenada de células, cada uma das quais pode conter código ou texto. O conteúdo de cada célula pode ser modificado e executado independentemente. As células podem ser reorganizadas, inseridas, excluídas e podem depender da saída de outras células no notebook. 

Muitas vezes, quando declaramos uma variável em um notebook, ela precisa ser acessada em outra célula mais à frente na execução do código. Para isso, a máquina salva essa variável na memória RAM do computador. Podemos rodar as células individualmente e essa memória não é limpa depois que "finalizamos a execução", o que causa alguns problemas. Se por acaso eu mudar o nome de uma variável, o notebook apenas cria uma nova variável na RAM e não deleta a referência antiga. Mas então, quando é que ela limpa a memória do notebook?

 Os notebooks vão limpar a memória quando você interromper o kernel ou interromper o servidor web que roda o notebook. Após limpar a memória é que o problema realmente pode aparecer. 

Lembra que comentamos de uma variável que teve seu nome modificado, porém manteve as duas referências? Se você não modificou o nome de todos os locais onde a variável é utilizada, ocorrerá um erro (“variável” is not defined). Pode parecer algo simples de corrigir, mas garanto que depois de alguns dias sem olhar para aquele notebook você dificilmente lembrará qual é a variável modificada. Você pode estar questionando que isso quase nunca deve ocorrer… Mas te garanto que ocorre muito mais vezes do que gostaríamos. 

Polynote diminui o risco desse tipo de erro mantendo o controle das variáveis ​​ definidas em cada célula. Polynote constrói o estado de entrada para uma determinada célula com base nas células que foram executadas acima dela. O Polynote constrói o input para uma célula com base nas células executadas anteriormente, o que torna a posição das células mais importante do que em outras ferramentas. 

Isso permite que os usuários executem os notebooks de cima para baixo, sem grandes surpresas quando o runtime é reiniciado. Garante a reprodutibilidade, tornando muito mais provável que a execução sequencial do notebook funcione.

imagem

**Referência:** https://medium.com/netflix-techblog/open-sourcing-polynote-an-ide-inspired-polyglot-notebook-7f929d3f447

# Considerações

Claro que nem tudo são flores, **Polynote é um projeto grande que está começando e tem um caminho longo** (e na minha visão promissor) para percorrer. O processo de instalação não é muito otimizado, apresenta suporte apenas para macOS e Linux. 

Com pouco tempo de uso, já foi possível observar alguns bugs como não funcionar auto-complite em funções lambda. No processo de instalação em Linux a maior dificuldade que passei foi ao instalar uma lib python chamada jep, que é uma das dependências do Polynote. Jep é instalado pelo pip e como pip necessita de permissão sudo, jep não localizava o java_home já configurado. Se passar por problema semelhante, é só colocar a flag -E no sudo, assim fica, sudo -E pip install jep e problema resolvido.

Apesar dos contratempos, são vários pontos positivos (alguns que nem citei, como a configuração de ambiente por notebook e a ferramenta de visualização de dados) e as inovações trazidas pelo Polynote está deixando a comunidade empolgada.

As melhorias e ideias agregadas ao notebook da Netflix afeta substancialmente o dia a dia de cientistas de dados, engenheiros(as) de machine learning e de dados. Agora, a ideia é aprender mais sobre a nova ferramenta, contribuir para seu desenvolvimento, aguardar pelas próximas versões e esperar que os outros notebooks como Jupyter e Colaboratory adotem as boas ideias advindas pelo Polynote. 

 **Vou deixar o link alguns links para quem quiser ler mais sobre o assunto:**

[Projeto no github]

[Site do projeto]

[Artigo oficial (em Inglês) de lançamento do projeto].
 




Uma das [**decisões arquiteturais**] que tomamos no desenvolvimento do novo site lançado no dia 1º de Março, foi deixar o site de vendas separado da plataforma de curso e também sem acesso ao banco de dados.

Devido a decisão de retirar o acesso do site de vendas ao banco de dados, precisávamos passar as informações necessárias para o site de alguma forma. Optamos então por expor uma API que é consumida pelo site.

Vamos pegar um endpoint da API como exemplo:

Um dos endpoints da nossa API é responsável por listar apenas o nome (nome do curso na plataforma) e o slug (nome da url do curso formatado para efeito de SEO) de todos os cursos.

Já tínhamos uma classe que representa um curso com as informações necessárias:

java

Porém, repare que a classe `Course` tem informações que não precisávamos expor neste endpoint.

A princípio, era só excluir os campos desnecessários na hora de montar o **JSON** para a **API**. Porém, havia um detalhe nessa abordagem: todas as vezes que acrescentássemos um campo novo na classe `Course`, teríamos que lembrar de excluir esse novo campo nos endpoints desnecessário, ou seja, uma solução problemática... Percebendo que a nossa **API** iria ficar muito sensível a qualquer alteração no nosso modelo de curso, resolvemos criar uma classe nova que conteria somente informações necessárias para o endpoint.

java

Com esse pequeno ajuste, conseguimos gerar o nosso _JSON_ com apenas os campos necessários. E se for necessário adicionar/modificar algum campo no _endpoint_? Basta apenas ajustar o campo na classe `SimpleCourse` que o JSON será construído apenas com os campos dessa classe! Uma solução simples que nos livra de toda responsabilidade de ficar se preocupando com qualquer tipo de modificação!

Essa solução é um **Design Pattern** chamado **DTO** (Data Transfer Object), que tem apenas a finalidade de armazenar os dados necessários que precisamos transferir, ou seja: uma classe sem qualquer regra de negócio que será utilizada apenas para transferir os dados que queremos!

O que acharam da nossa solução? É a primeira vez que viu sobre o _DTO_? Deixe seu comentário sobre o que achou dessa abordagem para resolver esse _endpoint_.

**Você pode aprender isso e mais com nossos [cursos de programação].**




Estive me preparando para a certificação da Oracle e surgiu a seguinte situação:

Vamos verificar a classe Livro:

java

Agora se eu testar o meu código:

java

Resultado:

java

Funciona como o esperado. Analisando um pouco o nosso código... Podemos ver que o nosso construtor não retorna nada, e em Java quando um **método** não retorna nada é `void`, então que tal criarmos um novo construtor com um retorno `void`?

java

Agora vamos criar um livro que tenha apenas um nome:

java

Ué? Não compilou? Que estranho...

java

Em tempo de compilação o construtor não é um **método**! Por isso não podemos retornar valores, ou seja, não podemos assinar como `void`, `int` ou qualquer valor em específico,mesmo sabendo que, por de baixo dos panos (em bytecode), ele é um método. Para diferenciar com mais facilidade podemos pensar o seguinte:

O construtor é um "tipo de método" sem nome que retorna a própria classe:

java

Podemos pensar dessa forma para facilitar a compreensão, porém **NUNCA** confunda método com construtor... (apesar de, bem debaixo dos panos, no bytecode, o construtor é representado como um método que é invocado após o objeto ser criado, um tópico bemmm avançado). Sabemos que métodos, mesmo sendo `void`, possuem o `return`, mas e os construtores? Também possuem! Vamos adicionar um `return` no construtor:

java

Porém, o `return` do construtor **não pode retornar nada**! Legal, ele tem um retorno que não retorna, então por qual motivo eu usaria um retorno desse? Simples! Usamos esse tipo de retorno para interromper o construtor se for necessário, por exemplo, vamos criar um construtor que só recebe o valor:

java

E se o valor for menor ou igual a 1000 quero **apenas atribuir** e se for maior eu preciso aplicar várias regras de impostos e depois atribuir:

java

Vejam que no momento em que o valor é menor ou igual a 1000 temos o return, ou seja, todo o código abaixo não será executado! Parece bizarro, porém funciona!

E aí, o que achou do retorno do construtor? Nem fazia ideia que existia? Pensando nisso o instrutor Guilherme Silveira [**criou a formação de certificação Java**] que aborda com muitos detalhes todas as peculiaridades que podemos encontrar na linguagem Java, com o intuito de preparar o aluno para a certificação da Oracle!




O 256º dia do ano é o dia que comemoramos a profissão dos que programam. Muitas vezes é o dia 13 de setembro, como neste ano, mas nos anos bissextos isso cai no dia 12 de setembro. Na Rússia esse é um dia reconhecido pelo governo, e foi por lá que essa data foi, digamos, instituída. Mas por que 256?

imagem

# 256

256 é emblemático por vários motivos. É o total de combinações que podemos fazer com 8 bits. Para cada bit, temos 2 opções: ligado ou desligado. Então temos no total `2x2x2x2x2x2x2x2` que vale 256, ou `2ˆ8` (algumas linguagens usam o chapeuzinho para indicar a potência). 

Pra ficar mais interessante: na notação hexadecimal, aquela que além do 0-9 aparecem A-F pois temos a base 16, `256` é escrito `100`. Então esse seria o "centésimo" dia em hexadecimal do ano.

imagem

Algumas sites [confundem um pouco] e induzem que, todos os bits ligados de um byte, o `11111111`, representa o número 256. Na verdade com todos os bits ligados, considerando o binário positivo, temos 1+2+4+8+...+128, que é a soma de uma progressão geométrica que vale `255`! O 256 é o número total de possibilidades (pois ainda há o zero!).

# Notação binária e hexadecimal

Quer brincar um pouco com números e enxergar sua representação em binário, hexadecimal, octal ou outra base maluca? Você pode usar o [método] `toString` do `Number` no JavaScript:


<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="paulo-silveira" data-slug-hash="gOYzQKb" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="gOYzQKb">
  <span>See the Pen <a href="https://codepen.io/paulo-silveira/pen/gOYzQKb/">
  gOYzQKb</a> by Paulo Silveira (<a href="https://codepen.io/paulo-silveira">@paulo-silveira</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# Dia do programador na China

Não é em todo lugar que comemoramos esse dia assim. Na China, a data escolhida foi o dia 24 de outubro. O Motivo? Pois datas comumente aparecem na programação na ordem `ano-mês-dia`, ou melhor, `YYYY-MM-DD`, considerando apenas o mês e o dia, o 24 de outubro seria `10-24`, ou `1024`, que é `2ˆ10`! `1024` é quantos bytes temos em 1 kilo byte, o `1kb`.

# Existem 10 tipos de pessoas: as que entendem binário e as que não entendem

Essa é outra piada infame. A explicação aqui é a mesma. Na base 2
Espero que aproveite o seu dia, a sua semana, e a base dois!



Quando estamos implementando uma rede de computadores, uma das coisas que precisamos pensar é em como conectar os computadores.

Podemos conectar computadores utilizando [**cabos de metal**], de fibra óptica, [**utilizando Wi-Fi**], entre outras maneiras.

A maneira que os computadores se conectam na rede, é chamada de topologia, existem diversas maneiras de conectar computadores por meios físicos, utilizando cabos ou redes sem fio, por exemplo.

Quando estamos falando da maneira que os computadores estão conectados fisicamente, dizemos que esta é a topologia física. Porém, não basta dois computadores estarem conectados fisicamente para poderem se comunicar. Para isso, devem existir [**regras de comunicação**] que falam como os computadores devem se comunicar.

Ou seja, dependendo da regra podemos ter meios diferentes dos computadores comunicarem uns com os outros, neste caso falando sobre as conexões lógicas que os computadores fazem, ou falando sobre as topologias lógicas.

## Conhecendo algumas topologias

Quando íamos jogar nas lan houses com nossos amigos, nossos computadores eram conectados uns com os outros (senão não jogaríamos uns com os outros).

Existem vários meios dessa conexão acontecer, porém, uma muito comum de ser utilizada, é ter os computadores conectados juntos sem nenhum outro dispositivo concentrador, como [**hubs ou switches**]:

imagemcentral que conecta os computadores. Nesse tipo de rede é muito utilizado o [**cabo coaxial**], e era uma topologia muito utilizada antigamente.

Nesta topologia, todas as máquinas na rede são conectadas a um barramento central. Todo o pacote que elas enviam, passa por esse cabo. Portanto, se o cabo central apresentar um problema, a rede inteira fica comprometida.

Esse não é o único problema da rede em barramento. Como as máquinas têm apenas um único meio para enviar pacotes, se duas máquinas se comunicarem ao mesmo tempo, a informação é perdida, já que uma informação "se mistura" com a outra. Ou seja, uma em uma rede em barramento quando uma máquina fala, todas as outras escutam.

Porém, mesmos com esses problemas a topologia em barramento foi muito usada antigamente em redes corporativas e, mesmo nos dias de hoje, é possível encontrar algumas redes nesse modelo, principalmente legados.

Mas então, qual a topologia mais usada nos dias de hoje?

## Conhecendo a topologia estrela

Nas redes atuais, é muito comum utilizarmos [**switches para concentrar os computadores**] em um único ponto. Todos as informações enviadas por um computador passam pelo switch antes de chegar ao destino.

imagem.

Esse tipo de topologia é muito utilizado em redes de grande porte, já que isolando as sub-redes, isolamos também os problemas que podem acontecer.

## Para saber mais

Além dessas, existem outros tipos de topologia. Como por exemplo a topologia Anel, também chamada de Token Ring. Nela os computadores são conectados em série uns com os outros, um desses computadores recebe um token que lhe garante a comunicação.

Esse token é passado para outros computadores seguindo uma ordem, por exemplo no sentido horário. Só pode realizar a comunicação o computador que está com o token. O pacote enviado pelo computador deve seguir a mesma ordem do **token**.

Ou seja, ele passa por todos os computadores até chegar ao destino. Essa também é uma rede na qual quando um computador fala os outros escutam. E sua principal desvantagem é que quando existem muitos computadores na rede, a comunicação fica muito lenta.

Outra topologia muito utilizada, é a chamada rede Mesh. Ela são muito utilizadas em redes muito grandes e em redes sem fio. Nela cada um dos nós, computador ou roteador, se comportam como uma única rede.

Conhecer as topologias é uma boa coisa para quem trabalha com redes. Já que consegue implementar a melhor topologia para cada situação, otimizando assim a comunicação na rede.

Aqui na Alura temos uma [**formação em redes**]. Nela você aprenderá a implementar uma rede de computadores, a configurar equipamentos de rede como switches e roteadores, além de questões de segurança da informação.




Quando estamos apresentando resultados, além dos números, podemos nos utilizar de outros elementos para passar melhor a mensagem. Uma boa forma de apresentar dados é utilizando a biblioteca **matplotlib**.

Quando estamos analisando dados, é comum vermos e manipularmos muitos números. Números de vendas, de acessos, de taxa de retorno entre muito outros.

Podemos analisar esses dados de muitas formas, podemos utilizar uma planilha eletrônica, como o **Excel**, ou o **Google Sheets**, podemos utilizar linguagens como **Python** e **R** para lerem nossos dados e armazená-los em **estruturas de dados como listas, vetores, data frames**, entre outros.

Estava utilizando o Python para analisar os dados de venda de uma loja de produtos eletrônicos. Em um momento, estava analisando os dados de venda no semestre me deparei com a seguinte planilha:

python
Sabemos que essa tabela são mostrados os dados de venda do semestre, mas o que esses dados estão indicando? Tivemos um aumento nas vendas? Elas estão em queda?

Não temos uma noção clara do que esses dados significam, não conseguimos interpretá-los facilmente. O que podemos fazer para interpretar melhor esses dados?

## Uma imagem vale mais que mil palavras

Ficar vendo os dados na tabela pode não ser a melhor forma de visualizá-los. Temos que ficar analisando linha por linha, valor por valor, o que pode ser bem trabalhoso.

Claro, os números são importantes para a gente fazer uma análise precisa, porém, quanto estamos apresentando os resultados, além dos números, podemos nos utilizar de outros elementos gráficos para passar melhor a mensagem.

Uma boa forma de apresentar dados é utilizando gráficos. Com gráficos podemos ter uma ideia geral do que os dados estão nos dizendo.

Por exemplo, nossa planilha de vendas por semestre, nós podemos criar um gráfico que mostra as **progressões** das vendas em cada mês.

Mas como podemos criar um gráfico?

### Conhecendo a biblioteca

No Python, existe uma biblioteca muito famosa para criarmos gráficos, é a [**Matplotlib**]. Com ela, podemos montar diversos tipos de gráficos. Para começar a usar a biblioteca, temos que instalá-la. Portanto:

`pip install matplotlib`

Legal! Já instalamos a biblioteca, vamos começar a usá-la.

Nossa biblioteca é a `matplotlib`. Nós queremos utilizar ela para criar, isto é, plotar, gráficos. Então, falamos para o Python importar (`import`) da biblioteca `matplotlib` a parte de plotar gráficos com o Python (`pyplot`).

python 

Vamos criar um gráfico com a nossa planilha de vendas semestrais. Para isso, precisamos falar para o **`pyplot`** quais são os meses e quais são os valores de cada mês. Uma maneira de fazer isso é criar duas listas, uma com os meses e outra com os valores:

python

Agora, basta falarmos para o `pyplot` plotar (`plot`) o nosso gráfico:

python 

Falamos para o `pyplot` criar o nosso gráfico, mas onde ele está? O nosso gráfico não apareceu. Quando falamos para o `pyplot` criar o gráfico, ele constrói o gráfico e o guarda em uma região da memória. Para conseguirmos ver o gráfico, precisamos falar para o `pyplot` mostrá-lo (`show()`):

python

imagem`**):

python 

imagem a ele:

python 

Podemos também pedir para o `pyplot` escrever quais os significados dos valores no eixo **X** e no eixo **Y**. Ou seja, podemos pedir para ele rotular os dados desses eixos (**`xlabel`**, **`ylabel`**):

python 

Agora, quando pedimos para o `pyplot` mostrar nosso gráfico, veremos o título e o rótulo de cada eixo:

![]

Temos um gráfico muito mais descritivo agora. Sabemos sobre o qual o assunto que ele trata, além de sabermos o significado dos eixos **X** e **Y**.

## Para saber mais

Veja que da maneira que importamos o módulo do `pyplot`, sempre que precisamos chamar alguma função da biblioteca, temos que passar o caminho completo até o módulo, isto é, `matplotlib.pyplot`. Um nome um pouco grande, não?

Por isso, uma prática comum é darmos apelidos aos nossos imports. Por exemplo, podemos falar para o Python que estamos apelidando o módulo `pyplot` de `plt`, por exemplo:

python

Dessa forma, sempre que quisermos chamar esse módulo, basta chamá-lo pelo apelido:

python 

Além do gráfico de linhas, o `pyplot` pode criar também outros tipos de gráficos, como gráficos de barras, gráficos pizza, de dispersão, entre alguns outros.

Além de criar o gráfico e adicionar título e rótulos a ele, podemos também alterar a cor da linha e a cor de fundo. Aumentar o tamanho das letras, entre diversas outras customizações.

A parte de visualização de dados é umas das tarefas mais importantes de um cientista de dados, pois com ela, além de compreendermos os dados de uma maneira mais intuitiva, ela nos ajuda a transmitir o que os dados falam para outras pessoas.

Aqui na Alura, temos um [**curso de data visualization**]. Nele, você aprenderá qual o melhor gráfico para cada situação. Como construir um gráfico com um bom esquema de cores para facilitar a leitura, entre muitas outras coisas.

Também temos um [**curso de Google Charts**]. Com ele você aprenderá como criar gráficos para a web, utilizando a API do Google. Nele, você verá como criar gráficos de linhas, colunas, barras, entre vários outros.




É bem comum no **Linux** utilizarmos o terminal para realizar algumas tarefas. Atualizar os sistema, preparar ambientes para programar, instalar programas, entre outras.

Algumas dessas tarefas são repetitivas, atualizar o sistema por exemplo. Se estamos utilizando alguma distribuição baseadas no [**Debian**], como o **Ubuntu**, geralmente temos que atualizar a lista de repositórios, antes de atualizar os pacotes. Ou seja, executamos dois comandos para uma única tarefa.

Ou então, quando temos que preparar o ambiente para começarmos a desenvolver. Se compramos uma máquina nova, ou formatamos, temos que instalar todos os programas, interpretadores, compiladores e tudo mais.

Seria legal se pudéssemos digitar um comando no terminal como `atualizar` e `preparar_ambiente` e ele já fizesse isso para a gente. Mas como dizemos para o terminal o que ele deve fazer quando esse comandos forem executados?

## Criando apelidos

Nas distribuições Linux, quando digitamos um comando pelo terminal, estes passam por um **interpretador**. É esse interpretador que executa os comandos que digitamos.

Existem vários interpretadores, um dos mais usados é o **Bash**, interpretador padrão na grande maioria das distribuições Linux. Tudo que digitamos no terminal, o Bash interpreta, se ele conhecer o comando ele o executa, senão ele fala que o comando não foi encontrado.

Nós queremos dizer para o terminal o comando `atualizar`, portanto, precisamos ensinar o Bash o que fazer quando nós digitarmos esse comando.

Existem algumas formas de ensinarmos um comando para o interpretador. Podemos criar um programa em linguagens como Java, C, Python, com o próprio Bash, entre outras. Mas, veja bem, os comandos para atualizar os repositórios e pacotes já existem no sistema. Faz sentido criarmos um novo programa que executará a mesma função desses dois comandos?

Se nós criarmos um comando que faça essas funções, ele seria redundante no sistema. Esses comandos já existem, nós apenas queremos chamar ele com outro nome, ou seja, queremos dar um **apelido (alias)** para eles.

Podemos dizer para o terminal que `atualizar` é um apelido para os comandos `sudo apt-get update && sudo apt-get upgrade`:

`alias atualizar='sudo apt-get update && sudo apt-get upgrade'`

imagem.

Logo, podemos colocar esse arquivo em um desses diretórios, ou então, adicionar o seu diretório como um local de arquivos executáveis. No Linux, essas informações ficam armazenadas em uma variável chamada `PATH`. Nós podemos pedir para o terminal imprimir seu conteúdo, para isso, devemos colocar o `$` na frente do nome:

imagem para a variável `PATH` o conteúdo da própria variável `$PATH` junto (`:`) com nosso diretório `/home/yuri/Scripts`:

`export PATH=$PATH:/home/yuri/Scripts`

imagem, então, nós entramos no seu diretório e digitamos `./prepara-ambiente`, por exemplo. O `./` indica que queremos executar aquele script.

O comando `export` funciona de uma forma parecida com o comando `alias`. Ou seja, ele só é válido para aquela instância do terminal. Se quisermos que ele esteja sempre disponível, podemos colocar sua instrução dentro do arquivo `.bashrc` da mesma forma que fizemos com o comando `alias`.

Criar comandos pode ser uma forma de automatizar tarefas, ou então, deixar o sistema mais semântico para algum usuário, como no caso do comando `atualizar`. Além do Bash, é possível criar comando para outros Shells, como o `ZSh`, um Shell muito utilizado por desenvolvedores.

Apesar de os comando utilizados para atualizar o **sistema serem de distribuições baseadas no Debian, como Ubuntu e Linux Mint**, os modos de criar apelidos e comandos são parecidos em praticamente todas as distribuições Linux.

Automatizar tarefas é uma das tarefas de administrador de sistemas, aqui na Alura, temos um curso sobre como [**automatizar tarefas com o Shell Scripting**].

Nele você aprenderá sobre a sintaxe do Shell, sobre como criar um script que converte muitas imagens de uma vez, como enviar um emails pelo shell e até como fazer **backup na Amazon**.





imagem 

Busquei os livros e a quantidade de vendas, mas meu novo livro de introdução a computação não apareceu:

sql

Meus livros (tabela da **esquerda**) são usados com um **join** com suas vendas (tabela da direita).

O join padrão só traz linhas quando existem valores equivalentes nas duas tabelas... se o livro é novo e não possui venda... não tem linha na tabela da direita... uma pena!

Se quero um join que traga todo mundo da esquerda (meus livros), independentemente de ter alguém na direita, basta usar um join canhoto, o `LEFT JOIN`:

sql

Sempre que escrever a palavra `JOIN`, pare e pense: que tipo de join você deseja? Será que não queria um `LEFT JOIN`?

Desafio para a próxima dica: o que tem de horripilante na tabela a seguir?

sql





imagem 

Usando **Shell Script** vou monitorar um **servidor web Apache, automatizar tarefas e rotinas**

Nesse servidor temos uma aplicação com alguns serviços, como o sistema de vendas da empresa. Ou seja, temos alguns serviços críticos rodando nesse servidor.

Logo, ele deve sempre estar funcionando, pois caso aconteça algum problema e o serviço saia do ar, a empresa pode ter prejuízos.

Uma das possibilidade é monitorar esse servidor web e sempre que ele cair nós vamos reiniciá-lo… mas como sabemos que o servidor caiu?

## Lendo o status do servidor

Quando acessamos uma página na internet, na verdade, o que estamos fazendo, é uma requisição para o servidor. Uma **requisição** nada mais é do que um pedido.

Neste caso, estamos pedindo uma página na web. Se tudo ocorrer bem, nosso servidor nos devolve a página que requisitamos e devolve também um código de status. Esse código informa o estado da requisição.

Se ele retornar **`200`** significa que tudo ocorreu bem. Já se o código for **`404`** significa que o que pedimos na requisição não foi encontrado. Esse erro é comum quando tentamos acessar uma página que não existe no servidor. Além desses [existem outros códigos], como o **`500`** que é um erro interno no servidor.

Sabendo que o servidor retorna um código quando recebe uma requisição, podemos ficar monitorando esse código e sempre que ele for diferente de `200` reiniciamos o servidor.

## Checando o código HTTP

Para checar o **status do HTTP**, nós podemos utilizar o comando `curl`. Este comando permite a transferencia de dados entre o **servidor** e o **host**.

Queremos que o `curl` mostre para gente (`--write-out`) o código HTTP (`%{http_code}`) da nossa requisição ao servidor:

`curl --write-out %{http_code} www.multillidae.com.br`

imagem, que é o código HTTP, e jogá-la no [buraco negro do Linux], o `/dev/null`.

`curl --write-out %{http_code} --output /dev/null www.multillidae.com.br`

imagem** e nos mostrar apenas o status:

`curl --write-out %{http_code} --silent --output /dev/null www.multillidae.com.br`

imagem` para que o `bash` execute:

bash

Vamos pedir para o script imprimir a variável e ver se o comando funcionou como o esperado:

bash

Agora, para o Bash interpretar este script:

`bash verifica_servidor.sh`

imagem o código for diferente (`-ne`, not equal) de `200`, tente reiniciar o servidor Apache HTTPD (`systemctl restart httpd`).

bash

Pronto, dessa maneira sempre que nosso servidor tiver uma resposta diferente de `200` ele tentará reiniciar.

Só que, dessa forma não sabemos quando ele foi reiniciado. Nós podemos querer saber quando ele foi reiniciado para descobrir o motivo disso ter ocorrido.

Vamos falar para nosso script para que ele escreva (`echo`) uma mensagem quando antes de tentar reiniciar o servidor.

Para manter um log mais organizado, vou colocar a mensagem, a data e hora do ocorrido.

Conseguimos pegar a data do sistema utilizando o comando **`date`**. Podemos pedir para ele nos mostrar a data completa passando o parâmetro `%F` (full date). Se esse parâmetro for o primeiro, temos que passar o sinal de `+` antes:

`date +%F`

imagem.

`date +%T` 

imagem. Logo, o comando fica:

`date +%F\ %T`

imagem`.

bash 

Só que, dessa maneira, a mensagem será impressa na tela. Precisamos [**redirecionar a saída**] do comando **`echo`** para o nosso arquivo.

Então vamos falar para o Bash redirecionar (`>>`) para o arquivo onde ficarão salvos nossos logs. No meu caso, esse arquivo fica na pasta `/logs/servidor.log`. Uma coisa bacana é que se esse arquivo não existir, o Bash o cria.

bash

Agora, se o servidor apresentar um problema, basta executarmos o script que ele tentará reiniciar o servidor e ainda irá gravar uma mensagem no log para a gente.

imagem. Para isso basta colocar (`*/1`) na coluna de minutos e o asterisco (`*`) em todos os demais campos.

No caso do comando, vamos passar o caminho para ele, no meu caso está em `/scripts/`.

`*/1 * * * * bash /scripts/verifica_servidor.sh`

Pronto! Agora nosso script será executado a cada minuto e, caso tenha algum problema, o script tentará reiniciar o servidor.

## Para saber mais

Existem versões mais curtas dos parâmetros que utilizamos com o comando `curl`. O `--write-out` pode ser substituído por `-w`, o `--silent` por `-s` e o `--output` por `-o`.

Além do Bash, existem muitos outros interpretadores Shells, como o Korn Shell e o Z Shell.

Esse foi apenas um exemplo de automatizar tarefas com o Shell Scripting, existem muitas outras, como por exemplo enviar um e-mail sempre que o servidor web cair.

Aqui na Alura temos dois [**cursos sobre Shell Scripting**] que além de ensinar como enviar emails automaticamente, ensina como monitorar o consumo de memória, como converter imagens automaticamente, fazer backups na nuvem e muito mais.

Além dos scripts em Shell, existem outras ferramentas que ajudam a monitorar os servidores. Um exemplo é o Kubernetes, um serviço que gerencia [**containers como o Docker**].

O Kubernetes consegue monitorar os containers de nossa aplicação e garantir que caso algum container caia, outro suba em seu lugar.

Na Alura temos um [**curso sobre o Kubernetes**]. Nele você aprenderá como o Kubernetes gerencia os containers, como realizar técnicas como o balanceamento de carga e até como implementá-lo na nuvem. Um recurso muito utilizado nos dias de hoje.

Serviços como Amazon EC2 ou Google Cloud são muito utilizados quando queremos fazer o deploy da sua webapp. A vantagem é que o próprio serviço monitora o estado do servidor e garante que sua aplicação fique sempre disponível.

Aqui na Alura, temos um [**curso sobre Amazon EC2**]. Nele você aprenderá sobre como colocar sua aplicação na nuvem, sobre os tipos de clouds que existem, como escalar automaticamente sua aplicação, entre outras coisas.




Recentemente, recebi uma mensagem de um amigo me indicando um site que parecia ser muito interessante - era um fórum com discussões sobre programação. A única questão é que eu nunca havia ouvido falar desse site, então fiquei com um pouco de receio de acessá-lo.

Acontece que existem [sites maliciosos por aí que visam pegar os dados de quem acessa para atacar os usuários de alguma forma]. Contei meu receio para esse amigo, que então me recomendou usar o modo privado do meu navegador (também conhecido como modo anônimo). Segundo ele, dessa forma eu estaria protegido e o site não teria acesso aos meus dados.

Como eu não conhecia esse modo de navegação, resolvi me informar pesquisando antes. Afinal, como funciona o modo privado do navegador? O que ele faz?

## Como os navegadores funcionam

Por padrão, é muito comum que os [navegadores web mais utilizados]) (como Firefox e Chrome) guardem vários registros dos usuários. Quando entramos em algum site, por exemplo, ele fica armazenado em um histórico dentro do navegador.

Quando pesquisamos alguma coisa, a pesquisa também é armazenada no histórico de pesquisas. Até quando fazemos login em determinada plataforma, é comum que os navegadores armazenem os dados que nos mantêm logados, os chamados _[cookies])_.

Tudo isso pode ser recuperado e visualizado por algum usuário que acessar a web através do meu navegador, no meu computador. Por um lado, isso pode ser bastante conveniente, trazendo mais conforto na nossa navegação, com as sugestões de _autocomplete_ e destaque dos sites que mais usamos.

Por outro lado, nossa privacidade fica, de certa forma, prejudicada. Afinal, nem sempre queremos que nossas pesquisas ou sites visitados fiquem registrados, muito menos que nossos perfis continuem abertos para qualquer um utilizar depois de nós.

Além dos registros que os navegadores web armazenam sobre nós, eles também costumam dar aos websites que entramos acesso a muitos dados particulares nossos, como o IP da nossa rede, informações sobre o software e hardware do nosso computador e até a velocidade da nossa conexão.

O desenvolvedor Robin Linus, em meio a discussões sobre privacidade na web, criou um [site mostrando várias informações que qualquer site pode saber sobre você], por padrão. Nele, vemos que isso vai desde uma estimativa poderosa de nossa localização (sem necessidade de qualquer permissão de GPS, através de uma [API do Google]), até dados de login de redes sociais aleatórias e nível de bateria do notebook!

Se quisermos esconder algumas dessas informações, será que a opção de navegação privativa de alguns navegadores pode nos ajudar, como meu amigo havia indicado?

## O que o modo privado de navegação faz

Afinal, o que é que o modo privado dos navegadores esconde? Como ele colabora com a nossa privacidade?

O modo privado dos navegadores, no geral, tem uma filosofia principal - a de não guardar dados. Isto é, aquele comportamento padrão dos navegadores de armazenar o máximo de informações possível para o conforto na usabilidade é suprimido em prol de uma privacidade mais forte.

O que acontece, então, é uma espécie de instalação temporária de uma outra instância do navegador. Quando encerramos a navegação privada e fechamos as abas, essa instalação é removida, de modo que nem o histórico, nem os _cookies_ e esse tipo de informação ficam salvos.

No geral, esse modo de operação da navegação privativa serve apenas para esconder alguns dados de outras pessoas que possam usar o mesmo computador. Mas e quanto àquele monte de informações que a gente descobriu que os sites têm acesso através do navegador?

## O que o modo privado de navegação NÃO faz

Apesar de esconder localmente algumas informações a respeito da navegação, como o histórico e informações de login (registrada nos cookies), o modo de navegação privativa **não** esconde nada dos sites que visitamos.

Isso significa que todas aquelas informações contidas no navegador continuam disponíveis aos sites e plataformas que acessamos online. Do IP, à localização, às informações referentes ao software e hardware utilizados pelo usuários, tudo isso ainda é acessível.

Para esconder esse tipo de informação dos sites que acessamos, outras ferramentas são necessárias - desde configurações específicas no navegador, até aplicações externas, como uma [VPN], que consegue esconder seu endereço IP verdadeiro.

## Consciência da efetividade

Por muitas vezes que acessamos a Internet, só queremos esconder um pouco as informações de nossa navegação. Afinal, nem sempre queremos que os outros saibam que sites andamos acessando, por diversas razões que envolvem o nosso direito de privacidade.

Nesse comum e importante caso, o modo privado de navegação, que entendemos com mais cuidado nesse post, é de muita utilidade. Entretanto, é muito importante que entendamos como essa ferramenta funciona, para não cairmos na ilusão de que ela pode fazer coisas que na realidade não pode!

A consciência da efetividade das ferramentas que utilizamos, principalmente quando tratamos de privacidade e segurança online, é essencial. Por isso, estudar e entender o funcionamento delas acaba sendo de extrema importância para todos nós!

Gostou do post? Se quiser entender mais sobre questões de segurança na web, dê uma olhada em [nossos cursos na Alura]!





imagem 

Estou criando um banner para uma nova promoção que o Guilherme vai fazer para o seu restaurante, em que você escolhe um dos pratos prontos do menu e ganha um suco de brinde. Eis que temos as seguintes imagens:

imagem deixando à mostra apenas o que queremos que apareça e depois se retirarmos o papel de cima, a imagem completa continua lá!

Para conseguir esse efeito de máscara, temos três opções boas para isso:

- Pincel (Brush)
- Ferramenta de Laço Poligonal (Polygonal Lasso Tool)
- Caneta (Pen Tool)

## 1\. Ferramenta de Laço (Lasso Tool)

**A primeira maneira que temos para fazer esse efeito de máscara é realizando uma seleção mais precisa**, exatamente no contorno do elemento que queremos manter, isto é, o que não estiver selecionado será "recortado", ou melhor, mascarado:

imagem.

imagem a máscara nas áreas que queremos mostrar mais ou ocultar mais.

imagem

## 3\. Caneta (Pen Tool)

A ferramenta de [**Caneta**] é parecida com a de Laço, porém a Caneta tem duas diferenças: Ela permite você fazer a alteração de pontos e também te deixa fazer no formato FreeForm (não precisa ficar clicando e criando ponto por ponto, pode desenhar livremente):

imagem sobre qual das duas usar.

O restante do processo é o mesmo, faça a marcação que deseja, alterando os pontos quando necessário para aumentar a precisão da demarcação, e crie uma New Mask.

E para que todas essas opções?

A **ferramenta de seleção** é melhor para projetos e elementos mais simples de recortar, porque, diferente da pen tool, não conseguimos refinar e alterar os pontos, deixando o menos preciso. Ou seja, uma ferramenta para uso rápido e simples.

Para projetos e imagens mais detalhadas, a **brush** é uma boa escolha, mas que toma bastante tempo para ajustar os detalhes, uma vez que é à mão livre. Apesar de ser mais detalhada é mais difícil de refinar.

E a **Pen Tool** é uma boa ferramenta para recortes mais precisos pelo fato de conseguirmos alterar os ângulos e curvaturas dos pontos da forma. É mais preciso e temos mais controle das formas, porém mais demorado também.

Vale lembrar que você deve escolher a ferramenta que mais se adequa ao seu projeto!

Quer aprender mais sobre o Photoshop? Temos diversos cursos na nossa plataforma da Alura como este de tratamento de imagens com [**Photoshop para iniciantes**]!





imagem 

Há algum tempo, desenvolvi um projeto em Python de gerador de dados aleatórios de um cidadão brasileiro, chamado [cidadaobr]. O intuito do projeto era que outros desenvolvedores pudessem usar para testes de aplicações, como em simulações de cadastros de clientes de algum serviço, por exemplo.

Para compartilhar com a comunidade, coloquei o código em um [repositório no GitHub], para que todo mundo pudesse usar… ou era isso que eu pensava!

Meu código ganhou um pouco de popularidade e logo recebi mensagens de alguns desenvolvedores pedindo permissão de uso do programa.

Na hora que li as mensagens, fiquei confuso! Mas ué, eu até pus no GitHub para todo mundo usar, por que será que eles estão vindo me pedir permissão? Perguntei e me explicaram: **o código não tinha licença**!

# A necessidade de uma licença

Quando passamos pelo processo de [**publicar um pacote Python no PyPI**], entendemos um pouco a necessidade de se ter uma licença definida para nosso projeto.

Na verdade, em algumas jurisdições, é até proibido usar um **software** que não tenha licença definida sem a autorização expressa do dono dele! Bem, isso realmente não é o que queremos…

Então vamos definir uma licença! Mas… qual? Será que vamos precisar contratar um advogado para isso? Bom, tratando-se de temas jurídicos, pode ser o caso procurar ajuda de um advogado, mas não é necessário!

O pessoal do [GitHub], com o apoio da comunidade, criou uma ferramenta web muito bacana, que nos ajuda a escolher uma licença para nosso projeto - o [choosealicense.com]. Nele, temos uma breve explicação de algumas das principais licenças que podemos usar, o que já nos ajuda muito! De cara, vi três que me chamaram a atenção:

# GNU General Public License v3.0 (GNU GPLv3)

A [GNU GPLv3] permite que meu software seja usado e distribuído, contanto que, quando distribuído, o código fonte esteja abertamente disponível.

Essa licença também exige uma cópia dela mesma, com um aviso de _copyright_, sempre que o software for distribuído de alguma forma.

Se houver alguma modificação no código de nosso software, essa licença faz com que essas modificações tenham que ser lançadas com uma licença no mínimo similar. Além do mais, qualquer mudança no código tem que ser documentada.

Achei a licença interessante, mas com regras demais. Será que existem outras mais livres?

# The Unlicense

[The Unlicense] é uma licença cheia de permissões, com nenhuma condição. Qualquer pessoa é livre para copiar, modificar, publicar, usar, vender ou distribuir nosso software de qualquer maneira possível, sem nenhuma pendência.

Apesar de não trazer mais as complicações de muitas regras da GNU GPLv3, senti que essa licença poderia ser um pouco prejudicial para mim, já que ela não exige nem mais um aviso de copyright ou cópia dela mesma. E agora?

# Licença MIT

A [MIT] é uma licença que se encaixa muito bem nos meus objetivos. No geral, é bem permissiva, sendo o requisito uma atribuição de volta a mim, com um aviso de _copyright_, e uma cópia dela incluída.

Essa licença não carrega muitas regras e também não chega a me prejudicar em nada, atribuindo meu trabalho a mim. Assim, percebi que era, de fato, a que melhor se encaixa para meus objetivos. Em [meu projeto], então, defini o uso dela!

# Licenciando o projeto em prol da comunidade!

No começo do post, tínhamos um projeto público que queríamos compartilhar com a comunidade de desenvolvedores do Brasil. O projeto já até estava disponível publicamente no GitHub.

Depois de publicado, entretanto, acabei recebendo mensagens de desenvolvedores experientes pedindo minha autorização para usar o software! Isso é porque ele não tinha uma **licença** definida…

Assim, dei uma olhada no site [**choosealicense.com**]. Ao final da pesquisa, decidi que a Licença MIT era a que mais se encaixava em meu projeto! Adicionei ela no GitHub e agora está tudo certo ;)!

E aí, o que você achou do post? Deixe um feedback nos comentários! Dê uma olhada em nossos [**cursos de programação na Alura**], para criar (e licenciar!) seus próprios projetos!




Temos uma App Android que permitirá que os usuários consigam realizar compras via celular. A primeira tela para essa App é justamente exibir todos os livros disponíveis na [**Casa do Código**]:

imagem**], porém, esse mesmo serviço ~~está sofrendo~~ sofreu um _upgrade_ para o [**Firebase**].

E aí, o que achou do **push notification**? Está ansioso para implementá-lo na sua App? Então dê uma olhada no [**post tutorial**] onde mostro, passo-a-passo, como podemos configurar o Firebase e integrar um Push Notification em uma App Android.

Que tal aprender a desenvolver uma App Android desde o zero hoje mesmo? Na Alura, temos  [**uma formação Android**], onde você será capaz de construir suas próprias Apps do começo ao fim!




Imagine que você está em sua timeline no Instagram e encontra uma imagem que gostaria de curtir, comentar ou mesmo enviar para outra pessoa, mas se depara com esta tela:

imagem são peças fundamentais para uma boa user experience, uma vez que são os responsáveis pelo início da interação.

Mas, como trabalhar com gatilhos realmente eficientes?

## Gatilhos em UI

Se retomarmos a dúvida que tivemos antes, "Onde clico para curtir a imagem?", notamos que o gatilho necessário neste momento é um que deixe evidente uma das principais funcionalidades do app: Curtir.

Para resolver esta situação poderíamos simplesmente adicionar algum recurso que orientasse nossa ação. No caso do Instagram, usam os famosos botões em forma de ícone:

imagem, pressionar, arrastar**], e uma série de outras possibilidades.

**Contudo, não só de gatilhos manuais se faz a interação!**

Existe uma outra forma de facilitar a vida do usuário, fazendo com que o sistema preveja algumas necessidades e antecipe a entrega de um gatilho para uma nova ação.

## Triggers de sistema

Os **[gatilhos de sistema]**, ou seja, gatilhos ativados automaticamente segundo padrões pré-determinados são mais um tipo de trigger que podemos utilizar.

Para compreender melhor essa ideia temos um exemplo dentro do próprio Instagram:

imagem

Importante! Antes de mais nada, faça sempre protótipos dos seus projetos, tanto do app como um todo, quanto das microinterações que possam ser desenvolvidas nesse caminho. Na Alura, inclusive, temos um curso legal de [**Prototipação com Axure**] para projetos mobile que poderá te ajudar muito nesse processo. ;)




Estava estudando algumas **funcionalidades do Scratch**. Por isso, resolvi criar um jogo baseado no Fruit Ninja para testar meus conhecimentos. Nele, teremos alguns balões voando pela tela e, quando o jogador clicar nos balões, eles estouram.

Vamos criar um novo projeto no Scratch. Então vamos adicionar nosso ator:

![]

Bacana! Já temos nosso balão na tela. Mas, quando iniciamos o jogo, ele não está fazendo nada! Ele fica parado nesse canto da tela.

Quando o jogo começar, o balão tem que estar em baixo na tela, logo, vamos falar para o nosso ator, ir para a posição `0` em **X** e `-400` em **Y**.

![]

Legal! Nosso balão já começa na posição inferior da tela e lá se mantém. Não é isso que queremos. O que nós queremos é que nosso balão deslize de uma posição para outra da tela.

Logo, vamos falar para o nosso ator para que, quando o jogo começar, ele vá para a posição inicial e deslize até a posição `300` em **Y** por dois segundos:

![]

![]

Nosso balão já está deslizando pela tela, contudo, temos alguns problemas. Ele está sempre surgindo no mesmo lugar e para quando chega ao final na tela. Bem, nós podemos falar para ele sempre repetir esses comandos. Dessa forma, ele sempre que ele chegar ao final da tela, voltará ao começo.

![]

![]

Resolvemos um problema. Mas ainda temos que fazer o balão surgir em outras posições da tela. Atualmente, nosso balão aparece apenas no centro da tela, o que nós queremos é falar para ele aparecer em qualquer posição aleatória do eixo `x`. Por exemplo, entre a posição `-220` e `220`:

![]

![]

Bacana! Agora nosso balão começa sempre em um ponto diferente da tela. Porém, veja que ele não segue em linha reta. Ele sempre começa em um ponto, mas vai sempre para o mesmo ponto em `x`.

Isso acontece porque, quando pedimos para o nosso ator deslizar pela tela, falamos para ele ir para a posição `0` no eixo **X**. Não queremos que o nosso balão faça essas mudanças de percurso. Então, vamos falar para o nosso ator manter sua posição **X**.

![]

![]

Show! Nosso balão está seguindo uma linha reta agora e sempre aparece na tela em uma posição aleatória. Agora, temos que colocar o comportamento para estourá-los.

## Estourando os balões

No nosso jogo, quando um balão for clicado, este será estourado. Ou seja, o que acontecerá, de fato, é quando clicarmos no balão ele trocará sua fantasia para uma de balão estourado.

Então, vamos adicionar mais uma fantasia para o nosso ator, dessa vez uma fantasia de um balão estourado:

![]

Nosso ator já possui a segunda fantasia. Vamos falar para ele que quando ele for clicado mude a sua fantasia para a próxima:

![]

![]

Conseguimos estourar o balão. Mas ele continuou na tela após ser estourado e, não só isso, ele continuou estourado, mesmo após voltar ao começo da tela.

Temos que falar para o nosso ator que, quando ele voltar para o começo, mude também a fantasia para a do balão inteiro:

![]

![]

Legal, quando clicamos no balão para estourá-lo mudamos sua fantasia e, quando ele retorna ao começo da tela, muda novamente a fantasia.

Nosso jogo já está com um comportamento inicial bem legal, mas podemos melhorá-lo um pouco escondendo o balão pouco tempo depois dele ser estourado:

![]

E dessa forma quando clicamos no ator, ele espera meio segundo e desaparece… e não aparece mais. Se nós escondemos nosso ator, temos que pedir para ele aparecer novamente. Podemos fazer isso falando para ele se mostrar após trocar a fantasia:

![]

![]

## Para saber mais

Já conseguimos um comportamento muito bacana para o nosso jogo. Mas podemos fazer muito mais, podemos colocar um contador que mostra quantos balões foram estourados. Podemos alterar o fundo do nosso jogo, e [adicionar mais balões] para deixar o jogo mais dinâmico.

Além dos eventos de click, o Scratch no permite adicionar outros eventos para o nosso ator, podemos falar para o ator executar uma ação quando determinada tecla for precionada, quando receber uma mensagem, entre alguns outros.

O Scratch é uma ferramenta muito utilizada para ensinar lógica de programação em muitos lugares do mundo. Com ele, conseguimos construir jogos, diálogos, animações e tudo mais que nossa imaginação pedir.

Na [**Alura Start**] temos vários cursos que utilizam o Scratch. Neles são ensinados desde como [**criar seu jogo de naves espaciais 2D**], até como criar um [**jogo de cobrança de pênaltis**], e até como [**criptografar mensagens**].




Se você possui um e-commerce ou realiza vendas online, é fundamental que você tenha um gateway de pagamento para fazer a ligação dos lojistas com as operadoras. Mas isso só é válido se você realiza vendas pontuais. Se você quer vender através da **recorrência** é interessante ler as opiniões do Rodrigo Dantas, CEO da [Vindi] e com quem gravo o podcast do Like a Boss.

**Paulo Silveira**: Qual é a diferença de um gateway de pagamento e uma plataforma de pagamentos?

**Rodrigo Dantas**: Os gateways atuam online da mesma forma que as maquininhas funcionam nas lojas. Por isso, sua entrega acaba se tornando um tanto limitada quando o assunto é a venda recorrente.  Eu explico mais sobre o [funcionamento de gateways nesse artigo].

Sim, gateways como Braspag e Adyen são ótimos para transações, para emissão de nota fiscal automatizada e são bem flexíveis na hora de contratar uma adquirente. Mas, para a cobrança de planos e mensalidades, alguns recursos a mais podem te ajudar.

Os gateways de pagamento transmitem a informação para as adquirentes e as bandeiras, como Vista e Master. Eles também são os responsáveis por notificar a empresa se houve aprovação ou não de um pagamento. Já as plataformas de pagamento são as responsáveis por gerenciar os planos e assinaturas. Ou seja, qualquer pagamento recorrente. Através delas é possível estabelecer alguns pontos da cobrança, como vigência e reajuste dos planos, renovação, tarifas, descontos, frequência das cobranças e muito mais. 

Ou seja, com uma [plataforma de pagamento recorrente como a Vindi] você consegue personalizar as cobranças do jeito que você quiser. Já com os gateways clássicos isso não é possível. 

**Paulo Silveira**: Quando preciso mudar o preço de uma mensalidade, qual é a facilidade?

**Rodrigo Dantas**:  Neste quesito, nem há muito o que ser falado. Os gateways só conseguem trabalhar com um valor fechado no carrinho, não permitindo a mudança de valores para planos ou acréscimos de up-selling ou cross-selling. 

Mas, com uma plataforma de pagamento, as coisas são bem diferentes! Nela, o preço do plano ou serviço pode sofrer alterações de valores ou ser fixo. Você pode personalizar os valores de acordo com o volume ou por faixas de uso dos seus clientes.

**Paulo Silveira**: A taxa de rejeição pode ser menor com uma plataforma de pagamentos?

**Rodrigo Dantas**:  Os gateways só podem fazer uma única coisa para o seu negócio quando o assunto é redução de inadimplência. O roteamento de adquirentes. Quando uma transação não é aprovada, eles trocam a operadora do cartão. Já é um avanço, mas podemos fazer mais.

Se você escolher uma plataforma para oferecer o pagamento recorrente para os seus clientes, a coisa muda de figura. É possível criar alertas de boletos não lidos, além do seu reenvio um dia antes do vencimento. Você também pode atualizar as multas e juros automaticamente, além de ativar notificações por e-mail e SMS. Também existem ferramentas de renovação de cartão, que fazem a renovação automática dos dados do cartão de crédito ou a retentativa simples, que efetua a cobrança 3 dias depois do pagamento não ter sido identificado. Essas ações são essenciais para melhorar o [churn rate] (o índice de retenção).

# Modelo Saas e subscription

Nesse vídeo conversamos sobre o modelo SaaS e recorrência, e toda a economia de assinatura e subscriptions:

https://www.youtube.com/watch?v=Raws1GcCR4Q&list=PLh2Y_pKOa4Ufs_KwjTdGBFH6b65ChApyD&index=19&t=0s





imagem 

Quero criar um jogo no **Scratch** com o objetivo de pular os zumbis que passam e ir ganhando pontos. Podemos ver o projeto sem o pulo do personagem neste [link].

Porém, não queremos um pulo qualquer. Queremos um pulo com efeito da gravidade. No Scratch, não existe um efeito da gravidade padrão ou já implementado, assim como em outras linguagens como Unity, Godot ou Construct. Porém isso não significa que não podemos criar nosso próprio código da gravidade!

Para começar, vamos atribuir um valor à força que a gravidade fará sobre o nosso personagem. Como a gravidade leva nosso ator para baixo, seu valor deve ser negativo. Com o código `mude gravidade para`, vamos atribuir o valor `-2`.

![]

Para deixar a gravidade parecida com a realidade, quando o personagem pular, conforme ele vai caindo, afinal a gravidade é uma aceleração, a velocidade varia. Precisamos criar mais uma variável chamada `velocidade`, e podemos mudar seu valor para `0`, sempre que o jogo ligar.

![]

Agora precisamos fazer nosso ator pular. No bloco de código que movimenta o personagem, vamos verificar `se` a tecla `espaço` está pressionada. Para não deixar o código que verifica as teclas pressionadas junto com o código que faz nosso personagem pular, podemos dividir as funções para manter o código organizado criando em **Mais blocos**, um novo chamado `pular`.

![]

 
No bloco pular, vamos mudar o valor da `velocidade`, para representar o tamanho do pulo do personagem. Vamos mudar para `25` por exemplo.

![]

Como a força da gravidade nunca para, vamos incluir um código `sempre` e `adicionar a y` o valor da variável `velocidade` e adicionar na `velocidade` o valor da `gravidade`.

![]

Vamos testar apertando a tecla espaço e ver o pulo do nosso ator?

![]

O personagem pulou, vimos a ação da gravidade, porém, ele passou o chão!

Precisamos fazer nosso personagem parar quanto tocar no chão.  Para isso, vamos verificar `se` o personagem está tocando o `chão`. Se estiver, nós `paramos esse script`.

![]

Vamos testar agora o pulo do personagem?

![]

**Agora ficou bem legal!**

Portanto, vimos uma forma de implementar a gravidade em um jogo, utilizando o Scratch.

E ai, o que achou?

Você gostou do Scratch? Na [**Alura Start temos diversos cursos que usam o Scratch como ferramenta de desenvolvimento**].

Lá você aprenderá como criar vários jogos usando a plataforma.

Você pode encontrar este projeto com a gravidade, clicando neste [link].





imagem 

Durante os 5 anos da sua existência, a Alura se tornou uma referência da educação online em tecnologia no Brasil. Todo o time está com muito orgulho de poder ajudar a transformar as carreiras de muitos e muitas profissionais através do conhecimento, e sempre buscamos trazer aprendizados novos de acordo com o mercado.

Contudo, aqui na Alura não nos atentamos apenas aos sucessos individuais. Também queremos estar presentes nas empresas e **fazer parte do crescimento das equipes**.

## Como ter sucesso nos treinamentos online na sua empresa

Já tivemos alguns cases de sucesso com os treinamentos corporativos e por isso decidimos montar um modelo replicável que contenha os fundamentos necessários para que **as empresas extraiam o máximo da educação corporativa à distância**.

O resultado é a **Jornada Alura de Educação Corporativa,** que visa acompanhar passo a passo a aprendizagem dos times, trazendo ações específicas a serem completadas e assim tornar a capacitação uma base estratégica do negócio.

A metodologia que acabamos de lançar é baseada na _Metodologia dos 6D_, que é uma referência em educação corporativa. Entretanto, ao mesmo tempo, ela não deixa de **ser inspirada nas empresas que já tiveram resultados com a gente**.

## Apresentando a Jornada Alura de Educação Corporativa

Em nossa visão, os pilares para as ações da capacitação corporativa bem-sucedida são: foco em resultados para a empresa e o seu desenvolvimento, apoio dos líderes, engajamento dos participantes e diagnóstico da entrega prática.

imagem assunto(s) escolhido(s).  

Por último, nesta fase divulgaremos o futuro treinamento para a equipe.

imagem**.

Para termos uma imagem completa sobre as vantagens que a capacitação na empresa trouxe, devemos também enfatizar aqueles **benefícios que costumam não ser facilmente convertidos em resultados comerciais mas que ainda assim têm um grande impacto no negócio**, ou _ativos intangíveis_.

Entre eles, estão, por exemplo, um maior engajamento dos funcionários, reconhecimento do mercado e da comunidade profissional ou redução das queixas dos clientes.

![Treinamentos corporativos Alura Fase 3]

### Pontos de ação para a conclusão da Fase 3:

3.1 **Primeiras aplicações do conhecimento**

3.2 **Diagnóstico de entrega prática**

3.3 **Mensuração do impacto no negócio**

## Fase 4: Multiplicação do conhecimento

Chegamos à fase final, que, na realidade, é **o começo de uma aprendizagem contínua na empresa**.

Com a primeira multiplicação, a empresa incentiva a criação de uma cultura forte de aprendizado, que é um dos requisitos para o crescimento das pessoas e, consequentemente, do negócio como um todo.

A próxima missão da empresa é **planejar futuras capacitações da equipe**, pensando em novos projetos, novas oportunidades e novas pessoas chegando à equipe.

Em outras palavras, **o desenvolvimento das pessoas deve ser uma ação recorrente**, sempre interligada aos resultados comerciais esperados.

![Treinamentos corporativos Alura Fase 4]

### Pontos de ação para a conclusão da Fase 4:

4.1 **Mapeamento de multiplicadores**

4.2 **Primeira ação de multiplicação**

## E agora… Que tal criar um plano de treinamentos para a sua empresa?

Demonstramos uma estrutura sistemática para escalar passo a passo as fases primordiais em um treinamento corporativo, convertendo-o numa função **estratégica** que consegue **gerar vantagem competitiva** no mercado.

Queremos sempre estar **estar o mais próximo dos nossos clientes**, por isso a nossa equipe de _Customer success_ acompanha o avanço nas fases da metodologia, norteando o caminho dos resultados específicos para cada empresa.

**E agora fica com você**: se você pensa em aplicar um conceito de treinamento corporativo de alto impacto nas metas do negócio, veja o [**Guia completo da Jornada Alura de Educação Corporativa**], em que explicamos todos os pontos de ação de forma detalhada.





imagem 

Um recurso que nos permite "dizer" aos elementos onde queremos que eles fiquem, qual vai ser o tamanho deles, quanto de espaçamento vai existir, criar "lacunas" ou "buracos" que serão preenchidos por nossas tags HTML. Com CSS Grid Layout é exatamente isso que conseguimos.

Imagine que um amigo, chegou em você e disse:

> Eu preciso criar um layout com um cabeçalho, um menu lateral, o conteúdo principal e um rodapé

Se você está acostumado a criar páginas HTML5 com CSS3 já deve ter imaginado toda a estrutura, algo parecido com:

html 

Até ai tudo bem, certo? Certo. Montar a estrutura das tags é a parte mais fácil... Porém,agora precisamos posiciona-las da seguinte maneira:

- Header: Em cima da página
- Aside: Na parte esquerda da página
- Main: Na parte direita da página
- Footer: Em baixo da página

Com isso iremos ter a seguinte estrutura:

imagem ou _column_(coluna) devem ter, precisamos também dizer ao nosso template:

css 

Repare novamente que tanto nossas columns ou rows, estão sendo informadas três vezes, isso porque temos um _layout_ de três colunas e três linhas, veja também que apenas para a segunda linha declaramos o valor `100vh` que corresponde a altura total da _[**viewport**]_, as demais linhas serão automáticas.

Por padrão, o valor será `auto`, mas apenas descrevi para você saber que pode estar mudando. Para saber quais valores podem ser setados, consulte a documentação: [**grid-template-columns**] e [**grid-template-rows**].

Com isso, devemos ter o seguinte resultado:

<iframe src="//jsfiddle.net/mahenrique94/L90zmunL/5/embedded/result,html,css/" width="100%" height="300" frameborder="0" allowfullscreen="allowfullscreen"></iframe>

Bem próximo relacionado à necessidade de nosso amigo.

### Dando os toques finais

Para sanar a necessidade de nosso amigo e entregar o _layout_ para ele, vou fazer apenas algumas melhorias no design:

<iframe src="//jsfiddle.net/mahenrique94/L90zmunL/6/embedded/result,html,css/" width="100%" height="300" frameborder="0" allowfullscreen="allowfullscreen"></iframe>

Pronto, agora já podemos realizar a entrega do projeto. Caso tenha necessidade, o projeto pode ser baixado [aqui].

Conheça também a [**Formação Front End**] da **Alura** e entenda um pouco mais a fundo desse mundo do Front End. :)




Precisei virtualizar dois sites diretamente de um servidor Apache, atualmente temos a seguinte arquitetura nos servidores:

imagem, por exemplo, ele se chama [Virtual Hosts].

## Entendendo os Virtual Hosts

Os hosts virtuais funcionam dessa maneira:

- Um computador faz a requisição para acessar um site pelo seu nome de domínio;
    
- Esse pedido chega ao nosso servidor web que encaminha para o host virtual da requisição, podendo ser uma pasta ou outro servidor:
    

imagem e escutará na porta que é o padrão para websites (`80`), portanto ,antes da última linha do arquivo, vamos escrever o seguinte trecho:

bash

Também é preciso informar a pasta onde estarão os arquivos do nosso site. Vamos listar (`ls`) nossas pastas e saber quais temos disponíveis:

`# ls`

imagem, isto é, onde se localizam nossos arquivos, seguido do caminho até o diretório:

bash

Vamos dizer agora qual é o domínio do nosso site, ou seja, o nome do servidor (`ServerName`)

bash

Por fim, para que o Apache consiga ver os arquivos em nossa pasta, vamos dar a ele todas as permissões. Informaremos então nosso diretório e o caminho até ele (`<Directory "/www/acmetoon.com.br">`), em seguida, indicaremos que ele pode ler todos os arquivos **(`Require all granted`)**:

bash 

O site da AcmeToon está configurado. Vamos então atualizar as instruções do Apache para que ele reconheça nossas configurações. Para isso, vamos restartar o serviço, o comando **`apachectl restart`** faz isso para a gente:

imagem que funcionará apenas para o blog da AcmeToon. Nossos hosts virtuais também podem ser utilizados para criar subdomínios.

A configuração seguirá o padrão das configurações anteriores, também teremos uma pasta para especificar esse website:

imagem será `blog.acmetoon.com.br`, também daremos ao Apache a permissão de acessá-la.A configuração completa fica assim:

bash

Vamos tentar acessar o blog agora e ver se está funcionando nossa configuração:

imagem, o que resolve muitos problemas.

## Pontos de atenção

Estamos fazendo a configuração como superusuário, por isso **cuidado** para não executar um comando indevido e causar problemas no sistema.

Vale lembrar também que para nosso sites ficarem no ar, precisamos registrar os nomes em um [DNS].

## Conclusão

Inicialmente estávamos com o problema de hospedar mais de um site no mesmo servidor. Vimos como podemos fazer isso utilizando hosts virtuais. Também, entendemos como é possível realizar a configuração de subdomínios dentro do servidor.

Além disso, conhecemos que uma possibilidade seria a virtualização do servidor do próprio servidor. Mas nesse caso ela não seria muito viável, já que teríamos que dar manutenção replicada em ambas as virtualizações.

Contudo, a virtualização é muito utilizada em hospedagem, devido a alguns benefícios de economia de energia, pelo fato de existir apenas uma máquina física.

E aí, o que achou? Conhecia essas técnicas? Conhece outras? Compartilhe conosco nos comentários.

Gosta da parte de servidores? Essa é só uma pequena parte do mundo de infraestrutura. Aqui na **Alura** temos uma [formação completa] em redes. Nela você aprenderá sobre protocolos de redes, **VLans**, segurança e muito mais!





imagem 

Talvez até conheça alguém que tenha sido. O fato é que essa técnica, chamada de phishing,ainda é uma das mais efetivas maneiras de se conseguir acesso a informações sensíveis.

Recentemente, recebi um email estranho, **supostamente** da equipe de suporte do [**Paypal**]. Como sempre, abri o email no celular. O email dizia que o endereço de entrega principal da minha conta havia sido alterado para um na África do Sul! Obviamente, fiquei espantado.

imagem que visa obter dados secretos e pessoais de alguém, se passando por uma personalidade ou entidade confiável.

Tentativas de _phishing_ podem ser feitas desde chamadas telefônicas, ao mais comum, que são os emails e sites falsos. Tais sites podem ter uma aparência idêntica ao site real (como foi o caso do Paypal, comigo) e mesmo assim serem fraudulentos!

Mas se as coisas podem ser tão parecidas, como podemos evitar cair nesse golpe? Afinal, como foi que eu percebi que estava sendo enganado?

## Desvendando as tentativas de phishing

Apesar de todas as similaridades que uma tentativa de _phishing_ possa ter com alguma plataforma real, ainda há alguns sinais que podemos prestar atenção para evitar o comprometimento de nossos dados com esse golpe.

Pensando no exemplo do email que eu recebi, o que podemos fazer? Aparentemente, está tudo certo. O padrão de escrita do email parece verídico e a interface do site é correta. E agora?

### O remetente do email

A primeira informação que devemos checar é a mais óbvia - quem foi que nos enviou o email? No nome apareceu **Paypal Support**, mas e o endereço de email? Chequei, e o que aparecia era `service-team121@outlook.com`. Dei uma pesquisada e descobri que esse endereço nem ao menos é do Paypal! Normalmente, os do Paypal terminam com `@paypal.com.br` ou `@mail.paypal.com.br`.

De cara, então, descobrimos que o email era falso. Mas então é isso? Basta o endereço remetente ser oficial, como `service@paypal.com.br`, que podemos confiar? Infelizmente, não é bem assim…

Através da técnica de **_[email spoofing]_**, alguém pode facilmente abusar das características do protocolo de email **[SMTP]** para alterar, isto é, falsificar, o remetente de um email. Ou seja, com algumas ferramentas, ou um pouquinho de código, nós mesmos podemos mandar um email com o endereço remetente marcado de `phishing@paypal.com`, ou qualquer outra coisa.

Desse modo, apesar de muitas vezes ser importante verificar o remetente do email (como foi em meu caso), ele não é garantia de nada. Quais outras características de todo esse processo podemos tomar como base para tirar uma conclusão?

### O corpo do email

Logo quando vi o email, concluí que o texto nele contido parecia legítimo, como um desses enviados automaticamente pelas empresas. Será que essa análise foi correta? Que indícios de fraude podemos obter do corpo do email?

Com um olhar mais atento, podemos procurar por algumas características incomuns quando se tratam de emails enviados por empresas ou instituições.

Um exemplo são anexos inesperados - empresas não costumam enviar dados por anexo, afinal para que precisaríamos disso?! Claro, às vezes de fato esperamos por um anexo, quando for o padrão usado sempre, como com boletos e recibos, mas são casos mais específicos. O maior problema dos arquivos anexados é que eles podem conter algum _malware_ escondido.

Outro ponto a se observar é o caráter de urgência do email. Tudo bem, urgência não significa mentira, mas emails com mensagens muito estranhas, exigindo alguma ação do usuário, são bastante suspeitos. Um email com marcação de **prioridade alta**, ou **importante**, também é fora do comum, sendo assim recomendável fazer mais algumas verificações.

Mas e além desses pontos mais genéricos, o que podemos saber?

### Identificando características do email mais específicas do serviço

Para essa investigação, precisamos de alguma base. Afinal, como vamos saber se o corpo do email condiz com o verdadeiro, se nem sabemos as características dos emails verdadeiros?

Se estivermos com paciência, podemos verificar emails anteriores do suposto remetente, para analisarmos as semelhanças e as diferenças, o que poderia ser (bastante) cansativo. Alguns sites, [como é o caso do Paypal], listam algumas características básicas dos emails que enviam, para ajudar na identificação.

No caso do Paypal, uma característica interessante de se prestar atenção está nos cumprimentos. O email que recebi começava com "_Dear **<meu@email>**_", mas o Paypal deixa claro que seus emails nunca terão esse tipo de tratamento genérico, e sempre se referirão ao usuário pelo nome.

Mas e se eu ainda ficar em dúvida? A partir daí, a melhor solução é contatar a empresa pelos meios oficiais e perguntar diretamente a eles. O Paypal pede para que, caso isso aconteça, encaminhemos o email para o endereço [alerta@paypal.com.br](mailto:alerta@paypal.com.br).

Já temos uma boa base para conseguirmos desvendar tentativas de _phishing_, mas o que mais podemos analisar? No nosso caso, tivemos um email base e, a partir dele, já conseguimos descobrir toda a fraude. Às vezes, porém, o que chega na gente é ainda mais convincente, e quase sempre acompanha um link que nos levará para um site falso. Como devemos agir frente a esses links?

### O link de recuperação da conta

Na pior das hipóteses, vamos acabar encarando o link que nos foi mandado. Mas não precisamos nos apressar! Vamos com calma, para ver o que conseguimos descobrir antes de entrar de fato nele.

Em primeiro lugar, qual é a URI do link? Isto é, para que site ele nos leva? Dei uma olhada e a URI era uma daquelas encurtadas, ao estilo `linkcur.to/AbCdE`. Links encurtados, nesse caso, são bastante suspeitos, afinal não fazem muito sentido - a URI não estava exposta, não havia o porquê disso. É muito mais comum, em emails, as empresas usarem suas próprias URIs completas.

### O destino verdadeiro do link

Fiquei com um pouco de receio de enfim acessar o link, por causa disso. Decidi, então, usar [**um serviço de "desencurtador" de links**] para descobrir para onde a URI encurtada levava. Outra surpresa, o destino era `securepaypal.login.paypal.com.websebwebseb.xyz/signin`. Espera… o quê? Que coisa confusa é essa?

A URI verdadeira até continha `paypal.com` no meio dela, mas tinha outro monte de coisa junto. Por um lado, parece do Paypal, por outro, é bastante confusa. O que acontece é que a URI tenta nos enganar - na verdade, se pararmos para analisar, o domínio desse site é apenas `websebwebseb.xyz`, e `securepaypal.login.paypal.com` são, de fato, somente subdomínios dentro do site!

Só por curiosidade, dei uma pesquisada e concluí o que já esperava - esse domínio não tem nenhuma relação com o Paypal, que era o que alegava! Com todas essas evidências que juntamos, podemos afirmar com convicção que isso tudo era uma tentativa de _phishing_.

Note que, afinal, nem precisamos acessar o site para verificar a veracidade disso tudo, como eu fiz inicialmente. Isso é bom, pois esse tipo de site pode usar de algumas técnicas de JavaScript, por exemplo, para nos enganar ainda mais.

No nosso caso, conseguimos tirar uma conclusão com clareza. Entretanto, sabemos que nem sempre isso vai acontecer. É importante lembrarmos que podemos (e devemos) nos comunicar com o determinado serviço, caso a dúvida se mantenha. Desse modo, e com essas dicas, conseguimos uma navegação muito mais segura!

## Na dúvida, desconfie

Hoje em dia, somos bombardeados com tentativas de _phishing_ a todo o instante. São sites estranhos, emails suspeitos e até mensagens no celular que não reconhecemos. Às vezes parece até bobo, mas pelo contrário, é perigoso. A curiosidade pode não ter matado o gato, mas pode comprometer seus dados sensíveis em um piscar de olhos. De qualquer jeito, a dúvida sempre fica - quando devemos confiar?

Com as dicas que aprendemos nesse post, fica bem mais fácil identificar por conta própria se estamos frente a uma tentativa de golpe. Analisamos desde o email em si, até o link e o site, traçando os aspectos suspeitos para, enfim, conseguirmos chegar em uma conclusão.

Vimos o quão importante pode ser desconfiar, e como é mais importante ainda quebrar essa desconfiança, investigando. Uma saída mais simples para esses casos pode ser, simplesmente, perguntar diretamente para os responsáveis oficiais de determinado serviço se aquele site, ou aquela mensagem, é verdadeira. Além de poupar trabalho nosso, nos dá uma garantia de veracidade, o que é ótimo!

Depois de tudo, podemos, em vez de paranoicos (o que não devemos ficar!), nos sentir mais seguros, sabendo que agora nós mesmos somos capazes, até certo ponto, de identificar mensagens e sites maliciosos!

E aí, o que achou das dicas do post de hoje? Deixe um comentário aqui com a sua opinião! Se quiser conhecer mais das tecnicidades da área de segurança da informação, que tal dar uma olhada em nossa [**Formação em Segurança de Aplicações**], lá na **Alura**?




 

Uma das funcionalidades mais interessantes que implementamos no Alura foi a possibilidade do próprio aluno enviar a correção de um erro nas explicações, afinal mesmo com diversas fases de revisão, alguns errinhos passam.

Os principais problemas reportados eram pequenos como _typos_ ou erros simples de gramática, o que demandava um trabalho extra de abrir o painel de administração, procurar pelo curso, pela seção e ai sim editar o erro. Mesmo sendo algo simples, acabava por quebrar o fluxo de trabalho do dia-a-dia de toda a equipe.

Sempre preferimos a abordagem do aluno participar da construção do aprendizado, seja através do forum de discussões ou da sugestão de cursos, nada mais justo do que o aluno possa participar também deste ponto de maneira mais simples.

Nossa preocupação inicial foi como implementar o front-end, principalmente do lado do administrador/moderador, que deveria ver de forma clara e rápida o que foi editado:

imagem, pois assim poderíamos customizar o que fosse necessário, sem ter que mergulhar em centenas de linhas de código.

Repare que seu uso é bem básico, você fornece o texto original, o texto modificado e o local onde deve ser gerada o elemento que mostra a diferença:

javascript

Agora é só indicar onde a diferença deve aparecer:

javascript

Algo simples, mas que tem nos ajudado bastante, nas duas primeiras semanas, tivemos mais de setenta sugestões!

O usuário que mais contribuiu foi o [Lucas Felix Sampaio], um de nossos moderadores.

Em segundo lugar temos o [Filipe] e o [Guilherme Sodre]

E que em 2016 venham mais sugestões de correção de typos, assim nos sentimos mais seguros de que nosso produto melhora todo dia, desde a qualidade dos vídeos, a didática que usamos, e o texto de explicação e exercícios que compartilhamos. Cada dia que passa, melhor do que o anterior.




Considerando uma tabela de dados `Alunos`, com campo `nome` e campo `empresa`, somo trazer quem não preencheu o campo `empresa`? Uma das soluções é procurar pela string vazia:

sql

Mas eu sei que tenho mais de 1000 alunos que ainda não preencheram este campo, onde estão  eles?

sql

O que acontece que alguns alunos estão em branco, outros estão nulos?

Muito cuidado quando criar suas tabelas. Em geral fazemos como com qualquer linguagem de programação: definimos uma variável e não damos valor padrão a ela. Isso acontece direto em orientação a objetos, definimos variáveis membro sem valor padrão. Resultado?

Algumas pessoas não editaram o perfil, e continuam com o valor padrão do banco(`NULL`). Outras editaram mas não preencheram e estão agora com valor em branco. E agora toda query que você vai fazer na tua vida você tem que verificar:

sql

Pior ainda, além do fato que já vimos que o `OR` é um horror na Terra, temos que lembrar de colocar ele entre parenteses pra não dar um resultado errado:

sql

Usa o valor padrão. Usa o default e pare de se preocupar:

sql

Agora sim você tem certeza que todas as queries só precisam verificar por valores vazios. A chance de errar? Bem menor!




**Estudando! Rá!**

Meio óbvio, né? Porém, qual foi a sacada para o meu aprendizado? Bora desvendar o mistério :)

## Estudar um pouco todos os dias

Estudar um pouco todos os dias é cientificamente comprovado como eficaz. Faço isso todos os dias da minha vida. Se está gostando de aprender assim, junte-se a mim também na lista do expert Sérgio Lopes sobre [**boas práticas de Javascript**]. Seja um de nós.

## Faça cursos

Você já começou com essas boas práticas, mas não deixe de fazer cursos, claro :)

Criei [**mais de 50 cursos na Alura**], e **já assisti literalmente mais de 150**. Haja estudo!

30 minutos por dia é uma meta animal!

## Discuta as práticas com seus amigos

Questionar e ser questionado faz parte do aprendizado. Manda um whatsapp para um amigo agora. Isso agora. Fala "nunca mais vou usar stored procedure". Ou "se lembra aquele delete que eu fiz ano passado?". Puxa o assunto! [Me conta o que aconteceu]?

E aí, mandou? [Já mandei pro meu irmão], estou esperando a resposta dele.




Hoje em dia as animações nos websites vão muito além de simples detalhes, algumas marcas tem nas animações sua marca registrada, tal como o próprio Google após o seu último rebrand.

imagem on <a href='https://codepen.io'>CodePen</a>.
</iframe>

Na prática o `transition` pode ser aplicado para todos os valores que mudam entre os estilos padrões de um elemento e alguma variação aplicada seja via alguma ação de pseudo seletor (:hover e :focus) ou algum atributo ou classe que seja adicionada em uma tag e exista um seletor CSS aplicando alguma variação de estilo.

> Somente valores quantificáveis podem ser animados. Isso quer dizer que não é possível fazer uma animação de display indo de none para block, mas sim de opacity de 0 para 1;

Focando na ideia de que Animações são trocas de estados onde podemos visualizar como algo foi de um ponto A para um ponto B, animar o background é só uma possibilidade, podemos manipular a largura e altura dos elementos, sua posição na página e uma propriedade que casa super bem com o transition é o `transform`. 

Como o [transform] pode aplicar diferentes comportamentos a um elemento como mudar sua escala, alterar sua posição na página ou mesmo aplicar uma distorção com `skew()` isso abre todo um leque de possibilidades. 

<iframe height="265" style="width: 100%;" scrolling="no" title="Transition: Exemplo 2" src="https://codepen.io/omariosouto/embed/jOOLKxO?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/omariosouto/pen/jOOLKxO'>Transition: Exemplo 2</a> by Mario Souto
  (<a href='https://codepen.io/omariosouto'>@omariosouto</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

## Formas comuns de utilizar o transition:

- `transition: 1s;`: aplica uma animação de 1 segundo para TODAS as propriedades de um seletor, é importante específicar quais propriedades vão ser animadas para evitar alguns gargalos de performance ou propriedades desnecessárias consumindo recursos em animações (que normalmente podem exigir bastante de computadores de usuários com hardwares menos potentes).
- `transition: transform 1s, opacity 0.3s;`: Aplica uma animação de 1 segundo para a propriedade transform, e uma de 0.3 segundos para o opacity. Todas as outras propriedades não são afetadas.
- Também é possível especificar um delay para o transition com `transition-delay`, tal como específicar a duração e as propriedades via propriedades separadas, no dia a dia acabamos utilizando a forma dos exemplos anteriores, mas [deixo a dica para você olhar na MDN como trabalhar com essas variações]

# Animation: Animando automaticamente e com mais etapas

Como vimos anteriormente, para animarmos algo com transition, dependemos de alguma ação do usuário agora e se quisermos algo nesse estilo?

<iframe height="265" style="width: 100%;" scrolling="no" title="Animation: Exemplo 1" src="https://codepen.io/omariosouto/embed/XWWaBPY?height=265&theme-id=0&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/omariosouto/pen/XWWaBPY'>Animation: Exemplo 1</a> by Mario Souto
  (<a href='https://codepen.io/omariosouto'>@omariosouto</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

Repare que a animação está acontecendo sozinha de forma contínua, bem semelhante a alguns itens que existem para chamar a atenção como setas indicando que algum ponto é clicável em alguns sites. Para isso ser possível estamos utilizando a propriedae `animation`.

Para entendermos como fazer a animação do exemplo, precisamos primeiramente entender a ideia de trabalhar com `keyframes`. Basicamente iremos definir que dado um espaço de tempo entre o começo e o fim do mesmo determinadas propriedades CSS serão aplicadas.

css

E para associarr esses keyframes em um elemento do HTML, precisamos adicionar essa animação `go-back`, ou qualquer outra, através da propriedade animation:

css

<iframe height="265" style="width: 100%;" scrolling="no" title="Animation: Exemplo 2" src="https://codepen.io/omariosouto/embed/zYYdLem?height=265&theme-id=0&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/omariosouto/pen/zYYdLem'>Animation: Exemplo 2</a> by Mario Souto
  (<a href='https://codepen.io/omariosouto'>@omariosouto</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

Porém dessa forma a animação só acontece uma vez, caso tenhamos interesse em fazê-la acontecer de forma infinita podemos adicionar a propriedade `animation-iteration-count: infinite;` ao invés de infinite, podemos passar um número máximo de vezes que nossa animação irá se repetir, e caso você queria fazer a animação ir e voltar do ponto final para o começo e vice-versa é só adicionar a propriedade `animation-direction: alternate;`.

# Dicas de animações comuns em sites:

## Bounce

css

- FadeIn:

css


## Interceptando animations e transitions via JavaScript

Como vimos anteriormente, é possível ter vários níveis de controle nas animações com CSS, porém caso você queria ter um controle mais fino via JavaScript via um `elemento.addEventListener` é possível monitorar quanto uma transition ou um animation termina:

- https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/animationend_event
- https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/transitionend_event

## Melhorando a performance de animações com CSS

Esse post é mais introdutório, mas ainda sim acho válido citar que trabalhar com performance em animações pode exigir um pouco de conhecimento de [como o browser funciona](youtube.com/watch?v=kDy62zaCHZE), e um pouco de como o [CSS funciona nos navegadores].

Já adianto que existe uma propriedade que pode fazer milagres em alguns casos para melhorar performance de animações, mas que deve ser usado somente em último caso: 

- [will-change]

E se você quiser ter uma [introdução mais profunda do tema de performance em animações, confere essa talk do Sérgio Lopes].

> Caso você encontre alguma animação que realmente esteja prejudicando a experiência de usuários em devices menos potentes, você pode desabilitá-la utilizando o [@prefers-reduce-motion]

## Libs extras

- [animate.css]: Essa provavelmente foi a lib que mais me ajudou na época de agência e o mais legal é que existem ports dela para trabalhar com os frameworks da moda via componentes e é uma forma bem legal tanto de fazer algo ficar animado bem rápido ou de abrir o código fonte e aprender [como algumas animações são feitas como por exemplo o bounceIn]
- [Tweenmax - Greensock]: Caso você queira fazer algo que possua um controle mais fino de o que é animado em cada tempo ou de acordo com X alteração do usuário a melhor alternativa é correr para uma lib que ti ajude a preparar essas "cenas". O Tweenmax é uma ótima pedida, só deixo um ponto de observação pois ela possui algumas restrições de uso gratuito.
- [Lottie do Airbnb]: Essa é a lib do momento, aquela [animação do logo do google que citei no começo do vídeo, você pode aprender a fazer nesse alura mais], utilizar o plugin para premiere e exportar para utilizar na web, mas isso podemos abordar em um outro artigo.

Por hoje é isso,espero que tenha gostado, em breve trarei mais dicas, não deixe de me seguir nas minhas redes sociais e acompanhar meus outros artigos em meu site pessoal https://mariosouto.com. E você pode achar muito conteúdo nos nossos cursos de [html e css] e de [bootstrap].



Estamos desenvolvendo um sistema web para venda de automóveis usados. Uma das informações necessárias para cadastrar um automóvel no sistema é o número da placa do veículo.

Precisamos criar uma funcionalidade que valide as placas do carro, para que os usuários não saiam enviando para o servidor dados incorretos. Uma placa de carro válida por exemplo seria "FXZ-9846" e uma inválida “FX4-Z432”. Para fazer tal validação precisamos seguir algumas regras, sendo elas:

- Número de caracteres tem que ser igual a 7
- Os 3 primeiros caracteres são letras
- Os 4 últimos caracteres são dígitos

## Validando a placa

Primeiro, criaremos um método que recebe uma placa e devolve um `boolean` para fazer a verificação do que foi inserido.

java

Podemos colocar uma variável do tipo `boolean` que será nosso retorno após as validações:

java

A primeira validação que vamos fazer será referente ao tamanho da `String`. O número de caracteres de uma placa de carro deve ser igual a 7. Colocando essa regra no código:

java

Os três primeiros caracteres tem que ser letras. Para validar isso vamos, primeiramente, usar o método [**substring()**] da classe `String`. Este método cria uma `String` contendo todos os valores desde o primeiro índice passado até o segundo índice menos 1. No nosso caso vamos usar para pegar apenas os três primeiros caracteres da nossa placa. Por enquanto temos isso:

java 

Agora precisamos verificar se essa nova `String` contém apenas letras, para fazer tal verificação vamos usar o método [**matches()**], também da classe `String`, e passar uma expressão regular como parâmetro. Este método devolve um `boolean`. Ele verifica se a `String` que chamou este método se equipara com o parâmetro passado.

No nosso caso, vamos passar a seguinte expressão regular `[A-Z]*`. Essa expressão só permite as letras de A a Z e todas as letras tem que estar em maiúsculo. Portanto, se a `String` conter algo diferente do que o permitido pela expressão regular ele retornará `false`

Vamos usar o método `matches()` em conjunto com o `substring()` e encapsular dentro de um `if`:

java

Para finalizar essa validação, vamos negar essa condição, ou seja, só vai entrar no `if` caso o `matches()` retorne `false`, para que possamos alterar o valor de `valido` para `false`:

java 

Por fim, vamos usar exatamente os mesmos métodos, `substring()` e `matches()`, para validar se os últimos quatro caracteres são dígitos.

A diferença será apenas nos parâmetros passados, para o `substring()` vamos passar apenas o valor 3, com isso ele pegará o caractere da `String` com índice 3 e como não passamos um valor final ele irá até o final da `String`.

Já para o `matches()`, vamos passar essa expressão regular: `[0-9]*`, ela só permite números de 0 a 9. Assim, temos:

java

Pronto, todas as validações foram feitas, nosso método ficou assim:

java 

Para testarmos, usaremos uma placa válida:

java

Como resultado, temos:

imagem**] da classe `String`, que, por sua vez, substitui todos os caracteres passados no primeiro parâmetro pelos caracteres passados no segundo parâmetro.

No nosso caso vamos usar outra expressão regular, essa: `[^a-zA-Z0-9]`. Com ela no primeiro parâmetro do `replaceAll()` estamos dizendo que tudo que não for letra de A a Z, seja maiuscula ou minuscula e não for número deve ser substituído. Mas substituído pelo que? Bom, por nada, só queremos tirar esses caracteres da nossa `String`. Usando esse método nosso código fica assim:

java

Vamos testar novamente usando a mesma placa, FXZ-4765:

![]

Pronto, agora funcionou do jeito que queriamos.

## Early Return

Só mais um detalhe, olhando nosso método perceba que não importa como venha a placa, passamos por todos os `ifs`, isso não é muito legal. Por exemplo, se o tamanho da placa for diferente de 7 eu quero que o método acabe aí e retorne `false`, não tem motivo para passar pelas outras condições, a placa já é inválida.

Então é exatamente isso que vamos fazer. Se a placa for inválida vamos retornar `false` logo de cara. Isso se chama [**early return**]. Vamos refatorar nosso método usando essa técnica:

java 

Pronto, fizemos nosso método de forma elegante e enxuta.

## Conclusão

Validar uma placa é uma tarefa simples, mas vários detalhes podem causar resultados inesperados. Temos, sempre, que prevenir nosso código, pois quando interagimos com o usuário, no nosso caso, recebendo informações vindas dele, não sabemos como o dado chegará para nós.

Também percebemos que não é necessário passar pelo método todo para ter o resultado esperado. Early return é uma boa prática de programação, pois impede que código desnecessário seja executado.

Agora que conhecemos o early return me digam vocês. Quantas vezes vocês já se depararam com códigos desnecessários sendo executados por não fazer uso de tal técnica?

Para conhecer outras técnicas e mais sobre boas práticas no Java, você pode dar uma olhada na [**Formação Java**] da **Alura**, lá você irá se deparar com vários cursos a respeito da linguagem.




**O Adobe Illustrator é uma excelente ferramenta para edição de vetores, ideal para produzir layouts com os mais diversos objetivos e complexidades. Impressão, web design e criação de logotipos são apenas algumas das possibilidades que um designer tem ao usar o Illustrator.**

Entretanto, como a maioria dos aplicativos da Adobe, ele tem um custo razoavelmente alto e uma curva de aprendizagem que pode acabar desencorajando parte dos iniciantes. Por isso, listamos aqui alguns dos principais aplicativos e softwares para quem quer começar a mexer com gráficos vetoriais de maneira descomplicada e por um custo bem menor ou completamente _free_.

## 1\. Inkscape

**Plataformas:** Windows, Linux e Mac

**Faixa de preço: **grátis

Um dos melhores softwares gratuitos como alternativa ao Illustrator é o Inkscape, voltado para aqueles que precisam criar gráficos vetoriais, mas ainda não estão prontos para investir num software do pacote Adobe.

Apresentando uma interface de usuário limpa, intuitiva, mas repleta de recursos avançados (como misturas alpha, clonagem de objetos e um preciso rastreamento bitmap) o [Inkscape] é uma alternativa completamente livre e altamente recomendada para iniciantes.

Trabalhando principalmente com o formato aberto SVG, o Inkscape tem benefícios exclusivos que a suíte da Adobe não consegue entregar: funciona no Linux e é totalmente gratuito para baixar, utilizar e distribuir. Além disso, ocupa menos espaço em seu computador e é consideravelmente mais rápido.

**Por oferecer suporte a diferentes modos de cores é uma alternativa viável para execução de trabalhos comerciais, sejam eles de web design ou destinados a meios impressos. Além disso, oferece recursos de importação nativa para arquivos do Illustrator.**

## 2\. SVG Edit

**Plataformas:** online

**Faixa de preço: **grátis

Para trabalhar com arquivos SVG, temos algumas alternativas online que sequer exigem a instalação de um programa em seu computador. Editores como o [SVG Edit] funcionam direto no browser e tem arquitetura construída inteiramente em HTML5, CSS3 e JavaScript.

Por se tratar de um software de código aberto, além de editar gráficos, é possível fazer o download do seu código fonte e alterá-lo como quiser, criando sua própria ferramenta de edição vetorial.

A velocidade é um dos grandes destaques desses software, que opera com um desempenho superior ao de ferramentas instaladas localmente, usando a capacidade de processamento da nuvem para lidar com a edição de gráficos.

## 3\. Serif DrawPlus

**Plataformas:** Windows

**Faixa de preço: **grátis na versão básica, ou $24.99 na versão _premium_

[O DrawPlus] é um aplicativo extremamente intuitivo e poderoso para edição de gráficos vetoriais. Em sua versão gratuita, integra uma série de ferramentas que espelham as principais funcionalidades do Illustrator.

Apesar de não parecer um software destinado a profissionais devido a sua simplicidade, o DrawPlus é um software amigável com funções para lidar, inclusive, com [**desenhos 3D.**] Possui uma coleção de pincéis e modelos pré-definidos que facilitam a vida dos novos usuários, o que é um grande diferencial.

Além de trabalhar com modos de cores RGB, a aplicação tem perfis CMYK e faz a leitura de cores Pantone, possibilitando o desenvolvimento de layouts impressos. O DrawPlus ainda oferece uma versão paga, com mais ferramentas e recursos, pelo custo de $24.99.

## 4\. Karbon 14

**Plataformas:** Windows, Linux e Mac

**Faixa de preço: **grátis

[Karbon 14] é outro aplicativo de desenho vetorial com uma interface simplificada, altamente personalizável e extensível. Seja para quem está começando a trabalhar com vetores agora ou usuários profissionais, o software gratuito tem ferramentas específicas para tarefas como desenho, pintura a dedo, manipulação de imagem e edição de ícones, tipografias e logotipos.

O pacote Calligra, do qual ele faz parte, inclui também um aplicativo de edição de imagens similar ao Photoshop.

## 5\. Gravit

**Plataformas:** online

**Faixa de preço: **grátis

Que tal uma ferramenta de desenho vetorial completamente online, pronta para fazer basicamente o que o Illustrator faz em suas principais funções? Com [o Gravit], basta criar uma conta e começar a usar! Além de criar formas, o aplicativo tem um _pathfinder_ e ferramentas de alinhamento muito parecidas com as que você encontra no software da Adobe.

É possível trabalhar com camadas, adicionar textos e imagens aos seus projetos e desenhar livremente. Além disso, na hora de criar um novo documento, os usuários têm a opção de escolher formatos dentre muitas predefinições úteis, como tamanhos de impressão padrão e modelos para capa de Facebook e Twitter.

Quando terminar de criar suas imagens, você pode salvar em JPG, PNG ou o formato vetorial livre SVG para continuar editando depois. Todas as imagens podem ser também armazenadas online, para que você não perca seu trabalho.

## 6\. Sketch

**Plataformas:** Mac

**Faixa de preço: **$99.00

Esse editor de vetores para Mac é uma alternativa bem acabada e de fácil usabilidade para usuários que buscam ferramentas poderosas de edição por um preço inferior ao da Creative Cloud. Incluindo um rico conjunto de opções web (foco do Sketch), permite, até mesmo, copiar estilos em CSS diretamente para a área de transferência e reproduzi-los em seus arquivos.

Com suporte a múltiplos_ artboards_ e repetição de efeitos, como sombras, preenchimentos e gradientes, além do corte automático de elementos para web, o [Sketch] é focado no desenvolvimento de layouts[**para meios digitais.**]

## 7\. Youidraw

**Plataformas:** online

**Faixa de preço: **grátis

[Youidraw] é um poderoso editor de vetores online que não exige cadastro ou nenhum tipo de download para funcionar. Desenvolvido na nuvem, é perfeito para amadores e profissionais e tem ferramentas de desenho similares ao Illustrator com perfeição.

Na criação de logos ou pintura digital, usar Youidraw permite que você trabalhe com camadas e utilize sua biblioteca de estilos e templates para agilizar o desenvolvimento de novos layouts. Possui uma série de efeitos de fácil aplicação e bibliotecas de vetor pré-selecionadas. O aplicativo também inclui a ferramenta _pathfinder_ e integra-se perfeitamente com suas contas no Google Drive ou Dropbox.

Exporte layouts em SVG e obtenha um _preview_ automático dos seus desenhos graças a uma intuitiva área de trabalho construída em HTML5.

Não é preciso investir muito dinheiro para obter ferramentas de desenho vetorial que façam papéis quase tão funcionais quanto à que integra a suíte da Adobe.

Animado para [**começar sua carreira de designer**] e aprender a lidar com gráficos vetoriais? 




Estou estudando **Scratch**. Para testar meus conhecimentos, estou fazendo vários mini projetos e em um deles resolvi criar um jogo onde controlamos um avião.

Nosso jogo vai se passar, basicamente, no ar. Logo, vamos alterar nosso palco para que apareça um céu:

imagem deve ser `0` e sua posição vertical (`y`) deve ser `-120`, no meu caso:

imagem. Para mover nosso ator, vamos utilizar as setas do teclado.

Então vamos falar para o Scratch mover o nosso ator alguns passos para a esquerda quando a tecla seta para esquerda for pressionada:

![]

Como estamos movendo nosso ator para a esquerda, o valor dos passos é negativo. Podemos falar para ele se mover para direita também quando a seta para direita for pressionada, só que, neste caso, o valor dos passos é positivo:

![]

Agora quando digitamos algumas dessas teclas, nosso ator se movimenta:

![]

Nosso ator está se movimentando, mas o que vocês acham desse movimento? Ele está um pouco estranho, travado. Como podemos deixar ele mais fluido?

## Melhorando a movimentação

Quando apertamos uma tecla no computador e a mantemos pressionada, o computador executa uma vez e espera um pouco para executar as demais ações. Por isso, o movimento do ator fica travado.

Mas nós precisamos saber quando o usuário pressiona a tecla para mover nosso ator, como podemos fazer isso sem fazer com que a movimentação pareça travada?

Quando apertamos uma tecla, um sensor localizado no teclado captura essa informação e a envia para ser processada. Nós podemos falar para o Scratch utilizar um sensor e sempre ficar verificando se a tecla foi acionada.

Logo, vamos apagar os comandos do evento de click e falar para o Scratch que, quando o jogo começar, ele fique `sempre` perguntando **se** **as teclas de movimento estão pressionadas**, se estiverem, ele deve mover o personagem:

![]

Agora quando pressionarmos as teclas, nosso ator terá um movimento mais fluido:

![]

## Continuando nosso jogo

Nosso ator principal já está com um comportamento muito legal. Agora precisamos adicionar mais elementos, como obstáculos para o nosso avião desviar, criar um efeito de para simular o movimento do voo, entre diversas outras coisas para deixar nosso jogo mais divertido.

Aqui na **Alura**, temos um [**curso de Scratch onde você criará um jogo de naves espaciais**]. Nele você aprenderá sobre como funciona o Scratch, como adicionar inimigos e como dar comportamentos a eles. Como adicionar efeitos e muito mais.

