diff --git a/.gitignore b/.gitignore index c845b88..5a254f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ *.sw? .DS_Store -index.json *.pyc *.xml report.html diff --git a/_images/40-years-processor-trend.png b/_images/40-years-processor-trend.png new file mode 100644 index 0000000..dba70cc Binary files /dev/null and b/_images/40-years-processor-trend.png differ diff --git a/_images/ActivityPub-logo.svg b/_images/ActivityPub-logo.svg new file mode 100644 index 0000000..8a21262 --- /dev/null +++ b/_images/ActivityPub-logo.svg @@ -0,0 +1,328 @@ + + + + + ActivityPub logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + ActivityPub logo + + 2017-04-15 + + + Robert Martinez + + + + + ActivityPub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_images/ActivityPub-tutorial-image.png b/_images/ActivityPub-tutorial-image.png new file mode 100644 index 0000000..9c11210 Binary files /dev/null and b/_images/ActivityPub-tutorial-image.png differ diff --git a/_images/MIT_logo.svg b/_images/MIT_logo.svg new file mode 100644 index 0000000..89e0c5c --- /dev/null +++ b/_images/MIT_logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/_images/Sorry-bout-that.gif b/_images/Sorry-bout-that.gif new file mode 100644 index 0000000..5fec08a Binary files /dev/null and b/_images/Sorry-bout-that.gif differ diff --git a/_images/activitypub-logo.png b/_images/activitypub-logo.png new file mode 100644 index 0000000..2de3a0c Binary files /dev/null and b/_images/activitypub-logo.png differ diff --git a/_images/agpl-logo.png b/_images/agpl-logo.png new file mode 100644 index 0000000..ccf0c2d Binary files /dev/null and b/_images/agpl-logo.png differ diff --git a/_images/all-eggs-broken.jpeg b/_images/all-eggs-broken.jpeg new file mode 100644 index 0000000..83150f2 Binary files /dev/null and b/_images/all-eggs-broken.jpeg differ diff --git a/_images/all-eggs.jpeg b/_images/all-eggs.jpeg new file mode 100644 index 0000000..4437cc4 Binary files /dev/null and b/_images/all-eggs.jpeg differ diff --git a/_images/apache-license-2.0.png b/_images/apache-license-2.0.png new file mode 100644 index 0000000..72bb492 Binary files /dev/null and b/_images/apache-license-2.0.png differ diff --git a/_images/apache-license.png b/_images/apache-license.png new file mode 100644 index 0000000..5b551c0 Binary files /dev/null and b/_images/apache-license.png differ diff --git a/_images/back-to-the-future.jpeg b/_images/back-to-the-future.jpeg new file mode 100644 index 0000000..cc38851 Binary files /dev/null and b/_images/back-to-the-future.jpeg differ diff --git a/_images/bar.png b/_images/bar.png new file mode 100644 index 0000000..60fcaa5 Binary files /dev/null and b/_images/bar.png differ diff --git a/_images/bsd.png b/_images/bsd.png new file mode 100644 index 0000000..c2ede19 Binary files /dev/null and b/_images/bsd.png differ diff --git a/_images/builds-character.png b/_images/builds-character.png new file mode 100644 index 0000000..99d25b7 Binary files /dev/null and b/_images/builds-character.png differ diff --git a/_images/chrysalis.jpeg b/_images/chrysalis.jpeg new file mode 100644 index 0000000..d3df35f Binary files /dev/null and b/_images/chrysalis.jpeg differ diff --git a/_images/community.jpg b/_images/community.jpg new file mode 100644 index 0000000..903c970 Binary files /dev/null and b/_images/community.jpg differ diff --git a/_images/consuela.jpeg b/_images/consuela.jpeg new file mode 100644 index 0000000..26d7a2f Binary files /dev/null and b/_images/consuela.jpeg differ diff --git a/_images/copyright.jpeg b/_images/copyright.jpeg new file mode 100644 index 0000000..2880ca4 Binary files /dev/null and b/_images/copyright.jpeg differ diff --git a/_images/datastream.png b/_images/datastream.png new file mode 100644 index 0000000..c56a2e0 Binary files /dev/null and b/_images/datastream.png differ diff --git a/_images/download-apple-google.png b/_images/download-apple-google.png new file mode 100644 index 0000000..f810192 Binary files /dev/null and b/_images/download-apple-google.png differ diff --git a/_images/email.png b/_images/email.png new file mode 100644 index 0000000..9c51b7a Binary files /dev/null and b/_images/email.png differ diff --git a/_images/fear.jpeg b/_images/fear.jpeg new file mode 100644 index 0000000..e879f00 Binary files /dev/null and b/_images/fear.jpeg differ diff --git a/_images/federation.png b/_images/federation.png new file mode 100644 index 0000000..0feafd9 Binary files /dev/null and b/_images/federation.png differ diff --git a/_images/flink-cluster1.png b/_images/flink-cluster1.png new file mode 100644 index 0000000..536d797 Binary files /dev/null and b/_images/flink-cluster1.png differ diff --git a/_images/flink-cluster2.png b/_images/flink-cluster2.png new file mode 100644 index 0000000..abcc5c1 Binary files /dev/null and b/_images/flink-cluster2.png differ diff --git a/_images/flink-cluster3.png b/_images/flink-cluster3.png new file mode 100644 index 0000000..058474f Binary files /dev/null and b/_images/flink-cluster3.png differ diff --git a/_images/flink1.png b/_images/flink1.png new file mode 100644 index 0000000..a57b46f Binary files /dev/null and b/_images/flink1.png differ diff --git a/_images/flink2.png b/_images/flink2.png new file mode 100644 index 0000000..7b18903 Binary files /dev/null and b/_images/flink2.png differ diff --git a/_images/flink3.png b/_images/flink3.png new file mode 100644 index 0000000..2a00650 Binary files /dev/null and b/_images/flink3.png differ diff --git a/_images/github-lgpl.png b/_images/github-lgpl.png new file mode 100644 index 0000000..5c11048 Binary files /dev/null and b/_images/github-lgpl.png differ diff --git a/_images/gpl-logo.png b/_images/gpl-logo.png new file mode 100644 index 0000000..167077f Binary files /dev/null and b/_images/gpl-logo.png differ diff --git a/_images/guido-no-bdfl.png b/_images/guido-no-bdfl.png new file mode 100644 index 0000000..662c89f Binary files /dev/null and b/_images/guido-no-bdfl.png differ diff --git a/_images/hacktoberfest.png b/_images/hacktoberfest.png new file mode 100644 index 0000000..8dd4641 Binary files /dev/null and b/_images/hacktoberfest.png differ diff --git a/_images/internet.jpeg b/_images/internet.jpeg new file mode 100644 index 0000000..4755512 Binary files /dev/null and b/_images/internet.jpeg differ diff --git a/_images/iplenix.png b/_images/iplenix.png new file mode 100644 index 0000000..54ceeac Binary files /dev/null and b/_images/iplenix.png differ diff --git a/_images/ipython-notebook.png b/_images/ipython-notebook.png new file mode 100644 index 0000000..0a992a4 Binary files /dev/null and b/_images/ipython-notebook.png differ diff --git a/_images/ipython.png b/_images/ipython.png new file mode 100644 index 0000000..9d98163 Binary files /dev/null and b/_images/ipython.png differ diff --git a/_images/isso-nao-prova-nada.png b/_images/isso-nao-prova-nada.png new file mode 100644 index 0000000..bdb8aa1 Binary files /dev/null and b/_images/isso-nao-prova-nada.png differ diff --git a/_images/jobmanager-1.png b/_images/jobmanager-1.png new file mode 100644 index 0000000..41243de Binary files /dev/null and b/_images/jobmanager-1.png differ diff --git a/_images/jupyter.jpeg b/_images/jupyter.jpeg new file mode 100644 index 0000000..9f41bd1 Binary files /dev/null and b/_images/jupyter.jpeg differ diff --git a/_images/lgpl-logo.png b/_images/lgpl-logo.png new file mode 100644 index 0000000..e1d66ad Binary files /dev/null and b/_images/lgpl-logo.png differ diff --git a/_images/motorbike.jpg b/_images/motorbike.jpg new file mode 100644 index 0000000..6f5b728 Binary files /dev/null and b/_images/motorbike.jpg differ diff --git a/_images/nope.gif b/_images/nope.gif new file mode 100644 index 0000000..13c5412 Binary files /dev/null and b/_images/nope.gif differ diff --git a/_images/oogway.jpeg b/_images/oogway.jpeg new file mode 100644 index 0000000..7ae84cf Binary files /dev/null and b/_images/oogway.jpeg differ diff --git a/_images/past.jpg b/_images/past.jpg new file mode 100644 index 0000000..b0d01d2 Binary files /dev/null and b/_images/past.jpg differ diff --git a/_images/patrick-license.jpeg b/_images/patrick-license.jpeg new file mode 100644 index 0000000..3d024f0 Binary files /dev/null and b/_images/patrick-license.jpeg differ diff --git a/_images/plan_visualizer.png b/_images/plan_visualizer.png new file mode 100644 index 0000000..85b8c55 Binary files /dev/null and b/_images/plan_visualizer.png differ diff --git a/_images/potato-farming-300x225.jpg b/_images/potato-farming-300x225.jpg new file mode 100644 index 0000000..7ab4454 Binary files /dev/null and b/_images/potato-farming-300x225.jpg differ diff --git a/_images/present.jpg b/_images/present.jpg new file mode 100644 index 0000000..3af0846 Binary files /dev/null and b/_images/present.jpg differ diff --git a/_images/processor-speed.png b/_images/processor-speed.png new file mode 100644 index 0000000..d73f596 Binary files /dev/null and b/_images/processor-speed.png differ diff --git a/_images/public-domain.png b/_images/public-domain.png new file mode 100644 index 0000000..7352dcb Binary files /dev/null and b/_images/public-domain.png differ diff --git a/_images/pycaxias.png b/_images/pycaxias.png new file mode 100644 index 0000000..46d5e86 Binary files /dev/null and b/_images/pycaxias.png differ diff --git a/_images/python-datascience.png b/_images/python-datascience.png new file mode 100644 index 0000000..efee2ef Binary files /dev/null and b/_images/python-datascience.png differ diff --git a/_images/python-usage.png b/_images/python-usage.png new file mode 100644 index 0000000..de848c9 Binary files /dev/null and b/_images/python-usage.png differ diff --git a/_images/python15.png b/_images/python15.png new file mode 100644 index 0000000..2cbf4f4 Binary files /dev/null and b/_images/python15.png differ diff --git a/_images/python27-clock.png b/_images/python27-clock.png new file mode 100644 index 0000000..b471e2e Binary files /dev/null and b/_images/python27-clock.png differ diff --git a/_images/rewind.png b/_images/rewind.png new file mode 100644 index 0000000..21c059a Binary files /dev/null and b/_images/rewind.png differ diff --git a/_images/rust-energy.png b/_images/rust-energy.png new file mode 100644 index 0000000..437af43 Binary files /dev/null and b/_images/rust-energy.png differ diff --git a/_images/rust-ferris.png b/_images/rust-ferris.png new file mode 100644 index 0000000..d553e74 Binary files /dev/null and b/_images/rust-ferris.png differ diff --git a/_images/rust-issues.png b/_images/rust-issues.png new file mode 100644 index 0000000..8d2109f Binary files /dev/null and b/_images/rust-issues.png differ diff --git a/_images/rust-memory.png b/_images/rust-memory.png new file mode 100644 index 0000000..1db55bc Binary files /dev/null and b/_images/rust-memory.png differ diff --git a/_images/rust-reference.png b/_images/rust-reference.png new file mode 100644 index 0000000..394b801 Binary files /dev/null and b/_images/rust-reference.png differ diff --git a/_images/rust.png b/_images/rust.png new file mode 100644 index 0000000..95257d5 Binary files /dev/null and b/_images/rust.png differ diff --git a/_images/rustlatam-asmjs.jpg b/_images/rustlatam-asmjs.jpg new file mode 100644 index 0000000..14faf4b Binary files /dev/null and b/_images/rustlatam-asmjs.jpg differ diff --git a/_images/rustlatam-async1.jpg b/_images/rustlatam-async1.jpg new file mode 100644 index 0000000..29af7c3 Binary files /dev/null and b/_images/rustlatam-async1.jpg differ diff --git a/_images/rustlatam-async2.jpg b/_images/rustlatam-async2.jpg new file mode 100644 index 0000000..df0990f Binary files /dev/null and b/_images/rustlatam-async2.jpg differ diff --git a/_images/rustlatam-defensive.png b/_images/rustlatam-defensive.png new file mode 100644 index 0000000..3c6c0e0 Binary files /dev/null and b/_images/rustlatam-defensive.png differ diff --git a/_images/rustlatam-openingkeynote1.png b/_images/rustlatam-openingkeynote1.png new file mode 100644 index 0000000..8f3b2cc Binary files /dev/null and b/_images/rustlatam-openingkeynote1.png differ diff --git a/_images/rustlatam-openingkeynote2.png b/_images/rustlatam-openingkeynote2.png new file mode 100644 index 0000000..de224d4 Binary files /dev/null and b/_images/rustlatam-openingkeynote2.png differ diff --git a/_images/rustlatam-openingkeynote3.png b/_images/rustlatam-openingkeynote3.png new file mode 100644 index 0000000..d9a7e95 Binary files /dev/null and b/_images/rustlatam-openingkeynote3.png differ diff --git a/_images/rustlatam-openingkeynote4.png b/_images/rustlatam-openingkeynote4.png new file mode 100644 index 0000000..2c833d5 Binary files /dev/null and b/_images/rustlatam-openingkeynote4.png differ diff --git a/_images/rustlatam-travel.png b/_images/rustlatam-travel.png new file mode 100644 index 0000000..f53a824 Binary files /dev/null and b/_images/rustlatam-travel.png differ diff --git a/_images/rustlatam.png b/_images/rustlatam.png new file mode 100644 index 0000000..3a1a454 Binary files /dev/null and b/_images/rustlatam.png differ diff --git a/_images/scikit.jpeg b/_images/scikit.jpeg new file mode 100644 index 0000000..61565a0 Binary files /dev/null and b/_images/scikit.jpeg differ diff --git a/_images/senta-que-la-vem-historia.gif b/_images/senta-que-la-vem-historia.gif new file mode 100644 index 0000000..7afa525 Binary files /dev/null and b/_images/senta-que-la-vem-historia.gif differ diff --git a/_images/several-song-filled-hours-later.jpg b/_images/several-song-filled-hours-later.jpg new file mode 100644 index 0000000..048330e Binary files /dev/null and b/_images/several-song-filled-hours-later.jpg differ diff --git a/_images/silo.jpeg b/_images/silo.jpeg new file mode 100644 index 0000000..095fb26 Binary files /dev/null and b/_images/silo.jpeg differ diff --git a/_images/socializing.jpeg b/_images/socializing.jpeg new file mode 100644 index 0000000..85b239d Binary files /dev/null and b/_images/socializing.jpeg differ diff --git a/_images/streamprocessing-read-ready.jpg b/_images/streamprocessing-read-ready.jpg new file mode 100644 index 0000000..1b6ceaa Binary files /dev/null and b/_images/streamprocessing-read-ready.jpg differ diff --git a/_images/tchelinux-2019.png b/_images/tchelinux-2019.png new file mode 100644 index 0000000..eed37c4 Binary files /dev/null and b/_images/tchelinux-2019.png differ diff --git a/_images/tchelinux-first.png b/_images/tchelinux-first.png new file mode 100644 index 0000000..d67485a Binary files /dev/null and b/_images/tchelinux-first.png differ diff --git a/_images/tchelinux-poa2019.jpg b/_images/tchelinux-poa2019.jpg new file mode 100644 index 0000000..e400a25 Binary files /dev/null and b/_images/tchelinux-poa2019.jpg differ diff --git a/_images/tchelinux.png b/_images/tchelinux.png new file mode 100644 index 0000000..e8813f5 Binary files /dev/null and b/_images/tchelinux.png differ diff --git a/_images/the-next-day.jpg b/_images/the-next-day.jpg new file mode 100644 index 0000000..bfa16aa Binary files /dev/null and b/_images/the-next-day.jpg differ diff --git a/_images/the-witch-is-dead.png b/_images/the-witch-is-dead.png new file mode 100644 index 0000000..aebb974 Binary files /dev/null and b/_images/the-witch-is-dead.png differ diff --git a/_images/tilefile.jpg b/_images/tilefile.jpg new file mode 100644 index 0000000..522d0c5 Binary files /dev/null and b/_images/tilefile.jpg differ diff --git a/_images/tweet-python2020.png b/_images/tweet-python2020.png new file mode 100644 index 0000000..3fa486d Binary files /dev/null and b/_images/tweet-python2020.png differ diff --git a/_images/xmpp.png b/_images/xmpp.png new file mode 100644 index 0000000..f39327c Binary files /dev/null and b/_images/xmpp.png differ diff --git a/activitypub.html b/activitypub.html new file mode 100644 index 0000000..b8fe3d4 --- /dev/null +++ b/activitypub.html @@ -0,0 +1,489 @@ + + + + + + ActivityPub + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

