tdc2017 | poa trilha programacao funicional - (nunca) ouvi falar de rust... mas como faço um site?

Post on 21-Jan-2018

41 Views

Category:

Education

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

(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

Primeiro passo: Instalando asferramentas

Siga as instruções no site do Rustup

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

Já existem diversas bibliotecas disponíveis noCrates.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á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

Uma boa lista está disponível no site Are WeWeb Yet?

19 . 13

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

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 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

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

top related