<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lucas Teles: Dev<T>]]></title><description><![CDATA[Software Engineer, fullstack, podcaster, agilista, speaker, entusiasta de teclados mecânicos, evangelista de Vim e hobbysta GameDev]]></description><link>https://lucasteles.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1618582325037/y4aAgW2Km.png</url><title>Lucas Teles: Dev&lt;T&gt;</title><link>https://lucasteles.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 20:23:14 GMT</lastBuildDate><atom:link href="https://lucasteles.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[RebuildCast #24- Clojure]]></title><description><![CDATA[Olá ouvintes neste episódio vamos falar sobre Clojure, uma linguagem que é muito conhecida mas pouco falada, neste episodio vamos trazer uma introdução ao que é Clojure, e como é desenvolver com essa linguagem.

Inscreva-se: Apple Podcasts | Android ...]]></description><link>https://lucasteles.dev/rebuildcast-24-clojure</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-24-clojure</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[Clojure]]></category><category><![CDATA[ClojureScript]]></category><category><![CDATA[Functional Programming]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 13 Sep 2021 05:09:21 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio vamos falar sobre Clojure, uma linguagem que é muito conhecida mas pouco falada, neste episodio vamos trazer uma introdução ao que é Clojure, e como é desenvolver com essa linguagem.</p>
<p><iframe src="https://cast.rocks/player/28261/24-Clojure.mp3?episodeTitle=%2324%20-%20Clojure&amp;podcastTitle=RebuildCast&amp;episodeDate=September%2013th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>
Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a>
<a target="_blank" href="http://cast.rocks/hosting/28261/24-Clojure.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
<li><a target="_blank" href="https://github.com/edenferreira">Eden Ferreira</a> </li>
<li><a target="_blank" href="https://www.linkedin.com/in/rodolfo42">Rodolfo Ferreira</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li>O que é?</li>
<li>Lisp</li>
<li>Data Driven e Edn</li>
<li>REPL</li>
<li>Formas</li>
<li>Velocidade no Desenvolvimento</li>
<li>Arquitetura</li>
<li>Iterop Java[Script]</li>
<li>Onde brilha e onde falha?</li>
<li>Onde começar com clojure (Estudar)</li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://xkcd.com/224/">xkcd - Lisp</a></li>
<li><a target="_blank" href="https://xkcd.com/297/">xkcd - Lisp Cycles</a></li>
<li><a target="_blank" href="https://toggl.com/blog/save-princess-8-programming-languages">How to Save the Princess</a></li>
<li><a target="_blank" href="https://en.wikipedia.org/wiki/Homoiconicity">Homoiconicity</a></li>
<li><a target="_blank" href="https://practical.li/spacemacs/structural-editing/">structural editing</a></li>
<li><a target="_blank" href="https://github.com/guns/vim-sexp">vim sexp</a></li>
<li><a target="_blank" href="https://calva.io/paredit/">paredit</a></li>
<li><a target="_blank" href="https://en.wikipedia.org/wiki/Game_Oriented_Assembly_Lisp">Lisp in Games (Crash, Uncharted, Last of Us)</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=wASCH_gPnDw">Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure</a></li>
<li><a target="_blank" href="https://clojure.org/guides/reader_conditionals">Reader Conditionals Guide</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2020/09/lambda3-podcast-212-monogame/">Podcas Monogame</a></li>
<li><a target="_blank" href="https://twitter.com/LucasTeles42/status/1434285354928988164">Flappy Bird em Clojure com .NET</a></li>
<li><a target="_blank" href="https://www.destroyallsoftware.com/talks/wat">WAT (talk sobre coisas estranhas em linguagens #fun)</a></li>
<li><a target="_blank" href="https://www.braveclojure.com/foreword/">brave clojure</a></li>
<li><a target="_blank" href="https://github.com/parenthesin/microservice-boilerplate">microservice boilerplate</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=US8QG9I1XW0">Functional architecture - The pits of success - Mark Seemann
</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=Ux5wUSOsEfc">One kata, three languages - Mark Seemann
</a></li>
<li><a target="_blank" href="https://gist.github.com/rodolfo42/d0a813f68d8818e3d7038f71f858cbd0">Resources for learning Clojure</a></li>
<li><a target="_blank" href="https://www.alura.com.br/formacao-clojure">Alura - Formacao clojure #paganóis</a></li>
<li><a target="_blank" href="https://join.slack.com/t/clojurians/shared_invite/zt-lsr4rn2f-jealnYXLHVZ61V2vdi15QQ">Canal Clojurians no Slack</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #23 - Estudo]]></title><description><![CDATA[Olá ouvintes neste episódio vamos falar sobre estudo, como fazemos para nos mantermos atualizados e damos algumas dicas que talvez possa funcionar pra você.

Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Pa...]]></description><link>https://lucasteles.dev/rebuildcast-23-estudo</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-23-estudo</guid><category><![CDATA[Developer]]></category><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 29 Aug 2021 21:05:12 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio vamos falar sobre estudo, como fazemos para nos mantermos atualizados e damos algumas dicas que talvez possa funcionar pra você.</p>
<p><iframe src="https://cast.rocks/player/28261/23-Estudo.mp3?episodeTitle=%2323%20-%20Estudo&amp;podcastTitle=RebuildCast&amp;episodeDate=August%2029th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>
Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/23-Estudo.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
<li><a target="_blank" href="https://twitter.com/caicorre">Caio Correa</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li>Você gosta de estudar?</li>
<li>Como estudar coisas chatas?</li>
<li>Tem que ter BRIO</li>
<li>Qual forma de estudo você prefere?</li>
<li>Estudo visual vs estudo escrito</li>
<li>Anotações / Consolidar Base Conhecimento</li>
<li>E a faculdade? </li>
<li>Autodidata existe?</li>
<li>Ensino a distância / Youtube?</li>
<li>Mentoria</li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://www.youtube.com/watch?v=TRPBY_lxJfE">Link do video do BRIO</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="http://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="http://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="http://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #22 - Desenvolvimento de Games]]></title><description><![CDATA[Olá ouvintes neste episódio vamos falar sobre como é fazer joguinhos digitais, para isso temos a presença do Andre Cardoso dono de um dos canais mais legais de GameDev do YouTube!



Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify |...]]></description><link>https://lucasteles.dev/rebuildcast-22-desenvolvimento-de-games</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-22-desenvolvimento-de-games</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[Game Development]]></category><category><![CDATA[Games]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 16 Aug 2021 03:50:24 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio vamos falar sobre como é fazer joguinhos digitais, para isso temos a presença do <a target="_blank" href="https://www.youtube.com/channel/UCLyVUwlB_Hahir_VsKkGPIA">Andre Cardoso</a> dono de um dos canais mais legais de GameDev do YouTube!</p>
<iframe src="https://cast.rocks/player/28261/22-Desenvolvimento-de-games.mp3?episodeTitle=%2322%20-%20Desenvolvimento%20de%20Games&amp;podcastTitle=RebuildCast&amp;episodeDate=August%2016th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/22-Desenvolvimento-de-games.mp3">DOWNLOAD</a></p>
<p>Participantes: </p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/andre_mc">Andre Cardoso</a></li>
<li><a target="_blank" href="https://twitter.com/AlanPereiraArt">Alan Pereira</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li><p><em>Sobre GameDev</em>:</p>
</li>
<li><p>Como é trabalhar com games?</p>
</li>
<li>O que é essencial para um dev de mercado ir pra games?</li>
<li>Preciso saber arte? (desenho, modelagem, musica)</li>
<li>Papeis de um gamedev? (tech artist, backend, pipelines, game engine, engine dev)</li>
<li><p>E matematica? 👀</p>
</li>
<li><p><em>Mix and Jam</em>:</p>
</li>
<li>Porque usa só Unity nos vídeos e se pretende usar (ou estuda) alguma outra engine?</li>
<li>Como ele descobre qual mecânica um determinado jogo usa, como é esse processo de estudo e replicação.</li>
<li>Qual foi a mecância que você mais curtiu replicar?</li>
<li>Qual foi a mais difícil?</li>
<li><p>Polimento</p>
</li>
<li><p><em>Considerações finais</em>:</p>
</li>
<li>Como e onde aprender?</li>
</ul>
<p>Links: </p>
<ul>
<li><a target="_blank" href="https://www.youtube.com/channel/UCLyVUwlB_Hahir_VsKkGPIA">Canal Mix and Jam</a></li>
<li><a target="_blank" href="https://lucasteles.dev/rebuildcast-7-gamejam">Podcast GameJam</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2020/05/lambda3-podcast-196-unity">Podcast Unity</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2020/09/lambda3-podcast-212-monogame/">Podcast MonoGame</a></li>
<li><a target="_blank" href="https://lucasteles.itch.io/slasherlock">Jogo de GameJam do Lucas</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=MOYiVLEnhrw&amp;list=PLImQaTpSAdsD88wprTConznD1OY1EfK_V">Curso de matemática da Freya</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=kfM-yu0iQBk&amp;list=PLImQaTpSAdsCnJon-Eir92SZMl7tPBS4Z">Curso de Shaders</a></li>
<li><a target="_blank" href="https://mentorama.com.br/unity-developer">Curso de Unity do Alan</a></li>
</ul>
<p>Livros:</p>
<ul>
<li><a target="_blank" href="https://www.amazon.com.br/Level-UP-Design-Grandes-Jogos/dp/852120700X/ref=asc_df_852120700X/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379805025824&amp;hvpos=&amp;hvnetw=g&amp;hvrand=11230380249492205779&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001773&amp;hvtargid=pla-423142399401&amp;psc=1">Level Up</a></li>
<li><a target="_blank" href="https://www.amazon.com.br/Theory-Fun-Game-Design/dp/1449363210/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;dchild=1&amp;keywords=Theory+of+Fun&amp;qid=1629085580&amp;s=books&amp;sr=1-1&amp;ufe=app_do%3Aamzn1.fos.6121c6c4-c969-43ae-92f7-cc248fc6181d">Theory of Fun</a></li>
<li><a target="_blank" href="https://www.amazon.com.br/Game-Feel-Designers-Virtual-Sensation/dp/1138403253/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;dchild=1&amp;keywords=Game+feel&amp;qid=1629085603&amp;s=books&amp;sr=1-1&amp;ufe=app_do%3Aamzn1.fos.25548f35-0de7-44b3-b28e-0f56f3f96147">Game Feel</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #21 - Kafka]]></title><description><![CDATA[Olá ouvintes neste episódio iremos falar sobre o famoso e formoso Kafka, um das tecnologias do momento, o que é?, como funciona? e varias dicas maneiras!


Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Part...]]></description><link>https://lucasteles.dev/rebuildcast-21-kafka</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-21-kafka</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[kafka]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Azure]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 12 Jul 2021 00:18:49 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio iremos falar sobre o famoso e formoso Kafka, um das tecnologias do momento, o que é?, como funciona? e varias dicas maneiras!</p>
<iframe src="https://cast.rocks/player/28261/21-Kafka.mp3?episodeTitle=%2321%20-%20Kafka&amp;podcastTitle=RebuildCast&amp;episodeDate=July%2012th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>

<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/21-Kafka.mp3">DOWNLOAD</a></p>
<p>Participantes: </p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://www.linkedin.com/in/neilton-rocha-60216960/">Neilton Rocha</a></li>
<li><a target="_blank" href="https://www.linkedin.com/in/thiago-silva-concei%C3%A7%C3%A3o-605a57131/">Thiago Conceição</a></li>
<li><a target="_blank" href="https://www.linkedin.com/in/iago-borges-31a859bb/">Iago Borges</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li>O que é e de onde veio?</li>
<li>Por que usar o kafka e não uma fila ?</li>
<li>Tópicos, Segmentação, Producer, consumer, consumer group</li>
<li>Partição</li>
<li>Quais as diferenças do uso de uma fila? (deadletters, reprocessamento, etc)</li>
<li>Qual e o tempo de vida das mensagens ?</li>
<li>Uso como Banco de dados</li>
<li>Streams e Performance</li>
<li>Qual caminho escolher gerenciado ou não</li>
<li>Apache Zookeeper</li>
<li>Kafka Connect</li>
<li>Monitoramento</li>
<li>Auto scaling e replicação</li>
<li>Como conectar meus servicos</li>
<li>Onde e como aprender?</li>
</ul>
<p>Links: </p>
<ul>
<li><a target="_blank" href="https://blog.softwaremill.com/7-mistakes-when-using-apache-kafka-44358cd9cd6">7 mistakes when using Apache Kafka</a></li>
<li><a target="_blank" href="https://www.alura.com.br/formacao-kafka">Cursos de Kafka da Alura</a></li>
<li><a target="_blank" href="https://kafka.apache.org/documentation/#gettingStarted">Getting Started</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=G6Tcy7hNdA8">O que é o Kafka</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #20 - Entity Framework]]></title><description><![CDATA[Olá ouvintes neste episódio iremos falar sobre o mais famoso ORM do mundo .NET, a lib mais magica e talvez subestimada para aplicações modernas, o famoso Entity Framework, vamos falar sobre os pontos que achamos interessantes, vantagens e experiência...]]></description><link>https://lucasteles.dev/rebuildcast-20-entity-framework</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-20-entity-framework</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[Databases]]></category><category><![CDATA[domain]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 27 Jun 2021 20:09:56 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio iremos falar sobre o mais famoso ORM do mundo .NET, a lib mais magica e talvez subestimada para aplicações modernas, o famoso Entity Framework, vamos falar sobre os pontos que achamos interessantes, vantagens e experiência com ele.</p>
<iframe src="https://cast.rocks/player/28261/20-Entity-Framework.mp3?episodeTitle=%2320%20-%20Entity%20Framework&amp;podcastTitle=RebuildCast&amp;episodeDate=June%2027th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>