ActivityPub

+
+ +
+ Me + +
+ +
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+

Mas O Que é ActivityPub

+ +
    +
  • Protocolo certificado pela W3C.
  • +
  • Baseado em HTTP e JSON.
  • +
  • Tem vários conceitos iguais ao email.
  • +
  • Composto de outros protolocos: WebFinger, ActivityStreams, ActivityVocabulary e JSON-LD.
  • +
+ + +
+ +
+

O Que é ActivityPub

+

Activity Vocabulary

+ +
    +
  • Actors (Person, Bot, Service)
  • +
  • Notes
  • +
  • Images
  • +
  • Links
  • +
  • ...
  • +
+ + +
+ +
+

ActivityPub

+

WebFinger

+ +

+{"@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Person",
+ "id": "https://social.example/alyssa/",
+ "name": "Alyssa P. Hacker",
+ "preferredUsername": "alyssa",
+ "summary": "Lisp enthusiast hailing from MIT",
+ "inbox": "https://social.example/alyssa/inbox/",
+ "outbox": "https://social.example/alyssa/outbox/",
+ "followers": "https://social.example/alyssa/followers/",
+ "following": "https://social.example/alyssa/following/",
+ "liked": "https://social.example/alyssa/liked/"}
+                    
+ + +
+ +
+

ActivityPub

+

+{"@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Person",
+ "id": "https://social.example/alyssa/",
+ "name": "Alyssa P. Hacker",
+ "preferredUsername": "alyssa",
+ "summary": "Lisp enthusiast hailing from MIT",
+ "inbox": "https://social.example/alyssa/inbox/",
+ "outbox": "https://social.example/alyssa/outbox/",
+ "followers": "https://social.example/alyssa/followers/",
+ "following": "https://social.example/alyssa/following/",
+ "liked": "https://social.example/alyssa/liked/"}
+                    
+ + +
+ +
+

ActivityPub

+

+{"@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Person",
+ "id": "https://social.example/alyssa/",
+ "name": "Alyssa P. Hacker",
+ "preferredUsername": "alyssa",
+ "summary": "Lisp enthusiast hailing from MIT",
+ "inbox": "https://social.example/alyssa/inbox/",
+ "outbox": "https://social.example/alyssa/outbox/",
+ "followers": "https://social.example/alyssa/followers/",
+ "following": "https://social.example/alyssa/following/",
+ "liked": "https://social.example/alyssa/liked/"}
+                    
+ + +
+ +
+

ActivityPub

+

Activity Stream

+ +

+{"@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Create",
+ "id": "https://social.example/alyssa/posts/a29a6843",
+ "to": ["https://chatty.example/ben/"],
+ "actor": "https://social.example/alyssa/",
+ "object": {"type": "Note",
+            "id": "https://social.example/alyssa/posts/49e2d03d",
+            "attributedTo": "https://social.example/alyssa/",
+            "to": ["https://chatty.example/ben/"],
+            "content": "Did you finish reading that book?"}}
+                    
+ + +
+ +
+

ActivityPub

+ +
+ +
+

ActivityPub

+

Client to Server Activities

+ +

+ create, update, delete, follow, add, remove, like, + block, undo +

+
+ +
+

ActivityPub

+

Server to Server Activity

+ +

+ create, update, delete, follow, accept (follow), + reject (to follow), add, remove, like, announce + (reposting/boosting), undo +

+
+ +
+

ActivityPub

+

Public

+ +

https://www.w3.org/ns/activitystreams#Public

+
+ +
+

Suporte ao ActivityPub

+ +
    +
  • ForgeFed (Código, Github)
  • +
  • PixelFed (Fotos, Instagram)
  • +
  • PeerTube (Videos, YouTube)
  • +
  • HubZilla/Plume/WordPress ActivityPub Plugin (Blogging, WordPress)
  • +
  • DistBin (Snippets, Pastebin/Gist)
  • +
  • Diaspora (Social, Facebook)
  • +
  • Microblog/Honk/Plemora/Mastodon (Micro-blogging, Twitter)
  • +
+
+ +
+

Suporte ao ActivityPub

+

Mastodon

+ +
    +
  • 2.629 instâncias
  • +
  • 10.877.412 de contas criadas
  • +
  • 157.437 usuários ativos (última semana de novembro)
  • +
  • 1.562.887.737.129.765 toots
  • +
+
+ +
+

Suporte ao ActivityPub

+ +

+ Fediverse +

+
+ +
+

Informações Técnicas

