SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Entendendo um
pouco melhor o que
é Ruby
Antes de tudo….Por que aprender a
programar?
❖

Salários altos comparado a outras áreas (mas baixos em
comparação a outros países)

❖

É mais fácil conseguir empregos remotos

❖

Aprendizagem constante

❖

Desafios diários

❖

Divertido
O que é Ruby?
❖

Criada por Yukihiro Matsumoto

❖

Ideia concebida em 24 de fevereiro de 1993

❖

Versão 1.0 lançada em 25 de dezembro de 1996

❖

Última versão estável (até 29/11/2013) é a 2.0.0-p353

❖

Orientada a objeto

❖

Inspirada no Perl e Python

❖

Open-Source
Porque programar em Ruby?
❖

A simplicidade da linguagem afeta diretamente a produtividade diária do
desenvolvedor

❖

Linguagem de fácil leitura

❖

Tudo é um objeto

❖

Interactive Shell. Os comandos podem ser testados direto em terminal, sem
necessidade de escrever e “compilar" código para ver se deu certo

❖

Comunidade tem o instinto de ajuda, e é fácil conseguir soluções bem elaboradas

❖

Na versão 1.9+ o Ruby ganhou uma máquina virtual chamada YARV (Yet Another
Ruby Virtual Machine) que proporcionou grande aumento de performance
Porque programar em Ruby?
Exemplo de método (fig.1) e classe
(fig.2)
fig.1

fig.2
Interesting Ruby
❖

Em Ruby você não precisa declarar o tipo de variável
explicitamente

❖

O uso de Meta-programação é fácil e faz parte da proposta
da linguagem

❖

Sobre-escrever métodos é fácil

❖

Sem getter e setters escritos manualmente

❖

Parêntese é opcional

❖

Monkey Patch é de fácil implementação
Interesting Ruby
Eu não preciso criar setter e getters manualmente, pois o Ruby já tem
métodos prontos no core da linguagem que fazem toda essa parte, bastante
apenas eu passar um “Symbol”, que seria o “:velocity” e ele cria um getter e
um setter para o meu atributo “velocity”, bastante apenas depois eu colocar
“Car.velocity = 10”, no caso do setter, e “Car.velocity #=> 10” no caso do
getter para ele exibir o valor que eu ordenei.
Interesting Ruby
Caso eu precise de um método que faz a mesma coisa, só que com nomes
diferentes, existem meta-métodos que servem exatamente para a escrita de
meta-programação, e que auxiliam isso por padrão. Um exemplo é o método
“define_method”, que como o próprio nome já diz “defina_método”.
GEMs
❖

Abstraem funcionalidades básicas da aplicação para pedaços
separados, podendo assim serem usados em qualquer novo projeto
sem ter que duplicar código manualmente

❖

Ajudam a comunidade proporcionando funcionalidades que são
úteis a mais de uma pessoa

❖

Criar GEMs ajudam no entendimento de como Ruby funciona e
como implementar meta-programação

❖

São em geral GRATUITAS, apenas sendo pagas em casos muito
específicos relacionadas a regras de negócio de um cliente, por
exemplo
Exemplo de um arquivo
Gemfile
Mas afinal, o que podemos fazer
com Ruby?
❖

Cálculos complexos

❖

Scripts de teste

❖

Importação de dados para Bancos de Dados

❖

Automatização de tarefas

❖

Outras linguagens (Frameworks, assim como o Rails)

❖

APIs

❖

Parser de logs

❖

Trabalhar com protocolos diversos

❖

Ler e escrever arquivos em diversos formatos
Mas afinal, o que podemos fazer
com Ruby?
Convenções e Boas Práticas
❖

Existe uma série de guias de como escrever código Ruby e de
como organizá-lo para que outras pessoas entendam o que você
quis dizer com aquilo.

❖

Como
saber
se
estou
Guidelines Plataformatec

❖

Sou obrigado a seguir um guia? Não, você não é, mas isso
implica seriamente em qualidade de código e com a
comunidade, pois uma GEM mal escrita ou código mal escrito
afeta a produtividade de outra pessoa ou até mesmo da
comunidade inteira

usando

boas

práticas?
Testes? Ein?
❖

Todo o código Ruby pode ser escrito acompanhado de testes, para
que mesmo que você modifique o código no futuro, você saiba se ele
ainda serve para o propósito o qual ele foi escrito, garantindo assim
que seu projeto não sofra por falhas

❖

