SlideShare ist ein Scribd-Unternehmen logo
1 von 140
Downloaden Sie, um offline zu lesen
(Nunca) Ouvi falar de Rust…
Mas como eu faço um site?
1 . 1
Olá pessoal!
2 . 1
Se você nunca ouviu falar de Rust…
2 . 2
Vou contar o que é Rust
2 . 3
Vou contar como eu conheci Rust
2 . 4
E alguns problemas que a linguagem me ajudou
a resolver
2 . 5
Mas se você já ouviu falar…
2 . 6
Vou mostrar alguns passos para
seguir aprendendo
2 . 7
Em 2015
3 . 1
Comecei a me envolver com o deploy das
aplicações do meu projeto
3 . 2
NPM + Python + Java + Closure Compiler + SCons
+ RVM…
3 . 3
Eu queria uma maneira simples de executar
aplicações
3 . 4
Objetivo
1 arquivo binário e cross-plataforma
3 . 5
As opções
4 . 1
"Pra escrever binário tem que ser C?"
4 . 2
Rust foi uma das opções na minha busca por
alternativas
4 . 3
"Mas o que é Rust?"
4 . 4
Rust
Rust é uma linguagem de programação de
sistemas que roda incrivelmente rápido, previne
falhas de segmentação, e garante segurança
entre threads.
5 . 1
"É uma linguagem bem moderna,
com foco em baixo nível"
5 . 2
Uma linguagem com várias
características funcionais:
Imutável por padrão
Não tem null ou unde ned
Pattern-matching
Closures
Structs e Enums
5 . 3
O que me chamou atenção para seguir
aprendendo:
Gera binários
Cross-plataforma
Preocupação em boas mensagens de erro
Focado em baixo nível
Mas com uma experiência de linguagem de alto nível
Linguagem com investimento da Mozilla
5 . 4
Todas essas características criam um ambiente
ideal para avançar com segurança
Mozilla Quantum
5 . 5
"Por que escolheram criar
uma linguagem de baixo
nível?"
Qantas falhas podem acontecer em um
programa de baixo nível?
6 . 1
Bu erOver ow, Segmentation Fault,
Use After Free…
6 . 2
Rust tem um sistema de tipos que previne
diversos erros de gerenciamento de memória,
em tempo de compilação
6 . 3
Gerenciamento de memória sem
Garbage Collector
6 . 4
Exemplo do Rust previne
apenas com o compilador
Vamos ver um pouco de Rust
7 . 1
Playground
fn main() {
let data = vec!();
println!("Data", data);
}
7 . 2
error: argument never used
--> src/main.rs:3:22
|
3 | println!("Data", data);
| ^^^^
error: aborting due to previous error
7 . 3
Playground
fn main() {
let data = vec!();
println!("Data {}", data);
}
7 . 4
error[E0277]: the trait bound
`std::vec::Vec<_>: std::fmt::Display` is not satisfied
--> src/main.rs:3:25
|
|println!("Data {}", data);
| ^^^^
`std::vec::Vec<_>` cannot be formatted with the default
formatter; try using `:?` instead if you are using
a format string
|
= help: the trait `std::fmt::Display`
is not implemented for `std::vec::Vec<_>`
= note: required by `std::fmt::Display::fmt`
error: aborting due to previous error
7 . 5
^^^^ `std::vec::Vec<_>` cannot be formatted with the default
formatter; try using `:?` instead if you are using a
format string
7 . 6
Playground
fn main() {
let data = vec!();
println!("Data {:?}", data);
}
7 . 7
error[E0282]: type annotations needed
--> src/main.rs:2:16
|
2 | let data = vec!();
| ---- ^^^^^^ cannot infer type for `T`
| |
| consider giving `data` a type
|
error: aborting due to previous error
7 . 8
error[E0282]: type annotations needed
7 . 9
$ rustc --explain E0282
7 . 10
Playground
fn main() {
let data : Vec<char> = vec!();
println!("Data {:?}", data);
}
7 . 11
Data []
7 . 12
Imagine uma base de código bem
complexa
Código com threads
Processamento de imagens em paralelo
Coordenar muito acesso de I/O
7 . 13
Em resumo, imagine quão complexo um
navegador é por trás dos panos?
7 . 14
Existe algum problema neste código?
Playground
use std::thread;
use std::time::Duration;
fn main() {
let data = vec!();
thread::spawn(|| {
data.push('a');
});
thread::spawn(|| {
data.push('b');
});
thread::sleep(Duration::from_millis(50));
println!("Data {:?}", data);
}
7 . 15
Depois de vários ciclos de feedback na
compilação:
Não teremos acesso a memória já liberada
Teremos adicionado uma forma forma de evitar race
conditions
Nosso binário não terá esses problemas!
7 . 16
Playground
use std::thread;
use std::sync::{Arc, Mutex};
use std::time::Duration;
fn main() {
let data = Arc::new(Mutex::new(vec!()));
let writer = data.clone();
thread::spawn(move || {
let lock_result = writer.lock();
match lock_result {
Ok(mut locked_writer) => locked_writer.push('a'),
Err(_) => panic!("Could not acquire lock a"),
}
});
let writer = data.clone();
thread::spawn(move || {
let mut locked_writer = writer.lock().expect("Could not acquire lock b");
locked_writer.push('b');
});
thread::sleep(Duration::from_millis(50));
println!("Data {:?}", data);
}
7 . 17
Esse sistema de tipo traz novas
maneiras de expressar seu domínio
7 . 18
Que não conseguimos fazer em outras
linguagens mais conhecidas
7 . 19
Playground
#[derive(Debug)]
struct Pedido {
id: i32
}
fn novo_pedido() -> Pedido {
Pedido { id: 1 }
}
fn enviar_pedido(pedido: Pedido) {
// Código que envia o pedido
}
fn main() {
let pedido = novo_pedido();
enviar_pedido(pedido);
println!("Dados do pedido: {:?}", pedido);
}
7 . 20
error[E0382]: use of moved value: `pedido`
--> src/main.rs:18:39
|
16 | enviar_pedido(pedido);
| ------ value moved here
17 |
18 | println!("Dados do pedido: {:?}", pedido);
| ^^^^^^
value used here after move
7 . 21
Só podemos acessar o pedido antes de
enviarmos as informações nesse cenário
7 . 22
E isso é reforçado pelo compilador
7 . 23
Playground
#[derive(Debug)]
struct Pedido {
id: i32
}
fn novo_pedido() -> Pedido {
Pedido { id: 1 }
}
fn enviar_pedido(pedido: Pedido) {
// Código que envia o pedido
}
fn main() {
let pedido = novo_pedido();
println!("Dados do pedido: {:?}", pedido);
enviar_pedido(pedido);
}
7 . 24
Dados do pedido: Pedido { id: 1 }
7 . 25
Rust incentiva desde o inicio
do projeto
Tipos não conseguem veri car toda a lógica
testes
7 . 26
pub fn super_calculo(x: i32, y: i32) -> i32 {
x + y
}
#[test]
fn test_super_calculo() {
assert_eq!(3, super_calculo(1, 2));
}
7 . 27
$ cargo test
running 1 test
test test_super_calculo ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured;
0 filtered out
7 . 28
é vista como parte
importante do seu projeto
Documentação
7 . 29
Tentando evitar que exemplos quem
desatualizados
7 . 30
/// Realiza um grande cálculo que te deixará surpreso
/// # Examples
///
/// ```
/// use minha_lib::*;
///
/// assert_eq!(5, calculo_surpresa(1, 2));
/// ```
pub fn calculo_surpresa(x: i32, y: i32, z: i32) -> i32 {
x + y + z
}
7 . 31
Exemplos que aparecem na documentação são
executados durante os testes
$ cargo test
[...]
running 1 test
test src/lib.rs - calculo_surpresa (line 4) ... FAILED
failures:
---- src/lib.rs - calculo_surpresa (line 4) stdout ----
error[E0061]: this function takes 3 parameters
but 2 parameters were supplied
--> src/lib.rs:5:32
|
5 | assert_eq!(5, calculo_surpresa(1, 2));
| ^^^^ expected 3 parameters
7 . 32
Gerar a documentação do projeto é simples
$ cargo doc --open
7 . 33
7 . 34
Uma linguagem de sistemas:
Tem mensagens de erros claras
Que se preocupa com documentação e testes
E traz todas essas aprendizagens de outras linguagens
É uma ótima evolução para todo o ecossistema
de baixo nível
7 . 35
E uma ótima opção para
construir plataformas de alto nível
7 . 36
Mas você não precisa se preocupar
com tudo isso agora
7 . 37
Essas foram exemplos de possibilidades e
potencial da linguagem
7 . 38
Você pode aprender aos poucos, na sua
velocidade
7 . 39
E começando com o que você já está
acostumado em outras linguagens
7 . 40
Quem já ouviu falar de Rust?
8 . 1
Ah, e esse é o mascote, Ferris
(E dá pra um pra você)costurar
8 . 2
Agora, como faço um site?
8 . 3
Vamos fazer um site?
0:00 / 0:20
9 . 1
Um Site:
Leve
Fácil de deployar
Aproveitando todas as vantagens que eu já comentei
9 . 2
Primeiro passo: Instalando as
ferramentas
Siga as instruções no site do Rustup
10 . 1
Esse é o gerenciador de versões do Rust
Vai instalar todas as ferramentas
Suporta Linux, Mac e Windows
Ajuda a manter tudo atualizado
10 . 2
No nal estará disponível:
rustup: o gerenciador de versões
cargo: o gerenciador de projetos e de dependências
rustc: o compilador
rustdoc: o gerador de documentação
rust-gdb e rust-lldb: debuggers
10 . 3
Criando nosso projeto
$ cargo new --bin meu-site-em-rust
11 . 1
$ cargo run
Compiling meu-site-em-rust v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 1.54 secs
Running `target/debug/meu-site-em-rust`
Hello, world!
11 . 2
Vamos criar uma primeira
página
Vamos criar um arquivo em src/index.html
com seguinte conteúdo
12 . 1
<!doctype html>
<html>
<head>
<meta charset=utf-8>
<title>Olá TDC POA 2017</title>
</head>
<body>
<h1>Olá mundo</h1>
<marquee>Olá TDC</marquee>
</body>
</html>
12 . 2
Adicionando um framework
web
Vamos usar o framework para nos ajudarNickel
13 . 1
Adicione a dependência no arquivo Cargo.toml
[dependencies]
nickel = "0.10.0"
13 . 2
Alterando nosso arquivo
Agora vamos ver um pouco de Rust, aos poucos.
Vamos abrir o arquivo src/main.rs.
14 . 1
Primeiro, importamos e incluímos algumas
referências do framework web.
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
14 . 2
Incluímos todo o conteúdo do nosso arquivo
HTML em uma constante.
const INDEX: &str = include_str!("index.html");
14 . 3
Criamos um novo servidor Nickel.
let mut server = Nickel::new();
server.get("/", middleware!(INDEX));
14 . 4
Con guramos a porta a partir da variável de
ambiente PORT. Vamos usar a porta 3000 de
fallback.
let port = std::env::var("PORT").unwrap_or("3000".into());
let url = format!("0.0.0.0:{port}", port = port);
14 . 5
Iniciamos o nosso servidor, com uma mensagem
caso haja erros.
println!("On {}", url);
server.listen(url)
.expect("Não conseguimos iniciar o servidor");
14 . 6
No nal teremos isso:
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
const INDEX: &str = include_str!("index.html");
fn main() {
let mut server = Nickel::new();
server.get("/", middleware!(INDEX));
let port = std::env::var("PORT").unwrap_or("3000".into());
let url = format!("0.0.0.0:{port}", port = port);
println!("On {}", url);
server.listen(url)
.expect("Não conseguimos iniciar o servidor");
}
14 . 7
Agora podemos criar o nosso
executável
$ cargo build --release
15 . 1
E executar:
$ ./target/release/meu-site-em-rust
On 0.0.0.0:3000
Listening on http://0.0.0.0:3000
Ctrl-C to shutdown server
15 . 2
TA-DÁ!
15 . 3
Parabéns!
Você tem um site em Rust.
16 . 1
E tudo em um só binário!
16 . 2
E tem demo no Heroku!
https://ouvi-falar-de-rust.herokuapp.com/
16 . 3
"Mas dá pra fazer mais
alguma coisa?"
17 . 1
Vamos fazer uma
chamada web
18 . 1
É tão fácil como outras linguagens, mesmo
sendo uma linguagem de sistemas
18 . 2
Vou seguir a receita disponível no
Rust Cookbooks
18 . 3
Criando mais um novo projeto
$ cargo new --bin minha-chamada-em-rust
18 . 4
$ cargo run
Compiling minha-chamada-em-rust v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 1.54 secs
Running `target/debug/minha-chamada-em-rust`
Hello, world!
18 . 5
Adicionando uma lib para chamadas
18 . 6
Já existem diversas bibliotecas disponíveis no
Crates.io
18 . 7
Vamos usar o nesse projetoReqwest
18 . 8
Adicione a dependência no arquivo Cargo.toml
[dependencies]
reqwest = "0.8.0"
18 . 9
Alterando nosso binário
Vamos importar a nossa biblioteca e algumas
funções de I/O
extern crate reqwest;
use std::io::Read;
18 . 10
E criar nossa função
fn main() {
let mut response = reqwest::get("https://httpbin.org/get")
.expect("Could not connect");
println!("Resposta: {:?}", response);
let mut content = String::new();
response.read_to_string(&mut content);
println!("Conteudo do site: {}", content);
}
18 . 11
TA-DÁ
Vamos executar!
$ cargo run
18 . 12
18 . 13
Agora você tem um código para fazer chamadas
na internet!
binário
cross-plataforma
com baixo uso de memória
que não precisa de car instalando várias dependências
para usar
18 . 14
Bem similar a outras linguagens?
18 . 15
"Uma pergunta…"
19 . 1
É fácil aprender Rust?
Eu passei semanas batendo a cabeça em
conceitos que eram novos para mim.
19 . 2
Tenho um background mais alto nível
(Ruby/Java/JavaScript)
Tive que aprender sobre stack e referências
Os conceitos sobre lifetime e borrow demoraram pra
entrar na minha cabeça
19 . 3
Rust trouxe novos conceitos para minha caixa de
ferramentas.
E eu tenho me divertido muito!
19 . 4
A comunidade é muito aberta e me ajudou
bastante, e tem muito interesse em trazer
pessoas novas.
Muitas pessoas estão disponíveis para ajudar no
, no e até no .#rust-beginners fórum #rust-br
19 . 5
Existe um grande esforço em tornar todo o
ecossistema inclusivo, tanto a participação das
pessoas quanto material para todos os níveis.
19 . 6
Iniciativa para ensinar Rust para quem não é
bem representado na área de tecnologia
RustBridge
19 . 7
Com interesse de tornar a linguagem uma boa
primeira linguagem de programação
19 . 8
Todas as propostas de mudança da linguagem
seguem um processo de
Evolução colaborativa
RFC
19 . 9
Que agora requer que novas propostas tenham
e uma maneira clara para
ensinar a mudança
documentação
19 . 10
Como eu coloco meu site no Heroku?
Eu usei esse .buildpack
19 . 11
Só existe o Nickel para web?
Já existem vários frameworks, mas ainda é um
ecossistema em desenvolvimento.
19 . 12
Uma boa lista está disponível no site Are We
Web Yet?
19 . 13
Se você estiver buscando algo mais
experimental:
Con ra o , que usa uma sintaxe mais
sucinta…
Rocket
19 . 14
Mas depende de funcionalidades do compilador
ainda em desenvolvimento.
19 . 15
Preciso usar rustup?
É o método mais recomendado pela
comunidade
É a maneira mais fácil de manter tudo atualizado
Rust tem uma versão nova a cada 6 semanas
Fica mais fácil de acompanhar as novas funcionalidades
19 . 16
Rust está disponível nos gerenciadores de
pacotes dos sistemas operacionais também, mas
pode demorar um pouco mais para receber
atualizações.
19 . 17
Como conectar em um banco?
O pode ajudar nisso.Diesel
19 . 18
Já existem empresas usando Rust?
Sim. Inclusive o Firefox do seu computador já
tem partes em Rust.
Algumas empresas: Dropbox, Chef, Tilde, Sentry,
CoreOS, Mozilla e tem mais .na lista do site
19 . 19
Só dá pra usar Rust para a web?
Não, dá pra usar para muitos outros lugares!
19 . 20
(Se eu fosse falar todos os exemplos, seria uma
outra apresentação inteira)
19 . 21
Dois fortes* espaços para aplicar a linguagem:
Ferramentas de suporte (CLIs, build, processadores de
texto, etc)
Extensões de linguagens (Gems, npm, python extensions,
FFI)
*IMHO
19 . 22
, , , ,
, , ,
, , Sistemas Operacionais ,
, , …
Machine Learning Ruby Python Haskell
Node.js WebAssembly Container Network
Platform Embedded 123
Jogos cross-compilação CI
19 . 23
Espero que tenham gostado
de Rust
20 . 1
E se quiser seguir conhecendo
Tem um no site [EN]
é um ótimo canal para tirar dúvidas
rápidas
Existe o para falar em portugues
O grupo no Telegram
E em portugues
livro de graça
#rust-beginners
#rust-br
@rustlangbr
Meetups
Exercicios
grupo de estudo online
20 . 2
Se você se interessou por Rust, pode entrar em
contato comigo também, que eu quero te ajudar
com os próximos passos.
Bruno Tavares - @bltavares
20 . 3
Links
intorust(); screencasts
Podcast da Lambda 3 - Em portugues
https://github.com/bltavares/meu-site-em-rust
Imagens do Ferris
http://edunham.net/2016/04/11/plushie_rustacean_pattern.html
https://rustup.rs/
https://github.com/nickel-org/nickel.rs
https://ouvi-falar-de-rust.herokuapp.com/
https://riot.im/app/#/room/#mozilla_#rust-beginners:matrix.org
https://users.rust-lang.org/
https://riot.im/app/#/room/#mozilla_#rust-br:matrix.org
https://github.com/emk/heroku-buildpack-rust
http://www.arewewebyet.org/
https://rocket.rs/
https://diesel.rs/
https://www.rust-lang.org/en-US/friends.html
http://www.arewelearningyet.com/
https://usehelix.com/
https://github.com/mitsuhiko/snaek
https://github.com/mgattozzi/curryrs
https://www.neon-bindings.com/
https://hackernoon.com/compiling-rust-to-webassembly-guide-411066a69fde
https://blogs.oracle.com/developers/building-a-container-runtime-in-rust
https://tokio.rs/
https://github.com/rust-embedded
20 . 4