+ + +
+ +
+ +
+
+
+ + + + + + + + diff --git a/after-dark.css b/after-dark.css new file mode 100644 index 0000000..ab94245 --- /dev/null +++ b/after-dark.css @@ -0,0 +1,62 @@ +* { + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif; + font-size: 1em; + font-style: normal; +} + +body { + max-width: 50rem; + padding: 20px 10px; + background: #000; + color: #ccc; + line-height: 1rem; + margin: 0 auto; +} + +h1 { + display: block; + position: relative; + padding: 20px 0 10px; + margin 0; + overflow: hidden; + float: none; + line-height: 1.3rem; +} + +h1:after { + content: "===================================================================================================="; + position: absolute; + bottom: -7px; + left: 0; +} + +h2 { + position: relative; + margin-top: 1rem; + margin-bottom: 10px; +} + +h2:before { + content: "## "; + display: inline; +} + +a, a:visited { + color: #ccc; + cursor: pointer; + border-bottom: 1px solid #ff2e88; + text-decoration: none; +} + +a:after { + content: " " url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20class='i-external'%20viewBox='0%200%2032%2032'%20width='14'%20height='14'%20fill='none'%20stroke='%23ff9800'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='9.38%'%3E%3Cpath%20d='M14%209%20L3%209%203%2029%2023%2029%2023%2018%20M18%204%20L28%204%2028%2014%20M28%204%20L14%2018'/%3E%3C/svg%3E"); +} + +div.muted { + color: rgba(255,255,255,0.5); +} + +div.hide { + display: none; +} + diff --git a/base.html b/base.html index c6e96b3..0c95641 100644 --- a/base.html +++ b/base.html @@ -1,80 +1,35 @@ - - - + - - - reveal.js – The HTML Presentation Framework - - - - - - - - - - - - - - - - - - - + + + + + + PRESENTATION TITLE + -
-
-
-

Reveal.js

-

The HTML Presentation Framework

-

- Created by Hakim El Hattab / @hakimel -

-
-
- -
- - - - - - +
+

+ PRESENTATION TITLE +

+
+ +
+

+ ONE TITLE +

+ +

+ content +

+
+ +
+

This one have an image

+ + +
diff --git a/cargo-cult.html b/cargo-cult.html index ff8a2c9..a172951 100644 --- a/cargo-cult.html +++ b/cargo-cult.html @@ -62,6 +62,10 @@ font-style: italic; font-weight: bold; } + + .semi-opaque { + background-color: rgba(0, 0, 0, 0.7); + } diff --git a/cleancodemeetup.html b/cleancodemeetup.html index aa29f87..e097fdd 100644 --- a/cleancodemeetup.html +++ b/cleancodemeetup.html @@ -85,7 +85,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/com-licenca.html b/com-licenca.html new file mode 100644 index 0000000..a7b92b0 --- /dev/null +++ b/com-licenca.html @@ -0,0 +1,788 @@ + + + + + + Com Licença! + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Com Licença!

    +
    +
    + +
    +
    + Me + +
    + +
    +
    +
    + +
    +
    +
      +
    • Coordenador do meetup Rust in POA
    • +
    • Co-coordenador do meetup PyTche
    • +
    • Co-coordenador do meetup Design de Código
    • +
    • Palestrante do Tchelinux
    • +
    +
    +
    + +
    +
    +

    JulioBiason.me

    + + +
    +
    + +
    + +
    + +
    +
    +

    +Copyright é "Direito autoral ou direito de autor é um conjunto de prerrogativas +conferidas por lei à pessoa física ou jurídica criadora da obra intelectual, +para que ela possa usufruir de quaisquer benefícios morais e patrimoniais +resultantes da exploração de suas criações." +

    + +

    + Wikipedia +

    +
    +
    + +
    +
    +

    + Tirando casos específicos, as licenças se baseam na + distribuição do conteúdo. +

    +
    +
    + +
    +
    +

    + AVISO! +

    + +

    + Eu não sou advogado, partes legais não são o meu + forte. +

    +
    +
    + +
    + +
    + +
    +
    +
      +
    • GPL v2
    • +
    • GPL v3
    • +
    • LGPL (v2/v3)
    • +
    • AGPL (Affero General Public License ou GNU Affero General Public License)
    • +
    +
    +
    + +
    +
    +

    GPL v2

    + +
      +
    1. Executar a aplicação para qualquer fim;
    2. +
    3. Estudar como a aplicação funciona e modificar (código derivado);
    4. +
    5. Distribuir cópias livremente;
    6. +
    7. Distribuir cópias das modificações.
    8. +
    +
    +
    + +
    +
    +

    GPL v3

    + +
      +
    1. Se houver criptografia, a chave deve ser publicada (tivolization)
    2. +
    +
    +
    + +
    +
    +

    + Se eu estou fazendo um software específico para + uma empresa, posso licenciar como GPL? +

    + +

    + Sim. +

    +
    +
    + +
    +
    +

    + Se eu estou fazendo um software específico para uma + empresa, e licenciar pela GPL, posso cobrar por + isso? +

    + +

    + Sim. + + Apenas entregue os fontes junto. + +

    +
    +
    + +
    +
    +

    + Posso pegar um software GPL, fazer alterações + e cobrar por isso? +

    + +

    + Sim. + + Apenas entregue os fontes junto. + +

    +
    +
    + +
    +
    +

    + Posso pegar um software GPL, mudar o nome, + colocar meu nome nos Copyrights e distribuir? +

    + +

    + Sim, passando a ser considerado "código derivado". +

    + +

    + + Você não pode retirar o copyright atual. + +

    + +

    + Você precisa entregar os fontes junto. +

    +
    +
    + +
    +
    +

    + Se eu fizer um serviço web qualquer e licenciar + como GPL, eu tenho que distribuir os fontes para + todo mundo que acessar o site? +

    + +

    + Não. + GPLv2/v3 cobrem apenas distribuição. +

    +
    +
    + +
    +
    +

    + Posso gerar uma aplicação mobile GPL e colocar no store? +

    + +

    Não.

    + +

    + + O problema é que quem está distribuindo o + aplicativo (Apple/Google) não tem uma área + para distribuição dos fontes e não querem + se envolver com isso. + +

    +
    +
    + +
    +
    +

    + Se eu usar uma biblioteca/framework qualquer + que está licenciado sob a GPL, o que acontece? +

    + +

    + Seu código passa a ser distribuído pela GPL. +

    + +

    + + É considerado código derivado. + +

    +
    +
    + +
    + +
    + +
    +
    +

    LGPL

    + +

    GNU Lesser General Public License

    +
    +
    + +
    +
    +

    Igual a GPL, mas remove a cláusula de código derivado.

    +
    +
    + +
    +
    +

    + Se eu usar uma biblioteca/framework qualquer + que está licenciado sob a LGPL, o que acontece? +

    + +

    + Nada. Você usa a biblioteca/framework. +

    +
    +
    + +
    +
    +

    + Se eu fizer um serviço web qualquer que use uma + biblioteca LGPL, eu tenho que distribuir os fontes + para todo mundo que acessar o site? +

    + +

    + Não. + LGPLv2/v3 cobrem apenas distribuição. +

    +
    +
    + +
    + +
    + +
    +
    +
      +
    1. Fontes devem ser fornecidos junto com o acesso.
    2. +
    +
    +
    + +
    +
    +

    + Se eu fizer um serviço web qualquer e licenciar + como AGPL, eu tenho que distribuir os fontes para + todo mundo que acessar o site? +

    + +

    + Sim. +

    +
    +
    + +
    +
    +

    Se eu pegar um servidor web qualquer licenciado + sob a AGPL, eu tenho que distribuir os fontes para + todo mundo que acessar o site?

    + +

    + Sim. +

    +
    +
    + +
    +
    +

    Quem usa GPL?

    + +
      +
    • Linux¹
    • +
    • MySQL
    • +
    • BusyBox
    • +
    • VLC
    • +
    • JVM
    • +
    • OpenJDK
    • +
    +
    +
    + +
    +
    +

    Linux

    + +

    + "This program is free software; you can redistribute + it and/or modify it under the terms of the GNU + General Public License as published by the Free + Software Foundation; + either version 2 + of the License, + or (at your option) any later version." +

    +
    +
    + +
    +
    +

    Quem usa LGPL?

    + + +
    +
    + +
    +
    +

    Quem usa LGPL?

    + +
      +
    • Qt
    • +
    • Cedega
    • +
    • LibVLC
    • +
    • Lazarus
    • +
    +
    +
    + +
    +
    +

    Quem usa AGPL?

    + +
      +
    • Gitorious
    • +
    • Mastodon
    • +
    • Nextcloud
    • +
    • ScyllaDB
    • +
    • Launchpad
    • +
    +
    +
    + +
    + +
    + +
    +
    +

    BSD 0-Clause

    + +

    + Permission to use, copy, modify, and/or distribute + this software for any purpose with or without fee + is hereby granted. +

    +
    +
    + +
    +
    +

    BSD 2-Clause

    + +

    + Redistribution and use in + source and binary + forms, with or without modification, are + permitted provided that the following conditions are + met: +

    +
    +
    + +
    +
    +

    BSD 2-Clause

    +
      +
    1. + Redistributions of source code must retain the + above copyright notice, this list of conditions + and the following disclaimer. +
    2. + +
    3. + Redistributions in binary form must reproduce + the above copyright notice, this list of + conditions and the following disclaimer in the + documentation and/or other materials provided + with the distribution. +
    4. +
    +
    +
    + +
    +
    +

    BSD 3-Clause

    + +
      +
    1. + Neither the name of the <organization> nor the + names of its contributors may be used to + endorse or promote products derived from this + software without specific prior written + permission. +
    2. +
    +
    +
    + +
    +
    +

    BSD 4-Clause

    + +
      +
    1. + All advertising materials mentioning features + or use of this software must display the + following acknowledgement: This product + includes software developed by the + <organization>. +
    2. +
    +
    +
    + +
    +
    +

    + Se eu estou fazendo um software específico para + uma empresa, posso licenciar como BSD? +

    + +

    + Sim. +

    +
    +
    + +
    +
    +

    + Posso pegar um software BSD, mudar o nome, + colocar meu nome nos Copyrights e distribuir? +

    + +

    + Sim. +

    + +

    + + Você não pode retirar o copyright atual. + +

    + +

    + + Você não precisa entregar os fontes. + +

    +
    +
    + +
    +
    +

    + Posso gerar uma aplicação mobile BSD e colocar no store? +

    + +

    Sim.

    +
    +
    + +
    +
    +

    + Se eu fizer um serviço web qualquer que use uma + biblioteca BSD, eu tenho que distribuir os fontes + para todo mundo que acessar o site? +

    + +

    + Não. +

    +
    +
    + +
    +
    +

    Quem usa BSD?

    + +
      +
    • FreeBSD (2-clause)
    • +
    • NetBSD (2-clause)
    • +
    • OpenBSD (0-clause, ISC)
    • +
    • Anaconda (3-clause)
    • +
    • Django (3-clause)
    • +
    • Flask (0-clause)
    • +
    • go (3-clause)
    • +
    • Memcached (3-clause)
    • +
    • PHPUnit (3-clause)
    • +
    +
    +
    + +
    + +
    + +
    +
    +

    MIT

    + +

    + The above copyright notice and this permission + notice shall be included in all copies or + substantial portions of the Software. +

    +
    +
    + +
    +
    +

    Quem usa MIT?

    + +
      +
    • .NET core
    • +
    • AngularJS
    • +
    • React²
    • +
    • Babel
    • +
    • Godot
    • +
    • Lua
    • +
    • Pilhas de *.js
    • +
    +
    +
    + +
    +
    +

    React

    + +

    + Em 2017, o Facebook mudou a licença do React para + que, caso a empresa seja processada por + qualquer motivo, o litigiante perde o direito + de uso do produto. +

    +
    +
    + +
    + +
    + +
    +
    +

    Apache 2.0

    + + +
    +
    + +
    +
    +

    Apache 2.0

    + +

    + Subject to the terms and conditions of this + License, each Contributor hereby grants to You a + perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable copyright license to + reproduce, prepare Derivative Works of, publicly + display, publicly perform, sublicense, and + distribute the Work and such Derivative Works in + Source or Object form. +

    +
    +
    + +
    +
    +

    Quem usa Apache?

    + +
      +
    • Android
    • +
    • Apache *
    • +
    • Elixir
    • +
    • IntelliJ IDEA
    • +
    • Kotlin
    • +
    +
    +
    + +
    +

    E se eu não colocar nenhuma licença?

    +
    + +
    + +
    + +
    +
    +

    Public domain

    + +

    + The public domain consists of all the creative work + to which no exclusive intellectual property rights + apply. Those rights may have expired, been + forfeited, expressly waived, or may be + inapplicable. +

    +
    +
    + +
    + +
    +
    +
    + + + + + + + + diff --git a/filosofando-testes.html b/filosofando-testes.html index 9d77740..db9af64 100644 --- a/filosofando-testes.html +++ b/filosofando-testes.html @@ -48,6 +48,10 @@ li { display: block; } + + .semi-opaque { + background-color: rgba(0, 0, 0, 0.7); + } @@ -67,10 +71,10 @@
    @@ -85,10 +89,6 @@ -
    - Me chamaram de Mini Hitler -
    -
    ... mas hoje eu vim botar os filho dos outro no go horse. @@ -103,6 +103,14 @@ ... e eu sou meio não-ortodoxo sobre testes.
    + +
    @@ -111,7 +119,7 @@
    @@ -120,6 +128,14 @@
    TDD: Where it went wrong

    Ian Cooper: "TDD, where did it all go wrong"

    + +
    @@ -131,13 +147,44 @@
  • "Run in isolation", nothing more, nothing less.
  • "Avoid testing implementation details, test behaviours"
  • + +

    TDD

    -

    Discussões como "qual a unidade a ser testada" é que geraram - coisas como BDD e ATDD (Acceptance Test-Driven Development).

    +

    + Discussões como "qual a unidade a ser testada" é + que geraram coisas como BDD e ATDD (Acceptance + Test-Driven Development). +

    + +
    @@ -145,9 +192,31 @@

    Reddit: Devo escrever testes para a validação interna do Django?

    + +

    SIM!

    -

    ... bom, talvez sim.

    +
    @@ -156,7 +225,8 @@

    Nossos testes End-to-End.

    @@ -267,7 +337,7 @@

    Coverage

    Exemplo

    -
    
    +                        
    
     class Client:
         def __init__(self, name):
             self.name = name
    @@ -286,7 +356,7 @@ class Client:
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     def _multiple_names(name):
         split_names = name.split(' ')
         return len(split_names) > 1
    @@ -306,7 +376,7 @@ class Client:
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     import pytest
     
     def test_single_name():
    @@ -321,7 +391,7 @@ def test_multiple_name():
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     def test_valid_name():
         _validate_name('Julio Biason')
     
    @@ -335,7 +405,7 @@ def test_invalid_name():
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     def test_client_error():
         with pytest.raises(Exception):
             Client(name='Cher')
    @@ -349,7 +419,7 @@ def test_client():
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     $ pytest client.py
     ==== test session starts ====
     rootdir: /home/jbiason/unitt, inifile:
    @@ -365,7 +435,7 @@ client.py ......
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     $ pytest --cov=client client.py
     ==== test session starts ====
     plugins: cov-2.4.0
    @@ -393,7 +463,7 @@ client.py      25      0   100%
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     class Client:
         def __init__(self, name):
             self.name = name
    @@ -404,7 +474,7 @@ class Client:
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     ==== FAILURES ====
     ____ test_client_error ____
     
    @@ -422,7 +492,7 @@ client.py:37: Failed
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     $ pytest  client.py
     ==== test session starts ====
     rootdir: /home/jbiason/unitt, inifile:
    @@ -439,7 +509,7 @@ client.py ......
                             

    Coverage

    Exemplo

    -
    
    +                        
    
     $ pytest --cov=client  client.py
     ==== test session starts ====
     rootdir: /home/jbiason/unitt, inifile:
    @@ -481,10 +551,10 @@ client.py      24      0   100%
     
     						
    diff --git a/flask-40mins.html b/flask-40mins.html index 829c201..5dceff4 100644 --- a/flask-40mins.html +++ b/flask-40mins.html @@ -78,7 +78,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/flink.html b/flink.html new file mode 100644 index 0000000..4526f87 --- /dev/null +++ b/flink.html @@ -0,0 +1,285 @@ + + + + + + Flink + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Flink

    +
    +
    + +
    +
    +
    
    +cat log.log | grep ERROR | cut -f2 -d: > errors.txt
    +						
    +
    + +
    +

    Entrada

    + +

    cat log.log

    +
    + +
    +

    Processamento

    + +

    grep ERROR

    + +

    +
    cut -f2 -d:
    +

    +
    + +
    +

    Saída

    + +

    +
    > errors.txt
    +

    +
    +
    + +
    +
    +

    cat

    + +

    Tem começo e fim

    + +

    "bounded"

    +
    + +
    +

    Dados "infinitos"

    + +

    "unbounded"

    +
    +
    + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    Operators

    + +
      +
    • map
    • +
    • flatMap
    • +
    • filter
    • +
    • reduce
    • +
    • split/select
    • +
    • join
    • +
    • keyBy
    • +
    • window
    • +
    +
    +
    + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + diff --git a/fonts/hack-bold-subset.woff b/fonts/hack-bold-subset.woff new file mode 100644 index 0000000..a47c8aa Binary files /dev/null and b/fonts/hack-bold-subset.woff differ diff --git a/fonts/hack-bold-subset.woff2 b/fonts/hack-bold-subset.woff2 new file mode 100644 index 0000000..93d425e Binary files /dev/null and b/fonts/hack-bold-subset.woff2 differ diff --git a/fonts/hack-bold.woff b/fonts/hack-bold.woff new file mode 100644 index 0000000..368b913 Binary files /dev/null and b/fonts/hack-bold.woff differ diff --git a/fonts/hack-bold.woff2 b/fonts/hack-bold.woff2 new file mode 100644 index 0000000..1155477 Binary files /dev/null and b/fonts/hack-bold.woff2 differ diff --git a/fonts/hack-bolditalic-subset.woff b/fonts/hack-bolditalic-subset.woff new file mode 100644 index 0000000..0da4750 Binary files /dev/null and b/fonts/hack-bolditalic-subset.woff differ diff --git a/fonts/hack-bolditalic-subset.woff2 b/fonts/hack-bolditalic-subset.woff2 new file mode 100644 index 0000000..236b7de Binary files /dev/null and b/fonts/hack-bolditalic-subset.woff2 differ diff --git a/fonts/hack-bolditalic.woff b/fonts/hack-bolditalic.woff new file mode 100644 index 0000000..ce87fe2 Binary files /dev/null and b/fonts/hack-bolditalic.woff differ diff --git a/fonts/hack-bolditalic.woff2 b/fonts/hack-bolditalic.woff2 new file mode 100644 index 0000000..46ff1c4 Binary files /dev/null and b/fonts/hack-bolditalic.woff2 differ diff --git a/fonts/hack-italic-subset.woff b/fonts/hack-italic-subset.woff new file mode 100644 index 0000000..1d1f511 Binary files /dev/null and b/fonts/hack-italic-subset.woff differ diff --git a/fonts/hack-italic-subset.woff2 b/fonts/hack-italic-subset.woff2 new file mode 100644 index 0000000..b6f5fc9 Binary files /dev/null and b/fonts/hack-italic-subset.woff2 differ diff --git a/fonts/hack-italic.woff b/fonts/hack-italic.woff new file mode 100644 index 0000000..bd545e4 Binary files /dev/null and b/fonts/hack-italic.woff differ diff --git a/fonts/hack-italic.woff2 b/fonts/hack-italic.woff2 new file mode 100644 index 0000000..1e7630c Binary files /dev/null and b/fonts/hack-italic.woff2 differ diff --git a/fonts/hack-regular-subset.woff b/fonts/hack-regular-subset.woff new file mode 100644 index 0000000..85583a5 Binary files /dev/null and b/fonts/hack-regular-subset.woff differ diff --git a/fonts/hack-regular-subset.woff2 b/fonts/hack-regular-subset.woff2 new file mode 100644 index 0000000..1e3abb9 Binary files /dev/null and b/fonts/hack-regular-subset.woff2 differ diff --git a/fonts/hack-regular.woff b/fonts/hack-regular.woff new file mode 100644 index 0000000..e835381 Binary files /dev/null and b/fonts/hack-regular.woff differ diff --git a/fonts/hack-regular.woff2 b/fonts/hack-regular.woff2 new file mode 100644 index 0000000..524465c Binary files /dev/null and b/fonts/hack-regular.woff2 differ diff --git a/fugindo-com-python-2.html b/fugindo-com-python-2.html index 249b7f1..de576a1 100644 --- a/fugindo-com-python-2.html +++ b/fugindo-com-python-2.html @@ -58,15 +58,15 @@ max-height: 90%; } - .semi-opaque { - background-color: rgba(0, 0, 0, 0.7); - color: #fff; - text-shadow: 2px 2px #000; - } - - .reveal h1 { - font-size: 3em !important; - } + .semi-opaque { + background-color: rgba(0, 0, 0, 0.8); + color: #fff; + text-shadow: 2px 2px #000; + } + + .reveal h1 { + font-size: 3em !important; + } @@ -86,10 +86,10 @@
    @@ -112,7 +112,7 @@

    Solução

    -
    """Randomize a "Run to the hills" phrase."""
    +                        
    """Randomize a "Run to the hills" phrase."""
     
     from __future__ import print_function
     
    @@ -178,7 +178,7 @@ if __name__ == "__main__":
                         

    Docstrings

    -
    
    +                        
    
     """Randomize a "Run to the hills" phrase."""    
                             
    @@ -203,7 +203,7 @@ if __name__ == "__main__":

    Módulos e imports

    -
    
    +                        
    
     import random
     from argparse import ArgumentParser
                             
    @@ -267,7 +267,7 @@ from argparse import ArgumentParser

    Variáveis e tipos

    -
    
    +                        
    
     CONSONANTS = ['f', 'j', 'c', 'l', 'n']
     PASSPHRASE = '{}u{}am para as {}o{}i{}as'
                             
    @@ -292,13 +292,25 @@ PASSPHRASE = '{}u{}am para as {}o{}i{}as' nós vamos estragar essa convenção.)
    + +
    +

    Variáveis e tipos (um pouco mais)

    + +
      +
    • " ou ': Strings
    • +
    • []: Listas/arrays
    • +
    • {}: Dicionários/mapas/objetos/arrays associativos
    • +
    • (): Tuplas
    • +
    • Set(): Conjuntos (tipo lista, sem duplicações)
    • +
    +

    Funções

    -
    
    +                        
    
     def print_phrase(consonants):
         """Print the phrase with the randomized consonants."""
                             
    @@ -328,7 +340,7 @@ def print_phrase(consonants):

    Funções

    -
    
    +                        
    
     def print_phrase(consonants, something_else):
                             
    @@ -341,7 +353,7 @@ def print_phrase(consonants, something_else):

    Funcões

    -
    
    +                        
    
     def soma(primeiro, segundo):
         total = primeiro + segundo
         return total
    @@ -361,7 +373,7 @@ def soma(primeiro, segundo):
                         

    Funções

    -
    
    +                        
    
     soma(1, 2)
                             
    @@ -374,7 +386,7 @@ soma(1, 2)

    Funções

    -
    
    +                        
    
     soma(primeiro=2, segundo=3)
                             
    @@ -387,7 +399,7 @@ soma(primeiro=2, segundo=3)

    Funções

    -
    
    +                        
    
     soma(segundo=3, primeiro=2)
                             
    @@ -404,11 +416,11 @@ soma(segundo=3, primeiro=2)

    Funções

    -
    
    +                        
    
     def soma(primeiro=0, segundo=0):
                             
    -
    
    +                        
    
     soma()
     soma(1)
     soma(segundo=3)
    @@ -428,17 +440,17 @@ soma(segundo=3)
                         

    Pausa: Varargs

    -
    
    +                        
    
     def soma(primeiro, segundo):
         total = primeiro + segundo
         return total
                             
    -
    
    +                        
    
     soma(1)
                             
    -
    
    +                        
    
     soma(1, 2, 3)
                             
    @@ -451,7 +463,7 @@ soma(1, 2, 3)

    Pausa: Varargs

    -
    
    +                        
    
     TypeError: soma() takes exactly 2 arguments (3 given)
                             
    @@ -464,7 +476,7 @@ TypeError: soma() takes exactly 2 arguments (3 given)

    Pausa: Varargs

    -
    
    +                        
    
     def soma(*valores):
                             
    @@ -479,16 +491,16 @@ def soma(*valores):

    Pausa: Varargs

    -
    
    +                        
    
     def soma(*valores):
         print(valores)
                             
    -
    
    +                        
    
     soma(1, 2, 3, 4, 5)
                             
    -
    
    +                        
    
     [1, 2, 3, 4, 5]
                             
    @@ -496,7 +508,7 @@ soma(1, 2, 3, 4, 5)

    Pausa: Varargs

    -
    
    +                        
    
     def soma(inicial, segundo=0, *valores):
         print(inicial)
         print(segundo)
    @@ -504,11 +516,11 @@ def soma(inicial, segundo=0, *valores):
     
                             
    -
    
    +                        
    
     soma(2)
                             
    -
    
    +                        
    
     2
     0
     []
    @@ -526,16 +538,16 @@ soma(2)
                         

    Pausa: Varargs

    -
    
    +                        
    
     def soma(**valores):
         print(valores)
                             
    -
    
    +                        
    
     soma(primeiro=1, segundo=2)
                             
    -
    
    +                        
    
     {'primeiro': 1, 'segundo': 2}
                             
    @@ -568,7 +580,7 @@ soma(primeiro=1, segundo=2)

    Pausa: Varargs

    -
    
    +                        
    
     params = [4, 4]
     soma(*params)
                             
    @@ -594,7 +606,7 @@ soma(*params)

    Pausa: Objetos

    -
    
    +                        
    
     "isso é uma string"
                             
    @@ -606,7 +618,7 @@ soma(*params)

    Pausa: Objetos

    -
    
    +                        
    
     help("isso é uma string")
                             
    @@ -625,11 +637,11 @@ help("isso é uma string")

    Pausa: Objetos

    -
    
    +                        
    
     "isso é uma string".capitalize()
                             
    -
    
    +                        
    
     frase = "isso é uma string"
     frase.capitalize()
                             
    @@ -640,7 +652,7 @@ frase.capitalize()

    Welcome to Hell

    -
    
    +                        
    
         print(PASSPHRASE.format(*consonants).capitalize())
                             
    @@ -680,11 +692,11 @@ frase.capitalize()

    Welcome to Hell

    -
    
    +                        
    
     'Bem vindo {}!'.format('Júlio')
                             
    -
    
    +                        
    
     Bem vindo Júlio!
                             
    @@ -697,12 +709,12 @@ Bem vindo Júlio!

    Welcome to Hell

    -
    
    +                        
    
     PASSPHRASE = '{}u{}am para as {}o{}i{}as'
     PASSPHRASE.format('f', 'j', 'c', 'l', 'n')
                             
    -
    
    +                        
    
     'fujam para as colinas'
                             
    @@ -716,13 +728,13 @@ PASSPHRASE.format('f', 'j', 'c', 'l', 'n')

    Welcome to... Hell

    -
    
    +                        
    
     CONSONANTS = ['f', 'j', 'c', 'l', 'n']
     PASSPHRASE = '{}u{}am para as {}o{}i{}as'
     PASSPHRASE.format(*CONSONANTS)
                             
    -
    
    +                        
    
     'fujam para as colinas'
                             
    @@ -737,11 +749,11 @@ PASSPHRASE.format(*CONSONANTS)

    Welcome to... Hell?

    -
    
    +                        
    
     'fujam para as colinas'.capitalize()
                             
    -
    
    +                        
    
     Fujam para as colinas
                             
    @@ -756,7 +768,7 @@ Fujam para as colinas

    Randomizações

    -
    
    +                        
    
     def totally_random():
         """Run a totally random way."""
         random.shuffle(CONSONANTS)
    @@ -776,7 +788,7 @@ def totally_random():
                         

    Randomizações

    -
    
    +                        
    
     def switch_two():
         """Run by changing two steps at a time."""
         first = random.randint(0, 1)
    @@ -801,7 +813,7 @@ def switch_two():
                         

    Welcome to hell, maybe?

    -
    
    +                        
    
         CONSONANTS[second], CONSONANTS[first] = \
             CONSONANTS[first], CONSONANTS[second]
                             
    @@ -810,7 +822,7 @@ def switch_two():

    Welcome to Listas!

    -
    
    +                        
    
     # CONSONANTS = ['f', 'j', 'c', 'l', 'n']
     # second = random.randint(2, 4)
     CONSONANTS[second]
    @@ -836,7 +848,7 @@ CONSONANTS[second]
                                 E pra criar uma tupla:
                             

    -
    
    +                        
    
     valor, valor
                             
    @@ -846,13 +858,13 @@ valor, valor

    Welcome to Destructuring

    -
    
    +                        
    
     primeiro, segundo = [1, 2]
     print(primeiro)
     print(segundo)
                             
    -
    
    +                        
    
     1
     2
                             
    @@ -875,12 +887,12 @@ print(segundo)

    Tudo junto, agora!

    -
    
    +                        
    
         CONSONANTS[second], CONSONANTS[first] = \
             CONSONANTS[first], CONSONANTS[second]
                             
    -
    
    +                        
    
     tmp = CONSONANTS[first]
     CONSONANTS[first] = CONSONANTS[second]
     CONSONANTS[second] = tmp
    @@ -901,7 +913,7 @@ CONSONANTS[second] = tmp
                         

    O Pai de Todos Módulos

    -
    
    +                        
    
     if __name__ == "__main__":
                             
    @@ -937,7 +949,7 @@ if __name__ == "__main__":

    A linha de comando

    -
    
    +                        
    
         args = ArgumentParser()
         args.add_argument('-t', '--totally',
                           dest='type',
    @@ -967,7 +979,7 @@ if __name__ == "__main__":
                         

    Funções são cidadãos de primeira classe

    -
    
    +                        
    
         callbacks = {
             'totally': totally_random,
             'switch': switch_two
    @@ -1010,6 +1022,46 @@ if __name__ == "__main__":
                         
    +
    +
    +

    O que faltou?

    +
    + +
    +

    List comprehensions

    + +
    
    +numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    +pares = [num
    +         for num
    +         in numeros
    +         if num % 2 = 0]
    +                        
    + +

    Curiosidade: Strings são iteráveis como listas.

    +
    + +
    +

    Generators

    + +
    
    +numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    +pares = (num
    +         for num
    +         in numeros
    +         if num % 2 = 0)
    +                        
    + +
    
    +<generator object <genexpr> at 0x7f03ce4e67d0>
    +                        
    +
    + +
    +

    Laziness

    +
    +
    +

    Fulindo para as Cojinas com Python

    @@ -1022,47 +1074,49 @@ if __name__ == "__main__":
    + + +

    +

    Perguntas?

    +
    +
    + + + + + + + -
    - -
    -
    -
    - - - - - - - - - + diff --git a/fugindo-com-python.html b/fugindo-com-python.html index 4c68c7e..556d8f0 100644 --- a/fugindo-com-python.html +++ b/fugindo-com-python.html @@ -74,7 +74,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/gramatica-vim.html b/gramatica-vim.html index fe11383..0c719c4 100644 --- a/gramatica-vim.html +++ b/gramatica-vim.html @@ -74,7 +74,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/htmlslides.css b/htmlslides.css new file mode 100644 index 0000000..6d8be72 --- /dev/null +++ b/htmlslides.css @@ -0,0 +1,157 @@ +/* Colours and fonts */ + +body { + font-family: + "Source Sans Pro","Trebuchet MS","Lucida Grande", + "Bitstream Vera Sans","Helvetica Neue","sans-serif"; + + background-color: white; + color: #293c4b; +} + +h1, h2 { + background-color: #60b5cc; + color: white; +} + +a { color: #60b5cc; } + +tt,code { + background-color: #2d2d2d; + color: #66cccc; +} + +code em { color: #f33; } +code i { color: #0f0; } + + +/* Document structure */ + +* { + box-sizing: border-box; +} + +html,body { + padding: 0vh; + margin: 0vh; +} + +body { + font-size: 5vh; +} + +section,header { + display: flex; + flex-direction: column; + height: 100vh; + margin: 5vh 4vw; + break-after: always +} + +header div { + text-align: center; + font-size: 90%; +} + +h1,h2 +{ + padding: 1vh; + text-align: center; +} + +h1 { + margin-top: 15vh; + margin-bottom: 15vh; + font-size: 180%; +} + +h2 { + font-size: 150%; + margin-bottom: 2vh; +} + +a { + text-decoration: inherit; +} + +p { + margin-bottom: 2vh; + margin-top: 1vh; +} + +section > ul { + margin-left: 8vw; + margin-top: 2vh; +} + +section > ul ul { + margin-top: 2vh; +} + +li { + margin-bottom: 1vh; +} + +li ul li { + font-size: 80%; +} + +tt,code { + white-space: pre; + font-size: 70%; + overflow: auto; +} + +tt { + border-radius: 0.3vw; + padding: 0.8vw; +} + +code { + display: block; + border-radius: 0.5vw; + padding: 1.4vw; +} + +code em,i { + font-style: normal; +} + +div.cc { + display: flex; + flex-direction: row-reverse; + align-items: center; + font-size: 10px; + height: 31px; +} + +div.cc img { + float: right; + width: 88px; + height: 31px; + border-width: 0px; + height: 31px; + margin-left: 1vh; +} + +.moreinfo { + display: grid; + grid-template-columns: auto auto; + align-items: center; + font-size: 4vh; + width: 80%; + margin: auto; +} + +.moreinfo h3 { + text-align: right; + font-weight: 500; + margin-right: 1vw; +} + +.moreinfo > div { + display: flex; + flex-direction: column; + align-items: left; + font-size: 90%; +} diff --git a/htmlslides.js b/htmlslides.js new file mode 100644 index 0000000..a26bcc2 --- /dev/null +++ b/htmlslides.js @@ -0,0 +1,210 @@ +"use strict"; + +/* htmlslides + +Info and examples: https://gitlab.com/andybalaam/htmlslides + +Structure your HTML like this: + + + + + + + How to Surf the Mist + + + +
    +

    How to Surf the Mist

    + +
    +
    +

    Contents

    + + +
    +
    +

    First, breath in

    + +
    + + + + +Open the Developer Tools in your browser and check the Console output. If +htmlslides was unable to understand your HTML, it will print error messages +there. + +You can disable mouse-clicking by including htmlslides.js like this: + + + + +*/ + +let htmlslides = {} + +htmlslides.config = { + "mouse_moves_pages": true +}; + +(function() { + +let slide_anchors; +let current_slide; +let header; +let sections; + +const KEY_PAGEUP = 33; +const KEY_PAGEDOWN = 34; +const KEY_END = 35; +const KEY_HOME = 36; +const KEY_LEFT = 37; +const KEY_RIGHT = 39; + +function on_load() { + window.addEventListener("scroll", on_scroll); + document.addEventListener("keydown", on_key); + document.body.addEventListener('click', on_left_click); + document.body.addEventListener('contextmenu', on_right_click); + + header = document.getElementsByTagName("header")[0]; + sections = document.getElementsByTagName("section"); + slide_anchors = scan_slides(); + current_slide = find_slide(slide_anchors, window.location.hash); +} + +function is_interactive_element(element) { + let tag = element.tagName.toLowerCase(); + return (tag === "a" || tag === "button" || tag === "input"); +} + +function on_left_click(event) { + if (!htmlslides.config.mouse_moves_pages) { + return; + } + if (is_interactive_element(event.target)) { + return; + } + event.preventDefault(); + return go_to_slide(current_slide + 1); +} + +function on_right_click(event) { + if (!htmlslides.config.mouse_moves_pages) { + return; + } + if (is_interactive_element(event.target)) { + return; + } + event.preventDefault(); + return go_to_slide(current_slide - 1); +} + +function on_key(event) { + if (event.altKey || event.ctrlKey || event.shiftKey) { + return; + } + + switch(event.keyCode) { + case KEY_LEFT: + case KEY_PAGEUP: + event.preventDefault(); + return go_to_slide(current_slide - 1); + case KEY_RIGHT: + case KEY_PAGEDOWN: + event.preventDefault(); + return go_to_slide(current_slide + 1); + case KEY_HOME: + event.preventDefault(); + return go_to_slide(0); + case KEY_END: + event.preventDefault(); + return go_to_last_slide(); + } +} + +function on_scroll() { + if (isVisible(header)) { + history.replaceState(null, null, ' '); + current_slide = 0; + return; + } + + for (let section of sections) { + if (isVisible(section)) { + let anchor = "#" + section.id; + history.replaceState(null, null, anchor); + current_slide = find_slide(slide_anchors, anchor); + break; + } + } +} + +function isVisible(obj) { + let rect = obj.getBoundingClientRect(); + return (rect.top >= 0 && rect.top < window.innerHeight / 2); +} + +function go_to_last_slide() { + go_to_slide(slide_anchors.length - 1); +} + +function go_to_slide(n) { + current_slide = n; + + if (current_slide < 0) { + current_slide = 0; + } else if (current_slide >= slide_anchors.length) { + current_slide = slide_anchors.length - 1; + } + + if (current_slide === 0) { + if (header) { + header.scrollIntoView(); + } + window.scrollTo(0, 0); + history.replaceState(null, null, ' '); + } else { + window.location.hash = slide_anchors[current_slide]; + } +} + +function find_slide(slide_anchors, anchor) { + let ret = slide_anchors.indexOf(anchor); + if (ret === -1) { + ret = 0; + } + return ret; +} + +function scan_slides() { + let ret = [""]; + + for (let section of sections) { + ret.push(find_anchor(section)); + } + + return ret; +} + +function find_anchor(section) { + if (section.id === "") { + fail("This section does not have an id='blah' attribute!:", section); + } + return "#" + section.id; +} + +function fail(msg, obj) { + console.error(`htmlslides error: ${msg}`); + if (obj) { + console.error(obj); + } +} + +window.addEventListener("load", on_load); + +}()); diff --git a/index.html b/index.html index 90499bc..b71c8fb 100644 --- a/index.html +++ b/index.html @@ -3,85 +3,43 @@ - Presentations + Presentations.JulioBiason.Me 4.1 - + -

    Presentations

    - -
    - - - -
    -

    Title

    -
    Updated: never
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    + +
    +

    Title

    + +
    + - - - +
    + - +

    + +

    + Perguntas? +

    +
    +
    + + + + + + + + diff --git a/makeidx.py b/makeidx.py index 4e351a8..62d4d0f 100644 --- a/makeidx.py +++ b/makeidx.py @@ -11,7 +11,8 @@ import datetime import json DATA_BACKGROUND = re.compile(r"data-background=['\"](.*?)['\"]") -PRES_TITLE = re.compile(r"(.*?)") +PRES_TITLE1 = re.compile(r"(.*?)") +PRES_TITLE2 = re.compile(r"(.*?)") HEADER = re.compile(r"section.*data-background=['\"]" r"(?P.*?)['\"].*data-header" r"(?P.*?)section", re.M | re.S) @@ -33,7 +34,10 @@ def retrieve_presentation_info(filename): logging.debug('Header: %r', header.groupdict()) image = header.groupdict()['image'] - title = PRES_TITLE.search(header.groupdict()['content']) + title = PRES_TITLE1.search(header.groupdict()['content']) + + if not title: + title = PRES_TITLE2.search(header.groupdict()['content']) if content and image and title: logging.debug('Image for %s = %s', filename, image) diff --git a/porque-como-opensource.html b/porque-como-opensource.html index e959c21..e6f822c 100644 --- a/porque-como-opensource.html +++ b/porque-como-opensource.html @@ -48,502 +48,571 @@ li { display: block; } + + .semi-opaque { + background-color: rgba(0, 0, 0, 0.7); + } -
    -
    -
    -
    -

    Por que e Como Participar de Projetos Open Source

    -
    -
    - -
    -
    - Me - -
    - -
    -
    -
    - -
    -
    -

    Motivação

    - - -
    -
    +
    +
    +
    +

    Por que e Como Participar de Projetos Open Source

    +
    -
    -

    Por Que Participar?

    - -
      -
    • - Aprender algo novo - - -
    • - -
    • - Para retornar à comunidade - - -
    • - -
    • - "Code rot" - - -
    • - -
    • - "Scratch an itch" - - -
    • - -
    • - Fator abandono. - - -
    • + Me + +
    +
    -
    -
    -

    Como Participar

    +
    +

    Motivação

    -

    Enviar código com novas features é a forma mais direta mas não a mais fácil.

    -
    + +
    -
      -
    • Aclimate-se ao ambiente do projeto (IRC, Maillist, Slack, etc)
    • -
    • Seguir os padrões de codificação do projeto (HACKING.md)
    • -
    • Entender os objetivos do projeto (isso está na cabeça dos mantenedores)
    • -
    +
    +

    Por Que Participar?

    +
    -

    Anedota: Mitter.

    +
    +

    Por Que Participar?

    -
    - Um usuário pediu pra criar a feature de retweet antigo. Eu tive - que explicar que suportar duas formas diferentes seria mais - complexo do que esperado e desejado para o projeto. Felizmente, - ele entendeu. - -
    +
    +

    Por Que Participar?

    -
    -

    Enviar Código

    +

    Para retornar à comunidade

    -

    Lembre-se: para alguém, o projeto é seu filho.

    + +
    -

    Anedota: IceWM.

    +
    +

    Por Que Participar?

    -
    - Mas eu ganhei a feature que eu queria. +
    +

    Por Que Participar?

    - (Dica: o que eu usei pra achar onde estava a função foi - `grep`.) - -
    +

    Fator abandono.

    -
    -

    Enviar Código

    + +
    -

    Algumas vezes, o projeto já está abandonado pelo autor - original, mas a comunidade ainda mantém indiretamente.

    +
    +

    Por que participar?

    -

    Anedota: Blackbox.

    +

    + + The Hidden Benefit of Giving Back to Open Source Software + +

    +
    - -
    +
    +

    Como Participar

    +
    -
    -

    Enviar Código

    +
    +

    Como Participar

    -

    - Muito raramente, o desenvolvedor simplesmente não tem tempo - para pesquisar como corrigir uma feature que ele mesmo quer - colocar. -

    +

    Contribuir com código

    +
    -

    Anedota: Htop.

    +
    +

    Enviar Código

    -
    - Ele me explicou que tava com um problema no top dele, para - mostrar o usuário correto em aplicativos que estavam em - unidades NFS, mas o `ps` mostrava corretamente. +
    +

    Enviar Código

    + +
      +
    • Veja o código de conduta.
    • +
    • Aclimate-se ao ambiente do projeto (IRC, Maillist, Slack, etc)
    • +
    • Seguir os padrões de codificação do projeto (HACKING.md, CONTRIBUTING)
    • +
    • Entender os objetivos do projeto (isso está na cabeça dos mantenedores)
    • +
    + +

    Anedota: Mitter.

    + + +
    - "Olha o fonte do psutils, oras. É pra isso que é open source", - eu disse. +
    +

    Enviar Código

    + +

    + Por onde começar? +

    + +
      +
    • Issue tracker ou pedir "onde posso ajudar?"
    • +
    • Entenda quais são as suas habilidades
    • +
    • Procure issues nessas habilidades
    • +
    • Defina um tempo para se dedicar
    • +
    • Paciência
    • +
    + + +
    - "Ah, não tô com vontade." +
    +

    Enviar Código

    - Por pura irritação, eu baixei o fonte do psutils e olhei o - nome da função que encontrava o usuário e passei pra ele. - Meu nome está no "Thanks" do Htop 1 até hoje simplesmente - por isso. +

    Lembre-se: para alguém, o projeto é seu filho.

    - (Dica: o que eu sei pra encontrar a função foi `ctags` pra - mapear o conteúdo do projeto e fui correndo de função em - função) - -
    -
    +

    Anedota: IceWM.

    -
    -
    -

    Como Participar

    +
    + Como o meu patch gerou mais burburinho na lista de discussão e + IRC do que o que o mantenedor estava fazendo, ele portou meu + patch, trocando os nomes das variáveis. No final, eu fiquei como + "co-autor" da feature e não como contribuidor. -
    -

    Bug Reports

    + Mas eu ganhei a feature que eu queria. -

    - Quando encontrar um problema, tente repetir; tente isolar - o que causa o problema (uma configuração, o nome do arquivo); - se conseguir, envie para o desenvolvedor. -

    + (Dica: o que eu usei pra achar onde estava a função foi + `grep`.) + +
    -

    Anedota: Skyrim.

    +
    +

    Enviar Código

    - -
    + + Brett Cannon (Microsoft) - Setting expectations for Open Source participation + +
    -
    -

    Bug Reports

    +
    +

    Enviar Código

    -

    - Se possível, crie um teste que mostre como o - problema se repete (o que é mais fácil para bibliotecas - e frameworks do que projetos). -

    +

    Algumas vezes, o projeto já está abandonado pelo autor + original, mas a comunidade ainda mantém indiretamente.

    -

    Anedota: MongoEngine.

    +

    Anedota: Blackbox.

    + + +
    - -
    +

    Anedota: Htop.

    -
    -

    O Fork

    +
    + "Olha o fonte do psutils, oras. É pra isso que é open source", + eu disse. -
    -

    O Fork

    + "Ah, não tô com vontade." -

    - ... e há vezes que um fork, com ajuda da própria comunidade, - volta para o projeto original. -

    + Por pura irritação, eu baixei o fonte do psutils e olhei o + nome da função que encontrava o usuário e passei pra ele. + Meu nome está no "Thanks" do Htop 1 até hoje simplesmente + por isso. -

    Anedota: Compiz, GCC

    -
    + (Dica: o que eu sei pra encontrar a função foi `ctags` pra + mapear o conteúdo do projeto e fui correndo de função em + função) +
    -
    -

    Como Participar

    +

    Enviar Código

    + +

    3 coisas:

    + +
      +
    • Aprenda Git
    • +
    • Aprenda Inglês
    • +
    • + + Não tenha medo de perguntar alguma coisa porque não sabe; não saber não é defeito. + +
    • +
    +
    -

    Traduções

    -
    +
    +

    Como Participar

    +

    Traduções

    +
    -
    -

    Traduções

    +
    +

    Traduções

    -

    Se você não entende de código, pode ajudar traduzindo +

    Se você não entende de código, pode ajudar traduzindo a aplicação para a sua língua.

    -

    Anedota: Mitter e Fábio Beneditto

    +

    Anedota: Fábio Beneditto

    + + +
    + +
    +

    Como Participar

    +

    Documentação

    +
    + +
    +

    Documentação

    + +

    + Desde "como instalar esse projeto" ao "o que ele faz", + ainda falta documentação de muita coisa. Nem é preciso + saber programar, pegando algumas dicas com o autor do + projeto. +

    + +

    + Dica: Embora alguns desenvolvedores reclamem da falta + de man pages, é possível fazer coisas bem legíveis + usando projetos como ReadTheDocs + e Gitbook. +

    +
    - -
    +
    +

    Como Participar

    +

    Bug reports

    -
    -

    Como Participar

    +

    Bug Reports

    -

    Artwork

    -
    +

    + Quando encontrar um problema, tente repetir; tente isolar + o que causa o problema (uma configuração, o nome do arquivo); + se conseguir, envie para o desenvolvedor. +

    -
    -

    Artwork

    +

    Anedota: Skyrim.

    -

    - Muitos projetos precisam de um site bonito e até - mesmo um logotipo interessante. Ajudar o desenvolvedor - mantendo um site que consiga comunicar o objetivo - do projeto sempre ajuda. -

    +
    + Infelizmente, como Skyrim não é um projeto open source, + eu não tenho um bug tracker pra reportar o erro. +
    -
    -

    Como Participar

    - -

    Documentação

    -
    +

    Bug Reports

    + +

    + Se possível, crie um teste que mostre como o + problema se repete (o que é mais fácil para bibliotecas + e frameworks do que projetos). +

    + +

    Anedota: MongoEngine.

    + + +
    -
    -

    Documentação

    +
    +

    Bug Reports

    -

    - Desde "como instalar esse projeto" ao "o que ele faz", - ainda falta documentação de muita coisa. Nem é preciso - saber programar, pegando algumas dicas com o autor do - projeto. -

    +

    + Se não (quiser|saber) programar, descreva + passo-a-passo como reproduzir o erro. +

    +
    -

    - Dica: Embora alguns desenvolvedores reclamem da falta - de man pages, é possível fazer coisas bem legíveis - usando projetos como ReadTheDocs - e Gitbook. -

    -
    +
    +

    Como Participar

    +

    O Fork

    -
    -

    Como Participar

    +

    O Fork

    -

    Doações

    -
    +

    + Quando o desenvolvedor original do projeto não tem mais + interesse e não quer continuar, sempre há a possbilidade + de ter um desenvolvimento em separado. +

    -
    -

    Doações

    +

    Anedota: Jenkins, Pillow

    +
    -

    - Alguns projetos tem pessoas trabalhando full time e - precisam de alguma forma de pagar essas pessoas. -

    +
    +

    O Fork

    -

    Anedota: VIM, Mozilla

    +

    + ... e há vezes que um fork, com ajuda da própria comunidade, + volta para o projeto original. +

    -
    - Apesar de receber grandes doações, a Mozilla - precisa de doações do "99%" para que não fique - a mercê dos grandes doadores. - -
    +
    +

    Como Participar

    +

    Artwork

    -
    -

    Como Participar

    +

    Artwork

    -

    Evangelização

    -
    +

    + Muitos projetos precisam de um site bonito e até + mesmo um logotipo interessante. Ajudar o desenvolvedor + mantendo um site que consiga comunicar o objetivo + do projeto sempre ajuda. +

    -
    -

    Evangelização

    +

    Anedota: Alguma-Coisa-Dog.

    +
    -

    - Você pode ajudar um projeto a crescer divulgando o mesmo - em palestas ou até mesmo comentando com seus colegas. -

    +
    +

    Como Participar

    +

    Doações

    +
    -

    - Dica: Evite guerras santas do tipo "meu projeto vs seu projeto". -

    +
    +

    Doações

    + +

    + Alguns projetos tem pessoas trabalhando full time e + precisam de alguma forma de pagar essas pessoas. +

    + +

    Anedota: VIM, Mozilla

    + + +
    -

    Anedota: Eu ;).

    -
    +
    +

    Como Participar

    +

    Evangelização

    -
    -

    Como Participar

    +

    Evangelização

    + +

    + Você pode ajudar um projeto a crescer divulgando o mesmo + em palestas ou até mesmo comentando com seus colegas. +

    + +

    + Dica: Evite guerras santas do tipo "meu projeto vs seu projeto". +

    + +

    Anedota: Eu ;).

    +
    -

    "Obrigado"

    -
    +
    +

    Como Participar

    +

    "Obrigado"

    +
    -
    -

    "Obrigado"

    +
    +

    "Obrigado"

    -

    Poucas coisas conseguem ser tão poderosas como um +

    Poucas coisas conseguem ser tão poderosas como um simples "obrigado por ter feito esse projeto".

    -

    - Dica: Cerveja e Pizza também contam como obrigados. -

    +

    + Dica: Cerveja e Pizza também contam como obrigados. +

    -

    Anedota: Htop.

    -
    +

    Anedota: Htop.

    -
    -
    -

    Perguntas?

    - -
    - -
    -
    -
    - - +
    +

    "One more thing..."

    +
    - - +
    + +
    - +
    +

    + "I think that openness as a practice – not just + code you can fork but the transparency and + accessibility of the development process." +

    + +

    + -- Mike Hoye, Mozilla +

    +
    - +
    + +

    Perguntas?

    +
    + + + + + + + + + diff --git a/porque-rust.html b/porque-rust.html new file mode 100644 index 0000000..5f60b88 --- /dev/null +++ b/porque-rust.html @@ -0,0 +1,995 @@ + + + + + + Porque você deveria aprender Rust + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Porque Você Deveria Aprender Rust

    +
    + +
    +

    Porque Você DEVE Aprender Rust

    +
    + + +
    + +
    +
    + Me + + +
    +
    + +
    +
    +

    História

    + +
      +
    • Criada em 2006 por Graydon Hoare.
    • +
    • Patrocinada pela Mozilla em 2009.
    • +
    • Versão 1.0 em 2015.
    • +
    • Versão atual: 1.38
    • +
    +
    + + +
    + +
    +
    +

    + História + +

    + +

    + Basic (com números e estruturado), dBase III Plus, + Clipper, Pascal, Cobol, Delphi (ObjectPascal), + C, C++, ActionScript (Flash), PHP, JavaScript, + Python, Objective-C, Clojure, Java, Scala + , Rust. +

    + + +
    + +
    + + + +
    + +
    +
    + A language that doesn't affect the way you think + about programming, is not worth knowing. +
    + +
    + -- Alan Perlis, "ALGOL" +
    + + +
    +
    + +
    +
    +

    1. A Linguagem Mais Amada

    +

    + + A linguagem mais amada segundo o StackOverflow + Survey 2019 + + +

    ... pelo 4⁰ ano seguido.

    + + +

    +
    +
    + +
    +
    +

    2. "Low Level Language with High Level Abstractions"

    +
    + +
    +

    Resultado final com performance semelhante ao C...

    + + + + +
    + +
    +

    ... mas com abstrações em algo nível

    + +
      +
    • Strings sem tamanho fixo
    • +
    • Listas
    • +
    • Mapas
    • +
    + + +
    +
    + +
    +
    +

    3. Compilador Chato mas Amigável

    +
    + +
    +
    
    +fn main() -> u8 {
    +    let a = 2;
    +    a = 3;
    +    println!("{}", a);
    +    a
    +}
    +                        
    + + +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    + + + +
    +
    + +
    +
    +

    4. Borrow Checker

    + + +
    + +
    +
    
    +let a = String::from("hello");
    +                        
    +
    + +
    + "Variável a tem o valor "hello"" + + +
    + +
    +
    + "Posição de memória apontada por a tem o valor "hello"" +
    + +
    +
    
    +0x3f5cbf89 = "hello"
    +                            
    +
    + + +
    + +
    + + + +
    + +
    +
    
    +fn main() {
    +    let a = String::from("hello");
    +    let _b = a;
    +    println!("{}", a)
    +}
    +                        
    +
    + +
    +
    
    +error[E0382]: borrow of moved value: `a`
    + --> src/main.rs:5:20
    +  |
    +4 |     let _b = a;
    +  |              - value moved here
    +5 |     println!("{}", a)
    +  |                    ^ value borrowed here after move
    +  |
    +  = note: move occurs because `a` has type 
    +    `std::string::String`, which does not 
    +    implement the `Copy` trait
    +                        
    + + +
    + +
    +

    E se eu precisar acessar a variável em mais de um lugar?

    + +

    References

    + + +
    + +
    +
    
    +fn main() {
    +    let a = String::from("hello");
    +    let _b = &a;
    +    println!("{}", a)
    +}
    +                        
    +
    + +
    + + + +
    + +
    +

    Regras do Borrow Checker

    + +

    + Uma região de memória tem apenas um dono. +

    + +

    + Passar um valor (região de memória) de uma variável + para outra, troca o dono. +

    + +

    + A região é desalocada quando o dono sair de escopo. +

    + + +
    + +
    +

    Drop

    + +
    
    +pub fn drop<T>(_x: T) { }
    +                        
    +
    + +
    +

    Regras do Borrow Checker

    + +

    + Uma região de memória pode ter infinitas referências. +

    + +

    + ... desde que elas não durem mais do que o dono. +

    + + +
    + +
    +

    Regras do Borrow Checker

    + +

    + É possível ter uma referência mutável de uma região de memória. +

    + +

    + ... mas para haver uma referência mutável ela deve ser + a única referência. +

    +
    + +
    + + + +
    + +
    + +
    + +
    + Microsoft: 70 percent of all security bugs are memory safety issues +
    + +
    + Swift 5 Exclusivity Enforcement + + +
    +
    + +
    +
    +

    Hora da anedota!

    + + + +

    localtime

    +

    SimpleDateFormatter

    + + +
    + +
    +

    Rust resolveria isso?

    + +

    SIM

    + +

    ... porque nem ia compilar.

    + + +
    +
    + +
    +
    +

    5. Tipos Algébricos

    +
    + +
    +

    enum

    +
    
    +enum IpAddr {
    +   V4,
    +   V6
    +}
    +                        
    +
    + +
    +
    
    +enum IpAddr {
    +    V4(String),
    +    V6(String),
    +}
    +                        
    +
    + +
    +
    
    +let home = IpAddr::V4(String::from("127.0.0.1"));
    +
    +match home {
    +    V4(address) => println!("IPv4 addr: {}", address),
    +    V6(address) => println!("Ipv6 addr: {}", address),
    +}
    +                        
    +
    +
    + +
    +
    +

    6. Error Control

    +
    + +
    +
    
    +try:
    +    something()
    +except Exception:
    +    pass
    +                        
    +
    + +
    +
    
    +try {
    +   something();
    +} catch (Exception ex) {
    +   System.out.println(ex);
    +}
    +                        
    +
    + +
    +
    
    +FILE* f = fopen("someting.txt", "wb");
    +fprintf(f, "Done!");
    +fclose(f);
    +                        
    +
    + +
    +
    + Onde o erro foi tratado nisso? +
    +
    + +
    +
    
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +                        
    +
    + +
    +
    
    +match File::create("something.txt") {
    +    Ok(fp) => fp.write_all(b"Hello world"),
    +    Err(err) => println!("Failure! {}", err),
    +}
    +                        
    +
    + +
    +
    
    +match File::create("something.txt") {
    +    Ok(fp) => match fp.write_all(b"Hello world") {
    +        Ok(_) => (),
    +        Err(err) => println!("Can't write! {}", err),
    +    }
    +    Err(err) => println!("Failure! {}", err),
    +}
    +                        
    +
    + +
    +
    
    +let mut file = File::create("something.txt").unwrap();
    +file.write(b"Hello world").unwrap();
    +                        
    +
    + +
    +
    
    +let mut file = File::create("something.txt")?;
    +file.write(b"Hello world")?;
    +OK(())
    +                        
    +
    +
    + +
    +
    +

    7. Generics/Traits

    +
    + +
    +

    Structs

    + +
    
    +struct Gift {
    +    package_color: String,
    +    content: String
    +}
    +                        
    + + +
    + +
    +

    Structs

    + +
    
    +let presente = Gift { package_color: "red", content: "A GIFT!" };
    +                        
    +
    + +
    +

    Structs Genéricas

    +
    
    +struct Point<T> {
    +    x: T,
    +    y: T
    +}
    +                        
    +
    + +
    +

    Structs Genéricas

    + +
    
    +let my_point = Point<f32>(x: 1.0, y: 2.0);
    +                        
    +
    + +
    +

    Enums Generics

    + +
    
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +                        
    +
    + +
    +

    Traits

    + +
    
    +trait Summary {
    +    fn summarize(&self) -> String;
    +}
    +                        
    +
    + +
    +
    
    +struct Phrase {
    +    phrase: String
    +}
    +
    +impl Summary for Phrase {
    +    fn summarize(&self) -> String {
    +        self.phrase
    +            .split_whitespace()
    +            .map(|word| word.chars().nth(0).unwrap())
    +            .collect()
    +    }
    +}
    +                        
    +
    + +
    +
    
    +fn get_summary<T>(summarizable: T) -> String
    +    where T: Summary
    +{
    +    ...
    +}
    +                        
    +
    +
    + +
    +
    +

    + + 8. Cargo + +

    + +

    "Cargo is the Rust package manager"

    + +

    + "Cargo downloads your Rust package’s dependencies, + compiles your packages, makes distributable + packages, and uploads them to crates.io, the Rust + community’s package registry." +

    +
    +
    + +
    +
    +

    9. Tests

    + +
    
    +#[cfg(test)]
    +mod tests {
    +    #[test]
    +    fn testing() {
    +    }
    +}
    +                        
    +
    + +
    +
    
    +$ cargo test
    +   Compiling adder v0.1.0 (file:///projects/adder)
    +    Finished dev [unoptimized + debuginfo] target(s) in 0.22 secs
    +     Running target/debug/deps/adder-ce99bcc2479f4607
    +
    +running 1 test
    +test tests::testing ... ok
    +                        
    +
    +
    + +
    +
    +

    10. Macros

    + + ? +
    + +
    +

    Log-Derive

    + +
    
    +#[logfn(ok = "TRACE", err = "ERROR")]
    +fn call_isan(num: &str) -> Result<Success, Error> {
    +    if num.len() >= 10 && num.len() <= 15 {
    +        Ok(Success)
    +    } else {
    +        Err(Error)
    +    }
    +}
    +                        
    +
    +
    + +
    +
    +

    11. Crazy stuff

    +
    + +
    + 4.5k issues no Github +
    + +
    + rustup + +
    + armv7-unknown-linux-gnueabihf +
    + +
    + wasm32-unknown-unknown (WebAssembly) +
    +
    +
    + +
    +

    E agora?

    + + +
    + +
    + +
    +
    +
    + + + + + + + + diff --git a/pycaxias2020.html b/pycaxias2020.html new file mode 100644 index 0000000..3db3b23 --- /dev/null +++ b/pycaxias2020.html @@ -0,0 +1,428 @@ + + + + + + PyCaxias 2020 + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    PyCaxias 2020

    +
    +
    + +
    + Me + +
    + +
    +
    + +
    +
      +
    • Coordenador do meetup Rust in POA
    • +
    • Co-coordenador do meetup PyTche
    • +
    • Co-coordenador do meetup Design de Código
    • +
    • Palestrante do Tchelinux
    • +
    +
    + +
    +

    JulioBiason.me

    + + +
    + +
    +

    "Coisas Que Eu Aprendi Na Marra (Em 30 Anos de Desenvolvimento de Software)

    +

    😞

    +
    + +
    +

    Python: Passado, Presente e Futuro

    + +

    ... na minha visão

    +
    + +
    +

    O Passado

    +
    + +
    +

    Python 1.5

    + +
    + +
    +

    Python 1.5 (1998)

    +
      +
    • assert
    • +
    • raw strings (r'')
    • +
    • Novos métodos de dicionários: .clear(), .copy(), .update(), .get()
    • +
    +
    + +
    +

    [expression] and [on_true] or [on_false]

    +
    + +
    +

    "Vamos fazer um browser em Python!"

    +
    + +
    + + +
    + +
    +
      +
    • Web Server
    • +
    • Storage: Pickle
    • +
    • Atualizado storage: MySQL
    • +
    • Criada toda uma camada para que o carregamento parecesse com leitura de pickles
    • +
    + +

    Django 1.0: 2008

    +
    + +
    +

    "É mais fácil pra mim vender AJAX e Rails do que Flash e Python."

    +

    -- Tilefile CEO

    +
    + +
    + +
    + +
    + +
    + +
    +

    O Presente

    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    O Futuro

    +
    + +
    +

    You can't connect the dots looking forward; you can only connect them looking backwards.

    +

    -- Steve Jobs

    +
    + +
    +

    No man is an island,
    + Entire of itself,
    + Every man is a piece of the continent,
    + A part of the main.

    +

    -- John Donne

    +
    + +
    +

    Type Hinting: Love it

    +
    + +
    +

    "Mas Python não tem tipos!"

    + +
    
    +In [1]: type(object)
    +Out[1]: type
    +                    
    +
    + +
    + +
    + +
    +
    
    +In [4]: type("a")
    +Out[4]: str
    +
    +In [5]: type(str)
    +Out[5]: type
    +                    
    +
    + +
    +
    
    +def to_fahrenheit(temperature: int) -> int:
    +					
    +
    + +
    +
    
    +@dataclass
    +class Celcius:
    +    temperature: int
    +
    +
    +def to_fahrenheit(temperature: Celcius) -> int:
    +                    
    +
    + +
    +

    mypy

    +
    + +
    + +
    + +
    +

    ??

    + +

    None-aware operator (PEP 505)

    + +
    
    +a ??= 'value'
    +                    
    + +
    
    +a = a if a is not None else 'value'
    +                    
    +
    + +
    +

    @

    + +

    Dedicated infix operator for matrix multiplication (PEP 465)

    +
    + +
    +

    |

    + +

    Union Operator to Dict (PEP 584)

    + +
    
    +dict1.update(dict2)     # in-place
    +                    
    + +
    
    +dict3 = dict1 | dict2
    +                    
    + +
    
    +dict1 |= dict2          # same as .update()
    +                    
    +
    + +
    +

    :=

    + +

    Assignment Operator (PEP 572)

    + +
    
    +while chunk := file.read(8192):
    +    process(chunk)
    +                    
    +
    + +
    +

    @dict[key].attr[0].decorator

    + +

    Relaxing Grammar Restrictions On Decorators (PEP 614)

    +
    + +
    +

    Steering Council 🤔

    +
    + +
    +

    Python Positional-Only Parameters (PEP 570)

    + +
    
    +pow(x, y, z=None, /)
    +...
    +
    +>>> pow(x=5, y=3)
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +TypeError: pow() takes no keyword arguments
    +                    
    +
    + +
    +

    "Without the ability to specify which parameters are + positional-only, library authors must be careful when + choosing appropriate parameter names."

    + +

    🤦

    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    ??

    +
    + +
    + +
    +
    +
    + + + + + + + + diff --git a/python-bdd.html b/python-bdd.html index dec8547..0ffe488 100644 --- a/python-bdd.html +++ b/python-bdd.html @@ -85,7 +85,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/python23six.html b/python23six.html index db561aa..b08cf73 100644 --- a/python23six.html +++ b/python23six.html @@ -66,7 +66,7 @@
  • CWI Software
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/python36.html b/python36.html index 50fe301..7a59ee8 100644 --- a/python36.html +++ b/python36.html @@ -73,7 +73,7 @@
  • CWI Software
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/quick-rust.html b/quick-rust.html new file mode 100644 index 0000000..c7dd1bd --- /dev/null +++ b/quick-rust.html @@ -0,0 +1,920 @@ + + + + + + Rápida Introdução ao Rust + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Rápida Introdução ao Rust

    +
    +
    + +
    +
    + Me + +
    + +
    +
    +
    + +
    +
    +

    História

    + +
      +
    • Criada em 2006 por Graydon Hoare.
    • +
    • Patrocinada pela Mozilla em 2009.
    • +
    • Versão 1.0 em 2015.
    • +
    • Versão atual: 1.35
    • +
    • Objetivo: Criar uma linguagem rápida mas com seguraça de memória.
    • +
    +
    + + +
    + +
    +
    +

    + História + +

    + +

    + Basic (com números e estruturado), + dBase III Plus, + Clipper, + Pascal, + Cobol, + Delphi (ObjectPascal), + C, + C++, + ActionScript (Flash), + PHP, + JavaScript, + Python, + Objective-C, + Clojure, + Java, + Scala, Rust. +

    + + + + + (Lisp, Haskell, Ruby) + + + +
    + +
    + + + +
    + +
    +
    + A language that doesn't affect the way you think + about programming, is not worth knowing. +
    + +
    + -- Alan Perlis, "ALGOL" +
    + + +
    +
    + +
    +
    +

    Meu Primeiro Rust

    + +
    
    +fn main() {
    +    println!("Hello, world!");
    +}
    +                        
    + + +
    + +
    +

    Meu Primeiro Rust

    + +

    Tempo para gerar esse código:

    + +

    0 segundos

    +
    + +
    +<<<<<<< Updated upstream +

    cargo init

    +======= +

    cargo init

    +>>>>>>> Stashed changes + + +
    +
    + +
    +
    +

    + + Cargo + +

    + +

    "Cargo is the Rust package manager"

    + +

    + "Cargo downloads your Rust package’s dependencies, + compiles your packages, makes distributable + packages, and uploads them to crates.io, the Rust + community’s package registry." +

    + + +
    +
    + +
    +
    +

    De Volta Ao Rust - Static Typed

    + +
    
    +fn main() {
    +    let a: u8 = 2;
    +    println!("{}", a);
    +}
    +                        
    +
    + + + +
    +

    Mas De Volta Ao Rust

    + +
    
    +fn main() {
    +    let a = 2u8;
    +    println!("{}", a);
    +}
    +                        
    +
    + + + +
    +

    Mas De Volta Ao Rust

    + +
    
    +fn main() {
    +    let a = 2;
    +    println!("{}", a);
    +}
    +                        
    +
    + + +
    + +
    +
    +

    De Volta ao Rust - Pattern Matching

    + +
    
    +fn factorial(i: u64) -> u64 {
    +    match i {
    +        0 => 1,
    +        n => n * factorial(n-1)
    +    }
    +}
    +                        
    +
    + + +
    + +
    +
    +

    De Volta ao Rust - Returns are not necessary

    + +
    
    +fn is_pred(i: u64) -> Bool {
    +    if i % 2 == 0 {
    +       True
    +    } else {
    +       False
    +    }
    +}
    +                        
    + + +
    + +
    +

    De Volta ao Rust - Returns are not necessary

    + +
    
    +fn is_pred(i: u64) -> Bool {
    +    i % 2 == 0
    +}
    +                        
    + + +
    +
    + +
    +
    +

    De Volta ao Rust - Enums

    + +
    
    +enum IPAddr {
    +    IPV4,
    +    IPV6
    +}
    +                        
    + + +
    + +
    +

    Mas De Volta ao Rust

    + +
    
    +enum IPAddr {
    +    IPV4(String),
    +    IPV6(String)
    +}
    +                        
    +
    + +
    +

    Mas De Volta ao Rust

    + +
    
    +let home = IpAddr::IPV4(String::from("127.0.0.1");
    +
    +match home {
    +    IPV4(ipv4_address) => println!("IPv4 addr: {}", ipv4_address),
    +    IPV6(ipv6_address) => println!("Ipv6 addr: {}", ipv6_address),
    +}
    +                        
    + + +
    +
    + +
    +
    +

    De Volta ao Rust - No OO

    +
    + +
    +

    No OO

    + +
    
    +struct MyStruct {
    +    a_field: String,
    +    r_a: [2u64; 10],
    +}
    +                        
    + + +
    + +
    +

    No OO - But "functions in structs"

    + +
    
    +impl MyStruct {
    +    fn first_element(&self) -> u64 {
    +        self.r_a.get(0)
    +    }
    +}
    +                        
    + + +
    + +
    +

    No OO - But Traits

    + +
    
    +trait Summarize {
    +    fn summarize(&self) -> String;
    +}
    +                        
    + + +
    + +
    +

    No OO - But Traits

    + +
    
    +impl Summarize for MyStruct {
    +    fn summarize(&self) -> String {
    +        self.a_field
    +    }
    +}
    +                        
    + + +
    + +
    +

    No OO - But Generics

    + +
    
    +fn make_summary<T>(summarizable: T) {
    +    T.summarize()
    +}
    +                        
    + + +
    + +
    +

    No OO - But Generic Traits

    + +
    
    +fn make_summary<T>(summarizable: T)
    +    where T: Summarize
    +{
    +    T.summarize()
    +}
    +                        
    + + +
    +
    + +
    +
    +

    E Aquela "Segurança de Memória"?

    +
    + +
    +

    1. No Null Pointers

    + +
    
    +fn may_not_exist(value: Option<String>) {
    +    match value {
    +        Some(the_string) => println!("I got a string! {}", the_string),
    +        None => println!("I got nothing")
    +    }
    +}
    +                        
    + + +
    + +
    +

    2. No Shared Memory

    + +
    
    +fn main() {
    +   let a = String::from("A reference to a string in the code section copied to the stack");
    +   let b = a;
    +   println!("The string is: {}", a);
    +}
    +                        
    + + +
    + +
    + + + +
    + +
    +

    2. No Shared Memory

    + +
    
    +fn main() {
    +   let a = String::from("A reference to a string in the code section copied to the stack");
    +   let b = &a;
    +   println!("The string is: {}", a);
    +}
    +                        
    + + +
    + +
    + +
    + +
    +
    presente := Presente { ... }
    +canal <- presente
    + 
    + + +
    + +
    +
    presente := Presente { ... }
    +canal <- presente
    +presente.abrir()
    + + +
    + +
    +

    3. Immutable variables by default

    + +
    
    +fn main() {
    +    let a = 3;
    +    a = 5;
    +}
    +                        
    + + +
    +
    + +
    +
    +

    Error Control

    +
    + +
    +
    
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +                        
    + + +
    + +
    +
    
    +match File::create("something.txt") {
    +    Ok(fp) => fp.write_all(b"Hello world"),
    +    Err(err) => println!("Failure! {}", err),
    +}
    +                        
    + + +
    +
    + +
    +
    +

    Compilador Chato mas Amigável

    +
    + +
    +
    
    +fn main() {
    +    let a = 2;
    +    a = 3;
    +    println!("{}", a);
    +}
    +                        
    +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +                        
    + + +
    + +
    + + + +
    +
    + +
    +
    +

    + + A linguagem mais amada segundo o StackOverflow + Survey 2019 + + +

    ... pelo 4⁰ ano seguido.

    + + +

    +
    + +
    + 4.5k issues no Github + +
    +
    + +
    +

    E agora?

    + + +
    + +
    +
    + +
    +
    +
    +
    + + + + + + + + diff --git a/reveal-base.html b/reveal-base.html new file mode 100644 index 0000000..c6e96b3 --- /dev/null +++ b/reveal-base.html @@ -0,0 +1,80 @@ + + + + + + + reveal.js – The HTML Presentation Framework + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +

    Reveal.js

    +

    The HTML Presentation Framework

    +

    + Created by Hakim El Hattab / @hakimel +

    +
    +
    + +
    + + + + + + + + diff --git a/reveal.js b/reveal.js index d9dcff1..15dec96 160000 --- a/reveal.js +++ b/reveal.js @@ -1 +1 @@ -Subproject commit d9dcff1503cb4e8043a2b434de3cc635914164cb +Subproject commit 15dec96e73f2bc8ee8984d7e53828b6417eabf46 diff --git a/rust-legal.html b/rust-legal.html new file mode 100644 index 0000000..2579a4d --- /dev/null +++ b/rust-legal.html @@ -0,0 +1,480 @@ + + + + + + Rust + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    O Que Rust Tem de Legal

    +
    +
    + +
    +
    +

    Borrow Checker

    +
    + +
    +
    
    +a = 2
    +						
    +
    + +
    + "Variável a tem o valor 2" +
    + +
    +
    + "Posição de memória apontada por a tem o valor 2" +
    + +
    +
    
    +0x3f5cbf89 = 2
    +							
    +
    +
    + +
    +
    + A language that doesn't affect the way you think + about programming, is not worth knowing. +
    + +
    + -- Alan Perlis, "ALGOL" +
    +
    + +
    +
    
    +fn main() {
    +    let a = String::from("hello");
    +    let _b = a;
    +    println!("{}", a)
    +}
    +						
    +
    + +
    +
    
    +error[E0382]: borrow of moved value: `a`
    + --> src/main.rs:5:20
    +  |
    +4 |     let _b = a;
    +  |              - value moved here
    +5 |     println!("{}", a)
    +  |                    ^ value borrowed here after move
    +  |
    +  = note: move occurs because `a` has type `std::string::String`, which does not implement the `Copy` trait
    +						
    +
    + +
    +
    
    +fn main() {
    +    let a = 2;
    +    let b = a;
    +    println!("{}", a);
    +    println!("{}", b);
    +}
    +						
    +
    + +
    +
    
    +2
    +2
    +						
    + +

    "Copy trait"

    +
    + +
    + Swift 5 Exclusivity Enforcement +
    +
    + +
    +
    +

    Imutabilidade por Default

    +
    + +
    +
    
    +fn main() {
    +    let a = 2;
    +    a = 3;
    +    println!("{}", a);
    +}
    +						
    +
    + +
    +
    
    +3 |     let a = 2;
    +  |         -
    +  |         |
    +  |         first assignment to `a`
    +  |         help: make this binding mutable: `mut a`
    +4 |     a = 3;
    +  |     ^^^^^ cannot assign twice to immutable variable
    +						
    +
    + +
    +
    
    +fn main() {
    +    let mut a = 2;
    +    a = 3;
    +    println!("{}", a);
    +}
    +						
    +
    +
    + +
    +
    +

    Enums

    +
    + +
    +
    
    +enum IpAddr {
    +   V4,
    +   V6
    +}
    +						
    +
    + +
    +
    
    +enum IpAddr {
    +    V4(String),
    +    V6(String),
    +}
    +						
    +
    + +
    +
    
    +let home = IpAddr::V4(String::from("127.0.0.1");
    +
    +match home {
    +    V4(address) => println!("IPv4 addr: {}", address),
    +    V6(address) => println!("Ipv6 addr: {}", address),
    +}
    +						
    +
    + +
    +
    
    +enum Option<T> {
    +    Some(T),
    +    None
    +}
    +						
    +
    +
    + +
    +
    +

    Error Control

    +
    + +
    +
    
    +try:
    +    something()
    +except Exception:
    +    pass
    +						
    +
    + +
    +
    
    +try {
    +   something();
    +} catch (Exception ex) {
    +   System.out.println(ex);
    +}
    +						
    +
    + +
    +
    
    +FILE* f = fopen("someting.txt", "wb");
    +fprintf(f, "Done!");
    +fclose(f);
    +						
    +
    + +
    +
    + Onde o erro foi tratado nisso? +
    +
    + +
    +
    
    +enum Result<T, E> {
    +    Ok(T),
    +    Err(E),
    +}
    +						
    +
    + +
    +
    
    +File::create("something.txt") match {
    +    Ok(fp) => fp.write_all(b"Hello world"),
    +    Err(err) => println!("Failure! {}", err),
    +}
    +						
    +
    + +
    +
    
    +File::create("something.txt") match {
    +    Ok(fp) => fp.write_all(b"Hello world") match {
    +        Ok(_) => (),
    +        Err(err) => println!("Can't write! {}", err),
    +    }
    +    Err(err) => println!("Failure! {}", err),
    +}
    +						
    +
    + +
    +
    
    +let mut file = File::create("something.txt).unwrap();
    +file.write(b"Hello world").unwrap();
    +                        
    +
    + +
    +
    
    +let mut file = File::create("something.txt)?;
    +file.write(b"Hello world")?;
    +OK(())
    +                        
    +
    +
    + +
    +
    +

    Crazy stuff

    +
    + +
    + How Rust’s standard library was vulnerable for years and nobody noticed +
    + +
    + No, the problem isn’t “bad coders” +
    + +
    + 4.5k issues no Github +
    + +
    + rustup + +
    + stable-x86_64-pc-windows-msvc +
    + +
    + armv7-unknown-linux-gnueabihf +
    + +
    + wasm32-unknown-unknown (WebAssembly) +
    +
    +
    + +
    +
    +

    Bibliotecas

    +
    + +
    +

    Rayon

    + +
    
    +fn sum_of_squares(input: &[i32]) -> i32 {
    +    input.iter()
    +         .map(|&i| i * i)
    +         .sum()
    +}
    +						
    +
    + +
    +

    Rayon

    + +
    
    +fn sum_of_squares(input: &[i32]) -> i32 {
    +    input.par_iter()
    +         .map(|&i| i * i)
    +         .sum()
    +}
    +						
    +
    + +
    +

    Log-Derive

    + +
    
    +#[logfn(ok = "TRACE", err = "ERROR")]
    +fn call_isan(num: &str) -> Result<Success, Error> {
    +    if num.len() >= 10 && num.len() <= 15 {
    +        Ok(Success)
    +    } else {
    +        Err(Error)
    +    }
    +}
    +                        
    +
    +
    + +
    +
    +

    E quem usa?

    +
    + +
    +

    Magic Pocket

    + +

    Dropbox

    + +

    Petabyte storage

    +
    + +
    +

    Servo

    + +

    Mozilla

    + +

    Base do Firefox Quantum

    +
    + +
    +

    Azure

    + +

    Microsoft

    + +

    Usado na parte de IoT do Azure

    +
    + +
    +

    Tor

    +
    +
    + +
    +
    +
    +
    + + + + + + + + diff --git a/rustlatam-2019.html b/rustlatam-2019.html new file mode 100644 index 0000000..7df71f7 --- /dev/null +++ b/rustlatam-2019.html @@ -0,0 +1,535 @@ + + + + + + Rust LATAM 2019 + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Rust Latam 2019

    +
    +
    + +
    +
    + Me + +
    + +
    +
    +
    + +
    +
    + + + +
    + +
    + +
    +
    + +
    +
    +

    Workshops

    + +

    + + Learning WebAssembly and Rust + +

    + + +
    +
    + +
    +
    + +
    + +
    +

    Talks Day

    +
    +
    + +
    +
    +

    + + Opening Keynote + +

    + +

    Niko Matsakis

    +
    + +
    +

    História do Rust

    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    "Rust is Open"

    +
    +
    + +
    +
    +

    + + Defense Against The Wrong Logic: Proactive Rust Coding + +

    +

    Michael Gattozzi

    +
    + +
    +

    type é para áliases.

    + +
    
    +type Farenheit = i32;
    +type Celsius = i32;
    +
    +fn is_it_hot(t: Farenheit) -> bool;
    +
    +let temp: Celsius = 32;
    +is_it_hot(temp);
    +                        
    +
    + +
    +
    
    +struct Celsius(i32);
    +struct Farenheit(i32);
    +                        
    +
    + +
    +
    
    +impl Into<Celsius> for Farenheit {
    +    fn into(c: Celsius) -> Self {
    +        Self(((c.0 + 9) / 5) as i32 + 32);
    +    }
    +}
    +
    +is_it_hot(temp.into());
    +                        
    +
    + +
    + +
    +
    + +
    +
    +

    + + Interop with Android, IOS and WASM in the same project + +

    +

    Otávio Pace

    +
    + +
    +

    FFI

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    OSHow?
    iOSC integration
    AndroidJNI
    WebWASM
    +
    + +
    +
    
    +mod common;
    +
    +#[cfg(target_os = "android")]
    +mod android;
    +
    +#[cfg(target_os = "ios")]
    +mod ios;
    +
    +#[cfg(target_arch = "wasm32")]
    +mod wasm;
    +                        
    +
    +
    + +
    +
    +

    Rebuilding the Stack for Serverless

    +

    Sergio Benitez

    +
    + +
    +

    Cold Start Preformance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ServiceTime
    AWS Lambda~1.5s
    Google Cloud Functions>2s
    Fastly Terrarium (WASM)~500ms
    $2.50 VPS + NGINX~30ms
    + +
    + +
    +

    Idea

    + +
      +
    • Load executable directly into memory
    • +
    • Run code
    • +
    +
    +
    + +
    +
    +

    WebAssembly with Rust

    +

    Kevin Hoffman

    +
    + +
    +

    + Autor do livro + Programming WebAssembly with Rust +

    +
    + +
    + +
    +
    + +
    +
    +

    + + Friendly Ferris: Developing Kind Compiler Errors + +

    +

    Esteban Kuber

    +
    +
    + +
    +
    +

    + + Procedural Macros vs Sliced Bread + +

    +

    Alex Crichton

    +
    + +
    +
    
    +#[proc_macro]
    +pub fn println(input: TokenStream) -> TokenStream
    +{
    +   // ???
    +}
    +                        
    +
    +
    + +
    +
    +

    The Power of the "Where" Clause

    +

    Florian Gilcher

    +
    + +
    +

    "Don't start out very generic, refactor towards it!"

    +
    + +
    +
    
    +fn debug_iter<I>(iter: I) 
    +where
    +    I: Iterator,
    +    I::Item: Debug
    +{
    +    // ...
    +}
    +                        
    +
    + +
    +
    
    +trait State { }
    +trait TerminalState { }
    +                        
    +
    + +
    +
    
    +trait TransitionTo<S>
    +where S: State,
    +      Self: State
    +{
    +    fn transition(self) -> S;
    +}
    +
    +trait Terminate
    +where Self: TerminalState
    +{
    +    fn terminate(self);
    +}
    +                        
    +
    + +
    +
    
    +struct Start;
    +impl State for Start {}
    +
    +struct Loop;
    +impl State for Loop {}
    +
    +struct Stop;
    +impl State for Stop {}
    +impl TerminalState for Stop {}
    +                        
    +
    + +
    +
    
    +impl TransitionTo<Loop> for Start {
    +    fn transition(self) -> Loop { ... }
    +}
    +
    +impl TransitionTo<Loop> for Loop {
    +    fn transition(self) -> Loop { ... }
    +}
    +
    +impl TransitionTo<End> for Loop {
    +    fn transition(self) -> End { ... }
    +}
    +
    +impl Terminate for End {
    +    fn terminate(self) { ... }
    +}
    +                        
    +
    + +
    +
    
    +fn main() {
    +    let initial = Start;
    +    let next: Loop = initial.transition();
    +    let next: Loop = next.transition();
    +    let next: End = next.transition();
    +    next.terminate();
    +}
    +                        
    +
    +
    + +
    +
    +

    Closing Keynote

    +

    Without Boats

    +
    + +
    +

    Estado geral do async em Rust.

    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + diff --git a/tchelinux.html b/tchelinux.html new file mode 100644 index 0000000..0c6d56d --- /dev/null +++ b/tchelinux.html @@ -0,0 +1,323 @@ + + + + + + Tchelinux + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    O Que É o Tchelinux?

    +
    +
    + +
    +
    +

    O Que É

    + +

    Grupo de Usuários de Software Livre

    +
    + + +
    + +
    +
    +

    Onde Começou

    + + + + +
    +
    + +
    +
    +

    2019

    + + + + +
    + +
    +
    + + + + +
    + +
    +
    +

    Objetivos

    + +
      +
    • Fomentar o crescimento da região
    • +
    • Disseminar o conhecimento sobre software livre
    • +
    • Ajudar entidades da região
    • +
    + + +
    + +
    +

    O evento tem entrada franca, porém os participantes + são encorajados a doar 2kg de alimentos não + perecíveis (exceto sal), que são doados a + instituições de caridade da região.

    + + +
    + +
    +

    100 eventos em 13 anos

    +

    22 cidades

    +

    ~19 toneladas de alimentos arrecadados e distribuídos

    + + + +
    +
    + +
    +
    + + + https://poa.tchelinux.org/ + + +
    +
    + +
    +
    +

    + + julio.biason@pm.me + +

    +
    +
    +
    +
    + + + + + + + + diff --git a/terminimal.css b/terminimal.css new file mode 100644 index 0000000..94a3d95 --- /dev/null +++ b/terminimal.css @@ -0,0 +1,686 @@ +:root { + --accent: rgb(35,176,255); + --accent-alpha-70: rgba(35,176,255,.7); + --accent-alpha-20: rgba(35,176,255,.2); + --background: #1D212C; + --color: white; + --border-color: rgba(255, 255, 255, .1) +} + + +h1 { + background-color: inherit; + color: var(--accent); +} + +header h1 { + font-size: 5rem; + width: 100%; + text-align: center; + height: 90%; + align-items: center; + justify-content: center; + margin: 0; + padding: 0; +} + +.button-container { + display:table; + margin-left:auto; + margin-right:auto +} +button, +.button, +a.button { + position:relative; + display:flex; + align-items:center; + justify-content:center; + padding:8px 18px; + margin-bottom:5px; + text-align:center; + border-radius:8px; + border:1px solid transparent; + appearance:none; + cursor:pointer; + outline:none +} +button.outline, +.button.outline, +a.button.outline { + background:transparent; + box-shadow:none; + padding:8px 18px +} +button.outline :hover, +.button.outline :hover, +a.button.outline :hover { + transform:none; + box-shadow:none +} +button.primary, +.button.primary, +a.button.primary { + box-shadow:0 4px 6px rgba(50,50,93,0.11),0 1px 3px rgba(0,0,0,0.08) +} +button.primary:hover, +.button.primary:hover, +a.button.primary:hover { + box-shadow:0 2px 6px rgba(50,50,93,0.21),0 1px 3px rgba(0,0,0,0.08) +} +button.link, +.button.link, +a.button.link { + background:none; + font-size:1rem +} +button.small, +.button.small, +a.button.small { + font-size:.8rem +} +button.wide, +.button.wide, +a.button.wide { + min-width:200px; + padding:14px 24px +} +a.read-more, +a.read-more:hover, +a.read-more:active { + display:inline-flex; + background:none; + box-shadow:none; + padding:0; + max-width:100% +} +.code-toolbar { + margin-bottom:20px +} +.code-toolbar .toolbar-item a { + position:relative; + display:inline-flex; + align-items:center; + justify-content:center; + padding:3px 8px; + margin-bottom:5px; + text-align:center; + font-size:13px; + font-weight:500; + border-radius:8px; + border:1px solid transparent; + appearance:none; + cursor:pointer; + outline:none +} +.header { + display:flex; + flex-direction:column; + position:relative; +} +.header__inner { + display:flex; + align-items:center; + justify-content:space-between +} +.header__logo { + display:flex; + flex:1 +} +.header__logo:after { + content:''; + background:repeating-linear-gradient(90deg, var(--accent), var(--accent) 2px, transparent 0, transparent 16px); + display:block; + width:100%; + right:10px +} +.header__logo a { + flex:0 0 auto; + max-width:100% +} +.header .menu { + margin:20px 0 0 +} +.header .menu__inner { + display:flex; + flex-wrap:wrap; + list-style:none; + margin:0; + padding:0 +} +.header .menu__inner li.active { + color:var(--accent-alpha-70) +} +.header .menu__inner li:not(:last-of-type) { + margin-right:20px; + margin-bottom:10px; + flex:0 0 auto +} +.header .menu__sub-inner { + position:relative; + list-style:none; + padding:0; + margin:0 +} +.header .menu__sub-inner:not(:only-child) { + margin-left:20px +} +.header .menu__sub-inner-more { + position:absolute; + background:var(--background); + box-shadow:var(--shadow); + color:white; + border:2px solid; + margin:0; + padding:10px; + list-style:none; + z-index:99; + top:35px; + left:0 +} +.header .menu__sub-inner-more-trigger { + color:var(--accent); + user-select:none; + cursor:pointer +} +.header .menu__sub-inner-more li { + margin:0; + padding:5px; + white-space:nowrap +} +.logo { + display:flex; + align-items:center; + text-decoration:none; + background:var(--accent); + color:black; + padding:5px 10px +} +html { + box-sizing:border-box +} +*, +*:before, +*:after { + box-sizing:inherit +} +body { + margin:0; + padding:0; + font-family:Hack, DejaVu Sans Mono, Monaco, Consolas, Ubuntu Mono, monospace; + font-size:1rem; + line-height:1.54; + background-color:var(--background); + color:var(--color); + text-rendering:optimizeLegibility; + -webkit-font-smoothing:antialiased; + -webkit-overflow-scrolling:touch; + -webkit-text-size-adjust:100% +} +@media (max-width: 683px) { + body { + font-size:1rem + } +} +h1, +h2, +h3, +h4, +h5, +h6 { + display:flex; + align-items:center; + font-weight:bold; + line-height:1.3 +} +h1 { + font-size:1.4rem +} +h2 { + font-size:1.3rem +} +h3 { + font-size:1.2rem +} +h4, +h5, +h6 { + font-size:1.15rem +} +a { + color:inherit +} +img { + display:block; + max-width:100% +} +img.left { + margin-right:auto +} +img.center { + margin-left:auto; + margin-right:auto +} +img.right { + margin-left:auto +} +p { + margin-bottom:20px +} +figure { + display:table; + max-width:100%; + margin:25px 0 +} +figure.left img { + margin-right:auto +} +figure.center img { + margin-left:auto; + margin-right:auto +} +figure.right img { + margin-left:auto +} +figure figcaption { + font-size:14px; + padding:5px 10px; + margin-top:5px; + background:var(--accent); + color:var(--background) +} +figure figcaption.left { + text-align:left +} +figure figcaption.center { + text-align:center +} +figure figcaption.right { + text-align:right +} +code { + font-family:Hack, DejaVu Sans Mono, Monaco, Consolas, Ubuntu Mono, monospace; + font-feature-settings:normal; + background:var(--accent-alpha-20); + padding:1px 6px; + margin:0 2px; + font-size:.95rem +} +pre { + font-family:Hack, DejaVu Sans Mono, Monaco, Consolas, Ubuntu Mono, monospace; + padding:20px; + font-size:.95rem; + overflow:auto; + border-top:1px solid rgba(255,255,255,0.1); + border-bottom:1px solid rgba(255,255,255,0.1) +} +@media (max-width: 683px) { + pre { + white-space:pre-wrap; + word-wrap:break-word + } +} +blockquote { + margin:8px 50px; + padding:8px +} +@media (max-width: 683px) { + blockquote { + padding-right:0 + } +} +blockquote:before { + content:'”'; + font-family:Georgia, serif; + font-size:3.875rem; + position:absolute; + left:-40px; + top:-20px +} +blockquote p:first-of-type { + margin-top:0 +} +blockquote p:last-of-type { + margin-bottom:0 +} +blockquote p { + position:relative +} +blockquote p:before { + content:'>'; + display:block; + position:absolute; + left:-25px; + color:var(--accent) +} +table { + table-layout:fixed; + border-collapse:collapse; + width:100%; + margin:40px 0 +} +table, +th, +td { + border:1px dashed var(--accent); + padding:10px +} +th { + color:var(--accent) +} +ul, +ol { + margin-left:30px; + padding:0 +} +ul li, +ol li { + position:relative +} +@media (max-width: 683px) { + ul, + ol { + margin-left:20px + } +} +ul ul, +ul ol, +ol ul, +ol ol { + margin-top:20px +} +ol ol { + list-style-type:lower-alpha +} +.container { + display:flex; + flex-direction:column; + padding:40px; + max-width:864px; + min-height:100vh; + margin:0 auto +} +@media (max-width: 683px) { + .container { + padding:20px + } +} +.content { + display:flex +} +hr { + width:100%; + border:none; + background:var(--border-color); + height:1px +} +.hidden { + display:none +} +.posts { + /* margin:0 auto */ +} +.post { + width:100%; + text-align:left; + margin:8px auto; + padding:20px 0 +} +@media (max-width: 899px) { + .post { + max-width:660px + } +} +.post .post-meta, +.post .post-meta-inline { + font-size:1rem; + margin-bottom:10px; + color:var(--accent-alpha-70) +} +.post-meta-inline { + display:inline +} +.post-title { + position:relative; + color:var(--accent); + margin:0 0 8px; + border-bottom:var(--border); + font-weight:normal +} +.post-title a { + text-decoration:none +} +.post .post-tags, +.post .post-tags-inline { + margin-bottom:20px; + font-size:1rem; + opacity:.5 +} +.post-tags { + display:block +} +.post-tags-inline { + display:inline +} +@media (max-width: 683px) { + .post-tags-inline { + display:block + } +} +.post-content { + margin-top:8px +} +.post-cover { + border:20px solid var(--accent); + background:transparent; + margin:40px 0; + padding:20px +} +@media (max-width: 683px) { + .post-cover { + padding:10px; + border-width:10px + } +} +.post ul { + list-style:none +} +.post ul li:before { + content:'►'; + position:absolute; + left:-20px; + color:var(--accent) +} +.post--regulation h1 { + justify-content:center +} +.post--regulation h2 { + justify-content:center; + margin-bottom:10px +} +.post--regulation h2+h2 { + margin-top:-10px; + margin-bottom:20px +} +.post-list .post-date { + color:var(--accent-alpha-70); + text-decoration:none +} +.post-list a { + text-decoration:none +} +.post-list .post-list-title { + text-decoration:underline +} +.post-list .post-tag { + text-decoration:underline +} +.pagination { + margin-top:50px +} +.pagination__title { + display:flex; + text-align:center; + position:relative; + margin:100px 0 20px +} +.pagination__title-h { + text-align:center; + margin:0 auto; + padding:5px 10px; + background:var(--background); + font-size:.8rem; + text-transform:uppercase; + letter-spacing:.1em; + z-index:1 +} +.pagination__title hr { + position:absolute; + left:0; + right:0; + width:100%; + margin-top:15px; + z-index:0 +} +.pagination__buttons { + display:flex; + align-items:center; + justify-content:center +} +@media (max-width: 683px) { + .pagination__buttons { + flex-direction:column + } +} +.button { + position:relative; + display:inline-flex; + align-items:center; + justify-content:center; + font-size:1rem; + border-radius:8px; + max-width:40%; + padding:0; + cursor:pointer; + appearance:none +} +@media (max-width: 683px) { + .button { + max-width:80% + } +} +.button+.button { + margin-left:10px +} +.button a { + display:flex; + padding:8px 16px; + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.button__text { + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.footer { + padding:40px 0; + flex-grow:0; + opacity:.5 +} +.footer__inner { + display:flex; + align-items:center; + justify-content:space-between; + margin:0; + width:760px; + max-width:100% +} +@media (max-width: 899px) { + .footer__inner { + flex-direction:column + } +} +.footer a { + color:inherit +} +.footer .copyright { + display:flex; + flex-direction:row; + align-items:center; + font-size:1rem; + color:var(--light-color-secondary) +} +.footer .copyright--user { + margin:auto; + text-align:center +} +.footer .copyright>*:first-child:not(:only-child) { + margin-right:10px +} +@media (max-width: 899px) { + .footer .copyright>*:first-child:not(:only-child) { + border:none; + padding:0; + margin:0 + } +} +@media (max-width: 899px) { + .footer .copyright { + flex-direction:column; + margin-top:10px + } +} +@media (max-width: 899px) { + .footer .copyright-theme-sep { + display:none + } +} +@media (max-width: 899px) { + .footer .copyright-theme { + font-size:0.75rem + } +} +.footnote-definition { + margin-bottom:8px +} +.footnote-definition p { + display:inline +} + +/*! + * Hack typeface https://github.com/source-foundry/Hack + * License: https://github.com/source-foundry/Hack/blob/master/LICENSE.md + */@font-face { + font-family:'Hack'; + src:url("fonts/hack-regular.woff2?sha=3114f1256") format("woff2"), + url("fonts/hack-regular.woff?sha=3114f1256") format("woff"); + font-weight:400; + font-style:normal +} +@font-face { + font-family:'Hack'; + src:url("fonts/hack-bold.woff2?sha=3114f1256") format("woff2"), + url("fonts/hack-bold.woff?sha=3114f1256") format("woff"); + font-weight:700; + font-style:normal +} +@font-face { + font-family:'Hack'; + src:url("fonts/hack-italic.woff2?sha=3114f1256") format("woff2"), + url("fonts/hack-italic.woff?sha=3114f1256") format("woff"); + font-weight:400; + font-style:italic +} +@font-face { + font-family:'Hack'; + src:url("fonts/hack-bolditalic.woff2?sha=3114f1256") format("woff2"), + url("fonts/hack-bolditalic.woff?sha=3114f1256") format("woff"); + font-weight:700; + font-style:italic +} + +.hide { + display: none; +} diff --git a/unit-in-unittest.html b/unit-in-unittest.html index 1e1f508..a75ab44 100644 --- a/unit-in-unittest.html +++ b/unit-in-unittest.html @@ -70,7 +70,7 @@
  • CWI Software
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me
  • diff --git a/unit-in-unittests-2.html b/unit-in-unittests-2.html index 2ec561e..1c667c1 100644 --- a/unit-in-unittests-2.html +++ b/unit-in-unittests-2.html @@ -69,7 +69,7 @@
  • Júlio Biason
  • @juliobiason
  • julio.biason@gmail.com
  • -
  • http://presentations.juliobiason.net
  • +
  • https://presentations.juliobiason.me