<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/20-Entity-Framework.mp3">DOWNLOAD</a></p>
<p>Participantes: </p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/akamud">Mahmoud Ali</a></li>
<li><a target="_blank" href="https://twitter.com/AmorimRob">Robson Amorin</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
</ul>
<p>Links: </p>
<ul>
<li><a target="_blank" href="https://docs.microsoft.com/pt-br/ef/core/">Visão geral</a></li>
<li><a target="_blank" href="https://www.learnentityframeworkcore.com/">Learn Entity Framework</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #19 - Prevenindo o Colapso da Civilização]]></title><description><![CDATA[Olá ouvintes neste episódio iremos falar sobre uma palestra do Jonathan Blow sobre "Prevenir o colapso da sociedade", uma discussão aberta, nossas opiniões e devaneios sobre abstração e complexidade.




Inscreva-se: Apple Podcasts | Android | Google...]]></description><link>https://lucasteles.dev/rebuildcast-19-prevenindo-o-colapso-da-civilizacao</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-19-prevenindo-o-colapso-da-civilizacao</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[Game Development]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 14 Jun 2021 03:36:49 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio iremos falar sobre uma palestra do <a target="_blank" href="https://twitter.com/jonathan_blow">Jonathan Blow</a> sobre "Prevenir o colapso da sociedade", uma discussão aberta, nossas opiniões e devaneios sobre abstração e complexidade.</p>
<iframe src="https://cast.rocks/player/28261/19-prevenindo-o-colapso-da-civilizacao.mp3?episodeTitle=%2319%20-%20Prevenindo%20o%20Colapso%20da%20Civiliza%C3%A7%C3%A3o&amp;podcastTitle=RebuildCast&amp;episodeDate=June%2014th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>



<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/19-prevenindo-o-colapso-da-civilizacao.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/feokuma">Fernando Okuma</a></li>
<li><a target="_blank" href="https://twitter.com/_guspassos">Gustavo Passos</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://www.youtube.com/watch?v=ZSRHeXYDLko">Video da palestra</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #18 - Fazendo Emuladores]]></title><description><![CDATA[Olá ouvintes neste episódio iremos falar sobre como foi a experiência de criar um emulador pra um processador 6502! bastante coisa sobre assembly, hardware e programação baixo nível, vem conferir!



Inscreva-se: Apple Podcasts | Android | Google Pod...]]></description><link>https://lucasteles.dev/rebuildcast-18-fazendo-emuladores</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-18-fazendo-emuladores</guid><category><![CDATA[podcast]]></category><category><![CDATA[podcasts]]></category><category><![CDATA[C]]></category><category><![CDATA[Inspiration]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 30 May 2021 19:32:53 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio iremos falar sobre como foi a experiência de criar um emulador pra um processador 6502! bastante coisa sobre assembly, hardware e programação baixo nível, vem conferir!</p>
<iframe src="https://cast.rocks/player/28261/18-Fazendo-Emuladores.mp3?episodeTitle=%2318%20-%20Fazendo%20Emuladores&amp;podcastTitle=RebuildCast&amp;episodeDate=May%2030th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/18-Fazendo-Emuladores.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/feokuma">Fernando Okuma</a></li>
<li><a target="_blank" href="https://github.com/lucascebertin">Lucas Bertin</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li>Motivação</li>
<li>O que é um emulador</li>
<li>O que é 6502?</li>
<li>Como um processador/computador funciona</li>
<li>O que é Assembly</li>
<li>O que é bytecode e machinecode</li>
<li>Como emular algo?</li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://github.com/nopsteam/6502">Repositorio do Emulador Criado</a></li>
<li><a target="_blank" href="https://www.youtube.com/beneater">Canal do Ben Eater</a></li>
<li><a target="_blank" href="http://www.inf.ufrgs.br/arq/wiki/doku.php?id=start">Emuladores de processadores para aprendizado</a></li>
<li><a target="_blank" href="http://www.inf.ufrgs.br/arq/wiki/doku.php?id=daedalus">Compilador ASM para os processadores para aprendizado</a></li>
<li><a target="_blank" href="http://www.6502.org/tutorials/6502opcodes.html">OP-codes do 6502</a></li>
<li><a target="_blank" href="http://skilldrick.github.io/easy6502">Easy 6502</a></li>
<li><a target="_blank" href="https://www.amazon.com.br/Xchg-Rax-Xorpd/dp/1502958082/ref=sr_1_1?dchild=1&amp;qid=1621986026&amp;refinements=p_27%3AXorpd&amp;s=books&amp;sr=1-1">Livro <em>Xchg Rax, Rax</em></a></li>
<li><a target="_blank" href="https://store.steampowered.com/app/370360/TIS100/">Jogo TIS-100</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #17 - TypeScript, o Javascript certo!]]></title><description><![CDATA[Olá ouvintes neste episódio iremos falar sobre a forma mais divertida de se escrever JavaScript, que é usando TypeScript! Neste episódio iremos abordar o porque acreditamos nisso, quais as vantagens e desvantagens de se usar TS e tipagem.



Inscreva...]]></description><link>https://lucasteles.dev/rebuildcast-17-typescript-o-javascript-certo</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-17-typescript-o-javascript-certo</guid><category><![CDATA[podcast]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 17 May 2021 15:32:49 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes neste episódio iremos falar sobre a forma mais divertida de se escrever JavaScript, que é usando TypeScript! Neste episódio iremos abordar o porque acreditamos nisso, quais as vantagens e desvantagens de se usar TS e tipagem.</p>
<iframe src="https://cast.rocks/player/28261/17-TypeScript-o-JavaScript-certo.mp3?episodeTitle=%2317%20-%20TypeScript%2C%20o%20JavaScript%20certo!&amp;podcastTitle=RebuildCast&amp;episodeDate=May%2017th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/17-TypeScript-o-JavaScript-certo.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/willgmbr">William Grasel</a></li>
<li><a target="_blank" href="https://twitter.com/HigorRozan">Higor Rozan</a></li>
<li><a target="_blank" href="https://twitter.com/awvalenti">André Valenti</a></li>
</ul>
<p>Pauta: </p>
<ul>
<li>O que é e quando nasceu</li>
<li>Como foi seu primeiro contato?</li>
<li>É transformar JS em C#/JAVA?</li>
<li>Type System (structural typing)</li>
<li>Static vs Dinamic</li>
<li>Strongly vs Weakly</li>
<li>JavaScript e TypeScript vão seguir caminhos diferentes?</li>
<li>JavaScript ainda vai ter tipos na própria linguagem?</li>
<li>TS é pra OO?</li>
<li>O que fica melhor com TypeScript? Testes, Prog. Func., Node, React, Angular...?</li>
<li>Como o ferramental TS melhorou com o tempo, (ts-node, ts-jest)</li>
<li>Como frameworks e libs estão usando TS, para melhorar a estrutura de código e facilitar a vida (NestJS, TypeORM, class-validator)</li>
<li>Como é o trabalho no dia-a-dia com TS? (spoiler: se você usa VSCode com JS, já está usando sem saber)</li>
<li>Adoção progressiva</li>
<li>O que é o strict mode? Vale a pena usar?</li>
<li>Problemas? dores? tempo de compilação?</li>
<li>Empresas q usam TypeScript</li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://lucasteles.dev/rebuildcast-14-programacao-reativa">Podcast Programação Reativa</a></li>
<li><a target="_blank" href="https://github.com/awvalenti/fugaescorregadia/">Jogo do Andre</a></li>
<li><a target="_blank" href="https://medium.com/@tomdale/glimmer-js-whats-the-deal-with-typescript-f666d1a3aad0">Glimmer.js: What’s the Deal with TypeScript?</a></li>
<li><a target="_blank" href="https://twitter.com/CaseSandberg/status/1038626258362327041">46% do NPM usa TypeScript</a></li>
<li><a target="_blank" href="https://github.com/gcanti/fp-ts">FP TS</a></li>
<li>Cases<ul>
<li><a target="_blank" href="https://eng.lyft.com/typescript-at-lyft-64f0702346ea">TypeScript na Lyft</a></li>
<li><a target="_blank" href="https://slack.engineering/typescript-at-slack/">TypeScript no Slack</a></li>
<li><a target="_blank" href="https://blog.asana.com/2014/11/asana-switching-typescript/">TypeScript na Asana</a></li>
<li><a target="_blank" href="https://medium.com/airbnb-engineering/tagged/typescript">TypeScript no AirbnB</a></li>
<li><a target="_blank" href="https://redditblog.com/2017/06/30/why-we-chose-typescript/">TypeScript no Reddit</a></li>
</ul>
</li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #16 - Desenvolvimento iOS]]></title><description><![CDATA[Olá ouvintes! nesse episódio contamos com a presença de uma galera fera pra falar do caminho das pedras do desenvolvimento iOS moderno. Bora escutar! 


Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Pauta: ...]]></description><link>https://lucasteles.dev/rebuildcast-16-desenvolvimento-ios</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-16-desenvolvimento-ios</guid><category><![CDATA[podcast]]></category><category><![CDATA[iOS]]></category><category><![CDATA[iphone]]></category><category><![CDATA[macOS]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 02 May 2021 20:11:24 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes! nesse episódio contamos com a presença de uma galera fera pra falar do caminho das pedras do desenvolvimento iOS moderno. Bora escutar! </p>
<iframe src="https://cast.rocks/player/28261/16-Desenolvimento-iOS.mp3?episodeTitle=%2316%20-%20Desenvolvimento%20iOS&amp;podcastTitle=RebuildCast&amp;episodeDate=May%202nd%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>

<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/16-Desenolvimento-iOS.mp3">DOWNLOAD</a></p>
<p>Pauta: </p>
<ul>
<li>Como começamos com desenvolvimento (Mac, iOS, AppleWatch)? </li>
<li>Swift e Objetive C <ul>
<li>StoryBoard e SwiftUI </li>
</ul>
</li>
<li>Quais as maiores diferenças entre o desenvolvimento para Apple? </li>
<li>O que preciso pra mudar de stack? </li>
<li>Conta de Desenvolvedor </li>
<li>Assinatura dos Aplicativos (Provisioning profiles) </li>
<li>Ferramental usado no desenvolvimento nativo </li>
<li>Quebras e atualizações de APIs do sistema </li>
<li>Testes no iOS/macOS </li>
<li>Publicação do Aplicativo </li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/caicorre">Caio Correia</a></li>
<li><a target="_blank" href="https://github.com/PowerPaloma">Paloma Bispo</a></li>
<li><a target="_blank" href="https://twitter.com/_inside">Guilherme Rambo</a></li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://www.lambda3.com.br/2018/11/lambda3-podcast-118-desenvolvimento-ios-e-macos/">Podcast iOS 2018</a></li>
<li><a target="_blank" href="http://high5devs.com/2018/01/ios-provisioning-profiles-automatizados-com-fastlane-cert-e-sigh/">Post sobre FastLane</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)
<a target="_blank" href="https://www.facebook.com/MDKOfficial">Facebook MDKOfficial</a>
<a target="_blank" href="https://www.youtube.com/MDKOfficialYT">Youtube MDKOfficialYT</a>
<a target="_blank" href="https://www.mdkofficial.bandcamp.com">Buy the song here</a>
Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #15 - .NET para Devs não .NET]]></title><description><![CDATA[Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Participantes:

Lucas Teles
Arthur Fucher
Fernando Okuma
Robson Amorim

Pauta: 