Existem diversas DSLs (Domain specific language) que são usadas
para isso. No caso do Ruby on Rails o mais usado é o RSpec

❖

Existe boas práticas para testes? Sim, existem, para o RSpec em sí
existe isso aqui >> Better Spec (For RSpec). Cada DSL pode ter seu
próprio padrão de projeto e dai cabe a cada comunidade
desenvolver suas próprias boas práticas
Testes? Ein?
Exemplo de um arquivo de "spec" para um Modelo do Framework Ruby on Rails
usando-se o RSpec como DSL de teste. No caso abaixo está sendo validada a presença
obrigatória dos atributos “user_id, video_id e note”. Logo mais abaixo, nas linhas 11 e
12 ele confere se existe uma relação entre a “avaliação (Avaliation)” e os modelos de
“usuário(user)” e "video"
O que diferencia um bom Rubysta de um mal
Rubysta?

❖

Não fazer testes

❖

Não usar boas práticas

❖

Não ajudar a comunidade

❖

Criar GEMs fechadas
That’s all Folks o/

❖

twitter.com/patrickemuller

❖

fb.com/patrick.miiller

❖

github.com/mpatrick

Weitere ähnliche Inhalte

Was ist angesagt?

Contribuindo e criando software livre
Contribuindo e criando software livreContribuindo e criando software livre
Contribuindo e criando software livreVitor Mattos
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Adler Medrado
 
Composer dependency manager
Composer   dependency managerComposer   dependency manager
Composer dependency managerVitor Mattos
 
Composer para Gestão de Dependências - Encontro PHP - Season
Composer para Gestão de Dependências - Encontro PHP - SeasonComposer para Gestão de Dependências - Encontro PHP - Season
Composer para Gestão de Dependências - Encontro PHP - SeasonRogerio Prado de Jesus
 
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoDevops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoThiago Ferreira
 
Engenharia rever sa mentebinaria
Engenharia rever sa   mentebinariaEngenharia rever sa   mentebinaria
Engenharia rever sa mentebinariaPatrese Renan
 
Gerenciamento de dependências em PHP com o Composer
Gerenciamento de dependências em PHP com o ComposerGerenciamento de dependências em PHP com o Composer
Gerenciamento de dependências em PHP com o ComposerAndre Cardoso
 
gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?Yago Tomé
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à práticaMario Guedes
 
Vagrant - ambiente de desenvolvimento virtualizado
Vagrant - ambiente de desenvolvimento virtualizadoVagrant - ambiente de desenvolvimento virtualizado
Vagrant - ambiente de desenvolvimento virtualizadoVinícius Krolow
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometemFernando Henriques
 
Defenda seus consumidores
Defenda seus consumidoresDefenda seus consumidores
Defenda seus consumidoresMarcelo Serpa
 

Was ist angesagt? (20)

Contribuindo e criando software livre
Contribuindo e criando software livreContribuindo e criando software livre
Contribuindo e criando software livre
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Composer dependency manager
Composer   dependency managerComposer   dependency manager
Composer dependency manager
 
Composer para Gestão de Dependências - Encontro PHP - Season
Composer para Gestão de Dependências - Encontro PHP - SeasonComposer para Gestão de Dependências - Encontro PHP - Season
Composer para Gestão de Dependências - Encontro PHP - Season
 
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimentoDevops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
Devops CI/CD: Obtendo qualidade de vida para o time de desenvolvimento
 
Engenharia rever sa mentebinaria
Engenharia rever sa   mentebinariaEngenharia rever sa   mentebinaria
Engenharia rever sa mentebinaria
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
Gerenciamento de dependências em PHP com o Composer
Gerenciamento de dependências em PHP com o ComposerGerenciamento de dependências em PHP com o Composer
Gerenciamento de dependências em PHP com o Composer
 
gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
Frameworks PHP
Frameworks PHPFrameworks PHP
Frameworks PHP
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à prática
 
Vagrant - ambiente de desenvolvimento virtualizado
Vagrant - ambiente de desenvolvimento virtualizadoVagrant - ambiente de desenvolvimento virtualizado
Vagrant - ambiente de desenvolvimento virtualizado
 
Be React. Do Tests!
Be React. Do Tests!Be React. Do Tests!
Be React. Do Tests!
 
9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem9 erros que desenvolvedores Node.js cometem
9 erros que desenvolvedores Node.js cometem
 
Defenda seus consumidores
Defenda seus consumidoresDefenda seus consumidores
Defenda seus consumidores
 

