Slide notes, styling, Images

This commit is contained in:
Johannes Schriewer 2018-04-16 12:56:34 +02:00
parent 99a5d4f3cb
commit 0ac7521033
7 changed files with 214 additions and 9 deletions

View file

@ -21,3 +21,28 @@ h1, h2, h3, h4, h5, h6 {
ol li {
margin-top: 15px;
}
.remark-slide-content:before {
content: "";
position: absolute;
width: 300px;
height: 300px;
top: -10%;
left: 75%;
opacity: 0.1;
background: url(/images/rust.png) 0 0 no-repeat;
background-size: 300px 300px;
-webkit-transform: rotate(30deg);
-moz-transform: rotate(30deg);
-ms-transform: rotate(30deg);
-o-transform: rotate(30deg);
transform: rotate(30deg);
}
a {
color: blue;
}
a:visited {
color: blue;
}

BIN
images/falcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

BIN
images/r2d2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
images/rust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
images/tie-fighter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 KiB

BIN
images/xwing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

198
slides.md
View file

@ -6,6 +6,42 @@ class: center, middle
<div style="font-size: 16px">Johannes Schriewer aka. Dunkelstern</div>
---
class: center, middle
<img src="/images/xwing.png" width="100%">
Wenn es fertig ist sieht das ganze so aus...
???
- Ein bisschen rostig für den Charme
- Flink
- Mit kleinem sidekick
- Mit ein bisschen glück kann man auch den Todesstern vernichten.
---
class: center, middle
Wenn man genau hinschaut ist sogar R2D2 mit an Board:
<img src="/images/r2d2.png" width="100%">
???
Und tausend anderen Modulen, hello javascript
---
class: center, middle
In Go sähe es dann so aus:
<img src="/images/tie-fighter.png" width="60%">
???
Ok ein bisschen Spaß muss sein...
---
# Übersicht
@ -37,16 +73,28 @@ class: center, middle
- Es gibt verschiedene Frameworks
--
- Iron
- Nickel
- Conduit
- Rocket
- Gotham
- Nickel
- ...
???
- Iron: Juni 2014, Aktuell kein Maintainer
- Nickel: Juni 2014, API ähnlich Express
- Conduit: Juni 2014, Wahrscheinlich tot
- Rocket: März 2016, Aktive Entwicklung
- Gotham: März 2017, Viele Beispiele, Aktive Entwicklung
--
- Das Benutzerfreundlichste ist [Rocket](https://rocket.rs)
--
(IMHO)
---
## Beispiel: Rocket
@ -67,6 +115,15 @@ fn main() {
}
```
???
- Wir brauchen Compiler Plugins
- ... und den Rocket Code-Generator für weniger Boilerplate
- Dann bauen wir uns einen Endpunkt
- Python Flask
- Return String, `format` ist ein macro
- Start mit einer einzelnen route
---
## JSON API Beispiel
@ -92,6 +149,14 @@ pub struct Person {
}
```
???
- Wieder ein neues rust-Feature
- Serde: Serializer-Deserializer
- Chrono: Date/Time lib
- Boilerplate lassen wir wieder generieren
- `Person` ist unser Model
---
### View
@ -112,6 +177,13 @@ fn get_person(id: i32) -> Result<Json<Person>, Failure> {
Die anderen HTTP Methoden funktionieren natürlich auch...
???
- JSON-Support laden
- Mock-Endpoint
- Statische Daten als Beispiel
- Reagiert nur auf `Accept: application/json`
---
#### Ergebnis
@ -132,11 +204,16 @@ Die anderen HTTP Methoden funktionieren natürlich auch...
&lt;</span>
<span style="color: #0000c0;">{
"id": 1,
"name": "Max Musterman",
"name": "Max Musterman",
"birthday":"2018-04-16T00:32:27.480509862"
}</span>
</div>
???
- `Accept`-Header nicht vergessen sonst 404
- JSON formatiert zur besseren lesbarkeit
---
### Request Guards (aka Middleware)
@ -160,6 +237,14 @@ fn admin_panel_redirect() -> Redirect {
Rocket wählt automatisch denjenigen View der alle Request guards unterstützt (und den niedrigsten Rank hat)
???
- Middleware als opt-in
- Die Parameter-Typen implementieren `FromRequest`-Trait
- Nach Rank
- Request Guards müssen erfüllt werden sonst 404
- `format` im Decorator funktioniert ähnlich
---
# Rust für Datenbanken
@ -171,9 +256,17 @@ Rocket wählt automatisch denjenigen View der alle Request guards unterstützt (
- Rustorm
- Diesel
- ...
???
- Postgres-Lib: Nicht direkt typesafe, bzw dynamisch
- Langsam
- Rustorm: Rewrite in progress, schlechte Doku
- Diesel: Dürftige Doku aber es geht voran
- Schneller als postgres-lib direkt
--
- Ich habe mich auf [Diesel](https://diesel.rs) eingeschossen weil es typesafe ist.
---
## Model definition (Diesel)
@ -181,11 +274,11 @@ Rocket wählt automatisch denjenigen View der alle Request guards unterstützt (
1. Table
```rust
table! {
person (id) {
id -> Integer,
name -> Text,
birthday -> Timestamp,
}
person (id) {
id -> Integer,
name -> Text,
birthday -> Timestamp,
}
}
```
2. Model
@ -197,6 +290,13 @@ pub struct Person {
...
```
???
- Migrations: SQL direkt
- `table!` definition lässt sich mit `diesel-cli` automatisieren
- Model wie vorher, mehr `derive`
- Boilerplate wird wieder generiert
---
## View (Diesel)
@ -214,7 +314,7 @@ pub fn get_person_list(conn: DbConn)
#[get("/person/<id>")]
pub fn get_person(id: i32, conn: DbConn)
-> Result<Json<Series>, Failure>
-> Result<Json<Person>, Failure>
{
person::table
.find(id)
@ -224,6 +324,15 @@ pub fn get_person(id: i32, conn: DbConn)
}
```
???
- Sehr vereinfacht
- Kein DB-Connection Error-Handling
- `DbConn` kommt als Request-Guard
- Kaputte DB -> 404
- `map` konvertiert nur _Success_
- `map_err` konvertiert nur _Error_
---
## View (continued)
@ -237,7 +346,7 @@ pub fn create_person(data: Json<Person>, conn: DbConn)
.values(&data.into_inner())
.execute(&*conn)
.unwrap();
if rows_inserted != 1 {
Err(Failure(Status::InternalServerError))
} else {
@ -250,6 +359,15 @@ pub fn create_person(data: Json<Person>, conn: DbConn)
}
```
???
- Kurzes beispiel für nen DB-Save
- Der `DbConn`-Request-Guard erzeugt und committed transaction
- Nur deshalb ist der Query-Code safe
- Insert and Return geht noch nicht
- Serde und Diesel übernehmen das Decoding der `Person`
- Kein error handling beim insert: `unwrap()` crashed den worker -> 500
---
# Rust im Browser
@ -257,6 +375,12 @@ pub fn create_person(data: Json<Person>, conn: DbConn)
1. _wasm-bindgen_ und Webpack, JS module in Rust
2. _yew_, React-style Framework, Everything Rust
???
- Beides nur kurz angerissen
- Alles sehr alpha
- Aber es funktioniert und wird weiterentwickelt
---
## WebAssembly Module für Javascript
@ -280,6 +404,16 @@ pub fn greet(name: &str) {
}
```
???
- Wir brauchen `bindgen` und ne Menge **nightly** Kram
- Bindgen baut den Typ-Konverter von JS -> WASM
- Die Bindgen Macros bauen Typ-Konverter WASM -> Rust
- Externe Funktion `alert`, kann aber jede beliebige JS funktion sein
- Export von unserer `greet` funktion für JS
---
### Vorbereiten
@ -303,6 +437,19 @@ $ wasm-bindgen target/wasm32-unknown-unknown/debug/wasm_greet.wasm \
const rust = import("./wasm_greet");
rust.then(m => m.greet("World!"));
```
???
- Erstmal brauchen wir tooling
- Dann compilen wir den Rust-Code
- Dann bauen wir den JS Glue-Code
- In Production sollte das dann Webpack machen
- Am Ende ist es einfach ein JS module
---
## Direkt in Rust rendern: Yew
@ -315,9 +462,39 @@ https://github.com/DenisKolodin/yew
- Eigener Virtual DOM
- Components und Fragments wie bereits bekannt
???
- Nur angerissen was theoretisch geht
- Projekt existiert seit Dezember 2017
- TODO-MVC geht aber schon
--
- **Very Alpha**
???
- Das ist als Warnung zu verstehen, Ich kenne ja die Javascript leute...
---
Dank [crates.io](https://crates.io) findet man aber noch viele Zusatzmodule
--
<img src="/images/falcon.png" width="100%">
???
So wird dann aus unserem kleinen X-Wing ein großer Millenium Falcon.
Aber trotzdem:
> This is the ship that made the Kessel Run in fourteen parsecs?
---
Es gibt übrigens noch kein Crate namens _Solo_.
C3PO ist leider an den verkehrten Anwendungsfall gebunden, es wäre so schön gewesen wenn das ein I18N Crate wäre.
---
class: center, middle
@ -326,6 +503,8 @@ class: center, middle
Kommt gerne auf mich zu wenn ihr mehr wissen wollt!
[Are we web yet? http://www.arewewebyet.org/](http://www.arewewebyet.org/)
---
# Quellen
@ -333,6 +512,7 @@ Kommt gerne auf mich zu wenn ihr mehr wissen wollt!
- [Rocket documentation / Getting started guide](https://rocket.rs/guide/)
- [Diesel documentation](http://diesel.rs/guides/getting-started/)
- [Mozilla Hacks Blog](https://hacks.mozilla.org/2018/04/javascript-to-rust-and-back-again-a-wasm-bindgen-tale/)
- [Wookiepedia](http://starwars.wikia.com/wiki/Main_Page)
# Kontakt