Linguagem velha, parece Java
C#
F#
Só roda em Windows
Nada é open source
WebFor...]]></description><link>https://lucasteles.dev/rebuildcast-15-net-para-devs-nao-net</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-15-net-para-devs-nao-net</guid><category><![CDATA[podcast]]></category><category><![CDATA[dotnet]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 19 Apr 2021 01:55:20 GMT</pubDate><content:encoded><![CDATA[<iframe src="https://cast.rocks/player/28261/15-.net-para-devs-nao-.net.mp3?episodeTitle=%2315%20-%20.NET%20para%20Devs%20n%C3%A3o%20.NET&amp;podcastTitle=RebuildCast&amp;episodeDate=April%2019th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/15-.net-para-devs-nao-.net.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
<li><a target="_blank" href="https://twitter.com/feokuma">Fernando Okuma</a></li>
<li><a target="_blank" href="https://twitter.com/AmorimRob">Robson Amorim</a></li>
</ul>
<p>Pauta: </p>
<ul>
<li>Linguagem velha, parece Java</li>
<li>C#</li>
<li>F#</li>
<li>Só roda em Windows</li>
<li>Nada é open source</li>
<li>WebForms é horrivel!</li>
<li>Preciso pagar o Visual Stuido</li>
<li>Você tem edições não salvas neste campo.</li>
<li>Performance</li>
<li>Xamarin/MAUI</li>
<li>Blazor</li>
<li>IOT</li>
<li>Games</li>
<li>Comunidade</li>
<li>Por onde começar?</li>
</ul>
<p>Links:</p>
<p><a target="_blank" href="https://dotnet.microsoft.com/download">Download .NET</a>
<a target="_blank" href="https://docs.microsoft.com/pt-br/dotnet/csharp/tour-of-csharp/">Iniciando com C#</a></p>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)
<a target="_blank" href="https://www.facebook.com/MDKOfficial">Facebook MDKOfficial</a>
<a target="_blank" href="https://www.youtube.com/MDKOfficialYT">Youtube MDKOfficialYT</a>
<a target="_blank" href="https://www.mdkofficial.bandcamp.com">Buy the song here</a>
Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #14 - Programação Reativa]]></title><description><![CDATA[Olá ouvintes, neste episódio vamos conversar sobre programação reativa, reactive extensions, RxJs, como funciona, o que é, e muito mais!
 

Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Participantes:

Luca...]]></description><link>https://lucasteles.dev/rebuildcast-14-programacao-reativa</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-14-programacao-reativa</guid><category><![CDATA[podcast]]></category><category><![CDATA[RxJS]]></category><category><![CDATA[Reactive Programming]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 04 Apr 2021 19:02:31 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio vamos conversar sobre programação reativa, reactive extensions, RxJs, como funciona, o que é, e muito mais!</p>
 <iframe src="https://cast.rocks/player/28261/14-programacao-reativa.mp3?episodeTitle=%2314%20-%20programa%C3%A7%C3%A3o%20reativa&amp;podcastTitle=RebuildCast&amp;episodeDate=April%204th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>

<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/14-programacao-reativa.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
<li><a target="_blank" href="https://twitter.com/caicorre">Caio Correa</a></li>
<li><a target="_blank" href="https://twitter.com/willgmbr">William Grasel</a></li>
</ul>
<p>Pauta:</p>
<ul>
<li>o que é?</li>
<li>é um paradigma? funcional?</li>
<li>Manifesto reativo</li>
<li>Async Streams</li>
<li>Diferenca entre Observables e Promise/TasksObserver/Observable</li>
<li>cold/hot obsevables</li>
<li>Compisocao</li>
<li>Reative Extensions</li>
<li>Imutabilidade e boas práticas</li>
<li>Como fazer testes</li>
<li>Angular (e outros, redux, elm)</li>
<li>Quando usar?</li>
<li>Como aprender</li>
</ul>
<p>Citações:</p>
<p><img src="https://i.imgur.com/GE6wCUX.png" alt /></p>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://rxviz.com/">rxviz</a></li>
<li><a target="_blank" href="https://rxjs.dev">rxjs.dev</a></li>
<li><a target="_blank" href="https://rxjs.dev/">egghead.io</a></li>
<li><a target="_blank" href="https://gist.github.com/staltz/868e7e9bc2a7b8c1f754">The introduction to Reactive Programming you've been missing</a></li>
<li><a target="_blank" href="https://rxmarbles.com/">rxmarbles.com</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2020/11/lambda3-podcast-220-functors-e-monads/">Podcast programação funcional e monadas (Lambda3)</a></li>
<li><a target="_blank" href="https://hipsters.tech/functions-monadas-e-programacao-funcional-hipsters-190/">Podcast programação funcional e monadas (Hipsters ponto tech)</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2021/02/lambda3-podcast-236-programacao-funcional-parte-3-railway-oriented-programming/">Podcast ROP</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #13 - Perrengues]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos bater um papo e rir juntos de vários perrengues que passamos no decorrer das nossas carreiras.



Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Participantes:

Lucas Tele...]]></description><link>https://lucasteles.dev/rebuildcast-13-perrengues</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-13-perrengues</guid><category><![CDATA[podcast]]></category><category><![CDATA[DevLife]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 21 Mar 2021 19:01:20 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos bater um papo e rir juntos de vários perrengues que passamos no decorrer das nossas carreiras.</p>
<iframe src="https://cast.rocks/player/28261/13-perrengues.mp3?episodeTitle=%2313%20-%20Perrengues&amp;podcastTitle=RebuildCast&amp;episodeDate=March%2021st%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/13-perrengues.mp3">DOWNLOAD</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
<li><a target="_blank" href="https://github.com/lucascebertin">Lucas Bertin</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
</ul>
<p>Links:</p>
<p><a target="_blank" href="https://vidadeprogramador.com.br/2016/07/19/esses-erros-do-sistema/">Tirinha do Vide de Programador</a></p>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #12 - Contratação]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre contratação e processos seletivos principalmente na visão de quem contrata, claro que essa visão é importante também pra quem participa dos processos, então bora conferir



Inscreva-se: Apple Podcasts ...]]></description><link>https://lucasteles.dev/rebuildcast-12-contratacao</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-12-contratacao</guid><category><![CDATA[podcast]]></category><category><![CDATA[hiring]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Mon, 08 Mar 2021 18:59:59 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre contratação e processos seletivos principalmente na visão de quem contrata, claro que essa visão é importante também pra quem participa dos processos, então bora conferir</p>
<iframe src="https://cast.rocks/player/28261/12-contratacao.mp3?episodeTitle=%2312%20-%20Contrata%C3%A7%C3%A3o&amp;podcastTitle=RebuildCast&amp;episodeDate=March%208th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/12-contratacao.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>Como avaliador:</li>
<li>O que um processo busca responder?</li>
<li>Tamanho do processo</li>
<li>Etapas de um processo</li>
<li>Teste técnico</li>
<li>Teste copiado?</li>
<li>Teste Pareado</li>
<li>Não seja carrancudo</li>
<li>Avaliar Soft/Hard Skills</li>
<li>Como avaliado:</li>
<li>O que é ruim</li>
<li>Dicas</li>
<li>Devo continuar fazendo mesmo empregado?</li>
</ul>
<p>Links:</p>
<p><a target="_blank" href="http://high5devs.com/?s=drops+de+testes">Posts sobre testes do High5Devs</a></p>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/AmorimRob">Robson Amorin</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
<li><a target="_blank" href="https://twitter.com/guiportooo">Guilherme Porto</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #11 - Você gosta de programar?]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre o amor em desenvolver software, se ele é necessário ou não e o quanto isso pode influenciar na sua carreira... ou não...



Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | R...]]></description><link>https://lucasteles.dev/rebuildcast-11-voce-gosta-de-programar</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-11-voce-gosta-de-programar</guid><category><![CDATA[podcast]]></category><category><![CDATA[Developer]]></category><category><![CDATA[DevLife]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 21 Feb 2021 18:58:27 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre o amor em desenvolver software, se ele é necessário ou não e o quanto isso pode influenciar na sua carreira... ou não...</p>
<iframe src="https://cast.rocks/player/28261/11-Voce-gosta-de-programar.mp3?episodeTitle=%2311%20-%20Voc%C3%AA%20gosta%20de%20programar%3F&amp;podcastTitle=RebuildCast&amp;episodeDate=February%2021st%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/11-Voce-gosta-de-programar.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>Pq escolhemos ser dev?</li>
<li>Oq te motiva?</li>
<li>O lado criativo do desenvolvimento</li>
<li>Vc toparia virar gerente ganhando mais?</li>
<li>Ja quis mudar de area?</li>
<li>Um pessoa precisa amar para ser uma boa dev?</li>
<li>Se nao gostar vai ser mais dificil?</li>
<li>Da pra aprender a gostar?</li>
<li>Codar por hobbie / lazer / desafios / dojo</li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/LucasTeles42/status/1339193456539873282">Tweet perguntando se gosta de programar</a></li>
<li><a target="_blank" href="https://twitter.com/Thur/status/1258517919438233602">Tweet perguntado sobre motivação em trabalhar</a></li>
<li><a target="_blank" href="https://twitter.com/graphmosphere">Bot que gera imagem random do Delboni</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2019/05/lambda3-podcast-142-plaid-ctf-2019/">Podcast sobre CTF</a></li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/AmorimRob">Robson Amorin</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[Desmistificando Covariância e Contravariância em C#]]></title><description><![CDATA[Se existe uma funcionalidade pouco explorada no ambiente .NET é a de generalizar interfaces ou delegates utilizando de covariância e contravariância.
O que é?
Esse recurso foi adicionado no C# 4 e está intimamente ligada na forma que tratamos tipos g...]]></description><link>https://lucasteles.dev/desmistificando-covariancia-e-contravariancia-em-c</link><guid isPermaLink="true">https://lucasteles.dev/desmistificando-covariancia-e-contravariancia-em-c</guid><category><![CDATA[C#]]></category><category><![CDATA[dotnet]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Wed, 17 Feb 2021 19:17:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618514233621/TP4EUeWyt.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Se existe uma funcionalidade pouco explorada no ambiente .NET é a de generalizar <em>interfaces</em> ou <em>delegates</em> utilizando de covariância e contravariância.</p>
<h2 id="o-que-e">O que é?</h2>
<p>Esse recurso foi adicionado no C# 4 e está intimamente ligada na forma que tratamos tipos genéricos, vamos partir de exemplos para  ajudar a demonstrar o problema que esse recurso veio resolver.</p>
<p>Imagine que temos uma classe <code>Banana</code> que herde de uma classe <code>Fruta</code>, podemos ter em algum lugar um método simples que receba um <code>IEnumerable&lt;Fruta&gt;</code>, itere sobre ele e exiba seus nomes.</p>
<p>Primeiro vamos definir a classe base:</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Fruta</span>
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Nome { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Fruta</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> nome</span>)</span>
    {
        Nome = nome;
    }
}
</code></pre>
<p>E no programa principal um método que exibe os nomes de qualquer coleção de frutas:</p>
<pre><code class="lang-csharp"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">ExibirFrutas</span>(<span class="hljs-params">IEnumerable&lt;Fruta&gt; frutas</span>)</span>
{
    <span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> fruta <span class="hljs-keyword">in</span> frutas)
        Console.WriteLine(<span class="hljs-string">$"A fruta é: <span class="hljs-subst">{fruta.Nome}</span>"</span>);
}
</code></pre>
<p>A partir desse ponto podemos definir uma coleção de frutas e chamar nosso método <code>ExibirFrutas</code></p>
<pre><code class="lang-csharp"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"></span>)</span> {
    <span class="hljs-keyword">var</span> frutas = <span class="hljs-keyword">new</span>[] {
        <span class="hljs-keyword">new</span> Fruta(<span class="hljs-string">"Banana"</span>),
        <span class="hljs-keyword">new</span> Fruta(<span class="hljs-string">"Maçã"</span>),
        <span class="hljs-keyword">new</span> Fruta(<span class="hljs-string">"Tomate"</span>),
    };
    ExibirFrutas(frutas);
}
</code></pre>
<p>Até aqui tudo bem, compila e funciona da forma que esperamos, sem surpresas.</p>
<p>Vamos agora fazer uma pequena mudança, primeiro criar uma classe derivada de fruta:</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Banana</span> : <span class="hljs-title">Fruta</span>
{
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Banana</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> nome</span>) : <span class="hljs-title">base</span>(<span class="hljs-params">nome</span>)</span>{}
}
</code></pre>
<p>E vamos substituir a criação da coleção que irá ser usada para invocar o método <code>ExibirFrutas</code></p>
<pre><code class="lang-csharp"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"></span>)</span> {
    <span class="hljs-keyword">var</span> frutas = <span class="hljs-keyword">new</span>[] {
        <span class="hljs-keyword">new</span> Banana(<span class="hljs-string">"Banana Maçã"</span>),
        <span class="hljs-keyword">new</span> Banana(<span class="hljs-string">"Banana Nanica"</span>),
        <span class="hljs-keyword">new</span> Banana(<span class="hljs-string">"Banana Prata"</span>),
    };
    ExibirFrutas(frutas);
}
</code></pre>
<p>Note que não alteramos a assinatura do método <code>ExibirFrutas</code>, continua sendo <code>void ExibirFrutas(IEnumerable&lt;Fruta&gt; frutas)</code>, nota-se aqui que o que estamos recebendo é um enumerado com tipo genérico de uma classe mais baixa em hierarquia, esse é o comportamento padrão quando tratamos de classes bases e derivadas, ou seja, posso usar classes derivadas aonde se espera classes bases.</p>
<p>Porém nesse exemplo é um pouco diferente, pois estamos tratando de parâmetros genéricos, nossas classes estão envelopadas em um <code>IEnumerable&lt;T&gt;</code>, de fato antes do C# 4, esta mudança que fizemos implicaria que nosso código não iria nem compilar, reclamando que o uso de <code>IEnumerable&lt;Banana&gt;</code> não poderia ser utilizado no lugar de <code>IEnumerable&lt;Fruta&gt;</code> nesta versão.</p>
<p>Esse código no C# moderno funciona sem problema, isso se dá ao fato da interface <code>IEnumerable</code> ser covariante, o que permite que eu utilize tipos derivados do tipo genérico que utilizei para definir meu <code>IEnumerable</code>, assim a assinatura atual do mesmo é:</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title">IEnumerable</span>&lt;<span class="hljs-keyword">out</span> <span class="hljs-title">T</span>&gt; { ... }
</code></pre>
<p>O que diz ao compilador que esse comportamento é desejado é essa keyword out, ela define um tipo genérico em uma interface ou delegate como covariante.</p>
<h2 id="qual-a-diferenca-entre-covariancia-e-contravariancia">Qual a diferença entre covariância e contravariância?</h2>
<p>Vamos falar de teoria dos conjuntos, mas nada muito complexo, covariância e contravariância são propriedades de uma função de mapeamento que associa um membro de um conjunto a outro.</p>
<p>Considere os dois subconjuntos seguintes do conjunto de todos os tipos do C#.</p>
<p>Primeiro:</p>
<pre><code class="lang-csharp">{ Animal,
Tigre,
Fruta,
Banana }
</code></pre>
<p>Segundo:</p>
<pre><code class="lang-csharp">{ IEnumerable&lt;Animal&gt;,
  IEnumerable&lt;Tigre&gt;,
  IEnumerable&lt;Fruta&gt;,
  IEnumerable&lt;Banana&gt; }