Ähnlich wie Entendendo um pouco melhor o que é Ruby

#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreamsJacqueline Abreu
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu clienteRodrigo Urubatan
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout  Tempo Real Eventos - Nodejs - Os Primeiros PassosHangout  Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout Tempo Real Eventos - Nodejs - Os Primeiros PassosJackson F. de A. Mafra
 
Ruby on Rails e o Mercado
Ruby on Rails e o MercadoRuby on Rails e o Mercado
Ruby on Rails e o MercadoJulio Monteiro
 
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaRuby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaWomen Techmakers João Pessoa
 
Do alto para o baixo nível - Entendendo as Diferenças
Do alto para o baixo nível - Entendendo as DiferençasDo alto para o baixo nível - Entendendo as Diferenças
Do alto para o baixo nível - Entendendo as DiferençasWelington Sampaio
 
Programação funcional que funciona
Programação funcional que funcionaProgramação funcional que funciona
Programação funcional que funcionaRodrigo Serradura
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimentamichel adriano medeiros
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsVinicius Reis
 
Ruby On Rails - Porque Utilizar?
Ruby On Rails - Porque Utilizar?Ruby On Rails - Porque Utilizar?
Ruby On Rails - Porque Utilizar?David Ruiz
 
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Renato Groff
 
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018Renato Groff
 
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Renato Groff
 
C a linguagem de programação
C   a linguagem de programaçãoC   a linguagem de programação
C a linguagem de programaçãoAndrei Bastos
 

Ähnlich wie Entendendo um pouco melhor o que é Ruby (20)

#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
 
Ruby
RubyRuby
Ruby
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout  Tempo Real Eventos - Nodejs - Os Primeiros PassosHangout  Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
 
Ruby on rails porque usar rails?!
Ruby on rails   porque usar rails?!Ruby on rails   porque usar rails?!
Ruby on rails porque usar rails?!
 
Ruby on Rails e o Mercado
Ruby on Rails e o MercadoRuby on Rails e o Mercado
Ruby on Rails e o Mercado
 
Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
 
Ruby and Rails
Ruby and RailsRuby and Rails
Ruby and Rails
 
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João PessoaRuby: Simples e Expressivo - Women Techmakers João Pessoa
Ruby: Simples e Expressivo - Women Techmakers João Pessoa
 
Do alto para o baixo nível - Entendendo as Diferenças
Do alto para o baixo nível - Entendendo as DiferençasDo alto para o baixo nível - Entendendo as Diferenças
Do alto para o baixo nível - Entendendo as Diferenças
 
Programação funcional que funciona
Programação funcional que funcionaProgramação funcional que funciona
Programação funcional que funciona
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
 
Ruby e Rails
Ruby e RailsRuby e Rails
Ruby e Rails
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 
Ruby On Rails - Porque Utilizar?
Ruby On Rails - Porque Utilizar?Ruby On Rails - Porque Utilizar?
Ruby On Rails - Porque Utilizar?
 
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
 
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018
Docker + Bancos de Dados: isto é possível? - Databases SP - Março-2018
 
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
 
C a linguagem de programação
C   a linguagem de programaçãoC   a linguagem de programação
C a linguagem de programação
 

