Ouvi dizer que um rei anda pelas cidades curando as pessoas,
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... mas como faço um site?
-
Upload
tdc-globalcode -
Category
Education
-
view
41 -
download
2
Transcript of TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... mas como faço um site?
(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 ajudoua 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 dasaplicações do meu projeto
3 . 2
NPM + Python + Java + Closure Compiler + SCons+ RVM…
3 . 3
Eu queria uma maneira simples de executaraplicações
3 . 4
Objetivo1 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 poralternativas
4 . 3
"Mas o que é Rust?"
4 . 4
Rust
Rust é uma linguagem de programação desistemas que roda incrivelmente rápido, previne
falhas de segmentação, e garante segurançaentre 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ãoNão tem null ou unde�nedPattern-matchingClosuresStructs e Enums
5 . 3
O que me chamou atenção para seguiraprendendo:
Gera bináriosCross-plataformaPreocupação em boas mensagens de erroFocado em baixo nível
Mas com uma experiência de linguagem de alto nívelLinguagem com investimento da Mozilla
5 . 4
Todas essas características criam um ambienteideal para avançar com segurança
Mozilla Quantum
5 . 5
"Por que escolheram criaruma linguagem de baixo
nível?"
Qantas falhas podem acontecer em umprograma de baixo nível?
6 . 1
Bu�erOver�ow, Segmentation Fault,
Use After Free…
6 . 2
Rust tem um sistema de tipos que previnediversos 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 previneapenas 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 bemcomplexa
Código com threadsProcessamento de imagens em paraleloCoordenar muito acesso de I/O
7 . 13
Em resumo, imagine quão complexo umnavegador é 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 nacompilação:
Não teremos acesso a memória já liberadaTeremos adicionado uma forma forma de evitar raceconditions
Nosso binário não terá esses problemas!
7 . 16
Playgrounduse 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 novasmaneiras de expressar seu domínio
7 . 18
Que não conseguimos fazer em outraslinguagens 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 deenviarmos 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 iniciodo 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 parteimportante do seu projeto
Documentação
7 . 29
Tentando evitar que exemplos �quemdesatualizados
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ãoexecutados 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 clarasQue se preocupa com documentação e testesE traz todas essas aprendizagens de outras linguagens
É uma ótima evolução para todo o ecossistemade 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 preocuparcom tudo isso agora
7 . 37
Essas foram exemplos de possibilidades epotencial da linguagem
7 . 38
Você pode aprender aos poucos, na suavelocidade
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:LeveFácil de deployarAproveitando todas as vantagens que eu já comentei
9 . 2
10 . 1
Esse é o gerenciador de versões do Rust
Vai instalar todas as ferramentasSuporta Linux, Mac e WindowsAjuda a manter tudo atualizado
10 . 2
No �nal estará disponível:
rustup: o gerenciador de versõescargo: o gerenciador de projetos e de dependênciasrustc: o compiladorrustdoc: o gerador de documentaçãorust-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 primeirapágina
Vamos criar um arquivo em src/index.htmlcom 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 frameworkweb
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 algumasreferências do framework web.
#[macro_use] extern crate nickel; use nickel::{Nickel, HttpRouter};
14 . 2
Incluímos todo o conteúdo do nosso arquivoHTML 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 deambiente 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 mensagemcaso 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 nossoexecutá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 maisalguma coisa?"
17 . 1
Vamos fazer uma chamada web
18 . 1
É tão fácil como outras linguagens, mesmosendo 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
Adicione a dependência no arquivo Cargo.toml
[dependencies] reqwest = "0.8.0"
18 . 9
Alterando nosso binárioVamos 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 chamadasna internet!
bináriocross-plataformacom baixo uso de memóriaque não precisa de �car instalando várias dependênciaspara 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ênciasOs conceitos sobre lifetime e borrow demoraram praentrar na minha cabeça
19 . 3
Rust trouxe novos conceitos para minha caixa deferramentas.
E eu tenho me divertido muito!
19 . 4
A comunidade é muito aberta e me ajudoubastante, 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 oecossistema inclusivo, tanto a participação daspessoas 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 boaprimeira linguagem de programação
19 . 8
Todas as propostas de mudança da linguagemseguem um processo de
Evolução colaborativa
RFC
19 . 9
Que agora requer que novas propostas tenham e uma maneira clara para
ensinar a mudançadocumentaçã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
Se você estiver buscando algo maisexperimental:
Con�ra o , que usa uma sintaxe maissucinta…
Rocket
19 . 14
Mas depende de funcionalidades do compiladorainda em desenvolvimento.
19 . 15
Preciso usar rustup?É o método mais recomendado pela
comunidade
É a maneira mais fácil de manter tudo atualizadoRust tem uma versão nova a cada 6 semanasFica mais fácil de acompanhar as novas funcionalidades
19 . 16
Rust está disponível nos gerenciadores depacotes dos sistemas operacionais também, mas
pode demorar um pouco mais para receberatualizações.
19 . 17
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 umaoutra apresentação inteira)
19 . 21
Dois fortes* espaços para aplicar a linguagem:
Ferramentas de suporte (CLIs, build, processadores detexto, etc)
Extensões de linguagens (Gems, npm, python extensions,FFI)*IMHO
19 . 22
, , , ,, , ,
, , Sistemas Operacionais ,, , …
Machine Learning Ruby Python HaskellNode.js WebAssembly Container Network
Platform Embedded 123Jogos cross-compilação CI
19 . 23
Espero que tenham gostadode Rust
20 . 1
E se quiser seguir conhecendoTem um no site [EN]
é um ótimo canal para tirar dúvidasrápidasExiste o para falar em portuguesO grupo no Telegram
E em portugues
livro de graça#rust-beginners
#rust-br@rustlangbr
MeetupsExercicios
grupo de estudo online
20 . 2
Se você se interessou por Rust, pode entrar emcontato comigo também, que eu quero te ajudar
com os próximos passos.
Bruno Tavares - @bltavares
20 . 3
Linksintorust(); screencastsPodcast da Lambda 3 - Em portugueshttps://github.com/bltavares/meu-site-em-rustImagens do Ferrishttp://edunham.net/2016/04/11/plushie_rustacean_pattern.htmlhttps://rustup.rs/https://github.com/nickel-org/nickel.rshttps://ouvi-falar-de-rust.herokuapp.com/https://riot.im/app/#/room/#mozilla_#rust-beginners:matrix.orghttps://users.rust-lang.org/https://riot.im/app/#/room/#mozilla_#rust-br:matrix.orghttps://github.com/emk/heroku-buildpack-rusthttp://www.arewewebyet.org/https://rocket.rs/https://diesel.rs/https://www.rust-lang.org/en-US/friends.htmlhttp://www.arewelearningyet.com/https://usehelix.com/https://github.com/mitsuhiko/snaekhttps://github.com/mgattozzi/curryrshttps://www.neon-bindings.com/https://hackernoon.com/compiling-rust-to-webassembly-guide-411066a69fdehttps://blogs.oracle.com/developers/building-a-container-runtime-in-rusthttps://tokio.rs/https://github.com/rust-embedded
20 . 4