</code></pre>
<p>Há claramente uma operação de mapeamento do primeiro conjunto para o segundo conjunto. Sendo que para cada <code>T</code> no primeiro conjunto tem um tipo correspondente no segundo conjunto que é <code>IEnumerable&lt;T&gt;</code>. resumindo, o mapeamento é <code>T → IEnumerable&lt;T&gt;</code>. (observe que esta (→) é uma "seta magra" que indica mapeamento).</p>
<p>Agora vamos considerar as relações. Existe uma relação de compatibilidade de atribuição entre pares de tipos no primeiro conjunto. O que simplificando significa que posso usar alguns tipo no lugar de outros (por causa da herança).</p>
<p>Um valor do tipo Tigre pode ser atribuído a uma variável do tipo Animal, portanto, esses tipos são considerados "compatíveis em atribuição".\
Vamos escrever "um valor do tipo X pode ser atribuído a uma variável do tipo Y" da seguinte forma <code>X ⇒ Y</code>. (note que esta (⇒) é uma "seta gorda" que significa compatibilidade em atribuição).</p>
<p>Então, em nosso primeiro subconjunto, aqui estão todos os relacionamentos de compatibilidade de atribuição possíveis:</p>
<pre><code class="lang-csharp">Tigre ⇒ Tigre
Tigre ⇒ Animal
Animal ⇒ Animal
Banana ⇒ Banana
Banana ⇒ Fruta
Fruta ⇒ Fruta
</code></pre>
<p>Desde o C# 4, é suportada a compatibilidade de atribuição covariante de certas interfaces, sendo assim existe uma relação de compatibilidade entre pares de tipos no segundo conjunto também:</p>
<pre><code class="lang-csharp">IEnumerable&lt;Tigre&gt;  ⇒ IEnumerable&lt;Tigre&gt;
IEnumerable&lt;Tigre&gt;  ⇒ IEnumerable&lt;Animal&gt;
IEnumerable&lt;Animal&gt; ⇒ IEnumerable&lt;Animal&gt;
IEnumerable&lt;Banana&gt; ⇒ IEnumerable&lt;Banana&gt;
IEnumerable&lt;Banana&gt; ⇒ IEnumerable&lt;Fruta&gt;
IEnumerable&lt;Fruta&gt;  ⇒ IEnumerable&lt;Fruta&gt;
</code></pre>
<p>Observe que o mapeamento <code>T → IEnumerable&lt;T&gt;</code> preserva a existência e a direção da compatibilidade da atribuição.\
Isto é, se <code>X ⇒ Y</code>, então também é verdade que <code>IEnumerable&lt;X&gt; ⇒ IEnumerable&lt;Y&gt;</code>.</p>
<p>Um mapeamento que possui essa propriedade em relação a uma determinada relação é chamado de "mapeamento covariante".</p>
<p>Isso deve fazer sentido: uma sequência de tigres pode ser usada onde é necessario uma sequência de animais, mas o oposto não é verdade.</p>
<p>Isso é covariância.</p>
<p>Agora vamos entender contravariância. Considere este subconjunto do conjunto de todos os tipos do C#:</p>
<pre><code class="lang-csharp">{ IComparable&lt;Tigre&gt;,
  IComparable&lt;Animal&gt;,
  IComparable&lt;Fruta&gt;,
  IComparable&lt;Banana&gt; }