Weitere ähnliche Inhalte

Was ist angesagt?

Monitoramento de Serviços de Bancos de Dados - Nagios
Monitoramento de Serviços de Bancos de Dados - NagiosMonitoramento de Serviços de Bancos de Dados - Nagios
Monitoramento de Serviços de Bancos de Dados - NagiosEduardo Legatti
 
Automação de Ambientes com Puppet
Automação de Ambientes com Puppet Automação de Ambientes com Puppet
Automação de Ambientes com Puppet 4LinuxCursos
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 
Oracle 18c Instalação Grid Infrastructure & Database
Oracle 18c Instalação Grid Infrastructure & DatabaseOracle 18c Instalação Grid Infrastructure & Database
Oracle 18c Instalação Grid Infrastructure & DatabaseDouglas Paiva de Sousa
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetRoberto Scudeller
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida realFernando Ike
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerWellington Silva
 
Monitoramento de Redes com Nagios
Monitoramento de Redes com NagiosMonitoramento de Redes com Nagios
Monitoramento de Redes com NagiosDaniel Lara
 
Gerenciamento de configuração com puppet
Gerenciamento de configuração com puppetGerenciamento de configuração com puppet
Gerenciamento de configuração com puppetElton Simões
 
Infraestrutura como código com Puppet e Mcollective
Infraestrutura como código com Puppet e McollectiveInfraestrutura como código com Puppet e Mcollective
Infraestrutura como código com Puppet e McollectiveJose Augusto Carvalho
 
