Repository: willianjusten/willianjusten.com.br
Branch: main
Commit: 2a0dc65c415e
Files: 262
Total size: 1.6 MB
Directory structure:
gitextract_r4l6jmqc/
├── .babelrc
├── .editorconfig
├── .eslintrc
├── .gitignore
├── .nvmrc
├── .prettierrc
├── Readme.md
├── jsconfig.json
├── next-seo.config.js
├── next.config.js
├── package.json
├── posts/
│ ├── 3-meses-de-globocom.md
│ ├── 65-dicas-para-ser-um-programador-melhor.md
│ ├── a-estrutura-do-svg.md
│ ├── a-historia-por-tras-do-meu-curso-de-react-avancado.md
│ ├── a-importancia-do-github-para-desenvolvedores.md
│ ├── achievement-concluido-braziljs.md
│ ├── adicionando-icone-de-github-nos-projetos-opensource.md
│ ├── adicionando-night-mode-no-seu-site.md
│ ├── alguns-seletores-css-importantes-para-aprender.md
│ ├── analisando-seu-codigo-js-com-linter.md
│ ├── animacoes-em-svg-com-css.md
│ ├── animando-svg-com-smil.md
│ ├── ano-novo-blog-novo.md
│ ├── atomic-design-no-svg.md
│ ├── atualizacoes.md
│ ├── background-fixo-com-css.md
│ ├── build-incremental-gatsby-netlify.md
│ ├── burnout-e-o-tempo.md
│ ├── chamada-curso-git-e-github-na-vida-real.md
│ ├── coisas-que-eu-nao-sei-em-ti.md
│ ├── colorindo-em-svg.md
│ ├── comandos-uteis-do-chrome-devtools.md
│ ├── comecando-com-react.md
│ ├── como-colocar-seu-site-no-ar-de-graca.md
│ ├── como-configurar-o-google-analytics-no-nextjs-em-2021.md
│ ├── como-configuro-meu-editor-e-desktop-para-gravar-codigo.md
│ ├── como-criar-e-publicar-um-pacote-de-extensoes-do-vscode.md
│ ├── como-criar-footer-fixo.md
│ ├── como-criar-secoes-fullscreen-com-css.md
│ ├── como-criar-um-curso-online.md
│ ├── como-criar-um-spinner-loader-com-css-puro-e-uma-div.md
│ ├── como-deixar-a-imagem-da-webcam-redonda-no-obs.md
│ ├── como-fazer-seu-site-funcionar-offline-com-pwa.md
│ ├── como-melhorar-meu-seo.md
│ ├── como-mostrar-trechos-de-codigo-num-blog-com-nextjs.md
│ ├── como-se-manter-atualizado-no-frontend.md
│ ├── como-se-tornar-um-desenvolvedor-front-end.md
│ ├── como-ter-um-blog-ajuda-a-conseguir-oportunidades.md
│ ├── como-um-patinho-me-ajudou-a-ser-um-programador-melhor.md
│ ├── como-usar-e-se-comportar-melhor-em-chats.md
│ ├── como-usar-o-google-analytics-events-tracker.md
│ ├── como-usar-o-reactjs.md
│ ├── como-usar-svg.md
│ ├── configurando-2-contas-de-git-no-mesmo-computador.md
│ ├── configurando-o-macbook-m1-para-desenvolvimento-web.md
│ ├── configurando-o-webpack-para-rodar-react-e-es6.md
│ ├── convertendo-um-class-based-component-para-react-hooks.md
│ ├── criando-animacao-ondas-css-svg.md
│ ├── criando-apresentacoes-e-hospedando-no-github.md
│ ├── criando-botao-animado-com-css-e-svg.md
│ ├── criando-componente-de-tipografia-com-styled-components.md
│ ├── criando-componentes-react-com-testes-lyef-flag.md
│ ├── criando-componentes-usando-so-es6.md
│ ├── criando-e-exportando-svg-para-web.md
│ ├── criando-efeito-parallax-no-header.md
│ ├── criando-icone-menu-hamburguer-animado-com-css-puro.md
│ ├── criando-imagens-bonitas-de-codigo.md
│ ├── criando-menu-fullscreen-animado-com-css-puro.md
│ ├── criando-o-efeito-da-chuva-do-matrix-com-javascript-puro.md
│ ├── criando-reading-progress-com-css-variables.md
│ ├── criando-svg-responsivo.md
│ ├── criando-textos-responsivos-com-css.md
│ ├── criando-toda-a-estrutura-de-um-site-usando-o-strapi-cms.md
│ ├── criando-um-background-com-gradient-animado.md
│ ├── criando-um-codepen-simples-em-poucas-linhas.md
│ ├── criando-um-loader-animado-em-svg.md
│ ├── criando-um-menu-off-canvas-com-css3.md
│ ├── criando-um-react-custom-hook-com-testes.md
│ ├── criando-um-switch-button-com-css.md
│ ├── criando-um-tooltip-animado-com-css-clip-path.md
│ ├── criando-uma-animacao-de-card-com-hover.md
│ ├── criando-uma-animacao-de-digitacao-com-css.md
│ ├── criando-uma-animacao-de-reveal-block-com-css.md
│ ├── criando-uma-lib-js-com-testes-do-zero.md
│ ├── customizando-o-disqus.md
│ ├── debugando-e-agilizando-testes-na-react-testing-library.md
│ ├── devo-fazer-faculdade.md
│ ├── devs-brasileiros-gringos-trabalhar-exterior.md
│ ├── dez-anos-de-blog.md
│ ├── dica-de-css-scroll-snap.md
│ ├── dica-rapida-1.md
│ ├── diga-nao-ao-medium-tenha-sua-propria-plataforma.md
│ ├── dominio-proprio-no-github-pages.md
│ ├── efeito-de-desenhar-com-svg.md
│ ├── entendendo-especificidade-em-css.md
│ ├── entendendo-testes-de-software.md
│ ├── erros-comuns-com-o-react-testing-library.md
│ ├── esta-tudo-bem-nao-fazer-nada.md
│ ├── estilizando-svg-com-css-parte-1.md
│ ├── estilizando-svg-com-css-parte-2.md
│ ├── exemplos-de-sites-com-parallax.md
│ ├── falando-sobre-rscss.md
│ ├── fazendo-o-browser-falar-por-voce-web-speech-api.md
│ ├── feito-e-melhor-que-perfeito.md
│ ├── filtros-css.md
│ ├── formatando-datas-com-js-puro.md
│ ├── formatando-numero-em-dinheiro-com-js-puro.md
│ ├── fundamentos-javascript-antes-de-aprender-react.md
│ ├── gatsby-e-nextjs-performance-e-developer-experience.md
│ ├── guia-como-contribuir-em-open-source.md
│ ├── habemus-react-hooks.md
│ ├── happy-halloween-caca-ao-tesouro.md
│ ├── https-no-github-pages-com-custom-domain.md
│ ├── introducao-ao-strapi-headless-cms.md
│ ├── js-com-tdd-na-pratica-e-novidades.md
│ ├── juntando-arrays-e-objetos-com-spread-syntax-no-javascript.md
│ ├── lancamento-curso-de-git-e-github-na-vida-real.md
│ ├── links-da-semana-1.md
│ ├── links-da-semana-2.md
│ ├── links-da-semana-3.md
│ ├── links-da-semana-4.md
│ ├── links-da-semana-5.md
│ ├── links-da-semana-6.md
│ ├── lista-de-dicas-de-seo-para-devs.md
│ ├── lyef-criando-componentes-desacoplados-em-reactjs.md
│ ├── mais-de-10-mil-alunos-na-udemy.md
│ ├── making-of-blog-novo-gatsby-js.md
│ ├── making-of-parte-1.md
│ ├── making-of-parte-2.md
│ ├── manipulando-svg-com-js.md
│ ├── mantendo-seu-projeto-atualizado-com-dependabot-e-github-actions.md
│ ├── mask-e-clip-com-css-e-svg.md
│ ├── medindo-performance-do-seu-site-com-lighthouse.md
│ ├── menu-sticky-e-smooth-scroll-com-css-puro.md
│ ├── meu-ano-de-2015.md
│ ├── meu-ano-de-2016.md
│ ├── meu-ano-de-2017.md
│ ├── meu-ano-de-2018.md
│ ├── meu-ano-de-2019.md
│ ├── meu-ano-de-2020.md
│ ├── meu-ano-de-2021.md
│ ├── meu-ano-de-2023.md
│ ├── meu-ano-de-2024.md
│ ├── meu-dia-a-dia-como-dev-frontend.md
│ ├── meu-processo-para-a-toptal.md
│ ├── meu-setup.md
│ ├── meus-15-dias-no-chile.md
│ ├── meus-20-dias-no-peru.md
│ ├── meus-50-dias-na-espanha.md
│ ├── meus-plugins-favoritos-do-sublime-text.md
│ ├── migrei-meu-blog-do-gatsby-para-o-nextjs.md
│ ├── migrei-para-o-vscode-e-estou-feliz.md
│ ├── minha-trajetoria-ate-ser-desenvolvedor.md
│ ├── minhas-experiencias-com-trabalho-remoto-em-ti.md
│ ├── mini-curso-gratuito-de-typescript.md
│ ├── mostrando-ultimos-posts-e-videos-no-github-profile.md
│ ├── mudando-sua-vida-atraves-de-projetos-paralelos.md
│ ├── mude.md
│ ├── mulheres-na-tecnologia.md
│ ├── nextjs-gatsby-ou-create-react-app-entendendo-os-conceitos-de-ssr-ssg-e-spa.md
│ ├── novidades-do-react-16.md
│ ├── novo-curso-criando-um-ambiente-de-desenvolvimento-no-windows.md
│ ├── novo-curso-de-git-e-github-para-iniciantes.md
│ ├── novo-projeto-awesome-audioviz.md
│ ├── o-basico-da-api-do-reactjs.md
│ ├── o-que-ninguem-diz-para-iniciantes.md
│ ├── o-que-preciso-saber-para-trabalhar-no-exterior.md
│ ├── onde-baixar-svg.md
│ ├── organizando-seu-css-com-itcss.md
│ ├── perfomance-web-critical-css-e-jekyll.md
│ ├── performance-web-evite-escrever-html-demais.md
│ ├── performance-web-usando-fontes-do-sistema.md
│ ├── perguntas-e-respostas-jekyll.md
│ ├── por-que-ir-em-eventos-vale-a-pena.md
│ ├── por-que-usar-jekyll.md
│ ├── por-que-usar-svg.md
│ ├── porque-eu-evito-funcoes-anonimas.md
│ ├── pre-venda-curso-de-svg.md
│ ├── refatorando-componentes-react-para-es6.md
│ ├── saude-deve-ser-a-prioridade.md
│ ├── semantic-version.md
│ ├── share-button-sem-dependencias.md
│ ├── sistemas-de-icones-em-svg.md
│ ├── social-meta-tags.md
│ ├── sou-bom-o-suficiente.md
│ ├── talk-uma-conversa-sobre-trabalho-remoto.md
│ ├── tecnicas-de-aprendizado.md
│ ├── theme-color-android-lollipop.md
│ ├── trabalhando-com-a-tela-util-do-iphone.md
│ ├── trabalhando-com-git-hooks-de-forma-facil.md
│ ├── um-novo-projeto-um-novo-desafio.md
│ ├── um-post-por-dia.md
│ ├── um-tema-para-todos-os-lugares-dracula-pro.md
│ ├── usando-netlify-cms-com-nextjs-vercel-e-github.md
│ ├── usando-o-preact-no-nextjs-para-mais-performance.md
│ ├── usando-svg-sprites.md
│ ├── usando-um-agregador-de-conteudo.md
│ ├── utilizando-css-counters.md
│ ├── utilizando-svg-sprites-com-react.md
│ ├── valorize-suas-conquistas.md
│ ├── varrendo-seu-site-atras-de-links-quebrados.md
│ ├── video-em-background-com-object-fit.md
│ ├── video-iniciando-um-app-react-em-3-minutos.md
│ └── vindo-morar-e-estudar-na-irlanda.md
├── public/
│ ├── cms/
│ │ ├── config.yml
│ │ └── index.html
│ └── robots.txt
└── src/
├── components/
│ ├── Analytics/
│ │ └── index.js
│ ├── Avatar/
│ │ ├── index.js
│ │ └── styled.js
│ ├── Comments/
│ │ └── index.js
│ ├── Course/
│ │ ├── index.js
│ │ └── styled.js
│ ├── Layout/
│ │ ├── index.js
│ │ └── styled.js
│ ├── MenuBar/
│ │ ├── index.js
│ │ └── styled.js
│ ├── MenuLinks/
│ │ ├── content.js
│ │ ├── index.js
│ │ └── styled.js
│ ├── Pagination/
│ │ ├── index.js
│ │ └── styled.js
│ ├── Post/
│ │ ├── index.js
│ │ └── styled.js
│ ├── Profile/
│ │ ├── index.js
│ │ └── styled.js
│ ├── RecommendedPosts/
│ │ ├── index.js
│ │ └── styled.js
│ ├── Search/
│ │ ├── Hit.js
│ │ ├── index.js
│ │ └── styled.js
│ ├── Sidebar/
│ │ ├── index.js
│ │ └── styled.js
│ └── SocialLinks/
│ ├── Icons.js
│ ├── content.js
│ ├── index.js
│ └── styled.js
├── lib/
│ ├── api.js
│ ├── buildAlgoliaIndexes.js
│ ├── constants.js
│ ├── generateRSS.js
│ ├── generateSitemap.js
│ ├── gtag.js
│ ├── markdownToHtml.js
│ └── utils.js
├── pages/
│ ├── 404.js
│ ├── [slug].js
│ ├── _app.js
│ ├── _document.js
│ ├── about.js
│ ├── api/
│ │ ├── auth.js
│ │ └── callback.js
│ ├── cursos.js
│ ├── index.js
│ ├── search.js
│ └── series.js
├── styles/
│ ├── base.js
│ ├── global.js
│ └── transitions.js
└── templates/
├── blog-list.js
└── blog-post.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": ["next/babel"],
"plugins": [
[
"babel-plugin-styled-components",
{
"ssr": true,
"displayName": true
}
],
[
"prismjs",
{
"languages": [
"javascript",
"css",
"typescript",
"json",
"jsx",
"markdown",
"bash",
"yaml"
],
"plugins": ["line-numbers"],
"theme": "tomorrow",
"css": true
}
]
],
"env": {
"test": {
"plugins": [
[
"babel-plugin-styled-components",
{
"ssr": false,
"displayName": false
}
]
]
}
}
}
================================================
FILE: .editorconfig
================================================
# Editorconfig: https://editorconfig.org/
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
================================================
FILE: .eslintrc
================================================
{
"extends": "next"
}
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
*.xml
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
public/images
================================================
FILE: .nvmrc
================================================
lts/*
================================================
FILE: .prettierrc
================================================
{
"trailingComma": "none",
"tabWidth": 2,
"semi": false,
"singleQuote": true,
"arrowParens": "avoid"
}
================================================
FILE: Readme.md
================================================
# Willian Justen - Blog
Personal website/blog.
Currently using:
- [NextJS](https://nextjs.org/)
- [Vercel](https://www.vercel.com)
If you're interested on learn these technologies, check [my courses](https://willianjusten.com.br/cursos/).
================================================
FILE: jsconfig.json
================================================
{
"compilerOptions": {
"baseUrl": "src"
}
}
================================================
FILE: next-seo.config.js
================================================
const DefaultSEO = {
openGraph: {
type: 'website',
locale: 'en_US',
url: 'https://willianjusten.com.br',
site_name: 'Willian Justen'
},
twitter: {
handle: '@Willian_justen',
site: '@site',
cardType: 'summary_large_image'
}
}
export default DefaultSEO
================================================
FILE: next.config.js
================================================
module.exports = {
webpack: (config, { dev, isServer }) => {
// Replace React with Preact only in client production build
if (!dev && !isServer) {
Object.assign(config.resolve.alias, {
react: 'preact/compat',
'react-dom/test-utils': 'preact/test-utils',
'react-dom': 'preact/compat'
})
}
return config
},
async rewrites() {
return [
{ source: '/js/', destination: 'https://willianjusten.com.br/' },
{ source: '/jekyll/', destination: 'https://willianjusten.com.br/' },
{ source: '/svg/', destination: 'https://willianjusten.com.br/' },
{ source: '/dev/', destination: 'https://willianjusten.com.br/' },
{ source: '/tags/', destination: 'https://willianjusten.com.br/' },
{
source: '/making-of-blog-novo/',
destination:
'https://willianjusten.com.br/making-of-blog-novo-gatsby-js'
},
{ source: '/page/:slug*', destination: 'https://willianjusten.com.br/' }
]
},
async redirects() {
return [
{
source: '/my-trips/',
destination: 'https://my-trips.willianjusten.com.br/',
permanent: true
},
{
source: '/japanese-words/',
destination: 'https://japanese-words.willianjusten.com.br/',
permanent: true
},
{
source: '/learn-japanese/',
destination: 'https://learn-japanese.willianjusten.com.br/',
permanent: true
},
{
source: '/js-com-tdd-na-pratica-na-udemy/',
destination: 'https://www.youtube.com/@WillianJustenCursos',
permanent: true
},
{
source: '/novo-curso-aprenda-criar-sites-animados-greensock/',
destination: 'https://willianjusten.com.br',
permanent: true
},
{
source:
'/novo-curso-gatsby-crie-um-site-pwa-com-react-graphql-netlify-cms/',
destination: 'https://willianjusten.com.br',
permanent: true
}
]
},
images: { domains: ['pbs.twimg.com', 'avatars.githubusercontent.com'] }
}
================================================
FILE: package.json
================================================
{
"name": "willianjusten-blog",
"private": true,
"description": "My personal blog on willianjusten.com.br",
"version": "3.0.0-alfa",
"author": "Willian Justen ",
"dependencies": {
"@babel/core": "^7.14.6",
"@openlab/vercel-netlify-cms-github": "^1.1.0",
"algoliasearch": "^4.10.2",
"babel-plugin-prismjs": "^2.1.0",
"babel-plugin-styled-components": "^1.12.0",
"date-fns": "^2.22.1",
"gray-matter": "^4.0.3",
"next": "^11.0.1",
"next-instantsearch": "^0.3.15",
"next-seo": "^4.26.0",
"nextjs-progressbar": "^0.0.11",
"preact": "^10.5.14",
"preact-render-to-string": "^5.1.19",
"prismjs": "^1.24.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-infinite-scroll-component": "^6.1.0",
"react-instantsearch-dom": "^6.11.2",
"remark": "^13.0.0",
"remark-autolink-headings": "^6.0.1",
"remark-html": "^13.0.1",
"remark-oembed": "^1.2.2",
"remark-slug": "^6.0.0",
"slugify": "^1.5.3",
"styled-components": "5.3.0",
"styled-icons": "^10.30.0",
"styled-media-query": "^2.1.2"
},
"devDependencies": {
"eslint": "^7.30.0",
"eslint-config-next": "^11.0.1",
"globby": "^11.0.4",
"prettier": "^2.2.1",
"sitemap": "^7.0.0"
},
"keywords": [
"nextjs",
"frontend",
"blog"
],
"license": "MIT",
"scripts": {
"dev": "NODE_OPTIONS='--openssl-legacy-provider' next dev",
"build": "NODE_OPTIONS='--openssl-legacy-provider' next build",
"start": "NODE_OPTIONS='--openssl-legacy-provider' next start",
"lint": "next lint"
},
"repository": {
"type": "git",
"url": "https://github.com/willianjusten/willianjusten.com.br"
},
"bugs": {
"url": "https://github.com/willianjusten/willianjusten.com.br"
}
}
================================================
FILE: posts/3-meses-de-globocom.md
================================================
---
layout: post
date: 2015-06-28T20:36:52.000Z
title: 3 meses de globo.com
description: Um pouco do que passei desde o primeiro contato, processo seletivo,
contratação, minha mudança e o dia-a-dia.
main-class: dev
tags:
- trabalho
- globo
categories: null
---
## Introdução
Como faço em todos os posts, a trilha sonora desse post é da cantora [Banks](https://open.spotify.com/album/5tMskcB2i9chjb4zcHx20n). Escrevo também enquanto desço minha querida serra de Petrópolis, num agradável frio de 8 graus.
Algumas pessoas já haviam me pedido para falar um pouco sobre como foi o processo seletivo e como é trabalhar na globo.com, eu demorei um pouco para escrever esse post, pois queria capturar o máximo de coisas possíveis e também esperar um tempo suficiente para que eu pudesse analisar tudo.
Pretendo fazer um post simples, com as minhas experiências, mas isso não quer dizer que tudo que aconteceu comigo, acontece com quem é contratado ou passa pelo processo seletivo, são só as coisas que ocorreram comigo.
P.S.: também esperei os 3 meses de experiência antes de escrever, vai que me demitem né? Meu time me zoava todo dia sobre isso xD
## Contatos
Eu trabalhava no [Queremos](https://www.queremos.com.br/), um lugar muito legal, com várias pessoas legais e uma ideia incrível. A empresa fica no Humaitá, bairro da zona sul do Rio de Janeiro. Como eu sou de uma cidade serrana, bastante afastada, não tinha muitos contatos, mas quando desci para trabalhar no Queremos, acabei conhecendo muitas pessoas e uma delas foi o [Davidson Fellipe](https://twitter.com/davidsonFellipe).
Conversa vai, conversa vem, ele perguntou se eu um dia não teria interesse em trabalhar na globo.com. Na hora eu fiquei receoso, porque a gente ouve sempre que os caras que trabalham na globo.com são todos gênios (e são mesmo!) e eu, um pobre iniciante nesse ramo de desenvolvimento, achava que nunca iria passar, mas falei que tinha interesse sim.
Não deu muito tempo e entraram em contato comigo, perguntando se eu teria interesse de participar do processo seletivo. Eu fiquei meio bolado e fui conversar com o Davidson sobre, ele falou para eu tentar, que não custava nada e ele acreditava bastante em mim. Como eu realmente não tinha nada a perder e queria saber meu nível, aceitei passar pelo teste.
## Processo Seletivo - Parte 1
Ao aceitar participar, recebi um projeto com várias coisinhas para fazer e que eu deveria entregá-lo no tempo que eu desejasse. Me pegaram numa semana complicada, onde estava cheio de coisas para fazer, mandei um email avisando sobre isso e foram totalmente tranquilos quanto a isso, falando para eu não me preocupar. Mas como sou um cara desesperado e preocupado por natureza (um defeito que venho tentando corrigir), peguei uma madrugada desesperada e fiz tudo. Não era nada super difícil não, mas possuía alguns detalhes interessantes e podia fazer com qualquer linguagem e stack. Eu escolhi fazer em Javascript, usei uma stack que já estava bastante habituado a usar, que é o meu [Fast](https://github.com/willianjusten/fast).
Passou por volta de 1 semana até eu receber uma resposta, que no caso foi positiva. Disseram que gostaram do que eu fiz e tinham interesse em fazer um entrevista agora por Skype e marcaram um dia comigo.
## Processo Seletivo - Parte 2
Do dia que marcamos até o dia da entrevista no Skype, eu estava uma pilha de nervos, como sempre preocupado achando que não iria passar, me rebaixando. Dessa vez, foi a hora de conversar com um outro amigo que já estava na globo.com também, mas que já havia trabalhado no Queremos comigo, [Rodrigo Machado](https://twitter.com/rcmachado). Ele falou que eu podia ir para o apartamento dele ficar lá para a entrevista, para assim não me atrasar para o trabalho depois, eu ainda descia a serra de Petrópolis todos os dias.
Na hora que iria ter o teste, não teve! Isso mesmo que você leu, eu fiquei desesperado para caramba, nem tinha dormido direito e aí o teste precisou ser cancelado devido a alguns problemas. Ele foi então remarcado para uma outra data. Foi desse dia que eu resolvi que deveria parar de ficar tão preocupado/desesperado. Eu já trabalhava num lugar legal, não haveria problema se eu não passasse também, era só um teste.
Quando finalmente chegou o dia do teste no skype, alguns programadores do TechTudo conversaram comigo, perguntaram um pouco do meu histórico, projetos que eu tinha orgulho de ter participado, coisas interessantes que eu gostaria de contar, etc. Curiosamente eu estava bem relaxado, a conversa fluiu super bem e falei para caramba (sim, eu falo demais!!!).
Após a conversa, falaram que iriam fazer alguns testes comigo. Os 2 primeiros testes eram para escrever pequenos programinhas para resolver alguns problemas, resolvi fazer um em javascript e o outro em python. O primeiro problema eu demorei até começar, dei uma travada bonita, aquela preocupação de fazer algo com geral vendo do outro lado. O segundo já foi bem mais tranquilo e saiu mais fácil. Depois destes 2 problemas, me passaram acesso a um web app, para eu fazer a correção de pequenos trechos de código em Javascript. Não eram erros de sintaxe e sim erros de performance, como manipulação de DOM dentro de um loop, entre outros problemas graves. Essa parte já foi bem mais simples para mim, já que gosto bastante de performance e já havia visto aquelas falhas de performance, inclusive em códigos mais velhos meus.
Depois de tudo feito, falaram que gostaram bastante, mas que iriam analisar um pouco mais e entrariam em contato para me avisar se eu passei e a próxima etapa.
## Processo Seletivo - Parte 3
Passado uma semana, recebi um email avisando que haviam gostado bastante do meu teste, que eu havia passado para a próxima etapa e que ela consistia em passar um dia na globo.com.
Eu já havia sido avisado que teria essa etapa, mas na hora que recebi o aviso real, fiquei mega feliz, conhecer uma empresa bastante grande e que todos falam! Marcamos um dia e, é claro, fiquei super ansioso até o dia chegar. Mal dormi naquele dia, acordei extremamente cedo para descer a serra e não ter problemas de atraso. Cheguei lá com quase 2 horas de antecedência e nesse meio tempo acabei escrevendo um post, de curiosidade fui ver que horas eu comecei a escrever o post:
**"Como ter Domínio Proprio no Github Pages"
date: 2015-01-29 04:16:36**. Sim, eu praticamente não dormi!!
Após a espera, entrei e fui apresentado a algumas pessoas e guiado por dentro da globo.com. Para quem vinha de uma startup com umas 8-9 pessoas, foi um grande baque, tem muita gente lá dentro! Vários times de diferentes áreas, isso porque eu só tinha visto um andar, depois fui apresentado ao andar inferior, com mais um monte de gente também.
Pela manhã tive uma conversa com um dos times de Esportes, basicamente a mesma coisa que tive no Skype, só que agora presencial. Finalizando a conversa, me passaram um probleminha para resolver. Foi uma das piores soluções que eu fiz na vida, tanto que nem finalizei direito, fiquei bastante nervoso e frustrado... Me pediram para explicar o código e enquanto eu explicava, fui tendo outras ideias e fui explicando o motivo de ter pensando em outras coisas e acho que isso que me ajudou, porque eles viram que eu até que sabia, mas estava nervoso.
Na parte da tarde conversei com o time do TechTudo, falei um pouco sobre o problema que eu estava resolvendo e também sobre outras coisas que eles iam me perguntando. A conversa foi super legal e com isso adquiri até contato com o [Igor Canedo](https://twitter.com/Caned0) e simpatia com o resto do time. Depois dessa conversa, fui ter uma conversa um pouco mais técnica com o Gerente Técnico, falamos sobre muitas coisas e ele também me propôs 2 problemas mais teóricos para eu dizer como faria a arquitetura do sistema para comportar esses 2 problemas, indo de banco de dados, até número de requisições a uma API. Não foi totalmente técnico, mas também não foi tão fácil, mas consegui expor vários pontos que ele gostou.
Já no finalzinho da tarde, conversei com o pessoal do RH, sobre benefícios da empresa e outras coisas mais burocráticas e então dei tchau para todos, com pelo menos a sensação de dever cumprido. Dali era só esperar a resposta, mas que já nem era a mais importante das coisas, já que eu estava feliz de ter participado de tudo.
## Contratação
Deu uns 2-3 dias e me ligaram falando que eu havia passado! Fiquei mega feliz, mas sabia que agora seriam várias mudanças. Disse que aceitava sim, mas que primeiramente precisava me desvincular da empresa em que trabalhava e conversar com eles, para não causar nenhum problema para eles. Conversei com o pessoal da empresa, alguns ficaram chateados, mas como todos são legais, me desejaram boa sorte nesse meu novo rumo.
## Conhecendo meu novo time
Ao chegar na globo, já para trabalhar. Fui apresentado ao meu novo time, que seria o Time 1 de Esportes, um dos responsáveis pelo globoesporte. Acho que eu não poderia ter caído num melhor time (puxando saco =p). Meu time é relativamente pequeno e é composto por:
[Kenji Yamamoto](https://twitter.com/kenjiyamamoto), não tem aquela frase: "você pode ser bom, mas sempre vai ter um asiático melhor do que você", então...O cara é sinistro em milhares de coisas, brincamos até que ele é o pau para toda obra do time. Sempre com uma calma nipônica e um conhecimento tanto de linguagem quanto de produto (por já estar há quase 10 anos na globo.com), sempre me ajuda nas minhas dúvidas, por mais bobas que elas sejam.
[Rômulo Jales](https://twitter.com/romulojales), é um cabra da peste arretado, lá de Pernambuco, é o cara do Backend. Parece que respira programação e sempre te dá uma solução para um problema. Profundo conhecedor de Python e também um grande conselheiro e amigo. Não tem nem muito tempo que o conheço, mas já me acolhe e me ajuda como se nos conhecessemos há anos.
[André Cataldo](https://twitter.com/andrecataldo), o SM (Scrum Master) do time. Sempre preocupado com o time e o andamento dos projetos, atento para nos ajudar e nos atender em nossos problemas. Sabe como ser justo e comemorar uma conquista. Também um dos caras mais experientes da globo.com, com quase 14 anos só lá dentro, sendo que a globo.com fez 15 anos esse ano!
## Dia-a-dia no globoesporte
No globoesporte trabalhamos com uma variação do método ágil chamado [Scrum](http://www.desenvolvimentoagil.com.br/scrum/). Com isso temos nossos Plannings Semanais e Dailys, usando uma board para anotar nossas histórias, sempre na base (To Do, Doing, Done), com algumas coisinhas a mais, que variam de time para time.
Existem projetos só para o produto (esportes ou jornalismo ou entretenimento), mas também existem os projetos integrados a todas as áreas, em geral, nesse tipo de projeto, são feitas várias reuniões para entender as necessidades de cada um, para que assim a construção seja adequada a todos.
Dentro da globo, os projetos, em sua maioria, são feitos em Python/Django, mas também já vi coisas em Ruby, outras em Go e algumas áreas mais legadas usando Java. A preocupação é sempre em solucionar o problema de forma eficiente e útil para todos, então as linguagens e frameworks utilizados não são fixos, podendo variar bastante.
Prezamos muito pela comunicação, tanto dentro do time como em outras áreas também. Como o Rômulo Jales diz: "Não existe desenvolvimento sem comunicação".
A empresa é bastante legal e as pessoas são ótimas, semana passada eu pude participar do meu primeiro HackDay na globo e foi super divertido! Meu time desenvolveu um bolão bolado, utilizando a API do Tempo Real do globoesporte, para dar os resultados durante a Copa América.
Dava para ver na galera a animação e empolgação nos projetos, pelo que falaram foi um recorde de pessoas participantes e de projetos desenvolvidos, muitos deles eu queria ter participado, de tão legais que eram.
## Mudança e Conclusão
Bom, como disse lá no início, apesar de eu ser do Estado do Rio de Janeiro, sou de uma cidade serrana, chamada Petrópolis, que é cerca de 2:30 da globo.com (isso já contando o trânsito que sempre existe). Esse processo de subida todo dia, gastando cerca de 5h era muito cansativo. Mesmo indo num ônibus confortável e "dormindo" boa parte do trajeto, eu precisava acordar bastante cedo. Foi aí que resolvi me mudar para mais próximo do trabalho, é claro que toda mudança é cansativa e estressante também, mas já venho notado os benefícios de fazer isso. Então, se você é de longe, não tenha medo de se mudar, a empresa é legal e tenho certeza que você será bem acolhido.
Se você tem interesse, não tenha medo de tentar e basta enviar seu currículo no [github da globo](https://talentos.globo.com/).
Uffa, escrevi demais já! Enfim, espero que tenha respondido a maioria das dúvidas que me fizeram nesse tempo e caso queiram comentar mais alguma coisa, só falar nos comentários.
================================================
FILE: posts/65-dicas-para-ser-um-programador-melhor.md
================================================
---
layout: post
date: 2017-06-27T16:14:42.000Z
title: 65 dicas para ser um programador melhor
description: Algumas dicas que podem ajudar muito a sua maneira de programar e pensar.
main-class: dev
tags:
- dev
- dicas
categories: null
---
## Introdução
Fala pessoal, nos últimos dias eu não tenho passado bem de saúde e com isso não tenho ficado muito no computador, para não me entediar tanto, resolvi ler alguns livros e um deles é um livro incrível, que resolvi pegar as dicas dele e passar para vocês.
Esse livro eu li pela primeira vez quando estava trabalhando na HUGE, eles compraram o livro e eu peguei emprestado para ler. Eu achei tão bom que resolvi comprar um para mim =)
E qual é esse livro afinal hein? É o [The Pragmatic Programmer](https://www.amazon.com.br/Pragmatic-Programmer-Journeyman-Master/dp/020161622X), que se você ainda não conhecia, dá uma olhada com bastante carinho, acho que todo desenvolvedor deveria ler.
Junto com esse post, eu vou ouvindo o novo album da banda [Royal Blood](https://open.spotify.com/album/3Rz6kF8eGqrDOEteo5YsBj) chamado de [How Did We Get So Dark?](https://open.spotify.com/album/3Rz6kF8eGqrDOEteo5YsBj), são só 2 caras com uma bateria e um baixo que tocam um rock muito bom, outra coisa que vale a pena ser ouvida.
Bom, vamos lá, eu basicamente vou passar aqui as dicas adaptadas do livro para vocês. Leiam e releiam essas dicas com carinho, se puderem, imprimam em algum lugar para sempre ler ou salvem nos favoritos. Compartilhem com TODOS que puderem, pois um mundo onde os programadores seguem essas dicas, é um mundo melhor.
## Dicas
1. **Se preocupe com o que constrói** - Por que se gastar sua vida desenvolvendo software se você não se preocupa com ele ser bom?
2. **Pense! Sobre o seu trabalho** - Desligue o piloto automático e tome o controle. Constantemente critique e avalie o seu trabalho.
3. **Dê opções, não crie desculpas** - Ao invés de dar desculpas, dê opções. Não diga que não pode ser feito; explique como *pode* ser feito.
4. **Não conviva com janelas quebradas** - Corrija designs ruins, decisões erradas e código ruim quando vê-los.
5. **Seja um catalisador de mudanças** - Você não pode forçar as pessoas a mudarem. Mas você pode mostrá-las como o futuro pode ser e ajudá-las a participar na criação disso.
6. **Veja o quadro geral** - Não fique tão focado só nos detalhes que esqueça de verificar o que está acontecendo ao se redor.
7. **Faça da Qualidade um requisito** - Envolva os usuários para determinar a real qualidade que o projeto precisa ter e cumpra.
8. **Invista regularmente no seu Portfolio de Conhecimento** - Faça do aprender um hábito.
9. **Analise criticamente o que você lê ou escuta** - Não seja influenciado pelo hype das coisas. Analise a informação em termos de você e seu projeto.
10. **É o que você diz e a maneira que você diz** - Não faz sentido você ter grandes ideias se você não consegue comunicá-las efetivamente.
11. **DRY - Don't Repeat Yourself (Não se repita)** - Cada pedaço de código deve ser único e o mais genérico possível.
12. **Faça ser fácil de reutilizar** - Se é fácil de reutilizar, pessoas vão reutilizar. Crie um ambiente que suporte o reuso.
13. **Elimine os efeitos colaterais entre coisas não relacionadas** - Crie componentes que sejam auto-contidos, independentes e tenham um único e bem definido propósito.
14. **Não existem decisões finais** - Nenhuma decisão é escrita em pedra. Ao invés disso, pense que as decisões são escritas em areia de praia, e se planeje para ir sempre mudando e adaptando.
15. **Use "tracer bullets" para achar o alvo** - Faça as coisas e as deixe serem vistas, assim você pode ver o quanto elas chegam do que seu cliente realmente deseja.
16. **Faça protótipos para aprender** - Prototipar é uma experiência de aprendizado. O seu valor não está no código em que você produz, mas nas lições que aprendeu para montar.
17. **Programe perto do problema** - Crie e codifique na linguagem do seu usuário, como se você fosse ele.
18. **Estime para evitar surpresas** - Estime antes de começar. Você irá possivelmente ver problemas a frente e conseguirá se organizar melhor.
19. **Itere o tempo com o código** - Use a experiência que você ganha construindo a aplicação para refinar a escala de tempo do projeto e ter melhores estimativas.
20. **Escreva e Rabisque** - Textos e rabiscos nunca se tornam obsoletos. Eles ajudam a melhorar o seu trabalho e simplificar depurações e testes.
21. **Use o poder da linha de comando** - Use linha de comando quando interfaces não são necessárias.
22. **Use um bom editor** - O editor precisa ser uma extensão da sua mão, tenha certeza que seu editor é configurável, extensível e vocês trabalham bem juntos.
23. **Sempre use versionamento de código** - Versionamento de código são como máquinas do tempo para o seu trabalho, aqui é possível voltar atrás!
24. **Corrija o problema. Não fique culpando** - Não importa se o bug é sua culpa ou de outro, é um problema e precisa ser corrigido.
25. **Não entre em pânico quando estiver debugando** - Respire bem fundo e *pense!* sobre o que pode estar causando o bug.
26. **O "select" não está quebrado** - É muito raro achar um problema que seja de fato do sistema operacional ou do compilador. O bug na maioria das vezes está na sua aplicação.
27. **Não presuma, prove!** - Prove suas premissas num ambiente com dado real e sob as mesmas condições.
28. **Aprenda manipulação de texto na sua linguagem** - você passa boa parte do tempo trabalhando com textos. Por que não deixar o computador fazer um pouco desse trabalho para você?
29. **Escreva código que faça código** - Geradores de código aumentam sua produtividade e ajudam a evitar duplicações.
30. **Você não pode escrever um software perfeito** - Softwares não podem ser perfeitos. Proteja seu código e os usuários dos erros inevitáveis.
31. **Faça o Design com contratos** - Use contratos para documentar e verificar se o código faz o que se é pedido.
32. **Quebre cedo** - Um programa morto normalmente dá menos problemas que um programa deficiente.
33. **Use *assertions* para previnir o impossível** - use assertions para validar suas premisas. E use para proteger seu código de incertezas.
34. **Use *exceptions* para problemas excepcionais** - Exceptions podem prejudicar a leitura e manutenibilidade do projeto, criando os famosos código spaguetti. Reserve *exeptions* para coisas de fato excepcionais.
35. **Termine o que você começou** - Quando possível, a rotina ou objeto responsável por alocar aquele recurso, precisa ser responsável por desalocar também.
36. **Minimize o acoplamento entre os módulos** - Evite o acoplamento aplicando a [Lei de Demeter](https://en.wikipedia.org/wiki/Law_of_Demeter).
37. **Configure, não integre** - implemente escolhas de tecnologia para uma aplicação como se opções de configuração, não somente como processo de integração ou código agregado.
38. **Coloque abstrações no código, detalhes no metadata** - Codifique para o caso geral e coloque os casos específicos de forma separada do código base.
39. **Analise o Workflow para melhorar a concorrência** - busque formas de realizar código em concorrência no workflow de seu usuário.
40. **Desenvolva usando serviços** - Codifique em termos de serviços, independentes, bem definidos e com interfaces consistentes.
41. **Separe as Views das Models** - Para ganhar flexibilidade a baixo custo, desenvolva sua aplicação em termos de models e views.
42. **Não programe por coincidência** - Confie em coisas confiáveis. Tome cuidado com a complexidade acidental e não confunda uma feliz coincidência com o plano final.
43. **Estime a ordem de seus algoritmos** - Tenha uma ideia de o quão demoradas as coisas podem acontecer antes de escrever seu código.
44. **Teste suas estimativas** - Análises matemáticas de algoritmos não dizem tudo. Teste seu código sempre no ambiente mais próximo do real.
45. **Refatore cedo, refatore frequentemente** - Assim como você pode arrumar e reorganizar um jardim, reescreva, retrabalhe e rearquitete seu código sempre que necessário. Corrija a raiz dos problemas.
46. **Codifique para testar** - Comece pensando sobre como testar antes de escrever uma linha de código.
47. **Teste seu software, ou seus usuários irão testar por você** - Teste implacavelmente. Não deixe seus usuários acharem bugs para você.
48. **Não use código mágico que você não entende** - Mágicas podem gerar códigos complicados. Tenha certeza que você entende tudo que o código faz, antes de implementá-lo em seu projeto.
49. **Não pegue requisitos - cave até eles** - Os requisitos raramente estão só na superfície. Eles estão enterrados em camadas de premissas, equívocos e política. Veja além do que foi pedido.
50. **Trabalhe com o usuário para pensar como o usuário** - Teste com o usuário, é a única maneira de saber como ele de fato será usado. Pegue todos os insights possíveis assim.
51. **Abstrações vivem mais que detalhes** - Invista em abstrações, não na implementação. Abstrações podem sobreviver as mudanças de diferentes implementações e tecnologias.
52. **Cria um Glossário do projeto** - Crie e mantenha um lugar com todos os termos e vocabulários do projeto, pessoas novas podem não saber certas definições do projeto.
53. **Não pense fora da caixa, ache a caixa!** - Ao enfrentar com problemas impossíveis. Pergunte a si mesmo: "Isso precisa ser feito dessa maneira? Isso realmente precisa existir?".
54. **Comece quando você estiver pronto** - Você tem adquirido experiência com o tempo, não ignore as dúvidas que tiver.
55. **Algumas coisas são melhor quando feitas do que descritas** - Não caia numa espiral de criar especificações e pensamentos, uma hora você precisa começar a codificar.
56. **Não seja um escravo de métodos formais** - Não adote cegamente uma técnica sem colocar no contexto do seu desenvolvimento e suas capacidades.
57. **Ferramentas caras não produzem designs melhores** - Tome cuidado com o hype das ferramentas, dogmas da indústria e custos. Julgue suas ferramentas pelos seus méritos.
58. **Organize equipes por funcionalidades** - Não separe designers de desenvolvedores, monte equipes da mesma forma que você cria o código.
59. **Teste cedo, teste frequentemente, teste automaticamente** - Testes que rodam a cada build são muito mais efetivos que testes esporádicos.
60. **O código não está pronto até que os testes rodem** - só isso.
61. **Use sabotadores para testar seu teste** - Introduza bugs de propósito em partes separadas do código somente para verificar se os seus testes vão pegar.
62. **Teste o estado de cobertura, não a cobertura do teste** - Identifique e teste os diferentes estados do código. Testar só linhas de código não é o suficiente.
63. **Ache bugs uma única vez** - Uma vez que um humano encontrou um bug, essa deverá ser a última vez que ele irá achá-lo. Crie testes para sempre verificar o bug.
64. **Inglês é uma outra linguagem de programação** - Escreva documentos como você escreve código, honre o princípio do *DRY*, use metadata e geração automática.
65. **Assine o seu trabalho** - os grandes construtores ficam orgulhosos de assinar suas obras, você também deveria se orgulhar.
## Conclusão
Espero que depois dessa leitura, você tenha identificado várias das suas falhas e também vários dos seus acertos e se organize para seguir sempre assim. E lembre-se o aprendizado é algo contínuo e importante, então sempre dê uma lida nessas dicas e pensa se está utilizando tudo que está ali ou se está se sabotando em algum momento.
É isso aí galera, deixem aí nos comentários o que acharam dessas dicas, sejam críticos também! Se tem algo que não concordam ou que querem falar um pouquinho mais, a área de comentários é o lugar para isso. E compartilhem no trabalho de vocês!
================================================
FILE: posts/a-estrutura-do-svg.md
================================================
---
layout: post
date: 2015-01-20T15:01:39.000Z
title: "#4 - A estrutura do SVG"
description: Saiba como o SVG funciona de verdade, seus elementos, alguns de
seus atributos e alguns atalhos para facilitarem nosso trabalho.
main-class: svg
tags:
- svg
- tutorial
categories:
- O mundo mágico do SVG
---
## Índice da série
- [#1 - Por que usar SVG?](https://willianjusten.com.br/por-que-usar-svg/)
- [#2 - Como usar SVG](https://willianjusten.com.br/como-usar-svg/)
- [#3 - Onde Baixar SVG](https://willianjusten.com.br/onde-baixar-svg/)
## Introdução
Sei que muita gente já está doida para aprender a fazer desenhos loucos e animações com SVG, mas é ainda mais importante aprender tudo que está por trás do SVG, para poder então, entender tudo que virá pela frente. Isso que vai diferenciar um cara que sabe SVG de um cara que aprendeu a futucar numa biblioteca e fez um "trequinho ali para empresa".
A ideia também não será escrever algo muito extenso e cansativo, mas uma base para que se você olhar para um arquivo SVG, entenda o que significa cada parte dele e inclusive poder fazer melhorias baseadas somente no código.
## Estrutura
Como a maioria já deve saber o SVG tem uma sintaxe baseada em `xml`. Estamos na segunda edição da versão [1.1](http://www.w3.org/TR/SVG/). E a especificação do [SVG 2.0](http://www.w3.org/TR/SVG2/) já está sendo formulada, já em um processo bastante adiantado, seguindo os moldes das novas especificações, como CSS3 e o HTML5.
```xml
```
### O que são essas coisas ali com a tag SVG?
São os `namespaces` do SVG. Eles servem para identificar a versão utilizada no SVG e o namespace padrão dele, assim o browser irá saber qual a melhor forma de renderizar aquele SVG. Isso será bastante importante para nós quando formos manipular o SVG através do Javascript, pois para criar novos elementos e definir atributos, iremos trabalhar no DOM através dos namespaces.
### Preciso definir isso sempre?
Não, não é necessário definir isso tudo sempre, mas é aconselhável, já que alguns browsers podem não entender muito bem como renderizar o seu SVG.
Se quiser entender um pouco melhor sobre Namespaces, acessa o [link da MDN](https://developer.mozilla.org/en/docs/Web/SVG/Namespaces_Crash_Course).
## Elementos
O SVG é tem algumas formas básicas, que permitem fazer os lindos desenhos que vemos. Irei mostrar essas formas e alguns de seus atributos, mas vale lembrar que elas serão mais necessárias caso você queira escrever o SVG inline e/ou para entender melhor um arquivo SVG de um desenho já pronto. Não será necessário que você faça desenhos mais complexos na mão, usando só essas formas.
### O elemento rect
```xml
```
Esse elemento permite criar um retângulo e tem os seguintes atributos:
- `x` : desloca o elemento ao longo do eixo x (horizontal) de acordo com o espaço do svg (opcional)
- `y` : desloca o elemento ao longo do eixo y (vertical) de acordo com o espaço do svg (opcional)
- `width` : define a largura do elemento
- `height` : define a altura do elemento
- `fill` : define a cor do preenchimento (opcional)
- `rx` : define um curva nos cantos do retângulo (opcional)
### O elemento circle
```xml
```
Esse elemento permite criar um círculo e tem os seguintes atributos:
- `cx` : determina em qual local do eixo x irá ficar o centro do círculo
- `cy` : determina em qual local do eixo y irá ficar o centro do círculo
- `r` : define o raio do círculo
- `fill` : define a cor do preenchimento (opcional)
### O elemento ellipse
```xml
```
Esse elemento permite criar uma ellipse e tem os seguintes atributos:
- `cx` : determina em qual local do eixo x irá ficar o centro da ellipse
- `cy` : determina em qual local do eixo y irá ficar o centro da ellipse
- `rx` : define o raio da ellipse no eixo x
- `ry` : define o raio da ellipse no eixo y
- `fill` : define a cor do preenchimento (opcional)
### O elemento line
```xml
```
Esse elemento permite criar uma linha e tem os seguintes atributos:
- `x1` : determina a posição no eixo x do primeiro ponto da linha
- `y1` : determina a posição no eixo y do primeiro ponto da linha
- `x2` : determina a posição no eixo x do segundo ponto da linha
- `y2` : determina a posição no eixo y do segundo ponto da linha
- `stroke` : define a cor do contorno da linha (opcional)
- `stroke-width` : define a largura da linha (opcional)
### O elemento polyline
```xml
```
Esse elemento permite criar uma polyline e tem os seguintes atributos:
- `points` : define os pares ordenados (x,y) para cada ponto do elemento
- `fill` : define o preenchimento interno do elemento
- `stroke` : define a cor do contorno do elemento (opcional)
- `stroke-width` : define a largura do contorno (opcional)
### O elemento polygon
```xml
```
Esse elemento permite criar um polígono e tem os seguintes atributos:
- `points` : define os pares ordenados (x,y) para cada ponto do elemento
- `fill` : define o preenchimento interno do elemento
- `stroke` : define a cor do contorno do elemento (opcional)
- `stroke-width` : define a largura do contorno (opcional)
### O elemento path
O elemento Path é um dos mais complexos e também mais importantes para o SVG. A partir dele, conseguimos criar qualquer forma e com isso gerar os belos desenhos existentes.
Existem 5 tipos de paths:
- Curveto (C,c)
- Smooth Curveto (Curveto Suave) (S,s)
- Curva Quadrática de Bézier (Q,q)
- Curva Quadrática de Bézier Suave (T,t)
- Arco Elíptico (A,a)
A letra **maiúscula** utiliza coordenadas **absolutas** para criar a forma, enquanto a letra **minúscula** utiliza coordenadas **relativas**.
## Conclusão
A partir de formas básicas podemos até brincar um pouquinho de fazer alguns desenhos bobinhos, ou se você for um Mestre Jedi, até fazer coisas incríveis. Você consegue saber as formas usadas na imagem acima? Teve ideia para fazer algum desenho legal? Faz no [codepen](http://codepen.io/) e manda para cá nos comentários =)
Se quiser saber um pouco mais sobre Inline SVG tem o [Guia de Bolso do SVG](https://github.com/jonitrythall/svgpocketguide/blob/master/svgpocketguide-ptbr.md), que foi um livro que eu e o [Lucas Maia](https://github.com/lucasmaiaesilva) traduzimos com muito amor e carinho <3
E se tiver alguma dúvida, seja de algo que eu já falei ou que ainda não falei, manda nos comentários, tento responder o mais rápido que der =)
================================================
FILE: posts/a-historia-por-tras-do-meu-curso-de-react-avancado.md
================================================
---
layout: post
date: 2020-06-30T08:36:52.000Z
title: A história por trás do meu curso de React Avançado
description: As primeiras ideias do curso, desistências, saída da Toptal e reinicio de tudo!
main-class: misc
tags:
- react
- curso
---
## Introdução
Fala pessoal, há algum tempo eu venho falando sobre um novo curso que eu estava preparando junto com meu amigo [Guilherme Louro](https://twitter.com/guilhermelouro) e design do [Marcos Oliveira](https://twitter.com/vmaarcosp).
E hoje nós estamos finalmente lançando o **módulo 1** do curso! E como assim só o módulo 1? Bom, a ideia é que seja um curso mais vivo, com mais participação dos alunos e também um curso bem maior do que os outros.
No [site do curso](https://reactavancado.com.br/) nós falamos sobre todos os módulos e eu também [gravei um vídeo](https://youtu.be/zrx9kTHU-8Y) explicando ainda mais sobre todos os detalhes. Aproveita e vai lá no [site do curso](https://reactavancado.com.br/) que tem descontão!
Se você estiver interessado na criação do curso e os altos rolês que aconteceram, segue comigo aqui embaixo. Enquanto lê, aconselho a ouvir o novo [album do Tycho](https://open.spotify.com/album/3uqx22ScaYQujWq2lBvXuQ?si=CMvxg3p-SQqADx4ffbPw_Q), é um som chillwave perfeito para relaxar, programar e tudo mais que puder imaginar, eu sou apaixonado demais pela sonoridade!
## Prelúdio do curso
A ideia de criar esse curso vem desde quando criei o curso de GatsbyJS, ou seja, por volta de Agosto/Setembro de 2019 eu já estava pensando e querendo fazer esse curso.
No curso de Gatsby, eu ensinei a fazer um blog como o meu e a colocar ele em produção. Desde então tiveram muiiiitos novos blogs surgindo por aí, alguns sem quase nenhuma modificação, outros completamente diferentes. Mas o mais importante, o povo estava feliz de **estar colocando algo em produção**
## Um curso mais próximo do real
Assim como todo mundo, eu também consumo vários cursos e livros, em todos os cantos possíveis. E uma das coisas que sempre me frustrou foi ver cursos interessantes, mas que sempre me davam a sensação de terem "acabado pela metade" ou não serem parecidos com os cenários reais.
Muitos não ensinam com **testes**, outros não ensinam como criar o **código para produção**, outros não ensinam como fazer o **deploy** de fato. E, com isso, por mais que fossem cursos muito bons, acabavam criando essa sensação de "falta alguma coisa".
Foi aí que eu pensei em fazer um curso que fosse realmente de ponta a ponta. Desde a escolha das ferramentas, onde aprendemos para que serve e o porquê de escolhermos, até criação do código para produção, com boas práticas, testes e tudo mais que fosse necessário. E por fim, o deploy também, porque nada mais frustrante do que criar algo e não saber como colocar isso para que os outros vejam.
## Primeiras ideias, desistências e problemas
Quando eu resolvi criar esse curso, a primeira coisa que eu tinha em mente, é que eu não queria fazer ele sozinho. Eu queria fazer com mais alguém, para que tivessem mais discussões e que por mais que fosse um "time pequeno", ele se aproximaria de coisas reais, como diferentes cabeças/pensamentos. E foi por isso, que desde o início eu chamei o Guilherme para trabalhar comigo. Nós já fizemos muita coisa juntos, ele já me ensinou para caramba e era uma oportunidade para discutir mais.
A primeira ideia era um "Cartola da NBA", onde as pessoas iriam poder apostar nos times de acordo com as partidas e teriam os rankings e etc. Mas como é uma algo sazonal (tem meses sem jogos) e também não tem tanta gente que conhece/entende o funcionamento das partidas/playoffs, a gente acabou desistindo dessa ideia. Depois tiveram outras ideias aqui e ali, mas nada muito sólido infelizmente.
Foi aí que eu tive que fazer uma viagem pela Toptal para a Espanha e consequentemente as ideias do curso foram pausadas. Logo depois eu já engatei numa viagem para Itália/Suiça com objetivo de fotografar e só retornei ao Brasil no final do ano. Por causa disso, sequer discutimos e o projeto ficou engavetado por um tempo.
## Saída da Toptal
Durante os meses de Janeiro e Fevereiro eu estava em alguns projetos da Toptal, mas estava bastante desanimado, não eram projetos que eu estava muito feliz e eu queria criar meus cursos, meus posts para o blog.
Conversei com meu gestor dizendo que estava desanimado e já querendo sair mesmo, ele disse para me acalmar, pensar melhor e me ofereceu um outro time/projeto para eu participar. Fiquei o mês inteiro de Março nesse novo projeto, que tinha um prazo absurdo, mas com ajuda de todo o time, nós conseguimos entregar exatamente no prazo, foi bom ter essa sensação de dever cumprido, mas ao mesmo tempo eu já não queria mesmo trabalhar para ninguém, pelo menos por um tempo. Foi aí que no dia 1 de Abril, eu saí da Toptal (e nem era de mentira!).
## Foco total e novo integrante!
Assim que eu saí da Toptal, eu decidi que iria voltar a criar mais coisas, mais conteúdo e sim, eu iria fazer um curso legal!
Uma das primeiras coisas que eu fiz, foi "renascer" o meu [canal do YouTube](https://www.youtube.com/WillianJustenCursos) para começar a testar novos estilos de vídeo e conteúdo. Passei a conversar muito mais no [Slack dos Alunos](https://bit.ly/slack-will) e até brincava sobre a Toptal estar atrapalhando o meu trabalho. Fiz até aposta com aluno (Alô Bruno Melo, tá pago?)
E, claro, eu comecei a repensar no curso e a ideia de fazer um Ecommerce de jogos veio quase que na hora! Faz pouco tempo eu comprei um PC e passei a usar a Epic Games (que apesar de bonita é horrível) e também a Steam (que apesar de funcional é feia que dói).
Eu conversei com o Guilherme e ele topou a ideia, apesar de nós dois não gostarmos muito de fazer ecommerce, é um projeto muito procurado e **bastante real**. Começamos pensando no que poderia ter, imaginar umas telas e então, do nada, o [Marcos Oliveira](https://twitter.com/vmaarcosp) mandou a seguinte mensagem no twitter:

O cara me mandou uma mensagem as **2 horas da manhã**, não teve jeito, tive que chamar para participar da ideia e ele topou!!!
## Criação de um branding e conversas
No momento que o Marcos entrou no time, eu me empolguei, pois o curso estava cada vez mais se materializando e seria ainda mais real do que eu sequer imaginava! Afinal de contas, agora teríamos um layout feito por quem entende de design, já que eu e o Guilherme até brincamos aqui e ali, mas enquanto eu não sei desenhar nada, o outro é daltônico ahhaha
O Marcos começou a fazer as mágicas dele lá, enquanto eu e o Guilherme fomos pensando na estrutura do código e definindo features e outras coisas mais. Quando ele nos mostrou a logo, foi paixão a primeira vista.

## Ansiedade mais de 8000 e mudança na estrutura

Eu estava extremamente ansioso e já queria logo falar para os alunos do projeto! E fui logo dizer as boas novas no Slack, mas ao fazer isso, eu acabei criando uma cadeia de ansiedade nos outros também!
Mas o curso estava só começando a criação, faltava (ainda falta) coisa para caramba! E então eu fiquei pensando, o que eu faço agora? Não posso simplesmente dizer que só vou lançar daqui 5-6 meses, pessoal vai ficar triste/desacreditado.
Foi daí que eu conversei de novo com o Guilherme e tivemos essa ideia de lançar o curso mesmo em andamento. Assim nós poderíamos ir criando o conteúdo, ao mesmo tempo que o pessoal vai consumindo. Confesso que preciso controlar minha ansiedade quase que todos os dias, e os próximos meses serem intensos, mas vamos que vamos.
## Mais crises de ansiedade e inseguranças
Já tem tempo que eu crio cursos, mas esse é o primeiro curso que eu faço com um escopo tão grande e com essa duração bem maior (lançando por módulos a cada mês e tudo).
E por causa disso, já me bateram diversas crises. Fico direto me perguntando se vocês vão gostar, se num vai ser simples demais e vocês vão reclamar, se vai dar tudo certo, se eu vou cumprir todos os prazos direitinho.
Direto eu me confidencio com alguns amigos que me apoiam e falam para eu ficar calmo, mas essas sensações de me [sentir um impostor](https://willianjusten.com.br/sou-bom-o-suficiente/) sempre aparecem.
Noite passada eu me senti péssimo por ter tido esse atraso de 1 dia da Udemy e era 4h da manhã e eu estava no suporte reclamando com eles (parece que deu certo né?).
Enfim, por essas várias coisas, eu considero esse como um dos cursos mais importantes para mim até hoje e eu espero que ele seja bastante legal e importante para todos vocês também.
## Agradecimentos
Eu gostaria de agradecer ao apoio de todos, desde quando eu comentei sobre o desejo de fazer esse curso, vários vieram me incentivar e dizer o quanto gostam do meu conteúdo e o quanto confiam no sucesso desse novo curso.
Cada retweet, mensagem, like, inscrito em algum canto, já é uma mensagem para continuar me encorajando a criar conteúdo, que é o que mais gosto de fazer, então fica aqui, meu muito obrigado!
================================================
FILE: posts/a-importancia-do-github-para-desenvolvedores.md
================================================
---
layout: post
date: 2017-08-04T15:04:36.000Z
title: A importância do Github para Desenvolvedores
description: Alguns motivos do porque eu acho que o Github é importante para os
desenvolvedores.
main-class: dev
tags:
- dev
- dicas
categories: null
---
## Introdução
Fala meus lindos, estou aqui com um post que pode ser polêmico ou não, vai depender muito da interpretação de todos vocês. Peço que leiam atentamente todos os detalhes, a ideia não é gerar #treta ahuahua
Vou escrevendo enquanto vou ouvindo um album incrível da banda [The Last Sights of the Wind](https://open.spotify.com/album/6tIzZJUF8WPl2YiHWxk4TU), um instrumental muito muito bom, mistura guitarras muito melódicas com som atmosférico, perfeito para quem quer se concentrar em alguma tarefa importante. Aliás, se você curte música, entra no meu [grupo do Slack](https://bit.ly/slack-will), tem um canal específico para quem curte um bom som! xD
Bom, vamos parar com a enrolação e vamos ao post!
## Um tweet inocente
Meu amigo [Bernard de Luna](https://twitter.com/bernarddeluna) que vem fazendo um trabalho muito maneiro na Bunee.io fez o seguinte tweet:
A cor roxa simboliza os talentos que aparentam serem bons, mas nao possuem um github ativo e relevante.
O que eu acho que ele quis dizer com esse Tweet é como o Github é importante e pode mudar a visão da empresa que está procurando gente para contratar. Ele marcou alguns potenciais bons desenvolvedores, mas que não possuiam um Github ativo, ele não os excluiu de forma alguma, simplesmente apontou a falta de um **diferencial** que esses desenvolvedores poderiam ter.
E aí fica o questionamento, o Github é realmente importante? Se ele é, por quê? Bom, vou tentar explicar um pouquinho disso, sem tomar muito tempo também.
## Colaboração
Antes de tudo, o Github não é só uma rede social de código, ela é uma plataforma que prega a colaboração das pessoas para criação de projetos que possam ser utilizados por todo mundo e de forma gratuita. Isso por si só é uma coisa fantástica! Imagina o seu código sendo usado por várias pessoas/empresas ao redor do mundo, isso é legal demais.
Mas isso não fica por aí, no Github não necessariamente precisa ser só código, existem vários projetos muiiiito bacanas sem ter uma linha de código, alguns exemplos são:
- [Lista de Awesomes](https://github.com/sindresorhus/awesome) - grandes listas com conteúdos de todas as áreas, ajudando assim a quem quer aprender um novo assunto, mas não tem muito tempo para ficar garimpando bons links.
- [Fórum da FrontendBR](https://github.com/frontendbr/forum) - uma das ideias mais geniais que temos, um fórum para desenvolvedores dentro da principal plataforma de desenvolvedores! São várias pessoas se ajudando todos os dias, num lugar aberto para todos e com uma indexação muito melhor que um Facebook da vida.
- [Vagas FrontendBR](https://github.com/frontendbr/vagas) - um repositório para divulgação de boas vagas para desenvolvedores e moderado por desenvolvedores.
- [Training Center](https://github.com/training-center) - um local onde mentores se oferecem para ajudar novatos a entrar nessa área maravilhosa que estamos.
- [Learn X in Y minutes](https://github.com/adambard/learnxinyminutes-docs) - outro projeto genial para quem quer aprender algum assunto novo.
Enfim, como você pode ver aí acima, nenhum dos repositórios é cheio dos códigos macabros que precisa ser um Deus para fazer, muito pelo contrário, várias das iniciativas partiram de pessoas iniciantes que queriam aprender e organizavam seus estudos lá.
Então se você acha que não pode contribuir/colocar nada lá, aprenda que qualquer coisa é válida! Um material de estudo seu, pode ser um ótimo guia para outra pessoa, eu incentivo demais que meus alunos sempre coloquem suas coisas lá, assim além da pessoa reforçar o que aprendeu, o material fica lá para posteriores pesquisas e para que outras pessoas também consigam achar e estudar junto, olha que coisa legal =D
## Felicidade em poder ajudar
Eu vou pegar um exemplo que aconteceu tem dias atrás. Um aluno meu no Slack perguntou se alguém tinha projetos que contribuia ou sabia de algum projeto. Eu brinquei postando que tinha um monte no meu Github que precisava de ajuda. Porque sim, as vezes a gente começa algo, mas fica apertado de tempo e não consegue terminar ou até mesmo precisa de mais alguém para ajudar, essa é a graça do Github. Abaixo segue a imagem a imagem desse momento:

Depois dessa primeira conversa, eu lembrei que precisava fazer uma coisinha simples num repositório meu, mas que eu sempre tava enrolando por causa de tempo. Aproveitei, direcionei o Rafael do que eu precisava, ele foi lá e fez. Inclusive durante o processo ele aprendeu como submeter corretamente um PR, ou seja, de uma ajuda que ele foi fazer, ainda saiu aprendendo. E no final, nós comemoramos no canal o seu primeiro PR.

## Portfólio Vivo
Quando você coloca alguma coisa no seu Github, automaticamente isso fica visível para todo mundo e essa é a parte mais legal. E tanto pessoas como empresas podem ter uma ideia melhor das coisas que você faz, como, por exemplo:
- Ver quais linguagens você tem mais costume de trabalhar
- Ver mais ou menos como você pensa
- Entender como você resolve alguns problemas particulares
E claro, essas suas contribuições podem dizer sim, se você pode ser um potencial funcionário naquela empresa. As vezes a empresa busca alguém com conhecimentos em React e vê que você tem um boilerplate simples de React ou fez um curso de React e botou seus estudos lá. A empresa vai saber que você já teve contato com aquela tecnologia, o que vai facilitar demais na comunicação.
Assim como os designers possuem redes como Behance e Dribbble, os fotógrafos possuem o 500px, Unsplash. Por que nós desenvolvedores não teríamos uma rede para nós?
## Conclusão
Bom, não estendendo mais o post do que já estendi. O que eu quero dizer e também acho que foi o objetivo do Bernard é que o Github é sim um **diferencial** para um programador. Não estamos dizendo que só programadores que contribuem todos os dias que são programadores bons, muito pelo contrário, eu conheço gente que contribui uma vez por ano, mas são grandes programadores. A questão é tentar possuir um Github atualizado, tente ter uma foto sua, coloque onde mora, empresa que trabalha e nos momentos que forem possíveis, tente colocar algo lá e/ou tentar ajudar alguém em alguma coisa.
Você poderia começar tendo o seu curriculum lá também, eu tenho [o meu](https://github.com/willianjusten/resume), não é nada demais, mas a empresa que te alcançar por lá, já pode saber mais um pouquinho de você! =)
Existem sim, vários poréms quando a análise é feita **somente** pelo Github, pois aí a comparação é injusta. Tem empresas que adotam o Github, então você trabalhando já está colocando código lá, outras empresas já não usam. Tem também a questão do tempo e prioridades, que as vezes a pessoa não está podendo priorizar o Github naquele momento.
A ideia é que se você tiver um tempinho, ao invés de gastar 30min do seu dia num Twitter/Facebook da vida, você pode colocar algo lá no Github, nem que seja responder issues de um repositório ou colocar alguma coisa que aprendeu durante o seu dia. Existe um projeto bacaninha chamado [Today I learned](https://github.com/thoughtbot/til), ou "Hoje eu aprendi" em Português, onde você pode colocar por exemplo, algo que aprendeu no seu dia, como: "Hoje eu aprendi que `git commit --amend` permite adicionar coisas que esqueci no commit anterior e/ou mudar o título do commit.
E pronto! Você acabou de fazer uma contribuição beem simples no Github, que nem te tomou tanto tempo e garanto, pelo menos uma pessoa no post agora não sabia que isso existia!
Nossas vidas são corridas, cada um tem suas dificuldades e seus problemas, mas já parou para pensar que mesmo nossa vida tão cheia que é, a gente ainda consegue procrastinar? Por que não usar esses momentos de procrastinação e fazer algo que te ajude?
================================================
FILE: posts/achievement-concluido-braziljs.md
================================================
---
layout: post
date: 2016-08-29T16:35:49.000Z
title: Achievement concluído - BrazilJS
description: Tudo que me aconteceu antes, durante e depois desse que foi meu
maior evento de desenvolvimento.
main-class: misc
tags:
- dev
- eventos
- braziljs
categories: null
---
## Introdução
Faaaaala pessoal, estou muiiito feliz com tudo que passei lá em Porto Alegre e então resolvi fazer um post sobre todas essas coisas. Já aviso que esse não será um post review sobre as coisas do evento, acho que já terão vários desses posts e inclusive que poderão ser até mais detalhados, visto que fiquei nervoso antes da minha palestra e posso ter perdido vários detalhes.
Eu vou separar o post entre antes, durante e depois da BrazilJS no meu ponto de vista e meus acontecimentos, acho que vai ser legal.
Para não perder o costume, vou ouvindo [Madeon](https://open.spotify.com/track/4PTPZeJlK1rYlYr6bf11hk), música eletrônica bem maneira =)
## Antes
### Envio do Call for Papers e Resposta
Eu acompanho sempre as coisas da BrazilJS, principalmente a [Weekly](https://github.com/braziljs/weekly/issues), onde já tiveram vários posts meus lá indicados até por outros. Em um dia, eu vi que tinham aberto o Call for Papers para a BrazilJS e eu fiquei pensando bastante se mandava ou não. Já tive a felicidade de palestrar em vários eventos, mas como todo mundo sabe, a BrazilJS é bem grande e com muitas palestrantes bons lá de fora. Mas depois de ficar pensando bastante, eu me perguntei, por que não? Eu já tinha comprado as passagens e o ingresso, então eu já ia de qualquer maneira mesmo xD
Eu já estava brincando com algumas coisas de Audio Visualization e imaginei que seria um assunto legal para ser falado, já que nunca tinha visto nada parecido no Brasil. Já tinha visto uma palestra do [Shiota criando música com o RetroJS](https://www.youtube.com/watch?v=DMy3P6BF7Iw), mas nada muito visual, então quis experimentar. Para a felicidade do meu amigo [Márcio Ribeiro](http://shiz.co/), que é vidrado no assunto.
Bom, eu enviei sei lá quando, mas fiquei meses sem receber resposta. Como toda pessoa ansiosa, logo que eu enviei, fiquei umas semaninhas pensando e esperando, como não veio nada, já tinha aceitado que não tinha rolado. Quando o Jaydson me mandou um email falando que tinham gostado do meu tema e perguntando se eu queria me juntar, nossa, eu pulei de alegria!

### Montagem dos slides e vôo
Eu confesso que estou num momento super embolado, estou prestes a me mudar, também terminando um projeto com um amigo, além de ter palestrado direto em Julho e Agosto. Então, como todo brasileiro, eu fui deixando os slides para a última hora. Como eu sou muiiiito chato com conteúdo, fiz e refiz meus slides várias vezes. É um tema que eu gosto bastante, então tinha tantos exemplos para colocar, mas que ao mesmo tempo eu achava que ficaria massivo...
Enfim chegou um dia antes de eu embarcar e como eu sou de Petrópolis, combinei com um amigo que iria ficar na casa dele, porque meu vôo ia ser 6:30 da manhã. Mas, é claro que não foi bem assim, meus amigos que iam voar junto comigo resolveram sair para comer, e acabamos encontrando outros 2 amigos devs também, resultado? Ficamos jogando sinuca e conversando até super tarde e praticamente fomos virados para o aeroporto. Lá tivemos uma pequena parada para capturar um Sandslash (faz parte né xD) e então embarcamos! Segue foto minha e dos meus amigos, [Jonas Mendes](https://nipher.io/) e [Gabriel Godoy](http://gabrielgodoy.com/).

### Chegada e Teste dos slides
Cheguei na quinta bem cedinho e fui recepcionado pelo Jaydson com um micro-ônibus para me levar ao hotel junto com meus amigos, foi ali que começou a cair a ficha que eu ia palestrar no maior evento de Javascript do mundo! Ficamos um pouco no hotel e fomos almoçar numa churrascaria SUPER BARATA e que recomendo chamada Giovanaz (dicas do will para turistar =p).
A tarde teve uma coletiva lá no shopping e também deu para testar o projetor e o som, para saber como iria ficar. E...deu TUDO errado! O contraste estava muito ruim nos slides, não dava para ver praticamente nada, o tamanho também tinha dado erro e cortado algumas coisas, confesso que fiquei bastante nervoso e triste. Eu só fiquei um pouco mais feliz, pois quando eu comecei a passar pelos exemplos com música, o Jake Archibald saiu correndo de um ponta até perto do palco para ver o que estava rolando, isso foi super legal <3
Mas, como nem tudo são flores, eu precisava voltar para o Hotel e refazer todos os slides que estavam ruins (90%), só que o pessoal todo tinha combinado de sair e conhecer um pouquinho da cidade, mas eu sabia que se eu não ficasse refazendo, o dia seguinte ia ser um desastre. Falei para os meus amigos que não ia dar para sair, aí que o [Jonas Mendes](https://nipher.io/) e o [Márcio Ribeiro](http://shiz.co/) ficaram comigo no hotel ajudando a refazer e ainda dando opiniões do que podia mudar, ficamos até muito tarde fazendo isso, mas no final de tudo, já estávamos rindo e eu estava bem aliviado que aparentemente estava tudo bom.
Indo dormir 3h da manhã, mas tendo a certeza que tenho amigos dispostos a me ajudar sempre, isso já valeu o evento para mim #braziljs
## Durante
O evento estava um pouco atrasado e eu já estava bem nervoso/ansioso, já tinham tido palestras muito legais pela manhã, em particular a palestra do Jake Archibald, que para mim, foi uma das melhores do evento. Também teve a palestra da Ruth, que falou sobre o tema música também, mas que infelizmente uma das Demos tinha dado um probleminha, o que só me deixou mais nervoso, pensando se tudo iria funcionar mesmo.
De repente, o Jaydson sobe no palco e me chama, nossa, ver a galera toda lá, tava beeem cheinho, galera lado a lado nas arquibancadas e no chão também, bateu um baita de um nervosismo. Mas eu pensei, tá tudo certo e você vai falar de algo que ama, a galera vai curtir. E foi isso, foram 30 minutos que ao mesmo tempo que pareceram uma eternidade, quando acabou, eu pensei que tinha sido curto demais!
Ter visto a galera rindo dos meus exemplos e das minhas piadas bobas foi só me dando mais confiança e o barulho que geral fez no final, foi INCRÍVEL! Para quem não estava lá, segue um amostra de como foi, mas multiplica o som e eco por umas 10x.
E para assistir a apresentação inteira, só seguir [nesse link](https://youtu.be/tJ0XV9W4nHw?t=23396), já no tempo marcado. Os slides também [estão aqui](https://willianjusten.com.br/braziljs-16).
## Depois
### Tweets e carinho
Sabe quando você sente que saiu um peso enorme das costas? Foi exatamente isso, não que era um peso ruim, mas era uma ansiedade muito grande de apresentar, depois de ter falado e principalmente por ter sido bem recebido, nossa, aliviei muito e fiquei super feliz!
Eu saí do palco com 10% de bateria no celular e com tantas notificações, que eu sabia que seria impossível ler tudo antes de acabar a bateria, consegui conectar rapidinho no Mac e fui lendo várias mensagens de carinho, tanto de amigos, como de pessoas que eu não conhecia, mas que gostaram da palestra. Tiveram fotos lindas e até tweet em espanhol! Separei alguns que curti <3
Além dos tweets, tiveram várias pessoas que me pararam para conversar e até mostrar seus projetos, uma coisa mais fantástica que a outra!
### Lançamento do Curso

Durante o evento, eu também lancei a pré-venda do meu mais novo curso, que será sobre Javascript com TDD na prática, ainda estou fechando a ementa e preparando bastante coisa legal, mas já queria lançar no evento e por isso eu botei um desconto de 50% para as pessoas que já me conhecem e vem me apoiando aí =)
Para quem quiser já aproveitar a oportunidade, a [pré-venda está disponível nesse link](https://www.eventick.com.br/javascript-com-tdd-na-pratica).
### Agradecimento no Aeroporto
E para finalizar, eu gravei um vídeo rapidinho agradecendo todos vocês, diretamente do aeroporto de Porto Alegre, assiste aí =D
================================================
FILE: posts/adicionando-icone-de-github-nos-projetos-opensource.md
================================================
---
layout: post
date: 2021-02-21T08:55:59.000Z
title: Adicionando ícone de GitHub nos projetos opensource
description: Já pensou como o pessoal sempre usa aquele ícone bonitinho no
canto? Agora vai saber!
main-class: misc
tags:
- dica
categories:
- Dicas rápidas
---
## Introdução
Fala pessoal, eu recentemente comecei uma [série de vídeos com dicas bem rápidas](https://www.youtube.com/watch?v=1dNNL95BsJE&list=PLlAbYrWSYTiOviR_zL01FMa-kWEMDIjeO) lá no meu canal do YouTube, mas como eu também gosto de texto e também quero facilitar a busca seja pelo Google ou pelo YouTube, vou portar os vídeos para cá também. Espero que dê certo =)
## Vídeo
## Utilizando com SVG puro ou componentes React/Vue
O [projeto oficial](https://tholman.com/github-corners/) é chamado de GitHub Corners e disponibiliza um código em SVG bem simples que você consegue colocar em qualquer site de forma simples.
Mas se você quiser, também pode utilizar este [componente em React](https://projects.skratchdot.com/react-github-corner/) ou este [componente em Vue](https://gluons.github.io/vue-gh-corners/).
## Conclusão
E aí, gostou da dica? Se curtiu, não deixa de se inscrever lá no [canal do YouTube](https://www.youtube.com/WillianJustenCursos/) para essa e mais outras dicas.
================================================
FILE: posts/adicionando-night-mode-no-seu-site.md
================================================
---
layout: post
date: 2018-03-27T03:35:52.000Z
title: Adicionando Night Mode no seu site
description: Aprenda como criar um botão para mudar as cores do seu site com JS puro.
main-class: js
tags:
- js
- theme
categories: null
---
## Introdução
Fala pessoal, o post de hoje faz parte de um conjunto de mudanças e melhorias que venho fazendo no blog. E no caso, esse pedido foi feito por não **um**, mas vários usuários do blog.
> Pelo amor de deus, bota um modo noturno no seu blog, esses posts gigantes cansam demais os olhos depois de um tempo. - Usuário Amado
Pensando nisso, eu venho anunciar que eu fiz o modo! E você já pode clicar na lâmpada ali para mudar entre um modo e outro. E vou descrever muito muito rapidinho o que eu fiz para mudar. É uma base super simples, então você não tem como se perder.
## Como funciona a mudança de cores?
Basicamente o que você precisa fazer é alterar as cores das fontes/fundo no CSS. E para isso, você precisa criar um `modificador` que vai sobrepôr as cores do tema "light", que é o tema claro. Você pode ver no meu [_night-mode.styl](https://github.com/willianjusten/willianjusten.com.br/blob/ecde3bd2481c24889932e1abaa5900a68cdc7769/src/styl/_night-mode.styl), que eu basicamente tenho uma classe `.night-mode` que é responsável por fazer esse `overwriting` das propriedades. E lá eu defini as duas cores principais para o texto (`text-color`) e para o fundo (`bg-color`), então foi bem simples ir passando essas variáveis em tudo.
## E para ativar os modos?
Para ativar os modos, nós vamos usar nosso lindo Javascript, que nos permite tudo! Primeiramente nós precisamos criar um input/botão que vai ser onde iremos clicar para ficar mudando entre um e outro.
```html
```
Repare que eu coloco um id ali que é `#night-mode`, pois é ele que eu vou usar para ativar/desativar o nosso querido night mode. Como disse na primeira etapa, nós precisamos adicionar o modificador ao html, para que ele comece a fazer a troca de cores certo? Então no Javascript podemos fazer assim:
```js
const nightMode = document.querySelector('#night-mode')
// ao clicar mudaremos as cores
nightMode.addEventListener('click', () => {
// adiciona a classe `night-mode` ao html
document.documentElement.classList.toggle('night-mode')
})
```
E prontinho, só com isso, a gente já fez o night mode ativar e desativar, toda vez que clicamos nele! Mas podemos ir além!
## Salvando o estado do usuário
Depois que o usuário escolhe o tema, nós queremos que esse tema persista por todas as páginas, até que o usuário decida voltar ao outro tema. Para isso nós vamos usar o bom e velho `localStorage` para guardar esse dado para nós, assim a gente faz uma checagem e se tiver o night mode salvo, já habilitamos ele. O script vai ficar assim:
```js
// pegamos o valor no localStorage
const nightModeStorage = localStorage.getItem('gmtNightMode')
const nightMode = document.querySelector('#night-mode')
// caso tenha o valor no localStorage
if (nightModeStorage) {
// ativa o night mode
document.documentElement.classList.add('night-mode')
// já deixa o input marcado como ativo
nightMode.checked = true
}
// ao clicar mudaremos as cores
nightMode.addEventListener('click', () => {
// adiciona a classe `night-mode` ao html
document.documentElement.classList.toggle('night-mode')
// se tiver a classe night-mode
if (document.documentElement.classList.contains('night-mode')) {
// salva o tema no localStorage
localStorage.setItem('gmtNightMode', true)
return
}
// senão remove
localStorage.removeItem('gmtNightMode')
})
```
Show de bola! Agora o tema tá persistindo em todos os posts de forma bem legal!
## Mudando a cor na barra de navegação (Android)
Se você estiver usando um Android, vai notar que a barrinha superior vai mudando a cor de acordo com o post e não queremos isso no night mode, nós queremos que fique escuro para combinar com o tema, para isso, precisamos fazer um pequeno ajuste. E teremos o script final como o abaixo:
```js
// pegamos o valor no localStorage
const nightModeStorage = localStorage.getItem('gmtNightMode')
const nightMode = document.querySelector('#night-mode')
// pega o valor do meta tag
const metaThemeColor = document.querySelector('meta[name=theme-color]')
// caso tenha o valor no localStorage
if (nightModeStorage) {
// ativa o night mode
document.documentElement.classList.add('night-mode')
// pinta o theme color na meta tag
metaThemeColor.setAttribute('content', '#2b2b2b')
// já deixa o input marcado como ativo
nightMode.checked = true
}
// ao clicar mudaremos as cores
nightMode.addEventListener('click', () => {
// adiciona a classe `night-mode` ao html
document.documentElement.classList.toggle('night-mode')
// se tiver a classe night-mode
if (document.documentElement.classList.contains('night-mode')) {
// salva o tema no localStorage
localStorage.setItem('gmtNightMode', true)
// pinta o theme color na meta tag
metaThemeColor.setAttribute('content', '#2b2b2b')
return
}
// senão remove
localStorage.removeItem('gmtNightMode')
// senão bota a cor original
metaThemeColor.setAttribute('content', '#005f97')
})
```
## E o visual do input?
Vocês podem ver que no meu blog eu botei uma lâmpada, mas você podem fazer qualquer coisa e qualquer estilo. Eu criei um post ensinando como [Criar um switch button com CSS](https://willianjusten.com.br/criando-um-switch-button-com-css/), onde eu ensino essa técnica de usar o atributo `:checked` para mudar o css. Dá uma lida para aprender, mas é super super simples!
## Conclusão
Bom galera, esse é o post, espero que tenham gostado, foi bem simples e básico. A realidade é só que eu queria avisar a vocês que eu tinha adicionado essa feature e aí por isso resolvi criar esse post. Se curtiu, comenta/compartilha! E aceito críticas, sempre ajudam a melhorar o blog para vocês!
================================================
FILE: posts/alguns-seletores-css-importantes-para-aprender.md
================================================
---
layout: post
date: 2015-06-30T00:22:47.000Z
title: Alguns seletores css importantes para aprender
description: Porque CSS é muito mais do que só classes e ids. Aprenda alguns
truques legais para facilitar nos seus layouts.
main-class: css
tags:
- css
- frontend
- tutorial
categories: null
---
## Introdução
Como de costume, lá vai a playslist do dia, que se chama [Smart is the new sexy](https://open.spotify.com/user/spotify/playlist/1ewJMPn8IYsjGCqI1n5dfV), curtindo bastante.
Escolhi escrever sobre um assunto que é bastante básico, mas importantíssimo, tanto para quem está começando, como para quem já trabalha há um tempo e não usa certos benefícios que o css dá.
Vai ser um post rapidinho, com alguns exemplos e caso tenham alguma dúvida, podem usar os comentários sempre =)
## A + B
Chamado de seletor adjacente, serve para selecionar o elemento imediatamente depois do primeiro elemento.
Note que somente o elemento `p` seguinte de `a` é afetado pelo estilo.
## A > B
O seletor descendente serve para editar todos os filhos diretos do primeiro elemento, não modificando os elementos mais internos.
Como pode-se notar, as tags `p` diretas de `.container` ganharam o estilo, enquanto a tag `p` mais interna não sofreu alteração.
## A ~ B
Conhecido como elemento irmão, é bastante parecido com o seletor **A + B**, porém ele seleciona todos os elementos diretos de A e não somente o primeiro. É também importante não se confundir com o seletor **A > B**, visto que ele não é para elementos filhos e sim para elementos seguintes.
Perceba que os elementos `p` no mesmo nível de `a` recebem o estilo, enquanto os elementos mais internos e fora do contexto não são afetados.
## A[contexto]
Acho que um dos seletores mais interessantes, de acordo com o que está definido no contexto, conseguimos estilizar em diferentes abordagens.
### A[alt]
Esse irá selecionar os elementos com o atributo `alt` definido.
Somente a imagem com o atributo `alt` recebeu o estilo. Útil para você rastrear se alguma imagem não recebeu o atributo `alt`, que é importante para a acessibilidade. Mas pode ser com qualquer tipo de atributo, como um `title`, por exemplo.
### A[href='link']
Irá editar só os links determinados.
## A:first-child | A:last-child
Para selecionar o primeiro e o último filho de um elemento. Um dos pseudo-seletores mais úteis que eu conheço. Para remover aquela borda do último elemento, entre outras várias coisas.
## A:checked
Seletor utilizado em inputs do tipo `radio` e `checkbox`, serve para várias coisas legais, bastante utilizado em interações sem precisar usar uma linha de JS. Se quiser ver uns exemplos maneiros, tem esse [projeto do Felipe Fialho](https://www.felipefialho.com/css-components/).
E aqui um exemplo simples:
## A:nth-child(n)
Outro pseudo-seletor bastante bacana, serve para selecionar o elemento na posição indicada pelo argumento `n`. Por exemplo, se colocamos `:nth-child(2)` iremos selecionar o segundo elemento daquele conjunto. Mas podemos criar uma expressão `:nth-child(3n)`, onde todos os elementos múltiplos de 3 seriam selecionados (3,6,9...).
## Conclusão
Existem outros vários seletores e pseudo-seletores, escolhi alguns que acho bastante interessantes, mas você sempre pode ir mais a fundo e buscar conhecimento. Aconselho muito a [MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/CSS_Reference) e para quem já entende um pouco mais de inglês, tem o meu favorito e lindo [Codrops](http://tympanus.net/codrops/css_reference).
================================================
FILE: posts/analisando-seu-codigo-js-com-linter.md
================================================
---
layout: post
date: 2015-12-05T00:43:23.000Z
title: Analisando seu código JS com um linter
description: Valide seu código em JS/ES6 em busca de erros, warnings, códigos
esquecidos e melhore a sua qualidade. Seu amiguinho agradece um código mais
limpo.
main-class: js
tags:
- js
- linter
- tutorial
categories: null
---
## Introdução
Faaaala pessoal, fazia muito tempo que eu não escrevia e confesso que isso já estava me agoniando. Então resolvi voltar a falar besteiras escrever!!
Como não poderia deixar de ser, estou escrevendo ouvindo música. A playlist de hoje é [Brains](https://open.spotify.com/user/spotifybrazilian/playlist/0nUucSaL2BGl2VZlbY5TwR), uma playlist que está sendo montada lá na [CCXP](http://www.ccxp.com.br/), muita música maneira! Bota para tocar e vai lendo =D
## Qualidade de Código
Provavelmente você já passou horas escrevendo seu código lindo e aí, do nada, ele parou de funcionar. Então você ficou mais perdido que o John Travolta no Discurso da Dilma.

Você, então, em toda sua humildade, chegou para um amigo e pediu para ele dar uma olhada e ele falou frases assim:
> Você esqueceu de colocar o ponto e vírgula no final da linha.
> Essa variável tá escrita errada, faltou um 'a' ali.
> Cara, esse método não existe nessa linguagem...
Se você já ficou puto com isso, sinta-se abraçado, porque eu também já cansei de cometer esses erros bobos que dava vontade de bater com a cara na parede depois de descobrir. Mas não fui só eu, nem só você, isso é normal do ser humano, não somos máquinas e as vezes uns detalhes passam sem percerbermos.
No momento você está igual o John Travolta de novo.

## Entendi seu ponto, mas como evitar isso?
Pensando nisso, foram criadas várias ferramentas para fazer análise por você. Seguem as principais e mais famosas:
- [JSlint](http://www.jslint.com/)
- [JSHint](http://jshint.com/)
- [Eslint](http://eslint.org/)
Cada uma dessas ferramentas possui um módulo no npm e podem ser fácilmente instaladas.
```bash
npm install -g jslint
npm install -g jshint
## para poder fazer lint de ES6 e JSX
npm install -g eslint
npm install -g babel-eslint
```
E todas elas também possuem integrações com vários editores de código como Sublime, Atom, Brackets, etc...
## Mas como elas funcionam?
Cada uma dessas ferramentas lê seus arquivos desejados e percorre pelos mesmos buscando por erros ou definições que as próprias consideram como má prática e para cada um dos erros, elas reportam ao final.
Para os próximos passos, vou ensinar utilizando o `eslint`, que julgo o melhor dos Linters na atualidade, visto que ele dá um ótimo suporte a `ES6` e `JSX`, além do padrão do JS.
Após instalado o `eslint`, vá até o diretório do seu projeto, digite `eslint --init` e responda as perguntas de acordo com sua necessidade, segue abaixo o print de um uso meu.

Após isso, será criado um arquivo chamado `.eslintrc` dentro da pasta raiz do seu projeto, contendo informações parecidas com:
```js
module.exports = {
"rules": {
"indent": [
2,
4
],
"quotes": [
2,
"single"
],
"linebreak-style": [
2,
"unix"
],
"semi": [
2,
"always"
]
},
"env": {
"es6": true,
"browser": true
},
"extends": "eslint:recommended",
"ecmaFeatures": {
"jsx": true,
"experimentalObjectRestSpread": true
},
"plugins": [
"react"
]
};
```
Se você quiser entender tudo que ele escreveu ali, dá uma olhadinha na [documentação](http://eslint.org/docs/user-guide/configuring) é super detalhada e bem explicada.
Tendo já o arquivo, basta você rodar no terminal em cima do arquivo desejado e ele fará o report se algum erro acontecer, como, por exemplo, tendo um arquivo js:
```js
(function () {
'use strict';
const a = 'will';
function() {
console.log('Hello!')
}
})()
```
Se eu rodar o `eslint` no terminal analisando esse código, ele vai me retornar os seguintes erros:

Eu criei uma variável `a`, mas nunca utilizei no meu código, eu usei console.log num código que vai para produção e ainda esqueci de colocar o ponto e vírgula no final do código!
Para um código pequeno desses, talvez não fizesse diferença, mas pense num código beeeem maior, ele pode ser uma mão na roda =D
Mas rodar isso o tempo todo no terminal é ruim, até mesmo se colocarmos num gulp/grunt da vida, o legal é mostrar no nosso editor. Se você usa Sublime Text, continua lendo aí, que vou mostrar a cereja do bolo!
## Usando o eslint no Sublime
Primeiro de tudo, espero que você tenha instalado o [Package Control](https://packagecontrol.io/installation) no seu Sublime. Depois disso, mande instalar o [SublimeLinter](http://sublimelinter.readthedocs.org/en/latest/installation.html#installing-via-pc) e o [SublimeLinter-contrib-eslint](https://github.com/roadhump/SublimeLinter-eslint#plugin-installation), que vão fazer toda a integração e mágica.
Feito isso, reinicie o seu Sublime e comece a escrever seu código JS! Quando tiver algum erro, ele irá te notificar com marcadores ao lado do erro e na parte inferior irá te avisar o erro. Como na imagem abaixo:

Se você for como eu e quiser ver todos os erros numa lista e poder navegar entre eles, aperte `cmd + shift + p` ou `ctrl + shift + p` e digite `linter show` e você verá uma opção igual da tela abaixo:

Com essa opção selecionada, cada vez que você salvar o código, irá ver uma lista da seguinte forma:

## Habilitando o Sublime para entender código ES6 + Eslint
Caso o seu Sublime não identifique ES6 junto com o Eslint e não faça o lint correto, basta que você instale o plugin do [Babel](https://github.com/babel/babel-sublime) no seu Sublime. Com esse plugin instalado, defina que todos os arquivos JS e JSX serão interpretados como Babel, seguindo os seguintes passos:
1) Abra um arquivo com a extensão JS ou JSX
2) Vá na opção View do Menu
3) Escolha Syntax -> Open all with current extension as... -> Babel -> JavaScript (Babel).
Feito isso, seu Sublime já vai entender aquele código em ES6 e o lint passará a funcionar! Agora vai lá e comece a programar com qualidade!

## Conclusão
Bom, é basicamente isso, se preocupe com seu código e evite demorar horas procurando o erro se uma ferramenta pode fazer por você.
================================================
FILE: posts/animacoes-em-svg-com-css.md
================================================
---
layout: post
date: 2015-07-01T07:22:29.000Z
title: "#12 - Animações em SVG com CSS"
description: Aprenda como criar animações para o SVG usando só CSS e tenha um
site leve e bonito.
main-class: svg
tags:
- svg
- css
- tutorial
categories:
- O mundo mágico do SVG
---
## Índice da série
Tenho escrito bastante sobre SVG que agora os links cresceram e ficar listando todos o tempo todo aqui já vai ficar ruim, então, para facilitar, basta ir em [séries](https://willianjusten.com.br/series/) e lá estarão todos os meus links sobre SVG.
## Introdução
Como de costume, a trilha sonora enquanto escrevo esse post é uma playlist chamada [Totally Stress Free](https://open.spotify.com/playlist/37i9dQZF1DWT7XSlwvR1ar?si=Msf4R5xgSxyBqfCxDb5rzQ), estou com uma puta sinusite e não consigo dormir, então umas músicas mais calmas para eu tentar relaxar e conseguir dormir. Por favor, ignorem os erros grotescos que puderem haver no post, ele vai ser bem pequeno até por isso também.
O post de hoje será em forma de mini-tutorial, então já vou passando logo os exemplos que faremos hoje.
- [Airplane Loader SVG](https://willianjusten.github.io/svg-animation-css/loader.html)
- [Earth SVG](https://willianjusten.com.br/svg-animation-css/)
- [Repositório no Github](https://github.com/willianjusten/svg-animation-css)
## Relembrando...
Uma das grandes vantagens do SVG é que ele é um código xml, que pode ser facilmente manipulado. Esse código possui uma estrutura bem definida, com elementos bases e se você quiser lembrar um pouquinho, basta ler [A estrutura do SVG](https://willianjusten.com.br/a-estrutura-do-svg/).
E como irei fazer animações usando CSS, é bom que você já tenha lido as formas de se [estilizar o SVG usando CSS](https://willianjusten.com.br/estilizando-svg-com-css-parte-1/) e se quiser, pode também se aprofundar em alguns dos [estilos especificos do SVG](https://willianjusten.com.br/estilizando-svg-com-css-parte-2/).
### Passo 1 - Obtendo um SVG
Para este tutorial, eu vou utilizar 2 SVG diferentes. Um contendo somente um elemento e o outro com vários elementos. Para poder mostrar que é possível animar tanto 1 como muitos elementos do DOM sem perda de performance e com uma qualidade bem bacana.
Os arquivos foram [exemplo 1](http://www.freepik.com/free-vector/airplane-vector-template-free_714802.htm) e [exemplo 2](http://www.freepik.com/free-vector/world-travel-vector-free-template_714008.htm).
Se você quiser, tem o link de [onde baixar svg?](https://willianjusten.com.br/onde-baixar-svg/).
### Passo 2 - Limpando o vetor
Como pode ter notado, o arquivo veio em `.AI`, para ser aberto no Illustrator. O que eu queria era somente o avião e seu rastro. Para isso selecionei somente esses dois elementos e os passei para um outro arquivo e o salvei como SVG.

### Passo 3 - Otimizando o SVG
Em geral, esses vetores obtidos da internet vem muito sujos e com muita coisa escrita desnecessária e para isso temos o nosso salvador [SVGOMG](https://jakearchibald.github.io/svgomg/), que é o melhor otimizador de SVG que existe na face da Terra! Basta colocar o seu SVG lá e mandar otimizar, os ganhos as vezes podem ser de mais de 80%!!!

### Passo 4 - Dando nome aos bois
Já tendo o nosso código otimizado, podemos nomear os elementos dos quais queremos estilizar e animar.
Nesse caso, eu criei um grupo para unir o avião e seu rastro e dei a esse grupo a classe `plane`. Ao redor eu criei uma classe `loader` só para poder segurar o elemento e centralizá-lo.
### Passo 5 - Criando a animação
Para ambos os exemplos, eu não fiz um uso maciço de tipos de animação, até porque o objetivo é só mostrar as habilidades do SVG e a facilidade com que temos para animar.
No caso eu utilizei `keyframes` para criar a minha rotação e o `animate` para chamar essa animação. Se você se interessar por animação e quiser saber mais sobre, só dar uma olhada nos posts:
- [CSS Transition e CSS Animation por Raphael Fabeni](https://tableless.com.br/transition-e-animation/)
- [CSS Animation for Beginners por Rachel Cope](https://robots.thoughtbot.com/css-animation-for-beginners)
- [Usando animações CSS pela MDN](https://developer.mozilla.org/pt-BR/docs/CSS/Using_CSS_animations)
- [Criando animação Flipping por Maujor](http://www.maujor.com/tutorial/criando-animacao-flipping-com-css.php)
### Extras: bug do Firefox e Safari
Para as animações de `rotate` é necessário definir um ponte de origem onde a rotação irá ser realizada, para ambos os exemplos, o centro é ponto ideal, podemos fazer de duas formas:
- `transform-origin: 50% 50%;`: dessa forma definimos o centro no eixo X e no eixo Y, considerando que o meio do elemento é sempre metade do mesmo.
- `transform-origin: Kpx Zpx;`: onde K é a metade da largura e Z a metade da altura.
Porém, nem tudo são flores e o Firefox ainda possui um bug em que ele não consegue identificar muito bem as origens quando se usa porcentagem e com pixels ele também se confunde. Então o jeito é utilizar o atributo prefixado.
`-moz-transform-origin: Apx Bpx`
Assim conseguimos contornar esse defeito no Firefox. Para você ter ideia, a Sara Soueidan, que é uma das maiores evangelistas de SVG, também já cansou de reclamar sobre esse bug.
Para o Safari, o problema é bem mais simples, as animações de rotate e transforms ainda necessitam do uso do prefixo `-webkit`, então basta adicionar os prefixo e tudo passará a funcionar. Se você utilizar Gulp ou Grunt, basta adicionar o autoprefixer para fazer esse trabalho. Ou então crie mixins no seu pre-processador.
Na dúvida do que funciona? Sempre veja no [Can I use](http://caniuse.com/).
### Dica: SVG com muitos elementos

No segundo exemplo, apesar do código ser grande, existe um método bem fácil de conseguir nomear e separar as coisas. Insira o SVG inline na página sem nomear nada e com o inspect, vá marcando elemento a elemento e procurando dentro do arquivo para adicionar as classes. Caso tenha dificuldades de notar visualmente se está selecionando o elemento certo, modifique o `fill` do elemento para uma cor bem diferente, assim você consegue filtrar mais fácil também.
Para o segundo exemplo, eu criei keyframes girando para o lado direito e esquerdo (`spin-right` e `spin-left`) e de acordo com o elemento, eu coloquei tempos diferentes, para que assim as rotações não ficassem tão embaralhadas e dessem um aspecto mais legal.
## Conclusão
Bom, com esse post, acho que fica claro em como é fácil animar o SVG usando só CSS puro. Se você tiver curiosidade, aconselho a ver outros vários exemplos muito bacanas sobre.
Na awesome tem em [Experimentos](https://github.com/willianjusten/awesome-svg/blob/master/topics/Experiments.md) e para se aprofundar ainda mais sobre o assunto também temos [Animations](https://github.com/willianjusten/awesome-svg/blob/master/topics/Animation.md) lá na awesome.
================================================
FILE: posts/animando-svg-com-smil.md
================================================
---
layout: post
date: 2015-07-22T00:55:02.000Z
title: "#13 - Animando SVG com SMIL"
description: Aprenda a criar animações usando só SVG e nada mais!
main-class: svg
tags:
- svg
- smil
- tutorial
categories:
- O mundo mágico do SVG
---
## Introdução
Enquanto escrevo esse post vou ouvindo [Deftones](https://open.spotify.com/artist/6Ghvu1VvMGScGpOUJBAHNH), mudar para um som mais pesado para animar um pouco.
Já faz um tempinho que não escrevia sobre SVG, então vou dar uma quebra nos outros posts e voltar a falar um pouquinho sobre. Se você ainda não conhece SVG sai daqui, dá uma olhadinha na [série](https://willianjusten.com.br/series/) que eu escrevo nesse blog.
Esse post foi baseado num apanhado de informações de vários cantos:
- [Guide SVG Animation Smil](https://css-tricks.com/guide-svg-animations-smil/)
- [Three ways animate svg](https://css-tricks.com/video-screencasts/135-three-ways-animate-svg/)
- [How SVG Shape Morphing Works](https://css-tricks.com/svg-shape-morphing-works/)
## Animações
Não é de hoje que animações são as queridinhas nos sites e apps, seja pela melhoria em algum aspecto na usabilidade, seja pela beleza que a animação pode proporcionar.
O SVG é tão incrível que permite vários tipos de animações, já falei sobre [animações usando css](https://willianjusten.com.br/animacoes-em-svg-com-css/) e agora irei falar sobre um tipo específico do SVG, que é a animação usando SMIL.
## Mas o que é SMIL? É de comer?
[SMIL](http://www.w3.org/TR/2001/REC-smil-animation-20010904/) ou **S**ynchronized **M**ultimedia **I**ntegration **L**anguage é uma linguagem baseada em XML que permite escrever interações para os elementos. A sua sintaxe é basicamente representada pelos tempos de animações, mudanças dos elementos e inicializações dos comportamentos.
**Obs.:** funciona em todos os browsers exceto IE [caniuse](http://caniuse.com/#feat=svg-smil)
## Por que usar esse treco aí?
A animação em SMIL é [declarativa](https://www.html5rocks.com/en/tutorials/speed/high-performance-animations/#toc-imperative-declarative), ou seja, você declara transições e estados para os elementos. A vantagem é que os browsers podem otimizar esse tipo de animação, não pesando tanto na renderização. A grande desvantagem de animações declarativas é que, em geral, elas não são tem tanto poder e não fazem tantas coisas. Eis que o SMIL brilha, ele tem a facilidade e otimização que o CSS permite com o poder de manipulação que só o JS teria.
Como o SMIL é mais poderoso, ele permite animar propriedades que o CSS não conseguiria, como, por exemplo, as formas das Paths.
Outra coisa bastante bacana é que animações feita em SMIL funcionam até mesmo quando o SVG é inserido na tag `img`! =)
E também conseguimos manipular as animações com eventos! Convencido?
## Comandos básicos
Assim como as diferentes tags que o SVG possui para suas formas, ele também possui algumas poucas tags para realizar essas animações, que são:
- ``: permite animar atributos e propriedades num determinado período de tempo.
- ``: usado para animar a transformação dos atributos num período de tempo.
- ``: usado também como um "shorthand" para o `animate`, é útil para definir valores não numéricos para animação e propriedades, como a propriedade de `visibility`.
### Sintaxe
```html
```
Para o `animate` temos os principais atributos:
- `attributeName`: o atributo do qual iremos alterar, pode ser um `fill` ou `points` de um `path`.
- `from`: de onde se inicia.
- `to`: para onde vai a animação.
- `dur`: a duração da animação.
- `begin`: é a "trigger" de inicialização da animação. Podemos colocar como `click` para dizer que só inicia com um click ou podemos colocar como `begin=2s`, onde dizemos que a animação só irá começar 2s depois de ter carregado.
- `fill`: não confunda com preenchimento, esse atributo serve para dizer se a animação deve parar em seu estado final (`freeze`) ou a animação ser removida quando alcançar o estado final (`remove`).
- `repeatCount`: como o nome já diz a quantidade de vezes que a animação vai repetir, se quiser que seja infinito, basta usar `indefinite`.
- `repeatDur`: marca o tempo de duração da repetição, a notação é conforme relógio normal, exemplo, `1:30` significa 1 minuto e 30 segundos.
### Modos de uso
Existem duas formas de se aplicar animações, que são:
#### Especificando um target
```html
```
#### Aninhando dentro do elemento
```html
```
Um outro detalhe muito importante é que para cada `animate` só podemos animar um atributo principal, que é determinado pelo `attributeName`. Portanto se quisermos fazer 2 tipos diferentes de animação, iremos precisar de 2 elementos `animate` para cada atributo.
### Exemplo
```html
```
No exemplo acima, determinamos que vamos alterar o atributo `cx` do círculo, ou seja, sua posição no `eixo x`, passando de `50` para `450`, com a duração de `1s` após haver o `click` e tendo animação finalizada pelo `freeze` ao final da movimentação.
Segue abaixo um exemplo da mudança de posição e de cor, note que utilizamos 2 `animate`:
## Controlando animações com keyTimes e values
Assim como nos keyframes do css, no SMIL também podemos criar um conjunto de valores e tempos para criar a animação da forma que desejarmos.
Segue um exemplo utilizando:
```html
values="50; 490; 350; 450" keyTimes="0; 0.5; 0.8; 1"
```
Como pode perceber, no tempo `0` o círculo está na posição `50`, aos `0.5` é onde ele vai mais longe, `490`, depois ele retorna para `350` e então avança para `450`, exatamente como os valores informados. Sempre obedecendo a proporção de uma mudança para um tempo.
## Mudando as formas de uma path
Como disse no início do post, a vantagem do SMIL é poder manipular propriedades que o CSS não muda, como, por exemplo a forma de um path.
Vamos pensar num primeiro exemplo, onde queremos transformar um quadrado em um círculo.
Nós iremos trabalhar no `attributeName=d`, que é onde desenhamos a path e teremos 2 passos, `from`, que contém a forma de um quadrado e o `to`, que contém a forma de um círculo, definimos um tempo para a animação ocorrer e pronto, a mágica acontece.
Agora vamos pensar numa situação em que eu tenho um quadrado virando um triângulo e este virando um círculo, ou seja, 3 etapas. Para trabalhar com mais de uma etapa, basta definir mais valores dentro de `values` e casos queiramos mudar o tempo de acordo com a mudança, podemos usar o `keyTimes`. Segue um exemplo dessa transição:
Mas e se eu quisesse além de mudar os 3 visuais, também quisesse mudar de cor? Basta adicionar mais um animate, passando os `values` do `attributeName=fill`. Segue um exemplo colorido:
## Aplicação prática em UX
Pow Willian, isso tudo aí é muito legal, muito maneiro, mas não vejo utilidade nenhuma nisso aí. Onde eu poderia aplicar um treco desses no meu site?
Podemos, por exemplo, aplicar uma mudança de um ícone para dar um feedback para o usuário. Segue um botão seguindo esse tipo de interação:
As animações realizadas para o botão acima ficam separadas em:
- Transformar no check
- Mudar para cor verde
- Transformar na estrela
- Mudar para cor amarela
Para cada uma dessas animações utilizamos a tag `animate` sempre definindo o `to`, que significa para onde estamos transformando. O JS utilizado no exemplo é só para adicionar o textinho (salvar -> salvo!) e iniciar as animações. Mas lembramos que podemos utilizar o `begin=click` para fazer esse tipo de trigger para inicialização.
## Conclusão
Bom pessoal, esse post serviu para mostrar mais uma habilidade exclusiva e super interessante que o SVG possui. Lembre-se que animações para conseguir melhorar a usabilidade do usuário são sempre boas adições e o SVG pode te prover isso muito bem. Existem muitas coisas sobre SMIL, portanto não fique somente neste post e busque ainda mais informação, qualquer coisa, também pergunte nos comentários.
================================================
FILE: posts/ano-novo-blog-novo.md
================================================
---
layout: post
date: 2016-01-01T16:00:59.000Z
title: Ano novo, blog novo
description: Nada melhor que começar o ano com novidades né? Para isso, preparei
um novo visual para blog, espero que gostem e todo feedback é bem vindo!
main-class: misc
tags:
- frontend
- dev
- theme
- jekyll
categories: null
---
## Introdução
Faaaaaaaala pessoal, primeiro de tudo, um Feliz 2016 para todos! Que grandes coisas aconteçam para todos e que seja um ano de muitos projetos, crescimentos pessoais e profissionais. Queria também agradecer o carinho de vários de vocês =)
Vou ouvindo uma playlist super super calma chamada [ChillStep](https://open.spotify.com/user/kent1337/playlist/6IjDl5eRczFdgZkKYXhuHZ) enquanto escrevo esse post, mas na criação desse novo visual, eu ouvi muito as [playlists comemorativas de Star Wars](https://open.spotify.com/user/official_star_wars), em especial a do [Finn](https://open.spotify.com/user/official_star_wars/playlist/6v62GOY5tiFfIwkhOHMwS5), que é composta de Indies, minha paixão <3
Bom, como eu havia falado no [post passado](https://willianjusten.com.br/meu-ano-de-2015/), eu estava preparando um visual novo para o site e esse post vai servir para falar um pouco desse processo, minhas viagens em busca do novo visual, algumas coisas que necessariamente precisavam ter, outras que eu queria manter, enfim, uma salada mista de inspirações e a concepção de fato.
Eu sempre fui uma pessoa muito curiosa para saber como certos designs foram pensados e criados, então acho que esse meu post vai servir para essas pessoas curiosas assim como eu.
## Blog antigo
O Blog anterior se destacava pela simplicidade nos elementos e cores, tendo como o maior destaque o `azulão` escolhido para estampar os grandes headers do blog. O azul ficou tão "forte" na cabeça de algumas pessoas, que teve gente que chamava até de "garoto do blog azul" né ahuahua

E os posts também ocupavam uma área relativamente grande, com a data num destaque muito grande.

### Características Básicas
- Usava fonte [Open Sans](https://www.google.com/fonts/specimen/Open+Sans) bold para títulos e light para os textos
- As cores eram azul(`#0562DC`), branco para elementos em contraste com o azul e para os textos um cinza grafite(`#333333`)
- Minimalismo acima de tudo, então pouca coisa na tela
- Mobile-first
- Bastante leve, **menos de 80Kb** no primeiro load!
- Site estático escrito em [Jekyll](https://jekyllrb.com/) e hospedado no [Github Pages](https://pages.github.com/)
- Css feito usando [Stylus](http://stylus-lang.com/) `<3`
- Gulp para fazer processamento dos assets, livereload e build
Se quiser saber um pouco mais da construção dele, tem os posts [Making of - Parte 1](https://willianjusten.com.br/making-of-parte-1/) e [Making of - Parte 2](https://willianjusten.com.br/making-of-parte-2/)
## Blog Novo
Tendo já as características do blog antigo, algumas coisas eu decidi permanecer, como o uso do Jekyll, Gulp e Stylus. Ele agora tinha de seguir as seguintes regras também:
- Continuar sendo leve
- Clean e com cores mais flat (o azul era legal, mas muito intenso)
- Fácil de achar os artigos
- Entregar mais informação já de primeira
- Mais organizado
### Desenhos!
Tendo mais ou menos uma ideia das características, eu sempre faço uns rabiscos bem vagabundos disso, eu ainda sou daqueles que funciona bem colocando coisas no papel e no quadro.
**Ps.:** não sou designer, então não espere nada bom ahuahuahua

Meu processo de desenvolvimento é fazer os wireframes no papel e já converter em código, nada de Photoshop, Illustrator ou etc. Até porque não tenho paciência... Então, em posse de alguns desenhos, eu comecei já a desenvolver os componentes.
Como você pode ver pelos desenhos e pelo oficial, muita coisa mudou! E é para ser assim mesmo, experimentações são importantes. Eu vou detalhar os novos elementos e o que eu pensei para cada um deles nascer.
### Criação de Tarefas

Para otimizar meu tempo e organizar as ideias da cabeça, eu gosto de trabalhar com método de Kanban, tendo pequenas tarefinhas a fazer. Então a primeira coisa que eu fiz depois de pensar no layout, foi separar tarefa por tarefa. Com as tarefas em mãos, comecei o trabalho nos componentes!
### Header Fixo
Como um dos objetivos era já mostrar informação desde o início, não cabia mais ter um header enorme só com meu nome. Para isso, imaginei um header/navbar bem simples, em que contivesse meu nome e os elementos de menu e search. Só que como meu nome é relativamente grande, para que nada quebrasse em dispositivos mobiles, eu resolvi usar só as iniciais do meu nome em resoluções menores, ficando assim:

Para fazer isso foi bastante simples, eu usei o seletor `:after` no meu link `a`, para adicionar conteúdos diferentes de acordo com a resolução.
```stylus
&:after
transition all .4s
content '> WJ'
+above(cut)
content '> Willian Justen'
```
O código está em `Stylus` e aquele comando `+above(cut)` é uma feature do [Rupture](https://jescalan.github.io/rupture/), que ajuda bastante para trabalhar com media-queries sem ter que escrever muita coisa.
### Cards de Post

Como o objetivo era entregar mais conteúdo de uma vez só e ter mais organização, resolvi remover aquela lista, que entregava só 3 posts numa tela com resolução alta, por cards de 3 em 3, assim, no mesmo espaço de tela, eu consigo entregar **9 posts!**
#### Anotomia do Card

Talvez um dos elementos que eu mais fui modificando com o tempo, mas que curti o resultado final. Dentro do card temos o básico, que são `data`, `título`, `descrição` e `tags`. Mas para facilitar a organização das coisas, resolvi criar a `categoria principal`, que no caso do card acima é `Miscelânia`. Cada categoria também tem sua cor principal, que é responsável por mudar **TODOS** os elementos do site para a cor em questão.
Exato, se você entrou no blog por essa página, você está vendo tudo `verde`, devido a categoria em que o post está, mas se fosse um post de outra categoria, todas as cores também iriam mudar.
#### Mobile-first para os cards
Desde o primeiro blog, o objetivo foi entregar a melhor experiência para qualquer tipo de tela, com isso, tudo foi pensado no Mobile-first. Para isso, eu utilizei `flexbox` na construção dos cards, para que eles ficassem assim:

Para ter isso, foi tão fácil, que tenho até vergonha de falar, já que eu pensava que `flexbox` era mais difícil e talz. Mas as linhas foram:
```stylus
.flex-grid
display flex
flex-flow row wrap
.box-item
flex 1 0 300px
```
O `.flex-grid` foi responsável só para ser o container `flex` dos cards, utilizando a propriedade `display flex`. Já o `flex-flow row wrap`, serve para dizer a `direction` dos elementos, no caso em coluna e o `wrap` para dizer como eles vão se comportar empilhando e diminuindo/aumentando.
Já no `.box-item`, eu defino que eles terão o `flex-basis` no valor de `300px`, o valor `1` é para o `flex-grow`, assim eu digo para que os elementos ocupem todo os espaço que puderem e se comportem igualitariamente.
Se você quiser entender mais de `flexbox`, acesse os seguintes links:
- [A guide to Flexbox by Css-tricks](https://css-tricks.com/snippets/css/a-guide-to-flexbox/)
- [Awesome Flexbox by Afonse Pacifer](https://github.com/afonsopacifer/awesome-flexbox)
- [Flexbox Froggy](http://flexboxfroggy.com/)
#### Interação no Scroll
Para os cards não aparecem "duros" no scroll, eu resolvi aplicar uma leve animação neles. Essa animação foi inspirada nesse [post do Codrops](http://tympanus.net/codrops/2013/07/02/loading-effects-for-grid-items-with-css-animations/), lá eles utilizam o Masonry e coisinhas a mais, o que eu precisava era só a interação no scroll, então fiz minhas devidas modificações.
Eu ia fazer um gif mostrando a animação, mas acho que é melhor você testar por si, vai lá na [Home](https://willianjusten.com.br), faça o scroll e veja por si mesmo =p
### Organização
Uma das tarefas era essa, organizar mais o meu blog, para que tantos os novatos do blog, quanto os mais antigos, conseguissem saber logo de cara qual seria o assunto em destaque abordado e também para que pudesse filtrar por aquilo que realmente lhe interessam.
Pensando nisso, eu criei algumas categorias como:
- `jekyll`: como esse post é feito nele e eu já comentei algumas dele, nada mais justo que ter sua categoria própria. A cor dele é vermelho.
- `css`: que blog de frontend seria sem o css? Sua cor é um azul esverdeado.
- `svg`: preciso dizer algo sobre? Sua cor é roxo
- `js`: outro tópico indispensável para front, sua cor é o amarelo da linguagem.
- `html`: para falar sobre coisas mais simples, como estrutura, semântica, a API do html5, entre outros. Sua cor é o laranja.
- `dev`: essa categoria é para abordar temas mais abertos de programação como ter domínio próprio em github, testes, etc. Sua cor é o cinza.
- `misc`: miscelânia, como o nome já diz, é um conjunto de tudo, que pode abordar tanto coisas de programação, como links da semana, novidades do blog, coisas off-topic, enfim, todo o resto. Sua cor é o verde.
Para acessar qualquer uma das categorias em específico, basta clicar no `ribbon` no canto superior do card, segue exemplo da [página de js](https://willianjusten.com.br/category/js).
### Página de Post
Talvez a página que menos mudou, mas também mudou! Ela agora possui o header fixo que vem da home, já com as cores devidamente modificadas. O header ganha a cor de sua categoria principal e a fonte agora possui uma leve sombra flat e já não é mais Uppercase.

Todas os destaques de texto também passam a receber a cor da categoria, além dos links mudarem para agora uma borda `dashed`, com um hover background suave.

## Cores (Update)
Para que as categorias tivessem suas respectivas cores, eu fiz o seguinte, separei todos os elementos de cor num arquivo chamado [_theme-colors.styl](https://github.com/willianjusten/willianjusten.github.io/blob/master/src/styl/_theme-colors.styl), criei um objeto tendo `categoria-cor` e então iterei a partir de um elemento pai, para que ele fosse modificando todas as cores.
Segue um trecho do arquivo de cores:
```stylus
/* Aqui eu defino os temas e cores */
themes = {
post-jekyll: #B31917,
post-css: #2DA0C3,
post-js: #D6BA32,
post-html: #EB7728,
post-svg: #7D669E,
post-dev: #637a91,
post-misc: #7AAB13
}
/* aqui eu faço a iteração, tendo o elemento pai
o nome do tema */
for theme, category-color in themes
.{theme}
.title-category
color category-color
.post-content
h1,h2,h3,h4
color category-color
a
color category-color
border-bottom 2px dashed category-color
&:hover
background-color category-color
color #fff
strong
color category-color
p,
li
code
color category-color
blockquote
border-left .313rem solid category-color
```
## Conclusão
Bom pessoal, esse é o visual do Blog 2016, espero que tenham gostado, peço feedback de todos para saber o que posso melhorar ou até se odiaram o novo visual e querem que eu volte para o antigo mas eu não volto não =p
================================================
FILE: posts/atomic-design-no-svg.md
================================================
---
layout: post
date: 2015-01-22T12:00:00.000Z
title: "#5 - Atomic Design no SVG - g, use, defs, symbol"
description: Neste artigo iremos saber mais sobre a estruturação de um SVG, seus
elementos, suas vantagens e um pouco de Atomic Design.
main-class: svg
tags:
- svg
- tutorial
categories:
- O mundo mágico do SVG
---
## Índice da série
* [#1 - Por que usar SVG?](https://willianjusten.com.br/por-que-usar-svg/)
* [#2 - Como usar SVG](https://willianjusten.com.br/como-usar-svg/)
* [#3 - Onde Baixar SVG](https://willianjusten.com.br/onde-baixar-svg/)
* [#4 - A Estrutura do SVG](https://willianjusten.com.br/a-estrutura-do-svg/)
## Introdução
Primeiro de tudo, aviso que o início deste post será praticamente uma tradução adaptada desse [incrivel post](http://sarasoueidan.com/blog/structuring-grouping-referencing-in-svg/) da [Sara Soueidan](https://sarasoueidan.com/about/), que escreveu tão bem essa parte, que não vi justificativas plausíveis para escrever de outra forma. Claro que tentarei ser um pouco mais simplista com as palavras, para facilitar o entendimento de todos.
Ps.: não é preguiça, é porque acho essa mulher incrível e sou mega fã das grandes contribuições em SVG que ela traz <3
Neste post iremos abordar os elementos que dão uma melhor estruturação ao SVG, nos permitindo agrupar e referenciar partes do SVG dentro do documento, conferindo um código mais limpo, de melhor manutenção e com um código mais legível. É muito importante que prestem atenção a este assunto, já que ele contém a base principal para tudo que será feito e utilizado depois. Começarei utilizando o artigo da Sara como base e finalizarei divagando sobre um conceito que eu venho pensado bastante.
## Agrupando com o elemento ``
O `` vem da palavra *group*. Esse elemento serve para agrupar um conjunto de outros elementos relacionados. Em termos de editores gráficos, como o Adobe Illustrator, o elemento `` tem uma função similar a opção de agrupar objetos. Você também pode pensar no *group* num conceito similar a uma camada nos editores gráficos, visto que a camada é só um grupo de elementos.
O elemento `` agrupa todos os seus descendentes em um só grupo, mesmo que exista outro elemento `` interno a ele. É comum possuir uma `id` para dar nome a todo um grupo e qualquer estilo que for aplicado ao elemento `` será aplicado em seus elementos internos. Isto torna fácil a adição de estilos, transformações, interatividades e até animações em um grupo inteiro de objetos.
Por exemplo, o seguinte pássaro é feito de algumas formas, como `` e ``.

Se você quiser mover o pássaro inteiro de um lugar para o outro no Illustrator, você também irá querer agrupar todos os elementos juntos, para não ter que selecionar cada parte toda vez que quiser mover.

Agrupar elementos no SVG funcionam da mesma maneira. Neste exemplo, nós agrupamos os elementos do corpo, os elementos da cabeça e então unimos os dois grupos em um grupo com a `id` igual a `bird`.
```html
```
Se você muda a cor de preenchimento do grupo `#body`, a cor de preenchimento de todos os elementos dentro do grupos irão mudar para a cor escolhida. Isto é muito conveniente.
Agrupar elementos é muito útil, não só para própositos organizacionais ou estruturais. É particularmente útil quando você quer adicionar interatividade ou transformações em um gráfico SVG feito de muito elementos. Você pode associar estes elementos em um grupo e definir transformações para mover, redimensionar ou rotacionar todos os elementos juntos, dessa forma as relações espaciais de um para o outro se mantém.
Se você quiser redimensionar o pássaro para duas vezes o seu tamanho, você poderá fazer isso com uma linha de CSS se todos os elementos estiverem no mesmo grupo.
```css
#bird {
transform: scale(2);
}
```
Agrupar faz a interatividade, em particular, mais conveniente. Você pode colocar eventos de mouse para todo o pássaro e ter a resposta a esses eventos em todo grupo.
O elemento `` tem mais uma importante característica: ele pode ser o seu próprio `` e ``, que ajudam na acessibilidade aos leitores de tela, e sobretudo faz o código mais legível para os humanos. Por exemplo:
```html
PássaroA imagem de um pequeno e fofo pássaro verde com o bico laranja.
```
## Reutilizando Elementos com o `