Mas como eu faço um site?
Vou contar como eu conheci Rust
E os problemas que a linguagem me ajudou a resolver
Comecei a me envolver com o deploy das aplicações do meu projeto
NPM + Python + Java + Closure Compiler + SCons + RVM…
Eu queria uma maneira simples de executar aplicações
1 arquivo binário e cross-plataforma
"Pra escrever binário tem que ser C?"
Rust foi uma das opções na minha busca por alternativas
"Mas o que é 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.
O que me chamou atenção para seguir aprendendo:
Quantos falhas podem acontecer em um programa de baixo nível?
BufferOverflow, Segmentation Fault, Use After Free…
Rust tem um sistema de tipos que previne diversos erros de gerenciamento de memória, em tempo de compilação
Gerenciamento de memória sem Garbage Collector
E no final da apresentação você também
Ah, e esse é o mascote, Ferris
(E dá pra costurar um pra você)
Agora, como faço um site?
Siga as instruções no site do Rustup
Esse é o gerenciador de versões do Rust
Teremos instalado no final:
$ cargo new --bin meu-site-em-rust
$ 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!
Vamos criar um arquivo em src/index.html
com seguinte conteúdo
<!doctype html> <html> <head> <meta charset=utf-8> <title>Olá TDC SP 2017</title> </head> <body> <h1>Olá mundo</h1> <marquee>Olá TDC</marquee> </body> </html>
Vamos usar o framework Nickel para nos ajudar
Adicione a dependencia no arquivo Cargo.toml
[dependencies] nickel = "0.10.0"
Agora vamos ver um pouco de Rust, aos poucos.
Vamos abrir o arquivo src/main.rs
.
Primeiro, importamos e incluimos algumas referências do framework web.
#[macro_use] extern crate nickel; use nickel::{Nickel, HttpRouter};
Incluímos todo o conteúdo do nosso arquivo HTML em uma constante.
const INDEX: &str = include_str!("index.html");
Criamos um novo servidor Nickel.
let mut server = Nickel::new(); server.get("/", middleware!(INDEX));
Configuramos 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);
Iniciamos o nosso servidor, com uma mensagem caso haja erros.
println!("On {}", url); server.listen(url) .expect("Não conseguimos iniciar o servidor");
No final 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"); }
$ cargo build --release
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
Você tem um site em Rust.
E tudo em um só binário!
E tem demo no Heroku!
Eu passei semanas batendo a cabeça em conceitos que eram novos para mim.
lifetime
e borrow
demoraram pra entrar na minha cabeçaRust trouxe novos conceitos para minha caixa de ferramentas.
E eu tenho me divertido muito!
A comunidade é muito aberta e me ajudou bastante.
Muitas pessoas estão disponíveis para ajudar no #rust-beginners, no fórum e até no #rust-br.
Eu usei esse buildpack.
Já existem vários frameworks, mas ainda é um ecosistema em desenvolvimento.
Uma boa lista está disponível no site Are We Web Yet?
Confira o Rocket, que usa uma sintax mais sucinta…
Mas depende de funcionalidades do compilador ainda em desenvolvimento.
É o método mais recomendado pela comunidade
Rust está disponível nos gerenciadores de pacotes dos sistemas operacionais também, mas pode demorar um pouco mais para receber atualizações.
O Diesel pode ajudar nisso.
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.
Não, dá pra usar para muitas outras lugares!
(Se eu fosse falar todos os exemplos, seria uma outra apresentação inteira)
Dois fortes* espaços para aplicar a linguagem:
Extensões de linguagens (Gems, npm, python extensions, FFI)
*IMHOMachine Learning, Ruby, Python, Haskell, Node.js, WebAssembly, Container, Network Platform, Embedded…
Bruno Tavares - @bltavares