Docker 101 e Ambientes Imutáveis
Docker 101 e Ambientes Imutáveis Docker 101 e Ambientes Imutáveis
Docker 101 e Ambientes Imutáveis Wallison Marra
 

Was ist angesagt? (20)

Monitoramento de Serviços de Bancos de Dados - Nagios
Monitoramento de Serviços de Bancos de Dados - NagiosMonitoramento de Serviços de Bancos de Dados - Nagios
Monitoramento de Serviços de Bancos de Dados - Nagios
 
Trabalhando com Módulos no Puppet
Trabalhando com Módulos no PuppetTrabalhando com Módulos no Puppet
Trabalhando com Módulos no Puppet
 
Automação de Ambientes com Puppet
Automação de Ambientes com Puppet Automação de Ambientes com Puppet
Automação de Ambientes com Puppet
 
Customizando Slackware
Customizando SlackwareCustomizando Slackware
Customizando Slackware
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 
Puppet webcast 4linux
Puppet webcast 4linuxPuppet webcast 4linux
Puppet webcast 4linux
 
Oracle 18c Instalação Grid Infrastructure & Database
Oracle 18c Instalação Grid Infrastructure & DatabaseOracle 18c Instalação Grid Infrastructure & Database
Oracle 18c Instalação Grid Infrastructure & Database
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - Puppet
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
Ubuntued blog
Ubuntued blogUbuntued blog
Ubuntued blog
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
 