</code></pre>
<p>Agora temos o mapeamento do primeiro conjunto para um terceiro conjunto <code>T → IComparable</code>.</p>
<pre><code class="lang-csharp">IComparable&lt;Tigre&gt; ⇒ IComparable&lt;Tigre&gt;
IComparable&lt;Animal&gt; ⇒ IComparable&lt;Tigre&gt; <span class="hljs-comment">// invertido!</span>
IComparable&lt;Animal&gt; ⇒ IComparable&lt;Animal&gt;
IComparable&lt;Banana&gt; ⇒ IComparable&lt;Banana&gt;
IComparable&lt;Fruta&gt; ⇒ IComparable&lt;Banana&gt;  <span class="hljs-comment">// invertido!</span>
IComparable&lt;Fruta&gt; ⇒ IComparable&lt;Fruta&gt;
</code></pre>
<p>Ou seja, o mapeamento <code>T → IComparable&lt;T&gt;</code> preservou a existência, mas inverteu a direção da compatibilidade da atribuição. Isto é, se <code>X ⇒ Y</code>, então <code>IComparable&lt;X&gt; ⇐ IComparable&lt;Y&gt;</code>.</p>
<p>Um mapeamento que preserva mas inverte uma relação é chamado de "mapeamento contravariante".</p>
<p>Sendo assim, fica claro que algo que pode comparar dois animais também pode comparar dois tigres, mas algo que pode comparar dois tigres não pode necessariamente comparar dois animais.</p>
<p>Diferente do <code>IEnumerable</code> a assinatura do <code>IComparable</code> utiliza a keyword <code>in</code> em seu parâmetro genérico.</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title">IComparable</span>&lt;<span class="hljs-keyword">in</span> <span class="hljs-title">T</span>&gt; { ... }
</code></pre>
<p>Essa é a diferença entre covariância e contravariância. Covariância preserva a direção de atribuição e a contravariância a inverte.</p>
<h2 id="por-que-in-e-out">Por que "in" e "out"?</h2>
<p>Vamos olhar novamente, agora de forma completa as interfaces:</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title">IEnumerable</span>&lt;<span class="hljs-keyword">out</span> <span class="hljs-title">T</span>&gt;
{
    <span class="hljs-function">IEnumerator&lt;T&gt; <span class="hljs-title">GetEnumerator</span>(<span class="hljs-params"></span>)</span>;
}
</code></pre>
<p>e</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title">IComparable</span>&lt;<span class="hljs-keyword">in</span> <span class="hljs-title">T</span>&gt;
{
    <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">CompareTo</span>(<span class="hljs-params">T other</span>)</span>;
}
</code></pre>
<p>Note que no <code>IEnumerable</code> seu tipo genérico está sendo utilizado apenas como saída, por isso a keyword <code>out</code>, e no <code>IComparable</code> aonde é aplicado a keyword <code>in</code> o tipo genérico é utilizado apenas para entrada, é exatamente essa a semântica do 'in' e 'out' respectivamente para contravariância e covariância.</p>
<p>Exemplos de Covariância: <code>IEnumerable&lt;out T&gt;</code>, <code>Func&lt;out T&gt;</code>\
Você pode converter de <code>IEnumerable&lt;string&gt;</code> para <code>IEnumerable&lt;object&gt;</code>, ou <code>Func&lt;string&gt;</code> para <code>Func&lt;object&gt;</code>. Isso por que os valores só saem desses objetos. Isso funciona porque, se você está tirando valores da API e retornando algo específico (como string), pode tratar esses valores retornados como um tipo mais geral (como objeto).</p>
<p>Exemplos Contravariância: <code>IComparer&lt;in T&gt;</code>, <code>Action&lt;in T&gt;</code>\
Você pode converter de <code>IComparer&lt;object&gt;</code> para <code>IComparer&lt;string&gt;</code> ou <code>Action&lt;object&gt;</code> para <code>Action&lt;string&gt;</code>, os valores só entram nesses objetos.\
Desta vez funciona porque se a API sabe tratar algo geral (como objeto) você pode passar algo mais específico (como string) que ela também saberá.</p>
<p>De forma geral, se você tiver uma interface <code>IFoo&lt;T&gt;</code>, ela pode ser covariante em T (isto é, declarar como <code>IFoo&lt;out T&gt;</code> se T for usado apenas como saida (por exemplo, um tipo de retorno) dentro da interface. E ser contravariante em T (isto é, <code>IFoo&lt;in T&gt;</code>) se T for usado apenas em uma posição de entrada (por exemplo, um tipo de parâmetro).</p>
<p>Vale ressaltar que um tipo não pode ser ao mesmo tempo covariante e contravariante, isso se dá pelo motivo de que o compilador irá se perder no tipo genérico e causar certas situações bizarras como:</p>
<pre><code class="lang-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title">IFoo</span>&lt;<span class="hljs-keyword">in</span> <span class="hljs-keyword">out</span> <span class="hljs-title">T</span>&gt; <span class="hljs-comment">// absurdo!</span>
{
    <span class="hljs-function">T <span class="hljs-title">Bar</span>(<span class="hljs-params">T baz</span>)</span>;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Foo</span>&lt;<span class="hljs-title">T</span>&gt; : <span class="hljs-title">IFoo</span>&lt;<span class="hljs-title">T</span>&gt;
{
   <span class="hljs-keyword">public</span> T Value;
   <span class="hljs-function">T <span class="hljs-title">Bar</span>(<span class="hljs-params">T baz</span>)</span>;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"></span>)</span>
{
    <span class="hljs-keyword">var</span> a = <span class="hljs-keyword">new</span> Foo&lt;<span class="hljs-keyword">string</span>&gt;();
    IFoo&lt;<span class="hljs-keyword">object</span>&gt; b = a; <span class="hljs-comment">//covariância</span>
    IFoo&lt;<span class="hljs-keyword">int</span>[]&gt; c = b; <span class="hljs-comment">// contravariância</span>

    Console.WrileLine(c.Value); <span class="hljs-comment">// ?????</span>
}
</code></pre>
<p>Qual o valor que deveria ser printado? Não dá para saber, por isso essas duas propriedades não podem existir mutuamente.</p>
<h2 id="conclusao">Conclusão</h2>
<p>Covariância e Contravariância são ferramentas poderosas e pouco exploradas, sempre devemos considera-las quando estamos trabalhando com tipo genéricos.</p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #10 - Libs para .NET]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre algumas libs, ferramentas e frameworks legais para se usar no mundo .NET



Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Pauta:

Uma penca de Libs

Participa...]]></description><link>https://lucasteles.dev/rebuildcast-10-libs-para-net</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-10-libs-para-net</guid><category><![CDATA[podcast]]></category><category><![CDATA[dotnet]]></category><category><![CDATA[community]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 07 Feb 2021 18:56:54 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre algumas libs, ferramentas e frameworks legais para se usar no mundo .NET</p>
<iframe src="https://cast.rocks/player/28261/10-libs-legais-para-.NET.mp3?episodeTitle=%2310%20-%20Libs%20para%20.NET&amp;podcastTitle=RebuildCast&amp;episodeDate=February%207th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/10-libs-legais-para-.NET.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>Uma penca de Libs</li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/AmorimRob">Robson Amorin</a></li>
<li><a target="_blank" href="https://twitter.com/Thur">Arthur Fucher</a></li>
</ul>
<p>Links Citações:</p>
<ul>
<li><a target="_blank" href="https://www.lambda3.com.br/2020/09/lambda3-podcast-212-monogame/">Podcast sobre Monogame</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=w680VZ2ElTQ&amp;t=1492s">Live do High5Devs sobre LiteDb</a></li>
<li><a target="_blank" href="http://high5devs.com/2019/01/testes-de-unidade-para-httpclient-no-net-com-o-flurl/">Post Sobre Flurl</a></li>
<li><a target="_blank" href="https://lucasteles.dev/rebuildcast-1-testes-em-net/">Podcast sobre Testes em .NET</a></li>
</ul>
<p>Links Libs:</p>
<ul>
<li><a target="_blank" href="https://cakebuild.net/">https://cakebuild.net/</a></li>
<li><a target="_blank" href="https://fake.build/">https://fake.build/</a></li>
<li><a target="_blank" href="https://nuke.build/">https://nuke.build/</a></li>
<li><a target="_blank" href="https://github.com/dotnet/maui">https://github.com/dotnet/maui</a></li>
<li><a target="_blank" href="https://github.com/dotnet/BenchmarkDotNet">https://github.com/dotnet/BenchmarkDotNet</a></li>
<li><a target="_blank" href="https://github.com/App-vNext/Polly">https://github.com/App-vNext/Polly</a></li>
<li><a target="_blank" href="https://github.com/domaindrivendev/Swashbuckle.AspNetCore">Swagger</a></li>
<li><a target="_blank" href="https://github.com/MonoGame/MonoGame">https://github.com/MonoGame/MonoGame</a></li>
<li><a target="_blank" href="https://github.com/craftworkgames/MonoGame.Extended">https://github.com/craftworkgames/MonoGame.Extended</a></li>
<li><a target="_blank" href="https://github.com/NancyFx/Nancy">https://github.com/NancyFx/Nancy</a></li>
<li><a target="_blank" href="https://github.com/FluentValidation/FluentValidation">https://github.com/FluentValidation/FluentValidation</a></li>
<li><a target="_blank" href="https://github.com/mbdavid/LiteDB">https://github.com/mbdavid/LiteDB</a></li>
<li><a target="_blank" href="https://github.com/Humanizr/Humanizer">https://github.com/Humanizr/Humanizer</a></li>
<li><a target="_blank" href="https://github.com/migueldeicaza/gui.cs">https://github.com/migueldeicaza/gui.cs</a></li>
<li><a target="_blank" href="https://github.com/spectresystems/spectre.console">https://github.com/spectresystems/spectre.console</a></li>
<li><a target="_blank" href="https://github.com/tomakita/Colorful.Console">https://github.com/tomakita/Colorful.Console</a></li>
<li><a target="_blank" href="https://github.com/afucher/Inquirer">https://github.com/afucher/Inquirer</a></li>
<li><a target="_blank" href="https://github.com/dotnet/reactive">Reactive Extensions</a></li>
<li><a target="_blank" href="https://www.nuget.org/packages/System.Interactive/">Interactive Extensions</a></li>
<li><a target="_blank" href="https://github.com/ChilliCream/hotchocolate">https://github.com/ChilliCream/hotchocolate</a></li>
<li><a target="_blank" href="https://github.com/lucasteles/Owin.ThumbCrop">https://github.com/lucasteles/Owin.ThumbCrop</a></li>
<li><a target="_blank" href="https://github.com/SixLabors/ImageSharp">https://github.com/SixLabors/ImageSharp</a></li>
<li><a target="_blank" href="https://github.com/bchavez/Bogus">https://github.com/bchavez/Bogus</a></li>
<li><a target="_blank" href="https://github.com/dotnet-state-machine/stateless">https://github.com/dotnet-state-machine/stateless</a></li>
<li><a target="_blank" href="https://github.com/AngleSharp/AngleSharp">https://github.com/AngleSharp/AngleSharp</a></li>
<li><a target="_blank" href="https://github.com/louthy/language-ext">https://github.com/louthy/language-ext</a></li>
<li><a target="_blank" href="https://github.com/Fody/Fody">https://github.com/Fody/Fody</a></li>
<li><a target="_blank" href="https://github.com/morelinq/MoreLINQ">https://github.com/morelinq/MoreLINQ</a></li>
<li><a target="_blank" href="https://github.com/tmenier/Flurl">https://github.com/tmenier/Flurl</a></li>
<li><a target="_blank" href="https://github.com/ClosedXML/ClosedXML">https://github.com/ClosedXML/ClosedXML</a></li>
<li><a target="_blank" href="https://github.com/sebastienros/jint">https://github.com/sebastienros/jint</a></li>
<li><a target="_blank" href="https://github.com/NLua/NLua">https://github.com/NLua/NLua</a></li>
<li><a target="_blank" href="https://github.com/reactiveui/Akavache">https://github.com/reactiveui/Akavache</a></li>
<li><a target="_blank" href="https://github.com/mono/SkiaSharp">https://github.com/mono/SkiaSharp</a></li>
<li><a target="_blank" href="https://github.com/coverlet-coverage/coverlet">https://github.com/coverlet-coverage/coverlet</a></li>
<li><a target="_blank" href="https://github.com/opentk/opentk">https://github.com/opentk/opentk</a></li>
<li><a target="_blank" href="https://github.com/fluentmigrator/fluentmigrator">https://github.com/fluentmigrator/fluentmigrator</a></li>
<li><a target="_blank" href="https://github.com/DbUp/DbUp">https://github.com/DbUp/DbUp</a></li>
<li><a target="_blank" href="https://github.com/dotnet/Docker.DotNet">https://github.com/dotnet/Docker.DotNet</a></li>
<li><a target="_blank" href="https://github.com/clojure/clojure-clr">https://github.com/clojure/clojure-clr</a></li>
<li><a target="_blank" href="https://github.com/FakeItEasy/FakeItEasy">https://github.com/FakeItEasy/FakeItEasy</a></li>
<li><a target="_blank" href="https://github.com/stryker-mutator/stryker-net">https://github.com/stryker-mutator/stryker-net</a></li>
<li><a target="_blank" href="https://github.com/jbogard/Respawn">https://github.com/jbogard/Respawn</a></li>
<li><a target="_blank" href="https://github.com/tonerdo/pose">https://github.com/tonerdo/pose</a></li>
<li><a target="_blank" href="https://github.com/giacomelli/GeneticSharp">https://github.com/giacomelli/GeneticSharp</a></li>
<li><a target="_blank" href="https://github.com/egil/bUnit">https://github.com/egil/bUnit</a></li>
<li><a target="_blank" href="https://github.com/tainicom/Aether.Physics2D">https://github.com/tainicom/Aether.Physics2D</a></li>
<li><a target="_blank" href="https://github.com/jamesfoster/DeepEqual">https://github.com/jamesfoster/DeepEqual</a></li>
<li><a target="_blank" href="https://github.com/nickdodd79/AutoBogus">https://github.com/nickdodd79/AutoBogus</a></li>
<li><a target="_blank" href="https://github.com/FluentIL/FluentIL">https://github.com/FluentIL/FluentIL</a></li>
<li><a target="_blank" href="https://github.com/HangfireIO/Hangfire">https://github.com/HangfireIO/Hangfire</a></li>
<li><a target="_blank" href="https://github.com/quartznet/quartznet">https://github.com/quartznet/quartznet</a></li>
<li><a target="_blank" href="https://github.com/AutoMapper/AutoMapper">https://github.com/AutoMapper/AutoMapper</a></li>
<li><a target="_blank" href="https://github.com/rodrigoramos/nPact">https://github.com/rodrigoramos/nPact</a></li>
<li><a target="_blank" href="https://fontello.com/">Fontello</a></li>
<li>Xamarin Testing Library (em breve, siga o <a target="_blank" href="https://github.com/akamud">Mud</a>)</li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #9 - Ferramentas de Linha de Comando]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre algumas ferramentas de CLIs, as famosas linha de comando, esperamos que após esse episodio você fiquei muito mais produtivo.

Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer |...]]></description><link>https://lucasteles.dev/rebuildcast-9-ferramentas-de-linha-de-comando</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-9-ferramentas-de-linha-de-comando</guid><category><![CDATA[podcast]]></category><category><![CDATA[cli]]></category><category><![CDATA[command line]]></category><category><![CDATA[terminal]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Tue, 26 Jan 2021 18:54:59 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre algumas ferramentas de CLIs, as famosas linha de comando, esperamos que após esse episodio você fiquei muito mais produtivo.</p>
<p><iframe src="https://cast.rocks/player/28261/CLIs.mp3?episodeTitle=%239%20-%20Ferramentas%20de%20Linhas%20de%20Comando&amp;podcastTitle=RebuildCast&amp;episodeDate=January%2026th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>
Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/CLIs.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>O que são CLIs e Shell</li>
<li>Uma penca de ferramenta</li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li>Rafael Delboni</li>
<li><a target="_blank" href="https://twitter.com/caicorre">Caio Correa</a></li>
</ul>
<h3 id="links">Links:</h3>
<p>Ferramentas:</p>
<ul>
<li><a target="_blank" href="https://github.com/ohmyzsh/ohmyzsh">https://github.com/ohmyzsh/ohmyzsh</a></li>
<li><a target="_blank" href="https://github.com/JanDeDobbeleer/oh-my-posh">https://github.com/JanDeDobbeleer/oh-my-posh</a></li>
<li><a target="_blank" href="https://github.com/oh-my-fish/oh-my-fish">https://github.com/oh-my-fish/oh-my-fish</a></li>
<li><a target="_blank" href="https://github.com/Bash-it/bash-it">https://github.com/Bash-it/bash-it</a></li>
<li><a target="_blank" href="https://github.com/neovim/neovim">https://github.com/neovim/neovim</a></li>
<li><a target="_blank" href="https://github.com/tmux/tmux">https://github.com/tmux/tmux</a></li>
<li><a target="_blank" href="https://github.com/rupa/z">https://github.com/rupa/z</a></li>
<li><a target="_blank" href="https://github.com/xen0n/autojump-rs">https://github.com/xen0n/autojump-rs</a></li>
<li><a target="_blank" href="https://github.com/tldr-pages/tldr">https://github.com/tldr-pages/tldr</a></li>
<li><a target="_blank" href="https://asciinema.org/">https://asciinema.org/</a></li>
<li><a target="_blank" href="https://github.com/httpie/httpie">https://github.com/httpie/httpie</a></li>
<li><a target="_blank" href="https://github.com/stedolan/jq">https://github.com/stedolan/jq</a></li>
<li><a target="_blank" href="https://github.com/so-fancy/diff-so-fancy">https://github.com/so-fancy/diff-so-fancy</a></li>
<li><a target="_blank" href="https://github.com/github/hub">https://github.com/github/hub</a></li>
<li><a target="_blank" href="https://github.com/dandavison/delta">https://github.com/dandavison/delta</a></li>
<li><a target="_blank" href="https://github.com/terrajobst/git-istage">https://github.com/terrajobst/git-istage</a></li>
<li><a target="_blank" href="https://github.com/acaudwell/Gource">https://github.com/acaudwell/Gource</a></li>
<li><a target="_blank" href="https://github.com/jesseduffield/lazygit">https://github.com/jesseduffield/lazygit</a></li>
<li><a target="_blank" href="https://ohshitgit.com/">https://ohshitgit.com/</a></li>
<li><a target="_blank" href="https://github.com/ogham/exa">https://github.com/ogham/exa</a></li>
<li><a target="_blank" href="https://github.com/jarun/nnn">https://github.com/jarun/nnn</a></li>
<li><a target="_blank" href="https://github.com/sharkdp/bat">https://github.com/sharkdp/bat</a></li>
<li><a target="_blank" href="https://github.com/junegunn/fzf">https://github.com/junegunn/fzf</a></li>
<li><a target="_blank" href="https://github.com/src-d/gemini">https://github.com/src-d/gemini</a></li>
<li><a target="_blank" href="https://github.com/orf/gping">https://github.com/orf/gping</a></li>
<li><a target="_blank" href="https://github.com/sharkdp/hyperfine">https://github.com/sharkdp/hyperfine</a></li>
<li><a target="_blank" href="https://github.com/bootandy/dust">https://github.com/bootandy/dust</a></li>
<li><a target="_blank" href="https://github.com/aksakalli/gtop">https://github.com/aksakalli/gtop</a></li>
<li><a target="_blank" href="https://github.com/ClementTsang/bottom">https://github.com/ClementTsang/bottom</a></li>
<li><a target="_blank" href="https://github.com/htop-dev/htop">https://github.com/htop-dev/htop</a></li>
<li><a target="_blank" href="https://github.com/MrRio/vtop">https://github.com/MrRio/vtop</a></li>
<li><a target="_blank" href="https://github.com/charmbracelet/glow">https://github.com/charmbracelet/glow</a></li>
<li><a target="_blank" href="https://github.com/eddieantonio/imgcat">https://github.com/eddieantonio/imgcat</a></li>
<li><a target="_blank" href="https://github.com/AlDanial/cloc">https://github.com/AlDanial/cloc</a></li>
<li><a target="_blank" href="https://github.com/facebookincubator/fastmod">https://github.com/facebookincubator/fastmod</a></li>
<li><a target="_blank" href="https://github.com/ggreer/the_silver_searcher">https://github.com/ggreer/the_silver_searcher</a></li>
<li><a target="_blank" href="https://github.com/BurntSushi/ripgrep">https://github.com/BurntSushi/ripgrep</a></li>
<li><a target="_blank" href="https://github.com/trehn/termdown">https://github.com/trehn/termdown</a></li>
<li><a target="_blank" href="https://github.com/nvbn/thefuck">https://github.com/nvbn/thefuck</a></li>
<li><a target="_blank" href="https://github.com/thoughtbot/rcm">https://github.com/thoughtbot/rcm</a></li>
<li><a target="_blank" href="https://github.com/rg3/youtube-dl">https://github.com/rg3/youtube-dl</a></li>
<li><a target="_blank" href="https://github.com/ttscoff/mdless">https://github.com/ttscoff/mdless</a></li>
<li><a target="_blank" href="https://github.com/ImageMagick/ImageMagick">https://github.com/ImageMagick/ImageMagick</a></li>
<li><a target="_blank" href="https://github.com/jgm/pandoc">https://github.com/jgm/pandoc</a></li>
<li><a target="_blank" href="https://github.com/FFmpeg/FFmpeg">https://github.com/FFmpeg/FFmpeg</a></li>
<li><a target="_blank" href="https://github.com/sindresorhus/fkill-cli">https://github.com/sindresorhus/fkill-cli</a></li>
<li><a target="_blank" href="https://github.com/hnarayanan/shpotify">https://github.com/hnarayanan/shpotify</a></li>
<li><a target="_blank" href="https://github.com/Chris911/iStats">https://github.com/Chris911/iStats</a></li>
<li><a target="_blank" href="https://github.com/klange/nyancat">https://github.com/klange/nyancat</a></li>
<li><a target="_blank" href="https://github.com/thiderman/doge">https://github.com/thiderman/doge</a></li>
<li><a target="_blank" href="https://github.com/abishekvashok/cmatrix">https://github.com/abishekvashok/cmatrix</a></li>
<li><a target="_blank" href="https://github.com/piuccio/cowsay">https://github.com/piuccio/cowsay</a></li>
<li><a target="_blank" href="https://www.npmjs.com/package/teles">https://www.npmjs.com/package/teles</a></li>
<li><a target="_blank" href="https://robobunny.com/projects/asciiquarium/html/">https://robobunny.com/projects/asciiquarium/html/</a></li>
<li><a target="_blank" href="https://github.com/remotemobprogramming/mob">https://github.com/remotemobprogramming/mob</a></li>
<li><a target="_blank" href="https://github.com/dbcli/mssql-cli">https://github.com/dbcli/mssql-cli</a></li>
<li><a target="_blank" href="https://github.com/tmuxinator/tmuxinator">https://github.com/tmuxinator/tmuxinator</a></li>
<li><a target="_blank" href="https://facebook.github.io/PathPicker">https://facebook.github.io/PathPicker</a></li>
<li><a target="_blank" href="https://github.com/djui/alias-tips">https://github.com/djui/alias-tips</a></li>
</ul>
<p>Links do asciinema:</p>
<p><a target="_blank" href="https://asciinema.org/~lucasteles">https://asciinema.org/~lucasteles</a></p>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="https://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="https://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="https://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #8 - Ferramentas [Windows, Mac, Linux]]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre algumas ferramentas e Apps legais pra melhorar nosso fluxo de trabalho e qualidade de vida para todos os sistemas operacionais que importam.