Entendendo um pouco melhor o que é Ruby

  • 2. Antes de tudo….Por que aprender a programar? ❖ Salários altos comparado a outras áreas (mas baixos em comparação a outros países) ❖ É mais fácil conseguir empregos remotos ❖ Aprendizagem constante ❖ Desafios diários ❖ Divertido
  • 3. O que é Ruby? ❖ Criada por Yukihiro Matsumoto ❖ Ideia concebida em 24 de fevereiro de 1993 ❖ Versão 1.0 lançada em 25 de dezembro de 1996 ❖ Última versão estável (até 29/11/2013) é a 2.0.0-p353 ❖ Orientada a objeto ❖ Inspirada no Perl e Python ❖ Open-Source
  • 4. Porque programar em Ruby? ❖ A simplicidade da linguagem afeta diretamente a produtividade diária do desenvolvedor ❖ Linguagem de fácil leitura ❖ Tudo é um objeto ❖ Interactive Shell. Os comandos podem ser testados direto em terminal, sem necessidade de escrever e “compilar" código para ver se deu certo ❖ Comunidade tem o instinto de ajuda, e é fácil conseguir soluções bem elaboradas ❖ Na versão 1.9+ o Ruby ganhou uma máquina virtual chamada YARV (Yet Another Ruby Virtual Machine) que proporcionou grande aumento de performance
  • 5. Porque programar em Ruby? Exemplo de método (fig.1) e classe (fig.2) fig.1 fig.2
  • 6. Interesting Ruby ❖ Em Ruby você não precisa declarar o tipo de variável explicitamente ❖ O uso de Meta-programação é fácil e faz parte da proposta da linguagem ❖ Sobre-escrever métodos é fácil ❖ Sem getter e setters escritos manualmente ❖ Parêntese é opcional ❖ Monkey Patch é de fácil implementação
  • 7. Interesting Ruby Eu não preciso criar setter e getters manualmente, pois o Ruby já tem métodos prontos no core da linguagem que fazem toda essa parte, bastante apenas eu passar um “Symbol”, que seria o “:velocity” e ele cria um getter e um setter para o meu atributo “velocity”, bastante apenas depois eu colocar “Car.velocity = 10”, no caso do setter, e “Car.velocity #=> 10” no caso do getter para ele exibir o valor que eu ordenei.
  • 8. Interesting Ruby Caso eu precise de um método que faz a mesma coisa, só que com nomes diferentes, existem meta-métodos que servem exatamente para a escrita de meta-programação, e que auxiliam isso por padrão. Um exemplo é o método “define_method”, que como o próprio nome já diz “defina_método”.
  • 9. GEMs ❖ Abstraem funcionalidades básicas da aplicação para pedaços separados, podendo assim serem usados em qualquer novo projeto sem ter que duplicar código manualmente ❖ Ajudam a comunidade proporcionando funcionalidades que são úteis a mais de uma pessoa ❖ Criar GEMs ajudam no entendimento de como Ruby funciona e como implementar meta-programação ❖ São em geral GRATUITAS, apenas sendo pagas em casos muito específicos relacionadas a regras de negócio de um cliente, por exemplo
  • 10. Exemplo de um arquivo Gemfile
  • 11. Mas afinal, o que podemos fazer com Ruby? ❖ Cálculos complexos ❖ Scripts de teste ❖ Importação de dados para Bancos de Dados ❖ Automatização de tarefas ❖ Outras linguagens (Frameworks, assim como o Rails) ❖ APIs ❖ Parser de logs ❖ Trabalhar com protocolos diversos ❖ Ler e escrever arquivos em diversos formatos
  • 12. Mas afinal, o que podemos fazer com Ruby?
  • 13. Convenções e Boas Práticas ❖ Existe uma série de guias de como escrever código Ruby e de como organizá-lo para que outras pessoas entendam o que você quis dizer com aquilo. ❖ Como saber se estou Guidelines Plataformatec ❖ Sou obrigado a seguir um guia? Não, você não é, mas isso implica seriamente em qualidade de código e com a comunidade, pois uma GEM mal escrita ou código mal escrito afeta a produtividade de outra pessoa ou até mesmo da comunidade inteira usando boas práticas?
  • 14. Testes? Ein? ❖ Todo o código Ruby pode ser escrito acompanhado de testes, para que mesmo que você modifique o código no futuro, você saiba se ele ainda serve para o propósito o qual ele foi escrito, garantindo assim que seu projeto não sofra por falhas ❖ Existem diversas DSLs (Domain specific language) que são usadas para isso. No caso do Ruby on Rails o mais usado é o RSpec ❖ Existe boas práticas para testes? Sim, existem, para o RSpec em sí existe isso aqui >> Better Spec (For RSpec). Cada DSL pode ter seu próprio padrão de projeto e dai cabe a cada comunidade desenvolver suas próprias boas práticas
  • 15. Testes? Ein? Exemplo de um arquivo de "spec" para um Modelo do Framework Ruby on Rails usando-se o RSpec como DSL de teste. No caso abaixo está sendo validada a presença obrigatória dos atributos “user_id, video_id e note”. Logo mais abaixo, nas linhas 11 e 12 ele confere se existe uma relação entre a “avaliação (Avaliation)” e os modelos de “usuário(user)” e "video"
  • 16. O que diferencia um bom Rubysta de um mal Rubysta? ❖ Não fazer testes ❖ Não usar boas práticas ❖ Não ajudar a comunidade ❖ Criar GEMs fechadas
  • 17. That’s all Folks o/ ❖ twitter.com/patrickemuller ❖ fb.com/patrick.miiller ❖ github.com/mpatrick