Apresentacao Aula03 So
Apresentacao Aula03 SoApresentacao Aula03 So
Apresentacao Aula03 So
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + docker
 
Monitoramento de Redes com Nagios
Monitoramento de Redes com NagiosMonitoramento de Redes com Nagios
Monitoramento de Redes com Nagios
 
Gerenciamento de configuração com puppet
Gerenciamento de configuração com puppetGerenciamento de configuração com puppet
Gerenciamento de configuração com puppet
 
Iniciando com docker
Iniciando com dockerIniciando com docker
Iniciando com docker
 
Docker volumes
Docker volumesDocker volumes
Docker volumes
 
Infraestrutura como código com Puppet e Mcollective
Infraestrutura como código com Puppet e McollectiveInfraestrutura como código com Puppet e Mcollective
Infraestrutura como código com Puppet e Mcollective
 
Docker 101 e Ambientes Imutáveis
Docker 101 e Ambientes Imutáveis Docker 101 e Ambientes Imutáveis
Docker 101 e Ambientes Imutáveis
 
Monitoração com Nagios
Monitoração com NagiosMonitoração com Nagios
Monitoração com Nagios
 

Ähnlich wie TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... mas como faço um site?

Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Aumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootAumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootFernando Boaglio
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
Cartilha de R para Estatística e Data Science.pdf
Cartilha de R para Estatística e Data Science.pdfCartilha de R para Estatística e Data Science.pdf
Cartilha de R para Estatística e Data Science.pdfEdkallenn Lima
 
Programação em Shell Script
Programação em Shell ScriptProgramação em Shell Script
Programação em Shell ScriptReinaldo Lima
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlManuel Lemos
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlDiego Tremper
 

Ähnlich wie TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... mas como faço um site? (20)

Cygwin
CygwinCygwin
Cygwin
 
Asterisk
AsteriskAsterisk
Asterisk
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
OpenSolaris a Céu Aberto
OpenSolaris a Céu AbertoOpenSolaris a Céu Aberto
OpenSolaris a Céu Aberto
 
IntroduçãO Ao Linux
IntroduçãO Ao LinuxIntroduçãO Ao Linux
IntroduçãO Ao Linux
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Aumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootAumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring Boot
 
Servidores linux
Servidores linuxServidores linux
Servidores linux
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Cartilha de R para Estatística e Data Science.pdf
Cartilha de R para Estatística e Data Science.pdfCartilha de R para Estatística e Data Science.pdf
Cartilha de R para Estatística e Data Science.pdf
 
Programação em Shell Script
Programação em Shell ScriptProgramação em Shell Script
Programação em Shell Script
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControl
 
Ambiente de desenvolvimento com docker e ruby on rails
Ambiente de desenvolvimento com  docker e ruby on railsAmbiente de desenvolvimento com  docker e ruby on rails
Ambiente de desenvolvimento com docker e ruby on rails
 

Mehr von tdc-globalcode

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadetdc-globalcode
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...tdc-globalcode
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucessotdc-globalcode
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPAtdc-globalcode
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinotdc-globalcode
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...tdc-globalcode
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicestdc-globalcode
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publicatdc-globalcode
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#tdc-globalcode
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocustdc-globalcode
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?tdc-globalcode
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golangtdc-globalcode
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QAtdc-globalcode
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciatdc-globalcode
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Servicetdc-globalcode
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETtdc-globalcode
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8tdc-globalcode
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...tdc-globalcode
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#tdc-globalcode
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Coretdc-globalcode
 