Inscreva-se: Apple Podcasts | Android | Google Podcasts | S...]]></description><link>https://lucasteles.dev/rebuildcast-8-ferramentas-windows-mac-linux</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-8-ferramentas-windows-mac-linux</guid><category><![CDATA[podcast]]></category><category><![CDATA[tools]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Sun, 10 Jan 2021 18:47:47 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre algumas ferramentas e Apps legais pra melhorar nosso fluxo de trabalho e qualidade de vida para todos os sistemas operacionais que importam.</p>
<iframe src="https://cast.rocks/player/28261/8-Ferramentas-Windows-Mac-Linux.mp3?episodeTitle=%238%20-%20Ferramentas%20%5BWindows%2C%20Mac%2C%20Linux%5D&amp;podcastTitle=RebuildCast&amp;episodeDate=January%2010th%2C%202021&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>

<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/8-Ferramentas-Windows-Mac-Linux.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>Para Windows</li>
<li>Para Mac</li>
<li>Para Linux</li>
<li>Para todos</li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/rafaeldelboni">Rafael Delboni</a></li>
<li><a target="_blank" href="https://twitter.com/caicorre">Caio Correa</a></li>
<li><a target="_blank" href="https://github.com/vloth">Chico Berrocal</a></li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="https://lucasteles.dev/rebuildcast-6-vim/">Podcast de Vim</a></li>
<li><a target="_blank" href="https://www.lambda3.com.br/2019/11/lambda3-podcast-170-blender-e-modelagem-3d/">Podcast de Blender</a></li>
<li><h3 id="windows">Windows</h3>
</li>
<li><a target="_blank" href="http://www.softwareok.com/?seite=Freeware/Q-Dir">QDIR</a></li>
<li><a target="_blank" href="https://app.prntscr.com/pt-br/download.html">Lightshot</a></li>
<li><a target="_blank" href="https://www.4t-niagara.com/tray.html">4T Tray minimizer</a></li>
<li><a target="_blank" href="https://github.com/susam/uncap">uncap</a></li>
<li><a target="_blank" href="https://ditto-cp.sourceforge.io/">ditto</a></li>
<li><a target="_blank" href="https://github.com/microsoft/PowerToys">powertoys</a></li>
<li><a target="_blank" href="https://www.autohotkey.com/">autohotkey</a></li>
<li><a target="_blank" href="https://www.getpaint.net/">paint.net</a></li>
<li><a target="_blank" href="https://github.com/randyrants/sharpkeys">sharpkeys</a></li>
<li><a target="_blank" href="https://cyberduck.io/">cyberduck</a></li>
<li><a target="_blank" href="https://github.com/microsoft/terminal">Terminal</a></li>
<li><a target="_blank" href="https://x410.dev/">X410</a></li>
<li><h3 id="mac">Mac</h3>
</li>
<li><a target="_blank" href="https://www.mowglii.com/itsycal/">itsycall</a></li>
<li><a target="_blank" href="https://rectangleapp.com/">rectangle</a> (atualizada do spectable)</li>
<li><a target="_blank" href="https://ianyh.com/amethyst/">amethyst</a></li>
<li><a target="_blank" href="https://github.com/koekeishiya/yabai">yabai</a></li>
<li>Alfred</li>
<li><a target="_blank" href="https://www.zhornsoftware.co.uk/caffeine/">Caffeine</a></li>
<li><a target="_blank" href="https://iterm2.com/">iTerm2</a></li>
<li><a target="_blank" href="https://cleanshot.com/">CleanShot</a></li>
<li><a target="_blank" href="https://setapp.com/pt-br">Setapp</a></li>
<li><a target="_blank" href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a></li>
<li><a target="_blank" href="https://kapeli.com/dash">Dash</a></li>
<li><a target="_blank" href="https://karabiner-elements.pqrs.org/">Karabiner Elements</a></li>
<li><a target="_blank" href="https://github.com/yqrashawn/GokuRakuJoudo">GokuRakuJoudo</a></li>
<li><a target="_blank" href="https://folivora.ai/">BetterTouchTool</a></li>
<li><a target="_blank" href="https://paw.cloud/">Paw</a></li>
<li><a target="_blank" href="https://www.obdev.at/products/littlesnitch/index.html">Little Snitch</a></li>
<li><a target="_blank" href="https://timingapp.com/?lang=en">Timing</a></li>
<li><a target="_blank" href="https://tracesof.net/uebersicht-widgets/">Übersicht Widgets</a></li>
<li><a target="_blank" href="https://rogueamoeba.com/audiohijack/">Audio Hijack</a></li>
<li><a target="_blank" href="https://tripmode.ch/">TripMode</a></li>
<li><a target="_blank" href="https://www.pixelmator.com/pro/">Pixelmator</a></li>
<li><a target="_blank" href="https://ss64.com/osx/launchctl.html">launchctl</a></li>
<li><a target="_blank" href="https://github.com/koekeishiya/skhd">skhd</a></li>
<li><a target="_blank" href="https://www.vivaolinux.com.br/dica/pbpaste-e-pbcopy-no-Linux">pbcopy</a></li>
<li><h3 id="linux">Linux</h3>
</li>
<li><a target="_blank" href="https://github.com/Airblader/i3">i3</a></li>
<li><a target="_blank" href="https://github.com/vivien/i3blocks">i3blocks</a></li>
<li><a target="_blank" href="https://github.com/meskarune/i3lock-fancy">i3lock-fancy</a></li>
<li><a target="_blank" href="https://github.com/tmux/tmux">tmux</a><a target="_blank" href="https://github.com/derf/feh">feh</a></li>
<li><a target="_blank" href="https://pwmt.org/projects/zathura/">zathura</a></li>
<li><a target="_blank" href="https://github.com/davatorium/rofi">rofi</a></li>
<li><a target="_blank" href="https://github.com/naelstrof/maim">maim</a></li>
<li><a target="_blank" href="https://github.com/astrand/xclip">xclip</a></li>
<li><a target="_blank" href="https://gitlab.com/arandr/arandr">arandr</a></li>
<li><a target="_blank" href="https://github.com/linrunner/TLP">TLP</a></li>
<li><a target="_blank" href="https://github.com/alacritty/alacritty">alacritty</a></li>
<li><h3 id="todos">Todos</h3>
</li>
<li><a target="_blank" href="https://www.gitkraken.com/">Git Kraken</a></li>
<li><a target="_blank" href="https://www.sourcetreeapp.com/">SourceTree</a></li>
<li><a target="_blank" href="https://www.notion.so/">Notion</a></li>
<li><a target="_blank" href="https://toggl.com/">Toggl</a></li>
<li><a target="_blank" href="https://github.com/GNOME/gimp">https://github.com/GNOME/gimp</a>  </li>
<li><a target="_blank" href="https://krita.org/en/">Krita</a></li>
<li><a target="_blank" href="https://devdocs.io/">DevDocs</a></li>
<li><a target="_blank" href="https://www.pureref.com/">PureRef</a></li>
<li><a target="_blank" href="https://www.mapeditor.org/">Tiled</a></li>
<li><a target="_blank" href="https://www.aseprite.org/">Aseprite</a></li>
<li><a target="_blank" href="https://www.blender.org/">Blender</a></li>
<li><a target="_blank" href="https://www.lwks.com">Lightworks</a></li>
<li><a target="_blank" href="https://www.blackmagicdesign.com/products/davinciresolve/">davinciresolve</a></li>
<li><a target="_blank" href="https://bitwarden.com/">bitwarden</a></li>
<li><a target="_blank" href="https://duckduckgo.com/">duckduckgo.com</a></li>
<li><a target="_blank" href="https://wallabyjs.com/">Wallaby.js</a></li>
<li><a target="_blank" href="https://quokkajs.com/">Quokka.js</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="http://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="http://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="http://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item><item><title><![CDATA[Simplificando componentes com React Hooks]]></title><description><![CDATA[Foi introduzido na versão 16.8 do React uma nova funcionalidade chamada Hooks, ela permite que você tenha acesso a recursos que até o momento exigiam que se fossem utilizadas classes, só que agora apenas com funções.