Mehr von tdc-globalcode (20)

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devices
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocus
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golang
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
 

Kürzlich hochgeladen

trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdf
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdfBRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdf
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdfHenrique Pontes
 
637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano
637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano
637743470-Mapa-Mental-Portugue-s-1.pdf 4 anoAdelmaTorres2
 
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdf
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdfO Universo Cuckold - Compartilhando a Esposas Com Amigo.pdf
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdfPastor Robson Colaço
 
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024HORA DO CONTO4_BECRE D. CARLOS I_2023_2024
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024Sandra Pratas
 
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptx
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptxQUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptx
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptxIsabellaGomes58
 
A experiência amorosa e a reflexão sobre o Amor.pptx
A experiência amorosa e a reflexão sobre o Amor.pptxA experiência amorosa e a reflexão sobre o Amor.pptx
A experiência amorosa e a reflexão sobre o Amor.pptxfabiolalopesmartins1
 
A galinha ruiva sequencia didatica 3 ano
A  galinha ruiva sequencia didatica 3 anoA  galinha ruiva sequencia didatica 3 ano
A galinha ruiva sequencia didatica 3 anoandrealeitetorres
 
Atividade com a letra da música Meu Abrigo
Atividade com a letra da música Meu AbrigoAtividade com a letra da música Meu Abrigo
Atividade com a letra da música Meu AbrigoMary Alvarenga
 
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANO
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANOInvestimentos. EDUCAÇÃO FINANCEIRA 8º ANO
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANOMarcosViniciusLemesL
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxLuizHenriquedeAlmeid6
 
PPT _ Módulo 3_Direito Comercial_2023_2024.pdf
PPT _ Módulo 3_Direito Comercial_2023_2024.pdfPPT _ Módulo 3_Direito Comercial_2023_2024.pdf
PPT _ Módulo 3_Direito Comercial_2023_2024.pdfAnaGonalves804156
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfManuais Formação
 
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxOsnilReis1
 
Aula 13 8º Ano Cap.04 Revolução Francesa.pptx
Aula 13 8º Ano Cap.04 Revolução Francesa.pptxAula 13 8º Ano Cap.04 Revolução Francesa.pptx
Aula 13 8º Ano Cap.04 Revolução Francesa.pptxBiancaNogueira42
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Centro Jacques Delors
 
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chave
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chaveAula - 2º Ano - Cultura e Sociedade - Conceitos-chave
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chaveaulasgege
 
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxSlides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxLuizHenriquedeAlmeid6
 
Mesoamérica.Astecas,inca,maias , olmecas
Mesoamérica.Astecas,inca,maias , olmecasMesoamérica.Astecas,inca,maias , olmecas
Mesoamérica.Astecas,inca,maias , olmecasRicardo Diniz campos
 

Kürzlich hochgeladen (20)

trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdf
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdfBRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdf
BRASIL - DOMÍNIOS MORFOCLIMÁTICOS - Fund 2.pdf
 
637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano
637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano
637743470-Mapa-Mental-Portugue-s-1.pdf 4 ano
 
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
 
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdf
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdfO Universo Cuckold - Compartilhando a Esposas Com Amigo.pdf
O Universo Cuckold - Compartilhando a Esposas Com Amigo.pdf
 
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024HORA DO CONTO4_BECRE D. CARLOS I_2023_2024
HORA DO CONTO4_BECRE D. CARLOS I_2023_2024
 
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptx
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptxQUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptx
QUARTA - 1EM SOCIOLOGIA - Aprender a pesquisar.pptx
 
A experiência amorosa e a reflexão sobre o Amor.pptx
A experiência amorosa e a reflexão sobre o Amor.pptxA experiência amorosa e a reflexão sobre o Amor.pptx
A experiência amorosa e a reflexão sobre o Amor.pptx
 
A galinha ruiva sequencia didatica 3 ano
A  galinha ruiva sequencia didatica 3 anoA  galinha ruiva sequencia didatica 3 ano
A galinha ruiva sequencia didatica 3 ano
 
Atividade com a letra da música Meu Abrigo
Atividade com a letra da música Meu AbrigoAtividade com a letra da música Meu Abrigo
Atividade com a letra da música Meu Abrigo
 
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANO
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANOInvestimentos. EDUCAÇÃO FINANCEIRA 8º ANO
Investimentos. EDUCAÇÃO FINANCEIRA 8º ANO
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
 
PPT _ Módulo 3_Direito Comercial_2023_2024.pdf
PPT _ Módulo 3_Direito Comercial_2023_2024.pdfPPT _ Módulo 3_Direito Comercial_2023_2024.pdf
PPT _ Módulo 3_Direito Comercial_2023_2024.pdf
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdf
 
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
 
Aula 13 8º Ano Cap.04 Revolução Francesa.pptx
Aula 13 8º Ano Cap.04 Revolução Francesa.pptxAula 13 8º Ano Cap.04 Revolução Francesa.pptx
Aula 13 8º Ano Cap.04 Revolução Francesa.pptx
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029
 
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chave
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chaveAula - 2º Ano - Cultura e Sociedade - Conceitos-chave
Aula - 2º Ano - Cultura e Sociedade - Conceitos-chave
 
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxSlides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
 
Mesoamérica.Astecas,inca,maias , olmecas
Mesoamérica.Astecas,inca,maias , olmecasMesoamérica.Astecas,inca,maias , olmecas
Mesoamérica.Astecas,inca,maias , olmecas
 

TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... mas como faço um site?

  • 1. (Nunca) Ouvi falar de Rust… Mas como eu faço um site? 1 . 1
  • 3. Se você nunca ouviu falar de Rust… 2 . 2
  • 4. Vou contar o que é Rust 2 . 3
  • 5. Vou contar como eu conheci Rust 2 . 4
  • 6. E alguns problemas que a linguagem me ajudou a resolver 2 . 5
  • 7. Mas se você já ouviu falar… 2 . 6
  • 8. Vou mostrar alguns passos para seguir aprendendo 2 . 7
  • 10. Comecei a me envolver com o deploy das aplicações do meu projeto 3 . 2
  • 11. NPM + Python + Java + Closure Compiler + SCons + RVM… 3 . 3
  • 12. Eu queria uma maneira simples de executar aplicações 3 . 4
  • 13. Objetivo 1 arquivo binário e cross-plataforma 3 . 5
  • 15. "Pra escrever binário tem que ser C?" 4 . 2
  • 16. Rust foi uma das opções na minha busca por alternativas 4 . 3
  • 17. "Mas o que é Rust?" 4 . 4
  • 18. Rust Rust é uma linguagem de programação de sistemas que roda incrivelmente rápido, previne falhas de segmentação, e garante segurança entre threads. 5 . 1
  • 19. "É uma linguagem bem moderna, com foco em baixo nível" 5 . 2
  • 20. Uma linguagem com várias características funcionais: Imutável por padrão Não tem null ou unde ned Pattern-matching Closures Structs e Enums 5 . 3
  • 21. O que me chamou atenção para seguir aprendendo: Gera binários Cross-plataforma Preocupação em boas mensagens de erro Focado em baixo nível Mas com uma experiência de linguagem de alto nível Linguagem com investimento da Mozilla 5 . 4
  • 22. Todas essas características criam um ambiente ideal para avançar com segurança Mozilla Quantum 5 . 5
  • 23. "Por que escolheram criar uma linguagem de baixo nível?" Qantas falhas podem acontecer em um programa de baixo nível? 6 . 1
  • 24. Bu erOver ow, Segmentation Fault, Use After Free… 6 . 2
  • 25. Rust tem um sistema de tipos que previne diversos erros de gerenciamento de memória, em tempo de compilação 6 . 3
  • 26. Gerenciamento de memória sem Garbage Collector 6 . 4
  • 27. Exemplo do Rust previne apenas com o compilador Vamos ver um pouco de Rust 7 . 1
  • 28. Playground fn main() { let data = vec!(); println!("Data", data); } 7 . 2
  • 29. error: argument never used --> src/main.rs:3:22 | 3 | println!("Data", data); | ^^^^ error: aborting due to previous error 7 . 3
  • 30. Playground fn main() { let data = vec!(); println!("Data {}", data); } 7 . 4
  • 31. error[E0277]: the trait bound `std::vec::Vec<_>: std::fmt::Display` is not satisfied --> src/main.rs:3:25 | |println!("Data {}", data); | ^^^^ `std::vec::Vec<_>` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string | = help: the trait `std::fmt::Display` is not implemented for `std::vec::Vec<_>` = note: required by `std::fmt::Display::fmt` error: aborting due to previous error 7 . 5
  • 32. ^^^^ `std::vec::Vec<_>` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string 7 . 6
  • 33. Playground fn main() { let data = vec!(); println!("Data {:?}", data); } 7 . 7
  • 34. error[E0282]: type annotations needed --> src/main.rs:2:16 | 2 | let data = vec!(); | ---- ^^^^^^ cannot infer type for `T` | | | consider giving `data` a type | error: aborting due to previous error 7 . 8
  • 36. $ rustc --explain E0282 7 . 10
  • 37. Playground fn main() { let data : Vec<char> = vec!(); println!("Data {:?}", data); } 7 . 11
  • 39. Imagine uma base de código bem complexa Código com threads Processamento de imagens em paralelo Coordenar muito acesso de I/O 7 . 13
  • 40. Em resumo, imagine quão complexo um navegador é por trás dos panos? 7 . 14
  • 41. Existe algum problema neste código? Playground use std::thread; use std::time::Duration; fn main() { let data = vec!(); thread::spawn(|| { data.push('a'); }); thread::spawn(|| { data.push('b'); }); thread::sleep(Duration::from_millis(50)); println!("Data {:?}", data); } 7 . 15
  • 42. Depois de vários ciclos de feedback na compilação: Não teremos acesso a memória já liberada Teremos adicionado uma forma forma de evitar race conditions Nosso binário não terá esses problemas! 7 . 16
  • 43. Playground use std::thread; use std::sync::{Arc, Mutex}; use std::time::Duration; fn main() { let data = Arc::new(Mutex::new(vec!())); let writer = data.clone(); thread::spawn(move || { let lock_result = writer.lock(); match lock_result { Ok(mut locked_writer) => locked_writer.push('a'), Err(_) => panic!("Could not acquire lock a"), } }); let writer = data.clone(); thread::spawn(move || { let mut locked_writer = writer.lock().expect("Could not acquire lock b"); locked_writer.push('b'); }); thread::sleep(Duration::from_millis(50)); println!("Data {:?}", data); } 7 . 17
  • 44. Esse sistema de tipo traz novas maneiras de expressar seu domínio 7 . 18
  • 45. Que não conseguimos fazer em outras linguagens mais conhecidas 7 . 19
  • 46. Playground #[derive(Debug)] struct Pedido { id: i32 } fn novo_pedido() -> Pedido { Pedido { id: 1 } } fn enviar_pedido(pedido: Pedido) { // Código que envia o pedido } fn main() { let pedido = novo_pedido(); enviar_pedido(pedido); println!("Dados do pedido: {:?}", pedido); } 7 . 20
  • 47. error[E0382]: use of moved value: `pedido` --> src/main.rs:18:39 | 16 | enviar_pedido(pedido); | ------ value moved here 17 | 18 | println!("Dados do pedido: {:?}", pedido); | ^^^^^^ value used here after move 7 . 21
  • 48. Só podemos acessar o pedido antes de enviarmos as informações nesse cenário 7 . 22
  • 49. E isso é reforçado pelo compilador 7 . 23
  • 50. Playground #[derive(Debug)] struct Pedido { id: i32 } fn novo_pedido() -> Pedido { Pedido { id: 1 } } fn enviar_pedido(pedido: Pedido) { // Código que envia o pedido } fn main() { let pedido = novo_pedido(); println!("Dados do pedido: {:?}", pedido); enviar_pedido(pedido); } 7 . 24
  • 51. Dados do pedido: Pedido { id: 1 } 7 . 25
  • 52. Rust incentiva desde o inicio do projeto Tipos não conseguem veri car toda a lógica testes 7 . 26
  • 53. pub fn super_calculo(x: i32, y: i32) -> i32 { x + y } #[test] fn test_super_calculo() { assert_eq!(3, super_calculo(1, 2)); } 7 . 27
  • 54. $ cargo test running 1 test test test_super_calculo ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out 7 . 28
  • 55. é vista como parte importante do seu projeto Documentação 7 . 29
  • 56. Tentando evitar que exemplos quem desatualizados 7 . 30
  • 57. /// Realiza um grande cálculo que te deixará surpreso /// # Examples /// /// ``` /// use minha_lib::*; /// /// assert_eq!(5, calculo_surpresa(1, 2)); /// ``` pub fn calculo_surpresa(x: i32, y: i32, z: i32) -> i32 { x + y + z } 7 . 31
  • 58. Exemplos que aparecem na documentação são executados durante os testes $ cargo test [...] running 1 test test src/lib.rs - calculo_surpresa (line 4) ... FAILED failures: ---- src/lib.rs - calculo_surpresa (line 4) stdout ---- error[E0061]: this function takes 3 parameters but 2 parameters were supplied --> src/lib.rs:5:32 | 5 | assert_eq!(5, calculo_surpresa(1, 2)); | ^^^^ expected 3 parameters 7 . 32
  • 59. Gerar a documentação do projeto é simples $ cargo doc --open 7 . 33
  • 61. Uma linguagem de sistemas: Tem mensagens de erros claras Que se preocupa com documentação e testes E traz todas essas aprendizagens de outras linguagens É uma ótima evolução para todo o ecossistema de baixo nível 7 . 35
  • 62. E uma ótima opção para construir plataformas de alto nível 7 . 36
  • 63. Mas você não precisa se preocupar com tudo isso agora 7 . 37
  • 64. Essas foram exemplos de possibilidades e potencial da linguagem 7 . 38
  • 65. Você pode aprender aos poucos, na sua velocidade 7 . 39
  • 66. E começando com o que você já está acostumado em outras linguagens 7 . 40
  • 67. Quem já ouviu falar de Rust? 8 . 1
  • 68. Ah, e esse é o mascote, Ferris (E dá pra um pra você)costurar 8 . 2
  • 69. Agora, como faço um site? 8 . 3
  • 70. Vamos fazer um site? 0:00 / 0:20
  • 71. 9 . 1
  • 72. Um Site: Leve Fácil de deployar Aproveitando todas as vantagens que eu já comentei 9 . 2
  • 73. Primeiro passo: Instalando as ferramentas Siga as instruções no site do Rustup
  • 75. Esse é o gerenciador de versões do Rust Vai instalar todas as ferramentas Suporta Linux, Mac e Windows Ajuda a manter tudo atualizado 10 . 2
  • 76. No nal estará disponível: rustup: o gerenciador de versões cargo: o gerenciador de projetos e de dependências rustc: o compilador rustdoc: o gerador de documentação rust-gdb e rust-lldb: debuggers 10 . 3
  • 77. Criando nosso projeto $ cargo new --bin meu-site-em-rust 11 . 1
  • 78. $ cargo run Compiling meu-site-em-rust v0.1.0 Finished dev [unoptimized + debuginfo] target(s) in 1.54 secs Running `target/debug/meu-site-em-rust` Hello, world! 11 . 2
  • 79. Vamos criar uma primeira página Vamos criar um arquivo em src/index.html com seguinte conteúdo 12 . 1
  • 80. <!doctype html> <html> <head> <meta charset=utf-8> <title>Olá TDC POA 2017</title> </head> <body> <h1>Olá mundo</h1> <marquee>Olá TDC</marquee> </body> </html> 12 . 2
  • 81. Adicionando um framework web Vamos usar o framework para nos ajudarNickel
  • 83. Adicione a dependência no arquivo Cargo.toml [dependencies] nickel = "0.10.0" 13 . 2
  • 84. Alterando nosso arquivo Agora vamos ver um pouco de Rust, aos poucos. Vamos abrir o arquivo src/main.rs. 14 . 1
  • 85. Primeiro, importamos e incluímos algumas referências do framework web. #[macro_use] extern crate nickel; use nickel::{Nickel, HttpRouter}; 14 . 2
  • 86. Incluímos todo o conteúdo do nosso arquivo HTML em uma constante. const INDEX: &str = include_str!("index.html"); 14 . 3
  • 87. Criamos um novo servidor Nickel. let mut server = Nickel::new(); server.get("/", middleware!(INDEX)); 14 . 4
  • 88. Con guramos a porta a partir da variável de ambiente PORT. Vamos usar a porta 3000 de fallback. let port = std::env::var("PORT").unwrap_or("3000".into()); let url = format!("0.0.0.0:{port}", port = port); 14 . 5
  • 89. Iniciamos o nosso servidor, com uma mensagem caso haja erros. println!("On {}", url); server.listen(url) .expect("Não conseguimos iniciar o servidor"); 14 . 6
  • 90. No nal teremos isso: #[macro_use] extern crate nickel; use nickel::{Nickel, HttpRouter}; const INDEX: &str = include_str!("index.html"); fn main() { let mut server = Nickel::new(); server.get("/", middleware!(INDEX)); let port = std::env::var("PORT").unwrap_or("3000".into()); let url = format!("0.0.0.0:{port}", port = port); println!("On {}", url); server.listen(url) .expect("Não conseguimos iniciar o servidor"); } 14 . 7
  • 91. Agora podemos criar o nosso executável $ cargo build --release 15 . 1
  • 92. E executar: $ ./target/release/meu-site-em-rust On 0.0.0.0:3000 Listening on http://0.0.0.0:3000 Ctrl-C to shutdown server 15 . 2
  • 94. Parabéns! Você tem um site em Rust.
  • 96. E tudo em um só binário! 16 . 2
  • 97. E tem demo no Heroku! https://ouvi-falar-de-rust.herokuapp.com/ 16 . 3
  • 98. "Mas dá pra fazer mais alguma coisa?" 17 . 1
  • 100. É tão fácil como outras linguagens, mesmo sendo uma linguagem de sistemas 18 . 2
  • 101. Vou seguir a receita disponível no Rust Cookbooks 18 . 3
  • 102. Criando mais um novo projeto $ cargo new --bin minha-chamada-em-rust 18 . 4
  • 103. $ cargo run Compiling minha-chamada-em-rust v0.1.0 Finished dev [unoptimized + debuginfo] target(s) in 1.54 secs Running `target/debug/minha-chamada-em-rust` Hello, world! 18 . 5
  • 104. Adicionando uma lib para chamadas 18 . 6
  • 105. Já existem diversas bibliotecas disponíveis no Crates.io 18 . 7
  • 106. Vamos usar o nesse projetoReqwest 18 . 8
  • 107. Adicione a dependência no arquivo Cargo.toml [dependencies] reqwest = "0.8.0" 18 . 9
  • 108. Alterando nosso binário Vamos importar a nossa biblioteca e algumas funções de I/O extern crate reqwest; use std::io::Read; 18 . 10
  • 109. E criar nossa função fn main() { let mut response = reqwest::get("https://httpbin.org/get") .expect("Could not connect"); println!("Resposta: {:?}", response); let mut content = String::new(); response.read_to_string(&mut content); println!("Conteudo do site: {}", content); } 18 . 11
  • 112. Agora você tem um código para fazer chamadas na internet! binário cross-plataforma com baixo uso de memória que não precisa de car instalando várias dependências para usar 18 . 14
  • 113. Bem similar a outras linguagens? 18 . 15
  • 115. É fácil aprender Rust? Eu passei semanas batendo a cabeça em conceitos que eram novos para mim. 19 . 2
  • 116. Tenho um background mais alto nível (Ruby/Java/JavaScript) Tive que aprender sobre stack e referências Os conceitos sobre lifetime e borrow demoraram pra entrar na minha cabeça 19 . 3
  • 117. Rust trouxe novos conceitos para minha caixa de ferramentas. E eu tenho me divertido muito! 19 . 4
  • 118. A comunidade é muito aberta e me ajudou bastante, e tem muito interesse em trazer pessoas novas. Muitas pessoas estão disponíveis para ajudar no , no e até no .#rust-beginners fórum #rust-br 19 . 5
  • 119. Existe um grande esforço em tornar todo o ecossistema inclusivo, tanto a participação das pessoas quanto material para todos os níveis. 19 . 6
  • 120. Iniciativa para ensinar Rust para quem não é bem representado na área de tecnologia RustBridge 19 . 7
  • 121. Com interesse de tornar a linguagem uma boa primeira linguagem de programação 19 . 8
  • 122. Todas as propostas de mudança da linguagem seguem um processo de Evolução colaborativa RFC 19 . 9
  • 123. Que agora requer que novas propostas tenham e uma maneira clara para ensinar a mudança documentação 19 . 10
  • 124. Como eu coloco meu site no Heroku? Eu usei esse .buildpack 19 . 11
  • 125. Só existe o Nickel para web? Já existem vários frameworks, mas ainda é um ecossistema em desenvolvimento. 19 . 12
  • 126. Uma boa lista está disponível no site Are We Web Yet? 19 . 13
  • 127. Se você estiver buscando algo mais experimental: Con ra o , que usa uma sintaxe mais sucinta… Rocket 19 . 14
  • 128. Mas depende de funcionalidades do compilador ainda em desenvolvimento. 19 . 15
  • 129. Preciso usar rustup? É o método mais recomendado pela comunidade É a maneira mais fácil de manter tudo atualizado Rust tem uma versão nova a cada 6 semanas Fica mais fácil de acompanhar as novas funcionalidades 19 . 16
  • 130. Rust está disponível nos gerenciadores de pacotes dos sistemas operacionais também, mas pode demorar um pouco mais para receber atualizações. 19 . 17
  • 131. Como conectar em um banco? O pode ajudar nisso.Diesel 19 . 18
  • 132. Já existem empresas usando Rust? Sim. Inclusive o Firefox do seu computador já tem partes em Rust. Algumas empresas: Dropbox, Chef, Tilde, Sentry, CoreOS, Mozilla e tem mais .na lista do site 19 . 19
  • 133. Só dá pra usar Rust para a web? Não, dá pra usar para muitos outros lugares! 19 . 20
  • 134. (Se eu fosse falar todos os exemplos, seria uma outra apresentação inteira) 19 . 21
  • 135. Dois fortes* espaços para aplicar a linguagem: Ferramentas de suporte (CLIs, build, processadores de texto, etc) Extensões de linguagens (Gems, npm, python extensions, FFI) *IMHO 19 . 22
  • 136. , , , , , , , , , Sistemas Operacionais , , , … Machine Learning Ruby Python Haskell Node.js WebAssembly Container Network Platform Embedded 123 Jogos cross-compilação CI 19 . 23
  • 137. Espero que tenham gostado de Rust 20 . 1
  • 138. E se quiser seguir conhecendo Tem um no site [EN] é um ótimo canal para tirar dúvidas rápidas Existe o para falar em portugues O grupo no Telegram E em portugues livro de graça #rust-beginners #rust-br @rustlangbr Meetups Exercicios grupo de estudo online 20 . 2
  • 139. Se você se interessou por Rust, pode entrar em contato comigo também, que eu quero te ajudar com os próximos passos. Bruno Tavares - @bltavares 20 . 3
  • 140. Links intorust(); screencasts Podcast da Lambda 3 - Em portugues https://github.com/bltavares/meu-site-em-rust Imagens do Ferris http://edunham.net/2016/04/11/plushie_rustacean_pattern.html https://rustup.rs/ https://github.com/nickel-org/nickel.rs https://ouvi-falar-de-rust.herokuapp.com/ https://riot.im/app/#/room/#mozilla_#rust-beginners:matrix.org https://users.rust-lang.org/ https://riot.im/app/#/room/#mozilla_#rust-br:matrix.org https://github.com/emk/heroku-buildpack-rust http://www.arewewebyet.org/ https://rocket.rs/ https://diesel.rs/ https://www.rust-lang.org/en-US/friends.html http://www.arewelearningyet.com/ https://usehelix.com/ https://github.com/mitsuhiko/snaek https://github.com/mgattozzi/curryrs https://www.neon-bindings.com/ https://hackernoon.com/compiling-rust-to-webassembly-guide-411066a69fde https://blogs.oracle.com/developers/building-a-container-runtime-in-rust https://tokio.rs/ https://github.com/rust-embedded 20 . 4