Veja também meu video sobre hook...]]></description><link>https://lucasteles.dev/simplificando-componentes-com-react-hooks</link><guid isPermaLink="true">https://lucasteles.dev/simplificando-componentes-com-react-hooks</guid><category><![CDATA[React]]></category><category><![CDATA[ReactHooks]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Fri, 01 Jan 2021 19:04:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618514038201/UPQ-Dr1Dr.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Foi introduzido na versão 16.8 do React uma nova funcionalidade chamada <strong>Hooks</strong>, ela permite que você tenha acesso a recursos que até o momento exigiam que se fossem utilizadas classes, só que agora apenas com funções.</p>
<blockquote>
<p><em>Veja também meu video sobre hooks</em></p>
</blockquote>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=bz9DXWiSUo8">https://www.youtube.com/watch?v=bz9DXWiSUo8</a></div>
<h2 id="motivacao">Motivação</h2>
<p>Essa atualização veio para lidar com um problema comum no ambiente de desenvolvimento React, compartilhar lógica entre componentes. A comunidade acabou desenvolvendo alguns padrões para lidar com isso, como a utilização de <a target="_blank" href="https://reactjs.org/docs/higher-order-components.html">componentes de alta ordem </a>e <a target="_blank" href="https://reactjs.org/docs/render-props.html">render props</a>, que embora sejam técnicas funcionais, são consideradas avançadas e aumentam a complexidade de sua arquitetura de componentes com varias camadas de render.</p>
<p>Outro problema comum é que os componentes acabam se tornando complexos e difíceis de entender, com mistura de lógica de gerenciamento de estado e de eventos de componente. Normalmente cada método de ciclo de vida acaba cheio de lógicas que não se correlacionam. É comum por exemplo um componente consumir uma API no <code>ComponentDidMount</code> ou <code>ComponentDidUpdate</code>, e nesse mesmo <code>ComponentDidMount</code> também  definirmos <code>event listeners</code> que vão precisar ser limpos no <code>ComponentWillUnmount</code>, podemos considerar que buscar dados na API e definir <code>event listeners</code> não tem muita relação e estão em um mesmo lugar.</p>
<p>Em muitos casos não é possível dividir esses componentes em componentes menores por causa de toda lógica de estado e efeitos colaterais, alem de aumentar a dificuldade de testá-los. Por esses motivos é comum ver a utilização de outras bibliotecas para lidar com estado, tal como <a target="_blank" href="https://github.com/reduxjs/redux">Redux</a>, porém alem de acrescer a sua própria complexidade, também acaba por adicionar abstrações demais, nos forçando a criar e navegar por muitos arquivos e tornando menos viável de um componente ser reutilizável.</p>
<p>Outro motivador é que usar classes em JavaScript pode trazer algumas dores de cabeça, principalmente quando temos de lidar com o conceito de <code>this</code>, que não é parecido com o mesmo conceito em outras linguagens e também não é muito intuitivo, mesmo com uma proposta como a de <a target="_blank" href="https://babeljs.io/docs/en/babel-plugin-proposal-class-properties">class properties</a> que ajudam a lidar com o problema de passar funções entre componentes de uma forma menos verborrágica que dar <code>bind</code> em cada função que será passada como parâmetro, ainda assim lidamos com o problema de não ser uma forma idiomática de JavaScript para escrever métodos, alem de ocasionar <a target="_blank" href="https://medium.com/@charpeni/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think-3b3551c440b1">problemas de performance ou efeitos colaterais não esperados</a>.</p>
<p>Como solução temos o React Hooks, que permite que você possa extrair toda lógica de gerenciamento de estado de seu componente tanto para testá-la quanto para reutilizá-la. Isso porque com ele você consegue quebrar toda essa lógica em funções com responsabilidades especificas.</p>
<h2 id="hook-de-estado">Hook de Estado</h2>
<p>O primeiro hook que iremos explorar é o de estado, aqui um exemplo de código:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Contador</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [count, setCount] = useState(<span class="hljs-number">0</span>)

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
       Você clicou {count} vezes!
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> setCount(count + 1)}&gt;
        Mais um!
      <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span> 
  )
}
</code></pre>
<p>O hook nesse caso é o <code>useState</code>. Ele recebe o estado inicial, e retorna um array com dois valores (que estão sendo <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Array_destructuring">desconstruídos direto em variáveis</a>) o primeiro valor é o estado atual e o segundo uma função para atualizar esse estado.  No <code>onClick</code> do botão chamamos a função de alterar o estado passando o estado atual mais um.</p>
<p>Vale ressaltar que o <code>useState</code> não funciona exatamente igual ao <code>setState</code> que utilizamos em classes. Quando passamos um objeto para o <code>setState</code>, ele combina o valor que estamos passando com o antigo. Enquanto no <code>useState</code>, todo o estado do hook será alterado, porém conseguimos o mesmo efeito usando o <a target="_blank" href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_operator">operador de spread</a> do JavaScript, <code>useState({ ...oldState, ...newState })</code></p>
<p>A primeira coisa a se pensar caso precisemos de um state mais complexo é ter um objeto com toda informação que precisamos,</p>
<p>Algo assim:</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Contador</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [state, setState] = useState({ <span class="hljs-attr">nome</span>: <span class="hljs-string">''</span>, <span class="hljs-attr">idade</span>: <span class="hljs-number">0</span>  })
  ...
  )
}
</code></pre>
<p>Só que acabamos ficando com uma função com nome genérico, e temos que lembrar de utilizar o <a target="_blank" href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_operator">operador de spread</a> para combinar o estado antigo com o novo. Com <em>hooks</em> temos outra opção, podemos chamar mais de uma vez o nosso <em>hook</em> <code>useState</code> no corpo de nosso componente.</p>
<p>Desta forma:</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Contador</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [nome, setNome] = useState(<span class="hljs-string">''</span>)
  <span class="hljs-keyword">const</span> [idade, setIdade] = useState(<span class="hljs-number">0</span>)
  ...
  )
}
</code></pre>
<p>Assim temos funções separadas e explicitas de como consumir ou alterar o estado do componente.</p>
<p>Alguns pontos de atenção sobre o uso de <em>hooks</em>, a ordem importa, então eles NÃO devem ser chamados em condicionais ou dentro de laços, sendo assim eles devem ficar sempre no topo do corpo da função de seu componente, alguns <a target="_blank" href="https://www.npmjs.com/package/eslint-plugin-react-hooks">linters foram criados</a> pelo time do React para te lembrar disso.\
Alem disso <em>hooks</em> não devem ser utilizados em classes ou fora de qualquer função no contexto do React, basicamente componentes e custom hooks(que vamos falar mais pra frente).</p>
<h2 id="hook-de-effects">Hook de <em>Effects</em></h2>
<p>Outro <em>hook</em> importante criado pelo time do React é o <code>useEffect</code>, ele permite que seu componente em forma de função tenha acesso aos <a target="_blank" href="https://reactjs.org/docs/state-and-lifecycle.html#adding-lifecycle-methods-to-a-class">métodos de ciclo de vida</a> sem precisar refatorar seu componente para uma classe.</p>
<p>Exemplo:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Contador</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [count, setCount] = useState(<span class="hljs-number">0</span>)

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-built_in">document</span>.title = <span class="hljs-string">`Você clicou <span class="hljs-subst">${count}</span> vezes!`</span>
  })

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      Você clicou {count} vezes!
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> setCount(count + 1)}&gt;
        Mais um!
      <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
)}
</code></pre>
<p>Nesse caso o titulo da pagina será alterado de acordo com atualização do estado do componente, na pratica o <code>useEffect</code> nesse contexto é equivalente ao <code>ComponentDidMount</code> e também ao <code>ComponentDidUpdate</code>. Ele irá invocar a função passada tanto quando o componente é montado quando é atualizado.</p>
<p>O <code>useEffect</code> também te da uma forma de fazer a limpeza de recursos, exatamente o que você usaria no <code>ComponentWillUnmount</code>. Para isso basta retornar uma função de limpeza.</p>
<p>Exemplo:</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Canvas</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [x, setX] = useState(<span class="hljs-number">0</span>)
  <span class="hljs-keyword">const</span> [y, setY] = useState(<span class="hljs-number">0</span>)

  useEffect(<span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">const</span> mouseMove = <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
        setX(e.screenX)
        setY(e.screenY)
      }

      <span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">'mousemove'</span>, mouseMove)
      <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">document</span>.removeEventListener(<span class="hljs-string">'mousemove'</span>, mouseMove)
  })

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
        Mouse esta no {x}, {y}
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
)}
</code></pre>
<p>Nesse exemplo, ao montar o componente temos o evento de <code>mousemove</code> configurado para alterar o estado do componente de acordo com o movimento do mouse e quando o componente for desmontado será rodado o <code>removeEventListener</code>, porém essa função de limpeza também será chamada quando for detectado que o <code>useEffect</code> precisa rodar novamente, ou seja em cada render.\
Por causa disso a cada alteração no estado do componente nosso evento está sendo removido e adicionado novamente. Em alguns casos pode ser algo que queremos, porém agora não. O que precisamos é que o evento seja adicionado na montagem apenas e a limpeza na desmontagem.</p>
<p>Para isso vamos utilizar o segundo argumento que o <code>useEffect</code> recebe, que é uma lista dos valores que devem mudar para que ele rode novamente. Se passarmos uma lista vazia, ele irá rodar apenas quando é montado e a função de limpeza apenas quando é desmontado.</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Canvas</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [x, setX] = useState(<span class="hljs-number">0</span>)
  <span class="hljs-keyword">const</span> [y, setY] = useState(<span class="hljs-number">0</span>)

  useEffect(<span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">const</span> mouseMove = <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
        setX(e.clientX)
        setY(e.clientY)
      }

      <span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">'mousemove'</span>, mouseMove)
      <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">document</span>.removeEventListener(<span class="hljs-string">'mousemove'</span>, mouseMove)
  }, []) <span class="hljs-comment">// &lt;-- aqui a lista vazia</span>

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
        Mouse esta no {x}, {y}
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
)}
</code></pre>
<p>Dessa forma nossos <code>event listeners</code> serão chamados apenas quando precisamos.\
Podemos utilizar esse segundo parâmetro para dizer quando nosso efeito vai rodar, por exemplo, em um caso de chat, queremos nos inscrever em um stream de mensagens para um cliente e caso o cliente mude precisamos cancelar a inscrição do atual e nos inscrever novamente.</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FriendStatus</span>(<span class="hljs-params">props</span>) </span>{
  <span class="hljs-keyword">const</span> [isOnline, setIsOnline] = useState(<span class="hljs-literal">null</span>);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> handleStatusChange = <span class="hljs-function"><span class="hljs-params">status</span> =&gt;</span> setIsOnline(status.isOnline)

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange)

    <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span> ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange)

  }, [props.friend.id]) <span class="hljs-comment">// apenas se desinscreve caso props.friend.id mude</span>
}
</code></pre>
<p>Toda vez que o <code>friend.id</code> mudar, iremos chamar o <code>unsubscribeFromFriendStatus</code> com id anterior e depois chamar o <code>subscribeToFriendStatus</code> com id atual, assim temos consistência na limpeza dos recursos de forma simples. Exatamente por esse motivo que a API do <code>useEffect</code> foi pensada, para ter ciclos de vida simples, e não precisar de vários <em>hooks</em> diferentes. Em comparação com uma função para cada método de ciclo de vida como é quando utilizamos classes.</p>
<h2 id="outros-hooks">Outros hooks...</h2>
<p>Vários <em>hooks</em> já vem por <a target="_blank" href="https://reactjs.org/docs/hooks-reference.html">padrão na biblioteca do React</a>. Mas vale abordar brevemente dois deles. O <code>useContext</code>, que te dá acesso direto à <a target="_blank" href="https://reactjs.org/docs/context.html">API de contexto do react</a> e permite que passemos dados de um componentes para seus filhos sem ter que declarar as props de forma explícita.</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Example</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> locale = useContext(LocaleContext)
  <span class="hljs-keyword">const</span> theme = useContext(ThemeContext)
  <span class="hljs-comment">// ...</span>
}
</code></pre>
<p>Outro <em>hook</em> interessante é o <code>useReducer</code>, que parece um pouco o <code>useState</code>, porém ele não te devolve uma função para alterar o estado, e sim uma função de <code>dispatch</code>, que envia uma mensagem de como o estado deve ser alterado. Para isso precisamos definir uma função de <code>reducer</code>, que é responsável por receber a mensagem e alterar o estado atual.</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> estadoInicial = {<span class="hljs-attr">count</span>: <span class="hljs-number">0</span>};

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">reducer</span>(<span class="hljs-params">state, action</span>) </span>{
  <span class="hljs-keyword">switch</span> (action.type) {
    <span class="hljs-keyword">case</span> <span class="hljs-string">'incrementar'</span>:
      <span class="hljs-keyword">return</span> { <span class="hljs-attr">count</span>: state.count + <span class="hljs-number">1</span> }
    <span class="hljs-keyword">case</span> <span class="hljs-string">'decrementar'</span>:
      <span class="hljs-keyword">return</span> { <span class="hljs-attr">count</span>: state.count - <span class="hljs-number">1</span> }
    <span class="hljs-attr">default</span>:
      <span class="hljs-keyword">return</span> state
  }
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Counter</span>(<span class="hljs-params">{ estadoInicial }</span>) </span>{
  <span class="hljs-keyword">const</span> [state, dispatch] = useReducer(reducer, estadoInicial );
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;&gt;</span>
      Count: {state.count}
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> dispatch({type: 'incrementar'})}&gt;+<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> dispatch({type: 'decrementar'})}&gt;-<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/&gt;</span></span>
  );
}
</code></pre>
<p>Nesse exemplo o <code>dispatch</code> ira chamar a função de <code>reducer</code> toda vez que um botão for clicado, passando como parâmetro a ação que ele deve fazer. A função de <code>reducer</code> por sua vez, recebe o estado atual e a mensagem de ação, e a partir disso sabe gerar um novo estado.\
Esta opção de <em>hook</em> é interessante em casos mais complexos de gerenciamento de estado.</p>
<h2 id="criando-nossos-hooks">Criando nossos <em>hooks!</em></h2>
<p>A parte mais legal dos <em>hooks</em> é o fato deles serem totalmente desacoplados de componentes, o que nos permite combiná-los para criar novos <em>hooks</em> mais específicos e compartilhar lógica entre nossos componentes.</p>
<p>Vamos imaginar um componente no contexto de chat para lidar com status de usuário:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FriendStatus</span>(<span class="hljs-params">props</span>) </span>{
  <span class="hljs-keyword">const</span> [isOnline, setIsOnline] = useState(<span class="hljs-literal">null</span>);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> handleStatusChange = <span class="hljs-function"><span class="hljs-params">status</span> =&gt;</span> status.isOnline

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange)

    <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span> ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange)
    }
  })

  <span class="hljs-keyword">if</span> (isOnline === <span class="hljs-literal">null</span>)
    <span class="hljs-keyword">return</span> <span class="hljs-string">'Loading...'</span>

  <span class="hljs-keyword">return</span> isOnline ? <span class="hljs-string">'Online'</span> : <span class="hljs-string">'Offline'</span>
}
</code></pre>
<p>Só que vamos imaginar que além disso, iremos precisar de uma forma de lidar com uma lista de contatos e exibir seus respectivos status.</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FriendListItem</span>(<span class="hljs-params">props</span>) </span>{
  <span class="hljs-keyword">const</span> [isOnline, setIsOnline] = useState(<span class="hljs-literal">null</span>);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> handleStatusChange = <span class="hljs-function"><span class="hljs-params">status</span> =&gt;</span> status.isOnline

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange)
    <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span>  ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange)
  })

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">color:</span> <span class="hljs-attr">isOnline</span> ? '<span class="hljs-attr">green</span>' <span class="hljs-attr">:</span> '<span class="hljs-attr">black</span>' }}&gt;</span>
      {props.friend.name}
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span></span>
  )
}
</code></pre>
<p>Claramente temos uma repetição de código aqui. Toda lógica de gerenciamento de estado é idêntica. Para resolver isso podemos extrair a lógica repetida em um <em>hook</em> customizado</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">useFriendStatus</span>(<span class="hljs-params">friendID</span>) </span>{
  <span class="hljs-keyword">const</span> [isOnline, setIsOnline] = useState(<span class="hljs-literal">null</span>);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> handleStatusChange = <span class="hljs-function"><span class="hljs-params">status</span> =&gt;</span> status.isOnline

    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange)
    <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span>  ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange)
  })

  <span class="hljs-keyword">return</span> isOnline
}
</code></pre>
<p>Não tem nada de novo aqui, é apenas a lógica que tínhamos em nossos componentes, só que agora em uma função separada (é padrão que todo <em>hook</em> tenha o sufixo <code>use</code>). Com isso podemos utilizá-lo diretamente em nossos componentes previamente criados:</p>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FriendStatus</span>(<span class="hljs-params">props</span>) </span>{
  <span class="hljs-keyword">const</span> isOnline = useFriendStatus(props.friend.id)

  <span class="hljs-keyword">if</span> (isOnline === <span class="hljs-literal">null</span>) {
    <span class="hljs-keyword">return</span> <span class="hljs-string">'Loading...'</span>
  }
  <span class="hljs-keyword">return</span> isOnline ? <span class="hljs-string">'Online'</span> : <span class="hljs-string">'Offline'</span>
}
</code></pre>
<pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FriendListItem</span>(<span class="hljs-params">props</span>) </span>{
  <span class="hljs-keyword">const</span> isOnline = useFriendStatus(props.friend.id)

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">color:</span> <span class="hljs-attr">isOnline</span> ? '<span class="hljs-attr">green</span>' <span class="hljs-attr">:</span> '<span class="hljs-attr">black</span>' }}&gt;</span>
      {props.friend.name}
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span></span>
  )
}
</code></pre>
<p>Sendo assim conseguimos compartilhar a lógica e simplificar nossos componentes.</p>
<p>Também Podemos criar <em>hooks</em> para lidar com bibliotecas externas tal como <a target="_blank" href="https://www.learnrxjs.io/">RxJs</a>, criando uma forma simples de combinar React com a biblioteca mais famosa de programação reativa:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>

<span class="hljs-keyword">const</span> useObservable = <span class="hljs-function">(<span class="hljs-params">observable, initialValue</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> [value, setValue] = useState(initialValue)
  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> subscription = observable.subscribe({<span class="hljs-attr">next</span>: setValue})
    <span class="hljs-keyword">return</span> <span class="hljs-function">() =&gt;</span> subscription.unsubscribe()
  }, [observable])
  <span class="hljs-keyword">return</span> value
}
</code></pre>
<p>Nesse código a cada novo evento no stream do <code>observable</code> temos uma atualização no estado, e o gerenciamento de <code>subscription</code> quase de graça.</p>
<p>O uso do nosso <em>hook</em> ficaria desta forma:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>
<span class="hljs-keyword">import</span> { fromEvent } <span class="hljs-keyword">from</span> <span class="hljs-string">'rxjs'</span>
<span class="hljs-keyword">import</span> { map }  <span class="hljs-keyword">from</span> <span class="hljs-string">'rxjs/operators'</span>
<span class="hljs-keyword">import</span> { useObservable } <span class="hljs-keyword">from</span> <span class="hljs-string">'./observableHook'</span>

<span class="hljs-keyword">const</span> mouse$ = fromEvent(<span class="hljs-built_in">document</span>, <span class="hljs-string">'mousemove'</span>).pipe(
  map(<span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> [e.clientX, e.clientY])
)

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
   <span class="hljs-keyword">const</span> [x,y] = useObservable(mouse$, [<span class="hljs-number">0</span>,<span class="hljs-number">0</span>])

   <span class="hljs-keyword">return</span> (
     <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>Mouse x:{x} y:{y}<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
   )

}
</code></pre>
<p>Complexidade quase igual à chamada de uma simples função.</p>
<h2 id="conclusao">Conclusão</h2>
<p><em>Hooks</em> vieram para nos dar uma forma nova de lidar com componentes complexos e compartilhamento de lógica entre eles, é um boa pedida para quem curte uma abordagem mais simplista e funcional de arquitetura de componentes.</p>
<p>Vale ressaltar que <em>Hooks</em> não vêm para substituir a forma tradicional com classes. Esta continuará funcionando, apenas aumentamos nosso leque de opções na construção de componentes.</p>
<h3 id="referencias">Referencias</h3>
<p><a target="_blank" href="https://reactjs.org/docs/hooks-intro.html">Documentação oficial</a></p>
]]></content:encoded></item><item><title><![CDATA[RebuildCast #7 - GameJam]]></title><description><![CDATA[Olá ouvintes, neste episódio iremos falar sobre GameJam, como é virar varias noites codando joguinhos numa versão mais legal de Hackaton



Inscreva-se: Apple Podcasts | Android | Google Podcasts | Spotify | Deezer | RSS
DOWNLOAD
Pauta:

o que é Game...]]></description><link>https://lucasteles.dev/rebuildcast-7-gamejam</link><guid isPermaLink="true">https://lucasteles.dev/rebuildcast-7-gamejam</guid><category><![CDATA[podcast]]></category><category><![CDATA[Game Development]]></category><dc:creator><![CDATA[Lucas Teles]]></dc:creator><pubDate>Tue, 29 Dec 2020 18:46:42 GMT</pubDate><content:encoded><![CDATA[<p>Olá ouvintes, neste episódio iremos falar sobre GameJam, como é virar varias noites codando joguinhos numa versão mais legal de Hackaton</p>
<iframe src="https://cast.rocks/player/28261/7-GameJam.mp3?episodeTitle=%237%20-%20GameJam&amp;podcastTitle=RebuildCast&amp;episodeDate=December%2030th%2C%202020&amp;imageURL=https%3A%2F%2Fcast.rocks%2Fhosting%2F28261%2Ffeeds%2FHEJZJ.jpg" style="border:none;min-height:265px;max-height:320px;max-width:558px;min-width:270px;width:100%;height:100%"></iframe>


<p>Inscreva-se: <a target="_blank" href="https://podcasts.apple.com/br/podcast/rebuildcast/id1533558833?l=en">Apple Podcasts</a> | <a target="_blank" href="https://www.subscribeonandroid.com/feeds.feedburner.com/Rebuildcast">Android</a> | <a target="_blank" href="https://podcasts.google.com/feed/aHR0cDovL2Nhc3Qucm9ja3MvaG9zdGluZy8yODI2MS9mZWVkcy9IRUpaSi54bWw">Google Podcasts</a> | <a target="_blank" href="https://open.spotify.com/show/4ATOzgTwwo0eSSuCY09T56?si=w7APM1BsTrSL4tk8Ol8Fkw">Spotify</a> | <a target="_blank" href="https://deezer.page.link/FWBgBiNavmHcNxNo9">Deezer</a> | <a target="_blank" href="https://feeds.feedburner.com/Rebuildcast">RSS</a></p>
<p><a target="_blank" href="http://cast.rocks/hosting/28261/7-GameJam.mp3">DOWNLOAD</a></p>
<p>Pauta:</p>
<ul>
<li>o que é Game Jam</li>
<li>Como foi Participar</li>
<li>Quanto tempo dura</li>
<li>Como funciona</li>
<li>quais limitações e temas?</li>
<li>dinâmicas de formação de equipe ?</li>
<li>Quais tecnologias</li>
<li>itch.io</li>
<li>Maiores eventos</li>
<li>Premiações</li>
<li>Como começar? nao sei nada de gamedev...</li>
<li>Dicas</li>
</ul>
<p>Participantes:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/lucasteles42">Lucas Teles</a></li>
<li><a target="_blank" href="https://twitter.com/adriano_sudario">Adriano Sudario</a></li>
<li><a target="_blank" href="https://twitter.com/theguspassos">Gustavo Passos</a></li>
<li><a target="_blank" href="https://twitter.com/Daniel_Moori">Daniel Moori</a></li>
</ul>
<p>Links:</p>
<ul>
<li><a target="_blank" href="http://itch.io/">Itch.io</a></li>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=mix+and+jam++best">Destaques de GameJam</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=M_iiXaaF5T4">Jogo baseado em bugs</a></li>
<li><a target="_blank" href="https://itch.io/jams">Lista de GameJams</a></li>
<li><a target="_blank" href="https://www.youtube.com/user/McBacon1337">GMTK</a></li>
<li><a target="_blank" href="https://petit-suisse.itch.io/possum-gump">Itch.io do Adriano</a></li>
<li><a target="_blank" href="https://moori.itch.io/">Itch.io do Moori</a></li>
<li><a target="_blank" href="https://theguspassos.itch.io/">Itch.io do Gus</a></li>
<li><a target="_blank" href="https://lucasteles.itch.io/">Itch.io do Lucas Teles</a></li>
</ul>
<p>Music by: MDKSong Title: Press Start (Smooth Jazz Remix)<a target="_blank" href="http://www.facebook.com/MDKOfficial">http://www.facebook.com/MDKOfficial</a><a target="_blank" href="http://www.youtube.com/MDKOfficialYT">http://www.youtube.com/MDKOfficialYT</a>Buy the song here: <a target="_blank" href="http://www.mdkofficial.bandcamp.com/">http://www.mdkofficial.bandcamp.com/</a>Free Download: <a target="_blank" href="http://www.morgandavidking.com/free-downloads">http://www.morgandavidking.com/free-downloads</a></p>
]]></content:encoded></item></channel></rss>