<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Afonso Branco - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Afonso Branco - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 08:43:21 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/afonso/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como construir um menu acordeão em React a partir do zero – sem necessidade de bibliotecas externas ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu Existem várias maneiras de se utilizar menus acordeão, tais como exibir uma lista de FAQs (Perguntas frequentes, em português), exibir vários menus e submenus, exibir as localizações de uma empresa em particular, e assim adiante. Neste artigo, verás como criar um menu acordeão em React ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-construir-um-menu-acordeao-em-react-a-partir-do-zero-sem-necessidade-de-bibliotecas-externashow-to-build-an-accordion-menu-in-react-from-scratch-no-external-libraries-required/</link>
                <guid isPermaLink="false">6696773fa696970403cc04b8</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Tue, 03 Sep 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/604df0d628094f59be2558d6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/build-accordion-menu-in-react-without-external-libraries/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/build-accordion-menu-in-react-without-external-libraries/</a>
      </p><blockquote>Tradução em português europeu</blockquote><p>Existem várias maneiras de se utilizar menus acordeão, tais como exibir uma lista de <em>FAQs</em> (Perguntas frequentes, em português), exibir vários menus e submenus, exibir as localizações de uma empresa em particular, e assim adiante.</p><p>Neste artigo, verás como criar um menu acordeão em React completamente do zero, passo a passo, sem utilizar qualquer biblioteca externa.</p><p>Vamos utilizar a sintaxe de "React Hooks" para criar esta aplicação em React. Então, se não tiveres experiência em React Hooks, dá uma vista de olhos ao meu artigo <a href="https://levelup.gitconnected.com/an-introduction-to-react-hooks-50281fd961fe?source=friends_link&amp;sk=89baff89ec8bc637e7c13b7554904e54"><em>An introduction to React Hooks</em></a> (texto em inglês) para aprender os conceitos básicos dos Hooks.</p><p><strong>Podes ver uma demonstração da aplicação<strong> </strong><a href="https://react-accordion-demo.netlify.app/">aqui</a><strong>.</strong></strong></p><p>Então, vamos começar.</p><h2 id="configura-o-inicial-do-projeto"><strong>Configuração inicial do projeto</strong></h2><p>Cria um projeto utilizando <code>create-react-app</code>.</p><pre><code class="language-javascript">npx create-react-app react-accordion-demo
</code></pre><p>Assim que o projeto for criado, remove todos os ficheiros da pasta <code>src</code> e cria os ficheiros <code>index.js</code>, <code>App.js</code> e <code>styles.css</code> dentro da pasta <code>src</code>. Além disso, cria uma pasta com o novo <code>utils</code> dentro da pasta <code>src</code>.</p><p>Abre o ficheiro <code>styles.css</code> e adiciona os conteúdos <a href="https://github.com/myogeshchavan97/react-accordion-demo/blob/master/src/styles.css">daqui</a> dentro dele.</p><h2 id="como-criar-as-p-ginas-iniciais"><strong>Como criar as páginas iniciais</strong></h2><p>Abre o ficheiro <code>src/App.js</code> e adiciona o seguinte conteúdo dentro dele:</p><pre><code class="language-jsx">import React from 'react';

const App = () =&gt; {
  const accordionData = {
    title: 'Section 1',
    content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
      laborum cupiditate possimus labore, hic temporibus velit dicta earum
      suscipit commodi eum enim atque at? Et perspiciatis dolore iure
      voluptatem.`
  };

  const { title, content } = accordionData;

  return (
    &lt;React.Fragment&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        &lt;div className="accordion-item"&gt;
          &lt;div className="accordion-title"&gt;
            &lt;div&gt;{title}&lt;/div&gt;
            &lt;div&gt;+&lt;/div&gt;
          &lt;/div&gt;
          &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/React.Fragment&gt;
  );
};

export default App;
</code></pre><p>Aqui, utilizamos as propriedades do objeto <code>accordionData</code> para exibir o conteúdo do acordeão.</p><p>Para a propriedade <code>content</code>, utilizamos a sintaxe de <em>template literals</em> do ES6 (``) de maneira a podermos distribuir o conteúdo por várias linhas e utilizamos algum texto <em>lorem ipsum</em> para preencher.</p><p>Agora, abre o ficheiro <code>src/index.js</code> e adiciona o seguinte conteúdo dentro dele:</p><pre><code class="language-jsx">import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './styles.css';

ReactDOM.render(&lt;App /&gt;, document.getElementById('root'));
</code></pre><p>Agora, se executares a aplicação utilizando o comando <code>yarn start</code> a partir do terminal, verás o seguinte ecrã:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/accordion_initial.png" class="kg-image" alt="accordion_initial" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/09/accordion_initial.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/09/accordion_initial.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/09/accordion_initial.png 1440w" sizes="(min-width: 1200px) 1200px" width="1440" height="655" loading="lazy"></figure><h2 id="como-abrir-e-fechar-o-menu-acorde-o"><strong>Como abrir e fechar o menu acordeão</strong></h2><p>Tal como podes ver acima, exibimos uma única secção como uma parte do acordeão. Por defeito, contudo, o acordeão está expandido e não podemos fechá-lo. Então, vamos adicionar a funcionalidade para abrir e fechar o acordeão.</p><p>Adiciona um novo estado dentro do componente, tal como mostrado abaixo:</p><pre><code class="language-js">const [isActive, setIsActive] = useState(false);
</code></pre><p>Aqui, definimos o estado <code>isActive</code>. Com base nisso, vamos ocultar ou exibir o conteúdo do acordeão.</p><p>Importa também o <em>hook</em> <code>useState</code> no início do ficheiro:</p><pre><code class="language-js">import React, { useState } from 'react';
</code></pre><p>Agora, para a <code>div</code> com a classe <code>accordion-title</code>, adiciona o manipulador <code>onClick</code>, desta forma:</p><pre><code class="language-jsx">&lt;div className="accordion"&gt;
  &lt;div className="accordion-item"&gt;
    &lt;div
      className="accordion-title"
      onClick={() =&gt; setIsActive(!isActive)}
    &gt;
      &lt;div&gt;{title}&lt;/div&gt;
      &lt;div&gt;{isActive ? '-' : '+'}&lt;/div&gt;
    &lt;/div&gt;
    {isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
  &lt;/div&gt;
&lt;/div&gt;
</code></pre><p>Aqui, estamos a inverter o valor do estado <code>isActive</code> quando clicamos na div <code>accordion-title</code>. Se o valor de <code>isActive</code> for <code>false</code>, estamos a defini-lo para &nbsp;<code>true</code>, e vice-versa.</p><p>Também estamos a exibir os sinais <code>+</code> ou <code>-</code> com base no valor de <code>isActive</code>, utilizando o operador ternário.</p><p>Se o valor de estado de <code>isActive</code> for <code>true</code>, vamos exibir apenas o conteúdo do acordeão, tal como mostrado abaixo:</p><pre><code class="language-jsx">{isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
</code></pre><p>Agora, se verificares a aplicação, verás o seguinte ecrã:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/open_close.gif" class="kg-image" alt="open_close" width="706" height="442" loading="lazy"></figure><p>Como podes observar, inicialmente, o acordeão está fechado. Quando clicamos no título, o acordeão abre e podemos clicar nele novamente para fechá-lo.</p><h2 id="como-adicionar-v-rias-sec-es-em-acorde-o"><strong>Como adicionar várias secções em acordeão</strong></h2><p>Isto funciona bem para uma única secção em acordeão. No entanto, se tivermos várias secções, não será bom copiar e colar o mesmo código JSX vezes sem conta com conteúdo diferente.</p><p>Então, vamos criar um componente separado para exibir apenas o acordeão. Depois, com base no número de secções, vamos iterar sobre o componente para exibir várias secções.</p><p>Cria um ficheiro <code>Accordion.js</code> dentro da pasta <code>src</code> e adiciona-lhe os seguintes conteúdos:</p><pre><code class="language-jsx">import React, { useState } from 'react';

const Accordion = ({ title, content }) =&gt; {
  const [isActive, setIsActive] = useState(false);

  return (
    &lt;div className="accordion-item"&gt;
      &lt;div className="accordion-title" onClick={() =&gt; setIsActive(!isActive)}&gt;
        &lt;div&gt;{title}&lt;/div&gt;
        &lt;div&gt;{isActive ? '-' : '+'}&lt;/div&gt;
      &lt;/div&gt;
      {isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
    &lt;/div&gt;
  );
};

export default Accordion;
</code></pre><p>Aqui, movemos o estado e a div <code>accordion-item</code> do ficheiro <code>App.js</code> para o ficheiro <code>Accordion.js</code>. Estamos a passar os <em>props</em> dinâmicos <code>title</code> e <code>content</code> para o componente utilizando a sintaxe de desestruturação do ES6, como isto:</p><pre><code class="language-js">const Accordion = ({ title, content }) =&gt; {
</code></pre><p>Agora, abre o ficheiro <code>App.js</code> e substitui-o pelo seguinte conteúdo:</p><pre><code class="language-jsx">import React from 'react';
import Accordion from './Accordion';

const App = () =&gt; {
  const accordionData = [
    {
      title: 'Section 1',
      content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
      laborum cupiditate possimus labore, hic temporibus velit dicta earum
      suscipit commodi eum enim atque at? Et perspiciatis dolore iure
      voluptatem.`
    },
    {
      title: 'Section 2',
      content: `Lorem ipsum, dolor sit amet consectetur adipisicing elit. Mollitia veniam
      reprehenderit nam assumenda voluptatem ut. Ipsum eius dicta, officiis
      quaerat iure quos dolorum accusantium ducimus in illum vero commodi
      pariatur? Impedit autem esse nostrum quasi, fugiat a aut error cumque
      quidem maiores doloremque est numquam praesentium eos voluptatem amet!
      Repudiandae, mollitia id reprehenderit a ab odit!`
    },
    {
      title: 'Section 3',
      content: `Sapiente expedita hic obcaecati, laboriosam similique omnis architecto ducimus magnam accusantium corrupti
      quam sint dolore pariatur perspiciatis, necessitatibus rem vel dignissimos
      dolor ut sequi minus iste? Quas?`
    }
  ];

  return (
    &lt;div&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        {accordionData.map(({ title, content }) =&gt; (
          &lt;Accordion title={title} content={content} /&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;
</code></pre><p>Aqui, convertemos <code>accordionData</code> de um objeto para um <em>array </em>de objetos. Estamos a iterar sobre ele utilizando o método de mapeamento de <em>array </em>e a passar os <code>title</code> e <code>content</code> correspondentes para o componente <code>Accordion</code>.</p><p>Agora, se verificares a aplicação, verás que as três secções são exibidas e que podemos abrir e fechar cada secção, tal como mostrado abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/final_working.gif" class="kg-image" alt="final_working" width="706" height="442" loading="lazy"></figure><h2 id="como-refatorar-o-c-digo"><strong>Como refatorar o código</strong></h2><p>Então, tal como podes ver, ao mover simplesmente a secção do acordeão para fora para uma componente separado e ao passar o conteúdo dinâmico como <em>props</em>, conseguimos criar com sucesso uma versão funcional de um acordeão a partir do zero.</p><p>É uma boa prática manter a informação estática num ficheiro à parte. Então, vamos mover o <em>array </em><code>accordionData</code> para um ficheiro diferente e importá-lo para <code>App.js</code>.</p><p>Cria um ficheiro chamado <code>content.js</code> dentro da pasta <code>utils</code> e adiciona-lhe o seguinte conteúdo:</p><pre><code class="language-js">export const accordionData = [
  {
    title: 'Section 1',
    content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
    laborum cupiditate possimus labore, hic temporibus velit dicta earum
    suscipit commodi eum enim atque at? Et perspiciatis dolore iure
    voluptatem.`
  },
  {
    title: 'Section 2',
    content: `Lorem ipsum, dolor sit amet consectetur adipisicing elit. Mollitia veniam
    reprehenderit nam assumenda voluptatem ut. Ipsum eius dicta, officiis
    quaerat iure quos dolorum accusantium ducimus in illum vero commodi
    pariatur? Impedit autem esse nostrum quasi, fugiat a aut error cumque
    quidem maiores doloremque est numquam praesentium eos voluptatem amet!
    Repudiandae, mollitia id reprehenderit a ab odit!`
  },
  {
    title: 'Section 3',
    content: `Sapiente expedita hic obcaecati, laboriosam similique omnis architecto ducimus magnam accusantium corrupti
    quam sint dolore pariatur perspiciatis, necessitatibus rem vel dignissimos
    dolor ut sequi minus iste? Quas?`
  }
];
</code></pre><p>Agora, abre <code>App.js</code> e substitui-o pelo seguinte conteúdo:</p><pre><code class="language-jsx">import React from 'react';
import Accordion from './Accordion';
import { accordionData } from './utils/content';

const App = () =&gt; {
  return (
    &lt;div&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        {accordionData.map(({ title, content }) =&gt; (
          &lt;Accordion title={title} content={content} /&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;
</code></pre><p>Aqui, apenas importamos a informação estática do ficheiro externo e removêmo-la do ficheiro <code>App.js</code>.</p><p>Então, agora o código está mais limpo e fácil de compreender e a funcionalidade está a funcionar como antes.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/final_working--1-.gif" class="kg-image" alt="final_working--1-" width="706" height="442" loading="lazy"></figure><h2 id="pontos-finais"><strong>Pontos finais</strong></h2><p>Terminamos a construção da funcionalidade da nossa aplicação.</p><p><strong>Podes encontrar o código fonte completo desta aplicação no <strong>GitHub </strong></strong><a href="https://github.com/myogeshchavan97/react-accordion-demo"><strong>neste repositório</strong></a><strong><strong>.</strong></strong></p><h3 id="obrigado-pela-leitura-"><strong>Obrigado pela leitura!</strong></h3><p>Desejas aprender todas as funcionalidades do ES6+ em detalhe, incluindo <em>let</em> e <em>const</em>, <em>promises</em>, vários métodos de <em>promises</em>, <em>arrays</em> e desestruturação de objetos, funções de seta, <em>async</em>/<em>await</em>, importação e exportação e muito mais a partir do zero?</p><p>Consulta o meu livro "<a href="https://modernjavascript.yogeshchavan.dev/">Mastering Modern JavaScript</a>" (em inglês). Ele aborda todos os pré-requisitos para aprender React e ajuda-te a ficar mais competente em JavaScript e React.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/freecodecamp_image-1.jpeg" class="kg-image" alt="freecodecamp_image-1" width="512" height="800" loading="lazy"></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Melhores práticas para uma aplicação em Angular limpa e de elevado desempenho ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu Escrito por: Vamsi Vempati Tenho vindo a trabalhar numa aplicação de grande escala em Angular na Trade Me [https://trademe.nz/], na Nova Zelândia, há um par de anos. Ao longo dos últimos anos, a nossa equipa tem vindo a refinar a nossa aplicação tanto em termos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/melhores-praticas-para-uma-aplicacao-em-angular-limpa-e-de-elevado-desempenho/</link>
                <guid isPermaLink="false">65b8b4985afa84045c135536</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 12 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/0_q3-4kypImPD0VDPg.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/best-practices-for-a-clean-and-performant-angular-application-288e7b39eb6f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Best practices for a clean and performant Angular application</a>
      </p><blockquote>Tradução em português europeu</blockquote><p>Escrito por: Vamsi Vempati</p><p>Tenho vindo a trabalhar numa aplicação de grande escala em Angular na <a href="https://trademe.nz/" rel="noopener">Trade Me</a>, na Nova Zelândia, há um par de anos. Ao longo dos últimos anos, a nossa equipa tem vindo a refinar a nossa aplicação tanto em termos de normas de programação como em desempenho, para que esteja no melhor estado possível.</p><p>Este artigo descreve as práticas que utilizamos na nossa aplicação e está relacionado com Angular, Typescript, RxJs e @ngrx/store. Também vamos abordar algumas diretrizes gerais de programação para ajudar a aplicação a ficar mais limpa.</p><h4 id="1-trackby"><strong><strong><strong>1) trackBy</strong></strong></strong></h4><p>Ao utilizar <code>ngFor</code> para iterar sobre um <em>array </em>em <em>templates</em>, utiliza-o com uma função <code>trackBy</code>, que retornará um identificador único por cada item.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Quando um <em>array</em> muda, o Angular renderiza novamente toda a árvore do DOM. Se, no entanto, utilizares <code>trackBy</code>, o Angular saberá que elemento foi alterado e realizará alterações à árvore do DOM apenas para esse elemento em particular.</p><p>Para uma explicação detalhada sobre isso, consulta <a href="https://netbasal.com/angular-2-improve-performance-with-trackby-cc147b5104e5" rel="noopener">este artigo</a> por Netanel Basal (em inglês).</p><p><strong>Antes</strong></p><pre><code class="language-ts">&lt;li *ngFor="let item of items;"&gt;{{ item }}&lt;/li&gt;</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">// no template

&lt;li *ngFor="let item of items; trackBy: trackByFn"&gt;{{ item }}&lt;/li&gt;

// no componente

trackByFn(index, item) {    
   return item.id; // correspondência de id único do item
}</code></pre><h4 id="2-const-x-let"><strong><strong><strong>2) const </strong></strong>x<strong><strong> let</strong></strong></strong></h4><p>Ao declarar variáveis, utiliza const nos casos em que o valor não será redefinido.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Utilizar <code>let</code> e <code>const</code> quando for adequado clarifica a intenção das declarações. Também ajudará a identificar problemas quando um valor é acidentalmente reatribuído a uma constante, ao gerar um erro de compilação. Também ajuda a melhorar a legibilidade do código.</p><p><strong>Antes</strong></p><pre><code class="language-ts">let car = 'ludicrous car';

let myCar = `My ${car}`;
let yourCar = `Your ${car};

if (iHaveMoreThanOneCar) {
   myCar = `${myCar}s`;
}

if (youHaveMoreThanOneCar) {
   yourCar = `${youCar}s`;
}</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">// o valor de car não é redefinido, por isso podemos torná-lo numa const
const car = 'ludicrous car';

let myCar = `My ${car}`;
let yourCar = `Your ${car};

if (iHaveMoreThanOneCar) {
   myCar = `${myCar}s`;
}

if (youHaveMoreThanOneCar) {
   yourCar = `${youCar}s`;
}</code></pre><h4 id="3-operadores-canaliz-veis"><strong>3) Operadores canalizáveis</strong></h4><p>Utiliza operadores canalizáveis ao utilizar operadores RxJs.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Os operadores canalizáveis são "<em>tree-shakeable</em>", o que significa que apenas o código de cuja execução precisamos será incluído quando os operadores são importados.</p><p>Isso também faz com que seja mais fácil identificar operadores inutilizados nos ficheiros.</p><p><em><em>Not</em>a<em>:</em></em> isso requer a versão 5.5+ do Angular.</p><p><strong>Antes</strong></p><pre><code class="language-ts">import 'rxjs/add/operator/map';
import 'rxjs/add/operator/take';

iAmAnObservable
    .map(value =&gt; value.item)
    .take(1);</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">import { map, take } from 'rxjs/operators';

iAmAnObservable
    .pipe(
       map(value =&gt; value.item),
       take(1)
     );</code></pre><h4 id="4-truques-isolados-de-api"><strong>4) Truques isolados de API</strong></h4><p>Nem todas as APIs são à prova de bala — por vezes, precisamos de adicionar alguma lógica no código para compensar os erros nas APIs. Em vez de ter os truques em componentes onde eles são necessários, é melhor isolá-los num local — como, por exemplo, um serviço e utilizar o servido a partir do componente.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Isso ajuda a manter os truques "mais próximos da API", ou seja, tão próximo do local onde o pedido de rede é realizado quanto possível. Desse modo, existe menos código a lidar com erros. Além disso, existe um local onde residem todos os truques e é mais fácil encontrá-los. Ao corrigir erros nas APIs, é mais fácil procurar os truques num ficheiro, em vez de procurar os truques que poderiam estar espalhados pela base de código.</p><p>Também podes criar tags personalizadas, como API_FIX, semelhante a TODO e anexar as correções à tag para que seja mais fácil de encontrar.</p><h4 id="5-subscrever-em-template"><strong>5) Subscrever em <em>template</em></strong></h4><p>Evita subscrever a observáveis a partir de componente. Em vez disso, subscreve aos observáveis a partir do <em>template</em>.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Os canais <code>async</code> removem a sua subscrição automaticamente e tornam o código mais simples ao eliminar a necessidade de gerir manualmente subscrições. Também reduz o risco de acidentalmente esquecer a remoção da subscrição no componente, que causaria uma fuga de memória. Esse risco também pode ser mitigado ao utilizar uma regra de <em>lint</em> para detetar observáveis não subscritos.</p><p>Isto também impede que os componentes tenham estado e introduzam erros onde os dados são alterados fora da subscrição.</p><p><strong>Antes</strong></p><pre><code>// template

&lt;p&gt;{{ textToDisplay }}&lt;/p&gt;

// componente

iAmAnObservable
    .pipe(
       map(value =&gt; value.item),
       takeUntil(this._destroyed$)
     )
    .subscribe(item =&gt; this.textToDisplay = item);</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">// template

&lt;p&gt;{{ textToDisplay$ | async }}&lt;/p&gt;

// componente

this.textToDisplay$ = iAmAnObservable
    .pipe(
       map(value =&gt; value.item)
     );</code></pre><h4 id="6-limpar-subscri-es"><strong><strong><strong>6) </strong></strong>Limpar subscrições</strong></h4><p>Ao fazer subscrição a observáveis, certifica-te sempre que removes a subscrição a eles adequadamente ao utilizar operadores como <code>take</code>, <code>takeUntil</code> etc.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Não remover a subscrição a observáveis causará fugas de memória indesejáveis, pois o fluxo de observáveis é deixado aberto, potencialmente, até mesmo após a destruição de um componente/o utilizador ter navegado para outra página.</p><p>Melhor ainda, cria uma regra <em>lint</em> para detetar observáveis cuja subscrição não tenha sido removida.</p><p><strong>Antes</strong></p><pre><code>iAmAnObservable
    .pipe(
       map(value =&gt; value.item)     
     )
    .subscribe(item =&gt; this.textToDisplay = item);</code></pre><p><strong>Depois</strong></p><p>Utilizar <code>takeUntil</code> quando desejas aguardar por alterações até que outro observável emita um valor:</p><pre><code>private _destroyed$ = new Subject();

public ngOnInit (): void {
    iAmAnObservable
    .pipe(
       map(value =&gt; value.item)
      // Queremos aguardar por iAmAnObservable até que o componente seja destruído,
       takeUntil(this._destroyed$)
     )
    .subscribe(item =&gt; this.textToDisplay = item);
}

public ngOnDestroy (): void {
    this._destroyed$.next();
    this._destroyed$.complete();
}</code></pre><p>Utilizar um sujeito privado como esse é um padrão para gerir a remoção da subscrição de vários observáveis no componente.</p><p>Utilizar <code>take</code> quando queres apenas o primeiro valor emitido pelo observável:</p><pre><code class="language-ts">iAmAnObservable
    .pipe(
       map(value =&gt; value.item),
       take(1),
       takeUntil(this._destroyed$)
    )
    .subscribe(item =&gt; this.textToDisplay = item);</code></pre><p>Observa aqui a utilização de <code>takeUntil</code> com <code>take</code>. Isso é para evitar fugas de memória quando a subscrição não tiver recebido um valor antes do componente ter sido destruído. Sem <code>takeUntil</code> aqui, a subscrição ainda permaneceria até obter o primeiro valor, mas visto que o componente já foi destruído, ele nunca obterá um valor — levando a uma fuga de memória.</p><h4 id="7-utilizar-operadores-apropriados"><strong>7) Utilizar operadores apropriados</strong></h4><p>Ao utilizar operadores de <em>flattening</em> com os teus observáveis, utiliza o operador adequado para a situação.</p><p><em><em>switchMap:</em></em> quando desejas ignorar as emissões anteriores quando existe uma nova emissão.</p><p><em><em>mergeMap:</em></em> quando desejas lidar simultaneamente com todas as emissões.</p><p><em><em>concatMap:</em></em> quando desejas lidar com as emissões uma após a outra, à medida que são emitidas.</p><p><em><em>exhaustMap: </em></em>quando desejas cancelar todas as emissões novas enquanto processas a emissão anterior.</p><p>Para uma explicação detalhada disso, observa <a href="https://blog.angularindepth.com/switchmap-bugs-b6de69155524" rel="noopener">este</a> artigo de Nicholas Jamieson (em inglês).</p><p><strong>Por quê<strong>?</strong></strong></p><p>Utilizar um único operador quando possível, em vez de encadear vários outros operadores para alcançar o mesmo efeito, pode fazer com que seja enviado menos código para o <em>client</em>. Utilizar os operadores errados pode levar a comportamentos indesejados, visto que operadores diferentes lidam com observáveis de maneiras diferentes.</p><h4 id="8-carregamento-lento-lazy-loading-"><strong>8) Carregamento lento (<em>lazy loading</em>)</strong></h4><p>Quando possível, tenta carregar lentamente os módulos na tua aplicação em Angular. Carregamento lento é quando carregas algo apenas quando é utilizado – por exemplo, carregar um componente apenas quando ele tiver de ser visto.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Isso reduzirá o tamanho da aplicação a ser carregada e pode melhorar o tempo de iniciação da aplicação ao não carregar os módulos que não são utilizados.</p><p><strong>Antes</strong></p><pre><code>// app.routing.ts

{ path: 'not-lazy-loaded', component: NotLazyLoadedComponent }</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">// app.routing.ts

{ 
  path: 'lazy-load',
  loadChildren: 'lazy-load.module#LazyLoadModule' 
}

// lazy-load.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { LazyLoadComponent }   from './lazy-load.component';

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild([
         { 
             path: '',
             component: LazyLoadComponent 
         }
    ])
  ],
  declarations: [
    LazyLoadComponent
  ]
})
export class LazyModule {}</code></pre><h4 id="9-evitar-ter-subscri-es-dentro-de-subscri-es"><strong>9) Evitar ter subscrições dentro de subscrições</strong></h4><p>Por vezes, podes querer que os valores de mais do que um observável realizem uma ação. Nesse caso, evita subscrever um observável no bloco de subscrição de outro observável. Em vez disso, utiliza operadores de encadeamento adequados. Os operadores de encadeamento correm nos observáveis do operador antes deles. Alguns operadores são: <code>withLatestFrom</code>, <code>combineLatest</code> etc.</p><p><strong>Antes</strong></p><pre><code>firstObservable$.pipe(
   take(1)
)
.subscribe(firstValue =&gt; {
    secondObservable$.pipe(
        take(1)
    )
    .subscribe(secondValue =&gt; {
        console.log(`Os valores combinados são: ${firstValue} e ${secondValue}`);
    });
});</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">firstObservable$.pipe(
    withLatestFrom(secondObservable$),
    first()
)
.subscribe(([firstValue, secondValue]) =&gt; {
    console.log(`Os valores combinados são: ${firstValue} e ${secondValue}`);
});</code></pre><p><strong>Por quê<strong>?</strong></strong></p><p><em>"<em>Code smell</em>"<em>/</em>legibilidade<em>/complexi</em>dade</em>: não utilizar RxJs em toda a sua extensão, sugere que o programador não está familiarizado com a área de superfície da API RxJs API.</p><p><em>Desempenho</em>: se os observáveis estiverem inativos, o código subscreverá para firstObservable, esperará que ele termine e DEPOIS iniciará o trabalho com o segundo observável. Se esses fossem pedidos de rede, seria mostrado como assíncrono/cascata.</p><h4 id="10-evitar-any-e-atribuir-tipo-a-tudo"><strong>10) Evitar "any" e atribuir tipo a tudo</strong></h4><p>Declara sempre variáveis ou constantes com um tipo diferente de <code>any</code>.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ao declarar variáveis ou constantes em Typescript sem uma tipologia, o tipo da variável/constante será deduzido pelo valor que lhe é atribuído. Isso causará problemas não pretendidos. Um exemplo clássico é:</p><pre><code>const x = 1;
const y = 'a';
const z = x + y;

console.log(`O valor de z é: ${z}`

// Resultado
O valor de z é 1a</code></pre><p>Isso pode causar problemas indesejados quando esperas que y também seja um número. Esses problemas podem ser evitados ao escrever as variáveis de maneira apropriada.</p><pre><code>const x: number = 1;
const y: number = 'a';
const z: number = x + y;

// Isto gerará um erro de compilação a dizer:

Type '"a"' is not assignable to type 'number'.

const y:number</code></pre><p>Dessa forma, podemos evitar erros causados pela ausência de tipos.</p><p>Outra vantagem de ter boas tipologias na tua aplicação é que torna a refatorização mais fácil e segura.</p><p>Considera estes exemplos:</p><pre><code>public ngOnInit (): void {
    let myFlashObject = {
        name: 'My cool name',
        age: 'My cool age',
        loc: 'My cool location'
    }
    this.processObject(myFlashObject);
}

public processObject(myObject: any): void {
    console.log(`Name: ${myObject.name}`);
    console.log(`Age: ${myObject.age}`);
    console.log(`Location: ${myObject.loc}`);
}

// Resultado
Name: My cool name
Age: My cool age
Location: My cool location</code></pre><p>Digamos que queremos renomear a propriedade &nbsp;<code>loc</code> para <code>location</code> em <code>myFlashObject</code>:</p><pre><code>public ngOnInit (): void {
    let myFlashObject = {
        name: 'My cool name',
        age: 'My cool age',
        location: 'My cool location'
    }
    this.processObject(myFlashObject);
}

public processObject(myObject: any): void {
    console.log(`Name: ${myObject.name}`);
    console.log(`Age: ${myObject.age}`);
    console.log(`Location: ${myObject.loc}`);
}

// Resultado
Name: My cool name
Age: My cool age
Location: undefined</code></pre><p>Se não tivermos um tipo no <code>myFlashObject</code>, este pensará que a propriedade <code>loc</code> em <code>myFlashObject</code> é apenas indefinida, em vez de não ser uma propriedade válida.</p><p>Se tivéssemos um tipo para <code>myFlashObject</code>, obteríamos um bom erro de tempo de compilação como mostrado abaixo:</p><pre><code>type FlashObject = {
    name: string,
    age: string,
    location: string
}

public ngOnInit (): void {
    let myFlashObject: FlashObject = {
        name: 'My cool name',
        age: 'My cool age',
        // Erro de compilação
        Type '{ name: string; age: string; loc: string; }' is not assignable to type 'FlashObjectType'.
        Object literal may only specify known properties, and 'loc' does not exist in type 'FlashObjectType'.
        loc: 'My cool location'
    }
    this.processObject(myFlashObject);
}

public processObject(myObject: FlashObject): void {
    console.log(`Name: ${myObject.name}`);
    console.log(`Age: ${myObject.age}`)
    // Erro de compilação
    Property 'loc' does not exist on type 'FlashObjectType'.
    console.log(`Location: ${myObject.loc}`);
}</code></pre><p>Se estiveres a iniciar um novo projeto, vale a pena definir <code>strict:true</code> no ficheiro <code>tsconfig.json</code> para ativar todas as opções rigorosas de verificação de tipo.</p><h4 id="11-faz-uso-das-regras-de-lint"><strong>11) Faz uso das regras de <em>lint</em></strong></h4><p>O <a href="https://palantir.github.io/tslint/" rel="noopener"><code>tslint</code></a> tem várias opções já incorporadas como <a href="https://palantir.github.io/tslint/rules/no-any" rel="noopener"><code>no-any</code></a>, <a href="https://palantir.github.io/tslint/rules/no-magic-numbers" rel="noopener"><code>no-magic-numbers</code></a>, <a href="https://palantir.github.io/tslint/rules/no-console" rel="noopener"><code>no-console</code></a> etc, que podes configurar no teu <code>tslint.json</code> para impor certas regras na tua base de código.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ter regras de <em>lint</em> aplicadas significa que obterás um erro útil caso estejas a fazer algo que não deverias estar a fazer. Isso garantirá consistência e legibilidade. Por favor, consulta <a href="https://palantir.github.io/tslint/rules/" rel="noopener">aqui</a> (em inglês) mais regras que podes configurar.</p><p>Alguma regras de <em>lint</em> até têm correções para resolver o erro de <em>lint</em>. Se desejares configurar a tua própria regra de <em>lint</em> personalizada, também podes fazê-lo. Consulta, por favor, <a href="https://medium.com/@phenomnominal/custom-typescript-lint-rules-with-tsquery-and-tslint-144184b6ff2d" rel="noopener">este artigo</a> de Craig Spence (em inglês) sobre como escrever as tuas próprias regras de <em>lint</em> personalizadas utilizando o <a href="https://github.com/phenomnomnominal/tsquery" rel="noopener">TSQuery</a>.</p><p><strong>Antes</strong></p><pre><code>public ngOnInit (): void {
    console.log('Eu sou uma mensagem do console');
    console.warn('Eu sou uma mensagem de aviso do console');
    console.error('Eu sou uma mensagem de erro do console');
}

// Resultado - sem erros, imprimirá o que vemos abaixo na janela do console:
Eu sou uma mensagem do console
Eu sou uma mensagem de aviso do console
Eu sou uma mensagem de erro do console</code></pre><p><strong>Depois</strong></p><pre><code>// tslint.json
{
    "rules": {
        .......
        "no-console": [
             true,
             "log",    // console.log não é permitido
             "warn"    // console.warn não é permitido
        ]
   }
}

// ..component.ts

public ngOnInit (): void {
    console.log('Eu sou uma mensagem do console');
    console.warn('Eu sou uma mensagem de aviso do console');
    console.error('Eu sou uma mensagem de erro do console');
}

// Resultado - erros de lint para as instruções de console.log e console.warn, mas sem erro para console.error, já que não foi mencionado no config

Calls to 'console.log' are not allowed.
Calls to 'console.warn' are not allowed.</code></pre><h4 id="12-pequenos-componentes-reutiliz-veis"><strong>12) Pequenos componentes reutilizáveis</strong></h4><p>Extrai as partes que podem ser reutilizadas num componente e cria outro. Torna o componente tão "burro" quanto possível, visto que isso fará com que funcione em mais cenários. Tornar um componente "burro" quer dizer que o componente não tem nenhuma lógica em especial e opera puramente com base nos <em>inputs</em> e <em>outputs</em> que lhe forem fornecidos.</p><p>Como regra geral, o último descendente na árvore de componentes será o mais burro de todos.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Os componentes reutilizáveis reduzem a repetição de código, tornando-o assim mais fácil de gerir e de receber alterações.</p><p>Os componentes "burros" são mais simples e, por isso, têm menos probabilidade de terem erros. Os componentes "burros" fazem-te pensar mais sobre a API de componente pública e ajudam-te a detetar preocupações contraditórias.</p><h4 id="13-os-componentes-devem-lidar-apenas-com-l-gica-de-exibi-o"><strong>13) Os componentes devem lidar apenas com lógica de exibição</strong></h4><p>Evita ter qualquer outra lógica para além da lógica de exibição no teu componente sempre que puderes e faz com que o componente lide apenas com a lógica de exibição.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Os componentes são projetados para fins de exibição e controlam o que a vista deve fazer. Qualquer lógica empresarial deve ser extraída nos seus próprios métodos/serviços, onde for apropriado, separando a lógica empresarial da lógica de exibição.</p><p>A lógica empresarial é geralmente mais fácil de testar quando é extraída para um serviço. Ela pode ser reutilizada por quaisquer outros componentes que precisem da mesma lógica empresarial aplicada.</p><h4 id="14-evita-m-todos-longos"><strong>14) Evita métodos longos</strong></h4><p>Métodos longos geralmente indicam que estão a fazer muitas coisas. Tenta utilizar o Princípio de Responsabilidade Única. O método por si só pode estar a fazer uma coisa, mas, dentro dele, existem algumas operações que podem estar a acontecer. Podemos extrair esses métodos para o seu próprio método e fazer com que façam cada um uma coisa e utilizá-los.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Os métodos longos são difíceis de ler, compreender e manter. Também são susceptíveis a erros, visto que alterar uma coisa pode afetar diversas outras coisas nesse método. Também tornam a refatorização (que é uma coisa essencial em qualquer aplicação) difícil.</p><p>Isso é por vezes medido como "<a href="https://pt.wikipedia.org/wiki/Complexidade_ciclom%C3%A1tica">complexidade ciclomática</a>". Também existem algumas <a href="https://www.npmjs.com/package/tslint-sonarts" rel="noopener">regras do TSLint</a> para detetar complexidade ciclomática/cognitiva, que podes utilizar no teu projeto para evitar erros e detetar "<em>code smells</em>" e problemas de manutenção.</p><h4 id="15-dry-n-o-te-repitas-"><strong>15) DRY (Não te repitas)</strong></h4><p><em>Do not Repeat Yourself</em> (Não te repitas). Certifica-te de que não tens o mesmo código copiado para locais diferentes na base de código. Extrai o código repetido e utiliza isso em vez do código repetido.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ter o mesmo código em vários locais significa que, se quisermos fazer uma alteração à lógica nesse código, temos de fazê-la em vários locais. Isso torna-o difícil de gerir e também é susceptível a erros. Podemos falhar e não alterar em todas as ocorrências. É mais demorado realizar alterações à lógica e testar o código também é um processo demorado.</p><p>Nesses casos, extrai o código repetido e utiliza essa alternativa em vez disso. Isso quer dizer que existe apenas um local para alterar e uma coisa para testar. Ter menos código duplicado enviado para os utilizadores quer dizer que a aplicação será mais rápida.</p><h4 id="16-adicionar-mecanismos-de-cache"><strong>16) Adicionar mecanismos de cache</strong></h4><p>Ao realizar chamadas de API, as respostas delas não mudam com frequência. Nesses casos, podes adicionar um mecanismo de cache e armazenar o valor da API. Quando for realizado outro pedido à mesma API, verifica se existe um valor para ele na cache. Caso exista, utiliza-o. Caso contrário, realiza a chamada da API e coloca o resultado em cache.</p><p>Se os valores alterarem, mas não regularmente, podes introduzir uma cache de tempo onde podes verificar quando foi colocado algo em cache pela última vez e decidir se chamas ou não a API.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ter um mecanismo de cache significa evitar chamadas de API indesejadas. Ao realizar apenas as chamadas de API quando necessário e evitar código duplicado, a velocidade da aplicação melhora pois não temos de esperar pela rede. Também significa que não descarregamos a mesma informação vezes sem conta.</p><h4 id="17-evitar-l-gica-em-templates"><strong>17) Evitar lógica em <em>templates</em></strong></h4><p>Se tiveres qualquer tipo de lógica nos teus <em>templates</em>, mesmo que seja uma simples cláusula <code>&amp;&amp;</code>, é bom extraí-la para o seu próprio componente.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ter lógica no <em>template </em>significa que não é possível realizar testes unitários ao <em>template</em> e é, então, mais susceptível a erros quando alteramos o código do <em>template</em>.</p><p><strong>Antes</strong></p><pre><code>// template
&lt;p *ngIf="role==='developer'"&gt; Status: Developer &lt;/p&gt;

// component
public ngOnInit (): void {
    this.role = 'developer';
}</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">// template
&lt;p *ngIf="showDeveloperStatus"&gt; Status: Developer &lt;/p&gt;

// componente
public ngOnInit (): void {
    this.role = 'developer';
    this.showDeveloperStatus = true;
}</code></pre><h4 id="18-strings-devem-ser-seguras"><strong>18) Strings devem ser seguras</strong></h4><p>Se tiveres uma variável do tipo string que possa ter apenas um conjunto de valores, em vez de declará-la com o tipo string, podes declarar a lista de valores possíveis como o tipo.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Ao declarar o tipo da variável adequadamente, podemos evitar erros ao escrever o código durante a compilação em vez de durante a execução.</p><p><strong>Antes</strong></p><pre><code>private myStringValue: string;

if (itShouldHaveFirstValue) {
   myStringValue = 'First';
} else {
   myStringValue = 'Second'
}</code></pre><p><strong>Depois</strong></p><pre><code class="language-ts">private myStringValue: 'First' | 'Second';

if (itShouldHaveFirstValue) {
   myStringValue = 'First';
} else {
   myStringValue = 'Other'
}

// Isso gerará o erro abaixo
Type '"Other"' is not assignable to type '"First" | "Second"'
(property) AppComponent.myValue: "First" | "Second"</code></pre><h3 id="vis-o-geral"><strong>Visão geral</strong></h3><h4 id="gest-o-de-estado"><strong>Gestão de estado</strong></h4><p>Considera utilizar <a href="https://github.com/ngrx/platform" rel="noopener">@ngrx/store</a> para gerir o estado da tua aplicação e <a href="https://github.com/ngrx/effects" rel="noopener">@ngrx/effects</a> como modelo de efeito secundário para armazenamento. As alterações de estados são descritas pelas ações e as alterações são realizadas por funções puras chamadas <em>reducers</em>(redutores).</p><p><strong>Por quê<strong>?</strong></strong></p><p><em><em>@ngrx/store</em></em> isola toda a lógica relacionada com estados num só local e torna-a consistente ao longo da aplicação. Também tem um mecanismo de memorização ao aceder à informação armazenada, levando a uma aplicação com melhor desempenho. <em><em>@ngrx/store </em></em>combinado com a estratégia de deteção de alterações do Angular resulta numa aplicação mais rápida.</p><h4 id="estado-imut-vel"><strong>Estado imutável</strong></h4><p>Ao utilizar <em><em>@ngrx/store</em></em>, considera utilizar <a href="https://github.com/brandonroberts/ngrx-store-freeze" rel="noopener">ngrx-store-freeze</a> para tornar o estado imutável. <em><em>ngrx-store-freeze</em></em> impede que o estado seja alterado ao lançar uma excepção. Isso evita alterações acidentais do estado, o que leva a consequências indesejadas.</p><p><strong>Por quê<strong>?</strong></strong></p><p>Alterar o estado em componentes faz com que a aplicação se comporte de modo inconsistente com base na ordem de carregamento dos componentes. Quebra o modelo mental do padrão <em>redux</em>. As alterações podem acabar sobrepostas caso o estado de armazenamento altere e seja emitido novamente. Separa as responsabilidades/preocupações — componentes são camadas de vista, não devem saber como alterar o estado.</p><h4 id="jest"><strong>Jest</strong></h4><p>O <a href="https://jestjs.io/" rel="noopener">Jest</a> é uma <em>framework </em>de testes unitários da Facebook para JavaScript. Torna os testes unitários mais rápidos ao colocar em paralelo as execuções de testes ao longo da base de código. Com o seu modo de observação, são executados apenas os testes relacionados com as alterações, o que torna o ciclo de resposta para os testes muito mais curto. Ele<em><em> </em></em>também fornece cobertura de código dos testes e é suportado no VS Code e Webstorm.</p><p>Podias utilizar um <a href="https://github.com/thymikee/jest-preset-angular" rel="noopener">preset</a> (texto em inglês) para Jest que fará a maior parte do trabalho por ti quando estiveres a configurar a Jest no teu projeto.</p><h4 id="karma"><strong>Karma</strong></h4><p><a href="https://karma-runner.github.io/2.0/index.html" rel="noopener">Karma</a> é um executante de testes desenvolvido pela equipa do AngularJS. Este requer um <em>browser</em> real/DOM para executar os testes. Também pode ser executado em <em>browsers</em> diferentes. O Jest não precisa do Chrome headless/phantomjs para executar os testes e é executado em Node puro.</p><h4 id="universal"><strong>Universal</strong></h4><p>Se não tiveres tornado a tua aplicação numa aplicação <em><em>Universal</em></em>, agora é uma boa altura para fazê-lo. O <a href="https://angular.io/guide/universal" rel="noopener">Angular Universal</a> (link em inglês) permite-te executar a tua aplicação do Angular no servidor e faz renderização no lado do servidor (SSR), que serve páginas html estáticas pré-renderizadas. Isso torna a aplicação muito rápida, pois apresenta o conteúdo no ecrã quase instantaneamente, sem ter de esperar que os JS <em>bundles</em> carreguem e analisem, ou pela iniciação do Angular.</p><p>Também é bom em termos de SEO, visto que o Angular Universal gera conteúdo estático e torna mais fácil a indexação da aplicação por parte dos rastreadores da web e tornam a aplicação pesquisável sem executar JavaScript.</p><p><strong>Por quê<strong>?</strong></strong></p><p>O Universal melhora drasticamente o desempenho da tua aplicação. Atualizamos recentemente a nossa aplicação para realizar renderização do lado do servidor e o tempo de carregamento do site passou de vários segundos para dezenas de milésimos de segundo!</p><p>Também permite que o teu site apareça corretamente nos modelos de pré-visualização das redes sociais. O primeiro carregamento significativo é muito rápido e torna o conteúdo visível aos utilizadores sem quaisquer atrasos indesejados.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Criar aplicações é uma jornada constante e existe sempre espaço para melhorar coisas. Esta lista de optimizações é um bom local para começar, e aplicar de maneira consistente esses padrões fará a tua equipa feliz. Os teus utilizadores também vão adorar-te pela boa experiência na tua aplicação com menos problemas e com melhor desempenho.</p><p><em>Obrigada pela leitura<em>! </em>Se gostaste deste artigo<em>, </em>fica à vontade para partilhar e ajudar outras pessoas a encontrá-lo<em>. </em>Segue a autora no<em> </em></em><a href="https://medium.com/@vamsivempati"><em><em>Medium</em></em></a><em><em> o</em>u<em> </em></em><a href="https://twitter.com/_VamsiVempati_"><em><em>Twitter</em></em></a><em><em> </em>para ver mais artigos<em>. </em>Boa programação, pessoal<em>!</em></em> ☕️</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O derradeiro guia para principiantes sobre desenvolvimento de jogos em Unity ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu O Unity é uma ótima ferramenta para criar protótipos de tudo, desde jogos até visualizações interativas. Neste artigo, analisamos tudo o que precisas saber para começar a utilizar o Unity. Primeiro, um pouco sobre mim: sou um programador amador em Unity, modelador 3D e designer ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-derradeiro-guia-para-principiantes-sobre-desenvolvimento-de-jogos-em-unity/</link>
                <guid isPermaLink="false">658ed8ecc1446303e73c9756</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento de jogos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 22 May 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/5f9ca41d740569d1a4ca6043.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-ultimate-beginners-guide-to-game-development-in-unity-f9bfe972c2b5/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Ultimate Beginners Guide To Game Development In Unity</a>
      </p><blockquote>Tradução em português europeu</blockquote><p>O Unity é uma ótima ferramenta para criar protótipos de tudo, desde jogos até visualizações interativas. Neste artigo, analisamos tudo o que precisas saber para começar a utilizar o Unity.</p><p>Primeiro, um pouco sobre mim: sou um programador amador em Unity, modelador 3D e designer gráfico, que já trabalho com Unity e Blender há mais de 5 anos. Agora, sou aluno de Matemática Financeira na Universidade College Dublin e, ocasionalmente, faço design gráfico, protótipos para a web e protótipos de jogos como <em>freelance</em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/Q-bD3OdyDZX2X2cmqgyyRIFwRpy9mngdYAtC.png" class="kg-image" alt="Q-bD3OdyDZX2X2cmqgyyRIFwRpy9mngdYAtC" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/Q-bD3OdyDZX2X2cmqgyyRIFwRpy9mngdYAtC.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/Q-bD3OdyDZX2X2cmqgyyRIFwRpy9mngdYAtC.png 800w" sizes="(min-width: 720px) 720px" width="800" height="630" loading="lazy"><figcaption>Arte conceptual é uma das fases iniciais no processo de desenvolvimento de games. Nos últimos anos, tive muita exposição a todas as áreas do desenvolvimento de jogos. Consulta o meu <a href="http://hugodolan.com/portfolio" rel="noopener">portfólio</a> de gráficos, UX, arte conceptual, desenvolvimento de jogos e outros…</figcaption></figure><h3 id="introdu-o"><strong>Introdução</strong></h3><p>Este artigo é para aqueles que nunca utilizaram o Unity, mas que tenham alguma experiência em programação ou design/desenvolvimento para a web. No final deste artigo, deves ter uma boa compreensão geral do motor (em inglês, <em>engine</em>), assim como de todas as funções e código necessários para começar a criar um jogo básico.</p><h3 id="por-que-o-unity"><strong>Por que o Unity?</strong></h3><h4 id="se-quiseres-criar-jogos"><strong>Se quiseres criar jogos</strong></h4><p>Existem apenas algumas opções quando falamos de desenvolvimento de jogos independentes. As três escolhas principais, se quiseres desenvolver jogos, são o Unreal, o Unity ou o GameMaker.</p><p>O Unity é provavelmente a opção menos restritiva entre as 3 plataformas. Este fornece-te um produto muito cru logo à partida, mas é muito flexível, bem documentado e altamente extensível para criar basicamente qualquer género de jogo que possas imaginar.</p><p>Existem bastantes jogos muito bem-sucedidos, como o <em>Escape from Tarkov</em> (Atirador), <em>Monument Valley</em> (Puzzle) e o <em>This War of Mine</em> (Estratégia/Sobrevivência), todos criados com o Unity.</p><p>Na realidade, o motor em que crias o teu primeiro jogo provavelmente não é muito importante. Por isso, o meu conselho é que escolhas um e sigas com esse.</p><h4 id="se-quiseres-criar-prot-tipos-de-experi-ncias-de-utilizador"><strong>Se quiseres criar protótipos de experiências de utilizador</strong></h4><p>Visto que o Unity é apenas um motor com algumas físicas, animações e renderização 3D em tempo real, também é um ótimo espaço para criar protótipos completos e interativos para estudos de Experiências de Utilizador (UX – do inglês, <em>User Experience</em>).</p><p>O Unity tem suporte total para Realidade Virtual e Realidade Aumentada. Ele pode, então, ser uma ótima ferramenta para explorar arquitetura, automatizações e simulações com os clientes.</p><h3 id="sec-es-deste-artigo"><strong><strong><strong>Sec</strong></strong>ções<strong><strong> </strong></strong>deste artigo</strong></h3><ul><li><strong>Por que o<strong> Unity?</strong></strong></li><li><strong>Janela de edição do <strong>Unity</strong></strong></li><li><strong>Objetos de jogo do <strong>Unity</strong></strong></li><li><strong>Componentes incorporados do <strong>Unity</strong></strong></li><li><strong>Criar componentes personalizados</strong></li><li><strong>Estrutura de MonoComportamento</strong></li><li><strong>Manipular<strong> GameObjects</strong></strong></li><li><strong><strong>Raycasting</strong></strong></li><li><strong>Deteção de colisão</strong></li><li><strong>Características avançadas</strong></li><li><strong>Conselhos para iniciantes</strong></li><li><strong>Bons recursos e comunidades</strong></li><li><strong><strong>Conclusã</strong>o</strong></li></ul><h3 id="janela-de-edi-o-do-unity"><strong>Janela de edição do <strong><strong>Unity</strong></strong></strong></h3><p>A janela de edição é dividida em várias secções. Vamos abordar isto muito brevemente porque vamos referir esta janela constantemente ao longo deste artigo. Se já te sentires à vontade com isto, podes passar esta parte à frente!</p><p><strong>Vista da cena<strong>:</strong> </strong>permite a colocação e o movimento de GameObjects na cena</p><p><strong>Vista do jogo<strong>:</strong> </strong>permite visualizar como o jogador verá a cena a partir da câmara</p><p><strong><strong>Inspetor:</strong> </strong>fornece detalhes sobre o GameObject selecionado na cena</p><p><strong>Recursos<strong> </strong>e<strong> </strong>p<strong>rojet</strong>o<strong>:</strong> </strong>todos os pré-fabricados, texturas, modelos, scripts e outros estão armazenados aqui</p><p><strong><strong>Hierar</strong>quia<strong>:</strong> </strong>permite colocar e estruturar GameObjects dentro da cena</p><p>Agora, estamos prontos para começar!</p><h3 id="objetos-de-jogo-do-unity"><strong>Objetos de jogo do Unity</strong></h3><h4 id="o-que-s-o-os-gameobjects"><strong>O que são os GameObjects</strong></h4><p>Os GameObjects são o bloco de construção principal para tudo no motor de jogos Unity. O nome quase que revela tudo:</p><blockquote>Tudo o que colocares dentro de uma cena no Unity deve estar envolvida por um "game object" (objeto de jogo).</blockquote><p>Se tiveres experiência em design para a web, podes pensar em GameObjects muito como elementos &lt;div&gt;! Recipientes extremamente aborrecidos, mas altamente extensíveis, para criar funcionalidades ou visuais complexos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/vlXNfFyr4lsQgC-DL05daoOtSWT35ZFUcA1l.png" class="kg-image" alt="vlXNfFyr4lsQgC-DL05daoOtSWT35ZFUcA1l" width="432" height="446" loading="lazy"><figcaption>Tirei isto diretamente da janela de edição do Unity só para provar este ponto.</figcaption></figure><p>Praticamente tudo, desde efeitos de partículas, câmaras, jogadores, elementos de Interface de Utilizador, … (a lista continua) é um GameObject.</p><h4 id="criar-hierarquia"><strong>Criar hierarquia</strong></h4><p>Tal com uma &lt;div&gt; em desenvolvimento para a web, um GameObject também é um recipiente. Tal como colocas &lt;div&gt;s umas dentro de outras para criar layouts variados e desejáveis ou abstrações, podes querer fazer o mesmo com os objetos de jogo.</p><blockquote>A lógica por trás da colocação de game objects uns dentro de outros é muito parecida com o que é feito em desenvolvimento para a web, vou fornecer alguns exemplos…</blockquote><p><strong>Desorganização<strong> </strong>e<strong> </strong>e<strong>ficiê</strong>ncia</strong></p><blockquote><em><strong>Analogia com a w</strong><em><strong><strong>eb: </strong></strong></em>tens muitos elementos semelhantes que podem ser gerados dinamicamente em tempo real em resposta a interações de utilizadores e desejam manter as coisas organizadas<em>.</em></em></blockquote><blockquote><strong><em>Tradução do </em><strong><em><em>Unity: </em></em></strong></strong><em>estás a criar uma cópia do<em> Minecraft </em>e tens muitos blocos na cena<em>, </em>então precisas de adicionar e remover<em> </em>'pedaços'<em> </em>de blocos da cena por questões de desempenho<em>. </em>Então, faz sentido ter cada pedaço associado a um <em>GameObject</em> pai vazio<em>, </em>visto que remover o pedaço pai remove todos os blocos filhos<em>.</em></em></blockquote><p><strong>Posicionamento</strong></p><blockquote><em><strong>Analogia com a w</strong><em><strong><strong>eb: </strong></strong></em>queres manter a posição do conteúdo contido<em> </em>'<em>relativ</em>o'<em> </em>ao recipiente e não à página da web<em>.</em></em></blockquote><blockquote><em><strong>Tradução do </strong><em><strong><strong>Unity:</strong></strong> </em>criaste um conjunto de drones ajudantes que pairam à volta do jogador<em>. </em>Preferias claramente não escrever código para indicar aos drones para seguir o jogador. Então, em vez disso, instancias os drones como filhos do <em>game object</em> </em>do jogador<em><em>.</em></em></blockquote><h3 id="componentes-incorporados-do-unity"><strong>Componentes incorporados do Unity</strong></h3><h4 id="o-modelo-de-componente-do-ator"><strong>O Modelo de componente do ator</strong></h4><p>Os GameObjects por si só são bastante inúteis — tal como vimos, são praticamente apenas recipientes. De maneira a fornecer funcionalidade, temos de adicionar componentes, que são essencialmente scripts escritos em C# ou em Javascript.</p><p>O Unity funciona com base num modelo de componente de ator – simplificando, os GameObjects são os atores e os componentes são os teus scripts.</p><p>Se já tiveres alguma vez criado uma aplicação para a web, estarás à vontade com a ideia de criar pequenos componentes reutilizáveis, tais como botões, elementos de formulário, layouts flexíveis que têm várias diretrizes diferentes e propriedades personalizáveis. Depois, podes montar estes pequenos componentes em páginas da web maiores.</p><p>A grande vantagem dessa abordagem é o nível de reutilização e canais de comunicação claramente definidos entre elementos. Tal como em desenvolvimento de jogos, queremos minimizar o risco de efeitos secundários indesejados. Pequenos erros tendem a ficar fora do controlo se não tivermos cuidado e são extremamente difíceis de depurar. Por isso, criar componentes pequenos, robustos e reutilizáveis é crucial.</p><h4 id="componentes-chave-incorporados"><strong>Componentes chave incorporados</strong></h4><p>Acho que está na hora de mostrar alguns exemplos dos componentes incorporados fornecidos pelo motor de jogos Unity.</p><ul><li><strong><strong>MeshFilter: </strong></strong>permite-te atribuir materiais a uma malha (em inglês, <em>mesh</em>) 3D para um GameObject</li><li><strong><strong>MeshRender: </strong></strong>permite-te atribuir materiais a uma malha 3D</li><li><strong><strong>[Box | Mesh]Collider: </strong></strong>ativa a deteção do GameObject durante colisões</li><li><strong><strong>Rigidbody: </strong></strong>aciona uma simulação física realista para ser aplicada num GameObjects com malhas 3d e aciona eventos de deteção em colisões de caixas</li><li><strong><strong>Light: </strong></strong>ilumina partes da tua cena</li><li><strong><strong>Camera: </strong></strong>define a vista do jogador para ser anexada a um GameObject</li><li>Vários componentes de tela da Interface de Utilizador para exibir Interfaces Gráficas de Utilizador</li></ul><p>Existem muitos mais, mas estes são os principais que precisas conhecer. Uma dica é que podes aceder a todos os documentos através do manual do Unity e na referência de scripting <em>off-line</em>, onde quer que estejas:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/CNB5Rb4DWImRiHh04xThXYtZnojyCj5OJJ1f.png" class="kg-image" alt="CNB5Rb4DWImRiHh04xThXYtZnojyCj5OJJ1f" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/CNB5Rb4DWImRiHh04xThXYtZnojyCj5OJJ1f.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/CNB5Rb4DWImRiHh04xThXYtZnojyCj5OJJ1f.png 704w" width="704" height="196" loading="lazy"><figcaption>Apenas clica na secção <em>help</em>, os documentos por norma são bastante bons</figcaption></figure><h3 id="criar-componentes-personalizados"><strong>Criar componentes personalizados</strong></h3><p>Os componentes incorporados controlam primeiramente a física e o visual, mas, para realmente criar um jogo, vais precisar de aceitar inputs do utilizador e manipular esses componentes padrão assim como os próprios GameObjects.</p><blockquote>Para começar a criar componentes, vai até ao GameObject desejado &gt; Add Component (Adicionar componente) &gt; escreve o nome do teu novo componente na barra de pesquisa &gt; new script (novo script) (C#).</blockquote><p>Como recomendação geral, eu desaconselho utilizar Javascript no Unity. Não foi mantido atualizado com todas as coisas boas que vieram com o ES6 e a maioria das coisas mais avançadas depende de coisas em C# transferidas para Javascript… Por experiência própria, torna-se simplesmente numa solução alternativa gigantesca.</p><h3 id="estrutura-de-um-monocomportamento"><strong>Estrutura de um MonoComportamento</strong></h3><h4 id="fun-es-chave"><strong>Funções-chave</strong></h4><p>Todos os componentes herdam da classe do MonoComportamento. Ela inclui vários métodos predefinidos, principalmente:</p><ul><li><strong><strong>void Start()</strong></strong>, que é chamado quando um objeto que contém o script é instanciado na cena. Isso é útil sempre que queremos executar algum código de inicialização (por exemplo, definir o equipamento de um jogador após este ser colocado num jogo).</li><li><strong><strong>void Update()</strong></strong>, que é chamado a cada <em>frame</em>. É aqui que fica a parte do código que envolve o input do utilizador, atualizando várias propriedades como o movimento de um jogador na cena.</li></ul><h4 id="vari-veis-do-inspetor"><strong>Variáveis do inspetor</strong></h4><p>Por vezes, queremos tornar os componentes o mais flexíveis possível. Por exemplo, todas as armas podem ter um dano diferente, cadência de tiro, se tem visão etc. Embora todas as armas sejam essencialmente a mesma coisa, podemos querer ser capazes de criar rapidamente diferentes variedades no editor do Unity.</p><p>Outro exemplo onde podemos querer fazer isso é quando criamos um componente da Interface de Utilizador, que acompanha os movimentos do rato do utilizador e coloca o cursor na janela. Aqui, podemos querer controlar a sensibilidade dos movimentos do cursor (se o utilizador está a utilizar um joystick ou controlador x um rato de computador). Então, faria sentido ter essa variável fácil de alterar, tanto no modo de edição como durante o tempo de execução.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/ARiWcy5AEsVyRicp7demoZnzQR0MjPQnFzXJ.png" class="kg-image" alt="ARiWcy5AEsVyRicp7demoZnzQR0MjPQnFzXJ" width="598" height="232" loading="lazy"><figcaption>Variáveis na janela de inspeção pode ser alteradas a qualquer momento durante a execução ou no modo de edição. Observação: alterações feitas durante a execução não serão permanentes.</figcaption></figure><p>Podemos fazer isso facilmente ao declará-las como variáveis públicas no corpo do componente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/dMqFuop796E9p2Y4urYkJtsuM3Rh6oM07cIJ.png" class="kg-image" alt="dMqFuop796E9p2Y4urYkJtsuM3Rh6oM07cIJ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/dMqFuop796E9p2Y4urYkJtsuM3Rh6oM07cIJ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/dMqFuop796E9p2Y4urYkJtsuM3Rh6oM07cIJ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="475" loading="lazy"><figcaption>Observa como podemos fazer com que as variáveis tenham diferentes níveis de acesso. Privadas, públicas, ou públicas mas não visíveis na janela de inspeção.</figcaption></figure><h4 id="aceitar-inputs-de-utilizador"><strong>Aceitar inputs de utilizador</strong></h4><p>Como é óbvio, queremos que o nosso jogo responda a inputs de utilizador. Uma das maneiras mais comuns de se fazer isso é utilizar os seguintes métodos na função Update() de um componente (ou noutro local que queiras):</p><ul><li>Input.GetKey(KeyCode.W): retorna verdadeiro quando a tecla W está a ser pressionada</li><li>Input.GetKeyDown(KeyCode.W): retorna verdadeiro quando a tecla W é pressionada pela primeira vez</li><li>Input.GetAxis("Vertical"), Input.GetAxis("Horizontal") Retorna entre -1,1 a partir do movimento de input do rato</li></ul><h3 id="manipular-gameobjects"><strong>Manipular GameObjects</strong></h3><p>Assim que recebermos inputs do utilizador, vamos querer que os GameObjects na nossa cena respondam. Existem vários tipos de respostas que podemos considerar:</p><ul><li>Translação, rotação, escala</li><li>Criar GameObjects</li><li>Enviar mensagens a GameObjects/componentes existentes</li></ul><h4 id="transforma-es"><strong>Transformações</strong></h4><p>Todos os GameObjects têm uma propriedade <em>transform</em>, que permite que várias manipulações úteis sejam realizadas no <em>game object</em> atual.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/cqutjhXkSZxKNCywMSjGbxewqeDo5GCp0R-d.png" class="kg-image" alt="cqutjhXkSZxKNCywMSjGbxewqeDo5GCp0R-d" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/cqutjhXkSZxKNCywMSjGbxewqeDo5GCp0R-d.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/cqutjhXkSZxKNCywMSjGbxewqeDo5GCp0R-d.png 800w" sizes="(min-width: 720px) 720px" width="800" height="226" loading="lazy"></figure><p>Os métodos são bastante auto-explicativos, basta observar que utilizamos &nbsp;<em><em>gameObject</em></em> em minúsculas para nos referirmos ao GameObject que detém essa instância em específico do componente.</p><p>Por norma, é boa prática utilizar <em><em>local[Position,Rotation] </em></em>em vez da posição/rotação global de um objeto. Isso, geralmente, torna mais fácil mover objetos num modo que faça sentido, pois o eixo do espaço local estará orientado e centrado no objeto pai e não na origem do mundo e direções x, y e z.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/sgr4nHfYLQYqjEEPSxlxPA0BhCrNjgzzvOmW.png" class="kg-image" alt="sgr4nHfYLQYqjEEPSxlxPA0BhCrNjgzzvOmW" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/sgr4nHfYLQYqjEEPSxlxPA0BhCrNjgzzvOmW.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/sgr4nHfYLQYqjEEPSxlxPA0BhCrNjgzzvOmW.png 800w" sizes="(min-width: 720px) 720px" width="800" height="482" loading="lazy"><figcaption>Os benefícios do espaço local ficam um pouco mais óbvios com um diagrama!</figcaption></figure><p>Caso precises de fazer a conversão entre espaço local ou global (que é geralmente o caso), podes utilizar o seguinte:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/vNEw9xUc-B2vZOaeAqXcQn5W-lxfmJbLiEZw.png" class="kg-image" alt="vNEw9xUc-B2vZOaeAqXcQn5W-lxfmJbLiEZw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/vNEw9xUc-B2vZOaeAqXcQn5W-lxfmJbLiEZw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/vNEw9xUc-B2vZOaeAqXcQn5W-lxfmJbLiEZw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="145" loading="lazy"></figure><p>Como podes imaginar, existe alguma álgebra linear bastante simples atrás disso, indicada pelo 'Inverse' no nome do método.</p><h4 id="criar-gameobjects"><strong>Criar GameObjects</strong></h4><p>Visto que os GameObjects são basicamente tudo na tua cena, podes querer ser capaz de gerá-los na hora. Por exemplo, se o teu jogador tiver um género de um lançador de projéteis, podes querer ser capaz de criar projéteis na hora, que vão ter a sua própria lógica encapsulada para voar, efetuar dano etc…</p><p>Primeiro, precisamos de introduzir a noção de um<em><em> Prefab</em></em>. Podemos criar esses ao arrastar qualquer GameObject na hierarquia da cena para a pasta dos assets.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/BEBGqpePGsVgtEY5y89WrnLAbdZjPHZiagjZ.png" class="kg-image" alt="BEBGqpePGsVgtEY5y89WrnLAbdZjPHZiagjZ" width="164" height="150" loading="lazy"><figcaption>O aspeto de um prefab no separador dos assets</figcaption></figure><p>Isso, basicamente, armazena um <em>template</em> do objeto que tínhamos na cena, com todas as mesmas configurações.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/wFLWTKOYgxfMEAEzUjgMsTCETSmTA3JIPLGp.png" class="kg-image" alt="wFLWTKOYgxfMEAEzUjgMsTCETSmTA3JIPLGp" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/wFLWTKOYgxfMEAEzUjgMsTCETSmTA3JIPLGp.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/wFLWTKOYgxfMEAEzUjgMsTCETSmTA3JIPLGp.png 800w" sizes="(min-width: 720px) 720px" width="800" height="293" loading="lazy"><figcaption>Um exemplo de um objeto de tijolo personalizado, que é utilizado para gerar dinamicamente tijolos de Lego numa cena. Tem um conjunto de componentes anexados a ele com vários valores predefinidos.</figcaption></figure><p>Assim que tivermos estes componentes <em>prefab,</em> podemos atribuí-los a variáveis de inspeção (como abordamos anteriormente) em qualquer componente na cena. Então, podemos criar GameObjects como especificado pelo <em>prefab</em> a qualquer altura.</p><p>Podemos realizar 'Instanciação' do <em>prefab</em> e manipulá-lo para a localização desejada na cena e estabelecer as relações hierárquicas necessárias.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/xAzUlbgEAIkyS8bsX8W0xlVI0YiSTiVyMljj.png" class="kg-image" alt="xAzUlbgEAIkyS8bsX8W0xlVI0YiSTiVyMljj" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/xAzUlbgEAIkyS8bsX8W0xlVI0YiSTiVyMljj.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/xAzUlbgEAIkyS8bsX8W0xlVI0YiSTiVyMljj.png 800w" sizes="(min-width: 720px) 720px" width="800" height="286" loading="lazy"></figure><h3 id="aceder-a-outros-gameobjects-e-componentes"><strong>Aceder a outros GameObjects e componentes</strong></h3><p>Por vezes, precisamos de comunicar com outros GameObjects assim como os seus componentes associados. Assim que tiveres uma referência a um <em>game object</em>, isso fica muito simples.</p><blockquote>ComponentName comp = some_game_object.GetComponent&lt;ComponentName&gt;();</blockquote><p>Depois disso, podes aceder a quaisquer métodos/variáveis públicos do componente de maneira a manipular o GameObject. Essa é a parte mais direta, no entanto. Obter realmente a referência para o GameObject pode ser feito de várias formas diferentes…</p><h4 id="aceder-atrav-s-de-vari-vel-de-inspe-o"><strong>Aceder através de variável de inspeção</strong></h4><p>Esta é a maneira mais direta. Cria simplesmente uma variável pública para o GameObject, tal como demonstramos anteriormente com os prefabs, e arrasta-a manualmente para o componente através do inspetor. De seguida, acede à variável tal como acima.</p><h4 id="aceder-atrav-s-de-tags"><strong>Aceder através de tags</strong></h4><p>Podemos atribuir tags a GameObjects ou prefabs através do inspetor e depois utilizar as funções <em>find</em> do game object para localizar as referências para eles.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/9Ur13zYuVV3r17CGo9hDMnyCoG44jTXCwv4g.png" class="kg-image" alt="9Ur13zYuVV3r17CGo9hDMnyCoG44jTXCwv4g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/9Ur13zYuVV3r17CGo9hDMnyCoG44jTXCwv4g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/9Ur13zYuVV3r17CGo9hDMnyCoG44jTXCwv4g.png 628w" width="628" height="166" loading="lazy"></figure><p>Isso é simplesmente feito como abaixo.</p><blockquote>GameObject some_game_object = GameObject.FindGameObjectWithTag(“Brick”);</blockquote><h4 id="aceder-atrav-s-do-atributo-transform"><strong>Aceder através do atributo <em>transform</em></strong></h4><p>Se quisermos aceder a componentes em algum objeto pai, podemos simplesmente fazer isto através do atributo <em>transform</em>.</p><blockquote>ComponentName comp = gameObject.transform.parent.GetComponent&lt;ComponentName&gt;();</blockquote><h4 id="aceder-atrav-s-de-fun-es-sendmessage"><strong>Aceder através de funções SendMessage</strong></h4><p>Como alternativa, se quisermos enviar uma mensagem a muitos outros componentes ou desejarmos enviar uma mensagem a um objeto que está bastante acima na hierarquia, podemos utilizar as funções de envio de mensagem, que aceitam o nome da função, seguido pelos argumentos.</p><blockquote>gameObject.SendMessage("MethodName",params); // Mensagem de Broadcast</blockquote><blockquote>gameObject.SendMessageUpwards("MethodName", params); // Apenas recebido por componentes que estão hierarquicamente acima.</blockquote><h3 id="raycasting"><strong><em>Raycasting</em></strong></h3><p>Podes ter ouvido falar disso antes, quando as pessoas comparam jogos de FPS que são 'baseados em físicas' ou 'baseados em raios'. <em>Raycasting</em> é essencialmente como ter um laser que, quando entra em contacto com um 'collider' ou 'rigidbody', retorna um 'hit' e passa de volta os detalhes do objeto.</p><p>Existem dois cenários onde isto é útil (existem provavelmente muitos mais):</p><ol><li>Se estivesses a desenhar um sistema de armas para um jogo, poderias utilizar <em>raycasting</em> para detetar a colisão e até mesmo personalizar o comprimento do raio de modo a que as armas corpo-a-corpo 'atinjam' apenas a curtas distâncias.</li><li>Criar um raio desde o ponteiro do rato até um ponto num espaço 3D, ou seja, se desejares que o utilizador seja capaz de selecionar unidades com o seu rato num jogo de estratégia.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/GcxZnE2hbosbWwoDp94ecEd1g8aVlwrFKOhB.png" class="kg-image" alt="GcxZnE2hbosbWwoDp94ecEd1g8aVlwrFKOhB" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/GcxZnE2hbosbWwoDp94ecEd1g8aVlwrFKOhB.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/GcxZnE2hbosbWwoDp94ecEd1g8aVlwrFKOhB.png 800w" sizes="(min-width: 720px) 720px" width="800" height="453" loading="lazy"><figcaption>Exemplo 2 detalhado acima</figcaption></figure><p>Como podes ver, o código para isso é um pouco mais complicado. A coisa principal a compreender é que, para criar um raio para onde o rato está a apontar num espaço 3D, é necessária a transformação ScreenPointToRay. A razão para isso é que a câmara está a renderizar um espaço 3D como uma janela 2D no ecrã do teu computador. Então, existe naturalmente uma projeção envolvida para transferir de volta para 3D.</p><h3 id="dete-o-de-colis-o"><strong>Deteção de colisão</strong></h3><p>Anteriormente, mencionamos os componentes <em>Collider</em> e <em>Rigidbody,</em> que podem ser adicionados a um objeto. A regra para colisões é que um objeto na colisão deve ter um <em>rigidbody</em> e o outro deve ter um <em>collider</em> (ou ambos terem os dois componentes). Repara que, ao utilizar <em>raycasting</em>, os raios vão interagir apenas com objetos com componentes <em>collider</em> anexados.</p><p>Assim que fizermos a configuração dentro de qualquer componente personalizado anexado ao objeto, podemos utilizar os métodos OnCollisionEnter, OnCollisionStay e OnCollisionExit para responder a colisões. Assim que tivermos a informação de colisão, podemos obter o GameObject responsável e utilizar o que aprendemos anteriormente para interagir também com componentes anexados a ele.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/ppKZgvdAjKDqbW80Nin2wG9izk08UjyuaqAt.png" class="kg-image" alt="ppKZgvdAjKDqbW80Nin2wG9izk08UjyuaqAt" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/ppKZgvdAjKDqbW80Nin2wG9izk08UjyuaqAt.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/ppKZgvdAjKDqbW80Nin2wG9izk08UjyuaqAt.png 776w" sizes="(min-width: 720px) 720px" width="776" height="134" loading="lazy"></figure><p>Uma coisa a ter em conta é que os <em>rigid-bodies</em> fornecem físicas como gravidade aos objetos. Então, se desejares desligar isto, vais precisar de marcar o <em><em>is_kinematic</em></em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/I9UU3oy-UoVWOwjhXUy9PRiGDT5eFO4O9-IB.png" class="kg-image" alt="I9UU3oy-UoVWOwjhXUy9PRiGDT5eFO4O9-IB" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/I9UU3oy-UoVWOwjhXUy9PRiGDT5eFO4O9-IB.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/I9UU3oy-UoVWOwjhXUy9PRiGDT5eFO4O9-IB.png 606w" width="606" height="338" loading="lazy"><figcaption>Marca a caixa <em>is kinematic</em> para desativar físicas não desejadas mas manter uma boa deteção de colisão.</figcaption></figure><h3 id="caracter-sticas-avan-adas"><strong>Características avançadas</strong></h3><p>Não vamos abordar nada disto para já, mas talvez num artigo futuro — isso é apenas para ficares a par da sua existência.</p><h4 id="criar-interfaces-gr-ficas-de-utilizador-gui-"><strong>Criar interfaces gráficas de utilizador (GUI)</strong></h4><p>O Unity tem um motor de UI completo para definir a GUI do teu jogo. Por norma, esses componentes funcionam de maneira muito semelhante ao resto do motor.</p><h4 id="estender-o-editor-do-unity"><strong>Estender o editor do Unity</strong></h4><p>O Unity permite-te adicionar botões personalizados aos teus inspetores para que possas afetar o mundo no modo de edição. Por exemplo, para ajudar com a construção do mundo, podes desenvolver uma janela personalizada de ferramentas para criar casas modulares.</p><h4 id="anima-o"><strong>Animação</strong></h4><p>O Unity tem um sistema de animação baseado em gráficos que te permite juntar e controlar animações em vários objetos, tais como jogadores a implementar um sistema de animação com base nos ossos.</p><h4 id="materiais-e-pbr"><strong>Materiais e PBR</strong></h4><p>O Unity funciona num motor de renderização com base em físicas que permite ter luzes em tempo real e materiais realistas. A realidade é que vais aprender primeiro modelação 3D ou vais utilizar modelos já feitos e otimizados por alguém, de modo a criares algo que realmente tenha bom aspeto.</p><h3 id="dicas-para-principiantes"><strong>Dicas para principiantes</strong></h3><p>Se estiveres a planear criar o teu primeiro jogo, não subestimes a complexidade e o tempo que leva a escrever até o mais trivial dos jogos. Lembra-te que a maior parte dos jogos lançados na Steam têm equipas a trabalhar neles durante anos a tempo inteiro!</p><p>Escolhe um conceito simples e divide-o em pequenos objetivos alcançáveis. É altamente recomendado dividir o teu jogo em tantos componentes independentes quanto possível, pois é muito menos provável encontrares erros se mantiveres os componentes simples em vez de blocos de código monolíticos.</p><p>Antes de avançares para a escrita de qualquer código para qualquer parte do teu jogo, pesquisa o que outras pessoas fizeram antes para resolver o mesmo problema — é provável que tenham uma solução bastante mais otimizada.</p><h3 id="bons-recursos-e-comunidades"><strong>Bons recursos e comunidades</strong></h3><p>O desenvolvimento de jogos tem uma das melhores comunidades de todas. Existem muitos profissionais altamente habilitados na indústria, que fornecem conteúdo gratuitamente ou por quase nada. É uma área que requer modeladores 3D, artistas conceptuais, designers de jogos, programadores e assim adiante. Abaixo, coloquei os links para alguns recursos gerais ótimos (em inglês) que encontrei para cada um desses campos:</p><p><strong>Arte Conceptual</strong></p><ul><li><a href="https://www.youtube.com/channel/UCbdyjrrJAjDIACjCsjAGFAA" rel="noopener">Feng Zhu Design School</a> (mais de 90 horas de tutoriais de arte conceptual)</li><li><a href="https://www.youtube.com/channel/UCm9pCim4dDN4KJZUILGizgA" rel="noopener">Tyler Edlin Art</a> (ótima comunidade de arte BST com feedback de profissionais em desafios mensais)</li><li><a href="https://www.youtube.com/channel/UCyGGrJ-wQlvcWujLKHzB42w" rel="noopener">Art Cafe</a> (entrevistas e <em>workshops</em> com artistas conceptuais famosos)</li><li><a href="https://www.youtube.com/channel/UCmRm1xtLIpBhuWjTyD411pA" rel="noopener">Trent Kaniuga</a> (ilustrador e artista 2D que também está a criar o seu próprio jogo)</li></ul><p><strong>Modelação <strong>3D</strong></strong></p><ul><li><a href="https://cgcookie.com/course/mesh-modeling-bootcamp/?utm_source=youtube&amp;utm_medium=social&amp;utm_campaign=course&amp;utm_term=description&amp;utm_content=modeling-bootcamp-lessons" rel="noopener">CG Cookie</a> (melhores princípios básicos de malhas 3D no Blender – eles têm muitos outros excelentes conteúdos para o Blender)</li><li><a href="https://www.youtube.com/channel/UCDmOobbSOonY66M6fsJO7GQ" rel="noopener">Tor Frick</a> (modeladores de <em>Hard Surface</em> e escultores no Blender)</li><li><a href="https://www.youtube.com/channel/UCVA3cYOgsTN4hs3v7pjne7w" rel="noopener">Gleb Alexandrov</a> (pequenos tutoriais potentes sobre renderização no Blender)</li></ul><p><strong><strong>Des</strong>envolvimento de jogos</strong></p><ul><li><a href="https://www.youtube.com/watch?v=juJikoClDxw&amp;list=PLIhLvue17Sd7riA8vb8h1kP3jCFS_qtTM" rel="noopener">DoubleFine Amnesia Fortnight</a> (programadores de jogos que fazem maratonas de duas semanas a programar e gravam todo o seu processo de design)</li><li><a href="https://www.youtube.com/channel/UCqJ-Xo29CKyLTjn6z2XwYAw" rel="noopener">GameMakers Toolkit</a> (examina princípios de design de jogos)</li></ul><p><strong>Programação</strong></p><ul><li><a href="https://www.youtube.com/channel/UCaTznQhurW5AaiYPbhEA-KA" rel="noopener">Série Handmade Hero no canal Molly Rocket</a> (como criar um jogo e motor a partir do zero em C)</li><li><a href="https://www.youtube.com/channel/UCCuoqzrsHlwv1YyPKLuMDUQ" rel="noopener">Jonathan Blow</a> (programador independente que faz <em>livestreams</em> do seu desenvolvimento de jogos)</li><li><a href="https://www.youtube.com/channel/UCYbK_tjZ2OrIZFBvU6CCMiA" rel="noopener">Brackeys</a> (bons tutoriais de Unity)</li></ul><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Espero que tenhas gostado deste tutorial! Também faço um pouco de design gráfico, assim como protótipos de jogos e Interfaces de Utilizador. </p><p>Se o tutorial foi do teu agrado, dá uma vista de olhos ao <strong><a href="https://hugodolandesigns.portfoliobox.net/"></a><a href="https://hugodolandesigns.portfoliobox.net/">p<strong>ortf</strong>ó<strong>li</strong>o</a> do autor</strong>! Ele também está presente no<strong><strong> </strong><a href="https://www.linkedin.com/in/hugo-dolan-62971a174/">L<strong>inke</strong>dI<strong>n</strong></a></strong>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como aprender design e arquitetura de software – um guia ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu > Este artigo é um resumo do que estou a escrever no meu projeto mais recente,  solidbook.io - The Handbook to Software Design and Architecture with TypeScript [https://solidbook.io/] (link em inglês). Dá uma vista de olhos por lá se gostares desta publicação. É uma ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-aprender-design-e-arquitetura-de-software-um-guia/</link>
                <guid isPermaLink="false">655f0a8b13a65603e6501c42</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento de Software ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Tue, 21 May 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/banner-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/software-design/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Learn Software Design and Architecture - a Roadmap</a>
      </p><blockquote>Tradução em português europeu</blockquote><blockquote><em>Este artigo é um resumo do que estou a escrever no meu projeto mais recente<em>, </em></em><a href="https://solidbook.io/"><em><em>solidbook.io - The Handbook to Software Design and Architecture with TypeScript</em></em></a><em> (</em>link em inglês<em>)<em>. </em>Dá uma vista de olhos por lá se gostares desta publicação<em>.</em></em></blockquote><p>É uma loucura para mim considerar o facto do Facebook ter sido em tempos um ficheiro de texto vazio no computador de alguém. 🤣</p><p>Neste último ano, tenho-me esforçado muito em design e arquitetura de software, <a href="https://khalilstemmler.com/articles/domain-driven-design-intro/">Design Orientado a Domínio</a> (link em inglês) e a <a href="https://solidbook.io/">escrever um livro</a> sobre isso, e queria tirar um tempo para tentar juntar as peças todas em algo útil que pudesse partilhar com a comunidade.</p><p>Aqui está o meu roteiro para como aprender design e arquitetura de software.</p><p>Dividi-o em duas partes: o <em>stack </em>(pilha) e o <em>map </em>(mapa).</p><h2 id="o-stack"><strong>O <em>stack</em></strong></h2><p>De modo semelhante ao <a href="https://pt.wikipedia.org/wiki/Modelo_OSI">modelo OSI</a> em redes, cada camada é construída sobre a base da camada anterior.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/e727h5b9nozcuo4za2yw.png" class="kg-image" alt="e727h5b9nozcuo4za2yw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/e727h5b9nozcuo4za2yw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/e727h5b9nozcuo4za2yw.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/e727h5b9nozcuo4za2yw.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/e727h5b9nozcuo4za2yw.png 2130w" sizes="(min-width: 720px) 720px" width="2130" height="1844" loading="lazy"></figure><h2 id="o-map"><strong>O <em>map</em></strong></h2><p>Embora eu ache que a pilha é boa para ver o panorama geral de como tudo funciona em conjunto, o mapa é um pouco mais detalhado (e inspirado pelo <a href="https://github.com/kamranahmedse/developer-roadmap">roteiro do programador web</a> – link em inglês) e, como resultado, penso que seja mais útil.</p><p>Aqui está ele! Para <a href="https://khalilstemmler.com/articles/software-design-architecture/full-stack-software-design/">duplicar o repositório, ler a minha redação detalhada e fazer o download em alta resolução, clica aqui</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56.png" class="kg-image" alt="65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w2400/2024/05/65834517-bb39f980-e2a9-11e9-8a75-0e1559c5ed56.png 2400w" sizes="(min-width: 720px) 720px" width="2000" height="7869" loading="lazy"></figure><blockquote>Nota da tradução: houve uma revisão do conteúdo em março deste ano. Caso deseje acessar o conteúdo mais recente (em inglês) acesse <a href="https://khalilstemmler.com/articles/software-design-architecture/full-stack-software-design/">aqui</a>.</blockquote><h2 id="fase-1-c-digo-limpo"><strong>Fase 1: código limpo</strong></h2><p>O primeiro passo em direção à criação de software duradouro é descobrir como escrever <strong>código limpo</strong>.</p><p>Código limpo é código que é fácil de compreender e alterar. Logo no início, isto manifesta-se em algumas escolhas de design como:</p><ul><li>Ser consistente</li><li>Dar preferência a nomes significativos de variáveis, métodos e classes em vez de explicar em comentários</li><li>Garantir que o código está corretamente indentado e espaçado</li><li>Garantir que todos os testes possam ser executados</li><li>Escrever funções puras sem efeitos secundários</li><li>Não passar nulos</li></ul><p>Escrever código limpo é incrivelmente importante</p><p>Pensa nisso como se fosse o jogo do Jenga.</p><p>De modo a manter a estrutura do nosso projeto estável ao longo do tempo, coisas como indentação, pequenas classes e métodos, e nomes significativos, compensam bastante a longo termo.</p><p>O melhor recurso para aprender como escrever código limpo é livro de <em>Uncle Bob</em>, "<a href="https://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Código Limpo</a>" (link em inglês).</p><h2 id="fase-2-paradigmas-de-programa-o"><strong>Fase 2: paradigmas de programação</strong></h2><p>Agora que estamos a escrever código legível que é fácil de fazer a manutenção, seria uma boa ideia compreender realmente os 3 maiores paradigmas da programação e a maneira como influenciam o nosso modo de escrever código.</p><p>No livro de <em>Uncle Bob</em>, "<a href="https://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=asc_df_0132350882/?tag=googleshopc0c-20&amp;linkCode=df0&amp;hvadid=292982483438&amp;hvpos=1o2&amp;hvnetw=g&amp;hvrand=13521899336201370454&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9000834&amp;hvtargid=pla-435472505264&amp;psc=1">Arquitetura Limpa</a>" (link em inglês), ele destaca que:</p><ul><li>Programação Orientada a Objetos é a ferramenta mais adequada para definir como passamos limites arquitetónicos com polimorfismo e plugins</li><li>Programação funcional é a ferramenta que utilizamos para enviar dados para os limites das nossas aplicações</li><li>E programação estruturada é a ferramenta que utilizamos para escrever algoritmos</li></ul><p>Isso implica que o software eficiente utiliza uma mistura de todos estes 3 estilos de paradigmas de programação em alturas diferentes.</p><p>Embora <em>possas</em> adotar uma abordagem estritamente funcional ou estritamente orientada a objetos para escrever código, compreender onde cada um deles se destaca melhorará a qualidade dos teus designs.</p><blockquote><em>Se tudo o que tiveres for um martelo<em>, </em>tudo se parece com um prego<em>.</em></em></blockquote><h3 id="recursos"><strong>Recursos</strong></h3><p>Para <strong>programação</strong> <strong><strong>funcional</strong></strong>, dá uma vista de olhos:</p><ul><li><a href="https://mostly-adequate.gitbooks.io/mostly-adequate-guide/">Guia Maioritariamente Adequado do Professor Frisby para Programação Funcional</a> (link em inglês)</li><li><a href="https://pragprog.com/book/swdddf/domain-modeling-made-functional?fbclid=IwAR0NHoyVrMoSRIE-EJMUOdsb3bhivow6JXKyUeg4FPHE8QmeOQG4L77HzMo">Modelação de Domínio Tornada Funcional</a> (link em inglês)</li></ul><h2 id="fase-3-programa-o-orientada-a-objetos"><strong>Fase 3: programação orientada a objetos</strong></h2><p>É importante saber como cada um dos paradigmas funciona e como te incentivam a estruturar o código dentro deles, mas no que diz respeito à arquitetura, Programação Orientada a Objetos é claramente a <em>ferramenta ideal para o trabalho</em>.</p><p>A programação Orientada a Objetos não só nos permite criar uma <strong>arquitetura de</strong> <strong><strong>plugin</strong></strong> e criar flexibilidade nos nossos projetos; Programação Orientada a Objetos vem com 4 princípios de Programação Orientada a Objetos (encapsulamento, herança, polimorfismo e abstração) que nos ajudam a criar <strong>modelos de domínio ricos</strong>.</p><p>A maior parte dos programadores a aprender Programação Orientada a Objetos nunca chega a essa parte: aprender como criar uma <strong>implementação de software para o domínio do problema</strong>, e localizá-la no centro de uma aplicação web <strong>com</strong> <strong>camadas</strong>.</p><p>Programação funcional pode parecer a solução para todos os problemas nesse cenário, mas eu recomendo familiarizar-te com o design orientado a modelos e <a href="https://khalilstemmler.com/articles/domain-driven-design-intro/">Design Orientado a Domínio</a> para compreender o panorama de como os modeladores de objetos são capazes de encapsular um negócio completo com um modelo de domínio com zero dependências.</p><blockquote><em>Por que é que isso é importante<em>?</em></em></blockquote><p>É muito importante porque, se podes criar um modelo mental de um negócio, podes criar uma implementação de software desse negócio.</p><h2 id="fase-4-princ-pios-de-design"><strong>Fase 4: princípios de design</strong></h2><p>Neste momento, a tua compreensão de que a Programação Orientada a Objetos é muito útil para encapsular modelos de domínio ricos e para resolver o <a href="https://khalilstemmler.com/wiki/3-categories-of-hard-software-problems/">terceiro tipo de "Problemas de Software Difíceis"– Domínios Complexos</a> (link em inglês).</p><p>No entanto, a Programação Orientada a Objetos pode introduzir alguns desafios de design.</p><p>Onde devo utilizar composição?</p><p>Quando devo utilizar herança?</p><p>Quando devo utilizar uma classe abstrata?</p><p>Princípios de design são boas práticas muito bem estabelecidas e testadas que podes utilizar como segurança.</p><p>Alguns exemplos de princípios de design comuns com que te deves familiarizar são:</p><ul><li>Composição sobre herança</li><li>Encapsular o que varia</li><li>Programar contra abstrações, não concreções</li><li>O princípio de <em>Hollywood</em>: "Não nos chames, nós chamamos-te"</li><li>Os <a href="https://khalilstemmler.com/articles/solid-principles/solid-typescript/">princípios SOLID</a>, especialmente o <a href="https://khalilstemmler.com/articles/solid-principles/single-responsibility/">princípio de responsabilidade singular</a></li><li>DRY (Do Not Repeat Yourself – Não te Repitas, em português)</li><li><a href="https://khalilstemmler.com/wiki/yagni/">YAGNI (You Aren't Gonna Need It, Não Vais Precisar Disso, em português)</a></li></ul><p>Certifica-te de que alcanças as <em>tuas</em> próprias conclusões, no entanto. Não te limites a seguir o que outra pessoa diga que deves fazer. Certifica-te que faz sentido para ti.</p><h2 id="fase-5-padr-es-de-design"><strong>Fase 5: padrões de design</strong></h2><p>Praticamente todos os problemas de software já foram categorizados e resolvidos em algum momento. Chamamos a esses padrões: padrões de design, na verdade.</p><p>Existem 3 categorias de padrões de design: <strong>criativo</strong>, <strong>estrutural</strong> e <strong>comportamental</strong>.</p><h3 id="criativo"><strong>Criativo</strong></h3><p>Padrões criativos são padrões que controlam como os objetos são criados.</p><p>Exemplos de padrões criativos incluem:</p><ul><li>O <strong>padrão</strong> <strong><strong>Singleton</strong></strong>, para garantir que existe uma única instância de uma classe.</li><li>O <strong>padrão</strong> <strong><strong>Abstract Factory</strong></strong>, para criar uma instância de várias famílias de classes.</li><li>O <strong>padrão</strong> <strong><strong>Prototype</strong></strong>, para começar com uma instância que é clonada a partir de uma já existente.</li></ul><h3 id="estrutural"><strong>Estrutural</strong></h3><p>Padrões estruturais que simplificam como definimos relações entre componentes.</p><p>Exemplos de padrões de design estruturais incluem:</p><ul><li>O <strong>padrão</strong> <strong><strong>Adapter</strong></strong>, para criar uma interface para acionar classes que normalmente não funcionam em conjunto, para funcionarem em conjunto.</li><li>O <strong>padrão</strong> <strong><strong>Bridge</strong></strong>, para dividir uma classe que deve ser um ou mais, num conjunto de classes que pertencem a uma hierarquia, permitindo que as implementações sejam desenvolvidas de forma independente umas das outras.</li><li>O <strong>padrão</strong> <strong><strong>Decorator</strong></strong>, para adicionar responsabilidades a objetos dinamicamente.</li></ul><h3 id="comportamental"><strong>Comportamental</strong></h3><p>Padrões comportamentais são padrões comuns para facilitar comunicações elegantes entre objetos.</p><p>Exemplos de padrões comportamentais são:</p><ul><li>O <strong>padrão</strong> <strong><strong>Template</strong></strong>, para diferir os passos exatos de um algoritmo para uma subclasse.</li><li>O <strong>padrão</strong> <strong><strong>Mediator</strong></strong>, para definir os canais de comunicação exatos permitidos entre classes.</li><li>O <strong>padrão</strong> <strong><strong>Observer</strong></strong>, para habilitar classes para descrever algo de interesse e para notificar quando ocorrer uma alteração.</li></ul><h3 id="criticas-sobre-o-padr-o-de-design"><strong>Criticas sobre o padrão de design</strong></h3><p>Padrões de design são bons, mas por vezes podem trazer complexidade extra aos nossos designs. É importante lembrar o YAGNI e tentar manter os nossos designs tão simples quanto possível. Utiliza apenas padrões de design quando tiveres mesmo a certeza que precisas deles. Saberás quando for o momento.</p><p>Se soubermos o que cada um destes padrões faz, quando utilizá-los, e quando nem sequer <em>nos preocuparmos</em> em utilizá-los, estaremos em boa forma para começar a compreender como fazer a arquitetura de sistemas complexos.</p><p>A razão por trás disso é que <strong>padrões arquitetónicos</strong> <strong>são simplesmente padrões de design com a escala elevada para alto nível</strong>, enquanto que os padrões de design são implementações de baixo nível (mais próximas a classes e funções).</p><h3 id="recursos-1"><strong>Recursos</strong></h3><p><a href="https://refactoring.guru/design-patterns">Refactoring Guru - Padrões de Design</a> (link em inglês)</p><h2 id="fase-6-princ-pios-arquitet-nicos"><strong>Fase 6: princípios arquitetónicos</strong></h2><p>Agora estás num nível de pensamento mais elevado do que o nível de classe.</p><p>Compreendemos que as decisões que tomamos para organizar e criar relações entre componentes, a nível elevado e a nível baixo, vão ter um impacto significativo na facilidade de manutenção, flexibilidade e capacidade de testagem do nosso projeto.</p><p>Aprende os princípios orientadores que te ajudam a criar a flexibilidade que o teu código-base necessita para ser capaz de reagir a novas funcionalidades e exigências, com o mínimo esforço possível.</p><p>Aqui está o que eu recomendo que aprendas logo à partida:</p><ul><li>Princípios de design de componentes: <a href="https://khalilstemmler.com/wiki/stable-abstraction-principle/">o Princípio de Abstração Estável</a> (link em inglês), <a href="https://khalilstemmler.com/wiki/stable-dependency-principle/">o Princípio de Dependência Estável</a> (link em inglês), e o Princípio de Dependência Acíclica, para como organizar componentes, as suas dependências, quando juntá-las, e as implicações de criar acidentalmente ciclos de dependência e depender de componentes instáveis.</li><li><a href="https://khalilstemmler.com/articles/enterprise-typescript-nodejs/clean-nodejs-architecture/">Política x Detalhe</a> (Link em inglês), para compreender como separar as regras da tua aplicação a partir dos detalhes de implementação.</li><li>Limites e como identificar os <a href="https://khalilstemmler.com/articles/enterprise-typescript-nodejs/application-layer-use-cases/">subdomínios</a> a que as funcionalidades da tua aplicação pertencem.</li></ul><p>O <em>Uncle Bob</em> descobriu e documentou originalmente muitos destes princípios. Então, o melhor recurso para aprender isto é, novamente, "<a href="https://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=asc_df_0132350882/?tag=googleshopc0c-20&amp;linkCode=df0&amp;hvadid=292982483438&amp;hvpos=1o2&amp;hvnetw=g&amp;hvrand=13521899336201370454&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9000834&amp;hvtargid=pla-435472505264&amp;psc=1">Arquitetura Limpa</a>" (link em inglês).</p><h2 id="fase-7-estilos-arquitet-nicos"><strong>Fase 7: estilos arquitetónicos</strong></h2><p>Arquitetura é sobre as coisas que importam.</p><p>É sobre identificar as necessidades do sistema de maneira a que este seja bem-sucedido e de seguida <strong>aumentar as hipóteses de sucesso</strong> ao escolher a arquitetura que melhor se adequa aos requisitos.</p><p>Por exemplo, um sistema que tem muita <strong>complexidade de lógica de negócio </strong> beneficiaria da utilização de uma <strong>arquitetura por camadas</strong> para encapsular essa complexidade.</p><p>Um sistema como a Uber precisa de ser capaz de lidar com muitos <strong>eventos em tempo real</strong> de uma só vez e atualizar a localização do condutor, então, um estilo de arquitetura <strong><strong>p</strong>u<strong>bli</strong>car<strong>-subscr</strong>ever</strong> poderia ser o mais eficaz.</p><p>Vou-me repetir a mim mesmo aqui porque é importante observar que as 3 categorias de estilos arquitetónicos são semelhantes às 3 categorias de padrões de design, porque <strong>estilos arquitetónicos são padrões de design de alto nível</strong>.</p><h3 id="estrutural-1"><strong>Estrutural</strong></h3><p>Projetos com <em>níveis variantes</em> de componentes e grande intervalo de funcionalidades beneficiarão ou serão prejudicados pela adopção de uma arquitetura estrutural.</p><p>Aqui estão alguns exemplos:</p><ul><li>Arquiteturas<strong> c<strong>om</strong> base em componentes</strong> enfatizam <strong>separação de preocupações</strong> entre os <em>componentes individuais</em> dentro de um sistema. Imagina a <strong><strong>Google</strong></strong> por um segundo. Considera quantas aplicações eles têm dentro da empresa (Google Docs, Google Drive, Google Maps, etc). Para plataformas com muitas funcionalidades, arquiteturas com base em componentes dividem as preocupações em componentes independentes vagamente agrupados. Isto é uma separação <em><em>horizontal</em></em>.</li><li><strong><strong>Mono</strong>lítico</strong> significa que a aplicação é combinada numa única plataforma ou programa, implementada completamente. <em>Observação<em>: </em>podes ter uma arquitetura com base em componentes<em> </em>E<em> monolí</em>tica<em> </em>se separares as tuas aplicações adequadamente<em>, </em>enquanto implementas tudo em conjunto</em>.</li><li>Arquiteturas<strong> por camadas</strong> separam <em>verticalmente</em> as preocupações ao dividir o software em camadas de infraestrutura, aplicação e domínio.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/app-logic-layers.svg" class="kg-image" alt="app-logic-layers" width="921" height="549" loading="lazy"></figure><blockquote><em>Um exemplo de corte das responsabilidades/preocupações de uma aplicação de modo vertical<em> </em>usando uma arquitetura de camadas<em>. </em>Lê<em> </em></em><a href="https://khalilstemmler.com/articles/software-design-architecture/organizing-app-logic/"><em>aqui</em></a><em><em> </em>(texto em inglês) para obter mais informações sobre como fazer isso<em>.</em></em></blockquote><h3 id="mensagens"><strong>Mensagens</strong></h3><p>Dependendo do teu projeto, enviar mensagens pode ser um componente realmente importante para o sucesso do sistema. Para projetos como esse, arquiteturas com base em mensagens criadas sobre princípios de programação funcional e padrões de design comportamental como o padrão <em>observer</em>.</p><p>Aqui estão alguns exemplos de estilos de arquiteturas com base em mensagens:</p><ul><li>Arquiteturas<strong> Orientadas por Eventos</strong> vêm todas as alterações significativas a estados como eventos. Por exemplo, numa <a href="https://github.com/stemmlerjs/white-label">aplicação de venda de discos de vinil</a>, o estado de uma oferta pode alterar de "pendente" para "aceite" quando ambas as partes concordam com a troca.</li><li>Arquiteturas<strong> <strong>Publi</strong>car<strong>-subscr</strong>ever</strong> são criadas sobre o padrão de design <em>Observer</em> ao fazer com que seja o método de comunicação principal entre o próprio sistema, utilizadores finais/clientes, e outros sistemas e componentes.</li></ul><h3 id="distributivo"><strong>Distributivo</strong></h3><p>Uma arquitetura distributiva significa simplesmente que os componentes do sistema são implementados separadamente e operam ao comunicar num protocolo de rede. Sistemas distributivos podem ser muito eficazes para escalar a taxa de transferência, escalar equipas e delegar (tarefas potencialmente caras) responsabilidades a outros componentes.</p><p>Alguns exemplos de estilos de arquiteturas distributivas são:</p><ul><li>Arquitetura<strong> <em>c</em><strong><em>lient</em>-serv</strong>idor</strong>. Uma das arquiteturas mais comuns, onde dividimos o trabalho a ser feito entre o <em>client</em> (apresentação) e o servidor (lógica de negócio).</li><li>Arquiteturas<strong> ponto-a-ponto</strong> distribuem tarefas de camada de aplicação entre participantes igualmente privilegiados, formando uma rede ponto-a-ponto.</li></ul><h2 id="fase-8-padr-es-arquitet-nicos"><strong>Fase 8: padrões arquitetónicos</strong></h2><p><em>Padrões</em> arquitetónicos explicam em grande detalhe tático como realmente implementar um destes <em>estilos</em> arquitetónicos.</p><p>Aqui estão alguns exemplos de padrões arquitetónicos e os estilos que estes herdam:</p><ul><li><strong><strong><a href="https://khalilstemmler.com/articles/domain-driven-design-intro/">D</a></strong><a href="https://khalilstemmler.com/articles/domain-driven-design-intro/">esign Orientado a Domínio</a></strong> é uma abordagem ao desenvolvimento de software para problemas de domínio realmente complexos. Para que o design orientado a domínio seja bem-sucedido, precisamos de implementar uma <strong>arquitetura de camadas</strong> de maneira a separar as preocupações de um modelo de domínio dos detalhes infra-estruturais que fazem a aplicação realmente executar, como bases de dados, servidores web, caches etc.</li><li><strong>Controlador <strong>Model</strong>o<strong>-Vi</strong>sta</strong> é provavelmente o padrão arquitetónico <strong>mais conhecido</strong> para desenvolver aplicações baseadas na interface de utilizador. Funciona ao dividir a aplicação em 3 componentes: modelo, vista e controlador. O controlador modelo-vista é incrivelmente útil quando estás no início e ajuda-te a aproveitar outras arquiteturas, mas existe uma altura em que percebemos que o <a href="https://khalilstemmler.com/articles/enterprise-typescript-nodejs/when-crud-mvc-isnt-enough/">controlador Modelo-Vista não é suficiente</a> para problemas com muita lógica de negócio.</li><li><strong>Fornecimento de eventos</strong> é uma abordagem funcional onde armazenamos apenas as transações e nunca o estado. Se alguma vez precisarmos do estado, podemos aplicar todas as transações desde o início.</li></ul><h2 id="fase-9-padr-es-empresariais"><strong>Fase 9: padrões empresariais</strong></h2><p>Qualquer padrão arquitetónico que escolhas introduzirá um número de construções e linguagem especializada para te familiarizares e decidir se vale a pena o esforço ou não.</p><p>Ao pegar num exemplo que muitos de nós conhecemos, no <strong>Controlador Modelo-Vista</strong>, a <em><em>vi</em>sta</em> armazena todo o código da camada de apresentação, o <em><em>control</em>ador</em> é comandos de tradução e consultas da <em><em>vi</em>sta</em> para pedidos que são tratados pelo <em><em>model</em>o</em> e retornados pelo <em><em>control</em>ador</em>.</p><p>Em que parte do Modelo (M) lidamos com estas coisas?:</p><ul><li>Lógica de validação</li><li>Regras invariáveis</li><li>Eventos de domínio</li><li>Casos de utilização</li><li>Consultas complexas</li><li>E lógica empresarial</li></ul><p>Se simplesmente utilizarmos um ORM (<em>object-relational mapper</em>) como <a href="https://www.freecodecamp.org/news/software-design/">Sequelize</a> ou <a href="https://www.freecodecamp.org/news/software-design/">TypeORM</a> como o <em><em>model</em>o</em>, todas essas coisas importantes são deixadas para interpretação onde devem estar, e acabam por ficar numa capada não especificada entre o (que deveria ser um rico) <em><em>model</em>o</em> e o <em><em>control</em>ador</em>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/mvc-2.svg" class="kg-image" alt="mvc-2" width="365" height="275" loading="lazy"></figure><blockquote><em>Retirado de<em> "3.1 - Slim (Logic-less) models" </em>em<em> </em></em><a href="https://solidbook.io/"><em><em>solidbook.io</em></em></a><em> (link em inglês)<em>.</em></em></blockquote><p>Se existe alguma coisa que eu tenha aprendido até agora na minha jornada para lá do controlador modelo-vista, é que <strong>existe uma construção para tudo</strong>.</p><p>Para cada uma destas coisas em que o Controlador Modelo-Vista falha em abordar, existem outros <strong>padrões empresariais</strong> para resolvê-las. Por exemplo:</p><ul><li><strong><strong><a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/entities/">Enti</a></strong><a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/entities/">dades</a> </strong>(link em inglês) descrevem modelos que têm uma identidade.</li><li><a href="https://khalilstemmler.com/articles/typescript-value-object/"><strong><strong>Obje</strong>tos de valor</strong></a><strong> </strong>(link em inglês) são modelos que não têm identidade e podem ser utilizados de modo a encapsular a lógica de validação.</li><li><strong><a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/chain-business-logic-domain-events/">Eventos de domínio</a> </strong>(link em inglês) são eventos que significam algum evento empresarial relevante a acontecer e podem ser subscritos de outros componentes.</li></ul><p>Com base no estilo arquitetónico que tiveres escolhido, vão existir muitos outros padrões empresariais para aprenderes de maneira a implementar esse padrão no seu potencial máximo.</p><h3 id="padr-es-de-integra-o"><strong>Padrões de integração</strong></h3><p>Assim que a tua aplicação estiver operacional, à medida que recebes mais e mais utilizadores, podes obter alguns problemas de desempenho. Chamadas de API podem demorar muito tempo, os servidores podem quebrar por estares sobrecarregados de pedidos etc. Para resolver esses problemas, podes ler sobre a integração de coisas como <strong>consulta de mensagens</strong> ou <strong><strong>caches</strong></strong> de modo a melhorar o desempenho.</p><p>Estas são provavelmente as coisas mais desafiantes: <em>escalar<em>, audit</em>ar e desempenho</em>.</p><p>Desenhar um sistema para <em>escala</em> pode ser incrivelmente desafiante. Isto requer uma compreensão profunda sobre as limitações de cada componente dentro da arquitetura e um plano de ação para como mitigar o <em>stress</em> na tua arquitetura e continuar a servir pedidos em situações de grande tráfego.</p><p>Existe também a necessidade de <em><em>audit</em>ar</em> o que está a acontecer na tua aplicação. Grandes empresas precisam de ser capazes de fazer auditorias de modo a identificar potenciais problemas de segurança, compreender como os utilizadores estão a utilizar as suas aplicações, e ter um registo de tudo o que aconteceu até agora.</p><p>Isso pode ser desafiante de implementar, mas as arquiteturas comuns acabam por parecer <strong>baseadas em eventos</strong> e são criadas sobre uma grande variedade de conceitos de design de software e sistemas, princípios e práticas como <em>Event Storming</em>, <em>DDD</em>, <em>CQRS</em> (<em>command query response segregation</em>) e <em>Event Sourcing</em>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Os melhores tutoriais de Python ]]>
                </title>
                <description>
                    <![CDATA[ > Traduzido em português europeu. O Python [https://www.python.org/] é uma linguagem de programação de utilização geral, que é escrita e interpretada dinamicamente, conhecida pela sua fácil legibilidade com ótimos princípios de design. O freeCodeCamp tem um dos cursos mais populares sobre Python. É completamente gratuito (e também não tem quaisquer ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/os-melhores-tutoriais-em-python/</link>
                <guid isPermaLink="false">653f765441517403e4ea52c6</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 01 May 2024 01:50:23 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/5f9c9ef5740569d1a4ca4014.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/best-python-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Best Python Tutorials</a>
      </p><blockquote>Traduzido em português europeu.</blockquote><p>O <a href="https://www.python.org/" rel="nofollow">Python</a> é uma linguagem de programação de utilização geral, que é escrita e interpretada dinamicamente, conhecida pela sua fácil legibilidade com ótimos princípios de design.</p><p>O freeCodeCamp tem um dos cursos mais populares sobre Python. É completamente gratuito (e também não tem quaisquer anúncios, basta estar conectado à plataforma). Podes, também, <a href="https://www.youtube.com/watch?v=rfscVS0vtbw">assistir ao curso no YouTube</a>.</p><h2 id="queres-aprender-mais"><strong>Queres aprender mais<strong><strong>?</strong></strong></strong></h2><p>A internet é um sítio vasto, existe muito mais para explorar (links em inglês):</p><ul><li>Livro prático de Python: <a href="http://anandology.com/python-practice-book/index.html">http://anandology.com/python-practice-book/index.html</a></li><li>Pensa em Python: <a href="http://greenteapress.com/thinkpython/html/index.html">http://greenteapress.com/thinkpython/html/index.html</a></li><li>Python prático para negócios: <a href="http://pbpython.com/">http://pbpython.com/</a></li><li>Outro curso: <a href="https://realpython.com/?utm_source=fsp&amp;utm_medium=promo&amp;utm_campaign=bestresources">https://realpython.com/?utm<em><em>source=fsp&amp;utm</em></em>medium=promo&amp;utm_campaign=bestresources</a></li><li>Generalidade: <a href="https://www.fullstackpython.com/">https://www.fullstackpython.com/</a></li><li>Aprenda os fundamentos: <a href="https://www.codecademy.com/learn/learn-python">https://www.codecademy.com/learn/learn-python</a></li><li>Ciência computacional utilizando Python: <a href="https://www.edx.org/course/introduction-computer-science-mitx-6-00-1x-11?ref=hackernoon#!">https://www.edx.org/course/introduction-computer-science-mitx-6-00-1x-11?ref=hackernoon#!</a></li><li>Lista de mais recursos para aprender Python: <a href="https://github.com/vinta/awesome-python">https://github.com/vinta/awesome-python</a></li><li>Python interativo: <a href="http://interactivepython.org/runestone/static/thinkcspy/index.html">http://interactivepython.org/runestone/static/thinkcspy/index.html</a></li><li>Manual do programador para Python: <a href="https://devguide.python.org/">https://devguide.python.org/</a></li></ul><h2 id="para-que-utilizado-o-python"><strong>Para que é utilizado o<strong><strong> Python?</strong></strong></strong></h2><p>O Python pode ser facilmente utilizado para projetos pequenos, grandes, on-line e off-line. As melhores opções para utilizar Python são a programação para a web, criação simples de <em>scripts</em> e análise de dados. Abaixo estão alguns exemplos do que o Python permitirá fazer:</p><h5 id="programa-o-para-a-web-"><strong>Programação para a w<strong><strong>eb:</strong></strong></strong></h5><p>Podes utilizar o Python para criar aplicações para a web de vários níveis de complexidade. Existem muitas <em>frameworks</em> de Python para a web, incluindo Pyramid, Django e Flask, para mencionar algumas.</p><h5 id="an-lise-de-dados-"><strong>Análise de dados<strong><strong>:</strong></strong></strong></h5><p>O Python é a principal escolha em termos de linguagem para muitos cientistas de dados. O Python cresceu em popularidade neste ramo devido à disponibilidade de várias bibliotecas excelentes focadas em ciências de dados (das quais, NumPy e Pandas são duas das mais conhecidas) e visualização de dados (como Matplotlib e Seaborn). O Python tornou o processamento de dados interessante com todas as suas inúmeras bibliotecas disponíveis. Ipython com JupyterLab é outra forma de Python que melhora a utilização de Python no ramo da ciência de dados.</p><h5 id="automatiza-o-"><strong><strong><strong>Automati</strong></strong>zação<strong><strong>:</strong></strong></strong></h5><p>Python é uma linguagem muito flexível que pode ser utilizada para automatizar tarefas aborrecidas e repetitivas. Administradores de sistemas utilizam-na geralmente ao escrever scripts que podem ser facilmente executados no terminal. O Python também pode ser utilizado para criar <em>bots</em> que automatizam algumas das nossas tarefas diárias.</p><h5 id="intelig-ncia-artificial-"><strong>Inteligência artificial<strong><strong>:</strong></strong></strong></h5><p>O Python também é utilizado extensivamente no ramo emergente da Inteligência Artificial (IA). A Google selecionou o Python como uma das primeiras linguagens de programação bem suportadas para treinar e interagir com modelos, utilizando o Tensorflow.</p><h4 id="desenvolvimento-de-aplica-es-para-dispositivos-m-veis"><strong>Desenvolvimento de aplicações para dispositivos móveis</strong></h4><p>Podem ser criadas aplicações para dispositivos móveis e jogos com Python através da utilização de Kivy, Pygame e PyQt.</p><h4 id="seguran-a-e-rede-"><strong>Segurança e rede<strong><strong>:</strong></strong></strong></h4><p>O Python é utilizado para criar ferramentas de rede e segurança que são utilizadas amplamente. A automatização remota do Python é a mais segura, rápida e eficaz para testes de <em>frameworks </em>na <em>cloud</em>. É por isso que programadores profissionais utilizam Python para criar as <em>frameworks </em>mais seguras e para programação de sockets.</p><h5 id="machine-learning-deep-learning"><strong><strong><strong>Machine Learning, Deep Learning</strong></strong></strong></h5><p>Python é uma das melhores linguagens adequadas para <em>machine learning</em>, <em>deep learning</em> e análises de dados, com uma forte eficácia em todos eles.</p><p>Existem linguagens especializadas mais adequadas para vários papéis, como R e MATLAB, mas, no que diz respeito a combinar vários ramos de aplicações, o Python vence facilmente devido à sua flexibilidade, rápida criação de protótipos e disponibilidade de bibliotecas.</p><h4 id="desenvolvimento-de-bots-para-o-telegram"><strong>Desenvolvimento de bots para o <strong><strong>Telegram</strong></strong></strong></h4><p>Podes utilizar Python e algumas bibliotecas do Python para desenvolver os teus próprios <a href="https://core.telegram.org/bots" rel="nofollow">Bots do Telegram</a> (link em inglês).</p><h4 id="obten-o-de-dados-atrav-s-de-gathering-e-scraping"><strong>Obtenção de dados através de<strong><strong> </strong></strong><em>g</em><strong><strong><em>athering</em> </strong></strong>e<strong><strong> <em>scraping</em></strong></strong></strong></h4><p>O Python também pode ser utilizado para analisar o código-fonte das páginas e obter a sua informação. Utilizar alguns módulos do Python, tais como o Scrapy e também (para algumas páginas que utilizam JavaScript) o Selenium deve resolver o problema!</p><h4 id="o-python-geralmente-utilizado-para-"><strong>O <strong><strong>Python é</strong></strong> geralmente utilizado para:</strong></h4><ul><li>Desenvolvimento para a web e Internet</li><li>Progresso educacional</li><li>Estudos/computações científicos</li><li>Desenvolvimento para desktop</li><li>Computação numérica</li><li>Desenvolvimento de software</li><li>Desenvolvimento de aplicações empresariais</li><li>Machine Learning</li><li>IOT (Internet Of Things)</li><li>Desenvolvimento de jogos</li><li>Prototipagem rápida</li><li>Automatização de browser</li><li>Análise de dados</li><li>Obter dados de websites</li><li>Processamento de imagens</li></ul><h4 id="alguns-artigos-que-abordam-a-utilidade-do-python"><strong>Alguns artigos que abordam a utilidade do<strong><strong> python</strong></strong></strong></h4><ul><li><a href="http://www.dummies.com/programming/python/10-major-uses-of-python/" rel="nofollow">10 Major Uses of Python</a> (10 principais utilizações do Python, link em inglês)</li><li><a href="https://www.python.org/about/apps/" rel="nofollow">Applications for Python</a> (Aplicações para Python, link em inglês)</li><li><a href="https://stackoverflow.com/questions/3043085/where-is-python-language-used" rel="nofollow">Where is the Python Language Used?</a> (Onde é utilizada a linguagem Python?, link em inglês)</li><li><a href="https://stackoverflow.com/questions/1909512/what-is-python-used-for" rel="nofollow">What is Python used for?</a> (Para que é utilizado o Python?, link em inglês)</li></ul><p>O índice oficial de pacotes para o Python está <a href="https://pypi.python.org/pypi" rel="nofollow">aqui</a> (link em inglês).</p><h2 id="deves-utilizar-python-2-ou-python-3"><strong>Deves utilizar<strong><strong> Python 2 o</strong></strong>u<strong><strong> Python 3?</strong></strong></strong></h2><p>As duas versões são semelhantes. Se conheceres uma delas, trocar para escrever código na outra é fácil.</p><ul><li><a href="https://www.python.org/dev/peps/pep-0373/" rel="nofollow">Python 2.x não recebe mais manutenção desde 2020</a> (link em inglês).</li><li>3.x está em desenvolvimento ativo. Isto quer dizer que todas as melhorias recentes de bibliotecas predefinidas, por exemplo, estão apenas disponíveis por defeito na versão Python 3.x.</li><li>O ecossistema do Python acumulou uma quantidade significativa de software de qualidade ao longo dos anos. A desvantagem de quebrar a compatibilidade com versões anteriores ao 3.x é que alguns desses softwares (especialmente software interno em empresas) ainda não funcionam na versão 3.x.</li></ul><h2 id="instala-o"><strong>Instalação</strong></h2><p>A maior parte dos sistemas operativos com base *nix já trazem o Python instalado (geralmente o Python 2, ou Python 3 nos mais recentes). Substituir a instalação predefinida do Python no teu sistema não é recomendado e pode causar problemas. No entanto, podem ser instaladas diferentes versões do Python em segurança, juntamente com a versão predefinida do teu sistema. Ver <a href="https://docs.python.org/3/using/index.html" rel="nofollow">Configuração do Python e utilização</a> (link em inglês).</p><p>O Windows não vem com o Python instalado, mas o instalador e as instruções de instalação podem ser encontradas <a href="https://docs.python.org/3/using/windows.html" rel="nofollow">aqui</a> (link em inglês).</p><h2 id="int-rprete-de-python"><strong>Intérprete de <strong><strong>Python</strong></strong></strong></h2><p>O intérprete de Python é o que é utilizado para executar scripts de Python.</p><p>Se este estiver disponível e no caminho de pesquisa da linha da shell do Unix, é possível iniciá-lo ao escrever o comando <code>python</code>, seguido pelo nome do script. Isto invocará o intérprete e executar o script.</p><p><code>hello_campers.py</code></p><pre><code class="language-python">print('Hello campers!')</code></pre><p>A partir do terminal:</p><pre><code class="language-text">$ python hello_campers.py
Hello campers!</code></pre><p>Quando estão instaladas várias versões do Python, é possível chamar o intérprete por versão, dependendo da configuração da instalação. No ambiente personalizado do IDE Cloud9, podem ser invocados da seguinte forma:</p><pre><code class="language-text">$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ python3.5 --version
Python 3.5.1
$ python3.6 --version
Python 3.6.2 
$ python3.7 --version
Python 3.7.1</code></pre><h2 id="modo-interativo-do-int-rprete-de-python"><strong>Modo interativo do intérprete de <strong><strong>Python</strong></strong></strong></h2><p>O modo interativo pode ser iniciado ao invocar o intérprete de Python com a flag <code>-i</code> ou sem qualquer argumento.</p><p>O modo interativo tem uma <em>prompt</em> onde podem ser inseridos e executados comandos de Python:</p><pre><code class="language-text">$ python3.5
Python 3.5.1 (default, Dec 18 2015, 00:00:00)
GCC 4.8.4 on linux
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; print("Hello campers!")
Hello campers!
&gt;&gt;&gt; 1 + 2
3
&gt;&gt;&gt; exit()
$</code></pre><h2 id="o-zen-do-python"><strong>O<strong><strong> Zen </strong></strong>do<strong><strong> Python</strong></strong></strong></h2><p>Alguns dos princípios que influenciaram o design do Python estão incluídos como extra e podem ser lidos ao utilizar o comando dentro do modo interativo do intérprete de Python:</p><pre><code class="language-text">&gt;&gt;&gt; import this
O Zen do Python, escrito por Tim Peters

Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Linear é melhor do que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o bastante para quebrar as regras.
Ainda que praticidade vença a pureza.
Erros nunca devem passar silenciosamente.
A menos que sejam explicitamente silenciados.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deveria haver um — e preferencialmente só um — modo óbvio para fazer algo.
Embora esse modo possa não ser óbvio a princípio a menos que você seja holandês.
Agora é melhor que nunca.
Embora nunca frequentemente seja melhor que já.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Namespaces são uma grande ideia — vamos ter mais dessas!</code></pre><h2 id="pr-s-e-contras-do-python"><strong><strong><strong>Prós </strong></strong>e contras do<strong><strong> Python</strong></strong></strong></h2><h3 id="pr-s"><strong><strong><strong>Prós</strong></strong></strong></h3><ol><li>Linguagem interativa com suporte de módulo para quase todas as funcionalidades.</li><li>Código aberto: portanto, podes contribuir para a comunidade com as funções que desenvolveres para utilização futura e para ajudar outros.</li><li>Muitos bons intérpretes e notebooks disponíveis para uma melhor experiência, como o Jupyter Notebook.</li></ol><h4 id="contras"><strong>Contras</strong></h4><ol><li>Sendo de código aberto, foram desenvolvidas muitas formas diferentes das mesmas funções ao longo dos anos. Isso, por vezes, cria caos quando outras pessoas leem o código de outra pessoa.</li><li>É uma linguagem lenta. Por isso, é uma linguagem muito má para desenvolver algoritmos comuns.</li></ol><h2 id="documenta-o"><strong><strong><strong>Documenta</strong></strong>ção</strong></h2><p>O <a href="https://docs.python.org/3/" rel="nofollow">Python está bem documentado</a> (link em inglês). Esses documentos incluem tutoriais, guias, referências e informações chave da linguagem.</p><p>Outra referência importante são as <em>Python Enhancement Proposals</em> (<a href="https://www.python.org/dev/peps/" rel="nofollow">PEPs</a> –Propostas de Melhoria do Python, em português). Incluído nas PEPs está um guia de estilos para escrever código Python, o <a href="https://www.python.org/dev/peps/pep-0008/" rel="nofollow"><code>PEP 8</code></a> (link em inglês).</p><h2 id="depura-o"><strong>Depuração</strong></h2><p>Podem ser utilizadas instruções <code>print</code> em linha para depurações simples:</p><blockquote><strong><strong><strong><strong>… </strong></strong></strong>por vezes, a forma mais rápida de depurar um programa é adicionar algumas instruções<strong><strong><strong> print </strong></strong></strong>ao código<strong><strong><strong>: </strong></strong></strong>o ciclo rápido de <strong><strong><strong>edi</strong></strong></strong>ção<strong><strong><strong>-test</strong></strong></strong>e<strong><strong><strong>-de</strong></strong></strong>puração<strong><strong><strong> </strong></strong></strong>torna esta abordagem muito eficaz<strong><strong><strong>.</strong></strong></strong></strong><br><br><a href="https://www.python.org/doc/essays/blurb/" rel="nofollow">Sumário executivo</a> (link em inglês)</blockquote><p>O Python também inclui ferramentas mais potentes para depuração, tais como:</p><ul><li>módulo de registo, <a href="https://docs.python.org/3/library/logging.html" rel="nofollow"><em><em>logging</em></em></a><em> </em>(link em inglês)</li><li>módulo de depuração, <a href="https://docs.python.org/3/library/pdb.html" rel="nofollow"><em><em>pdb</em></em></a><em> </em>(link em inglês)</li></ul><p>Por enquanto, tem apenas em mente que elas existem.</p><h2 id="ol-mundo-"><strong>Olá, mundo<strong><strong>!</strong></strong></strong></h2><p>Voltando à documentação, podemos ler sobre a função <a href="https://docs.python.org/3/library/functions.html#print" rel="nofollow"><code>print</code></a>, uma <a href="https://docs.python.org/3/library/functions.html" rel="nofollow"><em>função integrada</em></a><em> </em>(link em inglês) da <a href="https://docs.python.org/3/library/index.html" rel="nofollow">Biblioteca Predefinida do Python</a> (link em inglês).</p><pre><code class="language-text">print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)</code></pre><p>As funções integradas estão listadas por ordem alfabética. O nome é seguido por uma lista entre parênteses de parâmetros formais com valores predefinidos opcionais. Por baixo disso, é fornecida uma breve descrição da função e dos seus parâmetros e existe, ocasionalmente, um exemplo.</p><p>A função <a href="https://docs.python.org/3/library/functions.html#print" rel="nofollow"><code>print</code></a> do Python 3 substitui a instrução <a href="https://docs.python.org/2/reference/simple_stmts.html#print" rel="nofollow"><code>print</code></a> do Python 2.</p><pre><code class="language-text">&gt;&gt;&gt; print("Olá, mundo!")
Olá, mundo!</code></pre><p>Uma função é chamada quando o nome da função é seguido por <code>()</code>. Para o exemplo Olá, mundo!, a função <em>print</em> é chamada com uma string como argumento para o primeiro parâmetro. Para os restantes parâmetros, são utilizados os valores predefinidos.</p><p>O argumento com que chamamos a função <code>print</code> é um objeto <code>str</code>, ou <em><em>string</em></em>, um dos <em><a href="https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str" rel="nofollow">tipos integrados</a> </em>do<em> </em>Python. Além disso, a coisa mais importante sobre Python é que não precisas de especificar o tipo de dados quando declaras uma variável. O compilador do Python, ele próprio, fará isso com base no tipo do valor atribuído.</p><p>O parâmetro <code>objects</code> tem um <code>*</code> como prefixo, que indica que a função receberá um número arbitrário de argumentos para esse parâmetro.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como configurar notificações no teu bot do Telegram ]]>
                </title>
                <description>
                    <![CDATA[ > Traduzido em português europeu Escrito por: Nikita Kholin O Telegram é uma ótima plataforma com muitos utilizadores – eu próprio sou um utilizador do Telegram. Qual seria a melhor forma para os utilizadores do Telegram receberem notificações? Não podemos ter a certeza. Talvez gostem de receber por e-mail ou ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-configurar-notificacoes-no-teu-bot-do-telegram/</link>
                <guid isPermaLink="false">6527a277b73e2e03f70ce242</guid>
                
                    <category>
                        <![CDATA[ Bots ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2024 05:50:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/0_mN13Q59wDCwvUWCF.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/telegram-push-notifications-58477e71b2c2/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to set up push notifications in your Telegram bot</a>
      </p><blockquote>Traduzido em português europeu</blockquote><p>Escrito por: Nikita Kholin</p><p>O Telegram é uma ótima plataforma com muitos utilizadores – eu próprio sou um utilizador do Telegram. Qual seria a melhor forma para os utilizadores do Telegram receberem notificações? Não podemos ter a certeza. Talvez gostem de receber por e-mail ou de outro forma, mas podemos supor que enviar notificações para o Telegram seria bastante conveniente.</p><p>Se gostarias de enviar notificações para o Telegram a partir da tua aplicação, vieste ao sítio certo. Adicionei esta funcionalidade à <a href="https://musicnotifier.com/" rel="noopener">minha aplicação</a> e adorei.</p><p>Uma pequena nota: neste artigo, forneci exemplos de código em Python. As ideias, contudo, não são específicas para o Python e podem ser traduzidas para outra linguagem sem qualquer problema.</p><p>Então, sem mais demoras, vamos ver como podemos fazê-lo.</p><h3 id="criar-um-bot-do-telegram"><strong>Criar um bot do Telegram</strong></h3><p>Em primeiro lugar, precisas criar um bot do Telegram. Para fazer isto, tens de utilizar outro bot do Telegram, o <a href="https://telegram.me/botfather" rel="noopener">BotFather</a>. Começa a falar com ele (clica em start).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/K0IHhahp6VR-IJDs8ohcZRxBBlUMaRWuUt4g.png" class="kg-image" alt="K0IHhahp6VR-IJDs8ohcZRxBBlUMaRWuUt4g" width="494" height="675" loading="lazy"></figure><p>Agora, podes ver o que ele pode fazer, mas o que nos interessa é criar um novo bot. Por isso, vamos escolher (<code>/newbot</code>).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/4TCF43Y1rArQcRQb-5F6XblOvTEMXUwWazrd.png" class="kg-image" alt="4TCF43Y1rArQcRQb-5F6XblOvTEMXUwWazrd" width="494" height="256" loading="lazy"></figure><p>Vamos descobrir rapidamente que o nome do bot deve terminar com "bot". E, visto que és como eu e chegaste à festa muito tarde, maior parte dos nomes de bot já estão ocupados.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/yRoEugA8JJ1ccppRU8g3kcy40mGsJqCalzRG.jpg" class="kg-image" alt="yRoEugA8JJ1ccppRU8g3kcy40mGsJqCalzRG" width="494" height="717" loading="lazy"></figure><p>Eventualmente, porém, vais encontrar um nome para o teu bot e receber um token de acesso de que vamos precisar.</p><p>Agora que tens um bot, os utilizadores do Telegram podem encontrá-lo e utilizá-lo, mas há um problema — não podes associar os utilizadores que vêm do Telegram aos utilizadores da tua aplicação. Permite-me mostrar-te a razão.</p><p>Assim que um utilizador clicar no botão "Start" no teu bot, vais receber uma "atualização". Podes verificar todas as atualizações do bot até mesmo no teu browser ao visitar o seguinte URL: <code>https://api.telegram.org/bot{bot_token}/getUpdates</code> (não te esqueças de utilizar o teu token de acesso no URL). Isto é o que obtive:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/AydGLffhxTaXFcqwj3untIxDVGf-AyGE26pc.png" class="kg-image" alt="AydGLffhxTaXFcqwj3untIxDVGf-AyGE26pc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/AydGLffhxTaXFcqwj3untIxDVGf-AyGE26pc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/AydGLffhxTaXFcqwj3untIxDVGf-AyGE26pc.png 800w" sizes="(min-width: 720px) 720px" width="800" height="43" loading="lazy"></figure><p>Não consegues ler nada? Não te preocupes. Podes corrigir isso ao instalar alguma extensão JSON <em>prettifier</em> no teu navegador. Eu utilizo o <a href="https://chrome.google.com/webstore/detail/json-formatter/mhimpmpmffogbmmkmajibklelopddmjf" rel="noopener">JSON Formatter</a> para o Chrome. Tem um aspeto muito melhor.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/iG2V6vR4rqS8Lmw-Cxg5FisuCHU9XAFEquzc.png" class="kg-image" alt="iG2V6vR4rqS8Lmw-Cxg5FisuCHU9XAFEquzc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/iG2V6vR4rqS8Lmw-Cxg5FisuCHU9XAFEquzc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/iG2V6vR4rqS8Lmw-Cxg5FisuCHU9XAFEquzc.png 800w" sizes="(min-width: 720px) 720px" width="800" height="1010" loading="lazy"></figure><p>Então, como podes ver, não recebemos grande informação sobre a pessoa. A partir dessa informação, podes obter o nome completo da pessoa. Seria, no entanto, uma sorte se o utilizador fornecesse o seu nome completo na tua aplicação, e não temos garantia que seja único. Por isso, não podemos utilizar isso para encontra um utilizador nas tuas aplicações.</p><p>Outra informação que obtemos é o nome de utilizador. Isto é mais útil porque é único entre todos os utilizadores do Telegram. O mais provável, porém, é que não tenhas isso disponível nas tuas aplicações. Então, teríamos de pedir ao utilizador para inserir o seu nome de utilizador algures na aplicação. É muito trabalho que não tenho a certeza se alguém o faria.</p><p>Outra opção para associar um utilizador seria pedir-lhes para fornecer o e-mail que utilizaram para o bot na tua aplicação. Ocorre que isso tem muitas falhas: o utilizador pode enganar-se ao escrever o e-mail, o utilizador pode inserir um e-mail de outro utilizador para se aproveitarem do sistema. Isso é muito mau.</p><p>Podemos fazer melhor?</p><h3 id="associar-um-utilizador"><strong>Associar um utilizador</strong></h3><p>Claro que podemos. Para associar o utilizador, vamos utilizar uma técnica chamada <a href="https://core.telegram.org/bots#deep-linking" rel="noopener">deep linking</a> (texto em inglês).</p><p>Primeiro, tens de criar um token aleatório único para cada utilizador. Utilizei o seguinte código para gerar o token, utilizando Python:</p><pre><code>from secrets import token_url
safetoken = token_urlsafe(8)
token
# =&gt; 'uEDbtJFHxKc'</code></pre><p>De seguida, precisas guardar esse token para ser possível encontrar um utilizador com o token mais tarde. Podes guardar o token na tua base de dados ou utilizar outro local, como por exemplo uma cache. Tenho um modelo <code>Notification</code>, por isso adicionei um campo a uma tabela do modelo.</p><pre><code>class Notification(models.Model):
	user = models.ForeignKey(User, on_delete=models.CASCADE)
    	# ...
    connect_token = models.CharField(max_length=64, null=True)</code></pre><p>Então, geramos o token <code>uEDbtJFHxKc</code> e guardamo-lo. Agora, vamos ter de utilizar este token num URL para o bot do Telegram, que o utilizador tem de clicar para fazer com que tudo funcione:</p><pre><code>telegram_url = 'https://www.telegram.me'
bot_name = 'music_notification_bot'
token = 'uEDbtJFHxKc'
url = f'{telegram_url}/{bot_name}?start={token}'</code></pre><p>Agora que temos o nosso URL, <code>'https://telegram.me/music_notification_bot?start=uEDbtJFHxKc'</code>, está na hora de o exibir ao utilizador. Exibe-o em qualquer sitio da tua aplicação e aguarda que o utilizador clique nele.</p><p>Assim que o utilizador morder o isco e clicar em “Start”, deves receber outra atualização:</p><pre><code>{
    "ok": true,
    "result": [
        // ...
        // atualizações anteriores
       	// ...
		{
			"update_id": 599162365,
			"message": {
                "message_id": 174,
                "from": { ... },
                "chat": { ... },
                "date": 1549788357,
                "text": "/start uEDbtJFHxKc",
                "entities": [ ... ]
        	}
        }
    ]
}</code></pre><p>Podemos, finalmente, identificar o nosso utilizador. O campo <code>text</code> contém agora o nosso token de utilizador. Vamos avançar e removê-lo deste campo:</p><pre><code>bot_token = 'your_bot_token'
updates_url = f'https://api.telegram.org/bot{bot_token}/getUpdates'

import requests
response = requests.get(updates_url).json()
text = response['result'][0]['message']['text']
text
# =&gt; '/start uEDbtJFHxKc'

splitted_text = text.split(' ')
# =&gt; ['/start', 'uEDbtJFHxKc']

token = splitted_text[-1]
# =&gt; 'uEDbtJFHxKc'</code></pre><p>Este token pode ser utilizado para encontrar o utilizador. A tua implementação depende da forma como guardaste o token inicialmente. Mas aqui fica como eu faço:</p><pre><code>notification = Notification.objects.get(channel='telegram', connect_token=token)
user = notification.user</code></pre><p>Então, o utilizador clicou no botão "Start", mas reparou que nada aconteceu. Vamos dar as boas vindas, pelo menos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/t3LnDt2icX4drb1ZwOr4t0gd8rHaoNhuOxoR.jpg" class="kg-image" alt="t3LnDt2icX4drb1ZwOr4t0gd8rHaoNhuOxoR" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/t3LnDt2icX4drb1ZwOr4t0gd8rHaoNhuOxoR.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/t3LnDt2icX4drb1ZwOr4t0gd8rHaoNhuOxoR.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="534" loading="lazy"></figure><p>Para dar as boas vindas ao utilizador, precisamos de descobrir se o utilizador iniciou uma conversa com o nosso bot. Existem duas opções para como podemos fazer isso: <em>polling</em> e <em>webhooks</em>.</p><p>Já sabes o que é <em>polling</em>. Já o fizeste. Ou pelo menos já me viste a fazê-lo. Assim que consultamos a página <code>https://api.telegram.org/bot{bot_token}/getUpdates</code>, fizemos uma <em>poll</em>. <em>Polling</em> é verificar constantemente se existem atualizações, a cada 2 segundos, por exemplo. Desta forma podemos saber sempre quando alguém interagiu com o bot.</p><p>Os <em>Webhooks</em> vão numa direção um pouco diferente. Em vez de verificar a cada 2 segundos se existem atualizações, simplesmente esperamos que aconteça uma atualização. Quando acontecer, o Telegram enviará um pedido com a informação da atualização para um URL que especificamos. Deste modo, podemos dar algum descanso tanto aos nossos servidores como aos do Telegram, e simplesmente esperar que chegue alguma atualização.</p><p><em>Polling</em> pode ser melhor se tiveres um tráfego elevado mas, infelizmente, é uma exceção, por isso, decidimos utilizar o <em>webhook</em>.</p><h3 id="webhooks"><strong><em>Webhooks</em></strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/nn4BJScN-LpTraRBdaaZ6--uBVl7Ikrlfj6E.jpg" class="kg-image" alt="nn4BJScN-LpTraRBdaaZ6--uBVl7Ikrlfj6E" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/nn4BJScN-LpTraRBdaaZ6--uBVl7Ikrlfj6E.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/nn4BJScN-LpTraRBdaaZ6--uBVl7Ikrlfj6E.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="571" loading="lazy"></figure><p>Configurar um <em>webhook</em> no Telegram é muito fácil. Só tens de enviar um pedido para <code>https://api.telegram.org/bot{bot_token}/setWebhook?url={your_server_url}</code>. Abrir este link no teu browser também funciona. <code>your_server_url</code> é o URL para onde o Telegram enviará as atualizações. Aqui está o que deves obter como resposta:</p><pre><code>{
    "ok": true,
    "result": true,
    "description": "Webhook was set"
}</code></pre><p>Se não confiares nas tuas capacidades, podes visitar <code>https://api.telegram.org/bot{bot_token}/getWebhookInfo</code> apenas para verificar que está tudo OK. Deves ver algo como isto:</p><pre><code>{
    "ok": true,
    "result": {
        "url": "https://example.com/your_server_endpoint",
        "has_custom_certificate": false,
        "pending_update_count": 0,
        "max_connections": 40
    }
}</code></pre><p>Agora, se algo não estiver OK (como teres colocado o URL errado), podes sempre remover o <em>webhook</em> ao visitar <a href="https://api.telegram.org/bot%7Bbot_token%7D/deleteWebhook" rel="noopener"><code>https://api.telegram.org/bot{bot_token}/deleteWebhook</code></a> e de seguida, configurar novamente o <em>webhook</em>.</p><h3 id="desenvolvimento-local"><strong>Desenvolvimento local</strong></h3><p>Antes de avançar, gostaria de partilhar algumas palavras sobre o desenvolvimento local. Os <em>webhooks</em> não são muito adequados para isto. Os <em>webhooks</em> são enviados para um URL e muito provavelmente não sabes qual é o URL do teu computador. Além disso, um <em>webhook</em> do Telegram requer que o URL seja seguro (HTTPS).</p><p>Existe, no entanto, uma solução para este problema: <em><a href="https://ngrok.com/" rel="noopener">ngrok</a></em>. <em>ngrok</em> é uma ferramenta que expõe o teu ambiente local ao mundo. <a href="https://ngrok.com/download" rel="noopener">Descarrega o </a><em><a href="https://ngrok.com/download" rel="noopener">ngrok</a></em>, faz a instalação e inicia-o com a porta em que o teu servidor está a executar. O meu servidor está a executar na porta <code>8000</code>, por isso, teria de executar o seguinte na consola</p><pre><code>/path/to/ngrok http 8000</code></pre><p>Depois, o <em>ngrok</em> deve fornecer-te um URL que podes utilizar para configurar um <em>webhook</em>.</p><h3 id="dar-as-boas-vindas-a-um-utilizador"><strong>Dar as boas vindas a um utilizador</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/g5chjEivn8kFMGCWNKvl1x5FmYxWRaXlfPgX.jpg" class="kg-image" alt="g5chjEivn8kFMGCWNKvl1x5FmYxWRaXlfPgX" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/g5chjEivn8kFMGCWNKvl1x5FmYxWRaXlfPgX.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/g5chjEivn8kFMGCWNKvl1x5FmYxWRaXlfPgX.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"></figure><p>Agora que tens tudo pronto para o desenvolvimento, vamos dar as boas vindas ao nosso utilizador — está à espera disso.</p><p>Assim que o utilizador clicar em "Start", o teu Telegram enviará uma atualização para o URL do teu servidor. As partes interessantes da atualização devem ter este aspeto:</p><pre><code>{
    "message": {
        "chat": {
            "id": 457
        },
		"text": "/start uEDbtJFHxKc",
    }
}</code></pre><p>Esta é a altura ideal para associar o utilizador através de uma mensagem de texto. Também existe um pedaço de informação interessante, ID de Chat. O ID de Chat é o que precisamos para enviar uma mensagem a esse utilizador. O Telegram tem um <em>endpoint</em> de &nbsp;API para enviar uma mensagem, que tem este aspeto: <code>https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&amp;text={text}</code>. Não tenho a certeza se preciso de explicar como utilizá-lo, mas aqui está como fica o meu código que processa o <em>webhook</em>:</p><pre><code>import json
import requests

def callback(request):
    body = json.loads(request.body)
    text = body['message']['text']
    token = text.split(' ')[-1]
    associate_user_by_token(token)

    bot_key = os.environ.get('TELEGRAM_API_KEY')
    chat_id = body['message']['chat']['id']
	text = "Welcome!"

	send_message_url = f'https://api.telegram.org/bot{bot_key}/sendMessage?chat_id={chat_id}&amp;text={text}'
	requests.post(send_message_url)</code></pre><p>Se enviarmos uma mensagem de boas vindas depois do utilizador ter clicado no famoso botão de "Start", o utilizador não terá dúvidas sobre o funcionamento da aplicação.</p><h3 id="enviar-notifica-es"><strong>Enviar notificações</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/03/xfdeU5lYWIBYfeZ9wjFxW6x1zxjVNLnMvB2P.jpg" class="kg-image" alt="xfdeU5lYWIBYfeZ9wjFxW6x1zxjVNLnMvB2P" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/03/xfdeU5lYWIBYfeZ9wjFxW6x1zxjVNLnMvB2P.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/03/xfdeU5lYWIBYfeZ9wjFxW6x1zxjVNLnMvB2P.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="599" loading="lazy"></figure><p>Por fim, chegamos à razão pela qual estamos a fazer tudo isto — enviar notificações. Podes querer notificar o utilizador sobre algo que tenha acontecido na tua aplicação. Por exemplo, alguém colocou um gosto na publicação do utilizador, ou algo do género. Eu utilizo o Telegram para enviar notificações sobre <a href="https://musicnotifier.com/" rel="noopener">novos lançamentos de músicas</a> dos artistas favoritos do utilizador.</p><p>Já sabes como enviar notificações. Apenas precisas enviar uma mensagem utilizando <code><a href="https://api.telegram.org/bot%7Bbot_token%7D/sendMessage?chat_id={chat_id}&amp;text={notification_text}." rel="noopener">https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&amp;text={notification_text}</a></code><a href="https://api.telegram.org/bot%7Bbot_token%7D/sendMessage?chat_id={chat_id}&amp;text={notification_text}." rel="noopener">.</a></p><p>Claro, se não estiveres a planear enviar notificações só quando o utilizador interage com o bot, vais ter de guardar o <code>chat_id</code> na tua base de dados.</p><p>Também podes querer incluir links ou outro tipo de formatações na tua mensagem. Neste caso, é necessário adicionares outro parâmetro ao URL de envio da mensagem, o <code>parse_mode</code>. Existem duas opções de <em>parsing</em>: <em>Markdown</em> ou HTML. Eu utilizei <em>Markdown</em> porque acho mais simples de utilizar. Se não estiveres à vontade com <em>Markdown,</em> podes utilizar HMTL, mas recomendo que leias <a href="https://www.markdownguide.org/basic-syntax" rel="noopener">quão fácil é realmente o <em>Markdown</em></a><em> (</em>texto em inglês<em>)</em>.</p><p>Aqui está o aspeto do URL de envio da mensagem com o parâmetro <code>parse_mode</code>: <code><a href="https://api.telegram.org/bot%7Bbot_token%7D/sendMessage?chat_id={chat_id}&amp;text={notification_text}&amp;parse_mode=markdown." rel="noopener">https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&amp;text={notification_text}&amp;parse_mode=markdown</a></code><a href="https://api.telegram.org/bot%7Bbot_token%7D/sendMessage?chat_id={chat_id}&amp;text={notification_text}&amp;parse_mode=markdown." rel="noopener">.</a></p><p>Eu adiciono links para novas atualizações ao texto das notificações desta forma: <code>{release.date}: {release.artist.name} - [{release.title}]({release.url})</code>. Podes ler mais sobre como formatar as tuas mensagens <a href="https://core.telegram.org/bots/api#formatting-options" rel="noopener">aqui</a> (Link em Inglês).</p><p>Além disso, existem <a href="https://core.telegram.org/bots/api#sendmessage" rel="noopener">mais parâmetros disponíveis</a> para o URL de envio da mensagem, como por exemplo o <code>disable_notification</code>. Existe sempre algo a ser explorado.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Agora, deves saber como:</p><ul><li>Criar um bot no Telegram utilizando o BotFather</li><li>Verificar se existem atualizações (e qual é a melhor forma de o fazer — <em>webhooks</em> ou <em>polling</em>)</li><li>Associar utilizadores utilizando <em>deep linking</em></li><li>Enviar uma mensagem de boas vindas e continuar a enviar notificações</li><li>Formatar as mensagens que envias</li></ul><p>Espero que este artigo tenha sido útil para ti. Esta é a quinta parte de uma série de artigos sobre o <a href="http://musicnotifier.com/" rel="noopener">MuN</a> (link em inglês). Fica atento/a à parte 6. Podes encontrar <a href="https://github.com/hmlON/mun" rel="noopener">o código deste projeto</a>, assim como os meus outros projetos na minha <a href="https://github.com/hmlON" rel="noopener">página do GitHub</a>. Segue o autor se tiveres gostado deste artigo.</p><p><em>Publicado originalmente em<em> <a href="https://kholinlabs.com/telegram-push-notifications" rel="noopener">https://kholinlabs.com/telegram-push-notifications</a></em>,<em> </em>a 12 de Fevereiro de<em> 2019.</em></em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ React para principiantes – um guia do React.js para programadores de front-end ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu O React é um dos frameworks mais populares do JavaScript alguma vez criados, e acredito que seja uma das melhores ferramentas que anda por aí. O objetivo deste manual é fornecer um guia inicial para aprender React. > Nota da tradução: grande parte dos conceitos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/</link>
                <guid isPermaLink="false">64b0062db04bf0067ce23b17</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 29 Nov 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/book-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/react-beginner-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React for Beginners – A React.js Handbook for Front End Developers</a>
      </p><blockquote>Tradução em português europeu</blockquote><p>O React é um dos <em>frameworks </em>mais populares do JavaScript alguma vez criados, e acredito que seja uma das melhores ferramentas que anda por aí.</p><p>O objetivo deste manual é fornecer um guia inicial para aprender React.</p><blockquote>Nota da tradução: grande parte dos conceitos trabalhados neste manual seguem válidos para todas as versões de React. No entanto, é importante reforçar que, desde a concepção do artigo original, o React passou por atualizações e é possível que algumas das soluções oferecidas aqui estejam diferentes em versões mais recentes.</blockquote><p>No final deste manual, terás conhecimentos básicos sobre:</p><ul><li>O que é o React e porque é tão popular</li><li>Como instalar o React</li><li>Componentes do React</li><li><em>State</em> do React</li><li><em>Props</em> do React</li><li>Manipulação de eventos de utilizador em React</li><li>Eventos de ciclo de vida num componente do React</li></ul><p>Estes tópicos serão a base sobre a qual construirás em outros tutoriais de React mais avançados.</p><p>Este manual é escrito especialmente para programadores de JavaScript que estão a começar com o React. Por isso, vamos começar.</p><h2 id="o-que-react"><strong>O que é React?</strong></h2><p>O React é uma biblioteca do JavaScript que tem o objetivo de simplificar o desenvolvimento de interfaces visuais.</p><p>Desenvolvido pela Facebook e lançado ao mundo em 2013, ele impulsiona algumas das aplicações mais utilizadas no mundo, potenciando o Facebook e o Instagram, entre outras inúmeras aplicações.</p><p>O seu objetivo principal é facilitar o raciocínio sobre uma interface e o seu estado (em inglês, <em>state</em>), a qualquer momento. O React faz isso ao dividir a UI (Interface de Utilizador, em português) numa coleção de componentes.</p><p>Podes enfrentar algumas dificuldades iniciais ao aprender React. Porém, assim que fizer o "clique", garanto-te que será uma das melhores experiências que terás. O React facilita muitas coisas e o seu ecossistema está repleto de óptimas bibliotecas e ferramentas.</p><p>O React por si só tem uma API muito pequena e, basicamente, precisas compreender quatro conceitos para começar:</p><ul><li>Componentes</li><li>JSX</li><li><em>State</em></li><li><em>Props</em></li></ul><p>Vamos explorar todos eles neste manual e vamos deixar os conceitos mais avançados para outros tutoriais. Irei fornecer algumas dicas na última secção sobre como seguir em frente.</p><p>Podes também fazer o <a href="https://flaviocopes.com/page/react-handbook/">download deste manual em PDF / ePub / formato Mobi gratuitamente</a>.</p><h2 id="resumo-do-manual"><strong>Resumo do manual</strong></h2><ul><li><a href="https://www.freecodecamp.org/portuguese/news/#quanto-javascript-precisas-saber-para-utilizar-o-react">Quanto JavaScript precisas saber para utilizar o React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#porque-deves-aprender-react">Porque deves aprender React?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#como-instalar-o-react">Como instalar o React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#componentes-do-react">Componentes do React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#introdu-o-ao-jsx">Introdução ao JSX</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#utilizar-jsx-para-compor-uma-ui">Utilizar JSX para compor uma UI</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#a-diferen-a-entre-jsx-e-html">A diferença entre JSX e HTML</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#incorporar-javascript-em-jsx">Incorporar JavaScript em JSX</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#gerir-o-state-em-react">Gerir o state em React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#props-de-componente-em-react">Props de componente em React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#fluxo-de-dados-numa-aplica-o-em-react">Fluxo de dados numa aplicação em React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#lidar-com-eventos-de-utilizador-em-react">Lidar com eventos de utilizador em React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#eventos-de-ciclo-de-vida-num-componente-react">Eventos de ciclo de vida num componente React</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/react-para-principiantes-um-guia-do-react-js-para-programadores-de-front-end/#para-onde-seguir-a-partir-daqui">Para onde seguir a partir daqui</a></li></ul><h2 id="quanto-javascript-precisas-saber-para-utilizar-o-react"><strong>Quanto JavaScript precisas saber para utilizar o React</strong></h2><p>Antes de avançar diretamente para o React, deves ter uma boa compreensão de alguns conceitos fundamentais do JavaScript.</p><p>Não precisas ser um especialista em JavaScript, mas acho que precisas de uma compreensão (textos do autor abaixo em inglês) de:</p><ul><li><a href="https://flaviocopes.com/javascript-variables/">Variáveis</a></li><li><a href="https://flaviocopes.com/javascript-arrow-functions/">Funções de seta</a></li><li><a href="https://flaviocopes.com/javascript-rest-spread/">Trabalhar com objetos e arrays utilizando Rest e Spread</a></li><li><a href="https://flaviocopes.com/javascript-destructuring/">Desestruturação de objetos e arrays</a></li><li><a href="https://flaviocopes.com/javascript-template-literals/">Literais de template</a></li><li><a href="https://flaviocopes.com/javascript-callbacks/">Funções de callback</a></li><li><a href="https://flaviocopes.com/es-modules/">Módulos da ES</a></li></ul><p>Se estes conceitos não te forem familiares, deixei alguns links para descobrires mais sobre esses assuntos.</p><h2 id="porque-deves-aprender-react"><strong>Porque deves aprender React?</strong></h2><p>Recomendo vivamente que qualquer programador para a Web tenha, pelo menos, uma compreensão básica do React.</p><p>Recomendo isto por algumas razões.</p><ol><li>O React é muito popular. Como programador, é bem provável que vás trabalhar num projeto com React no futuro. Talvez num projeto existente, ou talvez a tua equipa vai querer que trabalhes numa nova aplicação com base no React.</li><li>Hoje em dia, muitas das ferramentas são criadas utilizando o React no seu núcleo. Frameworks populares e ferramentas como Next.js, Gatsby e muitos outros utilizam React em segundo plano.</li><li>Como engenheiro de front-end, o React provavelmente surgirá numa entrevista de emprego.</li></ol><p>Estas são todas boas razões, mas uma das principais razões para eu querer que aprendas React é que o React é espetacular.</p><p>O React promove várias boas práticas de desenvolvimento, incluindo a capacidade de reutilizar o código e desenvolvimento orientado a componentes. É rápido, é leve, e a maneira como te faz pensar sobre o fluxo de dados na aplicação combina com vários cenários comuns.</p><h2 id="como-instalar-o-react"><strong>Como instalar o React</strong></h2><p>Existem algumas formas diferentes de instalar o React.</p><p>Para começar, recomendo vivamente uma abordagem, que é utilizar a ferramenta oficial recomendada, chamada <code>create-react-app</code>.</p><p><code>create-react-app</code> é uma aplicação de linha de comandos, que tem o objetivo de te colocar a par do React sem demoras.</p><p>Começas por utilizar o <code>npx</code>, que é uma forma fácil de descarregar e executar comandos do Node.js sem ter de instalá-los.</p><blockquote><em>Vê o meu guia sobre o<em> npx </em>aqui<em>: </em></em><a href="https://flaviocopes.com/npx/"><em><em>https://flaviocopes.com/npx/</em></em></a><em> (em inglês)</em></blockquote><p>O <code>npx</code> vem com o <code>npm</code> (desde a versão 5.2). Se ainda não tiveres nenhum npm instalado, instala agora a partir de <a href="https://nodejs.org/">https://nodejs.org</a> (o npm é instalado com o Node).</p><p>Se não tiveres a certeza que versão tens do npm, executa <code>npm -v</code> para verificar se precisas de atualizar.</p><blockquote><em>Dica<em>: </em>analisa o meu tutorial sobre o terminal<em> OSX</em>, disponível em<em> <a href="https://flaviocopes.com/macos-terminal/">https://flaviocopes.com/macos-terminal/</a></em> (em inglês),<em> </em>caso ainda não te sintas à vontade a utilizar o<em> terminal. </em>Aplica-se<em> </em>ao<em> Mac </em>e ao<em> Linux.</em></em></blockquote><p>Quando executas <code>npx create-react-app &lt;app-name&gt;</code>, o <code>npx</code> <em>irá descarregar</em> a versão mais recente de <code>create-react-app</code>. Executa-a, e de seguida, remove-a do teu sistema.</p><p>Isto é ótimo porque nunca vais ter uma versão desatualizada no teu sistema, e sempre que a executares, iras obter a versão mais recente e o melhor código disponível.</p><p>Vamos então começar:</p><pre><code class="language-sh">npx create-react-app todolist
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-start.png" class="kg-image" alt="cra-start" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/cra-start.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/cra-start.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-start.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="789" loading="lazy"></figure><p>Isto é quando termina a execução:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/create-react-app-finished.png" class="kg-image" alt="create-react-app-finished" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/create-react-app-finished.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/create-react-app-finished.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/create-react-app-finished.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="789" loading="lazy"></figure><p><code>create-react-app</code> criou uma estrutura de ficheiros na pasta que indicaste (<code>todolist</code>, neste caso), e inicializou um repositório <a href="https://flaviocopes.com/git/">Git</a>.</p><p>Também adicionou alguns comandos no ficheiro <code>package.json</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/0038f8fe-17b1-40af-b4e8-3b47710ea294.png" class="kg-image" alt="0038f8fe-17b1-40af-b4e8-3b47710ea294" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/0038f8fe-17b1-40af-b4e8-3b47710ea294.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/0038f8fe-17b1-40af-b4e8-3b47710ea294.png 925w" sizes="(min-width: 720px) 720px" width="925" height="1039" loading="lazy"></figure><blockquote>Nota da tradução: como é possível ver na parte das dependências, a versão na época da criação deste artigo é a versão 16.14.0. A versão atual, no momento em que esta tradução foi realizada, é a 18.2.0.</blockquote><p>Então, podes iniciar imediatamente a aplicação ao seguir para a pasta da aplicação recentemente criada e executando <code>npm start</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-running.png" class="kg-image" alt="cra-running" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/cra-running.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-running.png 925w" sizes="(min-width: 720px) 720px" width="925" height="539" loading="lazy"></figure><p>De início, este comando executa a aplicação na tua porta local 3000, e abre o teu navegador, apresentando o ecrã de boas vindas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-browser.png" class="kg-image" alt="cra-browser" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/cra-browser.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/cra-browser.png 940w" sizes="(min-width: 720px) 720px" width="940" height="985" loading="lazy"></figure><p>Agora, está tudo pronto para trabalhares na aplicação!</p><h2 id="componentes-do-react"><strong>Componentes do React</strong></h2><p>Na última secção, viste como criar a tua primeira aplicação de React.</p><p>Esta aplicação vem com uma série de ficheiros que fazem várias coisas, em maior parte, relacionadas com a configuração, mas existe um ficheiro que se destaca: <code>App.js</code>.</p><p><code>App.js</code> é o <strong>primeiro Componente do<strong> React</strong></strong> que vais conhecer.</p><p>Este é o código dele:</p><pre><code class="language-js">import React from 'react'
import logo from './logo.svg'
import './App.css'

function App() {
  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;img src={logo} className="App-logo" alt="logo" /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
        &lt;/p&gt;
        &lt;a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        &gt;
          Learn React
        &lt;/a&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  )
}

export default App
</code></pre><p>Uma aplicação criada utilizando React, ou um dos outros <em>frameworks </em>de front-end populares, como Vue e Svelte, por exemplo, é criada utilizando dezenas de componentes.</p><p>Vamos começar, no entanto, por analisar o primeiro componente. Vou simplificar o código deste componente, assim:</p><pre><code class="language-js">import React from 'react'
import logo from './logo.svg'
import './App.css'

function App() {
  return /* algo */
}

export default App
</code></pre><p>Podes ver algumas coisas aqui. <em>I<em>mpor</em>tamos</em> algumas coisas e <em><em>expor</em>tamos</em> uma função chamada <code>App</code>.</p><p>As coisas que importamos são, neste caso, uma biblioteca do JavaScript (o pacote de npm <code>react</code>), uma imagem SVG e um ficheiro CSS.</p><blockquote><code><em><em>create-react-app</em></em></code><em><em> </em>está configurado num modo que nos permite importar imagens e <em>CSS </em>para utilizar no nosso<em> JavaScript, </em>mas isto não é algo que tenhamos de nos preocupar para já<em>. </em>O que precisas de te preocupar é o conceito de um<em> </em></em><strong><strong><em><em>component</em></em></strong><em>e</em></strong></blockquote><p><code>App</code> é uma função que, no exemplo original, retorna algo que, à primeira vista, tem um aspeto muito estranho.</p><p>Parece ser <strong><strong>HTML</strong></strong> mas tem algum JavaScript incorporado.</p><p>Isto é <strong><strong>JSX</strong></strong>, uma linguagem especial que utilizamos para criar o resultado de um componente. Vamos falar mais sobre o JSX na próxima secção.</p><p>Para além de definir algum JSX para ser retornado, um componente tem muitas outras características.</p><p>Um componente pode ter o seu próprio <strong><strong><em>state</em></strong></strong>, que significa que encapsula algumas variáveis que outros componentes não conseguem aceder, a não ser que este componente exponha o <em>state</em> para a restante aplicação.</p><p>Um componente também pode receber dados de outros componentes. Neste caso, estamos a falar sobre <strong><strong><em>props</em></strong></strong>.</p><p>Não te preocupes, em breve vamos olhar com mais detalhes para todos estes termos (JSX, State e Props).</p><h2 id="introdu-o-ao-jsx"><strong>Introdução ao JSX</strong></h2><p>Não podemos falar sobre React sem explicar primeiro o JSX.</p><p>Na última secção, ficaste a conhecer o teu primeiro componente React, o componente <code>App</code> definido na aplicação predefinida criada pelo <code>create-react-app</code>.</p><p>O seu código era o seguinte:</p><pre><code class="language-js">import React from 'react'
import logo from './logo.svg'
import './App.css'

function App() {
  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;img src={logo} className="App-logo" alt="logo" /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
        &lt;/p&gt;
        &lt;a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        &gt;
          Learn React
        &lt;/a&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  )
}

export default App
</code></pre><p>Anteriormente, ignoramos tudo o que estava dentro da instrução <code>return</code>, mas, nesta secção, vamos falar sobre isso.</p><p>Chamamos JSX a tudo o que esteja entre os parênteses do que é retornado pelo componente:</p><pre><code class="language-jsx">&lt;div className="App"&gt;
  &lt;header className="App-header"&gt;
    &lt;img src={logo} className="App-logo" alt="logo" /&gt;
    &lt;p&gt;
      Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
    &lt;/p&gt;
    &lt;a
      className="App-link"
      href="https://reactjs.org"
      target="_blank"
      rel="noopener noreferrer"
    &gt;
      Learn React
    &lt;/a&gt;
  &lt;/header&gt;
&lt;/div&gt;
</code></pre><p>Isto <em>parece</em> HTML, mas não é realmente HTML. É um pouco diferente.</p><p>É um pouco estranho ter este código dentro de um ficheiro JavaScript. Isto não se parece nada com JavaScript!</p><p>Em segundo plano, o React irá processar o JSX e vai transformá-lo em JavaScript, que o navegador será capaz de interpretar.</p><p>Então, estamos a escrever JSX, mas, no final, existe um passo de tradução que o torna legível para um interpretador de JavaScript.</p><p>O React fornece-nos esta interface por uma razão: <strong>é mais fácil criar interfaces de<strong> UI </strong>utilizando<strong> JSX</strong></strong>.</p><p>Assim que estiveres mais à vontade com o JSX, claro.</p><p>Na próxima secção, vamos falar sobre como o JSX te permite compor facilmente uma UI, e depois vamos ver as diferenças em relação ao "HTML normal" que precisas saber.</p><h2 id="utilizar-jsx-para-compor-uma-ui"><strong>Utilizar JSX para compor uma UI</strong></h2><p>Tal como introduzido na secção anterior, um dos principais benefícios do JSX é que torna muito fácil criar uma UI.</p><p>Em particular, num componente do React, podes importar outros componentes do React e podes incorporá-los e exibi-los.</p><p>Um componente do React é geralmente criado no seu próprio ficheiro, porque é assim que podemos facilmente reutilizá-lo (ao importá-lo) em outros componentes.</p><p>Um componente do React, no entanto, também pode ser criado no mesmo ficheiro de outro componente, se planeares utilizá-lo apenas nesse componente. Aqui não existe uma "regra", podes fazer o que achares melhor.</p><p>Eu geralmente utilizo ficheiros separados quando o número de linhas fica muito grande.</p><p>Para manter as coisas simples, vamos criar um componente no mesmo ficheiro <code>App.js</code>.</p><p>Vamos criar um componente <code>WelcomeMessage</code>:</p><pre><code class="language-js">function WelcomeMessage() {
  return &lt;p&gt;Welcome!&lt;/p&gt;
}
</code></pre><p>Vês? É uma simples função que retorna uma linha de JSX, que representa um elemento de HTML <code>p</code>.</p><p>Vamos adicioná-lo ao ficheiro <code>App.js</code>.</p><p>Agora, dentro do componente de JSX <code>App</code>, podemos adicionar <code>&lt;WelcomeMessage /&gt;</code> para exibir este componente na interface de utilizador:</p><pre><code class="language-js">import React from 'react'
import logo from './logo.svg'
import './App.css'

function WelcomeMessage() {
  return &lt;p&gt;Welcome!&lt;/p&gt;
}

function App() {
  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;img src={logo} className="App-logo" alt="logo" /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
        &lt;/p&gt;
        &lt;WelcomeMessage /&gt;
        &lt;a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        &gt;
          Learn React
        &lt;/a&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  )
}

export default App
</code></pre><p>Aqui está o resultado. Consegues ver a mensagem "Welcome!" (em português, "boas-vindas") no ecrã?</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/new-component.png" class="kg-image" alt="new-component" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/new-component.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/new-component.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/new-component.png 1392w" sizes="(min-width: 720px) 720px" width="1392" height="1092" loading="lazy"></figure><p>Dizemos que <code>WelcomeMessage</code> é um <strong><strong>c</strong>omponente-filho</strong> de App, e <code>App</code> é o seu <strong>componente-pai</strong>.</p><p>Vamos adicionar o componente <code>&lt;WelcomeMessage /&gt;</code> como se fizesse parte da linguagem HTML.</p><p>Esta é a beleza dos componentes React e do JSX: podemos compor uma interface de uma aplicação e utilizá-la como se estivéssemos a escrever HTML.</p><p>Com algumas diferenças, como veremos na próxima secção.</p><h2 id="a-diferen-a-entre-jsx-e-html"><strong>A diferença entre JSX e HTML</strong></h2><p>O JSX parece mais ou menos HTML, mas não é.</p><p>Neste secção, quero apresentar-te algumas das coisas mais importantes que precisas ter em mente ao utilizar o JSX.</p><p>Uma das diferenças pode ser bastante óbvia se observaste o componente de JSX <code>App</code>: existe um atributo estranho chamado <code>className</code>.</p><p>Em HTML, utilizamos o atributo <code>class</code>. É provavelmente o atributo mais utilizado, por várias razões. Uma dessas razões é o CSS. O atributo <code>class</code> permite-nos estilizar facilmente elementos de HTML. Frameworks de CSS, como o Tailwind, colocam este atributo no centro do processo de design em CSS da interface de utilizador.</p><p>Existe um problema, contudo. Estamos a escrever o código desta UI num ficheiro de JavaScript e o atributo <code>class</code> na linguagem de programação JavaScript é uma palavra reservada. Isto quer dizer que não podemos utilizar esta palavra reservada como quisermos. Ela serve um propósito específico (definir classes de JavaScript) e os criadores do React tiveram de escolher um nome diferente.</p><p>Foi assim que acabamos com <code>className</code> em vez de <code>class</code>.</p><p>Vais ter de memorizar isso, especialmente quando estiveres a copiar/colar algum HTML existente.</p><p>O React vai fazer o seu melhor para impedir que as coisas quebrem, mas irá criar uma série de alertas nas Ferramentas de Programador:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/className.png" class="kg-image" alt="className" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/className.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/className.png 776w" sizes="(min-width: 720px) 720px" width="776" height="156" loading="lazy"></figure><p>Esta não é a única funcionalidade do HTML que sofre deste problema, mas é uma das mais comuns.</p><p>Outra grande diferença entre JSX e HTML é que o HTML é muito <em><em>relax</em>ado</em>, digamos. Mesmo que tenhas um erro na sintaxe, ou tenhas fechado incorretamente uma tag, ou tenhas uma discrepância, o browser fará o seu melhor para tentar interpretar o HTML sem dar problemas.</p><p>É uma das principais funcionalidades da Web. É muito indulgente.</p><p>O JSX não perdoa. Se te esqueceres de fechar uma tag, receberás uma mensagem clara de erro:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/11/jsx-error.png" class="kg-image" alt="jsx-error" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/11/jsx-error.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/11/jsx-error.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/11/jsx-error.png 1057w" sizes="(min-width: 720px) 720px" width="1057" height="1092" loading="lazy"></figure><blockquote><em>O <em>React </em>geralmente fornece mensagens de erro muito boas e informativas que te apontam na direção correta para resolver o problema<em>.</em></em></blockquote><p>Outra grande diferença entre JSX e HTML é que em JSX podemos incorporar JavaScript.</p><p>Vamos falar sobre isto na próxima secção.</p><h2 id="incorporar-javascript-em-jsx"><strong>Incorporar JavaScript em JSX</strong></h2><p>Uma das melhores funcionalidades do React é que podemos facilmente incorporar JavaScript no JSX.</p><p>Outros <em>frameworks</em> de frontend, por exemplo Angular e Vue, têm as suas próprias formas específicas de imprimir valores JavaScript no <em>template</em>, ou realizar coisas como ciclos.</p><p>O React não adiciona coisas novas. Em vez disso, permite-nos utilizar JavaScript no JSX, ao utilizar chavetas.</p><p>O primeiro exemplo disto que te vou apresentar vem diretamente do componente <code>App</code> que temos estado a estudar até agora.</p><p>Importamos o ficheiro SVG <code>logo</code> utilizando o comando</p><pre><code class="language-js">import logo from './logo.svg'
</code></pre><p>e de seguida, no JSX, atribuímos este ficheiro SVG ao atributo <code>src</code> de uma tag <code>img</code>:</p><pre><code class="language-js">&lt;img src={logo} className="App-logo" alt="logo" /&gt;
</code></pre><p>Vamos fazer outro exemplo. Vamos supor que o componente <code>App</code> tem uma variável chamada <code>message</code>:</p><pre><code class="language-js">function App() {
  const message = 'Hello!'
  //...
}
</code></pre><p>Podemos imprimir este valor no JSX ao adicionar <code>{message}</code> em qualquer local do JSX.</p><p>Dentro das chavetas <code>{ }</code>, podemos adicionar qualquer instrução JavaScript, mas <em>apenas uma</em> instrução por cada bloco de chavetas.</p><p>Á instrução deve retornar algo.</p><p>Por exemplo, esta é uma instrução comum que irás encontrar em JSX. Temos um operador ternário onde definimos uma condição (<code>message === 'Hello!'</code>), e imprimimos um valor caso a condição seja verdadeira, ou outro valor (o conteúdo de <code>message</code>, neste caso) caso a condição seja falsa:</p><pre><code class="language-js">{
  message === 'Hello!' ? 'The message was "Hello!"' : message
}
</code></pre><h2 id="gerir-o-state-em-react"><strong>Gerir o <em>state</em> em React</strong></h2><p>Qualquer componente React pode ter o seu próprio <strong><strong><em>state</em></strong></strong>.</p><p>O que queremos dizer com <em><em>state</em></em>? O <em>state</em> é o <strong>conjunto de dados<strong> </strong>que é gerido pelo componente</strong>.</p><p>Imagina um formulário, por exemplo. Cada elemento <em>input</em> individual do formulário é responsável pela gestão do seu <em>state</em>: o que está escrito dentro dele.</p><p>Um botão está responsável por saber se está a ser clicado ou não. Se está a ser focado.</p><p>Um link está responsável por saber se o rato está por cima dele.</p><p>Em React, ou em qualquer framework/biblioteca com base em componentes, todas as nossas aplicações são baseadas e utilizam muito o <em>state</em> do componente.</p><p>Gerimos o <em>state</em> através do utilitário <code>useState</code> fornecido pelo React. É tecnicamente um <strong><strong><em>hook</em></strong></strong> (não precisas saber os detalhes dos <em>hooks</em> por enquanto, mas é o que isto é).</p><p>Importas o <code>useState</code> do React desta forma:</p><pre><code class="language-js">import React, { useState } from 'react'
</code></pre><p>Ao chamar <code>useState()</code>, irás receber uma nova variável de <em>state</em> e uma função que podemos chamar para alterar o seu valor.</p><p><code>useState()</code> aceita o valor inicial do item de <em>state</em> e retorna um array que contém a variável de <em>state</em> e a função que chamas para alterar o <em>state</em>.</p><p>Exemplo:</p><pre><code class="language-js">const [count, setCount] = useState(0)
</code></pre><p>Isto é importante. Não podemos simplesmente alterar diretamente o valor de uma variável de <em>state</em>. Temos de chamar a sua função de modificação. Caso contrário, o componente React não ira atualizar a sua UI para refletir as alterações feitas aos dados.</p><p>Chamar o modificador é a maneira com que podemos indicar ao React que o <em>state</em> de um componente foi alterado.</p><p>A sintaxe é um pouco estranha, não é? Visto que <code>useState()</code> retorna um array, utilizamos desestruturação de array para aceder a cada item individual, assim: <code>const [count, setCount] = useState(0)</code></p><p>Aqui está um exemplo prático:</p><pre><code class="language-js">import { useState } from 'react'

const Counter = () =&gt; {
  const [count, setCount] = useState(0)

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;Click me&lt;/button&gt;
    &lt;/div&gt;
  )
}

ReactDOM.render(&lt;Counter /&gt;, document.getElementById('app'))
</code></pre><p>Podes adicionar quantas chamadas <code>useState()</code> quiseres para criar quantas variáveis de <em>state</em> quiseres:</p><pre><code class="language-js">const [count, setCount] = useState(0)
const [anotherCounter, setAnotherCounter] = useState(0)
</code></pre><h2 id="props-de-componente-em-react"><strong><em>Props</em> de componente em React</strong></h2><p>Chamamos <code>props</code> aos valores iniciais passados para um componente.</p><p>Anteriormente, criamos um componente <code>WelcomeMessage</code></p><pre><code class="language-js">function WelcomeMessage() {
  return &lt;p&gt;Welcome!&lt;/p&gt;
}
</code></pre><p>e utilizamos o componente desta maneira:</p><pre><code class="language-js">&lt;WelcomeMessage /&gt;
</code></pre><p>Este componente não tem nenhum valor inicial. Não tem nenhum <em>prop</em>.</p><p>Os <em>props </em>podem ser passados como atributos para o componente no JSX:</p><pre><code class="language-js">&lt;WelcomeMessage myprop={'somevalue'} /&gt;
</code></pre><p>Dentro do componente, recebemos os <em>props </em>como argumentos:</p><pre><code class="language-js">function WelcomeMessage(props) {
  return &lt;p&gt;Welcome!&lt;/p&gt;
}
</code></pre><p>É comum utilizar desestruturação de objetos para obter os <em>props </em>pelo nome:</p><pre><code class="language-js">function WelcomeMessage({ myprop }) {
  return &lt;p&gt;Welcome!&lt;/p&gt;
}
</code></pre><p>Agora que temos o <em>prop</em>, podemos utilizá-lo dentro do componente. Por exemplo, podemos imprimir o seu valor no JSX:</p><pre><code class="language-js">function WelcomeMessage({ myprop }) {
  return &lt;p&gt;{myprop}&lt;/p&gt;
}
</code></pre><p>Aqui, as chavetas têm vários significados. No caso do argumento da função, as chavetas são utilizadas como parte da sintaxe de desestruturação do objeto.</p><p>De seguida, utilizamos as chavetas para definir o bloco de código da função, e por fim, no JSX, para imprimir o valor em JavaScript.</p><p>Passar <em>props </em>para os componentes é uma boa forma de transmitir valores na tua aplicação.</p><p>Um componente armazena dados (tem <em>state</em>) ou recebe dados através dos seus <em>props</em>.</p><p>Também podemos enviar funções como <em>props</em>. Por isso, um componente-filho pode chamar uma função no componente-pai.</p><p>Um <em>prop </em>especial, chamado <code>children</code>, contém o valor de tudo o que é passado entre as tags de abertura e de fecho do componente, por exemplo:</p><pre><code class="language-html">&lt;WelcomeMessage&gt; Here is some message &lt;/WelcomeMessage&gt;
</code></pre><p>Neste caso, dentro de <code>WelcomeMessage</code>, poderíamos aceder ao valor <code>Here is some message</code> ao utilizar o <em>prop </em><code>children</code>:</p><pre><code class="language-js">function WelcomeMessage({ children }) {
  return &lt;p&gt;{children}&lt;/p&gt;
}
</code></pre><h2 id="fluxo-de-dados-numa-aplica-o-em-react"><strong>Fluxo de dados numa aplicação em React</strong></h2><p>Numa aplicação em React, os dados geralmente fluem de um componente-pai para um componente-filho utilizando <em>props</em>, tal como vimos na secção anterior:</p><pre><code class="language-js">&lt;WelcomeMessage myprop={'somevalue'} /&gt;
</code></pre><p>Se passares uma função para o componente-filho, podes alterar o <em>state</em> do componente-pai a partir de um componente-filho:</p><pre><code class="language-js">const [count, setCount] = useState(0)

&lt;Counter setCount={setCount} /&gt;
</code></pre><p>Dentro do componente <em>Counter</em>, podemos agora pegar no prop <code>setCount</code> e chamá-lo para atualizar o <em>state</em> de <code>count</code> no componente-pai, quando algo acontece:</p><pre><code class="language-js">function Counter({ setCount }) {
  //...

  setCount(1)

  //...
}
</code></pre><p>É preciso saberes que existem formas mais avançadas de gerir dados, que incluem a API <em>Context</em> e bibliotecas como Redux. Estas formas, contudo, trazem mais complexidade. Em 90% das vezes, as duas maneiras que acabei de te explicar são a solução ideal.</p><h2 id="lidar-com-eventos-de-utilizador-em-react"><strong>Lidar com eventos de utilizador em React</strong></h2><p>O React fornece uma forma fácil de gerir eventos acionados a partir de eventos DOM, como cliques, eventos de formulário, entre outros.</p><p>Vamos falar sobre eventos de clique, que são bastante simples de digerir.</p><p>Podes utilizar o atributo <code>onClick</code> em qualquer elemento JSX:</p><pre><code class="language-js">&lt;button
  onClick={(event) =&gt; {
    /* gerir o evento */
  }}
&gt;
  Click here
&lt;/button&gt;
</code></pre><p>Quando o elemento é clicado, a função passada para o atributo <code>onClick</code> é acionada.</p><p>Podes definir esta função fora do JSX:</p><pre><code class="language-js">const handleClickEvent = (event) =&gt; {
  /* gerir o evento */
}

function App() {
  return &lt;button onClick={handleClickEvent}&gt;Click here&lt;/button&gt;
}
</code></pre><p>Quando o evento <code>click</code> é aciona no botão, o React chama a função do gestor de eventos.</p><p>O React suporta uma grande variedade de tipos de eventos, como <code>onKeyUp</code>, <code>onFocus</code>,<code>onChange</code>, <code>onMouseDown</code>, <code>onSubmit</code> e muito outros.</p><h2 id="eventos-de-ciclo-de-vida-num-componente-react"><strong>Eventos de ciclo de vida num componente React</strong></h2><p>Até agora, vimos como gerir o <em>state</em> com o <em>hook</em> <code>useState</code>.</p><p>Existe outro <em>hook</em> que te quero introduzir neste manual: <code>useEffect</code>.</p><p>O <em>hook</em> <code>useEffect</code> permite aos componentes terem acesso aos eventos de ciclo de vida de um componente.</p><p>Quando chamas o <em>hook</em>, passas-lhe uma função. A função será executada pelo React quando o componente é renderizado pela primeira vez, e em todas as re-renderizações/atualizações subsequentes.</p><p>O React atualiza primeiro o DOM, e depois chama qualquer função passada para <code>useEffect()</code>.</p><p>Tudo isto ocorre sem bloquear a renderização da UI, mesmo no código de bloqueio.</p><p>Aqui está um exemplo:</p><pre><code class="language-js">const { useEffect, useState } = React

const CounterWithNameAndSideEffect = () =&gt; {
  const [count, setCount] = useState(0)

  useEffect(() =&gt; {
    console.log(`You clicked ${count} times`)
  })

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;Click me&lt;/button&gt;
    &lt;/div&gt;
  )
}
</code></pre><p>Visto que a função <code>useEffect()</code> é executada em todas as renderizações/atualizações subsequentes de um componente, podemos dizer ao React para passá-la à frente, para efeitos de desempenho. Fazemos isto ao adicionar um segundo parâmetro que é um <em>array </em>que contém uma lista de variáveis de <em>state</em> a ter em atenção.</p><p>O React irá executar novamente o efeito secundário apenas se um dos itens neste <em>array </em>for alterado.</p><pre><code class="language-js">useEffect(() =&gt; {
  console.log(`Hi ${name} you clicked ${count} times`)
}, [name, count])
</code></pre><p>Da mesma maneira, podes dizer ao React para executar o efeito secundário apenas uma vez (no início), ao passar um <em>array </em>vazio:</p><pre><code class="language-js">useEffect(() =&gt; {
  console.log(`Component mounted`)
}, [])
</code></pre><p>Podes vir a utilizar essa opção muitas vezes.</p><p><code>useEffect()</code> é ótimo para adicionar registos, aceder a APIs externas, e muito mais.</p><h2 id="para-onde-seguir-a-partir-daqui"><strong>Para onde seguir a partir daqui</strong></h2><p>Dominar os tópicos explicados neste artigo é um grande passo no teu objetivo de aprender React.</p><p>Agora quero dar-te algumas dicas, porque é fácil perderes-te no mar de tutoriais e cursos sobre o React.</p><p>O que deves aprender a seguir? (os links citados pelo autor abaixo estão todos em inglês)</p><p>Aprende mais sobre o <a href="https://flaviocopes.com/react-virtual-dom/">DOM Virtual</a>, <a href="https://flaviocopes.com/react-declarative/">escrever código declarativo</a>, <a href="https://flaviocopes.com/react-unidirectional-data-flow/">fluxo de dados unidirecional</a>, <a href="https://flaviocopes.com/react-immutability/">imutabilidade</a>, <a href="https://flaviocopes.com/react-composition/">composição</a>.</p><p>Começa a criar algumas aplicações simples em React. Por exemplo, <a href="https://flaviocopes.com/react-example-counter/">cria um simples contador</a> ou uma <a href="https://flaviocopes.com/react-example-githubusers/">interação com uma API pública</a>.</p><p>Aprende como fazer <a href="https://flaviocopes.com/react-conditional-rendering/">renderizações condicionais</a>, como fazer <a href="https://flaviocopes.com/react-how-to-loop/">ciclos em JSX</a>, como utilizar as <a href="https://flaviocopes.com/react-developer-tools/">Ferramentas de Programador do React</a>.</p><p>Aprende como aplicar CSS numa aplicação em React, com <a href="https://flaviocopes.com/react-css/">CSS simples</a> ou <a href="https://flaviocopes.com/styled-components/">componentes estilizados</a>.</p><p>Aprende a gerir o <em>state</em> utilizando a <a href="https://flaviocopes.com/react-context-api/">API Context</a>, useContext e <a href="https://flaviocopes.com/redux/">Redux</a>.</p><p>Aprende como interagir com <a href="https://flaviocopes.com/react-forms/">formulários</a>.</p><p>Aprende como utilizar o <a href="https://flaviocopes.com/react-router/">Router do React</a>.</p><p>Aprende <a href="https://flaviocopes.com/react-testing-components/">como testar aplicações React</a>.</p><p>Aprende uma aplicação de <em>framework </em>construída sobre o React, como <a href="https://flaviocopes.com/gatsby/">Gatsby</a> ou <a href="https://flaviocopes.com/nextjs/">Next.js</a>.</p><p>Acima de tudo, não te esqueças de praticar ao criar aplicações simples para aplicar tudo o que aprendeste.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Muito obrigado por leres este guia.</p><p>Espero que te inspire a aprender mais sobre o React e tudo o que podes fazer com ele!</p><p>Lembra-te que podes fazer <a href="https://flaviocopes.com/page/react-handbook/">download deste manual em PDF / ePub / e formato Mobi gratuitamente</a>, caso queiras.</p><p>O autor publica tutoriais de programação com frequência em seu site, <a href="https://flaviocopes.com/">flaviocopes.com</a>, se quiseres dar uma vista de olhos a outros bons conteúdos como este.</p><p>Podes entrar em contacto com o autor no Twitter: <a href="https://twitter.com/flaviocopes">@flaviocopes</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Qual é a diferença entre escrever código e programar? ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução em português europeu  Demorei algum tempo a compreender o que os termos programar e escrever código  realmente significam e o que cada campo implica. Tenho a certeza de que não sou o único que ficou confuso com estes termos quando estava a começar na área da ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/qual-e-a-diferenca-entre-escrever-codigo-e-programar/</link>
                <guid isPermaLink="false">64b00658b04bf0067ce23b1d</guid>
                
                    <category>
                        <![CDATA[ Programação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Mon, 09 Oct 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/key-difference-between-coding-and-programming--2-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/difference-between-coding-and-programming/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is the Difference Between Coding and Programming?</a>
      </p><blockquote>Tradução em português europeu </blockquote><p>Demorei algum tempo a compreender o que os termos <strong><strong>program</strong>ar</strong> e <strong>escrever código</strong> realmente significam e o que cada campo implica. Tenho a certeza de que não sou o único que ficou confuso com estes termos quando estava a começar na área da tecnologia.</p><p>Durante algum tempo pensei que eram a mesma coisa e demorei algum tempo a perceber que existem diferenças entre os dois "mundos".</p><p>Neste artigo, vou explicar as diferenças básicas entre escrever código e programar, como cada um funciona e como trabalham em colaboração para desenvolver aplicações e sites.</p><p>Então, vamos explorar estes termos e como os profissionais os utilizam, começando por compreender o que eles significam.</p><h2 id="o-que-escrever-c-digo"><strong>O que é escrever código?</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/Untitled-design.png" class="kg-image" alt="Untitled-design" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/Untitled-design.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/Untitled-design.png 663w" width="663" height="398" loading="lazy"></figure><p>Podes ter visto cursos, bootcamps ou artigos a falar sobre escrever código – então porque enfatizamos este termo?</p><p>Isto acontece porque o simples ato de escrever código torna possível fazermos todas as coisas interessantes que fazemos todos os dias. Permite-nos utilizar aplicações <em>mobile</em>, trabalhar com programas diferentes e operar sistemas, e até mesmo brincar com os jogos que amamos, ou visitar o website onde estás a ler este artigo. É tudo possível através da escrita de código.</p><p>Então, o que é escrever código em termos simples?</p><p>Podemos definir a escrita de código como sendo o ato de traduzir instruções para um computador, de uma linguagem humana para uma linguagem que uma máquina consiga compreender. O código indica ao computador como se comportar e que ações deve realizar.</p><p>Se quiseres tornar-te um/a escritor/a de código, vais precisar de ter alguns conhecimentos básicos sobre linguagens de programação. Quando digo linguagens de programação, quero dizer linguagens como: Python, Java, Go, PHP ou JavaScript, só para mencionar algumas.</p><p>Abaixo está um bom exemplo de código escrito na linguagem Python, que irá converter qualquer <em><em>PDF</em></em> num <em><em>Audiobook</em></em>:</p><pre><code class="language-python">import PyPDF2                     # pip install pypdf
import pyttsx3                    # pip install pyttsx3
from tkinter.filedialog import *  # pip install tkinter

book = askopenfilename()
pdfReader = PyPDF2.PdfFileReader(book)

pages = pdfReader.numPages

for num in range(0, pages):
    page = pdfReader.getPage(num)
    text = page.extractText()
    speak = pyttsx3.init()
    speak.say(text)
    speak.runAndWait()
</code></pre><h2 id="o-que-programa-o"><strong>O que é programação?</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh.png" class="kg-image" alt="fresh" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/fresh.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh.png 663w" width="663" height="398" loading="lazy"></figure><p>Provavelmente, também já ouviste alguém a dizer, <em><em>"</em>Sou programador/a<em>"</em></em>. Algumas pessoas que utilizam este termo têm noção do significado do termo, enquanto outras pessoas não. Se não souberes exatamente o que significa programação, vamos tentar alcançar alguns esclarecimentos ao compreender o que realmente é programar.</p><p>Programar é o processo de criar as instruções que vão indicar ao computador como realizar uma tarefa em particular que lhe seja atribuída. Fazes isto ao utilizar linguagens de programação como:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh--1-.png" class="kg-image" alt="fresh--1-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/fresh--1-.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh--1-.png 663w" width="663" height="398" loading="lazy"></figure><p>Quando falamos de programação, pensa em algo como um controlo remoto da tua televisão – ele aguardará que tu lhe dês instruções ao pressionar diferentes botões, que por sua vez, indicam à televisão para realizar uma tarefa específica (como mudar de canal, aumentar o volume e assim adiante). Bem, é o mesmo modo com que os programadores podem instruir um computador a fazer várias coisas.</p><p>Com programação, podes fazer praticamente tudo – como programar robôs para ajudar nas lides domésticas, ou até mesmo programar carros autónomos como a Tesla.</p><p>De maneira a que um programador desenvolva um programa que implemente a sua ideia, é necessário realizar as seguintes tarefas:</p><ul><li>Planear a estrutura da aplicação (com a ajuda de ferramentas como o<em><em> Trello</em></em>)</li><li>Criar o design da aplicação (<em>ao utilizar ferramentas como<em> Figma o</em>u<em> Adobe</em>XD</em>)</li><li>Desenvolvê-la (<em>ao utilizar a sua linguagem de programação de eleição</em>)</li><li>Testar as suas funcionalidades</li><li>Implementá-la (<em>quer num serviço de alojamento gratuito quer pago</em>)</li><li>Fazer a manutenção depois de estar terminada.</li></ul><p>Por isso, como podes ver, podemos dizer que a programação não lida apenas com a própria escrita do código. Também envolve a utilização de estruturas de dados e algoritmos e, em geral, lidar com o panorama geral da criação e desenvolvimento de sistemas complexos.</p><h2 id="a-diferen-a-entre-escrever-c-digo-e-programar"><strong>A diferença entre escrever código e programar</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh--2-.png" class="kg-image" alt="fresh--2-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/10/fresh--2-.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/10/fresh--2-.png 663w" width="663" height="398" loading="lazy"></figure><p>Vamos dividir as diferenças em quatro categorias principais, o que nos vai ajudar a decompor os conceitos e compreendê-los melhor.</p><h3 id="a-terminologia"><strong>A terminologia</strong></h3><p><em><strong>Escrever código</strong></em> lida com colocar o código numa linguagem compreendida tanto por máquinas como por humanos. O foco principal da escrita de código é fornecer comunicação entre os dois (humanos e computadores).</p><p><em><em><strong><strong>Program</strong></strong></em><strong>ação</strong></em> envolve criar perfil e estrutura para o código de um programa, que segue determinados padrões, antes de o código em si ser escrito para realizar a tarefa que necessita realizar.</p><h3 id="as-ferramentas-que-utilizas"><strong>As ferramentas que utilizas</strong></h3><p>No que diz respeito a <em><strong>escrita de código</strong></em>, uma das ferramentas mais importantes será o teu editor de texto (como o Bloco de notas, ou algo mais complexo e rico em funcionalidades, como o Visual Studio Code, Sublime, Atom ou Vim).</p><p>Quando falamos de <em><strong>p</strong><em><strong><strong>rogram</strong></strong></em><strong>ação</strong></em>, por outro lado, precisas adicionar algumas outras ferramentas. Como programador/a, irás realizar revisões de documentos, fazer muito planeamento, pensar em design e assim adiante.</p><p>Para te ajudar nestas tarefas, vais utilizar ferramentas como editores de código mais avançados, ferramentas de análise, depuradores, <em>frameworks </em>de modelação, ferramentas de montagem, algoritmos de modelação e muito mais.</p><p>Como programador/a, vais precisar de ter muita experiência a utilizar estas ferramentas e mais exposição ao processo que os programadores utilizam para criar aplicações e outros produtos.</p><h3 id="o-teu-n-vel-de-conhecimentos"><strong>O teu nível de conhecimentos</strong></h3><p>Como <em><strong>escritor/a de código,</strong></em> ter conhecimentos básicos de uma linguagem de programação e a sua sintaxe é um bom começo. Assim que souberes como escrever código numa linguagem, fica mais fácil aprender outras. Novamente, o teu principal objetivo está na escrita no próprio código que indica à máquina o que fazer.</p><p>Por outro lado, os/as <em><em><strong><strong>program</strong></strong></em><strong>adores/as</strong></em> precisam de mais conhecimentos. Vais precisar de saber como criar e trabalhar com algoritmos, como desenhar sites, como depurar e testar o teu código, como gerir projetos, e claro, como trabalhar com outras linguagens de programação.</p><p>Resolução de problemas, pensamento crítico e habilidades analíticas também são coisas essenciais quando estás a desenvolver sistemas complexos.</p><h3 id="o-produto-final"><strong>O produto final</strong></h3><p>Como <em><strong>escritor/a de código,</strong></em> o teu resultado esperado é geralmente uma solução simples que, depois de compilada, irá reproduzir com sucesso o resultado desejado. Um bom exemplo é o que demos anteriormente – converter um PDF num ficheiro de áudio.</p><p>Por outro lado, os/as <em><em><strong><strong>program</strong></strong></em><strong>adores/as</strong></em> vão trabalhar para fornecer uma aplicação completa funcional ou um pedaço de software que as pessoas vão utilizar no mercado. Também serão responsáveis por dar seguimento e fazer a manutenção do que criaram para garantir que está a funcionar suavemente, sem nenhum problema.</p><h2 id="como-a-escrita-de-c-digo-e-a-programa-o-trabalham-em-conjunto"><strong>Como a escrita de código e a programação trabalham em conjunto</strong></h2><p>Por esta altura, espero que sejas capaz de dizer a diferença entre escrita de código e programação e com o que estas duas coisas lidam. Agora, vamos ver como as duas podem (e devem) trabalhar em conjunto para alcançar muita coisa.</p><p>Para compreender melhor o como, vamos começar por fornecer um cenário real, onde ambas, escrita de código e programação, vão ter de trabalhar em conjunto para produzir uma aplicação funcional completa.</p><p>Imagina que te deram a tarefa de criar uma aplicação que irá ajudar a gerir ou acompanhar a tua rotina diária ou estar a par das tuas despesas diárias. Ao utilizar os conceitos dos dois mundos, podemos realizar a tarefa.</p><p>Vais precisar de um/a programador/a, que será capaz de:</p><ul><li>Planear a estrutura da aplicação (<em>com a ajuda de ferramentas como o<em> Trello</em></em>)</li><li>Escrever as principais funcionalidades da aplicação, qual a utilização esperada por parte dos utilizadores, etc.</li><li>Desenhar a aplicação (<em>ao utilizar ferramentas como<em> Figma o</em>u<em> Adobexd</em></em>)</li></ul><p>Após completar estes passos, entra o trabalho do/a escritor/a de código. Eles recebem as ideias que o/a programador/a cria e transformam-nas num formato legível para máquinas ao escrever código para realizar as tarefas especificadas. Depois do passo mágico da escrita do código, o/a programador/a volta novamente ao trabalho.</p><p>Então, o/a programador/a, irá analisar o código e verificar se existem erros, executará testes e verificará se está tudo a funcionar corretamente e que o código gera o resultado esperado. Se tudo isto se verificar, a aplicação está agora pronta para lançamento e manutenção – que permanece nas mãos do/a programador/a.</p><p>Este simples exemplo explica como as duas habilidades podem ser utilizadas em conjunto para melhor produtividade.</p><p>Apenas um apontamento final: um/a "escritor/a de código" e um/a "programador/a" nem sempre são duas pessoas distintas. Pode ser que a mesma pessoa realize todas as tarefas.</p><h2 id="resumindo"><strong>Resumindo</strong></h2><p>Onde nos enquadramos nestes dois mundos? Levei bastante tempo a perceber o que realmente me interessa.</p><p>Se tiveres mais interesse na lógica, tenta focar as tuas forças em todo o processo da programação. Se simplesmente gostares de ler e escrever código, então investe o teu tempo nisso.</p><p>Como sabemos, a ciência da computação é um campo muito amplo e ainda em desenvolvimento. Trabalha em encontrar o caminho que desejas explorar e foca-te nisso – certifica-te apenas que também desfrutas e te divertes.</p><p>Se ainda estiveres com dificuldades, espero que este artigo te tenha dado algumas luzes e ajudado a encontrar o teu caminho.</p><p>Obrigado por leres até aqui. Se tiveres gostado deste artigo, por favor compartilha-o para que possas ajudar outro programador (ou escritor de código) a encontrar o seu caminho.</p><p>Entra em contacto com o autor nas redes sociais: <a href="https://twitter.com/larymak1">Twitter</a> | <a href="https://www.linkedin.com/in/hillary-nyakundi-3a64b11ab/">LinkedIn</a> | <a href="https://github.com/larymak">GitHub</a></p><p>Desfruta da programação ❤</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Os melhores exemplos do Angular ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução realizada em português europeu Angular é um framework de código-livre com base no TypeScript, utilizado para desenvolver aplicações de front-end para a web. É o sucessor do AngularJS e todas as menções ao Angular referem-se à versão 2 ou superior. O Angular tem funcionalidades como generics, static-typing e ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/os-melhores-exemplos-do-angular/</link>
                <guid isPermaLink="false">644a78660fb65d064e628271</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Tue, 08 Aug 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/angular-examples.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-best-angular-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Best Angular Examples</a>
      </p><blockquote>Tradução realizada em português europeu</blockquote><p>Angular é um framework de código-livre com base no TypeScript, utilizado para desenvolver aplicações de <em>front-end</em> para a web. É o sucessor do AngularJS e todas as menções ao Angular referem-se à versão 2 ou superior. O Angular tem funcionalidades como <em>generics</em>, <em>static-typing</em> e algumas outras funcionalidades do ES6.</p><h2 id="hist-rico-de-vers-es"><strong>Histórico de versões</strong></h2><p>A Google lançou a versão inicial do AngularJS a 20 de outubro de 2010. A versão estável do AngularJS foi lançada a 18 de dezembro de 2017, com a versão 1.6.8. A última atualização significativa do AngularJS, a versão 1.7, ocorreu a 1 de julho de 2018, e está, atualmente, num período de 3 anos de Suporte a Longo Prazo. O Angular 2.0 foi anunciado pela primeira vez a 22 de setembro de 2014, na conferência ng-Europe. Uma das novas funcionalidades do Angular 2.0 é o carregamento dinâmico. A maior parte das principais funcionalidades foram movidas para módulos.</p><p>Após algumas modificações, o Angular 4.0 foi lançado em dezembro de 2016. O Angular 4 tem compatibilidade com a versão mais antiga do Angular 2.0. Algumas das novas funcionalidades são a biblioteca HttpClient e os novos eventos de ciclo de vida do <em>router</em>. O Angular 5 foi lançado a 1 de novembro de 2017, tendo uma funcionalidade muito importante que é o suporte para aplicações web progressivas. O Angular 6 foi lançado em maio de 2018, enquanto o Angular 7 foi lançado em outubro de 2018. A versão estável mais recente é a <a href="https://angular.io/guide/releases">7.0.0</a>.</p><blockquote>Nota da tradução: o texto que estás a ler é de 2018. A versão mais recente do Angular, no momento desta tradução, é a versão 16.1.2, de 21 de junho de 2023, compatível com as versões 16.14.0 a 18.10.0 do NodeJS, 4.9.3 a 5.2.0 do TypeScript e 6.5.3 a 7.4.0 do RxJS.</blockquote><h2 id="instala-o"><strong>Instalação</strong></h2><p>A forma mais fácil de instalar o Angular é através da <a href="https://cli.angular.io/">Angular CLI</a>. Esta ferramenta permite a criação de projetos e a geração de componentes, serviços, módulos e assim adiante. Como padrão, a equipa do Angular considera que esta seja a melhor prática.</p><h3 id="angular-2-x-e-vers-es-mais-recentes"><strong>Angular 2.x e versões mais recentes</strong></h3><h4 id="instalar-a-angular-cli"><strong>Instalar a Angular CLI</strong></h4><pre><code class="language-shell">npm install -g @angular/cli</code></pre><h4 id="criar-um-espa-o-de-trabalho-e-a-aplica-o-inicial"><strong>Criar um espaço de trabalho e a aplicação inicial</strong></h4><p>Vais desenvolver aplicações no contexto de um espaço de trabalho do Angular. Um espaço de trabalho contém os ficheiros para um ou mais projetos. Um projeto é o conjunto de ficheiros que compõe uma aplicação, uma biblioteca, ou testes <em>end-to-end</em> (e2e).</p><pre><code class="language-shell">ng new my-app</code></pre><h4 id="servir-a-aplica-o"><strong>Servir a aplicação</strong></h4><p>O Angular inclui um servidor para que consigas criar e servir facilmente a tua aplicação localmente.</p><ol><li>Navega até à pasta do espaço de trabalho (<code>my-app</code>)</li></ol><p>Inicia o servidor ao utilizar o comando CLI <code>ng serve</code> com a opção <code>--open</code></p><pre><code class="language-shell">cd my-app
ng serve --open</code></pre><p>Boa, criaste a tua primeira aplicação em Angular!!!</p><p>O Angular contém muitos <em>esquemas</em> para criar aplicações. Os componentes são um desses esquemas. Eles englobam uma única unidade de lógica relacionada com uma única parte da aplicação. Os componentes fazem geralmente parceria com outros esquemas para operar de maneira mais eficiente.</p><p>Os componentes simplificam a aplicação. Canalizar a lógica para uma única secção da interface visível é o seu principal objetivo. Para criar aplicações passo a passo, precisas de criar componente a componente. No final de contas, os componentes funcionam como blocos de construção do Angular.</p><h3 id="classe-de-componente-e-metadados"><strong>Classe de componente e metadados</strong></h3><p>O comando da CLI <code>ng generate component [nome-do-componente]</code> produz o seguinte:</p><pre><code class="language-typescript">import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent implements OnInit {
  constructor() { }

  ngOnInit() { }
}</code></pre><p>Esta é a estrutura básica da qual todos os grandes componentes se originam. O <em>decorator</em> <code>@Component</code> é a parte mais importante. Sem ele, o exemplo acima torna-se uma classe genérica. O Angular depende dos <em>decorators</em> para distinguir o tipo esquemático da classe.</p><p><code>@Component</code> recebe metadados como um único objeto. Os <em>decorators</em> são apenas funções JavaScript em segundo plano. Eles recebem argumentos assim como o objeto de metadados. O objeto de metadados configura as dependências básicas do componente. Cada campo tem o seu papel.</p><ul><li><code>selector:</code> indica ao Angular para associar o componente a um determinado elemento no <em>template </em>HTML da aplicação.</li><li><code>templateUrl:</code> aceita a localização do ficheiro do <em>template </em>HTML do componente (é também aqui que a informação é exibida).</li><li><code>styleUrls:</code> aceita um array de localizações de ficheiros das folhas de estilos (strings). Estas folhas de estilos focam o <em>template </em>atribuído ao componente.</li></ul><p>Pensa em metadados como uma grande bolha de configuração. O <em>decorator </em>recebe-os de maneira a que possa gerar a informação específica ao componente. O <em>decorator</em> <em><em>decora</em></em> a classe subjacente com informação necessária para o comportamento da sua classe, ou seja, uma classe de <em><em>component</em>e</em>.</p><p>A assinatura da classe é exportada por padrão, de maneira a que o componente possa ser importado. <code>ngOnInit</code> é também implementado. <code>implements</code> indica à classe para definir certos métodos de acordo com a definição da interface. <code>ngOnInit</code> é um <em>hook</em> de ciclo de vida.</p><h3 id="informa-es-de-componente"><strong>Informações de componente</strong></h3><p>A informação comanda tudo. Os componentes não são exceção. Os componentes englobam toda a informação. Para receber dados externamente, um componente deve declarar isso explicitamente. Este modo de privacidade impede que a informação entre em conflito ao longo da árvore de componentes.</p><p>A informação determina o que é exibido da classe de componente para o teu <em>template</em>. Qualquer atualização à informação da classe atualizará (ou, pelo menos, deverá atualizar) a visualização do <em>template</em>.</p><p>Os componentes, geralmente, vão inicializar um conjunto de membros (ou variáveis) que armazenam informação. São utilizados ao longo da lógica da classe de componente por conveniência. Essa informação alimenta a lógica resultante no <em>template </em>e o seu comportamento. Observa o seguinte exemplo:</p><pre><code class="language-typescript">// ./components/example/example.component.ts

import { Component, OnInit } from '@angular/core';
import { Post, DATA } from '../../data/posts.data';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html'
})
export class ExampleComponent implements OnInit {
  username: string;
  totalPosts: number;
  allPosts: Post[];

  deletePost(index: number): void {
    this.allPosts.splice(index, 1);
    this.totalPosts = this.allPosts.length;
  }

  ngOnInit(): void {
    this.username = DATA.author;
    this.totalPosts = DATA.thePosts.length;
    this.allPosts = DATA.thePosts;
  }
}</code></pre><pre><code class="language-html">&lt;!-- ./components/example/example.component.html --&gt;

&lt;h1&gt;{{ username }}&lt;/h1&gt;
&lt;span&gt;Alterar o nome: &lt;/span&gt;&lt;input [(ngModel)]="username"&gt;
&lt;h3&gt;Publicações: {{ totalPosts }}&lt;/h3&gt;
&lt;ul&gt;
&lt;hr/&gt;
&lt;div *ngFor="let post of allPosts; let i=index"&gt;
  &lt;button (click)="deletePost(i)"&gt;EXCLUIR&lt;/button&gt;
  &lt;h6&gt;{{ post.title }}&lt;/h6&gt;
  &lt;p&gt;{{ post.body }}&lt;/p&gt;
  &lt;hr/&gt;
&lt;/div&gt;
&lt;/ul&gt;</code></pre><p>Repara nas formas como o componente interage com a informação. Primeiro, vai buscar a <code>../../data/posts.data</code> antes de começar a encaminhar para o <em>template </em>para exibir.</p><p>A informação aparece ao longo do <em>template</em>. Dentro de chavetas, o valor de uma variável é mapeado da classe de componente para as chavetas. O <code>*ngFor</code> itera pela classe de array <code>allPosts</code>. Clicar no botão remove um elemento específico de <code>allPosts</code> pelo seu índice. Podes até alterar o <code>username</code> mais acima ao escrever na caixa de <em>input</em>.</p><p>As interações acima alteram a informação da classe de componente que, por sua vez, altera o <em>template </em>HTML do componente. Os componentes fornecem a lógica principal, que facilita o fluxo da informação. O <em>template </em>HTML torna essa informação legível para o utilizador.</p><h2 id="liga-o-binding-dos-dados"><strong>Ligação (binding) dos dados</strong></h2><p>A informação define geralmente o aspeto de uma aplicação. Interpretar essa informação para a interface de utilizador envolve a lógica de classe (<code>*.component.ts</code>) e uma vista de <em>template </em>(<code>*.component.html</code>) . O Angular conecta-os através da ligação (do inglês, <em>binding</em>) dos dados. Pensa na ligação dos dados como uma ferramenta para interação de componentes.</p><h3 id="componente-e-template"><strong>Componente e <em>template</em></strong></h3><p>O componente armazena maior parte da sua lógica e informação dentro da sua classe decorada com <code>@Component</code>. Esse <em>decorator </em>define a classe como um componente com <em>template </em>HTML. O template do componente representa a classe dentro da aplicação. Aqui, o foco deve ser entre a classe do componente e o <em>template </em>HTML.</p><p>É aqui que a ligação de dados ocorre. As propriedades de elementos e eventos recebem valores. Esses valores, definidos pela classe de componente, servem um de dois propósitos. Um é produzir informação que o <em>template </em>receberá. O outro é lidar com os eventos emitidos pelo elemento de <em>template</em>.</p><h3 id="propriedades-de-elemento"><strong>Propriedades de elemento</strong></h3><p>Para reconhecer propriedades de elemento vinculadas aos dados, o Angular utiliza uma sintaxe especial de chavetas.</p><pre><code class="language-typescript">// my.component.ts
@Component({
  templateUrl: './my.component.html'
})

export class MyComponent {
  value:type = /* algum valor de tipo */;
}</code></pre><pre><code class="language-html">&lt;!-- my.component.html --&gt;
&lt;any-element [property]="value"&gt;innerHTML&lt;/any-element&gt;</code></pre><p>Tem paciência comigo aqui.</p><p><code>[property]</code> espelha a propriedade no nó do objeto do elemento no Domain Object Model (DOM). Não confundas propriedades de objeto com um atributo de elemento do DOM. As propriedades e os atributos partilham por vezes o mesmo nome e fazem a mesma coisa. No entanto, existe uma clara distinção.</p><p>Lembra-te de que <code>attr</code> (atributos) é uma única propriedade do objeto do DOM subjacente. A declaração é feita na instanciação do DOM, com valores de atributo correspondentes à definição do elemento. O elemento mantém o mesmo valor após isso. Cada propriedade tem o seu próprio campo chave-valor num nó de objeto do DOM. Essas propriedades são mutáveis após a instanciação.</p><p>Compreende a diferença entre atributos e propriedades. Isso levará a uma melhor compreensão de como o Angular vincula a informação às propriedades (vinculação de propriedade). O Angular raramente vinculará a informação ao atributo de um elemento. As excepções a isso são muito raras. Uma última vez: o Angular vincula a informação de componente às propriedades, não aos atributos!</p><p>Voltando ao exemplo, o <code>[ … ]</code> na atribuição da propriedade do elemento tem um significado especial. Os parênteses retos mostram que <code>property</code> está vinculado ao <code>"value"</code> à direita da atribuição.</p><p><code>value</code> também tem significado especial no contexto dos parênteses retos. O próprio <code>value</code> é uma string literal. O Angular faz a leitura e compara o seu valor ao dos membros da classe. O Angular substituirá o valor do atributo de membro correspondente. Claro que isto refere-se à mesma classe de componente que hospeda o <em>template </em>HTML.</p><p>O fluxo unidirecional de informação do componente para o <em>template </em>está completo. O membro correspondente à atribuição correta da propriedade entre parênteses retos fornece o <code>value</code>. Nota que alterações ao valor do membro na classe do componente filtram para baixo para o <em>template</em>. Essa é a deteção de alteração do Angular em funcionamento. Alterações dentro do âmbito do template não tem efeito no membro da classe do componente.</p><p>Informação principal: a classe de componente fornece a informação enquanto que o <em>template </em>a exibe.</p><p>Não mencionei que os valores da informação também podem aparecer num <code>innerHTML</code> de um componente. Este último exemplo implementa chavetas duplas. O Angular reconhece essas chavetas e interpola a classe de dados de componente correspondente para o <code>innerHTML</code> da <code>div</code>.</p><pre><code class="language-html">&lt;div&gt;O valor do membro 'value', da classe de componente, é {{value}}.&lt;/div&gt;</code></pre><h3 id="lidar-com-eventos"><strong>Lidar com eventos</strong></h3><p>Se o componente fornece dados, então o <em>template </em>fornece eventos.</p><pre><code class="language-typescript">// my.component.ts
@Component({
  templateUrl: './my.component.html'
})

export class MyComponent {
  handler(event):void {
      // a função faz algo
  }
}</code></pre><pre><code class="language-html">// my.component.html
&lt;any-element (event)=“handler($event)”&gt;innerHTML&lt;/any-element&gt;</code></pre><p>Isto funciona de maneira semelhante à vinculação de propriedades.</p><p>O <code>(event)</code> refere-se a qualquer tipo de evento válido. Por exemplo, um dos tipos de eventos mais comum é o <code>click</code>. Ele emite quando <em><em>clic</em>as</em> com o rato. Independentemente do tipo, o <code>event</code> está vinculado ao <code>"handler"</code> no exemplo. Os gestores de eventos são geralmente funções de membro da classe de componente.</p><p>Os <code>( … )</code> são especiais para o Angular. Os parênteses indicam ao Angular que um evento está vinculado à atribuição correta do <code>handler</code>. O próprio evento origina a partir do elemento hospedeiro.</p><p>Quando o evento emite, ele passa o objeto Event sob a forma de <code>$event</code>. O <code>handler</code> mapeia para a função que tem o mesmo nome do <code>handler</code> da classe de componente. A troca unidirecional do elemento vinculado ao evento para a classe de componente está finalizada.</p><p>Os eventos de emissão do gestor, enquanto possível, não causam impacto no elemento de <em>template</em>. Afinal, a vinculação é unidirecional.</p><h2 id="diretrizes"><strong>Diretrizes</strong></h2><p>Diretrizes são elementos de componente e atributos criados e reconhecidos pelo Angular. O Angular associa o elemento ou atributo com a sua definição de classe correspondente. <code>@Directive</code> ou <code>@Component</code> decora essas classes. Ambos são indicativos para o Angular que a classe funciona como uma diretriz.</p><p>Algumas diretrizes modificam o estilo do elemento hospedeiro. Outras diretrizes exibem vistas ou inserem em vistas já existentes como vistas incorporadas. Por outras palavras, elas alteram o layout HTML.</p><p>De qualquer forma, as diretrizes sinalizam o compilador do Angular. Elas marcam componentes para modificação, dependendo da lógica da classe da diretriz.</p><h3 id="diretriz-estrutural"><strong>Diretriz estrutural</strong></h3><p>Aqui estão três exemplos de diretrizes estruturais. Cada uma tem uma contrapartida lógica (<code>if</code>, <code>for</code> e <code>switch</code>).</p><ul><li>*ngIf</li><li>*ngFor</li><li>*ngSwitchCase e *ngSwitchDefault</li></ul><p><strong>Nota i<strong><strong><strong>mportante:</strong></strong></strong></strong> todas as três estão disponíveis através da importação do <code>CommonModule</code>, que está disponível a partir de <code>@angular/common</code> para importação dentro do módulo raiz da aplicação.</p><h5 id="-ngif"><strong>*ngIf</strong></h5><p><code>*ngIf</code> testa um determinado valor para ver se é <em>verdadeiro</em> ou <em><em>fals</em>o</em> com base na avaliação booleana geral em JavaScript. Em caso de ser verdadeiro, o elemento e o seu innerHTML vão ser exibidos. Caso contrário, nunca vão renderizar para o Domain Object Model (DOM).</p><pre><code class="language-html">&lt;!-- renders "&lt;h1&gt;Olá!&lt;/h1&gt;" --&gt;
&lt;div *ngIf="true"&gt;
  &lt;h1&gt;Olá!&lt;/h1&gt;
&lt;/div&gt;

&lt;!-- não renderiza --&gt;
&lt;div *ngIf="false"&gt;
  &lt;h1&gt;Alô!&lt;/h1&gt;
&lt;/div&gt;</code></pre><p>Esse é um exemplo fictício. Qualquer valor de membro da classe de componente do template pode ser substituído por <code>true</code> ou <code>false</code>.</p><p><strong>Nota:</strong> também podes fazer o seguinte com *ngIf para obter acesso ao valor observável:</p><pre><code class="language-html">&lt;div *ngIf="observable$ | async as oNomeQueQuiseres"&gt;
  {{ oNomeQueQuiseres }}
&lt;/div&gt;</code></pre><h5 id="-ngfor"><strong>*ngFor</strong></h5><p><code>*ngFor</code> itera com base numa expressão, <em><em>micros</em>sin<em>tá</em>tica, </em>atribuída à direita. A microssintaxe vai para além do âmbito deste artigo. Fica apenas a saber que a microssintaxe é uma forma abreviada de uma expressão lógica. Ocorre como uma única <em>string</em> capaz de referenciar valores de membro de classe. Podes iterar através de valores iteráveis, o que os torna úteis para <code>*ngFor</code>.</p><pre><code class="language-html">&lt;ul&gt;
  &lt;li *ngFor=“let potato of ['Russet', 'Doce', 'Rosalinda']; let i=index”&gt;
      Potato {{ i + 1 }}: {{ potato }}
  &lt;/li&gt;
  &lt;!-- Resultados
  &lt;li&gt;
      Batata 1: Russet
  &lt;/li&gt;
  &lt;li&gt;
      Batata 2: Doce
  &lt;/li&gt;
  &lt;li&gt;
      Batata 3: Rosalinda
  &lt;/li&gt;
  --&gt;
&lt;/ul&gt;</code></pre><p><code>['Russet', 'Doce', 'Rosalinda']</code> é um valor iterável. Os arrays são uns dos valores iteráveis mais comuns. O <code>*ngFor</code> cria um <code>&lt;li&gt;&lt;/li&gt;</code> por cada elemento do array. É atribuído a cada elemento do array a variável <code>potato</code> (em português, batata). Isto é feito ao utilizar a microssintaxe. O <code>*ngFor</code> define o conteúdo estrutural do elemento <code>ul</code>. Isso é característico de uma diretriz estrutural.</p><p><strong>Nota:</strong> também podes fazer o seguinte com a diretriz <code>*ngFor</code> para obter acesso ao valor observável (atalho):</p><pre><code class="language-html">&lt;div *ngFor="let oNomeQueQuiseres of [(observable$ | async)]"&gt;
  {{  oNomeQueQuiseres }}
&lt;/div&gt;</code></pre><h5 id="-ngswitchcase-e-ngswitchdefault"><strong>*ngSwitchCase e *ngSwitchDefault</strong></h5><p>Estas duas diretrizes estruturais trabalham em conjunto para fornecer a funcionalidade <code>switch</code> ao <em>template </em>HTML.</p><pre><code class="language-html">&lt;div [ngSwitch]="potato"&gt;
  &lt;h1 *ngSwitchCase="'Russet'"&gt;{{ potato }} é uma batata Russet.&lt;/h1&gt;
  &lt;h1 *ngSwitchCase="'Sweet'"&gt;{{ potato }} é uma batata doce.&lt;/h1&gt;
  &lt;h1 *ngSwitchCase="'Laura'"&gt;{{ potato }} é uma batata Rosalinda.&lt;/h1&gt;
  &lt;h1 *ngSwitchDefault&gt;{{ potato }} é um tipo diferente de batata.&lt;/h1&gt;
&lt;/div&gt;</code></pre><p>Apenas uma das expressões <code>*ngSwitch…</code> é renderizada. Repara no atributo <code>[ngSwitch]</code> dentro do elemento <code>div</code> a envolver o switch. Ele passa o valor de <code>potato</code> ao longo da cadeia <code>*ngSwitch...</code>. Essa cadeia de diretrizes estruturais determina que elemento <code>h1</code> renderiza.</p><p>Como tal, <code>[ngSwitch]</code> não é uma diretriz estrutural ao contrário das instruções <code>*ngSwitch…</code>. Ele passa o valor enquanto que o bloco determina o layout final do HTML.</p><p>Lembra-te de que a estilização e passagem de valores não são da responsabilidade das diretrizes estruturais. Isto é responsabilidade das diretrizes de atributos. As diretrizes estruturais determinam apenas o layout.</p><p>As transformações à informação resultante garantem que a informação esteja num formato adequado quando chega a hora de carregar para o ecrã do utilizador. Normalmente, as transformações de informação ocorrem em segundo plano. Com <em>pipes</em>, a transformação de informação pode ocorrer no <em>template </em>HTML. Os <em>pipes</em> transformam a informação de <em>template </em>diretamente.</p><p>Os <em>pipes</em> têm bom aspeto e são convenientes. Eles ajudam a manter a classe de componente com poucas transformações básicas. Tecnicamente, os <em>pipes</em> expressam a lógica da transformação de informação.</p><h3 id="casos-de-utiliza-o"><strong>Casos de utilização</strong></h3><p>O Angular vem carregado com um conjunto básico de <em>pipes</em>. Trabalhar com um par deles desenvolverá a intuição para lidar com os restantes. A lista a seguir fornece três exemplos:</p><ul><li>AsyncPipe</li><li>DatePipe</li><li>TitleCasePipe</li></ul><h5 id="asyncpipe"><strong>AsyncPipe</strong></h5><p>Essas secções requerem uma compreensão básica de <em>Promises</em> ou <em>Observables</em> para apreciar totalmente. O <em>AsyncPipe</em> opera num dos dois. O <em>AsyncPipe</em> extrai informação das <em>Promises</em>/<em>Observables</em> como resultado para o que vier a seguir.</p><p>No caso dos <em>Observables</em>, o <em>AsyncPipe</em> subscreve automaticamente para a fonte de informação. Independentemente de onde vier a informação, o <em>AsyncPipe</em> subscreve para a fonte observável. O <code>async</code> é o nome sintático do <em>AsyncPipe,</em> tal como apresentado abaixo.</p><pre><code class="language-html">&lt;ul *ngFor=“let potato of (potatoSack$ | async); let i=index”&gt;
  &lt;li&gt;Batata {{i + 1}}: {{potato}}&lt;/li&gt;
&lt;/ul&gt;</code></pre><p>No exemplo, o <code>potatoSack$</code> é um <em>Observable</em> a aguardar um carregamento de batatas. Assim que as batatas chegarem, quer de maneira síncrona, quer assíncrona, o <em>AsyncPipe</em> recebe-as como um array <em><em>iterá</em>vel</em>. O elemento de lista é, então, preenchido por batatas.</p><h5 id="datepipe"><strong>DatePipe</strong></h5><p>Formatar strings de data requer um pouco de manipulação com o objeto de JavaScript <code>Date</code>. O <em>DatePipe</em> fornece uma forma potente de formatar datas assumindo que o input fornecido está num formato válido de data.</p><h5 id="titlecasepipe"><strong>TitleCasePipe</strong></h5><p>Transforma texto para estilo de título. Coloca em maiúscula a primeira letra de cada palavra e transforma as letras restantes da palavra em minúsculas. As palavras são delimitadas por qualquer caracter de espaço em branco, tal como um espaço, um tab ou caracter de avanço de linha.</p><pre><code class="language-typescript">// example.component.ts

@Component({
  templateUrl: './example.component.html'
})
export class ExampleComponent {
  timestamp:string = ‘2018-05-24T19:38:11.103Z’;
}</code></pre><pre><code class="language-html">&lt;!-- example.component.html --&gt;

&lt;div&gt;Hora atual: {{timestamp | date:‘short’}}&lt;/div&gt;</code></pre><p>O formato do <code>timestamp</code> acima é <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a><sup><a href="https://en.wikipedia.org/wiki/ISO_8601">1</a></sup> — não é o mais fácil de ler. O <em>DatePipe</em> (<code>date</code>) transforma o formato de data ISO no formato mais convencional <code>mm/dd/yy, hh:mm AM|PM</code>. Existem muitas outras opções de formatação. Todas estas opções estão na <a href="https://angular.io/api/common/DatePipe">documentação oficial</a>.</p><h4 id="criar-pipes"><strong>Criar <em>pipes</em></strong></h4><p>Embora o Angular tenha apenas um determinado número de <em>pipes</em>, o <em>decorator </em><code>@Pipe</code> permite aos programadores criarem os seus próprios. O processo começa com <code>ng generate pipe [nome-do-pipe]</code>, substituindo <code>[nome-do-pipe]</code> por um nome de ficheiro preferível. Este comando produz o seguinte:</p><pre><code class="language-typescript">import { Pipe, PipeTransform } from ‘@angular/core’;

@Pipe({
  name: 'example'
})
export class ExamplePipe implements PipeTransform {
  transform(value: any, args?: any): any {
      return null;
  }
}</code></pre><p>Este template de <em>pipe</em> simplifica a criação de um <em>pipe</em> personalizado. O <em>decorator </em><code>@Pipe</code> indica ao Angular que a classe é um <em>pipe</em>. O valor de <code>name: ‘example’</code>, sendo neste caso <code>example</code>, é o valor que o Angular reconhece quando procura no <em>template </em>HTML por <em>pipes</em> personalizados.</p><p>Avancemos para a lógica da classe. A implementação <code>PipeTransform</code> fornece as instruções para a função <code>transform</code>. Esta função tem significado especial dentro do contexto do <em>decorator</em> <code>@Pipe</code>. Ela recebe dois parâmetros de início.</p><p><code>value: any</code> é o resultado que o <em>pipe</em> recebe. Pensa no <code>&lt;div&gt;{{ umValor | example }}&lt;/div&gt;</code>. O valor de <em>umValor</em> é passado para o parâmetro <code>value: any</code> da função <code>transform</code>. Esta é a mesma função <code>transform</code> definida na classe <em>ExamplePipe</em>.</p><p><code>args?: any</code> é qualquer argumento que o <em>pipe</em> recebe opcionalmente. Pensa em <code>&lt;div&gt;{{ umValor | example:[um-argumento] }}&lt;/div&gt;</code>. <code>[um-argumento]</code> pode ser substituído por qualquer valor. Esse valor é passado para o parâmetro <code>args?: any</code> da função <code>transform</code>. Isto é, a função <code>transform</code> definida na classe do <em>ExamplePipe</em>.</p><p>O que quer que a função retorne, (<code>return null;</code>) passa a ser o resultado da operação de <em>pipe</em>. Observa o próximo exemplo para ver um exemplo completo de <em>ExamplePipe</em>. Dependendo da variável que o <em>pipe</em> recebe, ele passa o valor de entrada ou para maiúscula ou para minúscula &nbsp;no novo resultado. Um argumento inválido ou inexistente fará com que o <em>pipe </em>retorne o mesmo valor de entrada como resultado.</p><pre><code class="language-typescript">// example.pipe.ts

@Pipe({
  name: 'example'
})
export class ExamplePipe implements PipeTransform {
  transform(value:string, args?:string): any {
    switch(args || null) {
      case 'uppercase':
        return value.toUpperCase();
      case 'lowercase':
        return value.toLowerCase();
      default:
        return value;
    }
  }
}</code></pre><pre><code class="language-typescript">// app.component.ts

@Component({
  templateUrl: 'app.component.html'
})
export class AppComponent {
  someValue:string = "HeLlO WoRlD!";
}</code></pre><pre><code class="language-html">&lt;!-- app.component.html --&gt;

&lt;!-- Outputs “HeLlO WoRlD!” --&gt;
&lt;h6&gt;{{ someValue | example }}&lt;/h6&gt;

&lt;!-- Outputs “HELLO WORLD!” --&gt;
&lt;h6&gt;{{ someValue | example:‘uppercase’ }}&lt;/h6&gt;

&lt;!-- Outputs “hello world!” --&gt;
&lt;h6&gt;{{ someValue | example:‘lowercase’ }}&lt;/h6&gt;</code></pre><h2 id="hooks-do-ciclo-de-vida"><strong>Hooks do ciclo de vida</strong></h2><p>Os <em>hooks</em> <em>do ciclo de vida</em> são métodos temporizados. Eles diferem no tempo e na razão pela qual são executados. A alteração de deteção aciona estes métodos. Eles executam dependendo das condições do ciclo atual. O Angular executa constantemente deteção de alterações nos seus dados. Os <em>hooks</em> <em>do ciclo de vida</em> ajudam a gerir os seus efeitos.</p><p>Um aspeto importante destes <em>hooks</em> é a sua ordem de execução. Ela nunca se altera. Eles executam com base numa série previsível de eventos de carregamento produzidos a partir de um ciclo de deteção. Isto torna-os previsíveis. Alguns ativos estão apenas disponíveis depois da execução de um determinado <em>hook</em>. Claro, um <em>hook</em> executa apenas sob determinadas condições definidas na alteração atual do ciclo de deteção.</p><h3 id="por-ordem-de-execu-o-"><strong>Por ordem de execução:</strong></h3><h3 id="ngonchanges"><strong>ngOnChanges</strong></h3><p><code>ngOnChanges</code> é acionado seguindo a modificação do <code>@Input</code> vinculado aos membros da classe. Dados vinculados pelo <em>decorator</em> <code>@Input()</code> vêm de uma fonte externa. Quando uma fonte externa altera os dados numa forma detetável, eles são passados novamente pela propriedade <code>@Input</code>.</p><p>Com essa atualização, <code>ngOnChanges</code> aciona imediatamente. Também é acionado na inicialização dos dados de entrada. O <em>hook</em> recebe um parâmetro opcional do tipo <code>SimpleChanges</code>. Este valor contém informação das propriedades alteradas vinculadas ao valor de entrada.</p><h3 id="ngoninit"><strong>ngOnInit</strong></h3><p><code>ngOnInit</code> é acionado uma vez na inicialização da propriedade (<code>@Input</code>) de um componente vinculado aos dados. O próximo exemplo terá um aspeto semelhante ao anterior. O <em>hook</em> não aciona porque o <em>ChildComponent</em> recebe os dados de entrada. Em vez disso, ele aciona logo após a renderização da informação para o template do <em>ChildComponent</em>.</p><h3 id="ngdocheck"><strong>ngDoCheck</strong></h3><p><code>ngDoCheck</code> é acionado a cada ciclo de deteção de alteração. O Angular executa frequentemente a deteção de alterações. Realizar qualquer ação fará com que faça mais um ciclo. O <code>ngDoCheck</code> é acionado com esses ciclos. Utiliza-o com precaução. Ele pode causar problemas de performance quando implementado incorretamente.</p><p>O <code>ngDoCheck</code> permite aos programadores verificarem os seus dados manualmente. Eles podem acionar uma nova data de aplicação condicionalmente. Juntamente com <code>ChangeDetectorRef</code>, os programadores podem criar as suas próprias verificações para a deteção de mudanças.</p><h3 id="ngaftercontentinit"><strong>ngAfterContentInit</strong></h3><p><code>ngAfterContentInit</code> é acionado depois da inicialização do DOM do conteúdo do componente (quando ele é carregado pela primeira vez). Esperar por <em>queries </em><code>@ContentChild(ren)</code> é o principal caso de utilização do <em>hook</em>.</p><p>As <em>queries </em><code>@ContentChild(ren)</code> produzem referências de elemento para o conteúdo do DOM. Como tal, elas não estão disponíveis até que o conteúdo do DOM carregue. É por isso que <code>ngAfterContentInit</code> e sua contrapartida, <code>ngAfterContentChecked</code>, são utilizados.</p><h3 id="ngaftercontentchecked"><strong>ngAfterContentChecked</strong></h3><p><code>ngAfterContentChecked</code> é acionado depois de cada ciclo de deteção de alteração focado no DOM do conteúdo. Isto permite aos programadores facilitar como o DOM do conteúdo reage a deteção de alterações. O <code>ngAfterContentChecked</code> pode ser acionado frequentemente e causar problemas de performance se for mal implementado.</p><p><code>ngAfterContentChecked</code> também é acionado durante as etapas de inicialização de um componente. Vem logo após o <code>ngAfterContentInit</code>.</p><h3 id="ngafterviewinit"><strong>ngAfterViewInit</strong></h3><p><code>ngAfterViewInit</code> é acionado uma vez depois da vista do DOM terminar a inicialização. A vista carrega sempre logo após o conteúdo. O <code>ngAfterViewInit</code> espera pela resolução das <em>queries </em><code>@ViewChild(ren)</code>. Estes elementos são consultados a partir de dentro da mesma vista do componente.</p><h3 id="ngafterviewchecked"><strong>ngAfterViewChecked</strong></h3><p><code>ngAfterViewChecked</code> é acionado depois de qualquer ciclo de deteção de alterações focado na vista do componente. O <em>hook</em> <code>ngAfterViewChecked</code> permite aos programadores facilitar como a deteção de alterações afeta a vista do DOM.</p><h3 id="ngondestroy"><strong>ngOnDestroy</strong></h3><p><code>ngOnDestroy</code> é acionado quando um componente é removido da vista e do DOM subsequente. Este <em>hook</em> fornece uma oportunidade para limpar qualquer ponta solta antes de remover um componente.</p><h2 id="vistas"><strong>Vistas</strong></h2><p>As vistas são quase como o seu próprio DOM virtual. Cada vista contém uma referência para uma secção correspondente do DOM. Dentro de uma vista estão nós que espelham o que está nesta secção. O Angular atribui um nó de vista por cada elemento DOM. Cada nó tem uma referência para um elemento correspondente.</p><p>Quando o Angular procura por alterações, este verifica as vistas. O Angular evita o DOM em segundo plano. As vistas referenciam o DOM em seu nome. Existem outros mecanismos para garantir que as alterações de vista renderizem no DOM. Por outro lado, alterações ao DOM não afetam as vistas.</p><p>Novamente, as vistas são comuns ao longo de todas as plataformas de desenvolvimento para além do DOM. Mesmo no desenvolvimento para uma plataforma, as vistas ainda são consideradas melhor prática. Elas garantem que o Angular tenha uma interpretação correta do DOM.</p><p>As vistas podem não existir em bibliotecas externas. A manipulação direta do DOM é uma saída de emergência para este tipo de cenário. Certamente, não esperes que a aplicação funcione em várias plataformas.</p><h3 id="tipos-de-vistas"><strong>Tipos de vistas</strong></h3><p>Existem dois tipos principais de vistas: incorporada e de anfitrião.</p><p>Também existem recipientes de vista. Eles armazenam vistas incorporadas e de anfitrião e são geralmente referidos como "vistas" simples.</p><p>Qualquer classe <code>@Component</code> regista um recipiente de vista (vista) com Angular. Novos componentes geram um seletor personalizado focado num determinado elemento do DOM. A vista anexa-se a esse elemento quando ele aparecer. O Angular sabe agora que o componente existe ao olhar para o modelo de vista.</p><h3 id="vistas-de-anfitri-o-e-recipientes"><strong>Vistas de anfitrião e recipientes</strong></h3><p>Vistas de anfitrião <em><em>hos</em>pedam</em> componentes dinâmicos. Recipientes de vista (vistas) são anexados automaticamente a elementos já existentes no <em>template</em>. As vistas podem ser anexadas a qualquer elemento para além do que é único em classes de componente.</p><p>Pensa no método tradicional da geração de componente. Ele começa por criar uma classe, decorá-la com <code>@Component</code>, e preenchê-la com metadados. Esta abordagem ocorre em qualquer elemento de componente predefinido do template.</p><p>Tenta utilizar o comando da interface da linha de comandos do Angular (CLI): <code>ng generate component [name-of-component]</code>. Ele produz o seguinte:</p><pre><code class="language-typescript">import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent implements OnInit {
  constructor() { }

  ngOnInit() { }
}</code></pre><p>Isso cria o componente com o seletor <code>app-example</code>. Ele anexa um recipiente de vista a <code>&lt;app-example&gt;&lt;/app-example&gt;</code> no template. Se essa for a raiz da aplicação, a sua vista encapsularia todas as outras vistas. A vista raiz marca o início da aplicação na perspetiva do Angular.</p><p>Criar componentes dinamicamente e registá-los no modelo de vista do Angular requer mais alguns passos. As diretrizes estruturais ajudam a gerir conteúdo dinâmico (<code>*ngIf, *ngFor, e *ngSwitch…</code>). No entanto, as diretrizes não escalam para aplicações maiores. Demasiadas diretrizes estruturais complicam o <em>template</em>.</p><p>É aqui que instanciar componentes a partir de lógicas de classe existentes vem a calhar. Estes componentes precisam de criar uma vista de anfitrião que pode inserir no modelo de vista. As vistas de anfitrião armazenam dados para componentes de maneira a que o Angular reconheça o seu propósito estrutural.</p><h3 id="vistas-incorporadas"><strong>Vistas incorporadas</strong></h3><p>Diretrizes estruturais criam um <code><a href="https://angular.io/guide/structural-directives#the-asterisk--prefix">ng-template</a></code> <a href="https://angular.io/guide/structural-directives#the-asterisk--prefix">à volta de um pedaço de conteúdo do HTML</a>. O elemento anfitrião da diretriz tem um recipiente de vista anexado. Isto faz com que o conteúdo possa renderizar à condição no seu layout pretendido.</p><p>O <code>ng-template</code> armazena nós de vista incorporados a representar cada elemento dentro do seu innerHTML. <code>ng-template</code> não é de todo um elemento do DOM. Ele comenta-se a si próprio. As tags definem a extensão da sua vista incorporada.</p><p>Instanciar uma vista incorporada não requer recursos externos para além da sua própria referência. A <em>query </em><code>@ViewChild</code> pode ir buscar isso.</p><p>Com a referência do <em>template</em>, chamar <code>createEmbeddedView</code> a partir dele dá conta do recado. O innerHTML da referência passa a ser a sua própria instância de vista incorporada.</p><p>No próximo exemplo, <code>&lt;ng-container&gt;&lt;/ng-container&gt;</code> é um recipiente de vista. O <code>ng-container</code> é comentado durante a compilação, tal como o <code>ng-template</code>. Por isso, ele fornece uma saída para inserir a vista incorporada mantendo o DOM leve.</p><p>O <em>template </em>de vista incorporada é inserido na localização de layout do <code>ng-container</code>. Esta vista recentemente inserida não tem encapsulamento de vista adicional para além do recipiente de vista. Lembra-te de como isto é diferente das vistas de anfitrião (as vistas de anfitrião são anexadas ao seu invólucro de elemento <code>ng-component</code>).</p><pre><code class="language-typescript">import { Component, AfterViewInit, ViewChild,
ViewContainerRef, TemplateRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: `
  &lt;h1&gt;Application Content&lt;/h1&gt;
  &lt;ng-container #container&gt;&lt;/ng-container&gt; &lt;!-- embed view here --&gt;
  &lt;h3&gt;End of Application&lt;/h3&gt;

  &lt;ng-template #template&gt;
    &lt;h1&gt;Template Content&lt;/h1&gt;
    &lt;h3&gt;Dynamically Generated!&lt;/h3&gt;
  &lt;/ng-template&gt;
  `
})
export class ExampleComponent implements AfterViewInit {
  @ViewChild("template", { read: TemplateRef }) tpl: TemplateRef&lt;any&gt;;
  @ViewChild("container", { read: ViewContainerRef }) ctr: ViewContainerRef;

  constructor() { }

  ngAfterViewInit() {
    const view =  this.tpl.createEmbeddedView(null);
    this.ctr.insert(view);
  }
}</code></pre><p>As <em>queries </em><code>@ViewChild</code> para o <em>template fazem referência à variável </em><code>#template</code>. Isto fornece uma referência de <em>template </em>do tipo <code>TemplateRef</code>. <code>TemplateRef</code> armazena a função <code>createEmbeddedView</code>. Esta instancia o <em>template </em>como uma vista incorporada.</p><p>O único argumento de <code>createEmbeddedView</code> é para contexto. Se desejares passar metadados adicionais, podes fazê-lo aqui como um objeto. Os campos devem corresponder aos atributos de <code>ng-template</code> (<code>let-[context-field-key-name]=“value”</code>). Passar <code>null</code> indica que não são necessários mais metadados.</p><p>Uma segunda <em>query </em><code>@ViewChild</code> fornece uma referência a <code>ng-container</code> como um <code>ViewContainerRef</code>. As vistas incorporadas são apenas anexadas a outras vistas, nunca ao DOM. O <code>ViewContainerRef</code> referencia a vista que recebe a vista incorporada.</p><p>Uma vista incorporada também pode ser inserida na vista de componente do <code>&lt;app-example&gt;&lt;/app-example&gt;</code>. Esta abordagem posiciona a vista no final da vista do ExampleComponent. No entanto, neste exemplo, queremos que o conteúdo apareça mesmo no meio, onde está <code>ng-container</code>.</p><p>A função <code>insert</code> do <code>ViewContainerRef</code> <em><em>inser</em>e</em> a vista incorporada no <code>ng-container</code>. O conteúdo da vista aparece no local pretendido, no centro da vista do ExampleComponent.</p><h2 id="redirecionamento"><strong>Redirecionamento</strong></h2><p>O redirecionamento é essencial. Muitas aplicações da web modernas hospedam demasiada informação para uma página. Os utilizadores também não devem ter de percorrer todo o conteúdo de uma página. Uma aplicação precisa de se dividir em secções distintas. Uma boa prática do Angular é carregar e configurar o redirecionamento num módulo separado, de nível superior, que é dedicado ao redirecionamento e importado pela raiz, AppModule.</p><p>Os utilizadores dão prioridade a informações necessárias. O redirecionamento ajuda-os a encontrar a secção da aplicação com tal informação. Qualquer outra informação útil para outros utilizadores pode existir num caminho totalmente diferente. Com redirecionamento, ambos os utilizadores podem encontrar o que precisam rapidamente. Detalhes irrelevantes permanecem escondidos atrás de caminhos irrelevantes.</p><p>O redirecionamento funciona muito bem ao ordenar e restringir acesso a dados da aplicação. Informação sensível nunca deve ser exibida a utilizadores não autorizados. A aplicação pode intervir entre cada caminho. Ela pode examinar a sessão de um utilizador por questões de autenticação. Este exame determina que caminho deve ser renderizado. O redirecionamento dá aos programadores a oportunidade perfeita para validar um utilizador antes de proceder.</p><p>Quanto ao Angular, o redirecionamento ocupa toda a sua própria biblioteca dentro do framework. Todos os frameworks modernos de <em>front-end</em> suportam redirecionamento – o Angular não é exceção. O redirecionamento acontece no lado do <em>client</em> utilizando quer redirecionamento de hash, quer de localização. Ambos os estilos permitem ao <em>client</em> gerir os seus próprios caminhos. Não é necessária assistência adicional por parte do servidor após o pedido inicial.</p><h3 id="redirecionamento-b-sico"><strong>Redirecionamento básico</strong></h3><p>Os utilitários de redirecionamento exportam com o <code>RouterModule</code> disponível em <code>@angular/router</code>. Não faz parte da biblioteca principal, visto que nem todas as aplicações requerem redirecionamento. A forma mais convencional de introduzir redirecionamento é com o seu próprio <a href="https://angular.io/guide/feature-modules">módulo de recursos</a>.</p><p>À medida que a complexidade cresce, ter o seu próprio módulo irá promover a simplicidade do módulo raiz. Mantê-lo estupidamente simples, sem comprometer a funcionalidade, constitui um bom design para os módulos.</p><pre><code class="language-typescript">import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { AComponent } from '../../components/a/a.component';
import { BComponent } from '../../components/b/b.component';

// um array de futuros caminhos!
const routes: Routes = [];

@NgModule({
  imports: [ RouterModule.forRoot(routes) ],
  exports: [ RouterModule ]
})
export class AppRoutingModule { }</code></pre><p><code>.forRoot(...)</code> é uma função de classe disponível a partir da classe RouterModule. A função aceita um array de objetos <code>Route</code> como <code>Routes</code>. O <code>.forRoot(...)</code> configura caminhos para <em>eager-loading,</em> enquanto que a sua alternativa, <code>.forChild(...)</code>, configura para <em>lazy-loading</em>.</p><p><em>Eager-loading</em> significa que os caminhos carregam o seu conteúdo para a aplicação logo no início. <em>Lazy-loading</em> acontece por pedido. O foco deste artigo é o <em>eager-loading</em>. É a abordagem predefinida para carregar uma aplicação. A definição da classe RouterModule tem um aspeto semelhante ao próximo bloco de código.</p><pre><code class="language-typescript">@NgModule({
  // … montes de metadados ...
})
export class RouterModule {
  forRoot(routes: Routes) {
    // … configuração para caminhos eagerly loaded …
  }

  forChild(routes: Routes) {
    // … configuração para caminhos lazily loaded …
  }
}</code></pre><p>Não te preocupes com a configuração dos detalhes que o exemplo omite com comentários. Ter uma compreensão geral é suficiente por enquanto.</p><p>Observa como o AppRoutingModule importa o RouterModule enquanto também o exporta. Isto faz sentido visto que o AppRoutingModule é um módulo de recursos. Ele importa para o módulo raiz como um módulo de recursos. Ele expõe diretrizes RouterModule, interfaces e serviços para a árvore de componente raiz.</p><p>Isto explica a razão para o AppRoutingModule ter de exportar o RouterModule. Ele faz isto em prol da árvore de componentes subjacente da raiz do módulo. Ele precisa de ter acesso a essas funcionalidades de redirecionamento!</p><pre><code class="language-typescript">import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { AComponent } from './components/a/a.component';
import { BComponent } from './components/b/b.component';
import { AppRoutingModule } from './modules/app-routing/app-routing.module';

@NgModule({
  declarations: [
    AppComponent,
    AComponent,
    BComponent
  ],
  imports: [
    AppRoutingModule, // redirecionamento de módulo de funcionalidades
    BrowserModule
  ],
  providers: [],
  bootstrap: [ AppComponent ]
})
export class AppModule { }</code></pre><p>O token AppRoutingModule importa a partir do topo. O seu token é inserido na raiz do array de importação do módulo. A árvore de componente raiz pode agora utilizar a biblioteca RouterModule. Isto inclui as suas diretrizes, interfaces e serviços tal como já foi mencionado. Um grande agradecimento ao AppRoutingModule por exportar o RouterModule!</p><p>As funcionalidades do RouterModule vão dar jeito para os componentes da raiz. O HTML básico para o AppComponent utiliza uma diretriz: <code>router-outlet</code>.</p><pre><code class="language-html">&lt;!-- app.component.html --&gt;

&lt;ul&gt;
  &lt;!-- routerLink(s) aqui --&gt;
&lt;/ul&gt;
&lt;router-outlet&gt;&lt;/router-outlet&gt;
&lt;!-- conteúdo redirecionado é anexado aqui (DEPOIS DO ELEMENTO, NÃO DENTRO!) --&gt;</code></pre><p><code>routerLink</code> é uma diretriz de atributo do RouterModule. Vai ser anexada a cada elemento do <code>&lt;ul&gt;&lt;/ul&gt;</code> assim que os caminhos estejam configurados. <code>router-outlet</code> é uma diretriz de componente com um comportamento interessante. Funciona mais como um marcador para exibir conteúdo redirecionado. O conteúdo redirecionado é resultante da navegação para um caminho específico. Geralmente, isto significa um único componente, conforme configurado no AppRoutingModule.</p><p>O conteúdo redirecionado é renderizado logo após <code>&lt;router-outlet&gt;&lt;/router-outlet&gt;</code>. Nada é renderizado dentro dele. Isto não faz grande diferença. Dito isto, não esperes que o <code>router-outlet</code> se comporte como um recipiente para conteúdo redirecionado. É simplesmente um marcador para anexar conteúdo redirecionado ao Modelo de Objeto de Documento (DOM).</p><p>A primeira questão a ser abordada é que caminhos esta aplicação irá consumir? Bem, existem dois componentes: <code>AComponent</code> e <code>BComponent</code>. Cada um deve ter o seu próprio caminho. Estes podem renderizar a partir do <code>router-outlet</code> do AppComponent, dependendo da localização atual do caminho.</p><p>A localização do caminho (ou caminhos) define o que é anexado à <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin">origem de um website</a> (por exemplo, <a href="http://localhost:4200/">http://localhost:4200</a>), através de uma série de barras (<code>/</code>).</p><pre><code class="language-typescript">// … mesmas importações de antes …

const routes: Routes = [
  {
    path: 'A',
    component: AComponent
  },
  {
    path: 'B',
    component: BComponent
  }
];

@NgModule({
  imports: [ RouterModule.forRoot(routes) ],
  exports: [ RouterModule ]
})
export class AppRoutingModule { }</code></pre><p><code>http://localhost:4200/A</code> renderiza AComponent a partir do <code>router-outlet</code> do AppComponent. <code>http://localhost:4200/B</code> renderiza BComponent. No entanto, precisas de uma maneira de encaminhar para essas localizações sem utilizar a barra de endereços. Uma aplicação não deve depender da barra de navegação de um browser para a navegação.</p><p><em>O<em> CSS (</em>do inglês, <em>Cascading Style</em>s<em>heets) </em>global suplementa o<em> HTML </em>abaixo dele<em>. </em>Um link de redirecionamento da aplicação deve ter uma boa aparência<em>. </em>O<em> CSS </em>abaixo também <em>é</em> aplicado<em> </em>a todos os outros exemplos<em>.</em></em></p><pre><code class="language-css">/* styles.css global */

ul li {
  cursor: pointer;
  display: inline-block;
  padding: 20px;
  margin: 5px;
  background-color: whitesmoke;
  border-radius: 5px;
  border: 1px solid black;
}

ul li:hover {
  background-color: lightgrey;
}</code></pre><pre><code class="language-html">&lt;!-- app.component.html --&gt;

&lt;ul&gt;
  &lt;li routerLink="/A"&gt;Vá para A!&lt;/li&gt;
  &lt;li routerLink="/B"&gt;Vá para B!&lt;/li&gt;
&lt;/ul&gt;
&lt;router-outlet&gt;&lt;/router-outlet&gt;</code></pre><p>Isto é redirecionamento básico! Clicar em qualquer um dos elementos routerLink encaminha para o endereço web. Isto redefine-o sem atualizar o browser. O <code>Router</code> do Angular mapeia o endereço encaminhado para o <code>Routes</code> configurado no AppRoutingModule. Ele faz a correspondência com a propriedade <code>path</code> de um único objeto <code>Route</code> dentro do array. A primeira correspondência vence sempre, por isso, caminhos de correspondência total devem estar no final do array <code>Routes</code>.</p><p>Caminhos de correspondência total previnem que a aplicação pare de funcionar se não conseguir corresponder a nenhum caminho atual. Isto pode acontecer a partir da barra de endereços, onde o utilizador pode escrever outro caminho. Para isso, o Angular fornece um valor de caminho <code>**</code>, que aceita todos os caminhos. Esse caminho geralmente renderiza um componente <code>PageNotFoundComponent</code>, que exibe "Error 404: Page not found" (Erro 404: página não encontrada).</p><pre><code class="language-typescript">// … PageNotFoundComponent importado juntamente com todo o resto …

const routes: Routes = [
  {
    path: 'A',
    component: AComponent
  },
  {
    path: 'B',
    component: BComponent
  },
  {
    path: '',
    redirectTo: 'A',
    pathMatch: 'full'
  },
  {
    path: '**',
    component: PageNotFoundComponent
  }
];</code></pre><p>O objeto <code>Route</code> que contém <code>redirectTo</code> impede que o PageNotFoundComponent renderize como resultado de <code>http://localhost:4200</code>. Este é o caminho principal da aplicação. Para corrigir isto, o <code>redirectTo</code> redireciona o caminho principal para <code>http://localhost:4200/A</code>. O <code>http://localhost:4200/A</code> torna-se indiretamente o novo caminho principal da aplicação.</p><p>O <code>pathMatch: 'full'</code> indica ao objeto <code>Route</code> para fazer correspondência com o caminho principal (<code>http://localhost:4200</code>). Isto corresponde a um caminho vazio.</p><p>Estes dois novos objetos <code>Route</code> ficam no final do array, visto que a primeira correspondência vence. O último elemento do array (<code>path: '**'</code>) corresponde sempre, por isso fica no final.</p><p>Existe mais uma coisa que vale a pena abordar antes de avançarmos. Como é que o utilizador sabe onde ele ou ela está na aplicação, em relação ao caminho atual? Claro que pode existir conteúdo específico para o caminho, mas como se supõe que um utilizador fará essa ligação? Deve existir algum tipo de destaque aplicado ao routerLinks. Deste modo, o utilizador saberá que caminho está ativo para a página da web fornecida.</p><p>Esta é uma solução simples. Quando clicas num elemento <code>routerLink</code>, o <code>Router</code> do Angular atribui-lhe <em><em>foc</em>o</em>. Esse foco pode acionar determinados estilos que fornecem feedback útil ao utilizador. A diretriz <code>routerLinkActive</code> pode rastrear este foco para o programador.</p><pre><code class="language-html">&lt;!-- app.component.html --&gt;

&lt;ul&gt;
  &lt;li routerLink="/A" routerLinkActive="active"&gt;Vá para A!&lt;/li&gt;
  &lt;li routerLink="/B" routerLinkActive="active"&gt;Vá para B!&lt;/li&gt;
&lt;/ul&gt;
&lt;router-outlet&gt;&lt;/router-outlet&gt;</code></pre><p>A atribuição correta de <code>routerLinkActive</code> representa uma string de classes. Este exemplo retrata apenas uma classe (<code>.active</code>), mas qualquer número de classes com espaço delimitado pode ser aplicado. Quando o <code>Router</code> atribui <em><em>foc</em>o</em> a um routerLink, as classes de espaço delimitado são aplicadas ao elemento anfitrião. Quando o foco desaparece, as classes são removidas automaticamente.</p><pre><code class="language-css">/* styles.css global */

.active {
  background-color: lightgrey !important;
}</code></pre><p>Os utilizadores podem agora facilmente reconhecer como o caminho atual e o conteúdo da página coincidem. O destaque <code>lightgrey</code> aplica-se à correspondência do routerLink com o caminho atual. <code>!important</code> garante que o destaque se sobrepõe a estilo em linha.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Componentes de HTML reutilizáveis – como reutilizar o cabeçalho e o rodapé num site da web ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução realizada em português europeu Imagina que estás a criar um site para um cliente, uma pequena loja familiar, que tem apenas duas páginas. Não é muita coisa. Por isso, quando terminas a página principal e começas a trabalhar na página de contactos, simplesmente crias um ficheiro HTML e ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/componentes-de-html-reutilizaveis-como-reutilizar-o-cabecalho-e-o-rodape-num-site-da-web/</link>
                <guid isPermaLink="false">641d633702ec1d064260e670</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Tue, 16 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/5f9c986b740569d1a4ca19f5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/reusable-html-components-how-to-reuse-a-header-and-footer-on-a-website/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Reusable HTML Components – How to Reuse a Header and Footer on a Website</a>
      </p><blockquote>Tradução realizada em português europeu</blockquote><p>Imagina que estás a criar um site para um cliente, uma pequena loja familiar, que tem apenas duas páginas.</p><p>Não é muita coisa. Por isso, quando terminas a página principal e começas a trabalhar na página de contactos, simplesmente crias um ficheiro HTML e copias todo o código da primeira página.</p><p>O cabeçalho e o rodapé já têm bom aspeto e tudo o que precisas fazer é alterar o conteúdo restante.</p><p>O que fazer, no entanto, se o teu cliente quiser 10 páginas? Ou 20? Como farias se ele pedir pequenas alterações no cabeçalho e no rodapé ao longo do desenvolvimento?</p><p>De repente, qualquer alteração, por mais pequena que seja, tem de ser repetida ao longo de todos os ficheiros.</p><p>Esse é um dos maiores problemas que coisas como o React ou Handlebars.js ajudam a resolver: qualquer código, em especial, coisas estruturais como o cabeçalho ou o rodapé, pode ser escrito uma vez e reutilizado ao longo do projeto.</p><p>Até bem recentemente, era impossível utilizar componentes em HTML simples e em JavaScript. Porém, com a introdução dos Web Components, é possível criar componentes reutilizáveis sem utilizar coisas como o React.</p><h2 id="o-que-s-o-os-web-components"><strong>O que são os </strong>Web Components<strong>?</strong></h2><p>Os Web Components são, na realidade, uma coleção de algumas tecnologias diferentes que te permitem criar elementos HTML personalizados.</p><p>Essas tecnologias são:</p><ul><li><strong><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots">T</a><strong><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots">emplates</a></strong><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots"> HTM</a><strong><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots">L</a></strong></strong> (texto em inglês): fragmentos de código HTML utilizando elementos <code>&lt;template&gt;</code> que não vão ser renderizados até que sejam anexados à página com JavaScript.</li><li><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements"><strong>Elementos personalizados</strong></a> (texto em inglês): APIs do JavaScript com vasto suporte que te permitem criar elementos do DOM. Assim que criares e registares um elemento personalizado através dessas APIs, poderás utilizá-lo de modo semelhante a um componente do React.</li><li><strong><strong><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM">Shadow DOM</a></strong></strong> (texto em inglês): é um DOM menor, encapsulado, que está isolado do DOM principal e renderizado separadamente. Os estilos e scripts que crias para teus componentes personalizados no Shadow DOM não afetarão outros elementos no DOM principal.</li></ul><p>Vamos abordar cada uma dessas tecnologias ao longo do tutorial.</p><h2 id="como-utilizar-templates-de-html"><strong>Como utilizar <em>templates </em>de HTML</strong></h2><p>A primeira peça do quebra-cabeças é aprender como utilizar <em>templates </em>de HTML para criar código HTML reutilizável.</p><p>Vamos observar um exemplo de uma simples mensagem de boas-vindas:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
    &lt;script src="index.js" type="text/javascript" defer&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;template id="welcome-msg"&gt;
      &lt;h1&gt;Hello, World!&lt;/h1&gt;
      &lt;p&gt;And all who inhabit it&lt;/p&gt;
    &lt;/template&gt;
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><p>Se observares a página, nem os elementos <code>&lt;h1&gt;</code> nem os <code>&lt;p&gt;</code> são renderizados. Se, contudo, abrires a consola de desenvolvimento, verás que ambos os elementos foram analisados:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-50.png" class="kg-image" alt="image-50" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image-50.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/image-50.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-50.png 1186w" width="1186" height="692" loading="lazy"></figure><p>Para renderizar mesmo a mensagem de boas-vindas, vais precisar de utilizar um pouco de JavaScript:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const template = document.getElementById('welcome-msg');

document.body.appendChild(template.content);
</code></pre><figcaption>index.js</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-51.png" class="kg-image" alt="image-51" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image-51.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/image-51.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-51.png 1157w" width="1157" height="683" loading="lazy"></figure><p>Embora esse seja um exemplo bastante simples, já é possível veres como a utilização de <em>templates </em>torna mais fácil reutilizar código ao longo da página.</p><p>O principal problema é que, pelo menos no exemplo atual, o código da mensagem de boas-vindas está misturado com o resto do conteúdo da página. Se desejares alterar a mensagem mais tarde, terás de alterar o código em vários ficheiros.</p><p>Em vez disso, podes puxar o <em>template </em>HTML para o ficheiro JavaScript, de maneira a que qualquer página onde o JavaScript está incluido irá renderizar a mensagem de boas-vindas:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
    &lt;script src="index.js" type="text/javascript" defer&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
      
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">const template = document.createElement('template');

template.innerHTML = `
  &lt;h1&gt;Hello, World!&lt;/h1&gt;
  &lt;p&gt;And all who inhabit it&lt;/p&gt;
`;

document.body.appendChild(template.content);
</code></pre><figcaption>index.js</figcaption></figure><p>Agora que temos tudo no ficheiro JavaScript, não é necessário criares um elemento <code>&lt;template&gt;</code> – podes simplesmente criar um elemento <code>&lt;div&gt;</code> ou <code>&lt;span&gt;</code>.</p><p>No entanto, os elementos <code>&lt;template&gt;</code> podem ser combinados com um elemento <code>&lt;slot&gt;</code>, que te permite fazer coisas como alterar o texto para elementos dentro de <code>&lt;template&gt;</code>. É um pouco fora do âmbito deste tutorial. Por isso, podes ler mais sobre elementos <code>&lt;slot&gt;</code> <a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots#Adding_flexibility_with_slots">na MDN</a> (texto em inglês).</p><h2 id="como-criar-elementos-personalizados"><strong>Como criar elementos personalizados</strong></h2><p>Uma coisa que podes ter reparado ao utilizar <em>templates </em>de HTML é que pode ser complicado inserir o teu código no local correto. O exemplo anterior da mensagem de boas-vindas estava apenas anexado à página.</p><p>Se já existisse conteúdo na página, digamos, uma imagem de <em>banner</em>, a mensagem de boas-vindas apareceria abaixo da imagem.</p><p>Como elemento personalizado, a tua mensagem de boas-vindas poderia ter este aspeto:</p><pre><code class="language-html">&lt;welcome-message&gt;&lt;/welcome-message&gt;
</code></pre><p>Poderias colocá-la em qualquer local da página.</p><p>Com isto em mente, vamos observar os elementos personalizados e criar os nossos próprios elementos de cabeçalho e rodapé ao estilo do React.</p><h3 id="configura-o"><strong>Configuração</strong></h3><p>Para um site de portfólio, podes ter algum código predefinido que se pareça com isto:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;main&gt;
      &lt;!-- O conteúdo da tua página --&gt;
    &lt;/main&gt;
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-css">* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html, body {
  height: 100%;
}

body {
  color: #333;
  font-family: sans-serif;
  display: flex;
  flex-direction: column;
}

main {
  flex: 1 0 auto;
}
</code></pre><figcaption>style.css</figcaption></figure><p>Cada página terá o mesmo cabeçalho e rodapé. Por isso, faz sentido criar um elemento personalizado para cada um deles.</p><p>Vamos começar pelo cabeçalho.</p><h3 id="definir-um-elemento-personalizado"><strong>Definir um elemento personalizado</strong></h3><p>Primeiro, cria uma pasta chamada <code>components</code>. Dentro dessa pasta, cria um ficheiro chamado <code>header.js</code>, com o seguinte código:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">class Header extends HTMLElement {
  constructor() {
    super();
  }
}
</code></pre><figcaption>components/header.js</figcaption></figure><p>É apenas uma simples <code>class</code> do ES5 a declarar o teu componente <code>Header</code> personalizado, com o método <code>constructor</code> e a palavra-chave especial <code>super</code>. Podes ler mais sobre isto <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Classes">na MDN</a>.</p><p>Ao estender a classe genérica <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement"><code>HTMLElement</code></a>, podes criar qualquer tipo de elemento que queiras. Também é possível extender elementos específicos como <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLParagraphElement"><code>HTMLParagraphElement</code></a>.</p><h3 id="registar-o-teu-elemento-personalizado"><strong>Registar o teu elemento personalizado</strong></h3><p>Antes de começares a utilizar o teu elemento personalizado, vais precisar de o registar com o método <code>customElements.define()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">class Header extends HTMLElement {
  constructor() {
    super();
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><p>Esse método recebe pelo menos dois argumentos.</p><p>O primeiro é uma <code>DOMString</code> que vais utilizar quando estiveres a adicionar o componente à página, neste caso, <code>&lt;header-component&gt;&lt;/header-component&gt;</code>.</p><p>O próximo é a classe do componente que criaste anteriormente, neste caso, a classe <code>Header</code>.</p><p>O terceiro argumento, é opcional, e descreve qual é o elemento HTML existente do qual o teu elemento personalizado optional vai herdar propriedades, por exemplo, <code>{extends: 'p'}</code>. No entanto, não vamos utilizar esta funcionalidade neste tutorial.</p><h3 id="utilizar-callbacks-de-ciclo-de-vida-para-adicionar-o-cabe-alho-p-gina"><strong>Utilizar <em>callbacks </em>de ciclo de vida para adicionar o cabeçalho à página</strong></h3><p>Existem quatro <em>callbacks </em>de ciclo de vida especiais para elementos personalizados que podemos utilizar para anexar o código do cabeçalho à página: <code>connectedCallback</code>, <code>attributeChangeCallback</code>, <code>disconnectedCallback</code> e <code>adoptedCallback</code>.</p><p>Destas <em>callbacks</em>, <code>connectedCallback</code> é uma das mais utilizadas. <code>connectedCallback</code> executa cada vez que o teu elemento personalizado é inserido no DOM.</p><p>Podes ler mais sobre outras <em>callbacks </em><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#Using_the_lifecycle_callbacks">aqui</a>.</p><p>Para o nosso simples exemplo, <code>connectedCallback</code> é suficiente para adicionar um cabeçalho à página:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">class Header extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    this.innerHTML = `
      &lt;style&gt;
        nav {
          height: 40px;
          display: flex;
          align-items: center;
          justify-content: center;
          background-color:  #0a0a23;
        }

        ul {
          padding: 0;
        }
        
        a {
          font-weight: 700;
          margin: 0 25px;
          color: #fff;
          text-decoration: none;
        }
        
        a:hover {
          padding-bottom: 5px;
          box-shadow: inset 0 -2px 0 0 #fff;
        }
      &lt;/style&gt;
      &lt;header&gt;
        &lt;nav&gt;
          &lt;ul&gt;
            &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
          &lt;/ul&gt;
        &lt;/nav&gt;
      &lt;/header&gt;
    `;
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><p>Depois, no <code>index.html</code>, adiciona o script <code>components/header.js</code> e <code>&lt;header-component&gt;&lt;/header-component&gt;</code> logo acima do elemento <code>&lt;main&gt;</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
    &lt;script src="components/header.js" type="text/javascript" defer&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;header-component&gt;&lt;/header-component&gt;
    &lt;main&gt;
      &lt;!-- O conteúdo da tua página --&gt;
    &lt;/main&gt;
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><p>O teu componente de cabeçalho reutilizável, agora, deve ser renderizado na página:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-54.png" class="kg-image" alt="image-54" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image-54.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/image-54.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/05/image-54.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-54.png 1916w" sizes="(min-width: 1200px) 1200px" width="1916" height="787" loading="lazy"></figure><p>Agora, adicionar um cabeçalho à página é tão simples como adicionar uma tag <code>&lt;script&gt;</code> a apontar para <code>components/header.js</code>, e adicionar <code>&lt;header-component&gt;&lt;/header-component&gt;</code> onde quiseres.</p><p>Nota que, visto que o cabeçalho e a sua estilização estão a ser inseridos diretamente no DOM principal, é possível estilizá-lo no ficheiro <code>style.css</code>.</p><p>Se, contudo, observares os estilos do cabeçalho em <code>connectedCallback</code>, estes são bastante genéricos e podem afetar outros estilos na página.</p><p>Por exemplo, se adicionarmos o Font Awesome e um componente de rodapé a <code>index.html</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA==" crossorigin="anonymous" /&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
    &lt;script src="components/header.js" type="text/javascript" defer&gt;&lt;/script&gt;
    &lt;script src="components/footer.js" type="text/javascript" defer&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;header-component&gt;&lt;/header-component&gt;
    &lt;main&gt;
      &lt;!-- O conteúdo da tua página --&gt;
    &lt;/main&gt;
    &lt;footer-component&gt;&lt;/footer-component&gt;
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">class Footer extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    this.innerHTML = `
      &lt;style&gt;
        footer {
          height: 60px;
          padding: 0 10px;
          list-style: none;
          display: flex;
          justify-content: space-between;
          align-items: center;
          background-color: #dfdfe2;
        }
        
        ul li {
          list-style: none;
          display: inline;
        }
        
        a {
          margin: 0 15px;
          color: inherit;
          text-decoration: none;
        }
        
        a:hover {
          padding-bottom: 5px;
          box-shadow: inset 0 -2px 0 0 #333;
        }
        
        .social-row {
          font-size: 20px;
        }
        
        .social-row li a {
          margin: 0 15px;
        }
      &lt;/style&gt;
      &lt;footer&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;ul class="social-row"&gt;
          &lt;li&gt;&lt;a href="https://github.com/my-github-profile"&gt;&lt;i class="fab fa-github"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="https://twitter.com/my-twitter-profile"&gt;&lt;i class="fab fa-twitter"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="https://www.linkedin.com/in/my-linkedin-profile"&gt;&lt;i class="fab fa-linkedin"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/footer&gt;
    `;
  }
}

customElements.define('footer-component', Footer);
</code></pre><figcaption>components/footer.js</figcaption></figure><p>Aqui está como ficaria o aspeto da página:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-55.png" class="kg-image" alt="image-55" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image-55.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/image-55.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/05/image-55.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-55.png 1919w" sizes="(min-width: 1200px) 1200px" width="1919" height="1001" loading="lazy"></figure><p>A estilização do rodapé sobrepõe-se à estilização do cabeçalho, alterando a cor dos links. Este é o comportamento esperado para o CSS, mas seria interessante se a estilização de cada componente estivesse vinculada a esse componente, sem afetar outras coisas na página.</p><p>Bem, é mesmo onde o <em>Shadow DOM</em> brilha. Ou escurece? De qualquer modo, o <em>Shadow DOM</em> pode fazer isso.</p><h3 id="como-utilizar-o-shadow-dom-com-elementos-personalizados"><strong>Como utilizar o <em>Shadow DOM</em> com elementos personalizados</strong></h3><p>O <em>Shadow DOM </em>funciona como uma instância separada e mais pequena do DOM principal. Em vez de funcionar como uma cópia do DOM principal, o <em>Shadow DOM</em> é mais uma sub-árvore apenas para o teu elemento personalizado. Qualquer coisa adicionada a ele, especialmente os estilos, está vinculada a esse elemento personalizado em particular.</p><p>De certo modo, é como utilizar <code>const</code> e <code>let</code> em vez de <code>var</code>.</p><p>Vamos começar por refatorizar o componente de cabeçalho:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const headerTemplate = document.createElement('template');

headerTemplate.innerHTML = `
  &lt;style&gt;
    nav {
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      background-color:  #0a0a23;
    }

    ul {
      padding: 0;
    }
    
    ul li {
      list-style: none;
      display: inline;
    }
    
    a {
      font-weight: 700;
      margin: 0 25px;
      color: #fff;
      text-decoration: none;
    }
    
    a:hover {
      padding-bottom: 5px;
      box-shadow: inset 0 -2px 0 0 #fff;
    }
  &lt;/style&gt;
  &lt;header&gt;
    &lt;nav&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
  &lt;/header&gt;
`;

class Header extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><p>A primeira coisa que precisas fazer é utilizar o método <code>.attachShadow()</code> para anexar uma raiz do <em>Shadow Dom</em> ao teu elemento de componente de cabeçalho personalizado. Em <code>connectedCallback</code>, adiciona o seguinte código:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">...
class Header extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    const shadowRoot = this.attachShadow({ mode: 'closed' });
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><p>Repara que estamos a passar um objeto para <code>.attachShadow()</code> com uma opção, <code>mode: 'closed'</code>. Isto significa apenas que o <em>Shadow DOM </em>do componente de cabeçalho não é acessível a partir de JavaScript externo.</p><p>Se quiseres manipular o <em>Shadow DOM </em>do componente de cabeçalho mais tarde com JavaScript fora do ficheiro <code>components/header.js</code>, simplesmente muda a opção para <code>mode: 'open'</code>.</p><p>Por fim, anexa <code>shadowRoot</code> à página com o método <code>.appendChild()</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">...

class Header extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    const shadowRoot = this.attachShadow({ mode: 'closed' });

    shadowRoot.appendChild(headerTemplate.content);
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><p>Agora, visto que os estilos de componente do cabeçalho estão encapsulados no seu <em>Shadow DOM</em>, a página deve ter este aspeto:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-56.png" class="kg-image" alt="image-56" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image-56.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/image-56.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/05/image-56.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image-56.png 1921w" sizes="(min-width: 1200px) 1200px" width="1921" height="1005" loading="lazy"></figure><p>Aqui está o componente de rodapé refatorizado para utilizar o <em>Shadow DOM</em>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const footerTemplate = document.createElement('template');

footerTemplate.innerHTML = `
  &lt;style&gt;
    footer {
      height: 60px;
      padding: 0 10px;
      list-style: none;
      display: flex;
      flex-shrink: 0;
      justify-content: space-between;
      align-items: center;
      background-color: #dfdfe2;
    }

    ul {
      padding: 0;
    }
    
    ul li {
      list-style: none;
      display: inline;
    }
    
    a {
      margin: 0 15px;
      color: inherit;
      text-decoration: none;
    }
    
    a:hover {
      padding-bottom: 5px;
      box-shadow: inset 0 -2px 0 0 #333;
    }
    
    .social-row {
      font-size: 20px;
    }
    
    .social-row li a {
      margin: 0 15px;
    }
  &lt;/style&gt;
  &lt;footer&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class="social-row"&gt;
      &lt;li&gt;&lt;a href="https://github.com/my-github-profile"&gt;&lt;i class="fab fa-github"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://twitter.com/my-twitter-profile"&gt;&lt;i class="fab fa-twitter"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://www.linkedin.com/in/my-linkedin-profile"&gt;&lt;i class="fab fa-linkedin"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/footer&gt;
`;

class Footer extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    const shadowRoot = this.attachShadow({ mode: 'closed' });

    shadowRoot.appendChild(footerTemplate.content);
  }
}

customElements.define('footer-component', Footer);
</code></pre><figcaption>components/footer.js</figcaption></figure><p>Contudo, se observares a página, podes ver que os ícones do Font Awesome estão em falta:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/missing-fa-icons-1.png" class="kg-image" alt="missing-fa-icons-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/missing-fa-icons-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/missing-fa-icons-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/missing-fa-icons-1.png 1535w" sizes="(min-width: 1200px) 1200px" width="1535" height="785" loading="lazy"></figure><p>Agora que o componente de rodapé está encapsulado dentro do seu próprio <em>Shadow DOM</em>, já não tem acesso ao link CDN do Font Awesome em <code>index.html</code>.</p><p>Vamos observar rapidamente a razão disto acontecer e como voltar a colocar o Font Awesome a funcionar.</p><h2 id="encapsulamento-e-o-shadow-dom"><strong>Encapsulamento e o <em>Shadow DOM</em></strong></h2><p>Enquanto que o <em>Shadow DOM</em> impede que os estilos dos teus componentes afetem o resto da página, alguns estilos globais podem infiltrar-se na mesma nos teus componentes.</p><p>Nos exemplos acima, isto era uma funcionalidade útil. Por exemplo, o componente de rodapé herda a declaração <code>color: #333</code> que é definida em <code>style.css</code>. Isto acontece porque <code>color</code> é uma das propriedades que podem ser herdadas, juntamente com <code>font</code>, <code>font-family</code>, <code>direction</code>, entre outras.</p><p>Se quiseres impedir este comportamento e estilizar cada componente completamente do zero, podes fazê-lo com apenas algumas linhas de CSS:</p><pre><code class="language-css">:host {
  all: initial;
  display: block;
}</code></pre><p><code>:host</code> é um pseudosseletor que seleciona o elemento que está a hospedar o <em>Shadow DOM</em>. Neste caso, é o teu componente personalizado.</p><p>Então, a declaração <code>all: initial</code> redefine todas as propriedades CSS de volta para os seus valores iniciais. <code>display: block</code> faz a mesma coisa para a propriedade <code>display</code> e redefine a propriedade de volta para a predefinição do navegador, <code>block</code>.</p><p>Para uma lista completa de propriedades do CSS que podem ser herdadas, observa esta <a href="https://stackoverflow.com/questions/5612302/which-css-properties-are-inherited">resposta no Stack Overflow</a> (texto em inglês).</p><h2 id="como-utilizar-o-font-awesome-com-o-shadow-dom"><strong>Como utilizar o Font Awesome com o <em>Shadow DOM</em></strong></h2><p>Agora, podes estar a pensar, se <code>font</code>, <code>font-family</code> e outras propriedades do CSS relacionadas com tipos de letra são propriedades que podem ser herdadas, porque é que o Font Awesome não carrega agora que o componente de rodapé está a utilizar o <em>Shadow DOM</em>?</p><p>Acontece que, para coisas como fontes e outros recursos, estas precisam de ser referenciadas tanto no DOM principal como no <em>Shadow DOM </em>para funcionar corretamente.</p><p>Felizmente, existem algumas formas simples de corrigir isto.</p><p>Observação: todos estes métodos ainda requerem que o Font Awesome seja incluído em <code>index.html</code>, com o elemento <code>link</code> tal como no trecho de código acima.</p><h3 id="n-1-link-para-o-font-awesome-dentro-do-teu-componente"><strong>Nº 1: Link para o Font Awesome dentro do teu componente</strong></h3><p>A forma mais direta de fazer com que o Font Awesome funcione no teu componente do <em>Shadow DOM</em> é incluir um <code>link</code> para ele dentro do próprio componente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const footerTemplate = document.createElement('template');

footerTemplate.innerHTML = `
  &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA==" crossorigin="anonymous" /&gt;
  &lt;style&gt;
    footer {
      height: 60px;
      padding: 0 10px;
      list-style: none;
...</code></pre><figcaption>components/footer.js</figcaption></figure><p>Uma coisa a ter em conta é que, embora pareça que estás a causar que o navegador carregue duas vezes o Font Awesome (uma para o DOM principal e novamente para o componente), os navegadores são suficientemente inteligentes para não buscar o mesmo recurso novamente.</p><p>Aqui está o separador de rede a mostrar que o Chrome vai buscar o Font Awesome uma só vez:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Screenshot-from-2021-09-12-14-53-01.png" class="kg-image" alt="Screenshot-from-2021-09-12-14-53-01" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/Screenshot-from-2021-09-12-14-53-01.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/05/Screenshot-from-2021-09-12-14-53-01.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Screenshot-from-2021-09-12-14-53-01.png 1002w" width="1002" height="261" loading="lazy"></figure><h3 id="n-2-importar-o-font-awesome-dentro-do-teu-componente"><strong>Nº 2: Importar o Font Awesome dentro do teu componente</strong></h3><p>De seguida, podes utilizar <code>@import</code> e <code>url()</code> para carregar o Font Awesome no teu componente:</p><pre><code class="language-js">const footerTemplate = document.createElement('template');

footerTemplate.innerHTML = `
  &lt;style&gt;
    @import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css");

    footer {
      height: 60px;
      padding: 0 10px;
      list-style: none;
...</code></pre><p>Nota que o URL deve ser o mesmo que estás a utilizar em <code>index.html</code>.</p><h3 id="n-3-utilizar-javascript-para-carregar-dinamicamente-o-font-awesome-para-o-teu-componente"><strong>Nº 3: Utilizar JavaScript para carregar dinamicamente o Font Awesome para o teu componente</strong></h3><p>Por fim, a forma mais prática de carregar o Font Awesome dentro do teu componente é utilizar um pouco de JavaScript:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">...
class Footer extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    // Query para o DOM principal para FA
    const fontAwesome = document.querySelector('link[href*="font-awesome"]');
    const shadowRoot = this.attachShadow({ mode: 'closed' });

    // Carregar condicionalmente FA para o componente
    if (fontAwesome) {
      shadowRoot.appendChild(fontAwesome.cloneNode());
    }

    shadowRoot.appendChild(footerTemplate.content);
  }
}

customElements.define('footer-component', Footer);</code></pre><figcaption>components/footer.js</figcaption></figure><p>Este método é baseado nesta <a href="https://stackoverflow.com/a/55360574">resposta no Stack Overflow</a> (texto em inglês) e funciona de modo bastante simples. Quando o componente carrega, se um elemento <code>link</code> a apontar para o Font Awesome existir, então é clonado e anexado ao <em>Shadow DOM </em>do componente:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Screenshot-from-2021-09-12-19-31-19.png" class="kg-image" alt="Screenshot-from-2021-09-12-19-31-19" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/Screenshot-from-2021-09-12-19-31-19.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Screenshot-from-2021-09-12-19-31-19.png 909w" width="909" height="187" loading="lazy"></figure><h2 id="c-digo-final"><strong>Código final</strong></h2><p>Aqui está como fica o código final ao longo de todos os ficheiros, utilizando o método nº 3 para carregar o Font Awesome no componente de rodapé:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA==" crossorigin="anonymous" /&gt;
    &lt;link href="style.css" rel="stylesheet" type="text/css" /&gt;
    &lt;script src="components/header.js" type="text/javascript" defer&gt;&lt;/script&gt;
    &lt;script src="components/footer.js" type="text/javascript" defer&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;header-component&gt;&lt;/header-component&gt;
    &lt;main&gt;
      &lt;!-- O conteúdo da tua página --&gt;
    &lt;/main&gt;
    &lt;footer-component&gt;&lt;/footer-component&gt;
  &lt;/body&gt;
&lt;html&gt;
</code></pre><figcaption>index.html</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-css">* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html,
body {
  height: 100%;
}

body {
  color: #333;
  font-family: sans-serif;
  display: flex;
  flex-direction: column;
}

main {
  flex: 1 0 auto;
}
</code></pre><figcaption>style.css</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">const headerTemplate = document.createElement('template');

headerTemplate.innerHTML = `
  &lt;style&gt;
    nav {
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      background-color:  #0a0a23;
    }

    ul {
      padding: 0;
    }
    
    ul li {
      list-style: none;
      display: inline;
    }
    
    a {
      font-weight: 700;
      margin: 0 25px;
      color: #fff;
      text-decoration: none;
    }
    
    a:hover {
      padding-bottom: 5px;
      box-shadow: inset 0 -2px 0 0 #fff;
    }
  &lt;/style&gt;
  &lt;header&gt;
    &lt;nav&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/nav&gt;
  &lt;/header&gt;
`;

class Header extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    const shadowRoot = this.attachShadow({ mode: 'closed' });

    shadowRoot.appendChild(headerTemplate.content);
  }
}

customElements.define('header-component', Header);
</code></pre><figcaption>components/header.js</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">const footerTemplate = document.createElement('template');

footerTemplate.innerHTML = `
  &lt;style&gt;
    footer {
      height: 60px;
      padding: 0 10px;
      list-style: none;
      display: flex;
      flex-shrink: 0;
      justify-content: space-between;
      align-items: center;
      background-color: #dfdfe2;
    }

    ul {
      padding: 0;
    }
    
    ul li {
      list-style: none;
      display: inline;
    }
    
    a {
      margin: 0 15px;
      color: inherit;
      text-decoration: none;
    }
    
    a:hover {
      padding-bottom: 5px;
      box-shadow: inset 0 -2px 0 0 #333;
    }
    
    .social-row {
      font-size: 20px;
    }
    
    .social-row li a {
      margin: 0 15px;
    }
  &lt;/style&gt;
  &lt;footer&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="about.html"&gt;About&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="work.html"&gt;Work&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="contact.html"&gt;Contact&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class="social-row"&gt;
      &lt;li&gt;&lt;a href="https://github.com/my-github-profile"&gt;&lt;i class="fab fa-github"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://twitter.com/my-twitter-profile"&gt;&lt;i class="fab fa-twitter"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://www.linkedin.com/in/my-linkedin-profile"&gt;&lt;i class="fab fa-linkedin"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/footer&gt;
`;

class Footer extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    const fontAwesome = document.querySelector('link[href*="font-awesome"]');
    const shadowRoot = this.attachShadow({ mode: 'closed' });

    if (fontAwesome) {
      shadowRoot.appendChild(fontAwesome.cloneNode());
    }

    shadowRoot.appendChild(footerTemplate.content);
  }
}

customElements.define('footer-component', Footer);
</code></pre><figcaption>components/footer.js</figcaption></figure><h2 id="para-terminar"><strong>Para terminar</strong></h2><p>Abordamos muita coisa aqui. Podes já ter decidido simplesmente utilizar React ou Handlebars.js em vez disso.</p><p>São ambas óptimas opções!</p><p>Mesmo assim, para um projeto mais pequeno onde vais precisar apenas de alguns componentes reutilizáveis, uma biblioteca completa ou linguagem de <em>template </em>pode ser demasiado.</p><p>Esperançosamente, agora tens a confiança para criar os teus próprios componentes HTML reutilizáveis. Agora, vai lá e cria algo excelente (e reutilizável).</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprende o sistema de grelha do Bootstrap 4 em 10 minutos ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Elena-Cristina Conacel > Tradução em português europeu O sistema de grelha do Bootstrap 4 é utilizado para layouts responsivos. Um layout responsivo representa a forma como os elementos ficam alinhados numa página em resoluções diferentes. É importante compreender como utilizar o sistema de grelha (do inglês, grid system) ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/</link>
                <guid isPermaLink="false">6449325e0fb65d064e627d2a</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Mon, 15 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_9nkJt3S1Fe_KMkDtpIhgXw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/learn-the-bootstrap-4-grid-system-in-10-minutes-e83bfae115da/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn the Bootstrap 4 Grid System in 10 Minutes</a>
      </p><p>Escrito por: Elena-Cristina Conacel</p><blockquote>Tradução em português europeu</blockquote><p>O sistema de grelha do Bootstrap 4 é utilizado para layouts responsivos.</p><p>Um layout responsivo representa a forma como os elementos ficam alinhados numa página em resoluções diferentes. É importante compreender como utilizar o sistema de grelha (do inglês, <em>grid system</em>) antes de aprender qualquer outro componente do Bootstrap 4, porque, para qualquer elemento que utilizes, terás de colocá-lo algures no ecrã.</p><p>Vamos começar!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/bIvdmOpWL2YSwkrfoTrOUWMPwyhyjhgyDDND.gif" class="kg-image" alt="bIvdmOpWL2YSwkrfoTrOUWMPwyhyjhgyDDND" width="800" height="600" loading="lazy"><figcaption>Crédito da <a href="https://dribbble.com/shots/4948320-Computer-Mouse">imagem</a> para <a href="https://dribbble.com/animade">Animade</a></figcaption></figure><h3 id="-ndice"><strong>Índice</strong></h3><ul><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#recipientes-do-bootstrap-4">Recipientes do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#linhas-do-bootstrap-4">Linhas do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#colunas-do-bootstrap-4">Colunas do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#leitura-adicional">Leitura adicional</a></li></ul><p>A grelha do Bootstrap 4 consiste em recipientes (do inglês, <em>containers</em>), linhas e colunas. Vamos observar cada um e explicá-los.</p><h3 id="recipientes-do-bootstrap-4"><strong>Recipientes do Bootstrap 4</strong></h3><p>Um recipiente do Bootstrap 4 é um elemento com a classe <code>.container</code>. O recipiente é a raiz do sistema de grelha do Bootstrap 4 e é utilizado para controlar a largura do layout.</p><p>O recipiente do Bootstrap 4 contém todos os elementos na página. Isto quer dizer que a tua página deve ter a seguinte estrutura: primeiro o corpo da página HTML, dentro dele, deves adicionar um recipiente e todos os outros elementos dentro do recipiente.</p><pre><code class="language-html">&lt;body&gt;
   &lt;div class="container"&gt;
    ...
   &lt;/div&gt;
&lt;/body&gt;</code></pre><p>A simples classe <code>.container</code> define a largura do layout com base na largura do ecrã. Esta posiciona o conteúdo no centro da página, alinhando-o horizontalmente. Existe espaçamento igual entre o recipiente do Bootstrap 4 e o limite esquerdo e direito da página.</p><p>O <code>.container</code> diminui gradualmente à medida que a largura do ecrã diminui e ocupa a largura toda em mobile. A largura do recipiente é definida dentro da biblioteca do Bootstrap 4 para todas as dimensões de ecrã. Podes ver os <a href="https://getbootstrap.com/docs/4.1/layout/grid/#grid-options" rel="noopener">tamanhos exatos aqui</a>.</p><p>Um recipiente de largura completa ocupa 100% da dimensão do ecrã, independentemente da largura do ecrã. Para utilizá-lo é necessário adicionares a classe .<code>container-fluid</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png" class="kg-image" alt="1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="230" loading="lazy"></figure><pre><code class="language-html">&lt;div class="container"&gt;
  Hello! I am in a simple container.
&lt;/div&gt;

&lt;div class="container-fluid"&gt;
  Hello! I am in a full-width container.
&lt;/div&gt;</code></pre><p>Podes observar o CodePen <a href="https://codepen.io/cristinaconacel/pen/XBLVre" rel="noopener">aqui</a>.</p><p>Para ver as diferenças entre os dois tipos de recipientes, podes abrir o <em>pen</em> na tua consola e alternar entre dimensões de ecrã.</p><h3 id="linhas-do-bootstrap-4"><strong>Linhas do Bootstrap 4</strong></h3><p>As linhas do Bootstrap 4 são cortes horizontais do ecrã. São utilizadas apenas como invólucros das colunas. Para utilizá-las, precisas da classe <code>.row</code>.</p><pre><code class="language-html">&lt;div class="row"&gt;
  ...
&lt;/div&gt;</code></pre><p>Aqui estão as coisas mais importantes para memorizares sobre as linhas do Bootstrap 4:</p><ul><li><strong>São utilizadas apenas para conter colunas<strong>. </strong></strong>Se colocares outros elementos dentro da linha juntamente com colunas não irás obter o resultado esperado.</li><li><strong>Têm de ser colocadas dentro de recipientes<strong>. </strong></strong>Se não fizeres isto, irás obter um <em>scroll </em>horizontal na tua página. Isto acontece porque as linhas têm margens negativas à esquerda e de 15 à direita. O recipiente tem <em>paddings </em>de 15px. Por isso, ele neutraliza as margens.</li><li><strong>As colunas têm de ser descendentes da linha<strong>. </strong></strong>Caso contrário, não vão ficar alinhadas. As linhas e colunas são criadas para trabalhar em conjunto nesta hierarquia rigorosa.</li></ul><h3 id="colunas-do-bootstrap-4"><strong>Colunas do Bootstrap 4</strong></h3><p>Podemos agora avançar para a parte interessante deste tutorial, as colunas do Bootstrap 4. As colunas são óptimas! Ajudam-te a dividir o ecrã horizontalmente.</p><p>Se colocares apenas uma coluna na tua linha, esta irá ocupar toda a largura. Se adicionares duas colunas, cada uma delas irá ocupar 1/2 da largura. O mesmo acontece para qualquer número de colunas.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png" class="kg-image" alt="aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="187" loading="lazy"></figure><pre><code class="language-html">&lt;div class="container"&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p><em>Podes ver este código no<em> </em></em><a href="https://codepen.io/cristinaconacel/pen/NOLEyy" rel="noopener"><em><em>CodePen</em></em></a><em><em>.</em></em></p><p><strong>Observação<strong>: </strong></strong>as colunas não estão coloridas. Apenas adicionei cores para uma descrição mais atrativa visualmente/de maneira a que tenham melhor aspeto.</p><h3 id="definir-dimens-es-para-colunas"><strong>Definir dimensões para colunas</strong></h3><p>Utilizar a classe <code>.col</code> define dinamicamente a largura para as colunas. Isto quer dizer que, dependendo do número de colunas numa linha, a largura da coluna será a largura do recipiente dividida pelo número de colunas.</p><p>Existe, porém, outra forma de definir colunas. Podes utilizar classes para colunas e definir o seu tamanho.</p><p>Desde o início, a grelha do Bootstrap 4 consiste em 12 colunas. Podes selecionar qualquer dimensão entre 1 e 12 para a tua coluna. Se quiseres 3 colunas iguais, podes utilizar <code>.col-4</code> em cada uma (porque 3*4 colunas cada = 12). Como alternativa, podes definir dimensões diferentes para elas. Aqui estão alguns exemplos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png" class="kg-image" alt="3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png 800w" sizes="(min-width: 720px) 720px" width="800" height="275" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-6"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-6"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-5"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-7"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-4"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-6"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-7"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/xyaQNw" rel="noopener">CodePen</a>.</p><p>Se a soma das colunas na tua linha não resultar em 12, elas não vão ocupar toda a linha. Se a soma das colunas ultrapassar 12 então a coluna segue para a linha seguinte. A primeira linha irá exibir apenas os primeiros elementos cuja soma resulta em 12 ou menos.</p><h3 id="definir-pontos-de-quebra-para-colunas"><strong>Definir pontos de quebra para colunas</strong></h3><p>Se pegares no exemplo acima e o quiseres exibir em <em>mobile</em>, podes deparar-te com alguns problemas. Exibir cinco colunas em mobile vai tornar o conteúdo ilegível.</p><p>É aqui que entram em ação os componentes mais potentes do Bootstrap 4. De maneira a teres layouts diferentes em ecrãs de dimensões diferentes, não vais precisar de escrever <em>media queries</em>. Em vez disso, podes utilizar os pontos de quebra das colunas.</p><p>Um ponto de quebra é uma variável do Bootstrap 4 que representa a resolução de ecrã. Quando estás a especificar um ponto de quebra para uma classe, estás a indicar à classe para estar ativa apenas em resoluções que são pelo menos tão grandes como o número que o ponto de quebra armazena.</p><p>A classe mais simples que vamos aprender é a classe <code>.col-[breakpoint]</code>. Quando utilizas esta classe, estás a definir o comportamento para as colunas apenas quando são exibidas em dispositivos com um resolução de pelo menos o que está definido no ponto de quebra. Até ao ponto de quebra fornecido, as tuas colunas vão alinhar-se verticalmente desde o início. Após o teu ponto de quebra, estas vão alinhar-se horizontalmente por causa da classe.</p><p>O Bootstrap tem 4 pontos de quebra que podes utilizar:</p><ul><li><code>.col-sm</code> para telemóveis maiores (dispositivos com resoluções ≥ 576px);</li><li><code>.col-md</code> para <em>tablets </em>(≥768px);</li><li><code>.col-lg</code> para computadores portáteis (≥992px);</li><li><code>.col-xl</code> para computadores (≥1200px)</li></ul><p>Digamos que queres exibir duas colunas, uma após a outra verticalmente, em ecrãs pequenos e na mesma linha em ecrãs maiores. Terás de especificar o ponto de quebra onde as colunas ficam na mesma linha.</p><p>No nosso exemplo, vamos utilizar o ponto de quebra <code>.col-lg</code> e ver como as colunas ficam em ecrãs diferentes. Para resoluções que são menores do que o ponto de quebra fornecido (&lt;992px), as colunas serão exibidas verticalmente. Isto significa que em dispositivos <em>mobile </em>e <em>tablets</em>, as colunas terão este aspeto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png" class="kg-image" alt="JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png 800w" sizes="(min-width: 720px) 720px" width="800" height="310" loading="lazy"><figcaption>Exibição para resoluções &lt; 992px (dispositivos <em>mobile</em>).</figcaption></figure><p>Para dispositivos que têm uma resolução que é maior ou igual ao ponto de quebra (≥992px), as colunas ficam na mesma linha. Isto significa que, em portáteis e computadores vais obter este resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png" class="kg-image" alt="YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png 800w" sizes="(min-width: 720px) 720px" width="800" height="83" loading="lazy"><figcaption>Exibição para resoluções &gt;= 992px (portáteis e ecrãs maiores).</figcaption></figure><pre><code class="language-html">&lt;div class="row"&gt;
 &lt;div class="col-lg"&gt;
   ...
 &lt;/div&gt;
 &lt;div class="col-lg"&gt;
    ...   
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/OBoqqz" rel="noopener">CodePen</a>.<em><em> </em></em>Se abrires o Codepen noutra janela e observares a página em resoluções diferentes, verás as colunas a alterar o seu posicionamento.</p><p>Se quisesses que as duas colunas ficassem na mesma linha a partir da dimensão de telemóveis maiores, poderias utilizar <code>.col-sm</code>, para <em>tablets </em><code>.col-md</code> e para ecrãs extra largos <code>.col-xl</code>.</p><h3 id="definir-dimens-es-e-pontos-de-quebra-para-colunas"><strong>Definir dimensões e pontos de quebra para colunas</strong></h3><p>Podes combinar as dimensões e os pontos de quebra e utilizar apenas uma classe com o formato <code>.col-[breakpoint]-[tamanho]</code>.</p><p>Por exemplo, se quiseres que três colunas de dimensões diferentes fiquem alinhadas numa linha com a resolução de um portátil, precisas de fazer isto:</p><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-lg-4"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-lg-5"&gt;
    ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Irás obter este resultado em resoluções &lt;992px:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png" class="kg-image" alt="KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="411" loading="lazy"></figure><p>Para ecrãs que são ≥992px, o resultado será este:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png" class="kg-image" alt="xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png 800w" sizes="(min-width: 720px) 720px" width="800" height="94" loading="lazy"></figure><p>De novo, podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/ReYOwZ" rel="noopener">CodePen</a>.</p><p>Se, porém, quiseres exibir uma coluna por linha em resoluções <em>mobile </em>mais pequenas, duas colunas por linha em <em>tablets </em>e quatro em portáteis ou dispositivos de maior resolução, o que podes fazer?</p><p>Adicionas várias classes para uma única coluna a descrever o comportamento em cada resolução. Ao utilizar várias classes, especificas que o conteúdo ocupará seis lugares em <em>tablets</em> e três em portáteis.</p><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
     ...     
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>O resultado será apresentado assim em <em>tablets</em>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png" class="kg-image" alt="8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png 800w" sizes="(min-width: 720px) 720px" width="800" height="180" loading="lazy"></figure><p>Em portáteis e resoluções maiores, terás este resultado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png" class="kg-image" alt="hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png 800w" sizes="(min-width: 720px) 720px" width="800" height="58" loading="lazy"></figure><p>Este exemplo também está disponível no <a href="https://codepen.io/cristinaconacel/pen/mjZBPO" rel="noopener">CodePen</a>.</p><p>Como exercício, podes tentar criar linhas com números diferentes de colunas, dependendo da dimensão do ecrã, e verificar o comportamento na consola do teu navegador.</p><h3 id="deslocar-colunas"><strong>Deslocar colunas</strong></h3><p>Se não quiseres que as colunas fiquem encostadas umas às outras, podes utilizar a classe <code>.offset-[breakpoint]-[tamanho]</code>, juntamente com o <code>.col-[breakpoint]-[tamanho]</code>.</p><p>Utilizar esta classe é como adicionar uma coluna vazia antes da tua coluna. Aqui está um simples exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png" class="kg-image" alt="b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png 800w" sizes="(min-width: 720px) 720px" width="800" height="102" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-md-4 offset-md-4"&gt;
     ...     
  &lt;/div&gt;  
  &lt;div class="col-md-4"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/KGxYaL" rel="noopener">CodePen</a>.</p><p>Podes utilizar a classe em qualquer coluna da linha. Aqui estão mais alguns exemplos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png" class="kg-image" alt="tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png 800w" sizes="(min-width: 720px) 720px" width="800" height="154" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-md-4"&gt;
     ...     
  &lt;/div&gt;  
  &lt;div class="col-md-4 offset-md-4"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-md-4 offset-md-2"&gt;
     ...    
  &lt;/div&gt;  
  &lt;div class="col-md-4 offset-md-2"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-md-6 offset-md-3"&gt;
     ...
  &lt;/div&gt;   
&lt;/div&gt;</code></pre><h3 id="colocar-linhas-dentro-de-colunas"><strong>Colocar linhas dentro de colunas</strong></h3><p>Pode ser uma surpresa, mas podes adicionar uma linha dentro de uma coluna!</p><p>A linha em questão (que terá a largura da sua coluna pai) será, então, dividida em 12 colunas (mais pequenas) que podes referenciar através das classes <code>.col-* </code>.</p><p>Vamos observar o que acontece quando inserimos uma nova linha dentro de uma coluna:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png" class="kg-image" alt="SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png 800w" sizes="(min-width: 720px) 720px" width="800" height="130" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
    &lt;div class="col-md-8"&gt;
        ...
        &lt;div class="row"&gt;
            &lt;div class="col-md-5"&gt;
               ...
            &lt;/div&gt;
            &lt;div class="col-md-7"&gt;
               ...   
            &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;     
    &lt;/div&gt;
    &lt;div class="col-md-4"&gt;
       ...
    &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/OBoGZr" rel="noopener">CodePen</a>.</p><p>Ao saber isto, podes aprofundar muito a organização da tua informação. As colunas vão fornecer uma maneira simples de poderes gerir o teu espaço.</p><p>Isto termina os conhecimentos básicos em relação ao sistema responsivo de grelha do Bootstrap 4.</p><h3 id="leitura-adicional"><strong>Leitura adicional</strong></h3><p>Se tiveres mais algum tempo, aqui estão alguns recursos bastante úteis:</p><ul><li><a href="https://getbootstrap.com/docs/4.1/layout/grid/" rel="noopener">Documentação oficial do sistema de grelha</a> (link em inglês), do GetBootstrap</li><li><a href="https://scrimba.com/p/pD5KUE/cdm3asD" rel="noopener">Tutorial em vídeo</a> (link em inglês), do Scrimba</li></ul><p>Este artigo foi publicado inicialmente no <a href="https://bootstrapbay.com/blog/day-2-bootstrap-4-grid-system-tutorial-examples/" rel="noopener">blog BootstrapBay</a>. Faz parte de uma grande série de tutoriais do Bootstrap 4 chamada <a href="https://bootstrapbay.com/blog/14-days-bootstrap-4/" rel="noopener">14 Days of Bootstrap 4</a> (14 Dias de Bootstrap 4, em inglês). Se desejares continuar a aprender sobre os componentes do Bootstrap 4, estes artigos são um bom sítio para começar.</p><p>Se quiseres alavancar o teu desenvolvimento com um template do Bootstrap, podes verificar o nosso <a href="http://bootstrapbay.com/" rel="noopener">marketplace</a>.</p><p>Antes de te aprofundares, contudo, tira um momento para celebrar as tuas novas habilidades obtidas!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/gS3FeSJGquHlZEzANXWSsAakOD2FbabpNvD7.gif" class="kg-image" alt="gS3FeSJGquHlZEzANXWSsAakOD2FbabpNvD7" width="800" height="600" loading="lazy"><figcaption>Crédito da <a href="https://dribbble.com/shots/4198035-Sweet-Berry-Wine">imagem</a> para <a href="https://dribbble.com/jonasmosesson">Jonas Mosesson</a></figcaption></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que podes exatamente fazer com Python? Aqui estão as três principais aplicações da linguagem. ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: YK Sugi > Tradução realizada em português europeu. Se estás a pensar em aprender Python — ou se começaste recentemente a aprendê-lo — podes estar a perguntar-te: > "No que posso exatamente utilizar o Python?" Bem, essa é uma pergunta complicada, porque existem diversas aplicações para o Python. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-podes-exatamente-fazer-com-python-aqui-estao-as-tres-principais-aplicacoes-da-linguagem/</link>
                <guid isPermaLink="false">641d631902ec1d064260e66a</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Thu, 11 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/0_lBhKdwfBlmWAPQFd.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-can-you-do-with-python-the-3-main-applications-518db9a68a78/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What exactly can you do with Python? Here are Python's 3 main applications.</a>
      </p><p>Escrito por: YK Sugi</p><blockquote>Tradução realizada em português europeu.</blockquote><p>Se estás a pensar em aprender Python — ou se começaste recentemente a aprendê-lo — podes estar a perguntar-te:</p><blockquote><strong>"No que posso exatamente utilizar o<strong> Python?</strong>"</strong></blockquote><p>Bem, essa é uma pergunta complicada, porque existem diversas aplicações para o Python.</p><p>Ao longo do tempo, contudo, observamos que existem 3 aplicações populares principais para o Python:</p><ul><li>Desenvolvimento para a web</li><li>Ciências da Informação — incluindo <em>machine learning</em>, análise de dados e visualização de dados</li><li>Criação de scripts</li></ul><p>Vamos falar sobre cada uma delas.</p><h3 id="desenvolvimento-para-a-web"><strong>Desenvolvimento para a web</strong></h3><p><em>Frameworks </em>da web que com base em Python, como o <strong><strong>Django</strong></strong> e o <strong><strong>Flask</strong>,</strong> tornaram-se recentemente muito populares para desenvolvimento para a web.</p><p>Estas <em>frameworks </em>da web ajudam-te a criar código do lado do servidor (código back-end) em Python. Esse é o código que corre no teu servidor, ao contrário dos dispositivos dos utilizadores e browsers (código front-end). Se não estiveres familiarizado(a) com a diferença entre código back-end e código front-end, observa a minha nota de rodapé abaixo.</p><h4 id="espera-por-que-preciso-de-uma-framework-para-a-web"><strong>Espera! Por que preciso de uma framework para a web<strong><strong>?</strong></strong></strong></h4><p>É porque uma framework web torna muito mais fácil criar a lógica de back-end comum. Isto inclui mapear URLs diferentes em pedaços de código em Python, lidar com bases de dados e gerar os ficheiros HTML que os utilizadores veem nos seus browsers.</p><h4 id="que-framework-para-a-web-do-python-devo-utilizar"><strong>Que framework para a web do<strong><strong> Python </strong></strong>devo utilizar<strong><strong>?</strong></strong></strong></h4><p>Django e Flask são duas das frameworks para a web mais populares do Python. Recomendo a utilização de uma delas se estás a iniciar.</p><h4 id="qual-a-diferen-a-entre-django-e-flask"><strong>Qual é a diferença entre<strong><strong> Django </strong></strong>e<strong><strong> Flask?</strong></strong></strong></h4><p>Existe um <a href="https://www.codementor.io/garethdwyer/flask-vs-django-why-flask-might-be-better-4xs7mdf8v" rel="noopener">excelente artigo</a> (em inglês) sobre este tópico, escrito por Gareth Dwyer. Por isso, permite-me que coloque aqui um excerto:</p><blockquote>Contrastes principais:<br><br>O Flask fornece simplicidade, flexibilidade e controlo refinado. É imparcial (permite-te decidir como desejas implementar as coisas).<br><br>O Django fornece uma experiência totalmente inclusiva: podes ter um painel de administrador, interfaces de bases de dados, um <a href="https://stackoverflow.com/questions/1279613/what-is-an-orm-and-where-can-i-learn-more-about-it" rel="noopener">ORM [object-relational mapping]</a>, uma estrutura de pastas para as tuas aplicações e projetos logo à partida.<br><br>Deves provavelmente escolher:<br><br>O Flask, se o teu foco for a experiência e as oportunidades de aprendizagem, ou se desejares ter mais controlo sobre quais os componentes a utilizar (tais como quais as bases de dados que desejas utilizar e como desejas interagir com elas).<br><br>O Django, se o teu foco for o produto final. especialmente se estiveres a trabalhar numa aplicação direta como por exemplo um site de notícias, uma loja online ou um blogue, e desejas que exista sempre uma forma única e óbvia de fazer as coisas.</blockquote><p>Por outras palavras, se não tiveres muita prática, o Flask é provavelmente a melhor escolha, porque tem menos componentes para lidar. Além disto, o Flask é uma escolha melhor se desejas mais personalização.</p><p>Por outro lado, se estás à procura de criar algo direto, o Django provavelmente ajudará a chegar lá mais rápido.</p><p>Agora, se estás à procura de aprender Django, recomendo-te o livro chamado Django for Beginners (Django para Iniciantes, em português). Podes encontrá-lo <a href="http://csdojo.io/dj" rel="noopener">aqui</a> (em inglês). Também podes encontrar os capítulos de amostra gratuitos <a href="https://djangoforbeginners.com/" rel="noopener">aqui</a>.</p><p>Ok, vamos avançar para o próximo tópico!</p><h3 id="ci-ncias-da-informa-o-incluindo-machine-learning-an-lise-de-dados-e-visualiza-o-de-dados"><strong>Ciências da Informação<strong><strong> — inclu</strong></strong>indo<strong><strong> <em>machine learning</em>, </strong></strong>análise de dados e visualização de dados</strong></h3><h4 id="antes-de-mais-vamos-rever-o-que-machine-learning-"><strong>Antes de mais<strong><strong>, </strong></strong>vamos rever o que <strong><strong><em>é</em> <em>machine learning</em>.</strong></strong></strong></h4><p>Penso que a melhor forma de explicar o que é <em>machine learning</em> seria ao fornecer-te um simples exemplo.</p><p>Digamos que desejas desenvolver um programa que deteta automaticamente o que está numa imagem.</p><p>Então, dada a imagem abaixo (Figura 1), desejas que o teu programa reconheça que é um cão.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/0_Mbj3L2cl0zzT2A0L.jpg" class="kg-image" alt="0_Mbj3L2cl0zzT2A0L" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/0_Mbj3L2cl0zzT2A0L.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/0_Mbj3L2cl0zzT2A0L.jpg 700w" width="700" height="443" loading="lazy"><figcaption>Figura 1</figcaption></figure><p>Dada esta outra imagem abaixo (Figura 2), desejas que o teu programa reconheça que é uma mesa.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/0_gxTn_CbMyCcQ1NFV.jpg" class="kg-image" alt="0_gxTn_CbMyCcQ1NFV" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/0_gxTn_CbMyCcQ1NFV.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/0_gxTn_CbMyCcQ1NFV.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Figura 2</figcaption></figure><p>Podes dizer, bem, posso simplesmente escrever algum código para fazer isso. Por exemplo, talvez se existirem muitos píxeis castanho-claros na imagem, então podemos dizer que é um cão.</p><p>Ou então, podemos descobrir como detetar arestas numa imagem. Podes dizer que, se houver muitas arestas retas, é uma mesa.</p><p>No entanto, este tipo de abordagem fica complicada muito rapidamente. E se existir um cão branco na imagem sem pelo castanho? E se a imagem mostra apenas as partes arredondadas da mesa?</p><p><strong><strong>É</strong> aqui que entra o<strong> <em>machine learning</em>.</strong></strong></p><p>O <em>machine learning</em> implementa tipicamente um algoritmo que deteta automaticamente um padrão num determinado input.</p><p>Podes fornecer, digamos, 1000 imagens de um cão e 1000 imagens de uma mesa a um algoritmo de <em>machine learning</em>. Então, este aprenderá as diferenças entre um cão e uma mesa. Quando forneceres uma nova imagem de um cão ou de uma mesa, este será capaz de reconhecer qual deles é.</p><p>Penso que isto seja um pouco semelhante ao modo como um bebé aprende coisas novas. Como é que um bebé aprende que uma coisa se parece com um cão e outra com uma mesa? Provavelmente, a partir de vários exemplos.</p><p>Provavelmente não indicas ao bebé explicitamente, "Se algo for felpudo e tiver pêlo castanho claro, então é provavelmente um cão."</p><p>Provavelmente dirias apenas, "Isto é um cão. Isto também é um cão. E isto é uma mesa. Esta também é uma mesa."</p><p>Os algoritmos de <em>machine learning</em> funcionam muito do mesmo modo.</p><p>Podes aplicar o mesmo conceito a:</p><ul><li>sistemas de recomendação (pensa no YouTube, Amazon e Netflix)</li><li>reconhecimento facial</li><li>reconhecimento de voz</li></ul><p>entre outras aplicações.</p><p>Algoritmos de <em>machine learning</em> populares que podes já ter ouvido falar incluem:</p><ul><li>Redes neurais</li><li>Aprendizagem profunda</li><li>Máquinas de vetor de suporte</li><li>Floresta aleatória</li></ul><p>Podes utilizar qualquer um dos algoritmos acima para resolver o problema de reconhecimento de imagens que expliquei anteriormente.</p><h4 id="python-para-machine-learning"><strong><strong><strong>Python </strong></strong>para<strong><strong> <em>machine learning</em></strong></strong></strong></h4><p>Existem bibliotecas populares de <em>machine learning </em>e frameworks para Python.</p><p>Duas das mais populares são <strong><strong>scikit-learn</strong></strong> e <strong><strong>TensorFlow</strong></strong>.</p><ul><li>scikit-learn vem com alguns dos algoritmos de <em>machine learning </em>mais populares incorporados. Mencionei alguns deles acima.</li><li>TensorFlow funciona mais como uma biblioteca de baixo nível que te permite criar algoritmos de <em>machine learning </em>personalizados.</li></ul><p>Se estiveres apenas a começar com um projeto de <em>machine learning</em>, eu recomendaria que começasses primeiro pelo scikit-learn. Se começares a encontrar problemas de eficiência, então eu começaria a pesquisar o TensorFlow.</p><h4 id="como-devo-aprender-machine-learning"><strong>Como devo aprender <strong><strong><em>machine learning</em>?</strong></strong></strong></h4><p>Para aprender os fundamentos de <em>machine learning</em>, eu recomendo um curso de <em>machine learning,</em> de <a href="https://www.coursera.org/learn/machine-learning" rel="noopener">Stanford</a> ou da <a href="https://work.caltech.edu/telecourse.html" rel="noopener">Caltech</a> (cursos em inglês).</p><p>Nota que é necessário teres conhecimentos básicos de cálculo e álgebra linear para compreender alguns dos materiais nesses cursos.</p><p>Depois, recomendo que pratiques o que aprendeste num desses cursos com o <a href="https://www.kaggle.com/" rel="noopener">Kaggle</a>. É um site onde as pessoas competem para criar o melhor algoritmo de <em>machine learning</em> para um determinado problema. Também têm bons tutoriais para iniciantes.</p><h3 id="e-a-an-lise-de-dados-e-a-visualiza-o-de-dados"><strong>E a análise de dados e a visualização de dados<strong><strong>?</strong></strong></strong></h3><p>Para te ajudar a compreender como estes se podem parecer, permite-me fornecer um simples exemplo aqui.</p><p>Digamos que trabalhas para uma empresa que vende alguns produtos on-line.</p><p>Depois, como analista de dados, podes desenhar um gráfico de barras como este.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_62T-rtheKPehgZdPTEpKww.png" class="kg-image" alt="1_62T-rtheKPehgZdPTEpKww" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_62T-rtheKPehgZdPTEpKww.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_62T-rtheKPehgZdPTEpKww.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Gráfico de barras 1 — volume de vendas a um domingo para homens e mulheres – gerado com Python</figcaption></figure><p>A partir deste gráfico, podemos dizer que os homens compraram mais de 400 unidades deste produto e que as mulheres compraram cerca de 350 unidades deste produto, neste domingo em específico.</p><p>Como analista de dados, podes descobrir algumas explicações possíveis para esta diferença.</p><p>Uma possível explicação óbvia é que este produto é mais popular entre homens do que entre mulheres. Outra explicação possível pode ser que o tamanho da amostra seja muito pequeno e esta diferença é causada por puro acaso. E outra explicação possível pode ser que os homens tendem a comprar mais este produto apenas aos domingos, por alguma razão.</p><p>Para compreender qual destas explicações está correta, podes desenhar outro gráfico como este.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_VgNfqK5XxNfHxx6S4VFCjQ.png" class="kg-image" alt="1_VgNfqK5XxNfHxx6S4VFCjQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_VgNfqK5XxNfHxx6S4VFCjQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_VgNfqK5XxNfHxx6S4VFCjQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Gráfico de linhas 1 — gerado com Python</figcaption></figure><p>Em vez de apresentar apenas os dados para domingo, estamos a consultar os dados para uma semana inteira. Como podes observar, para este gráfico, podemos ver que esta diferença é bastante consistente ao longo de diferentes dias.</p><p>A partir desta pequena análise, podes concluir que a explicação mais convincente para esta diferença é que este produto é simplesmente mais populares entre homens do que entre mulheres.</p><p>Por outro lado, e se observarmos um gráfico como este?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_dMpu_fd-THNXRJhHIq2O3g.png" class="kg-image" alt="1_dMpu_fd-THNXRJhHIq2O3g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1_dMpu_fd-THNXRJhHIq2O3g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_dMpu_fd-THNXRJhHIq2O3g.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Gráfico de linhas 2 — também gerado com Python</figcaption></figure><p>Então, qual é a explicação para a diferença no domingo?</p><p>Podes talvez dizer que o homens tendem a comprar mais este produto apenas ao domingo por alguma razão. Ou então, talvez seja apenas uma coincidência que os homens tenham comprado mais no domingo.</p><p>Este é um exemplo simplificado de como se poderia parecer a análise de dados no mundo real.</p><p>O trabalho em análise de dados que realizei quando estive a trabalhar na Google e na Microsoft foi muito semelhante a este exemplo — apenas mais complexo. Na realidade, utilizei Python na Google para este tipo de análise e utilizei JavaScript na Microsoft.</p><p>Utilizei SQL em ambas as empresas para obter dados das nossas bases de dados. Depois, eu utilizava quer Python e Matplotlib (na Google) quer JavaScript e D3.js (na Microsoft) para visualizar e analisar estes dados.</p><h4 id="an-lise-visualiza-o-de-dados-com-python"><strong>Análise/visualização de dados<strong><strong> </strong></strong>com<strong><strong> Python</strong></strong></strong></h4><p>Uma das bibliotecas mais populares para visualização de dados é o <a href="https://matplotlib.org/" rel="noopener">Matplotlib</a>.</p><p>É uma óptima biblioteca para se começar porque:</p><ul><li>É fácil de se iniciar</li><li>Algumas bibliotecas como o <a href="https://seaborn.pydata.org/" rel="noopener">seaborn</a> são baseadas nela. Por isso, aprender Matplotlib ajudará a aprender estas outras bibliotecas mais tarde.</li></ul><p><strong>Como devo aprender análise/visualização de dados<strong> </strong>com<strong> Python?</strong></strong></p><p>Primeiro, deves aprender os fundamentos de análise e visualização de dados. Quando pesquisei por bons recursos para isto on-line, não consegui encontrar nenhum. Por isso, acabei por criar um vídeo do YouTube sobre este tópico:</p><p>Também acabei por criar um <a href="https://goo.gl/fZ5oVX" rel="noopener">curso completo sobre este tópico no Pluralsight</a> (curso em inglês), que podes realizar gratuitamente ao fazer a inscrição no teste gratuito de 10 dias que eles oferecem.</p><p>Eu recomendo ambos.</p><p>Depois de aprender os fundamentos da análise e visualização de dados, aprender os fundamentos da estatística a partir de sites como o Coursera e o Khan Academy também será bastante útil.</p><h3 id="cria-o-de-scripts"><strong>Criação de s<strong><strong>cript</strong></strong>s</strong></h3><h4 id="o-que-a-cria-o-de-scripts"><strong>O que é<strong><strong> </strong></strong>a criação de <strong><strong>script</strong></strong>s<strong><strong>?</strong></strong></strong></h4><p>Scripts referem-se geralmente à escrita de pequenos programas que são desenhados para automatizar tarefas simples.</p><p>Por isso, permite-me dar-te um exemplo da minha experiência pessoal aqui.</p><p>Trabalhei numa pequena startup no Japão, onde tínhamos um sistema de suporte por e-mail. Era um sistema para respondermos a questões que os clientes nos enviavam por e-mail.</p><p>No tempo que lá trabalhei, tinha a tarefa de contabilizar o número de e-mails que continham certas palavras-chave, de modo a podermos analisar os e-mails que recebemos.</p><p>Podíamos tê-lo feito manualmente, mas, em vez disso, escrevi um simples programa/script para automatizar esta tarefa.</p><p>Na realidade, na altura, utilizamos Ruby para isto, mas o Python também é uma boa linguagem para este tipo de tarefa. O Python é adequado para este tipo de tarefa principalmente porque tem uma sintaxe relativamente simples e fácil de escrever. Também é fácil para escrever algo pequeno e realizar testes.</p><h3 id="e-as-aplica-es-incorporadas"><strong>E as aplicações incorporadas<strong><strong>?</strong></strong></strong></h3><p>Não sou um especialista em aplicações incorporadas, mas sei que o Python funciona com o Rasberry Pi. Parece ser uma aplicação popular entre os entusiastas do hardware.</p><h3 id="e-em-rela-o-aos-jogos"><strong>E em relação aos jogos<strong><strong>?</strong></strong></strong></h3><p>Poderias utilizar uma biblioteca chamada PyGame para desenvolver jogos, mas não é o motor de jogo mais popular por aí. Poderias utilizá-la para criar um projeto como passatempo, mas eu pessoalmente não a escolheria se o teu objetivo for desenvolvimento de jogos.</p><p>Como alternativa, recomendo que comeces pelo Unity com C#, que é um dos motores de jogo mais populares. Este permite-te criar um jogo para várias plataformas, incluindo Mac, Windows, iOS e Android.</p><h3 id="e-em-rela-o-a-aplica-es-de-desktop"><strong>E em relação a aplicações de<strong><strong> desktop?</strong></strong></strong></h3><p>Podes fazer uma com Python utilizando o Tkinter, mas também não parece ser a escolha mais popular.</p><p>Em vez disso, parece que linguagens como <a href="https://www.quora.com/What-is-the-best-programming-language-to-develop-a-desktop-application-It-should-be-cross-platform-free-easy-to-learn-and-have-a-good-community" rel="noopener">Java, C# e C++</a> são mais populares para isto.</p><p>Recentemente, algumas empresas começaram a utilizar também JavaScript para criar aplicações de desktop.</p><p><a href="https://slack.engineering/building-hybrid-applications-with-electron-dc67686de5fb" rel="noopener">Por exemplo, a aplicação para desktop do Slack foi criada com algo chamado de Electron</a>. Este permite-te criar aplicações de desktop com JavaScript.</p><p>Pessoalmente, se eu fosse criar uma aplicação para desktop, optaria por algo que envolva o JavaScript. Este permite-te reutilizar algum código de uma versão para a web, caso a tenhas. No entanto, também não sou um especialista em aplicações para desktop.</p><h3 id="python-3-ou-python-2"><strong><strong><strong>Python 3 o</strong></strong>u<strong><strong> Python 2?</strong></strong></strong></h3><p>Eu recomendaria o Python 3, visto que é mais moderno e é uma opção mais popular neste momento.</p><h3 id="nota-de-rodap-uma-nota-sobre-c-digo-de-back-end-x-c-digo-de-front-end-s-para-o-caso-de-n-o-estares-familiarizado-a-com-os-termos-"><strong>Nota de rodapé<strong><strong>: </strong></strong>uma <strong><strong>not</strong></strong>a<strong><strong> </strong></strong>sobre código de<strong><strong> back-end </strong></strong>x código de<strong><strong> front-end (</strong></strong>só para o caso de não estares familiarizado(a) com os termos<strong><strong>):</strong></strong></strong></h3><p>Digamos que desejas criar algo como o Instagram.</p><p>Então, precisarias de criar código para o <em>front-end</em> para cada tipo de dispositivo que queres ter suporte.</p><p>Poderias utilizar, por exemplo:</p><ul><li>Swift para iOS</li><li>Java para Android</li><li>JavaScript para navegadores da web</li></ul><p>Cada conjunto de código executará em cada tipo de dispositivo/navegador. Este será o conjunto de código que determina qual será o aspeto da aplicação, qual o aspeto dos botões quando clicas neles e assim por diante.</p><p>No entanto, ainda vais precisar da capacidade de armazenar a informação e fotos dos utilizadores. Vais querer armazená-las no teu servidor e não apenas nos dispositivos dos utilizadores, de modo a que os seguidores de cada utilizador consigam ver as fotos dele/dela.</p><p>É aqui que o código de back-end/código do lado do servidor entra em ação. Vais precisar de escrever algum código de back-end para fazer coisas como:</p><ul><li>Observar quem está a seguir quem</li><li>Comprimir fotos de modo a que não ocupem tanto espaço de armazenamento</li><li>Recomendar fotos e novas contas para cada utilizador na funcionalidade<em><em> discovery</em></em></li></ul><p>Então, esta é a diferença entre código de back-end e código de front-end.</p><p>Já agora, o Python não é a única boa opção para escrever código de back-end/do lado do servidor. Existem muitas escolhas populares, incluindo o Node.js, que é baseado no JavaScript.</p><h3 id="gostaste-deste-artigo-ent-o-podes-vir-a-gostar-do-canal-do-autor-no-youtube-"><strong>Gostaste deste artigo? Então, podes vir a gostar do canal do autor no YouTube.</strong></h3><p>O autor tem um canal no Youtube de ensino de programação, chamado <a href="https://www.youtube.com/csdojo" rel="noopener">CS Dojo</a>, com mais de 1,9 milhões de inscritos, onde produz conteúdo como o deste artigo.</p><p><strong>De qualquer forma, muito obrigado por leres este artigo!</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como conseguir um emprego em Engenharia de Software na Google ou noutras empresas tecnológicas de topo ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: YK Sugi > Tradução realizada em português europeu. Olá a todos! Já falei sobre como eu, pessoalmente, consegui um emprego como engenheiro de software na Google em alguns vídeos no meu canal do YouTube sobre programação e ensino, chamado CS Dojo [https://www.youtube.com/csdojo]. No entanto, muita gente ainda me ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-conseguir-um-emprego-em-engenharia-de-software-na-google-ou-noutras-empresas-tecnologicas-de-topo/</link>
                <guid isPermaLink="false">6411d77d450cb2052fa76698</guid>
                
                    <category>
                        <![CDATA[ Procura por empregos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 03 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_lby1dbkrpW4TfpQL_nR7NQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-get-a-software-engineer-job-at-google-and-other-top-tech-companies-efa235a33a6d/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get a Software Engineer Job at Google and Other Top Tech Companies</a>
      </p><p>Escrito por: YK Sugi</p><blockquote>Tradução realizada em português europeu.</blockquote><p>Olá a todos!</p><p>Já falei sobre como eu, pessoalmente, consegui um emprego como engenheiro de software na Google em alguns vídeos no meu canal do YouTube sobre programação e ensino, chamado <a href="https://www.youtube.com/csdojo" rel="noopener">CS Dojo</a>.</p><p>No entanto, muita gente ainda me faz perguntas sobre como obter um emprego na Google como engenheiro de software. Então, aqui está o meu artigo a explicar a estratégia que utilizaria.</p><p>Podes utilizar a mesma estratégia para obter um emprego como engenheiro de software não só na Google, mas também em empresas tecnológicas de topo como a Amazon, Microsoft e Facebook.</p><p>Neste artigo, vou mostrar o processo de 6 passos para conseguir um emprego numa destas empresas. Ao longo do caminho, também vou abordar:</p><ul><li>Como aprender a programar</li><li>O que aprender depois de aprender a programar</li><li>Como obter o teu primeiro emprego ou estágio como programador</li><li>As melhores formas de concorrer a vagas de engenharia de software</li><li>Como te preparares melhor para entrevistas de programação</li><li>É importante obter uma licenciatura em ciências da computação?</li><li>É importante ir para uma universidade de topo?</li></ul><p>Tudo bem, vamos começar!</p><h3 id="passo-1-aprender-a-programar"><strong>Passo 1: Aprender a programar</strong></h3><p>Esta é a qualificação mínima que vais precisar para te tornares engenheiro(a) de software.</p><p>Para isto, eu recomendo que comeces por um site interativo, tal como o <a href="https://www.codecademy.com/" rel="noopener">Codecademy</a> e o <a href="https://www.freecodecamp.org/" rel="noopener">freeCodeCamp</a>. Podes aprender a maior parte dos fundamentos da programação a partir destes sites. Também ouvi que o <a href="https://www.sololearn.com/" rel="noopener">SoloLearn</a> é bom.</p><p>Depois disto, sugiro que utilizes vídeos de tutoriais para aprender tópicos mais avançados. Para isto, recomendo sites como <a href="https://www.youtube.com/results?search_query=programming+for+beginners" rel="noopener">YouTube</a>, <a href="https://goo.gl/BemGyV" rel="noopener">Pluralsight</a>, <a href="https://www.lynda.com/" rel="noopener">Lynda.com</a> e <a href="https://www.udemy.com/" rel="noopener">Udemy</a>. Nestes sites, deves ser capaz de encontrar tutoriais sobre tópicos como:</p><ul><li>Desenvolvimento para a web</li><li>Desenvolvimento para dispositivos móveis</li><li>Desenvolvimento de jogos</li></ul><p>dependendo do teu interesse.</p><h4 id="que-linguagem-de-programa-o-devo-aprender-primeiro"><strong>Que linguagem de programação devo aprender primeiro?</strong></h4><p>A minha resposta abreviada seria: escolhe JavaScript ou Python. Isso, porém depende mesmo dos teus interesses. Tenho uma resposta mais detalhada a essa questão <a href="https://youtu.be/poJfwre2PIs" rel="noopener">neste vídeo</a> (em inglês).</p><h3 id="passo-2-trabalhar-em-alguns-projetos-pessoais"><strong>Passo 2: Trabalhar em alguns projetos pessoais</strong></h3><p>Após teres seguido alguns tutoriais de programação, deves criar alguns projetos pessoais para praticar o que aprendeste.</p><p>Para isso, deves encontrar algo que tenhas interesse em criar.</p><p>Por exemplo, se gostares de fotografia, podes talvez criar um site de portfólio para as tuas fotografias. Se gostares de negociar ações, podes talvez criar um sistema que analisa os gráficos das ações por ti. Se gostares de resolver problemas, podes tentar competir numa competição de programação.</p><p>Quando trabalhas num projeto, tenta primeiro criar o máximo possível por ti mesmo. Depois, se te deparares com um obstáculo, podes obter ajuda de outras pessoas ao utilizar recursos on-line ou off-line. Por exemplo, podes utilizar o Stack Overflow para fazer questões específicas e técnicas, no caso de ficares preso em algo relacionado com programação.</p><h3 id="passo-3-conseguir-o-teu-primeiro-emprego-ou-est-gio-em-programa-o"><strong>Passo 3: Conseguir o teu primeiro emprego ou estágio em programação</strong></h3><p>Assim que tiveres criado alguns projetos pessoais, deves ser capaz de obter o teu primeiro emprego ou estágio em programação. Com isto, vais ter alguma experiência antes de começares as entrevistas com as empresas tecnológicas de topo.</p><p>É possível obter o teu primeiro emprego logo numa das empresas de topo, mas é bem mais fácil e comum obter primeiro um emprego numa empresa menos conhecida.</p><h4 id="as-melhores-formas-de-concorrer-a-vagas-de-emprego-em-engenharia-de-software"><strong>As melhores formas de concorrer a vagas de emprego em engenharia de software</strong></h4><p>Concorrer simplesmente a vagas on-line não é necessariamente a melhor estratégia, porque é isso que praticamente toda a gente faz.</p><p>Em vez disso, recomendo que utilizes o LinkedIn e redes de contactos pessoais para obter o teu primeiro emprego em programação.</p><p>No LinkedIn, encontra primeiro recrutadores das empresas em que tens interesse em trabalhar. Depois, pergunta-lhes se tens qualificações para as vagas que tens interesse. Deves perguntar como te podes preparar melhor no caso de ainda não teres qualificações suficientes.</p><p>Para redes pessoais, recomendo sites como o Meetup para conhecer engenheiros e recrutadores em empresas locais.</p><h4 id="espera-isso-n-o-tudo-"><strong>Espera!<strong><strong> </strong></strong>Isso não é tudo<strong><strong>.</strong></strong></strong></h4><p>Utilizar o LinkedIn e redes pessoais funciona bem se estiveres a concorrer para empresas de dimensões pequenas a médias. No entanto, descobri que estas estratégias são menos eficazes para empresas mais populares como a Google e a Facebook.</p><p>Para estas grandes empresas, em vez disso, recomendo combinar as três estratégias seguintes:</p><ol><li>Feiras de emprego e eventos de recrutamento em universidades perto de ti.</li><li>Ser recomendado por amigos que trabalham nessas empresas.</li><li>Simplesmente concorrer on-line.</li></ol><p>Combinar todas estas estratégias ajudará a aumentar as hipóteses de conseguir uma entrevista numa destas empresas tecnológicas de topo.</p><p>Já agora, não tenho a certeza absoluta sobre qual é a razão para o LinkedIn ser menos eficaz com estas grandes empresas, mas penso que possa ser porque estas recebem muitas mensagens. Basicamente, são muito populares por lá. 😜</p><h3 id="passo-4-aprender-sobre-estruturas-de-dados-e-algoritmos"><strong>Passo 4: Aprender sobre estruturas de dados e algoritmos</strong></h3><p>Empresas tecnológicas de topo como a Google e a Microsoft fazem geralmente perguntas sobre estruturas de dados e algoritmos nas suas entrevistas. Então, deves aprender sobre esses tópicos caso ainda não o tenhas feito.</p><p>Para aprender os fundamentos, recomendo a <a href="https://goo.gl/wy3CWF" rel="noopener">minha série de vídeos</a> (em inglês) sobre estruturas de dados e algoritmos. Está tudo no YouTube. Criei estes vídeos para tornar o mais fácil possível compreender estes tópicos.</p><p>Visto que existem apenas 7 vídeos nesta série, vais precisar de mais material para aprender sobre tópicos mais avançados.</p><p>Existem várias opções populares para isto, incluindo (em inglês):</p><ul><li><a href="https://www.coursera.org/specializations/algorithms" rel="noopener">Estes cursos da Universidade de Stanford no Coursera</a></li><li><a href="https://www.youtube.com/watch?v=HtSuA80QTyo&amp;list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb" rel="noopener">Este curso do MIT no YouTube</a></li><li><a href="https://amzn.to/2KIEYGB" rel="noopener">O manual de Design de Algoritmos por Skiena</a> (um livro)</li><li><a href="https://amzn.to/2KG5b8n" rel="noopener">Algoritmos</a> (outro livro)</li></ul><p>Deves experimentar alguns destes e continuar com o que gostares mais.</p><h3 id="passo-5-prepara-te-para-entrevistas-de-programa-o"><strong>Passo 5: Prepara-te para entrevistas de programação</strong></h3><p>Entrevistas de programação em empresas como a Google e a Microsoft são difíceis, mas é algo bastante direto de te preparares.</p><p>Assim que tiveres uma compreensão sólida sobre estruturas de dados e algoritmos, recomendo estes três recursos para praticares:</p><ul><li><a href="https://leetcode.com/" rel="noopener">Leetcode</a> — uma plataforma interativa para praticar problemas de código de entrevistas.</li><li><a href="https://amzn.to/2Nzf85C" rel="noopener">Cracking the Coding Interview</a> — um livro popular sobre entrevistas de programação.</li><li><a href="https://www.dailycodingproblem.com/?ref=csdojo" rel="noopener">Daily Coding Problem</a> — uma lista de e-mail que te fornece um problema por dia.</li></ul><p>Depois de praticares por conta própria durante algumas semanas, deves começar a fazer entrevistas simuladas.</p><h4 id="como-simular-entrevistas"><strong>Como simular entrevistas</strong></h4><p>Basicamente, junta-te aos teus amigos e distribui problemas por todos a partir dos recursos que mencionei acima.</p><p>Depois, resolve cada problema em papel ou num Google doc. Explica a tua solução a um amigo teu.</p><p>Certifica-te de que praticas como entrevistador e como entrevistado, para que consigas ver como é estar no lugar do entrevistador.</p><p>Assim que tiveres feito mais ou menos 20 entrevistas simuladas, deves estar preparado para começar a fazer entrevistas nas empresas em que desejas trabalhar.</p><h3 id="passo-6-concorrer-concorrer-e-concorrer-novamente-a-vagas-"><strong>Passo 6: Concorrer, concorrer e concorrer novamente a vagas 🙂</strong></h3><p>Utiliza as três estratégias que mencionei acima para concorrer a vagas em empresas tecnológicas de topo:</p><ul><li>eventos de recrutamento/feiras de emprego</li><li>ser recomendado por amigos</li><li>e concorrer on-line.</li></ul><p>Se não conseguires o emprego à primeira, não te preocupes. De facto, deves estar à espera de alguns fracassos, visto que entrar nestas empresas é muito competitivo.</p><p>No meu caso, <a href="https://youtu.be/uPOJ1PR50ag" rel="noopener">precisei de concorrer para a Google 5 vezes antes de conseguir obter lá o meu emprego como engenheiro de software</a> (vídeo em inglês).</p><h3 id="j-est-aqui-est-um-pequeno-resumo-"><strong>Já está! Aqui está um pequeno resumo:</strong></h3><ul><li>Passo 1: Aprender a programar</li><li>Passo 2: Trabalhar em alguns projetos pessoais</li><li>Passo 3: Conseguir o teu primeiro emprego ou estágio em programação</li><li>Passo 4: Aprender estruturas de dados e algoritmos</li><li>Passo 5: Prepara-te para entrevistas de programação</li><li>Passo 6: Concorrer, concorrer e concorrer novamente a vagas 🙂</li></ul><h4 id="espera-mesmo-assim-t-o-simples"><strong>Espera. É mesmo assim tão simples?</strong></h4><p>Sim, é. Mesmo assim, é preciso muito tempo e dedicação para fazer todos os 6 passos.</p><h3 id="mais-algumas-observa-es-"><strong>Mais algumas observações:</strong></h3><h4 id="preciso-de-ter-uma-forma-o-em-ci-ncias-da-computa-o"><strong>Preciso de ter uma formação em ciências da computação?</strong></h4><p>A resposta mais curta é não. No entanto, ter uma licenciatura em ciências da computação ajuda muito. Se fizeres um programa de Ciências da computação sólido, resolverás grande parte dos passos 1, 2, 3 e 4 (aprender a programar, trabalhar em alguns projetos pessoais, conseguir o teu primeiro emprego ou estágio em programação, e aprender estruturas de dados e algoritmos).</p><p>Sem um licenciatura em Ciências da Computação, só terás de aprender mais por conta própria.</p><p>Além disso, tem em conta que, mesmo com uma licenciatura em Ciências da Computação, é preciso trabalhar muito para obter um emprego de engenheiro de software numa destas empresas.</p><h4 id="preciso-de-frequentar-uma-universidade-de-topo-como-o-mit-stanford-carnegie-mellon-etc-"><strong>Preciso de frequentar uma universidade de topo, como o MIT, Stanford, Carnegie Mellon etc.?</strong></h4><p>Novamente, a resposta mais curta é não. Provavelmente, ajuda um pouco, mas está longe de ser necessário.</p><p>Laszlo Bock, um antigo Vice-Presidente Sénior de Operações Pessoais na Google, também concorda.</p><p>De acordo com o livro que escreveu, <a href="https://amzn.to/2NA5Juj" rel="noopener">Work Rules!</a> (em inglês), a Google prefere alunos excelentes de faculdades menos conhecidas do que alunos medíocres de faculdades de topo como o MIT.</p><p>Penso que isto faça sentido porque, se fores inteligente e dedicado, não deve interessar muito qual foi a faculdade que frequentaste.</p><h4 id="-necess-rio-ter-uma-m-dia-escolar-alta"><strong>É necessário ter uma média escolar alta?</strong></h4><p>Novamente, a resposta curta é que não.</p><p>Ter uma média escolar alta, provavelmente, ajuda um pouco para obter uma entrevista, mas é muito mais importante ter uma experiência prática bastante sólida e projetos interessantes para mostrar no teu currículo.</p><p>De facto, de acordo com o livro <a href="https://amzn.to/2NA5Juj" rel="noopener">Work Rules!</a>, a Google antigamente tinha muito interesse na média escolar do candidato. No entanto, descobriram que ter uma média alta não está fortemente relacionado com ter um desempenho forte no local de trabalho, a longo prazo. Depois dessa descoberta, deixaram de dar um destaque tão grande à média escolar.</p><h4 id="ent-o-o-que-preciso"><strong>Então, o que preciso?</strong></h4><p>Basicamente, tudo o que precisas são habilidades fortes de programação e de resolução de problemas, uma boa compreensão dos princípios da ciência da computação e projetos interessantes e experiência para mostrar no teu currículo.</p><p>Serás capaz de fazer tudo isto se seguires os 6 passos que expliquei acima.</p><h4 id="ent-o-como-posso-escrever-um-bom-curr-culo"><strong>Então, como posso escrever um bom currículo<strong><strong>?</strong></strong></strong></h4><p>Se desejares, podes aproveitar o currículo (em inglês) que eu utilizei para concorrer à Google.</p><ul><li><a href="https://yosuke-sugishita-99ky.squarespace.com/s/yk_sugi_resume.pdf" rel="noopener">Aqui está a versão em PDF</a>.</li><li><a href="https://yosuke-sugishita-99ky.squarespace.com/s/yk_sugi_resume.docx" rel="noopener">Aqui está uma versão para o Word</a>.</li><li><a href="https://yosuke-sugishita-99ky.squarespace.com/s/yk_sugi_resume.pages" rel="noopener">Aqui está uma versão para o Pages</a>.</li></ul><p>Esse é mesmo o currículo que eu utilizei para obter um emprego na Google como engenheiro de software. Deveria ter mesmo só uma página. Por isso, diria que o meu currículo estava muito longo. Mesmo assim, estás à vontade para utilizá-lo como um ponto de partida.</p><h4 id="recursos-adicionais-para-criar-um-curr-culo-"><strong>Recursos adicionais para criar um currículo<strong><strong>:</strong></strong></strong></h4><ul><li>Existe uma boa visão geral sobre este tópico no CareerCup, <a href="https://www.careercup.com/resume" rel="noopener">aqui</a> (em inglês).</li><li>A minha amiga <a href="https://www.freecodecamp.org/news/how-to-get-a-software-engineer-job-at-google-and-other-top-tech-companies-efa235a33a6d/undefined" rel="noopener">Zhia Hwa Chong</a>, que é uma engenheira de software no Twitter, tem um <a href="https://www.freecodecamp.org/news/how-to-write-a-great-resume-for-software-engineers-75d514dd8322">bom artigo sobre isso aqui</a> (em inglês).</li></ul><p>Bem, boa sorte, e obrigado por leres este artigo!</p><p>Se tiveres alguma questão, fica à vontade para falar com o autor pelo <a href="https://www.instagram.com/ykdojo/" rel="noopener">Instagram</a> ou pelo <a href="https://twitter.com/ykdojo" rel="noopener">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Linha-a-linha: truques avançados de CSS para listas drop-down clicáveis e menus ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: David Piepgrass Desde que me lembro, sempre existiram dois tipos de seletores. Existia o tipo onde o texto no topo podia ser editado e o tipo onde isso não era possível. O HTML inclui o segundo tipo, sem problemas: <select>     <option>Apple</option>    ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/linha-a-linha-truques-avancados-de-css-para-listas-drop-down-clicaveis-e-menus/</link>
                <guid isPermaLink="false">640075e1c24870050d79f29f</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Mon, 01 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_LL8iCzq1GKLgtaP_Y_be7w.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/mostly-css-drop-down-combo-boxes-4ff4bb182ff7/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Line-by-line: advanced CSS tricks for click-to-open drop-down lists and menus</a>
      </p><p>Escrito por: David Piepgrass</p><p>Desde que me lembro, sempre existiram dois tipos de seletores.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/2abIBTqGwaakCmqxPmiGqUF8ldqbzZlfMBnR.png" class="kg-image" alt="2abIBTqGwaakCmqxPmiGqUF8ldqbzZlfMBnR" width="228" height="118" loading="lazy"></figure><p>Existia o tipo onde o texto no topo podia ser editado e o tipo onde isso não era possível. O HTML inclui o segundo tipo, sem problemas:</p><pre><code class="language-html">&lt;select&gt;
    &lt;option&gt;Apple&lt;/option&gt;  
    &lt;option&gt;Banana&lt;/option&gt;  
    &lt;option&gt;Cherry&lt;/option&gt;  
    &lt;option&gt;Dewberry&lt;/option&gt;
&lt;/select&gt;</code></pre><p>Fiquei, no entanto, chocado ao perceber que o primeiro tipo não existe em HTML. Bem, existe algo chamado <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist" rel="noopener"><code>datalist</code></a>, mas não funciona bem — os utilizadores não podem clicar em algo para ver a lista completa. Além disso, à medida que começas a escrever, os itens começam imediatamente a desaparecer caso não comecem pela mesma string que o utilizador escreveu.</p><p>O CSS, contudo, é uma ferramenta de estilização com um poder impressionante: já foram criados <a href="http://victordarras.fr/cssgame/" rel="noopener">jogos</a> de <a href="https://codepen.io/elad2412/full/DBeNNZ">vídeo</a> <a href="https://minocernota.com/articles/pure_css_game/" rel="noopener">completos</a> com CSS, HTML e alguns ficheiros de imagens – que bom, acabei de perder metade da minha audiência.</p><p>Isto não quer dizer que o CSS pode fazer <strong>tudo</strong>, mas que existem pelo menos "atalhos" para alcançar uma grande variedade de truques. Aqueles de vocês que estão cansados de jogar estão provavelmente interessados em aprender sobre os truques do ofício. Acho que existe muito a aprender ao compreender como fazer uma caixa de combo.</p><p>Neste artigo, vais aprender como isto funciona:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/biYH9OqxjvdVcIPN3FqUvR-VDiNaQilF2jwx.gif" class="kg-image" alt="biYH9OqxjvdVcIPN3FqUvR-VDiNaQilF2jwx" width="734" height="326" loading="lazy"></figure><p>No Windows, chamamos isso de "caixas de combo" (em inglês, <em>combo boxes</em>), visto que elas combinam a parte superior (geralmente, um campo de texto) com uma parte de <em>popup </em>(geralmente, uma lista <em>drop-down</em>).</p><h3 id="como-utilizar"><strong>Como utilizar</strong></h3><p>A caixa de combo pode ser construída com <em>divs </em>e/ou <em>spans</em>. Lembra-te apenas que um analisador de HTML tem algumas regras de hierarquia. Por exemplo, não permite que um <code>p</code> seja um antecessor de <code>div</code> ou <code>ul</code>. Um <code>span</code> também não pode ser um antecessor de <code>p</code> ou <code>div</code>. Estas regras não se aplicam ao código JavaScript/React que edita o DOM.</p><p>O CSS estará à espera de três filhos: primeiro, a parte superior (conteúdo a ser sempre exibido), depois o <code><strong><strong><strong><strong>&lt;span class=</strong></strong></strong></strong>"downarrow" <strong><strong><strong><strong>tabindex=</strong></strong></strong></strong>"-1"<strong><strong><strong><strong>&gt;&lt;/span&gt;</strong></strong></strong></strong></code><strong><strong>, </strong></strong>para a seta para baixo, e, por fim, o conteúdo a ser apresentado dentro da caixa <em>drop-down</em>:</p><pre><code class="language-html">&lt;div class="combobox"&gt;
  &lt;div&gt;Caixa de combo simples&lt;/div&gt;
  &lt;div tabindex="-1" class="downarrow"&gt;&lt;/div&gt;
  &lt;div&gt;
    O conteúdo do popup do drop-down vai aqui
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>O <em>drop-down</em>, inicialmente, abrirá apenas quando a seta para baixo (▾) for clicada. Para fazer com que a caixa abra quando o conteúdo do topo for clicado, é necessário adicionares a classe <code>dropdown</code> a <code>combobox</code> e adicionar um atributo <code>tabindex="0"</code> ao primeiro filho:</p><pre><code class="language-html">&lt;div class="combobox dropdown"&gt;
  &lt;div tabindex="0"&gt;Caixa de combo simples&lt;/div&gt;
  &lt;div tabindex="-1" class="downarrow"&gt;&lt;/div&gt;
  &lt;div&gt;
    O conteúdo do popup do drop-down vai aqui
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p><strong>Observação<strong><strong><strong>:</strong></strong></strong> </strong><code>tabindex="-1"</code> significa "podes clicar para lhe dar destaque, mas não podes destacá-lo utilizando a tecla Tab do teclado". <code>tabindex="0"</code> significa "podes dar-lhe destaque ao clicar ou com a tecla Tab, e o <em>browser </em>escolherá a ordem pela qual são destacados os diferentes elementos com a tecla Tab." Ao contrário de um elemento <code>&lt;select&gt;</code>, a caixa de <em>popup</em> não será capaz de sair da janela do <em>browser</em> (isto pode ser uma limitação intencional de todo o conteúdo definido pelo utilizador — caso o conteúdo definido pelo utilizador passe para lá dos limites da área da página, pode ser um risco de segurança para sites que tentam confundir ou enganar os utilizadores).</p><p>Como bónus, serás capaz de criar uma lista <em>drop-down</em> que <strong><strong>nã</strong>o</strong> é uma caixa de combo apenas com a classe <code>dropdown</code>:</p><pre><code class="language-html">&lt;div class="dropdown"&gt;
   *** &lt;span tabindex="0"&gt;Menu drop-down&lt;/span&gt; *** 
   &lt;div&gt;
     O conteúdo do popup do drop-down vai aqui
   &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Isto é um menu <em>drop-down</em> que se clica para abrir (caso queiras um menu <em>drop-down</em> que abre ao passar o rato por cima em vez de clicar, já existem <a href="https://www.google.com/search?num=20&amp;q=pure+css+hover+menu" rel="noopener">muitos outros tutoriais</a> sobre isso.)</p><p>Neste caso, o último elemento contém o conteúdo do <em>drop-down</em> e todos os outros filhos estão sempre visíveis, mas apenas os elementos com um atributo <code>tabindex</code> podem ser clicados para abrir a área de <em>popup</em>.</p><p>Podes editar de modo seguro a margem e o contorno de uma caixa de combo, assim como os seus filhos, sem comprometer o seu comportamento, com exceção para uma coisa: não deixes que o <code>padding-right</code> fique muito pequeno porque a seta para baixo ▾ é apresentada no <em>padding</em> — o seu tamanho deve ser de, pelo menos, <code>1em</code>.</p><h4 id="resumo"><strong>Resumo</strong></h4><ul><li>A classe <code>combobox</code> é para a caixa de combo</li><li>A classe <code>dropdown</code> é para menus e caixas de combo que aparecem quando o conteúdo de cima for clicado (lembra-te de que <code>tabindex="0"</code>)</li><li>A classe <code>downarrow</code> adiciona o ícone da seta para baixo (<code>tabindex="-1"</code> é obrigatório, porque não pode ser adicionado via CSS.)</li><li>O último filho de <code>combobox</code> ou <code>dropdown</code> é o conteúdo do <em>drop-down</em>.</li></ul><p>Podes <a href="https://codepen.io/qwertie/pen/QBYMdZ" rel="noopener">pré-visualizar a demonstração com código-fonte</a>.</p><h3 id="funcionalidades-do-css-de-que-vamos-precisar"><strong>Funcionalidades do CSS de que vamos precisar</strong></h3><p>Vamos precisar de <strong>muitas</strong> coisas para isto. Aqui está uma lista (fica à vontade para saltar esta parte e ler mais tarde.)</p><h4 id="seletores"><strong>Seletores</strong></h4><p><strong>Seletores b<strong>ásic</strong>os<strong>:</strong></strong><br><code>.a</code> significa "corresponde a elementos com <code>class='a'</code>".<br><code>A, B</code> significa "corresponde ao seletor <code>A</code> ou seletor <code>B</code>".<br><code>A B</code> significa "corresponde a um elemento <code>B</code> que tem um elemento <code>A</code> como antecessor".<br><code>A &gt; B</code> significa "corresponde a um elemento B cujo elemento pai é um elemento A".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> </strong><code><strong><strong>:first-child</strong></strong></code><strong><strong>:</strong></strong><br><code>*:first-child</code> significa "corresponde a qualquer elemento desde que seja o primeiro descendente de algum elemento pai".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> <strong><code>:last-child</code>:</strong></strong><br><code>*:last-child</code> significa "corresponde a qualquer elemento desde que seja o último descendente de outro elemento". Por exemplo, <code>.combobox &gt; *:last-child</code> encontra o último descendente de qualquer elemento com <code>class="combobox"</code>.</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> <strong><code>:empty</code>:</strong></strong><br><code>.downarrow:empty</code> significa "corresponde a um elemento com <code>class="downarrow"</code> caso não tenha nada dentro (nem mesmo texto simples)".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> <strong><code>:only-child</code>:</strong></strong><br><code>*:only-child</code> significa "corresponde a qualquer elemento caso este seja o único descendente de algum elemento".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> <strong><code>:not</code>:</strong></strong><br><code>.dropdown:not(.sticky)</code> significa "corresponde a um elemento com a classe <code>dropdown</code> caso este não tenha a classe <code>sticky</code>".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> </strong><code><strong><strong>:focus</strong></strong></code><strong><strong>:</strong></strong><br><code>.downarrow:focus</code> significa "corresponde a um elemento com a classe <code>downarrow</code> caso este esteja <strong>destacado,</strong> porque este tem um <code>tabindex</code> e foi clicado com o rato ou selecionado com a tecla Tab".</p><p><strong>P<strong>seudo</strong>s<strong>seletor</strong> <strong><code>:hover</code>:</strong></strong><br><code>.foo:hover</code> significa "corresponde a um elemento com a classe <code>foo</code> quando o ponteiro do rato está por cima dele".</p><p><code>A ~ B</code> significa "corresponde a <code>B</code> caso um elemento irmão anterior tenha correspondido a <code>A</code>".</p><h4 id="estilos"><strong>Estilos</strong></h4><p><strong>Estilos básicos<strong>:</strong></strong><br>Certifica-te de que compreendes o <a href="https://www.w3schools.com/css/css_boxmodel.asp" rel="noopener">modelo de caixas</a> (texto em inglês) e os seus vários estilos associados (incluindo <code>width</code>, <code>height</code>, <code>min-width</code> e <code>max-height</code>) antes de continuares. Também deves ter conhecimentos sobre estilos básicos, tais como <code>font-size</code>, <code>font-family</code>, <code>color</code> e <code>background-color</code>.</p><p>Além disso, deves ter conhecimentos sobre unidades, especialmente as <a href="https://css-tricks.com/the-lengths-of-css/" rel="noopener">unidades mais comuns</a> (texto em inglês):<br><code>px</code>, <code>em</code>, <code>rem</code>, e <code>%</code>.</p><p><strong>Estilo </strong><code><strong><strong>box-sizing: border-box</strong></strong></code><br>Isto significa que a largura e altura de um elemento <a href="https://css-tricks.com/international-box-sizing-awareness-day/" rel="noopener">incluem o <em>padding</em> e o contorno</a> (texto em inglês).</p><p><strong>Estilo <strong><code>display:</code></strong></strong><br>Vamos utilizar <code>display: block</code>, que apresenta um elemento como um "bloco", que é como um parágrafo em que dois blocos adjacentes têm quebras de linha entre eles.</p><p>Também vamos utilizar <code>display: inline-block</code>, que apresenta um elemento <strong>em linha</strong>, como um ícone dentro de um parágrafo, mas permite ter margens, contornos e <em>padding</em>.</p><p>Não vamos utilizar explicitamente o <code>display: inline</code>, que é utilizado para elementos que não têm margens, contornos ou <em>padding</em>, e não precisam de quebras de linha entre eles (<code>&lt;b&gt;like this&lt;/b&gt;</code>).</p><p><a href="https://css-tricks.com/almanac/properties/d/display/" rel="noopener">Fica a saber mais</a> sobre o <em>display </em>(texto em inglês).</p><p><strong>Estilo <strong><code>position:</code></strong></strong><br>Na caixa de combo, vamos ver como é utilizado este estilo para remover elementos do fluxo normal do documento.</p><p>Os elementos normalmente têm o estilo <code>position: static</code>, que significa apenas "posiciona-o normalmente na página".</p><p><code>position: relative</code> é como o <code>static</code>, excepto para duas coisas: primeiro, o elemento pode ser movido para a esquerda, direita, cima ou baixo, sem afetar qualquer um dos outros elementos.<br>No entanto, a caixa de combo não precisa desta funcionalidade. O segundo efeito de <code>relative</code> é marcar o elemento como "posicionado".</p><p>Isto é importante, pois outro tipo de posicionamento, <code>absolute</code>, posiciona um elemento em relação ao antecessor que estiver "posicionado" mais próximo. Especificamente, o <em>popup </em>do <em>drop-down</em> utilizará <code>position: absolute</code> de modo a posicionar-se em relação à parte superior da caixa de combo — portanto, a própria caixa de combo é marcada como <code>relative</code>.</p><p>Além disso, um elemento <code>absolute</code> não afeta o posicionamento dos outros itens na página, nem mesmo o seu elemento pai. Isto é exatamente o que queremos para uma caixa de <em>popup</em>.</p><p><strong>Estilos </strong><code><strong><strong>left</strong></strong></code><strong><strong>, <code>top</code>, <code>right</code> </strong>e<strong> <code>bottom</code></strong></strong><br>Estes estilos são utilizados com <code>position: relative</code> e <code>position: absolute</code>, e funcionam de maneira um pouco diferente para cada um deles. Mais informação sobre isto depois.</p><p><a href="https://www.w3schools.com/css/css_positioning.asp" rel="noopener">Aprende mais</a> sobre posicionamento (texto em inglês).</p><p><strong>Estilo <strong><code>outline:</code></strong></strong><br>O <em>Outline</em> é um contorno extra desenhado por fora do contorno normal de um elemento. é normalmente utilizado para destacar um elemento, como por exemplo indicar que este foi "selecionado" por um utilizador. Como é esperado que os <em>outlines</em> sejam temporários, estes não ocupam espaço na página — por isso, adicionar um <em>outline</em> não vai empurrar os outros elementos.</p><p><strong>Estilo </strong><code><strong><strong>box-shadow:</strong></strong></code><br>Desenha uma sombra "por baixo" do elemento (bem, na verdade a sombra é desenhada <strong>fora</strong> do elemento, que fica muito estranho no caso de o elemento não ter cor de fundo). Isto vai dar muito jeito para o <em>popup</em> do <em>drop-down</em>!</p><p><strong>Estilo </strong><code><strong><strong>z-index:</strong></strong></code><br>Este estilo altera a ordem pela qual um elemento é desenhado pelo <em>browser</em>. Um <em>z-index</em> <strong>mais alto</strong> faz com que um elemento seja desenhado <strong>mais tarde,</strong> de modo a que apareça por cima das outras coisas na página.</p><p>Vamos precisar de um <em>z-index</em> grande para o nosso <em>popup </em>do <em>drop-down</em> para que apareça por cima de tudo. O filho do <em>popup</em> receberá um novo "contexto de sobreposição", que basicamente significa que vão ser desenhados por cima do <em>popup</em>, que é uma coisa boa.</p><p><a href="https://www.smashingmagazine.com/2009/09/the-z-index-css-property-a-comprehensive-look/" rel="noopener">Atenção</a> (texto em inglês): <code>z-index</code> apenas funciona em elementos "posicionados".</p><p><strong>Estilo <strong><code>cursor:</code></strong></strong><br>Controla a <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/cursor" rel="noopener">aparência</a> (texto em inglês) do ponteiro do rato.</p><p><strong>Estilo <strong><code>text-align:</code></strong></strong><br><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-align" rel="noopener">Justificação horizontal</a> (<code>left</code>, <code>right</code> ou <code>center</code>) – texto em inglês.</p><p><strong>Estilo </strong><code><strong><strong>pointer-events:</strong></strong></code><br>A configuração <code>none</code> deste estilo torna um elemento "invisível" a <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events" rel="noopener">cliques do rato</a> (texto em inglês).</p><p><strong>Estilo <strong><code>transform:</code></strong></strong><br>Permite-te rodar, aumentar ou diminuir a escala, inclinar, ou mover um elemento de bloco (ou bloco em linha). Estas <a href="https://www.w3schools.com/cssref/css3_pr_transform.asp" rel="noopener">transformações</a> (texto em inglês) são inteligentes e também afetam o input do rato.</p><p>Por exemplo, poderias rodar o texto em 30 graus e mesmo assim selecioná-lo com o rato.</p><p><strong>Estilo <strong><code>transition:</code></strong></strong><br>Permite <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions" rel="noopener">animações</a> (texto em inglês) quando o estilo muda.</p><p><strong>Es<strong>t</strong>i<strong>l</strong>o </strong><code>opacity:</code><br>Um número que varia entre 0 e 1 e controla a visibilidade de um elemento:<br><code>1</code> é o valor normal que torna o elemento totalmente visível<br><code>0</code> torna o elemento totalmente invisível. Ao contrário de <code>visibility: hidden</code> e <code>display: none</code>, as outras formas de tornar um elemento invisível, <code>opacity: 0</code> não impede que o rato interaja com o elemento.</p><p>Neste artigo, vamos utilizar a transparência para animações — ao animar a transição entre <code>opacity: 0</code> e <code>opacity: 1</code>, podemos fazer com que o elemento apareça ou desapareça gradualmente.</p><h4 id="pseudoelemento"><strong>Pseudoelemento</strong></h4><p><strong><strong><code>::before</code></strong></strong> ou <strong><strong><code>::after</code></strong></strong>:<br>Refere-se a um elemento virtual <strong>dentro</strong> de um elemento selecionado previamente, antes ou depois do seu conteúdo normal.</p><p>Por exemplo, se escreveres <code>p::before { content: "!" }</code>, então <code>!</code> aparecerá no início de cada parágrafo.</p><p>Podemos utilizar o <code>content</code> com <code>::before</code> ou <code>::after</code> para desenhar a seta a apontar para baixo (▾).</p><h3 id="preparar-a-apar-ncia-inicial"><strong>Preparar a aparência inicial</strong></h3><p><code>.combobox</code> e <code>.dropdown</code> precisam de ter um posicionamento <code>relative</code> para que o <em>popup </em>do <em>drop-down</em> possa ser posicionado relativo a eles. O <code>display: inline-block</code> permite que a caixa de combo tenha margens, <em>padding</em> e contorno. Ao contrário de <code>display: block</code>, este permite que apareçam outras coisas na mesma linha (tais como <em>labels </em>ou outras caixas de combo.)</p><pre><code class="language-css">.combobox, .dropdown { 
  /* "relative" e "inline-block" (ou apenas "block") são necessários aqui
     para que "absolute" funcione corretamente nos descendentes */
  position: relative;
  display: inline-block;
}</code></pre><p>As caixas de combo terão um contorno embutido, mas as listas <em>drop-down</em> não:</p><pre><code class="language-css">.combobox {
  border: 1px solid #999;
  padding-right: 1.25em; /* deixa espaço para ▾ */
}</code></pre><p>A cor <code>#999</code> é ligeiramente mais escura do que o contorno do elemento <code>&lt;select&gt;</code> do Chrome e ligeiramente mais clara do que o contorno do elemento <code>&lt;select&gt;</code> do FireFox. Por isso, não fica muito diferente do que qualquer um deles.</p><h4 id="como-desenhamos-a-pequena-seta-para-baixo-"><strong>Como desenhamos a pequena seta para baixo (▾)?</strong></h4><p>Aqui, a dificuldade é controlar a altura. A caixa de combo pode ter conteúdo com uma dimensão imprevisível: letra pequena, letra grande, uma linha ou duas linhas. O "botão" de seta tem de ter a mesma altura para que funcione independentemente de onde o utilizador clica — qualquer sítio dentro do contorno deve funcionar.</p><p><strong>Então<strong>, </strong>como podemos fazer com que a seta se adapte à altura do seu irmão à esquerda<strong>?</strong></strong><br>O <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout" rel="noopener">CSS Grid</a> (texto em inglês) consegue fazer isto muito rapidamente, mas não é suportado por todos os <em>browsers</em>. O <a href="https://stackoverflow.com/questions/29503227/how-to-make-flexbox-items-the-same-size" rel="noopener">Flexbox</a> também pode conseguir fazer o trabalho, mas optei por utilizar um truque antigo para compatibilidade com <em>browsers </em>mais antigos: o posicionamento absoluto.</p><p>Com o posicionamento absoluto, posso obrigar a seta a ter a mesma altura do seu recipiente.</p><p>A desvantagem desta abordagem é que a seta existirá fora do fluxo normal do documento, então o <em>browser </em>não reservará nenhum espaço para ela. Em vez disso, vamos atribuir à caixa de combo algum <em>padding </em>do lado direito (acima de <code>1.25em</code>), e a seta existirá dentro do <em>padding</em>.</p><p>No modo de posicionamento absoluto, o <code>top</code> alinha o limite superior do elemento em relação ao limite superior do seu recipiente: <code>top: 0</code> significa que os dois limites superiores vão estar no mesmo local. De maneira semelhante, <code>left: 0</code> alinha o lado esquerdo do elemento ao lado esquerdo do recipiente e por aí a fora.</p><p>Coordenadas positivas empurram o elemento "para dentro" em relação ao recipiente. Então, <code>top: 10px</code> quer dizer "coloca o topo do elemento 10px abaixo do topo do elemento pai", enquanto que <code>bottom: 10px</code> quer dizer "coloca o fundo do elemento 10px acima do fundo do elemento pai."</p><p>Neste caso, precisamos de <code>top: 0; bottom: 0; right: 0; width: 1.25em</code> para colocar a seta do lado direito, de cima para baixo.</p><pre><code class="language-css">.combobox &gt; .downarrow, .dropdown &gt; .downarrow {
  display: block;     /* Permite margin/border/padding/size */
  position: absolute; /* Coloca fora do fluxo normal */
  top: 0;    /* Alinha o topo da downarrow com a borda superior da combobox */
  bottom: 0; /* Alinha o fundo da downarrow com o fundo da combobox */
  right: 0; /* Alinha o limite direito da downarrow com o limite direito da combobox*/
  width: 1.25em;
  
  cursor: default; /* Utiliza o ponteiro em forma de seta em vez de I-beam */
  nav-index: -1; /* Define tabindex, não-funcional na maioria dos browsers */
  border-width: 0;        /* Desativado de início */
  border-color: inherit;  /* Copia a cor da borda do elemento pai */
  border-left: inherit;   /* Copia a borda do elemento pai */
}</code></pre><p>Aqui, <code>display: block</code> e <code>display: inline-block</code> têm o mesmo efeito. Por isso, utilizei o mais curto. Também desativei o ponteiro do rato que normalmente aparece ao passar por cima de texto (visto que a seta para baixo conta como texto).</p><p>Na verdade, existe um modo de definir <code>tabindex</code> em CSS, chamado <code>nav-index</code>. Mas a maior parte dos <em>browsers </em>não a suporta. Por isso, se descobrires que a tua caixa de combo funciona apenas no Opera, já sabes a razão.</p><p>Deves, então, adicionar <code>tabindex="-1"</code> ao lado de <code>class="downarrow"</code>.</p><p>Este código desabilita os contornos, com a ressalva de que a cor/estilo do contorno deve ser herdada do elemento pai (a caixa de combo), caso outro CSS aumente <code>border-left-width</code>. Já agora, podes utilizar a opção <code>inherit</code> em qualquer atributo que não herde atributos do elemento pai desde o início.</p><p>Decidi que deve existir um contorno à esquerda no caso do <em>popup </em>não abrir quando o lado esquerdo é clicado. Desse modo, a seta para baixo parece-se com um botão, sugerindo subtilmente que pode ser clicado. Lembra-te do plano: apenas <code>dropdown</code>, e não a <code>combobox</code> por si só, abrirá quando o lado esquerdo é destacado.</p><p>Portanto, vou adicionar um contorno quando <code>combobox</code> é utilizado por si só:</p><pre><code class="language-css">.combobox:not(.dropdown) &gt; .downarrow {
  border-left-width: 1px;
}</code></pre><p>De seguida, caso o utilizador nos tenha fornecido um <code>&lt;span class="downarrow"&gt;&lt;/span&gt;</code> vazio, precisamos de adicionar magicamente o caractere de seta em falta através de <code>::before</code> (ou <code>::after</code>) e <code>content</code>:</p><pre><code class="language-css">.downarrow:empty::before {
  content: '▾';
}</code></pre><p>A seta para baixo também precisa de estar centrada no elemento <code>.downarrow</code>. <code>text-align: center</code> irá centrar o texto horizontalmente, mas centrar verticalmente é mais complicado. <code>vertical-align: middle</code> não funciona porque é desenhado para alinhar elementos <strong><strong>inline</strong></strong> com <strong>o texto à volta</strong>. O que nós queremos é alinhar o nosso pseudoelemento de seta para baixo com o recipiente <strong><strong>pa</strong>i</strong> <code>.downarrow</code>.</p><p>Aqui está um truque para isto:</p><pre><code class="language-css">.downarrow::before, .downarrow &gt; *:only-child {
  text-align: center; /* Centra horizontalmente */
  /* Truque para centralizar verticalmente */
  position: relative; /* Permite que o elemento se mova */
  top: 50%;           /* Move para baixo 50% da dimensão do recipiente */
  transform: translateY(-50%); /* Move para cima 50% do tamanho do elemento */
  display: block;     /* `transform` exige block/inline-block */
}</code></pre><p>Lembra-te que apenas adicionamos o conteúdo <code>::before</code> se <code>.downarrow</code> estiver vazio. Se o utilizador forneceu o seu próprio elemento de seta personalizado, vamos querer centrá-lo na mesma, daí o seletor <code>.downarrow &gt; *:only-child</code>.</p><p>Se a caixa de combo tiver um elemento <code>&lt;input&gt;</code>, esta não deve ter contorno:</p><pre><code class="language-css">.combobox &gt; input {
  border: 0 /* Caixa de combo já tem um contorno */
}</code></pre><p>A próxima parte é opcional, mas geralmente o primeiro descendente de uma caixa de combo deve ter 100% da largura da sua <code>.combobox</code> pai, para o caso da caixa de combo ser mais larga do que o primeiro descendente, o primeiro descendente estica para corresponder ao tamanho do elemento. Para o caso do utilizador ter construído a caixa de combo com spans em vez de divs (talvez para que possa ser colocada dentro de um <code>&lt;p&gt;</code>), pode fazer sentido definir o primeiro descendente como <code>inline-block</code> de modo a que possa ter <em>padding </em>e margens.</p><pre><code class="language-css">.combobox &gt; *:first-child {
  width: 100%;
  box-sizing: border-box; /* para que 100% inclua contorno e padding */
  display: inline-block;
}</code></pre><h3 id="preparar-a-lista-drop-down"><strong>Preparar a lista <em>drop-down</em></strong></h3><p>Inicialmente, só a queremos oculta, por isso podemos utilizar <code>display: none</code>.</p><p>Em preparação para quando estiver visível, no entanto, vamos definir mais algumas propriedades. Começa por <code>position: absolute</code>, para que fique fora do fluxo normal do documento (lembra-te de que um elemento <code>absolute</code> é posicionado relativo ao seu antecessor <code>relative</code> mais próximo, que é <code>.combobox</code> ou <code>.dropdown</code>). Quando estiver visível, é claro que deve ter um contorno e cor de fundo, além de uma sombra por baixo.</p><p>Aqui, podes ver <code>box-shadow: 1px 2px 4px 1px #4448</code>, que significa "apresenta uma sombra de 1px à direita do elemento, 2px para baixo, desfocada em 4px, e torna a sombra 1px mais larga do que o próprio elemento, com a cor #4448". Também precisamos de um grande <em>z-index</em> para que o <em>popup </em>apareça por cima de tudo:</p><pre><code class="language-css">.dropdown &gt; *:last-child,
.combobox &gt; *:last-child {
  display: none;          /* Oculto de início */
  position: absolute;     /* Fora do fluxo do documento */
  left: 0;          /* Lado esquerdo do popup = lado esquerdo do elemento pai */
  top: 100%;        /* Topo do popup = 100% abaixo do topo do elemento pai */
  border: 1px solid #999; /* Contorno cinzento */
  background-color: #fff; /* Fundo branco */
  box-shadow: 1px 2px 4px 1px #4448; /* Sombra */
  z-index: 9999;          /* Desenha por cima de tudo */
  min-width: 100%;        /* &gt;= 100% tão largo como o recipiente */
  box-sizing: border-box; /* A largura inclui contorno e padding */
}</code></pre><p>Aqui, utilizei <code>left: 0</code> e <code>top: 100%</code> para posicionar corretamente o <em>popup</em>, mas, neste caso, acontece que o posicionamento <strong>predefinido</strong> do <em>popup </em>é praticamente o mesmo. Por isso, esses estilos não são realmente necessários.</p><p>Para tornar a caixa <em>drop-down</em> visível, tudo o que precisamos é <code>display: block</code>.</p><p><strong>Que seletores vamos precisar para alcançar isto<strong>?</strong></strong></p><pre><code class="language-css">??? {
  display: block;
}</code></pre><p>O mais óbvio, o <em>drop-down</em> deve ser apresentado nos três casos abaixo:</p><ol><li>O utilizador clicou na <code>.downarrow</code></li><li>O utilizador clicou ou utilizou a tecla tab até <code>.dropdown</code></li><li>O utilizador clicou ou utilizou a tecla tab até um descendente de <code>.dropdown</code></li></ol><p>A caixa <em>drop-down</em> é o último descendente. Por isso, vamos ter de combinar o seletor <code>*:last-child</code> com o <code>:focus</code> para detetar quando uma das coisas acima for clicada ou destacada com a tecla tab:</p><pre><code class="language-css">.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus              &gt; *:last-child,
.dropdown &gt; *:focus          ~ *:last-child {
  display: block;
}</code></pre><p>Porém, ainda não terminamos. O que fazer se o utilizador clicar numa caixa de texto ou num link dentro da caixa <em>drop-down</em>? O clique vai fazer com que a <code>.downarrow</code> ou o <code>.dropdown</code> perca o destaque, o que faz com que a caixa <em>drop-down</em> desapareça instantaneamente.</p><p>No caso de um link, o <em>browser </em>destaca o link quando o botão do rato é pressionado, mas não segue o link até que o botão seja largado. Por isso, se o <em>drop-down</em> desaparecer instantaneamente, qualquer link no <em>drop-down</em> deixará de poder ser seguido!</p><p>Para corrigir isto, devemos manter a caixa aberta sempre que algo dentro do <code>:last-child</code> tenha o destaque:</p><pre><code class="language-css">.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; *:last-child:focus-within,
.dropdown &gt; *:last-child:focus-within {
  display: block;
}</code></pre><p><strong>Atenção<strong>:</strong></strong> Isto não funciona no Edge/IE (abaixo é descrita uma alternativa).</p><p>Se a seta para baixo for clicada uma segunda vez, devemos ocultar a caixa <em>drop-down</em>. Isto pode ser alcançado deste modo:</p><pre><code class="language-css">.downarrow:focus {
  pointer-events: none; /* Faz com que o segundo clique feche */
}</code></pre><p>Isto faz com que <code>.downarrow</code> seja invisível para eventos do rato quando tem destaque. Por isso, quando clicas nela, estás na realidade a clicar atrás dela (na <code>.combobox</code>). Isto faz com que perca o destaque, o que, por sua vez, faz com que a caixa <em>drop-down</em> desapareça.</p><p>Podemos fazer a mesma coisa para <code>.dropdown</code>, para que clicar novamente na área superior de um <code>.dropdown</code> faça com que desapareça:</p><pre><code class="language-css">.dropdown &gt; *:not(:last-child):focus,
.downarrow:focus,
.dropdown:focus {
  pointer-events: none; /* Faz com que o segundo clique feche */
}</code></pre><p>Isto funciona em grande parte. No entanto, caso a tua área superior contenha uma caixa de texto, existe um efeito secundário, visto que a caixa de texto não vai processar o input do rato normalmente. Descobri, contudo, que a caixa de texto ainda pode ser utilizada.</p><p>No Firefox, podes clicar e arrastar para selecionar texto se começares quando o <em>popup </em>está fechado, mas não funciona quando o <em>popup </em>está aberto. No Edge, é o oposto: podes clicar e arrastar para selecionar texto apenas quando o <em>popup</em> está aberto. De qualquer modo, é <strong><strong>basica</strong>mente</strong> utilizável, visto que é provável que o utilizador tente novamente uma vez no caso do seu input não funcionar à primeira.</p><p>O comportamento do Chrome é… inconsistente. De qualquer modo, para obter um comportamento perfeito — onde um clique fecha a caixa sem causar que a caixa de texto perca o destaque — penso que é necessário utilizar JavaScript.</p><h3 id="toques-finais"><strong>Toques finais</strong></h3><p>A caixa de combo normalmente deve ter uma margem. Isso, porém, parece ser opcional, visto que os controlos do <code>&lt;input&gt;</code> não têm uma em princípio:</p><pre><code class="language-css">.combobox {
  margin: 5px;
}</code></pre><p>Vamos tornar isso mais bonito ao abrir a caixa com uma animação.</p><p>A propriedade <code>transition</code> é o modo mais fácil de fazer animações. Na realidade, para o nosso objetivo, um simples comando como <code>transition: 0.4s;</code> habilita animações para todos os estilos suportados. No entanto, até agora, o único estilo que vamos alterar é o <code>display</code> e as alterações ao <code>display</code> não podem ser animadas.</p><p>Então, vamos tentar animar uma transição de <code>opacity: 0</code> para <code>opacity: 1</code> ao modificar os nossos estilos existentes…</p><pre><code class="language-css">.dropdown &gt; *:last-child,
.combobox &gt; *:last-child {
  display: none;
  /* 
     ... outros estilos como estavam antes ...
  */
  opacity: 0;
  transition: 0.4s;
}

.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; *:last-child:focus-within,
.dropdown &gt; *:last-child:focus-within {
  display: block;
  opacity: 1;
  transition: 0.15s;
}</code></pre><p>O tempo da transição controla quanto tempo leva a <strong><strong>ent</strong>rar</strong> no estado atual. Ou seja, este código quer dizer "demora 0.15 segundos para <strong>mostrar</strong> e 0.4 segundos para <strong>ocultar</strong>."</p><p><strong>Acontece que a animação não funciona</strong>. <a href="https://stackoverflow.com/questions/39304002/css-transition-disabled-by-displaynone" rel="noopener">O problema está no facto de que</a> <code>display: hidden</code> bloqueia animações (texto em inglês). Em vez disso, precisamos de utilizar uma das <strong><strong>o</strong>utras</strong> formas de ocultar coisas. Outra forma de ocultar coisas é o <code>visibility: hidden</code>. Infelizmente, ele também bloqueia parcialmente animações — a animação para mostrar o <em>popup </em>funciona, mas a animação para ocultar, não.</p><p>Não podemos depender de <code>opacity: 0</code> <strong>por si só</strong> para ocultar um elemento, porque o rato pode interagir na mesma com um elemento que tenha <code>opacity: 0</code>. No entanto, podemos corrigir isso com <code>pointer-events: none</code>.</p><p>Então, o <em>fade-in</em> e o <em>fade-out</em> em funcionamento têm este aspeto:</p><pre><code class="language-css">.dropdown &gt; *:last-child,
.combobox &gt; *:last-child {
  display: block;
  /* 
     ... outros estilos como estavam antes ...
  */
  transition: 0.4s;
  opacity: 0;
  pointer-events: none;
}

.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; *:last-child:focus-within,
.dropdown &gt; *:last-child:focus-within {
  display: block;
  transition: 0.15s;
  opacity: 1;
  pointer-events: auto;
}</code></pre><p>Outra forma de embelezar que podemos adicionar é mover o <em>popup </em>para a posição, tal como animar o <code>top</code>:</p><pre><code class="language-css">.dropdown &gt; *:last-child,
.combobox &gt; *:last-child {
  display: block;
  /* 
     ... outros estilos como estavam antes ...
  */
  top: 0;
  opacity: 0;
  transition: 0.4s;
  pointer-events: none;
}

.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; *:last-child:focus-within,
.dropdown &gt; *:last-child:focus-within {
  display: block;
  top: 100%;
  opacity: 1;
  transition: 0.15s;
  pointer-events: auto;
}</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/mf6Fg50wbA1iptPpoqMItU5cEm2Uo0LwzErg.gif" class="kg-image" alt="mf6Fg50wbA1iptPpoqMItU5cEm2Uo0LwzErg" width="206" height="189" loading="lazy"></figure><p>Decidi que isto é um pouco "excessivo" e não incluí esta parte na <a href="https://codepen.io/qwertie/pen/QBYMdZ" rel="noopener">versão final</a>.</p><p>Por fim, devemos ter um retângulo — um contorno a mostrar quando a caixa de combo está "ativa".</p><p>Primeiro, vamos adicionar o retângulo de destaque para essa seta para baixo:</p><pre><code class="language-css">.downarrow:focus {
  outline: 2px solid #48F8;
}</code></pre><p>Idealmente, teríamos um retângulo de destaque para a própria caixa de combo, como isto:</p><pre><code class="language-css">.combobox:focus-within {
  outline: 2px solid #48F;
}</code></pre><p>Isto funciona bem no Chrome. No Firefox, porém, o <code>outline</code> é expandido para além do contorno para englobar toda a caixa de <em>popup</em>, que fica com um aspeto um pouco estranho, especialmente se a caixa de <em>popup </em>não tiver a mesma largura da parte do topo. No Edge, o contorno nem sequer aparece porque o Edge não suporta <code>:focus-within</code> (ver abaixo). Então, o que podemos fazer em vez disso?</p><p>Decidi utilizar isto:</p><pre><code class="language-css">.combobox &gt; *:not(:last-child):focus {
  outline: 2px solid #48F8;
}</code></pre><p>Isso desenha um contorno à volta do elemento filho destacado em vez da própria caixa de combo. Por vezes, no entanto, também fica estranho se o filho não tiver o mesmo tamanho da caixa de combo que o engloba. Por isso, adicionei transparência (<code>#48F8</code> em vez de <code>#48F</code>) para o tornar menos visível, e consequentemente, com um aspeto menos estranho no pior dos casos.</p><h4 id="manter-aberto"><strong>Manter aberto</strong></h4><p>Os estilos que temos para já mantêm a caixa aberta apenas quando algo tem destaque. Por isso, se clicares em texto na área <em>popup</em>, o <em>popup </em>fecha. Para a última versão, expandi a lista de razões para manter o <em>popup </em>aberto para incluir um estilo <code>sticky</code>, que manterá o <em>drop-down</em> aberto ao passar o rato por cima, de modo a que, ao clicar, não feche a caixa.</p><pre><code class="language-css">.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; *:last-child:focus-within,
.dropdown &gt; *:last-child:focus-within,
.combobox &gt; .sticky:last-child:hover,
.dropdown &gt; .sticky:last-child:hover {
  display: block;
  top: 100%;
  opacity: 1;
  transition: 0.15s;
  pointer-events: auto;
}</code></pre><p>Tal como abordei anteriormente, ocorrem erros quando a área do topo de uma caixa de combo tem uma caixa de texto. Para te permitir evitar facilmente este problema, ajustei o CSS existente para que o estilo <code>pointer-events: none</code> <strong><strong>nã</strong>o</strong> seja aplicado quando o elemento <code>.dropdown</code> também tem a classe <code>sticky</code>:</p><pre><code class="language-css">.dropdown:not(.sticky) &gt; *:not(:last-child):focus,
.downarrow:focus,
.dropdown:focus {
  pointer-events: none; /* Faz com que o segundo clique feche */
}</code></pre><p>Por fim, se uma lista <code>.dropdown</code> contém links, existe uma pequena inconveniência. Após clicar num link, a lista não fechará automaticamente porque o link tem o destaque e programamos o <em>drop-down</em> para não fechar quando um descendente tem o destaque.</p><p>Para evitar isso, adicionei suporte para uma nova classe <code>less-sticky</code>. Tal como <code>sticky</code>, <code>less-sticky</code> mantém o <em>popup</em> aberto quando o rato passa por cima. Ao contrário de <code>sticky</code>, <code>less-sticky</code> não mantém o <em>popup </em>aberto quando um descendente tem o destaque.</p><p>Então, a nossa nova lista de seletores está a ficar bastante longa:</p><pre><code class="language-css">.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; .sticky:last-child:hover,
.dropdown &gt; .sticky:last-child:hover,
.combobox &gt; .less-sticky:last-child:hover,
.dropdown &gt; .less-sticky:last-child:hover,
.combobox &gt; *:last-child:focus-within:not(.less-sticky),
.dropdown &gt; *:last-child:focus-within:not(.less-sticky) {
  display: block;
  opacity: 1;
  transition: 0.15s;
  pointer-events: auto;
  top: 100%;
}</code></pre><p>Ainda nem sequer terminamos, porque isto ainda não é compatível com o Edge e com o Internet Explorer.</p><h3 id="casos-do-edge"><strong>Casos do Edge</strong></h3><p>Assim que coloquei a minha caixa de combo a trabalhar perfeitamente no Firefox e no Chrome, fiquei transtornado ao ver que ficava feia e completamente inutilizável no Edge. O que correu mal?</p><p>Em primeiro lugar, os contornos desapareceram porque o Edge e o IE não suportam transparência nos contornos, como em <code>rgb(200,150,100,50)</code> ou <code>#8888</code>. Utilizei <code>#8888</code> para o contorno. Para fazer com que funcione no Edge, alterei-o para <code>#999</code>.</p><p>Outra alternativa é fornecer um contorno não opaco só para o Edge:</p><pre><code class="language-css">border: 1px solid #888;  /* Edge/IE não têm suporte para transparência do contorno */
border: 1px solid #8888; /* Restantes browsers */</code></pre><p>Em segundo lugar, não importa quantas vezes clicas — as <code>div</code> do <em>drop-down</em> simplesmente não abrem!</p><p>Ao resolver este problema, aprendi algo novo — se um <em>browser </em>não compreender um seletor utilizado numa declaração CSS, este <strong>irá ignorar todo o bloco</strong>.</p><p>Por exemplo, se escreveres <code>.x, .y, .z:unknown { margin:1em }</code>, então <code>x</code> e <code>y</code> não vão ter margens simplesmente porque o <em>browser </em>não compreende o <code>unknown</code>.</p><p>Acontece que o Edge não compreende o <code>:focus-within</code>, que é o responsável por permitir que a área do <em>drop-down</em> permaneça aberta quando um elemento <code>input</code> dentro da área <em>drop-down</em> é clicado. O problema foi ter misturado seletores suportados e não suportados.</p><p>De maneira a fazer com que funcione no Edge, precisava de repetir todo o bloco de estilos "como-abrir-a-lista-de-drop-down" separadamente para os seletores que utilizam <code>:focus-within</code>, de modo que esses seletores não impeçam que outros seletores funcionem.</p><p>Depois, como alternativa para a falta de <code>:focus-within</code>, decidi tentar <a href="https://stackoverflow.com/questions/43528940/how-to-detect-ie-and-edge-browsers-in-css" rel="noopener">detetar o Edge</a> (texto em inglês) e manter automaticamente qualquer lista <code>.dropdown</code> aberta quando o rato está a passar por cima, no estado <code>:hover</code>, neste caso. Assim, ainda é possível utilizar um elemento destacado (tal como um <code>a href</code> ou <code>input</code>) dentro da área <em>drop-down</em>, embora desapareça precocemente caso o rato saia de cima.</p><p>O código para tudo isso é o seguinte:</p><pre><code class="language-css">/* Lista de situações para as quais apresentar a lista dropdown. */
.combobox &gt; .downarrow:focus ~ *:last-child,
.dropdown:focus &gt; *:last-child,
.dropdown &gt; *:focus ~ *:last-child,
.combobox &gt; .sticky:last-child:hover,
.dropdown &gt; .sticky:last-child:hover,
.combobox &gt; .less-sticky:last-child:hover,
.dropdown &gt; .less-sticky:last-child:hover,
.combobox &gt; *:last-child:focus:not(.less-sticky),
.dropdown &gt; *:last-child:focus:not(.less-sticky) {
  display: block;
  opacity: 1;
  transition: 0.15s;
  pointer-events: auto;
}

/* focus-within não é suportado pelo Edge/IE. Seletores não suportados fazem com que todo o bloco seja ignorado, por isso temos de repetir todos os estilos de modo separado para o focus-within. */
.combobox &gt; *:last-child:focus-within:not(.less-sticky),
.dropdown &gt; *:last-child:focus-within:not(.less-sticky) {
  display: block;
  opacity: 1;
  transition: 0.15s;
  pointer-events: auto;
}

/* Deteta o Edge/IE e comporta-se como se less-sticky estivesse ativo para todos os dropdowns (caso contrário não é possível clicar nos links) */
@supports (-ms-ime-align:auto) {
  .dropdown &gt; *:last-child:hover {
    display: block;
    opacity: 1;
    pointer-events: auto;
  }
}

/* Deteta o IE e faz a mesma coisa. */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  .dropdown &gt; *:last-child:hover {
    display: block;
    opacity: 1;
    pointer-events: auto;
  }
}</code></pre><p>Em terceiro, o estilo <code>outline</code> não estava a funcionar no Edge. O problema era novamente que o Edge não tem suporte para contornos não opacos.</p><p>A solução é um estilo especial de transparência para o Edge:</p><pre><code class="language-css">outline: 2px solid #8AF; /* Edge/IE não consegue lidar com a transparência do contorno */  
outline: 2px solid #48F8;</code></pre><p>Em quarto, eu tinha colocado duas caixas de combo dentro de um elemento <code>&lt;label&gt;</code>. Tentar abrir a segunda abre sempre a primeira, em vez disso. Acontece que, no Edge, se estiveres a utilizar um rato, podes selecionar apenas o primeiro elemento <code>input</code> dentro de uma <code>label</code>.</p><p>Em quinto, as caixas de <em>drop-down</em> não tinham sombras. Mais uma vez, isto era por ter utilizado uma sombra não opaca. Mais uma vez, o Edge precisava do seu próprio CSS especial:</p><pre><code class="language-css">box-shadow: 1px 2px 4px 1px #666; /* O Edge não consegue lidar com a transparência da sombra */
box-shadow: 1px 2px 4px 1px #4448;</code></pre><p>O Internet Explorer 11 tem praticamente as mesmas limitações. Por isso, corrigir o Edge consertou praticamente o IE, com a exceção de que era necessária uma deteção de <em>browser </em>diferente para o IE em comparação com o Edge.</p><h3 id="sincronizar-o-popup-com-a-rea-superior"><strong>Sincronizar o <em>popup</em> com a área superior</strong></h3><p>Infelizmente, o CSS não pode fazer isso por nós. Por isso, na demonstração final, é utilizado JavaScript para atualizar a parte superior da caixa de combo quando a parte do <em>popup</em> é alterada. Por exemplo, utilizei este código com base em jQuery para atualizar a parte superior do selecionador de cor:</p><pre><code class="language-js">function parentComboBox(el) {
  for (el = el.parentNode; el &amp;&amp; 
    Array.prototype.indexOf.call(el.classList, "combobox") &lt;= -1;)
    el = el.parentNode;
  return el;
}
$(".combobox .color").mousedown(function() {
  var c = this.style.backgroundColor;
  $(parentComboBox(this)).find(".color")[0].
    style.backgroundColor = c;
});</code></pre><h3 id="vers-o-final"><strong>Versão final</strong></h3><p><a href="https://codepen.io/qwertie/pen/QBYMdZ" rel="noopener">Clica aqui</a> para veres uma demonstração com código-fonte no CodePen.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aqui estão mais de 850 cursos da Ivy League que podes fazer agora gratuitamente ]]>
                </title>
                <description>
                    <![CDATA[ > Tradução para o português europeu. As oito universidades da Ivy League [https://pt.wikipedia.org/wiki/Ivy_League]  estão entre as mais prestigiadas do mundo. Estas são Harvard, Yale, Princeton, Columbia, Cornell, Dartmouth, Brown e a Universidade da Pennsylvania. Em 2023, as oito escolas da Ivy League ficaram no top 20 da classificação de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/</link>
                <guid isPermaLink="false">63e60dec1c2d3d0521410b19</guid>
                
                    <category>
                        <![CDATA[ Tecnologia ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Wed, 26 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/collection-ivy-league-moocs-social-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/ivy-league-free-online-courses-a0d7ae675869/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Here Are 850+ Ivy League Courses You Can Take Right Now for Free</a>
      </p><blockquote>Tradução para o português europeu.</blockquote><p>As oito <a href="https://pt.wikipedia.org/wiki/Ivy_League">universidades da Ivy League</a> estão entre as mais prestigiadas do mundo. Estas são Harvard, Yale, Princeton, Columbia, Cornell, Dartmouth, Brown e a Universidade da Pennsylvania.</p><p>Em 2023, as oito escolas da Ivy League ficaram no top 20 da <a href="https://www.usnews.com/best-colleges/rankings/national-universities">classificação de universidades nacionais do U.S. News &amp; World Report</a> (link em inglês). Como podes imaginar, estas instituições são altamente seletivas e é muito difícil de ingressar nelas.</p><p>A boa notícia é que estas oferecem cursos online gratuitos. Neste artigo, utilizei a base de dados do <a href="https://www.classcentral.com/">Class Central</a> para compilar estes cursos para ti. No total, as escolas da Ivy League oferecem atualmente mais de 850 cursos, que, combinados, contam com 40 milhões de inscrições.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/cc-homepage-new-year-2022-2023-final-2-1.png" class="kg-image" alt="cc-homepage-new-year-2022-2023-final-2-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/cc-homepage-new-year-2022-2023-final-2-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/cc-homepage-new-year-2022-2023-final-2-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/cc-homepage-new-year-2022-2023-final-2-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/cc-homepage-new-year-2022-2023-final-2-1.png 1726w" sizes="(min-width: 720px) 720px" width="1726" height="996" loading="lazy"><figcaption>A base de dados do <a href="https://www.classcentral.com/">Class Central</a> tem mais de 100 mil cursos online.</figcaption></figure><p>Na semana passada, partilhei uma lista de <a href="https://www.freecodecamp.org/news/free-certificates/">certificados gratuitos de programação</a> (link em inglês). Acontece que uma das universidades da Ivy League também criou essa lista – a universidade de Harvard, que oferece certificados gratuitos em Ciências da Computação, Python, Inteligência Artificial... podes encontrar todos os detalhes aqui: <a href="https://www.freecodecamp.org/news/free-certificates/">1000+ Free Developer Certifications</a><strong> </strong>(link em inglês).</p><p>Para tornar a compilação abaixo um pouco mais fácil de navegar, dividi-a de acordo com o tema do curso. Podes clicar num tema e saltar diretamente para os cursos correspondentes:</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#ci-ncias-da-computa-o-50-">Ciências da Computação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#programa-o-22-">Programação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#ci-ncias-da-informa-o-23-">Ciências da Informação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#matem-tica-17-">Matemática</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#engenharia-20-">Engenharia</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#humanidades-97-">Humanidades</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#neg-cios-90-">Negócios</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#ci-ncia-49-">Ciência</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#arte-e-design-18-">Arte e Design</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#ci-ncias-sociais-86-">Ciências Sociais</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#sa-de-e-medicina-353-">Saúde e Medicina</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#educa-o-e-ensino-23-">Educação e Ensino</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aqui-estao-mais-de-850-cursos-da-ivy-league-que-podes-fazer-agora-gratuitamente/#desenvolvimento-pessoal-16-">Desenvolvimento Pessoal</a></li></ul><p>Também configurei uma <a href="https://www.classcentral.com/collection/ivy-league-moocs">coleção no Class Central para cursos online da Ivy League</a> (link em inglês). Essa coleção é atualizada automaticamente à medida que são lançados novos cursos. Se gostarias de receber notificações sobre novos cursos da Ivy League, podes "seguir" a coleção.</p><p>Observa que compreender como examinar gratuitamente um curso em plataformas como o Coursera pode ser um pouco confuso. Por isso, eu e meu colega <a href="https://www.classcentral.com/@pat">Pat</a> escrevemos um guia dedicado ao assunto: <a href="https://www.classcentral.com/report/coursera-signup-for-free/">Como fazer a inscrição em cursos do Coursera de modo gratuito</a> (link em inglês).</p><p>Sem mais demoras, aqui estão todos os cursos online gratuitos oferecidos pelas instituições da Ivy League.</p><h2 id="ci-ncias-da-computa-o-50-"><strong>Ciências da Computação (50)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-computer-science-442?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Introduction to Computer Science</a>, da <em>Universidade de</em> <em><em>Harvard</em> </em> ★★★★★(142)</li><li><a href="https://www.classcentral.com/course/algs4partI-339?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Algorithms, Part I</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(59)</li><li><a href="https://www.classcentral.com/course/algs4partII-340?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Algorithms, Part II</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(21)</li><li><a href="https://www.classcentral.com/course/bitcointech-3655?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Bitcoin and Cryptocurrency Technologies</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(20)</li><li><a href="https://www.classcentral.com/course/edx-machine-learning-for-data-science-and-analytics-4912?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Machine Learning for Data Science and Analytics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-cs50-s-computer-science-for-business-professionals-10143?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Computer Science for Business Professionals</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(14)</li><li><a href="https://www.classcentral.com/course/freecodecamp-harvard-cs50-full-computer-science-university-course-119762?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Harvard CS50 – Full Computer Science University Course</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(14)</li><li><a href="https://www.classcentral.com/course/edx-artificial-intelligence-ai-7230?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Artificial Intelligence (AI)</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/edx-machine-learning-7231?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Machine Learning</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-artificial-intelligence-with-python-18122?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Introduction to Artificial Intelligence with Python</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(11)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-understanding-technology-10142?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Understanding Technology</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(10)</li><li><a href="https://www.classcentral.com/course/udacity-reinforcement-learning-1849?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Reinforcement Learning</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/edx-enabling-technologies-for-data-science-and-analytics-the-internet-of-things-4911?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Enabling Technologies for Data Science and Analytics: The Internet of Things</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/comparch-342?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Computer Architecture</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/aofa-921?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Analysis of Algorithms</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/udacity-machine-learning-1020?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Machine Learning</a>, do <em>Instituto de Tecnologia da</em> <em><em>Geórgia</em></em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-computer-science-for-lawyers-16857?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Computer Science for Lawyers</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/robotics-perception-5033?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Perception</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/udacity-machine-learning-unsupervised-learning-1848?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Machine Learning: Unsupervised Learning</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/edx-c-programming-modular-programming-and-memory-management-11666?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Modular Programming and Memory Management</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/youtube-advanced-algorithms-compsci-224-48051?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Advanced Algorithms (COMPSCI 224)</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/hi-five-admin-it-8099?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">HI-FIVE: Health Informatics For Innovation, Value &amp; Enrichment (Administrative/IT Perspective)</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-c-programming-pointers-and-memory-management-11533?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Pointers and Memory Management</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-c-programming-language-foundations-11535?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Language Foundations</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-linux-basics-the-command-line-interface-11537?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Linux Basics: The Command Line Interface</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-c-programming-using-linux-tools-and-libraries-11538?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Using Linux Tools and Libraries</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-ap-computer-science-principles-7017?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's AP® Computer Science Principles</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/hi-five-clinical-7456?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">HI-FIVE: Health Informatics For Innovation, Value &amp; Enrichment (Clinical Perspective)</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/cs-programming-java-13151?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Computer Science: Programming with a Purpose</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-fundamentals-of-tinyml-21641?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of TinyML</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-applications-of-tinyml-21642?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Applications of TinyML</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-deploying-tinyml-21643?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Deploying TinyML</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/mlops-for-scaling-tinyml-66338?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">MLOps for Scaling TinyML</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/wharton-ai-applications-marketing-finance-56580?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AI Applications in Marketing and Finance</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-ai-strategy-governance-56561?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AI Strategy and Governance</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-ai-fundamentals-non-data-scientists-56564?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AI Fundamentals for Non-Data Scientists</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-ai-applications-people-management-56565?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AI Applications in People Management</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-robotics-vision-intelligence-and-machine-learning-8203?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Vision Intelligence and Machine Learning</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-data-structures-and-software-design-8517?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Structures and Software Design</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-algorithm-design-and-analysis-8520?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Algorithm Design and Analysis</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/perception-54375?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Visual Perception</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/3d-reconstruction---multiple-viewpoints-54376?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">3D Reconstruction - Multiple Viewpoints</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/cameraandimaging-54611?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Camera and Imaging</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/features-and-boundaries-54633?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Features and Boundaries</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/3d-reconstruction---single-viewpoint-54634?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">3D Reconstruction - Single Viewpoint</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/computerscience2-10671?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Computer Science: Algorithms, Theory, and Machines</a>, da <em>Universidade de</em> <em><em>Princeton</em></em></li><li><a href="https://www.classcentral.com/course/algorithms-part1-ru-39397?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Алгоритмы, часть I</a>, da <em>Universidade de</em> <em><em>Princeton</em> (em russo)</em></li><li><a href="https://www.classcentral.com/course/edx-c-programming-getting-started-11534?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Getting Started</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/edx-c-programming-advanced-data-types-11536?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Advanced Data Types</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/linux-basics-the-command-line-interface-92031?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Linux Basics: The Command Line Interface - 6</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="programa-o-22-"><strong>Programação (22)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-cs50-s-web-programming-with-python-and-javascript-11506?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Web Programming with Python and JavaScript</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(22)</li><li><a href="https://www.classcentral.com/course/edx-using-python-for-research-7204?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Using Python for Research</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/freecodecamp-database-systems-cornell-university-course-sql-nosql-large-scale-data-analysis-57068?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Database Systems - Cornell University Course (SQL, NoSQL, Large-Scale Data Analysis)</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(9)</li><li><a href="https://www.classcentral.com/course/edx-programming-for-the-web-with-javascript-8518?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Programming for the Web with JavaScript</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-the-computing-technology-inside-your-smartphone-2809?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Computing Technology Inside Your Smartphone</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/cs50s-introduction-to-programming-with-python-58275?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Introduction to Programming with Python</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-game-development-11504?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Introduction to Game Development</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/cs50s-introduction-to-programming-with-scratch-39309?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Introduction to Programming with Scratch</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-software-development-fundamentals-8516?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Software Development Fundamentals</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-cs50-s-mobile-app-development-with-react-native-11505?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CS50's Mobile App Development with React Native</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-quantitative-methods-for-biology-17849?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Quantitative Methods for Biology</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/java-inheritance-data-structures-22537?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Inheritance and Data Structures in Java</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/java-object-oriented-programming-22535?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Java and Object-Oriented Programming</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/python-programming-intro-22536?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Python Programming</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/independent-haskell-lecture-notes-and-assignments-110550?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Haskell: Lecture notes and assignments</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/c-programming-modular-programming-and-memory-mana-86353?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Modular Programming and Memory Management - 3</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/c-programming-pointers-and-memory-management-89678?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Pointers and Memory Management - 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/c-programming-getting-started-86352?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Getting Started - 1</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/c-programming-language-foundations-86354?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Language Foundations - 2</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/independent-csci-1730-introduction-to-programming-languages-458?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CSCI 1730 - Introduction to Programming Languages</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/c-programming-using-linux-tools-and-libraries-92030?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Using Linux Tools and Libraries - 7</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/c-programming-advanced-data-types-92032?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">C Programming: Advanced Data Types - 5</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="ci-ncias-da-informa-o-23-"><strong>Ciências da Informação (23)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-statistics-and-r-2960?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Statistics and R</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(20)</li><li><a href="https://www.classcentral.com/course/edx-statistical-thinking-for-data-science-and-analytics-4913?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Statistical Thinking for Data Science and Analytics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/youtube-fundamentals-of-qualitative-research-methods-64206?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Qualitative Research Methods</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(12)</li><li><a href="https://www.classcentral.com/course/edx-data-science-r-basics-9253?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: R Basics</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(11)</li><li><a href="https://www.classcentral.com/course/wharton-people-analytics-4264?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">People Analytics</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/youtube-algorithms-for-big-data-compsci-229r-48050?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Algorithms for Big Data (COMPSCI 229r)</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-data-science-visualization-10347?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Visualization</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-causal-diagrams-draw-your-assumptions-before-your-conclusions-9097?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Causal Diagrams: Draw Your Assumptions Before Your Conclusions</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/edx-data-science-machine-learning-10353?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Machine Learning</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-high-dimensional-data-analysis-2949?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">High-Dimensional Data Analysis</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-data-science-wrangling-10351?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Wrangling</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/youtube-stat115-2020-97494?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">STAT115 2020</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-data-science-productivity-tools-10350?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Productivity Tools</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-data-science-inference-and-modeling-10349?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Inference and Modeling</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-big-data-and-education-968?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Big Data and Education</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/big-data-solutions-for-social-and-economic-dispar-120494?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">[New] Big Data Solutions for Social and Economic Disparities</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/youtube-stat115-2018-97492?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">STAT115 2018</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/youtube-stat115-2019-97493?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">STAT115 2019</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/introduction-to-data-science-with-python-110417?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Data Science with Python</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-principles-statistical-and-computational-tools-for-reproducible-data-science-9489?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Principles, Statistical and Computational Tools for Reproducible Data Science</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-data-science-capstone-10354?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Capstone</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/data-analysis-python-22538?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Analysis Using Python</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-data-models-and-decisions-in-business-analytics-8218?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data, Models and Decisions in Business Analytics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li></ul><h2 id="matem-tica-17-"><strong>Matemática (17)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-introduction-to-linear-models-and-matrix-algebra-2963?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Linear Models and Matrix Algebra</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/single-variable-calculus-5066?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calculus: Single Variable Part 1 - Functions</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/edx-fat-chance-probability-from-the-ground-up-10159?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fat Chance: Probability from the Ground Up</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/differentiation-calculus-5068?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calculus: Single Variable Part 2 - Differentiation</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-statistical-inference-and-modeling-for-high-throughput-experiments-2967?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Statistical Inference and Modeling for High-throughput Experiments</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/integration-calculus-5069?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calculus: Single Variable Part 3 - Integration</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/edx-data-science-linear-regression-10352?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Data Science: Linear Regression</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/applications-calculus-5070?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calculus: Single Variable Part 4 - Applications</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/ac-922?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Analytic Combinatorics</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-calculus-applied-8778?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calculus Applied!</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-probability-11423?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Probability</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/crash-course-in-causality-8425?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">A Crash Course in Causality: Inferring Causal Effects from Observational Data</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/youtube-statistics-110-probability-91487?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Statistics 110: Probability</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/discrete-calculus-5067?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Single Variable Calculus</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/causal-inference-12136?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Causal Inference</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/causal-inference-2-13095?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Causal Inference 2</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/youtube-nonlinear-dynamics-and-chaos-steven-strogatz-cornell-university-53089?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nonlinear Dynamics and Chaos</a>, da <em>Universidade de</em> <em><em>Cornell</em></em></li></ul><h2 id="engenharia-20-"><strong>Engenharia (20)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-the-art-of-structural-engineering-vaults-12040?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Art of Structural Engineering: Vaults</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(23)</li><li><a href="https://www.classcentral.com/course/robotics-flight-5025?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Aerial Robotics</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(10)</li><li><a href="https://www.classcentral.com/course/edx-the-art-of-structural-engineering-bridges-4561?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Art of Structural Engineering: Bridges</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/edx-energy-within-environmental-constraints-6021?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Energy Within Environmental Constraints</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/robotics-computation-5029?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Computational Motion Planning</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/robotics-mobility-5032?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Mobility</a> da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-robotics-kinematics-and-mathematical-foundations-8197?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Kinematics and Mathematical Foundations</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-robotics-7241?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-a-hands-on-introduction-to-engineering-simulations-5850?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">A Hands-on Introduction to Engineering Simulations</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-the-engineering-of-structures-around-us-3208?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Engineering of Structures Around Us</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/robotics-estimation-and-learning-5030?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Estimation and Learning</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/mosfet-547?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">MOS Transistors</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/exploring-renewable-energy-17025?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Exploring Renewable Energy Schemes</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-robotics-dynamics-and-control-8196?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Dynamics and Control</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-robotics-locomotion-engineering-8204?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Locomotion Engineering</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/robotics-capstone-5129?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Robotics: Capstone</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-introduction-to-engineering-and-design-12329?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Engineering and Design</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/energy-justice-58339?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Energy Justice: Fostering More Equitable Energy Futures</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/engineering-of-structures-compression-104058?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Engineering of Structures: Compression</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/engineering-of-structures-shear-and-bending-104059?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Engineering of Structures: Shear and Bending</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="humanidades-97-"><strong>Humanidades (97)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-hope-human-odyssey-to-political-existentialism-11584?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">HOPE: Human Odyssey to Political Existentialism</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(273)</li><li><a href="https://www.classcentral.com/course/modpo-356?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Modern &amp; Contemporary American Poetry ("ModPo")</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(189)</li><li><a href="https://www.classcentral.com/course/moralities-911?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Moralities of Everyday Life</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(42)</li><li><a href="https://www.classcentral.com/course/careerdevelopment-6011?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">English for Career Development</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(24)</li><li><a href="https://www.classcentral.com/course/mythology-353?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Greek and Roman Mythology</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(21)</li><li><a href="https://www.classcentral.com/course/journalism-6009?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">English for Journalism</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(15)</li><li><a href="https://www.classcentral.com/course/edx-science-cooking-from-haute-cuisine-to-soft-matter-science-chemistry-811?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Science &amp; Cooking: From Haute Cuisine to Soft Matter Science (chemistry)</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(14)</li><li><a href="https://www.classcentral.com/course/stem-6538?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">English for Science, Technology, Engineering, and Mathematics</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(12)</li><li><a href="https://www.classcentral.com/course/plato-5237?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ancient Philosophy: Plato &amp; His Predecessors</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(12)</li><li><a href="https://www.classcentral.com/course/edx-china-s-political-and-intellectual-foundations-from-sage-kings-to-confucius-941?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">China’s Political and Intellectual Foundations: From Sage Kings to Confucius</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(11)</li><li><a href="https://www.classcentral.com/course/effectivealtruism-3446?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Effective Altruism</a> da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(11)</li><li><a href="https://www.classcentral.com/course/edx-visualizing-japan-1850s-1930s-westernization-protest-modernity-2159?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Visualizing Japan (1850s-1930s): Westernization, Protest, Modernity</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(10)</li><li><a href="https://www.classcentral.com/course/edx-religious-literacy-traditions-and-scriptures-5844?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Religious Literacy: Traditions and Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(9)</li><li><a href="https://www.classcentral.com/course/edx-religion-conflict-and-peace-9452?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Religion, Conflict and Peace</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(9)</li><li><a href="https://www.classcentral.com/course/aristotle-5238?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ancient Philosophy: Aristotle and His Successors</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(9)</li><li><a href="https://www.classcentral.com/course/edx-modern-china-s-foundations-the-manchus-and-the-qing-1986?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Modern China’s Foundations: The Manchus and the Qing</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/edx-creating-modern-china-the-republican-period-to-the-present-2468?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Creating Modern China: The Republican Period to the Present</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-christianity-through-its-scriptures-5858?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Christianity Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/business-6010?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">English for Business and Entrepreneurship</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-the-civil-war-and-reconstruction-1865-1890-the-unfinished-revolution-2439?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Civil War and Reconstruction – 1865-1890: The Unfinished Revolution</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-literati-china-examinations-neo-confucianism-and-later-imperial-china-1845?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Literati China: Examinations, Neo-Confucianism, and Later Imperial China</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-china-s-first-empires-and-the-rise-of-buddhism-1617?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">China’s First Empires and the Rise of Buddhism</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/youtube-covering-immigration-a-resource-for-journalists-91507?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Covering Immigration: A Resource for Journalists</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-masterpieces-of-world-literature-6844?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Masterpieces of World Literature</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-buddhism-through-its-scriptures-5857?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Buddhism Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/introancientegypt-7326?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Ancient Egypt and Its Civilization</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/edx-the-civil-war-and-reconstruction-1861-1865-a-new-birth-of-freedom-2297?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Civil War and Reconstruction - 1861 - 1865: A New Birth of Freedom</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-shakespeare-s-hamlet-the-ghost-7016?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Shakespeare's Hamlet: The Ghost</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-invasions-rebellions-and-the-fall-of-imperial-china-2467?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Invasions, Rebellions, and the Fall of Imperial China</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-china-and-communism-2469?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">China and Communism</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/wondersancientegypt-9577?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wonders of Ancient Egypt</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-the-civil-war-and-reconstruction-1850-1861-a-house-divided-2172?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Civil War and Reconstruction - 1850-1861: A House Divided</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-cosmopolitan-tang-aristocratic-culture-in-china-1773?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Cosmopolitan Tang: Aristocratic Culture in China</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-global-china-from-the-mongols-to-the-ming-1988?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global China: From the Mongols to the Ming</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-contemporary-china-the-people-s-republic-taiwan-and-hong-kong-2470?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Contemporary China: The People's Republic, Taiwan, and Hong Kong</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/journey-unfolding-life-6947?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Journey of the Universe: The Unfolding of Life</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/edx-global-history-lab-2371?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global History Lab</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/edx-hinduism-through-its-scriptures-5819?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Hinduism Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/youtube-introduction-to-ancient-greek-history-with-donald-kagan-53043?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Ancient Greek History</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/western-christianity-200-1650-8106?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">A Journey through Western Christianity: from Persecuted Faith to Global Religion (200 - 1650)</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-question-reality-science-philosophy-and-the-search-for-meaning-6851?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Question Reality! Science, philosophy, and the search for meaning</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-shakespeare-s-othello-the-moor-11951?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Shakespeare’s Othello: The Moor</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-islam-through-its-scriptures-5818?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Islam Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-bioethics-the-law-medicine-and-ethics-of-reproductive-technologies-and-genetics-6649?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Bioethics: The Law, Medicine, and Ethics of Reproductive Technologies and Genetics</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-the-ancient-greek-hero-609?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Ancient Greek Hero</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-the-history-of-medieval-medicine-through-jewish-manuscripts-6301?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The History of Medieval Medicine Through Jewish Manuscripts</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/youtube-introduction-to-the-old-testament-with-christine-hayes-53024?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to the Old Testament</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-women-have-always-worked-the-u-s-experience-1700-1920-8110?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Women Have Always Worked: The U.S. Experience 1700 - 1920</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-power-and-responsibility-doing-philosophy-with-superheroes-9708?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Power and Responsibility: Doing Philosophy with Superheroes</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-poetry-in-america-the-civil-war-and-its-aftermath-3355?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Poetry in America: The Civil War and Its Aftermath</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-poetry-in-america-modernism-5346?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Poetry in America: Modernism</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-predictionx-lost-without-longitude-11693?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">PredictionX: Lost Without Longitude</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-ancient-masterpieces-of-world-literature-9423?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ancient Masterpieces of World Literature</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-science-cooking-from-haute-cuisine-to-soft-matter-science-physics-8383?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Science &amp; Cooking: From Haute Cuisine to Soft Matter Science (physics)</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-shakespeare-s-life-and-work-15184?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Shakespeare's Life and Work</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-shakespeare-s-the-merchant-of-venice-shylock-8536?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Shakespeare's The Merchant of Venice: Shylock</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-digital-humanities-13557?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Digital Humanities</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-judaism-through-its-scriptures-5820?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Judaism Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-poetry-in-america-whitman-940?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Poetry in America: Whitman</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/youtube-learn-ancient-greek-with-prof-leonard-muellner-53386?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Learn Ancient Greek</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-japanese-books-from-manuscript-to-print-19157?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Japanese Books: From Manuscript to Print</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-the-path-to-happiness-what-chinese-philosophy-teaches-us-about-the-good-life-20046?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Path to Happiness: What Chinese Philosophy Teaches us about the Good Life</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-the-tabernacle-in-word-image-an-italian-jewish-manuscript-revealed-11462?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Tabernacle in Word &amp; Image: An Italian Jewish Manuscript Revealed</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-seeking-women-s-rights-colonial-period-to-the-civil-war-13127?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Seeking Women’s Rights: Colonial Period to the Civil War</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-wage-work-for-women-citizens-1870-1920-13128?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wage Work for Women Citizens: 1870-1920</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-indian-tibetan-river-of-buddhism-13686?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Indian &amp; Tibetan River of Buddhism</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-john-milton-paradise-lost-11575?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">John Milton: Paradise Lost</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/fermentation-cooking-with-microbes-32763?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Food Fermentation: The Science of Cooking with Microbes</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-poetry-in-america-whitman-2816?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Poetry in America: Whitman</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-china-s-political-and-intellectual-foundations-from-sage-kings-to-confucius-13152?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">China’s Political and Intellectual Foundations: From Sage Kings to Confucius</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-women-making-history-ten-objects-many-stories-12269?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Women Making History: Ten Objects, Many Stories</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-modern-masterpieces-of-world-literature-9424?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Modern Masterpieces of World Literature</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-china-humanities-the-individual-in-chinese-culture-9256?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">China Humanities: The Individual in Chinese Culture</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-sikhism-through-its-scriptures-11388?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Sikhism Through Its Scriptures</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/digital-humanities-in-practice-from-research-ques-108432?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Digital Humanities in Practice: From Research Questions to Results</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/the-jewish-bible-120115?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Jewish Bible: Its History As A Physical Artifact</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-chinax-book-club-five-authors-five-books-five-views-of-china-19466?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ChinaX Book Club: Five Authors, Five Books, Five Views of China</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-changing-minds-geographic-discoveries-and-new-worlds-through-the-eyes-of-a-renaissance-jewish-scholar-21211?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Changing Minds: Geographic Discoveries and New Worlds through the Eyes of a Renaissance Jewish Scholar</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/in-the-margins-of-a-medieval-jewish-prayer-book-w-53017?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">In the Margins of a Medieval Jewish Prayer Book: What Can Physical Manuscripts Tell Us about History?</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/benjamin-franklin-and-his-world-120108?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Benjamin Franklin and His World</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/indigenous-religions-ecology-58916?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Indigenous Religions &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/east-asian-religions-ecology-58917?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">East Asian Religions &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/south-asian-religions-ecology-58918?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">South Asian Religions &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/western-religions-ecology-58920?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Western Religions &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/intro-religions-ecology-58921?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Religions &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/christianity-ecology-58919?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Christianity &amp; Ecology</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/youtube-death-with-shelly-kagan-53041?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Death with Shelly Kagan</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/youtube-the-civil-war-and-reconstruction-with-david-blight-53046?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Civil War and Reconstruction</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/edx-women-have-always-worked-the-u-s-experience-1920-2016-8523?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Women Have Always Worked: The U.S. Experience 1920 - 2016</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-negotiating-a-changing-world-1920-1950-13129?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Negotiating a Changing World: 1920-1950</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-fighting-for-equality-1950-2018-13130?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fighting for Equality: 1950–2018</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/columbia-celebrating-food-culture-cultural-adaptations-of-the-mediterranean-diet-110323?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">[New] Celebrating Food Culture: Cultural Adaptations of the Mediterranean Diet</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-writing-case-studies-science-of-delivery-4908?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Writing Case Studies: Science of Delivery</a>, da <em>Universidade de</em> <em><em>Princeton</em></em></li><li><a href="https://www.classcentral.com/course/edx-the-ethics-of-memory-8538?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Ethics of Memory</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/edx-fantastic-places-unhuman-humans-exploring-humanity-through-literature-10255?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fantastic Places, Unhuman Humans: Exploring Humanity Through Literature</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/edx-libertarian-free-will-neuroscientific-and-philosophical-evidence-12605?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Libertarian Free Will: Neuroscientific and Philosophical Evidence</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/question-reality-mind-119993?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Question Reality: Mind</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="neg-cios-90-"><strong>Negócios (90)</strong></h2><ul><li><a href="https://www.classcentral.com/course/whartonmarketing-1137?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Marketing</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(72)</li><li><a href="https://www.classcentral.com/course/whartonaccounting-769?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Financial Accounting</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(66)</li><li><a href="https://www.classcentral.com/course/financialmarkets-912?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Financial Markets</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(36)</li><li><a href="https://www.classcentral.com/course/whartonoperations-372?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Operations Management</a>, da <em>Escola de</em> <em><em>Wharton </em></em>da <em>Universidade da Pensilvânia</em> ★★★★☆(33)</li><li><a href="https://www.classcentral.com/course/wharton-contagious-viral-marketing-5034?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Viral Marketing and How to Craft Contagious Content</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(28)</li><li><a href="https://www.classcentral.com/course/whartonfinance-625?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Corporate Finance</a>, da <em>Escola de</em> <em><em>Wharton </em></em>da <em>Universidade da Pensilvânia</em> ★★★★☆(20)</li><li><a href="https://www.classcentral.com/course/wharton-customer-analytics-4353?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Customer Analytics</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/global-financial-crisis-4893?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Global Financial Crisis</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(11)</li><li><a href="https://www.classcentral.com/course/edx-entrepreneurship-in-emerging-economies-2104?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entrepreneurship in Emerging Economies</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(10)</li><li><a href="https://www.classcentral.com/course/wharton-launching-startup-5468?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entrepreneurship 2: Launching your Start-Up</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(10)</li><li><a href="https://www.classcentral.com/course/edx-improving-your-business-through-a-culture-of-health-11363?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving Your Business Through a Culture of Health</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(9)</li><li><a href="https://www.classcentral.com/course/accounting-analytics-4166?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Accounting Analytics</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(8)</li><li><a href="https://www.classcentral.com/course/wharton-entrepreneurship-opportunity-5467?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entrepreneurship 1: Developing the Opportunity</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/whartonfinancees-4688?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introducción a las Finanzas Corporativas</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/wharton-entrepreneurship-financing-profi-5476?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entrepreneurship 4: Financing and Profitability</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/wharton-operations-analytics-4204?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Operations Analytics</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/wharton-introduction-spreadsheets-models-5451?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Spreadsheets and Models</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/social-impact-2136?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social Impact Strategy: Tools for Entrepreneurs and Innovators</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/wharton-decision-making-scenarios-5481?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Decision-Making and Scenarios</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/wharton-quantitative-modeling-fundamenta-5448?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Quantitative Modeling</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/artsculturestrategy-2678?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Arts and Culture Strategy</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/accountingmore-3539?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">More Introduction to Financial Accounting</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/growth-strategy-5466?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entrepreneurship 3: Growth Strategies</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/edx-corporate-social-responsibility-csr-a-strategic-approach-9510?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Corporate Social Responsibility (CSR): A Strategic Approach</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-analytics-in-python-8210?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Analytics in Python</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/what-is-corruption-anti-corruption-compl-13458?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">What is Corruption: Anti-Corruption and Compliance</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/wharton-capstone-4002?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wharton Business Foundations Capstone</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/creating-public-value-56463?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leadership: Creating Public Value</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/whartonmarketinges-4685?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introducción al Marketing</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2) (em espanhol)</li><li><a href="https://www.classcentral.com/course/whartonaccountinges-4686?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introducción a la Contabilidad Financiera</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2) (em espanhol)</li><li><a href="https://www.classcentral.com/course/wharton-crowdfunding-9664?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Crowdfunding</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/leading-the-life-you-want-8228?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leading the Life You Want</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-exercising-leadership-foundational-principles-20796?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Exercising Leadership: Foundational Principles</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-technology-entrepreneurship-lab-to-market-13334?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Technology Entrepreneurship: Lab to Market</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/wharton-managing-human-capital-retail-48075?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Managing Human Capital in Retail</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/wharton-global-trends-business-9800?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global Trends for Business and Society</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/high-performing-teams-7121?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Building High-Performing Teams</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/wharton-retail-supply-chain-48076?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Retail Digital Supply Chain</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/whartonmarketingzh-3900?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">市场营销概论 (中文版)</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/esg-risks-opportunities-58758?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ESG Risks and Opportunities</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/financial-markets-global-pt-32714?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Mercados financeiros</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1) (em português)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-corporate-finance-9060?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Corporate Finance</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-strategic-management-capstone-15197?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Strategic Management Capstone</a>, da <em>Escola de</em> <em><em>Wharton </em></em>da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/why-smart-executives-fail-71216?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Why Smart Executives Fail: Common Mistakes &amp; Warning Signs</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-omnichannel-strategy-and-management-8519?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Omnichannel Strategy and Management</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-retail-fundamentals-8513?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Retail Fundamentals</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/wharton-risk-models-5546?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Modeling Risk and Realities</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-business-financial-modeling-caps-5547?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wharton Business and Financial Modeling Capstone</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/team-culture-7122?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Power of Team Culture</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/team-building-capstone-7126?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Culture-Driven Team Building Capstone</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-retail-marketing-strategy-48077?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Retail Marketing Strategy</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/whartonoperationses-4687?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introducción a la Gestión de Operaciones</a>, da <em>Universidade da Pensilvânia</em> (em espanhol)</li><li><a href="https://www.classcentral.com/course/whartonoperationszh-3901?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">运营管理概论（中文版)</a>, da <em>Universidade da Pensilvânia</em> (em chinês)</li><li><a href="https://www.classcentral.com/course/whartonaccountingzh-3902?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">财务会计概论（中文版</a><a href="https://www.classcentral.com/course/whartonoperationszh-3901?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">)</a>, da <em>Universidade da Pensilvânia</em> (em chinês)</li><li><a href="https://www.classcentral.com/course/whartonfinancezh-3903?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">企业金融概论（中文版</a><a href="https://www.classcentral.com/course/whartonoperationszh-3901?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">)</a>, da <em>Universidade da Pensilvânia</em> (em chinês)</li><li><a href="https://www.classcentral.com/course/finance-fundamentals-20026?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Finance</a>, da <em>Universidade da Pensilvânia</em> (em chinês)</li><li><a href="https://www.classcentral.com/course/employment-law-the-gig-economy-119622?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Employment Law: The Gig Economy</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-managing-human-capital-6887?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Managing Social and Human Capital</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-shangwu-jichu-xiangmu-5002?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">沃顿商务基础毕业项目 (中文版)</a>, da <em>Universidade da Pensilvânia</em> (em chinês)</li><li><a href="https://www.classcentral.com/course/wharton-entrepreneurship-capstone-5607?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wharton Entrepreneurship Capstone</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-proyecto-final-empresariales-4738?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Proyecto de Fundamentos Empresariales de Wharton</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/continuous-learning-culture-7120?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Creating a Team Culture of Continuous Learning</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/management-fundamentals-healthcare-admin-10801?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Management Fundamentals</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/esg-social-activism-59396?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ESG and Social Activism</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/esg-impact-investor-perspective-59397?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ESG Impact: Investor Perspective</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/esg-and-climate-change-59398?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ESG and Climate Change</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/employment-contracts-65161?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Employment Contracts</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/what-is-compliance-13460?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">What is Compliance?</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/effective-compliance-programs-13461?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Effective Compliance Programs</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-capstone-analytics-5093?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Business Analytics Capstone</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/financial-markets-global-es-32713?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Mercados financieros</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/financial-markets-global-ru-32715?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Финансовые рынки</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em russo)</li><li><a href="https://www.classcentral.com/course/financial-markets-global-fr-32716?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Marchés financiers</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em francês)</li><li><a href="https://www.classcentral.com/course/financial-markets-global-ar-32717?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">الأسواق المالية</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em árabe)</li><li><a href="https://www.classcentral.com/course/connected-leadership-121051?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">[New] Connected Leadership</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/edx-demand-and-supply-analytics-8206?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Demand and Supply Analytics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-marketing-analytics-8214?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Marketing Analytics</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-free-cash-flow-analysis-9061?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Free Cash Flow Analysis</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/financial-engineering-advancedtopics-53149?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Advanced Topics in Derivative Pricing</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/financial-engineering-termstructure-53150?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Term-Structure and Credit Derivatives, </a>da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/financial-engineering-intro-53151?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Financial Engineering and Risk Management</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/financial-engineering-optimizationmethods-53152?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Optimization Methods in Asset Management</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/financial-engineering-computationalmethods-53153?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Computational Methods in Pricing and Model Calibration</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-business-strategy-from-wharton-competitive-advantage-6829?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Business Strategy from Wharton: Competitive Advantage</a>, da <em>Escola de</em> <em><em>Wharton </em></em>da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-introduction-to-connected-strategy-15196?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Connected Strategy</a>, da <em>Escola de</em> <em><em>Wharton </em></em>da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-developing-breakthrough-innovations-with-the-three-box-solution-11328?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Developing Breakthrough Innovations with the Three Box Solution</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/edx-executing-breakthrough-innovations-with-the-three-box-solution-11329?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Executing Breakthrough Innovations with the Three Box Solution</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/lessons-on-wisdom-74264?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Lessons on Wisdom: Personal Leadership for Your Life</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/decision-making-art-and-science-74265?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Decision-Making: Blending Art &amp; Science</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/superbosses-74266?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Superbosses: Managing Talent &amp; Leadership</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="ci-ncia-49-"><strong>Ciência (49)</strong></h2><ul><li><a href="https://www.classcentral.com/course/canvas-network-best-practices-for-biomedical-research-data-management-he-10172?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Best Practices for Biomedical Research Data Management (HE)</a>, da <em>Faculdade de Medicina de</em> <em><em>Harvard</em></em> ★★★★★(63)</li><li><a href="https://www.classcentral.com/course/edx-fundamentals-of-neuroscience-part-1-the-electrical-properties-of-the-neuron-942?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Neuroscience, Part 1: The Electrical Properties of the Neuron</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(20)</li><li><a href="https://www.classcentral.com/course/edx-principles-of-biochemistry-3462?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Principles of Biochemistry</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(12)</li><li><a href="https://www.classcentral.com/course/edx-fundamentals-of-neuroscience-part-2-neurons-and-networks-2430?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Neuroscience, Part 2: Neurons and Networks</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/edx-fundamentals-of-neuroscience-part-3-the-brain-3927?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Neuroscience, Part 3: The Brain</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-the-health-effects-of-climate-change-12106?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Health Effects of Climate Change</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/world-science-u-space-time-and-einstein-3407?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Space, Time and Einstein</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-super-earths-and-life-1874?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Super-Earths and Life</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/edx-sharks-5865?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Sharks!</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/construction-cost-estimating-7106?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Construction Cost Estimating and Cost Control</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/world-science-u-special-relativity-3406?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Special Relativity</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/world-science-u-from-chemistry-to-life-5213?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">From Chemistry to Life</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-cell-biology-mitochondria-6022?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Cell Biology: Mitochondria</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-backyard-meteorology-the-science-of-weather-12108?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Backyard Meteorology: The Science of Weather</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/construction-project-management-7105?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Construction Project Management</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/otherearths-1271?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Imagining Other Earths</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/edx-the-climate-energy-challenge-9626?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Climate-Energy Challenge</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-the-einstein-revolution-2910?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Einstein Revolution</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-bioconductor-2970?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Bioconductor</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/neurobehavior-346?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Basic Behavioral Neurology</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/youtube-fundamentals-of-physics-with-ramamurti-shankar-53087?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Physics</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/fos4-climate-and-us-114651?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Frontiers of Science: Climate &amp; Us</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/world-science-u-the-edges-of-the-universe-5206?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Edges of the Universe</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-malariax-defeating-malaria-from-the-genes-to-the-globe-8413?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">MalariaX: Defeating Malaria from the Genes to the Globe</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-advanced-bioconductor-2976?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Advanced Bioconductor</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-new-ideas-about-dark-matter-8893?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">New Ideas About Dark Matter</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/construction-scheduling-7114?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Construction Scheduling</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/construction-finance-7107?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Construction Finance</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-reclaiming-broken-places-introduction-to-civic-ecology-2811?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Reclaiming Broken Places: Introduction to Civic Ecology</a>, da <em>Universidade de</em> <em><em>Cornell</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-fundamental-lessons-from-string-theory-5208?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamental Lessons From String Theory</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-case-studies-in-functional-genomics-2973?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Case Studies in Functional Genomics</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/energy-and-thermodynamics-61435?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Energy and Thermodynamics</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/electrochemistry-61436?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Electrochemistry</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/university-chemistry-entropy-and-equilibria-2-61437?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Entropy and Equilibria</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/energy-to-electrochemistry-final-exam-61438?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Energy to Electrochemistry Final Exam</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/philosophy-of-science-18142?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Philosophy of Science</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/yuzhou-duihua-9460?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">宇宙之旅：对话 (Journey of the Universe: Weaving Knowledge and Action)</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em chinês)</li><li><a href="https://www.classcentral.com/course/diqiu-fanrong-9461?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Thomas Berry的世界观：地球社区的繁荣 (The Worldview of Thomas Berry: The Flourishing of the Earth Community)</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em chinês)</li><li><a href="https://www.classcentral.com/course/yuzhou-zhi-lu-9462?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">宇宙之旅：展现生命 (Journey of the Universe: The Unfolding of Life)</a>, da <em>Universidade de</em> <em><em>Yale</em></em> (em chinês)</li><li><a href="https://www.classcentral.com/course/tropicalforests101-65775?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Tropical Forest Landscapes 101: Conservation &amp; Restoration</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/journey-knowledge-action-6945?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Journey Conversations: Weaving Knowledge and Action</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/thomas-berry-6946?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Worldview of Thomas Berry: The Flourishing of the Earth Community</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-how-black-holes-became-real-58214?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">How Black Holes Became Real</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-rewriting-the-code-of-life-with-crispr-58218?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Rewriting the Code of Life with CRISPR</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/construction-industry-forward-27985?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Construction Industry: The Way Forward</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-endless-universe-beyond-the-big-bang-3404?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Endless Universe: Beyond the Big Bang</a>, da <em>Universidade de</em> <em><em>Princeton</em></em></li><li><a href="https://www.classcentral.com/course/question-reality-matter-120003?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Question Reality: Matter</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/edx-bipedalism-the-science-of-upright-walking-8493?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Bipedalism: The Science of Upright Walking</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/question-reality-cosmos-118916?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Question Reality: Cosmos</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="arte-e-design-18-"><strong>Arte e Design (18)</strong></h2><ul><li><a href="https://www.classcentral.com/course/gamification-343?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Gamification</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(58)</li><li><a href="https://www.classcentral.com/course/introclassicalmusic-2987?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Classical Music</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(25)</li><li><a href="https://www.classcentral.com/course/design-371?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Design: Creation of Artifacts in Society</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(18)</li><li><a href="https://www.classcentral.com/course/romanarchitecture-910?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Roman Architecture</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(13)</li><li><a href="https://www.classcentral.com/course/edx-the-architectural-imagination-7836?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Architectural Imagination</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/edx-18th-century-opera-handel-mozart-12061?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">18th-Century Opera: Handel &amp; Mozart</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-animation-and-cgi-motion-7242?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Animation and CGI Motion</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/edx-first-nights-handel-s-messiah-and-baroque-oratorio-4548?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">First Nights - Handel's Messiah and Baroque Oratorio</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-first-nights-beethoven-s-9th-symphony-and-the-19th-century-orchestra-5383?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">First Nights - Beethoven's 9th Symphony and the 19th Century Orchestra</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/kadenze-reinventing-the-piano-3778?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Reinventing the Piano</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/edx-first-nights-monteverdi-s-l-orfeo-and-the-birth-of-opera-6365?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">First Nights - Monteverdi’s L’Orfeo and the Birth of Opera</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/edx-first-nights-berlioz-s-symphonie-fantastique-and-program-music-in-the-19th-century-6612?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">First Nights - Berlioz’s Symphonie Fantastique and Program Music in the 19th Century</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-first-nights-stravinsky-s-rite-of-spring-modernism-ballet-and-riots-7319?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">First Nights - Stravinsky’s Rite of Spring: Modernism, Ballet, and Riots</a> da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-italian-opera-3840?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Italian Opera</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/edx-19th-century-opera-meyerbeer-wagner-verdi-12384?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">19th-Century Opera: Meyerbeer, Wagner, &amp; Verdi</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/age-of-cathedrals-9671?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Age of Cathedrals</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/music-and-social-action-5842?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Music and Social Action</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-german-opera-7474?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to German Opera</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="ci-ncias-sociais-86-"><strong>Ciências Sociais (86)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-justice-610?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Justice</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(52)</li><li><a href="https://www.classcentral.com/course/the-science-of-well-being-10346?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science of Well-Being</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(29)</li><li><a href="https://www.classcentral.com/course/edx-constitutional-interpretation-13427?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Constitutional Interpretation</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(25)</li><li><a href="https://www.classcentral.com/course/americanlaw-2872?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">An Introduction to American Law</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(19)</li><li><a href="https://www.classcentral.com/course/introduction-psychology-12509?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Psychology</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(16)</li><li><a href="https://www.classcentral.com/course/moral-politics-2986?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Moral Foundations of Politics</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(15)</li><li><a href="https://www.classcentral.com/course/susdev-1533?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Age of Sustainable Development</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(14)</li><li><a href="https://www.classcentral.com/course/edx-contract-law-from-trust-to-promise-to-contract-2633?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Contract Law: From Trust to Promise to Contract</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(13)</li><li><a href="https://www.classcentral.com/course/warparadoxes-1361?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Paradoxes of War</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★☆(12)</li><li><a href="https://www.classcentral.com/course/awc-2677?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">America's Written Constitution</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(10)</li><li><a href="https://www.classcentral.com/course/edx-tangible-things-discovering-history-through-artworks-artifacts-scientific-specimens-and-the-stuff-around-you-1870?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Tangible Things: Discovering History Through Artworks, Artifacts, Scientific Specimens, and the Stuff Around You</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/positive-psychology-applications-8332?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Positive Psychology: Applications and Interventions</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-pyramids-of-giza-ancient-egyptian-art-and-archaeology-10385?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pyramids of Giza: Ancient Egyptian Art and Archaeology</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/constitution-2082?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Key Constitutional Concepts and Supreme Court Cases</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/microeconomics-part1-624?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Microeconomics: The Power of Markets</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/money-banking-6632?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Economics of Money and Banking</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-civil-liberties-11764?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Civil Liberties</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(6)</li><li><a href="https://www.classcentral.com/course/edx-child-protection-children-s-rights-in-theory-and-practice-12686?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Child Protection: Children's Rights in Theory and Practice</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/microeconomics-part2-5295?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Microeconomics: When Markets Fail</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-intellectual-property-law-and-policy-part-1-5001?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Intellectual Property Law and Policy: Part 1</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/auc-3008?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">America's Unwritten Constitution</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-global-history-of-capitalism-10307?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global History of Capitalism</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/political-philosophy-4234?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Revolutionary Ideas: Utility, Justice, Equality, Freedom</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/law-student-4897?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">A Law Student's Toolkit</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(4)</li><li><a href="https://www.classcentral.com/course/wharton-corruption-6888?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Corruption</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/edx-pyramids-of-giza-ancient-egyptian-art-and-archaeology-20964?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pyramids of Giza: Ancient Egyptian Art and Archaeology</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-juryx-deliberations-for-social-change-3188?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">JuryX: Deliberations for Social Change</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-american-government-constitutional-foundations-11664?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">American Government: Constitutional Foundations</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-u-s-public-policy-social-economic-and-foreign-policies-11696?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">U.S. Public Policy: Social, Economic, and Foreign Policies</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-predictionx-omens-oracles-prophecies-8717?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">PredictionX: Omens, Oracles &amp; Prophecies</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/positive-psychology-project-8330?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Positive Psychology Specialization Project: Design Your Life for Well-being</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/positive-psychology-visionary-science-8337?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Positive Psychology: Martin E. P. Seligman’s Visionary Science</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/norms-5910?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social Norms, Social Change I</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/political-philosophy-2-4171?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Revolutionary Ideas: Borders, Elections, Constitutions, Prisons</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/positive-psychology-methods-8335?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Positive Psychology: Character, Grit and Research Methods</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/contracts-1-12714?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">American Contract Law I</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/everyday-parenting-8875?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Everyday Parenting: The ABCs of Child Rearing</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/youtube-introduction-to-psychology-with-paul-bloom-54701?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Psychology</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-making-government-work-in-hard-places-4562?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Making Government Work in Hard Places</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/global-systemic-risk-55173?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global Systemic Risk</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-networks-crowds-and-markets-1565?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Networks, Crowds and Markets</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-wiretaps-to-big-data-privacy-and-surveillance-in-the-age-of-interconnection-1492?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wiretaps to Big Data: Privacy and Surveillance in the Age of Interconnection</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-american-civics-presented-by-zero-l-20365?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to American Civics: Presented by Zero-L</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-u-s-political-institutions-congress-presidency-courts-and-bureaucracy-11694?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">U.S. Political Institutions: Congress, Presidency, Courts, and Bureaucracy</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-citiesx-the-past-present-and-future-of-urban-life-9738?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CitiesX: The Past, Present and Future of Urban Life</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/privacy-law-data-protection-13459?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Privacy Law and Data Protection</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/networkdynamics-9306?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Network Dynamics of Social Behavior</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-intellectual-property-law-and-policy-part-2-6490?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Intellectual Property Law and Policy: Part 2</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/change-7429?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social Norms, Social Change II</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/privacy-law-hipaa-18049?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Privacy Law and HIPAA</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/youtube-philosophy-and-the-science-of-human-nature-w-tamar-gendler-54702?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Philosophy and the Science of Human Nature</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/youtube-yale-anthropology-92463?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yale anthropology</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-global-muckraking-investigative-journalism-and-global-media-8029?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global Muckraking: Investigative Journalism and Global Media</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/the-jeffrey-sachs-book-club-25377?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Book Club with Jeffrey Sachs</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-risk-return-9062?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Risk &amp; Return</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-structuring-business-agreements-for-success-8285?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Structuring Business Agreements for Success</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/evaluating-upward-mobility-the-fading-american-dr-120493?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">[New] Evaluating Upward Mobility: The Fading American Dream</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/youtube-justice-with-michael-sandel-91448?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Justice with Michael Sandel</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/youtube-econ-2450a-public-economics-raj-chetty-91484?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Econ 2450A Public Economics | Raj Chetty</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/youtube-quantitative-social-science-methods-i-gov2001-at-harvard-university-53190?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Quantitative Social Science Methods,Quantitative Social Science Methods</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/early-child-development-global-strategies-for-imp-27971?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Early Childhood Development: Global Strategies for Implementation</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/civic-engagement-in-us-democracy-33440?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">We the People: Civic Engagement in a Constitutional Democracy</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-citizen-politics-in-america-public-opinion-elections-interest-groups-and-the-media-11695?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Citizen Politics in America: Public Opinion, Elections, Interest Groups, and the Media</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-justice-today-money-markets-and-morals-21573?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Justice Today: Money, Markets, and Morals</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/media-2839?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">English for Media Literacy</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/diverse-teams-7123?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Optimizing Diversity on Teams</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-top-10-social-issues-for-the-president-s-first-100-days-7586?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Top 10 Social Issues for the President’s First 100 Days</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-creating-an-effective-child-welfare-system-11665?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Creating an Effective Child Welfare System</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/urban-transit-for-livable-cities-23259?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Urban Transit for Livable Cities</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/introduction-intellectual-property-13446?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Intellectual Property</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/patents-13462?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Patent Law</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/copyright-law-13463?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Copyright Law</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/trademark-law-13467?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Trademark Law</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/intellectual-property-healthcare-industry-18053?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Intellectual Property in the Healthcare Industry</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/contracts-2-12715?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">American Contract Law II</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/edx-freedom-of-expression-in-the-age-of-globalization-6646?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Freedom of Expression in the Age of Globalization</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-protecting-children-in-humanitarian-settings-14482?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Protecting Children in Humanitarian Settings</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-freedom-of-expression-and-information-in-the-time-of-globalization-foundational-course-15198?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Freedom of Expression and Information in the Time of Globalization: Foundational Course</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-freedom-of-expression-and-information-in-the-time-of-globalization-advanced-course-15199?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Freedom of Expression and Information in the Time of Globalization: Advanced Course</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/indigenous-peoples-rights-22010?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Indigenous Peoples' Rights</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/inspire-96663?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">INSPIRE: Seven Strategies for Ending Violence Against Children</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/poverty-population-demographics-policy-12818?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Poverty &amp; Population: How Demographics Shape Policy</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/welfare-state-12819?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">US Social Services Compared</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/welfare-state-origin-12820?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">US Social Services: Where did they come from?</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/social-health-policy-programs-12823?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social Services for Families, Seniors and Those with Disabilities</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/health-housing-educational-services-12826?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Health, Housing, and Educational Services</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li></ul><h2 id="sa-de-e-medicina-353-"><strong>Saúde e Medicina (353)</strong></h2><ul><li><a href="https://www.classcentral.com/course/medical-research-19515?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Understanding Medical Research: Your Facebook Friend is Wrong</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(364)</li><li><a href="https://www.classcentral.com/course/vitalsigns-1887?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Vital Signs: Understanding What the Body Is Telling Us</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(51)</li><li><a href="https://www.classcentral.com/course/edx-mechanical-ventilation-for-covid-19-19347?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Mechanical Ventilation for COVID-19</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(25)</li><li><a href="https://www.classcentral.com/course/edx-crisis-resource-management-21613?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Crisis Resource Management</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(25)</li><li><a href="https://www.classcentral.com/course/youtube-lecture-series-on-introduction-to-radiology-53061?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Radiology</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(17)</li><li><a href="https://www.classcentral.com/course/edx-improving-global-health-focusing-on-quality-and-safety-1950?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving Global Health: Focusing on Quality and Safety</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(10)</li><li><a href="https://www.classcentral.com/course/edx-humanitarian-response-to-conflict-and-disaster-6569?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Humanitarian Response to Conflict and Disaster</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(9)</li><li><a href="https://www.classcentral.com/course/dentmedpenn-2902?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Dental Medicine</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(9)</li><li><a href="https://www.classcentral.com/course/edx-human-anatomy-musculoskeletal-cases-2024?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Human Anatomy: Musculoskeletal Cases</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/breast-cancer-causes-prevention-6044?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Breast Cancer</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/edx-predictionx-john-snow-and-the-cholera-epidemic-of-1854-7159?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">PredictionX: John Snow and the Cholera Epidemic of 1854</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(7)</li><li><a href="https://www.classcentral.com/course/edx-fundamentals-of-clinical-trials-924?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fundamentals of Clinical Trials</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/wo-pmo-healthcareinnovation-10802?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Health Care Innovation</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/trunk-anatomy-10390?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Anatomy of the Chest, Neck, Abdomen, and Pelvis</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/edx-pediatric-hiv-nursing-11350?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pediatric HIV Nursing</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/onehealth-20756?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Bats, Ducks, and Pandemics: An Introduction to One Health Policy</a>, da <em>Universidade de</em> <em><em>Princeton</em></em> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/edx-prescription-drug-regulation-cost-and-access-current-controversies-in-context-13246?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Prescription Drug Regulation, Cost, and Access: Current Controversies in Context</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-united-states-health-policy-1616?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">United States Health Policy</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/health-behavior-change-19269?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Health Behavior Change: From Evidence to Action</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/essentials-global-health-7337?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Essentials of Global Health</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/addiction-treatment-17925?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Addiction Treatment: Clinical Skills for Healthcare Providers</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/edx-the-science-and-politics-of-the-gmo-6501?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science and Politics of the GMO</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-readings-in-global-health-2017-5178?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Readings in Global Health (2017)</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-lessons-from-ebola-preventing-the-next-pandemic-4879?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Lessons from Ebola: Preventing the Next Pandemic</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-the-opioid-crisis-in-america-7830?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Opioid Crisis in America</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/oralcavity-9263?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Oral Cavity: Portal to Health and Disease</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/the-future-of-mrna-vaccines-covid-19-and-beyond-43715?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The COVID-19 Pandemic and the Use of mRNA Vaccines</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/tarasoff-duties-106380?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Tarasoff Duties</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/-dyslexia-116700?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Overcoming Dyslexia</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/diagnosticimaging-80464?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Visualizing the Living Body: Diagnostic Imaging</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-fighting-hiv-with-antiretroviral-therapy-implementing-the-treat-all-approach-11351?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fighting HIV with Antiretroviral Therapy: Implementing the Treat-All Approach</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/independent-creating-an-inclusive-environment-for-sexual-and-gender-minority-patients-and-trainees-in-academic-clinical-settings-107696?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Creating an Inclusive Environment for Sexual and Gender Minority Patients and Trainees in Academic Clinical Settings</a>, da <em>Universidade de</em> <em><em>Brown</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-strengthening-community-health-worker-programs-13318?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Strengthening Community Health Worker Programs</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/edx-practical-improvement-science-in-health-care-a-roadmap-for-getting-results-5003?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Practical Improvement Science in Health Care: A Roadmap for Getting Results</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/respiracion-mecanica-para-covid-19-22806?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ventilación mecánica para pacientes con COVID-19</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> (em espanhol)</li><li><a href="https://www.classcentral.com/course/edx-innovating-in-health-care-1614?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Innovating in Health Care</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/feedingtheworld-3913?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Feeding the World</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/health-economics-us-healthcare-systems-10796?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Economics of Health Care Delivery</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/comparative-health-systems-18064?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Comparative Health Systems</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/health-law-fundamentals-18065?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">U.S. Health Law Fundamentals</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/conflicts-of-interest-in-biomedical-research-106357?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Conflicts of Interest in Biomedical Research</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/ethics-and-trial-design-106361?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ethics and Trial Design</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/evidence-based-prescribing-an-online-course-with--106364?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Evidence-based Prescribing: An Online Course with Tools You Can Use to Fight the Opioid Epidemic</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/covid-19-rationing-and-drug-regulation-106358?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">COVID-19: Rationing and Drug Regulation</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/rationing-care-106375?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Rationing Care</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/research-with-vulnerable-populations-106378?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Research with Vulnerable Populations</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/research-in-global-settings-106377?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Research in Global Settings</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/focus-on-opioid-use-disorder-and-treatment-the-ge-106365?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Focus on Opioid Use Disorder and Treatment: The Genetics of Addiction-How Discovery Is Informing the Path Forward for Opioid Use Disorder Treatment, Intervention, and Prevention</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/penn-medicine-opioid-stewardship-2022-comprehensi-106374?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Penn Medicine Opioid Stewardship 2022: Comprehensive Pain Management: Opioids and Beyond</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/improving-patient-safety-in-primary-care-settings-106367?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving Patient Safety in Primary Care Settings</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/re-imagining-emergency-department-care-for-substa-106376?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Re-Imagining Emergency Department Care for Substance Use Disorders</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/opioid-use-disorder-for-hospitalists-in-the-fenta-106373?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Opioid Use Disorder for Hospitalists in the Fentanyl Era</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/global-quality-maternal-and-newborn-care-22339?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Global Quality Maternal and Newborn Care</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/introduction-to-medical-software-57706?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Medical Software</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/anatomy-extremeties-58598?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Anatomy of the Upper and Lower Extremities</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/the-science-of-well-being-for-teens-121052?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science of Well-Being for Teens</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/planetary-health-for-nurses-ysn-120105?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Planetary Health for Nurses</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/yale-teaching-and-learning-center-teaching-cultur-106185?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yale Teaching and Learning Center: Teaching Cultural Sensitivity in the Patient-Clinician Relationship</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-2021-trust-your-gut-webinar-series-106183?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Trust Your Gut Webinar Series</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/covid-19-vaccination-a-communication-guide-for-pr-106182?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">COVID-19 Vaccination: A Communication Guide for Providers</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/training-course-bloodborne-pathogens-for-clinical-106180?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Training Course: Bloodborne Pathogens for Clinical Personnel</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/training-course-bloodborne-pathogens-for-laborato-106181?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Training Course: Bloodborne Pathogens for Laboratory Research Personnel</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-2021-update-what-s-new-in-the-field-of--106179?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">What's New in the Field of Multiple Sclerosis</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-musculoskeletal-review-course-for-the-p-106178?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Musculoskeletal Review Course for the Primary Care Provider, Part I: The Lower Extremity &amp; Lumbar Spine</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-15th-annual-yale-digestive-disease-week-106177?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">15th Annual Yale Digestive Disease Week Review</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-yale-s-review-of-advances-in-oncology-h-106175?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yale’s Review of Advances in Oncology Highlights from the ASCO® Annual Meeting 2021</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-9th-annual-lawrence-m-brass-stroke-symp-106176?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">9th Annual Lawrence M. Brass Stroke Symposium: Controversies in Stroke Management</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/training-course-preventing-transmission-of-covid--106174?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Training Course: Preventing Transmission of COVID-19 in the Long-Term Care Setting</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-webinar-series-annual-clinical-intersec-106173?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Annual Clinical Intersection of HIV/AIDS: A Practical Discussion of Connecticut's Course Mandates</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-yale-epilepsy-virtual-cme-series-a-mont-106171?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yale Epilepsy Virtual CME Series: A Monthly Live Case-Based Webinar</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-the-gi-hospitalist-model-addressing-the-106168?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The GI Hospitalist Model: Addressing the Needs of Hospital-Based Care</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-digestive-health-virtual-cme-series-202-106167?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Digestive Health Virtual CME Series 2022: Third Thursdays Trust your Gut</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-yale-rheumatology-state-of-the-art-symp-106166?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yale Rheumatology State of the Art Symposium - Reactive Arthritis, Post-Infections, Inflammatory Disease, and Lessons for COVID</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/on-demand-critical-care-emergency-neuroscience-cu-106165?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Critical Care &amp; Emergency Neuroscience: Current Topics in Neuro-resuscitation after Traumatic Brain Injury and Cardiac Arrest</a>, da <em>Universidade de</em> <em><em>Yale</em></em></li><li><a href="https://www.classcentral.com/course/edx-traitement-antiretroviral-pour-lutter-contre-le-vih-mise-en-oeuvre-de-l-approche-traiter-tout-le-monde-13312?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Traitement antirétroviral pour lutter contre le VIH : mise en œuvre de l'approche « traiter tout le monde »</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> (em francês)</li><li><a href="https://www.classcentral.com/course/edx-soins-infirmiers-en-vih-pediatrique-13333?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Soins infirmiers en VIH pédiatrique</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> (em francês)</li><li><a href="https://www.classcentral.com/course/menstruation-in-a-global-context-addressing-polic-57799?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Menstruation in a Global Context: Addressing Policy and Practice</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/columbia-2021-obesity-course-etiology-prevention-and-treatment-110324?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Obesity Course: Etiology, Prevention and Treatment</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/columbia-how-common-is-celiac-disease-around-the-world-105236?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">How Common is Celiac Disease Around the World? Role of Gluten Timing and Quantity, and Environmental Risk Factors</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/columbia-the-clinical-picture-of-celiac-disease-and-how-to-make-the-diagnosis-105235?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Clinical Picture of Celiac Disease and How to Make the Diagnosis</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-artful-medicine-art-s-power-to-enrich-patient-care-8541?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Artful Medicine: Art’s Power to Enrich Patient Care</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/edx-beyond-medical-histories-gaining-insight-from-patient-stories-11762?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Beyond Medical Histories: Gaining Insight from Patient Stories</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-retaining-patients-in-office-based-buprenorphine-treatment-107706?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Retaining Patients in Office-based Buprenorphine Treatment</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-getting-your-scholarly-projects-unstuck-a-reference-management-workshop-107734?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">EFD On-Demand: Getting Your Scholarly Projects "Unstuck"- A Reference Management Workshop</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-no-longer-speechless-a-practical-workshop-on-responding-to-microaggressions-in-biomedical-settings-107683?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">No Longer Speechless - A Practical Workshop on Responding to Microaggressions in Biomedical Settings</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-improving-instruction-with-spaced-and-retrieval-practice-107719?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving Instruction with Spaced and Retrieval Practice</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-identification-and-management-of-adhd-and-impulse-control-in-tourette-syndrome-107699?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Identification and Management of ADHD and Impulse Control in Tourette Syndrome</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-march-5-2021-teaching-the-use-of-hit-to-support-relationship-based-care-promoting-wellness-in-clinical-care-107697?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Teaching the Use of HIT to Support Relationship-based Care &amp; Promoting Wellness in Clinical Care</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-strategic-cv-creation-and-maintenance-107720?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Strategic CV Creation and Maintenance</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-critical-junctures-creating-high-impact-advising-conversations-107726?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Critical Junctures: Creating High Impact Advising Conversations</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-evidence-based-emergency-care-for-opioid-use-disorder-107684?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Evidence-based Emergency Care for Opioid Use Disorder</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-refractory-tourette-syndrome-107698?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Refractory Tourette Syndrome</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li>Y<a href="https://www.classcentral.com/course/independent-efd-on-demand-you-ve-been-served-now-what-107723?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ou've Been Served: Now What?</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-program-in-educational-faculty-development-on-demand-courses-107724?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Program in Educational Faculty Development On-Demand Courses</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-practical-approaches-to-applying-conceptual-theoretical-frameworks-to-medical-education-research-107735?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Practical Approaches to Applying Conceptual &amp; Theoretical Frameworks to Medical Education Research</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-meeting-the-acgme-requirement-cqi-education-programs-for-residents-107693?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Meeting the ACGME Requirement: CQI Education Programs for Residents</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-best-practices-for-treatment-of-acute-pain-express-interest-and-pre-survey-107752?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Best Practices for Treatment of Acute Pain: Express Interest and Pre-Survey</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-may-7-2021-working-with-governments-institutions-stakeholders-to-support-healing-relationships-human-capital-ethical-stewardship-of-shared-data-107712?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Working with Governments, Institutions, &amp; Stakeholders to Support Healing Relationships &amp; Human Capital; Ethical Stewardship of Shared Data</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-academic-detailing-best-practices-for-treatment-of-acute-pain-107753?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Academic Detailing: Best Practices for Treatment of Acute Pain</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-academic-detailing-group-presentation-best-practices-for-treatment-of-acute-pain-post-activity-107754?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Academic Detailing Group Presentation: Best Practices for Treatment of Acute Pain - Post Activity</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-emergency-care-for-opioid-use-disorder-107685?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Emergency Care for Opioid Use Disorder</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-fears-bias-and-discrimination-substance-use-disorder-patient-care-107686?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Fears, Bias and Discrimination - Substance Use Disorder Patient Care</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-advances-in-the-treatment-of-tics-107687?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Advances in the Treatment of Tics</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-the-future-of-lung-cancer-screening-for-all-communities-in-ri-where-we-are-and-where-we-need-to-be-107701?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Future of Lung Cancer Screening for All Communities in RI: Where We Are and Where We Need to Be</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-transitioning-to-adult-care-time-is-ticcing-away-107700?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Transitioning to Adult Care: Time is Ticcing Away</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-psychological-flexibility-building-a-pragmatic-model-and-method-of-intentional-change-107727?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Psychological Flexibility: Building a Pragmatic Model and Method of Intentional Change</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-tiktoktherapist-understanding-the-role-of-social-media-in-adolescent-mental-health-107728?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">TikTokTherapist: Understanding the Role of Social Media in Adolescent Mental Health</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-social-in-justice-and-mental-health-107731?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social (In)Justice and Mental Health</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-finding-the-ehr-data-to-tell-your-clinical-story-early-experiences-with-lifespan-pediatric-behavioral-health-emergency-services-107732?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Finding the EHR Data to Tell Your Clinical Story: Early Experiences with Lifespan Pediatric Behavioral Health Emergency Services</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-screen-media-social-interaction-and-asd-connecting-theory-and-research-107725?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Screen Media, Social Interaction and ASD: Connecting Theory and Research</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-adolescent-substance-use-and-treatment-translating-science-into-clinical-practice-107669?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Adolescent Substance Use and Treatment: Translating Science into Clinical Practice</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-racism-in-academic-psychiatry-hiding-beneath-the-cloak-of-our-benevolence-107670?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Racism in Academic Psychiatry: Hiding Beneath the Cloak of Our Benevolence</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-catatonia-evaluation-treatment-and-consideration-in-a-pediatric-population-107671?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Catatonia, Evaluation, Treatment and Consideration in a Pediatric Population</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-rapid-acting-treatments-for-pediatric-depression-and-suicidality-where-are-we-now-107672?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Rapid-acting Treatments for Pediatric Depression and Suicidality: Where are We Now?</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-implementation-science-driving-health-policy-change-in-learning-health-systems-107673?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Implementation Science: Driving Health Policy Change in Learning Health Systems</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-yoga-intervention-research-focus-on-people-with-depression-107675?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Yoga Intervention Research: Focus on People with Depression</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-social-in-justice-and-children-s-mental-health-107676?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Social (In)justice and Children’s Mental Health</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-leveraging-sleep-and-circadian-science-to-devise-and-disseminate-novel-transdiagnostic-treatments-to-improve-sleep-health-107677?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leveraging Sleep and Circadian Science to Devise and Disseminate Novel Transdiagnostic Treatments to Improve Sleep Health</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-school-mental-health-suicide-prevention-and-wellbeing-promotion-lessons-from-the-last-10-years-wisdom-for-the-next-10-107678?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">School Mental Health, Suicide Prevention, and Wellbeing Promotion: Lessons from the last 10 years &amp; Wisdom for the next 10</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-translating-understanding-of-neural-network-dysfunction-into-novel-mood-disorder-risk-markers-and-brain-based-treatments-for-bipolar-disorder-107680?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Translating understanding of neural network dysfunction into novel, mood disorder risk markers and brain-based treatments for Bipolar Disorder</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-parent-based-treatment-for-childhood-anxiety-and-ocd-107681?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Parent-Based Treatment for Childhood Anxiety and OCD</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-socio-cognitive-behavioral-therapy-for-latinx-youth-with-suicidal-thoughts-and-behaviors-107682?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Socio-Cognitive Behavioral Therapy for Latinx Youth with Suicidal Thoughts and Behaviors</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-lethal-means-counseling-collaboration-at-the-patient-and-community-level-107730?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">On-Demand | Lethal Means Counseling: Collaboration at the Patient- and Community-Level</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-2022-the-patient-and-the-practitioner-in-the-age-of-technology-promoting-healing-relationships-107755?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">2022 The Patient and The Practitioner in the Age of Technology: Promoting Healing Relationships</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-providence-sleep-research-interest-group-seminar-series-107679?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Providence Sleep Research Interest Group Seminar Series</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-improving-the-care-of-patients-with-sickle-cell-disease-107694?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving the Care of Patients with Sickle Cell Disease</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-addressing-microaggressions-in-the-clinical-environment-107695?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Addressing Microaggressions in the Clinical Environment</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-medical-evaluation-of-the-sexual-assault-survivor-a-virtual-educational-curriculum-107737?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medical Evaluation of the Sexual Assault Survivor: A Virtual Educational Curriculum</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-building-a-better-suicide-risk-assessment-the-nuts-and-bolts-of-the-columbia-protocol-107713?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Building a Better Suicide Risk Assessment: The Nuts and Bolts of the Columbia Protocol</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-docs-for-health-considering-social-and-structural-determinants-in-medical-care-107704?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Docs for Health: Considering Social and Structural Determinants in Medical Care</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-dcyf-and-legal-considerations-session-vi-107714?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">DCYF and Legal Considerations: Session VI</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-neonatal-opioid-withdrawal-syndrome-nows-nas-session-v-107715?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Neonatal Opioid Withdrawal Syndrome (NOWS/NAS): Session V</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-trauma-and-oud-session-iv-107716?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Trauma and OUD: Session IV</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-micro-interventions-to-support-those-escaping-emotional-pain-addressing-overlapping-substance-use-and-suicide-risk-107729?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Micro-interventions to Support Those Escaping Emotional Pain: Addressing Overlapping Substance Use and Suicide Risk</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-efd-on-demand-from-abstract-to-poster-to-case-report-a-guide-for-clinicians-107733?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">From Abstract to Poster to Case Report: A Guide for Clinicians</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-on-demand-demystifying-palliative-care-107736?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Demystifying Palliative Care</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-9-21-22-5-ways-to-work-through-conflict-107746?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Ways to Work Through Conflict</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-10-06-22-owims-book-club-session-ii-zoom-option-crucial-conversations-107756?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">OWIMS Book Club (Session II): Crucial Conversations</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-10-06-22-owims-book-club-session-i-live-in-person-option-crucial-conversations-107757?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">OWIMS Book Club (Session I): Crucial Conversations</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-2-compassion-the-new-empathy-taking-the-me-out-of-empathy-107738?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 2: Compassion the new empathy? Taking the me out of empathy</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-3-how-life-gets-in-the-way-107739?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 3: How life gets in the way</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-4-the-habit-of-judging-ourselves-and-others-107740?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 4: The habit of judging ourselves and others</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-5-working-with-stress-and-anxiety-107741?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 5: Working with stress and anxiety</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-6-spreading-curiosity-don-t-just-do-something-sit-there-107742?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 6: Spreading Curiosity: Don’t just do something, sit there</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-8-a-summary-of-all-that-we-ve-explored-107743?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 8: A Summary of all that we’ve explored</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-7-the-obstacle-is-the-way-107745?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 7: The obstacle is the way</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-reducing-physician-burnout-107748?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Reducing Physician Burnout</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-session-1-feeling-the-pain-empathy-and-action-107749?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Session 1: Feeling the Pain: Empathy and Action</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-tom-f-anders-seminar-series-107750?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Tom F. Anders Seminar Series</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-2022-2023-child-and-adolescent-psychiatry-grand-rounds-107747?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Child and Adolescent Psychiatry Grand Rounds</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/independent-2022-2023-department-of-psychiatry-and-human-behavior-academic-grand-rounds-107751?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Department of Psychiatry and Human Behavior Academic Grand Rounds</a>, da <em>Universidade de</em> <em><em>Brown</em></em></li><li><a href="https://www.classcentral.com/course/world-science-u-foundations-of-understanding-and-combating-cancer-58165?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Foundations of Understanding and Combating Cancer</a>, da <em>Universidade de</em> <em><em>Cornell</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-improving-event-reporting-am-106582?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds More is Better: Improving Event Reporting in Ambulatory Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-heart-failure-education-guid-106581?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Heart Failure Education: A Guide for Nurses</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-gut-microbiome-lessons-reim-106580?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Gut Microbiome: Lessons from the REIMAGINE Study, Mark Pimentel, MD, FRCP(C)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nursing-advocacy-difference-106579?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Nursing Advocacy: How YOU Can Make a Difference</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-haiti-earthquake-reflection-106578?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Haiti after the Earthquake: A Reflection 10 Years, March 6, 2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-recent-advances-treatment-s-106577?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Recent Advances in the Treatment of Scleroderma, March 13, 2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-severe-acute-respiratory-sy-106576?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Severe Acute Respiratory Syndrome Coronavirus 2 COVID-19: Science Update, March 20, 2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-critical-thinking-bedside-i-106575?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Critical Thinking at the Bedside: Incorporating Uncertainty into your Practice and Teaching - April 24, 2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-force-nursing-innovation-dh--106574?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds The Force Within: Nursing Innovation and DH's First Nursing Micro Hackathon</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-sex-differences-obstructive-106573?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Sex Differences in Obstructive Sleep Apnea Why it Matters, May 8, 2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-senior-resident-internal-me-106572?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Senior Resident in Internal Medicine Research Presentations</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-implementing-telemedicine-c-106571?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Implementing Telemedicine in a Chronic Care Model</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-metoo-addressing-gender-ine-106570?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - #MeToo: Addressing Gender Inequity in Academic Medicine</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/lwww-talk-self-care-practical-care-ourselves-106568?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Self-Care: Practical Ways We Can Take Care of Ourselves and Each Other</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-department-medicine-scholar-106569?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Department of Medicine Scholarship Enhancement in Academic Medicine (SEAM) Project Reports</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/surgery-grand-rounds-june-19-2020-perioperative-m-106567?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Surgery Grand Rounds June 19, 2020 - Perioperative Management of Pain and Addiction in Patients with Opioid Use Disorder</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/internal-medicine-education-conference-2020-manag-106566?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">General Internal Medicine Education Conference 2020 - Management of Hepatitis C in Primary Care 6/25/2020</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-suddenly-meatless-tick-bite-106565?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Suddenly Meatless: How Tick Bites and Reactions to Red Meat are Changing the Paradigm of Food Allergy</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-covid-19-immunology-boot-ca-106564?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - COVID-19 as Immunology Boot Camp: Cytokine Release Syndrome &amp; Prospects for Therapy</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-ve-thunderstruck-106563?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Youve Been Thunderstruck!</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-endocrine-complications-ano-106562?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Endocrine Complications of Anorexia Nervosa</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-structural-inequity-racial--106561?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Structural Inequity, Racial and Ethnic Disparities and Infectious Diseases: Are There Sustainable Solutions?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-frail-adults-106560?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Frail Older Adults and How to Find Them</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-pressure-hyperbaric-oxygen--106559?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Under Pressure: Should We Give Hyperbaric Oxygen to COVID-19 Patients?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-leveraging-education-techno-106557?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Leveraging Education Technology in our Brave New Medical Education World</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-unconscious-bias-106558?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Unconscious Bias</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-department-medicine-reports-106556?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Department of Medicine Case Reports</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-changing-culture-surrounding-106555?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/perioperative-patient-care-leadership-106554?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Perioperative Patient Care: Leadership in the OR</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-covid-19-mission-operation-g-106553?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds COVID-19 Mission: Operation Gotham</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-unconscious-bias-106552?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Unconscious Bias: Where are We Now?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/virtual-conversations-justice-equity-bioethics-pa-106551?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Virtual Conversations in Justice and Equity in Bioethics Part 1 of 3: Challenging Patient Encounters: Psychologically Informed Patient and Family Centered Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-myths-evidence-future-tobac-106550?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Myths, Evidence, and the Future of Tobacco Treatment</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nurse-leadership-advocacy-ac-106549?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Year of the Nurse: A Year of Leadership, Advocacy and Activism</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-decision-colonoscopy-adults-106548?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - When is Enough, Enough? Decision Making Around Colonoscopy in Older Adults</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-pulmonary-fibrosis-epitheli-106547?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Pulmonary Fibrosis - How Epithelial Cells and Fibroblasts Use the Same Language to Drive Each Other Mad</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nicotine-addiction-101-106546?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Nicotine Addiction 101: What is it and why is it important to you?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/virtual-conversations-justice-equity-bioethics-pa-106545?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Virtual Conversations in Justice and Equity in Bioethics Part 2 of 3: Equity in the COVID-19 Pandemic</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-single-payer-106544?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Why We Need Single Payer</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-intersection-human-trafficki-106543?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds The Intersection of Human Trafficking and Domestic Violence: Is it DV or Could It Be Trafficking?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-part-2-changing-culture-surr-106542?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Part 2 Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-emerging-science-transform--106541?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - How Emerging Science Can Transform Obesity Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-cultivating-empathy-medicin-106540?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Cultivating Empathy in Medicine: What Would Dr. Matthews Say? The Louis B. Matthews Visiting Professorship</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-opioids-pain-management-pre-106539?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Opioids and Pain Management: Preventing Harm and Maximizing Benefit</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/virtual-conversations-justice-equity-bioethics-pa-106538?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Virtual Conversations in Justice and Equity in Bioethics Part 3 of 3: Racism and Health Equity: Why Does it Matter in Bioethics?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-consult-conflict-medicine-106537?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Consult Conflict in Medicine</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-education-practice-partnersh-106536?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Education and Practice Partnerships in Nursing Education: The Capstone Experience in the RNBS Program at CSC</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-art-human-lived-ex-106535?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds The Art of Being Human:The Lived Experience of People with Disabilities</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-neuro-axis-fire-checkpoint--106534?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Neuro-Axis on Fire: Checkpoint Inhibitor Neuritis / Encephalitis and CAR-T Neurotoxicity. How fast can it burn?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/developing-trauma-informed-practice-part-series-106533?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Developing a Trauma-Informed Practice: Four Part Series</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-part-3-changing-culture-surr-106532?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Part 3 - Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-team-based-learning-enginee-106530?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Team-Based Learning: Engineering Human Performance through Collaboration</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-team-based-learning-engineer-106531?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Team-Based Learning: Engineering Human Performance Through Collaboration (Combined with Medicine Grand Rounds)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/pediatric-lecture-series-baron-munchausen-medical-106529?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pediatric Lecture Series - Baron Munchausen to Medical Child Abuse</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-anti-racism-healthcare-heal-106528?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Anti-Racism, Healthcare, and Health Policy: How far can we go?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-public-health-dermatology-p-106527?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Public Health and Dermatology From Policy to Pox</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/geriatric-education-series-appropriate-prescribin-106526?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Geriatric Education Series - Appropriate Prescribing Practices for Opioids for Pain Management in Older Adults</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/perianesthesia-procedural-topics-operating-room-a-106523?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Perianesthesia and Procedural Topics Non-Operating Room Anesthesia</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/perianesthesia-procedural-topics-duty-patient-ali-106524?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Perianesthesia and Procedural Topics Duty to Patient: Aligns Standards with Clinical Case Scenarios</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/perianesthesia-procedural-topics-team-nursing-106525?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Perianesthesia and Procedural Topics Team Nursing</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/pediatric-lecture-series-caring-adolescents-eatin-106522?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pediatric Lecture Series - Caring for Adolescents with Eating Disorders in Northern New England</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-heart-failure-preserved-eje-106521?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Heart Failure with Preserved Ejection Fraction - A Misunderstood Disease in Search of a Therapy</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/surgery-grand-rounds-bias-assessment-treatment-pa-106520?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Surgery Grand Rounds - Bias in the Assessment and Treatment of Pain</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-virtually-science-practice--106519?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Virtually Better: The Science and Practice of Therapeutic Virtual Reality</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-education-practice-partnersh-106518?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Education and Practice Partnerships in Nursing Education: The Capstone Experience in the RNBS Program at CSC</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-serrated-pathway-colorectal-106517?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - The Serrated Pathway and Colorectal Cancer Screening</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-updates-polycystic-kidney-d-106516?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Updates in Polycystic Kidney Disease</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-aging-dying-prison-integrat-106515?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Aging and Dying in Prison: Integrating Geriatrics and Palliative Care into Criminal Justice Reform</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-night-violence-brain-injurie-106513?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Just Another Night of Violence: Brain Injuries from Intimate Partner Violence in New Hampshire</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-department-medicine-scholar-106514?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Department of Medicine Scholarship Enhancement in Academic Medicine (SEAM) Project Reports</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-shattering-silence-rape-trau-106511?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Shattering Silence: Rape Trauma Circa 2021</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/vaccine-anxiety-children-106512?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Vaccine Anxiety in Children</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-empathy-physician-covid-res-106510?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Empathy for the Physician: How COVID Has Reshaped Our Relationships and Lives</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-covid-19-lessons-learned-ov-106508?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - COVID-19: Lessons Learned Over the Past Year. Can We Do Better?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-part-4-changing-culture-surr-106509?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Part 4 - Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/psychiatry-grand-rounds-physician-training-prospe-106507?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Psychiatry Grand Rounds - Physician Training: A Prospective Model to Understand How Stress Leads to Depression</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-exam-table-106506?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - From the Other Side of the Exam Table</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-happy-100th-anniversary-insu-106505?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Happy 100th Anniversary to Insulin! Diabetes Update 2021</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/holistic-care-webinar-introduction-clinical-hypno-106504?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Holistic Care Webinar: Introduction to Clinical Hypnosis - Strategies and Skills for Stress Reduction and Improved Communication</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-embedding-clinical-trials-c-106503?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Embedding Clinical Trials within Clinical Care: The Future of Learning Healthcare Systems</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/virtual-conversations-justice-equity-bioethics-co-106502?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Virtual Conversations in Justice and Equity in Bioethics: Controversies Around COVID-19 Vaccines</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-excessive-alcohol-nurse-s-ro-106501?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Excessive Alcohol Use: Nurse's Role in Screening, Brief Intervention (Advice) &amp; Referral for Treatment</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/fourth-annual-dartmouth-hitchcock-nursing-researc-106498?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Fourth Annual Dartmouth-Hitchcock Nursing Research Symposium - Keynote: Bedside to Bench to Bedside: Nursing Research to Inform Practice (Part 1 of 3)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/fourth-annual-dartmouth-hitchcock-nursing-researc-106499?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Fourth Annual Dartmouth-Hitchcock Nursing Research Symposium - What Can We Do By Next Tuesday? Bringing It All Together and Not Losing Steam (Part 3 of 3)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/fourth-annual-dartmouth-hitchcock-nursing-researc-106500?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Fourth Annual Dartmouth-Hitchcock Nursing Research Symposium - Tackling a problem: Panel on Research, Evidence-Based Practice, and Quality Improvement (Part 2 of 3)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/innovation-nursing-transforming-care-nurse-time-106496?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Innovation in Nursing: Transforming Care One Nurse at a Time!</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-personalized-therapeutics-m-106497?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Personalized Therapeutics Moving Beyond Precision Medicine</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/leadership-lessons-legends-106495?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leadership Lessons from Legends</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/leadership-evolving-journey-mission-values-leadin-106494?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leadership as an Evolving Journey: Mission and Values in Leading Others</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/becoming-106493?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Who are you BECOMING?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-resident-research-presentat-106492?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Resident Research Presentations</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-limited-english-proficient-p-106491?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Working with Limited English Proficient Patients and Interpreter Services at Dartmouth-Hitchcock</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/dh-ambulatory-nursing-presents-ambulatory-nurses--106490?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">DH Ambulatory Nursing Presents - Ambulatory Nurses and Innovation: How Nurses Can Shape Healthcare</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/dh-ambulatory-nursing-presents-professional-teleh-106488?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">DH Ambulatory Nursing Presents - Professional Telehealth Nursing: More than a Question, Click, and Conclusion</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-equity-efficiency-icu-triag-106489?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Equity, Efficiency, and ICU Triage during the COVID-19 Pandemic</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/shared-decision-youth-treated-psychotropic-medica-106487?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Shared Decision Making for Youth Treated with Psychotropic Medications</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/dh-ambulatory-nursing-presents-pandemic-help-driv-106486?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">DH Ambulatory Nursing Presents - How the Pandemic can Help us Drive the Implementation of Team-Based Care at DH-H</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nursing-burnout-coping-strat-106485?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Nursing Burnout and Coping Strategies</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/psychiatry-grand-rounds-treatment-people-inject-d-106484?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Psychiatry Grand Rounds - Treatment of People Who Inject Drugs Hospitalized for Serious Infection</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/dh-ambulatory-nursing-presents-art-nursing-creati-106483?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">DH Ambulatory Nursing Presents The Art of Nursing: Creativity, Growth and Innovation</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-post-acute-sequelae-covid-1-106482?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Post-Acute Sequelae of COVID-19: Lessons in Clinical Care and Health Care Delivery Science</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-discovering-vexas-science-t-106481?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Discovering VEXAS: the Science of Team Science</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-part-5-changing-culture-surr-106480?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Part 5 - Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-minimal-trauma-fractures-os-106479?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Minimal trauma fractures and osteoporosis, deadly but ignored...how do we solve this?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/department-surgery-grand-rounds-responsible-opioi-106478?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Department of Surgery Grand Rounds - Responsible Opioid Prescribing After Surgery</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-structural-heart-disease-in-106477?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Structural Heart Disease: Innovation, Implementation &amp; Interdisciplinary Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-found-holy-grail-blood-thin-106475?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Have We Found the Holy Grail of Blood Thinners?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-creating-t-106476?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar - Creating a Trans Affirming Environment: Use of Gender Appropriate Language at Dartmouth-Hitchcock</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106462?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative Medication Assisted Treatment in Vermont Correctional Facilities</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106463?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Long-Term OUD Medication Management</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106464?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative Providing Care Coordination and Medication to Treat Pregnant and Post-pregnant People for OUD</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106465?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative MAT and Telemedicine</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106466?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Treating Alcohol Use Disorder in Patients Receiving Medication for OUD</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106467?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Developing a Stress Resilient Workforce</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106468?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Impact of Opioid Use Disorders on Children and Families</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106469?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Intersections of Intimate Partner Violence, Opioids, and Trauma: Theory to Practice</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106470?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Health Disparities &amp; Partner Agencies</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106471?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL - Advanced Opioid Use Disorder X-waiver Team Learning Collaborative: Opioid Use Disorders Co-morbid with Alcohol, Sedative, Stimulant, or Tobacco Use Disorders: A Person Centered Approach</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106472?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative: Managing Injection Behaviors: The Partial Responder to MAT</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106473?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative: Co-occurring Mental Illness and Substance Use</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-enduring-material-toxicology-testing-risk-str-106474?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL Enduring Material - Toxicology Testing and Risk Stratification Considerations</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/putting-trauma-informed-care-practice-perinatal-s-106461?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Putting Trauma-Informed Care into Practice in the Perinatal Setting (Part 1 of 3) - Foundations for Trauma Informed Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/psychiatry-grand-rounds-social-justice-mental-hea-106460?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Psychiatry Grand Rounds - Social (In)justice and Mental Health</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/putting-trauma-informed-care-practice-perinatal-s-106458?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Putting Trauma-Informed Care into Practice in the Perinatal Setting (Part 2 of 3) - Caring with Compassion Building Skills for Trauma-Responsive Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-interpreter-services-dartmou-106459?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Interpreter Services at Dartmouth-Hitchcock: A Deeper Dive</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/internal-medicine-education-conference-primary-ca-106457?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">General Internal Medicine Education Conference - Primary Care Education - Integrated Mental Health: Evidence, Policy, and Implementation</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/holistic-care-webinar-essential-oil-therapy-nursi-106456?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Holistic Care Webinar: Essential Oil Therapy for Nursing Practice</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/psychiatry-grand-rounds-understanding-addressing--106455?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Psychiatry Grand Rounds - Understanding and Addressing the Psychosocial Needs of Trans and Non-Binary Patients: An Affirming, Effective, and Research-Based Approach</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-trauma-informed-care-106453?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Trauma Informed Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/putting-trauma-informed-care-practice-perinatal-s-106454?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Putting Trauma-Informed Care into Practice in the Perinatal Setting (Part 3 of 3) - Birth Trauma Mitigation and Use of the Plan of Safe Care in Supportive Communication</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-bob-cimis-memorial-lecture--106452?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - The Bob Cimis Memorial Lecture - Challenges and Progress Towards the Prevention of Pancreatic Cancer</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-getting-basics-caring-stroke-106451?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Getting Back to the Basics: Caring for Stroke Patients at Dartmouth-Hitchcock</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-detection-pulmonary-fibrosi-106449?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Early Detection of Pulmonary Fibrosis</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-part-6-changing-culture-surr-106450?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Part 6 - Changing the Culture Surrounding Mental Illness: It's Way Past Time</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-finding-oasis-food-deserts-f-106448?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Finding the Oasis in Food Deserts: Food Access Awareness and Budget Conscious Nutrition</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-cardiovascular-disease-canc-106446?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Cardiovascular Disease and Cancer: Cross-Disease Communication</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-caring-victims-fatal-strangu-106447?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Caring for Victims of Non-fatal Strangulation</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/lung-cancer-screening-update-call-action-106445?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Lung Cancer Screening: An Update and Call to Action</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-healing-intention-106444?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Healing with Intention</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/51st-meeting-nh-vt-ethics-committees-navigating-d-106440?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 51st Meeting of the NH/VT Ethics Committees: Navigating Decision-Making Capacity amid Mental Illness Capacity Assessment Part 1 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/51st-meeting-nh-vt-ethics-committees-navigating-d-106441?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 51st Meeting of the NH/VT Ethics Committees: Navigating Decision-Making Capacity amid Mental Illness Eating Disorders Part 2 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/51st-meeting-nh-vt-ethics-committees-navigating-d-106442?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 51st Meeting of the NH/VT Ethics Committees: Navigating Decision-Making Capacity amid Mental Illness Ulysses Clause Part 4 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/51st-meeting-nh-vt-ethics-committees-navigating-d-106443?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 51st Meeting of the NH/VT Ethics Committees: Navigating Decision-Making Capacity amid Mental Illness Uncomfortable Ethical Quandaries Inherent When Psychiatrically Ill Children are Boarded on Non-psychiatric Pediatric Floors Part 3 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-medical-consequences-climat-106439?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Medical Consequences of Climate Change</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/secondary-traumatic-stress-burnout-106437?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Secondary Traumatic Stress and Burnout</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/laying-groundwork-adverse-childhood-experiences-a-106438?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Laying the Groundwork: Adverse Childhood Experiences (ACEs) and their Impact</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-questions-colorectal-cancer-106436?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Open Questions in Colorectal Cancer Screening</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-2021-ada-standards-care-over-106435?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds The 2021 ADA Standards of Care: An Overview of Diabetes Classifications and the Use of Technology in Diabetes Management</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/internal-medicine-primary-care-education-conferen-106434?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">General Internal Medicine and Primary Care Education Conference - Treating Unhealthy Alcohol Use: What's Our Disorder?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-action-plan-gender-equity-d-106432?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - An Action Plan toward Gender Equity in a Department of Medicine</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-thriving-life-quake-106433?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds - Thriving After a Life-Quake</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nursing-research-self-effica-106431?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Nursing Research Self-Efficacy at an Academic Medical Center</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-insulin-100-historical-pers-106430?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Insulin @ 100: A Historical Perspective</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-cardiovascular-safety-urate-106429?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Cardiovascular Safety of Urate-Lowering Drugs in Gout</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-education-practice-partnersh-106428?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Education and Practice Partnerships in Nursing Education: The Capstone Experience in the RNBS Program at CSC</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-gerd-guidelines-con-106427?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - GERD: Latest Guidelines and Controversies</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/wicked-pissah-update-management-male-voiding-symp-106426?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Wicked Pissah Update on Management of Male Voiding Symptoms</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/medicine-grand-rounds-immune-related-toxicities-i-106425?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Medicine Grand Rounds - Immune-Related Toxicities with Immune Checkpoint Inhibitors</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106422?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Treating HCV in Spokes</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-advanced-opioid-disorder-waiver-team-learning-106423?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL: Advanced Opioid Use Disorder X-waiver Team Learning Collaborative - Buprenorphine &amp; Diversion: The Vermont Regulatory Environment</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/axl-opioid-disorder-waiver-team-learning-collabor-106424?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">AXL - Opioid Use Disorder X-waiver Team Learning Collaborative - Pain Treatment in Substance Use Disorders</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/internal-medicine-education-conference-primary-ca-106421?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">General Internal Medicine Education Conference - Primary Care Education - Osteoporosis related fractures;Deadly but Ignored.....A way forward</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/help-helpers-building-foundation-trauma-informed--106420?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Help for the Helpers: Building a Foundation for Trauma Informed Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-human-traf-106419?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar - Human Trafficking Awareness with Homeland Security: NH Updates</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/calming-de-escalation-106418?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Calming and De-Escalation</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/link-trauma-substance-misuse-strategies-address-m-106417?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Link Between Trauma and Substance Misuse: Strategies to Address This in Medical Practice</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-our-student-s-emoti-106416?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - Our Student's Emotional and Behavioral Health: Improving Collaboration Between Schools, Families, and Physicians by Focusing on the Child</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/trauma-informed-primary-care-106415?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Trauma-Informed Primary Care</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-nurses-critical-role-enhanci-106414?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds Nurses Critical Role in Enhancing Health Literacy</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-innovation-translation-pract-106413?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds - Innovation: Translation into Practice</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-trauma-webinar-series-part-kinematics-trauma-106412?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Trauma Webinar Series - Part One: Kinematics of Trauma</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-communication-adver-106411?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - Communication after Adverse Events</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-six-si-106405?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day Section Six of Six - Ethics Simulation: A Collaborative Practice of an Ethics Consultation (Must complete sessions 1 5 before registering for this session)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-five-s-106406?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day Section Five of Six - Surrogate Decision Making</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-six-in-106407?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day Section Four of Six - Informed Consent</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-six-ex-106408?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day - Section Three of Six Exploring the Ethical Foundation for Ethics Committees</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-six-he-106409?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day Section Two of Six - What is a Healthcare Ethics Committee</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/16th-ethics-committee-training-day-section-six-co-106410?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 16th Ethics Committee Training Day - Section One of Six - Common Presentations of Ethical Concerns brought to a Clinical Ethics Committee</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nursing-grand-rounds-hope-design-thinking-nurse-i-106404?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nursing Grand Rounds: HOPE Design Thinking for Nurse Innovators</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-series-add-106403?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar Series Addressing Sexual Violence: Working Together to Support Survivors (Advocacy) Session 1 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-trauma-webinar-series-part-massive-transfusi-106402?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Trauma Webinar Series Part Two: Massive Transfusion in Traumatically Injured Adults and Children</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/52nd-meeting-vt-nh-ethics-committees-ethics-ratio-106401?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 52nd Meeting of the VT and NH Ethics Committees The Ethics of Rationing</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-series-add-106400?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar Series Addressing Sexual Violence: Working Together to Support Survivors (SANE &amp; Law Enforcement) Session 2 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-female-athlete-tria-106399?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - Female Athlete Triad 2022: Optimizing Bone Health in Active Female Adolescents</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/app-precepting-workshop-4-14-2022-106398?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">APP Precepting Workshop - 4-14-2022</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-series-add-106397?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar Series Addressing Sexual Violence: Working Together to Support Survivors (Title IX &amp; College Advocacy) Session 3 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/nonalcoholic-fatty-liver-disease-106396?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Nonalcoholic Fatty Liver Disease</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-webinar-series-add-106395?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Webinar Series Addressing Sexual Violence: Working Together to Support Survivors (Child Advocacy Model in Child Abuse Case) Session 4 of 4</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/tell-healthcare-providers-106394?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Know &amp; Tell for Healthcare Providers</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-holistic-care-webinar-combustion-avoidance-c-106393?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Holistic Care Webinar Combustion Avoidance: Communication Strategies to Prevent Interpersonal Conflict</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-nursing-leadership-webinar-series-nurse-lead-106391?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Nursing Leadership Webinar Series: When Nurse Leaders Speak, Legislators Listen</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-teen-brain-decision-106392?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - The Teen Brain: Decision making, assent, and confidentiality</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/pediatric-grand-rounds-tackling-nation-s-overdose-106390?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Pediatric Grand Rounds - Tackling the Nation's Overdose Crisis: The Role of Pediatric Providers, 5/18/22</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-nursing-leadership-webinar-series-part-learn-106389?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Nursing Leadership Webinar Series - Part Three: What I Learned about Moving a Medical Center (and How it Impacted the Rest of My Nursing Career)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-trauma-webinar-series-part-acute-burn-care-2-106388?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Trauma Webinar Series Part Three: Acute Burn Care - The First 24 Hours</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/chad-pediatric-lecture-series-pediatric-covid-upd-106387?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">CHaD Pediatric Lecture Series - Pediatric COVID Update</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-trauma-webinar-series-part-geriatric-trauma--106386?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Trauma Webinar Series Part Four: Geriatric Trauma The Rising Tide</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/echo-climate-health-towards-climate-informed-care-106385?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">ECHO Climate &amp; Health: Towards Climate-Informed Care &amp; Advocacy</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/treatment-complex-chronic-pain-opioids-helping-hu-106384?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Treatment of Complex Chronic Pain: Are Opioids Helping or Hurting?</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/interprofessional-grand-rounds-s-wrong-s-trauma-106383?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Interprofessional Grand Rounds Nothing's wrong with them! It's Trauma</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li><li><a href="https://www.classcentral.com/course/2022-trauma-webinar-series-part-five-organ-donati-106382?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The 2022 Trauma Webinar Series: Part Five Organ Donation</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em></li></ul><h2 id="educa-o-e-ensino-23-"><strong>Educação e Ensino (23)</strong></h2><ul><li><a href="https://www.classcentral.com/course/edx-leaders-of-learning-2027?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Leaders of Learning</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(19)</li><li><a href="https://www.classcentral.com/course/usuniversities-1620?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Applying to U.S. Universities</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(10)</li><li><a href="https://www.classcentral.com/course/edref-2793?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">American Education Reform: History, Policy, Practice</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(9)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-family-engagement-in-education-6513?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Family Engagement in Education</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(8)</li><li><a href="https://www.classcentral.com/course/edx-saving-schools-mini-course-1-history-and-politics-of-u-s-education-2365?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Saving Schools Mini-Course 1: History and Politics of U.S. Education</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/edx-the-science-of-learning-what-every-teacher-should-know-5725?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science of Learning - What Every Teacher Should Know</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-saving-schools-reforming-the-u-s-education-system-8616?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Saving Schools: Reforming the U.S. Education System</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-introduction-to-data-wise-a-collaborative-process-to-improve-learning-teaching-3395?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Data Wise: A Collaborative Process to Improve Learning &amp; Teaching</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-saving-schools-mini-course-3-accountability-and-national-standards-2695?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Saving Schools, Mini-Course 3: Accountability and National Standards</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-saving-schools-mini-course-4-school-choice-2696?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Saving Schools Mini-Course 4: School Choice</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-saving-schools-mini-course-2-teacher-policies-2812?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Saving Schools, Mini-Course 2: Teacher Policies</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/classdiscussion-7421?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Orchestrating Whole Classroom Discussion</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-teaching-learning-in-the-diverse-classroom-15171?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Teaching &amp; Learning in the Diverse Classroom</a>, da <em>Universidade de</em> <em><em>Cornell</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/canvas-network-analytics-in-course-design-leveraging-canvas-data-he-6668?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Analytics in Course Design: Leveraging Canvas Data (HE)</a>, da <em>Faculdade de</em> <em><em>Dartmouth</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/edx-biograph-teaching-biology-through-systems-models-argumentation-13796?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">BioGraph: Teaching Biology Through Systems, Models, &amp; Argumentation</a>, do <em>Instituto de Tecnologia de</em> <em><em>Massachusetts</em></em></li><li><a href="https://www.classcentral.com/course/edx-understanding-classroom-interaction-7198?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Understanding Classroom Interaction</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/edx-innovating-instruction-reimagining-teaching-with-technology-8019?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Innovating Instruction: Reimagining Teaching with Technology</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-attaining-higher-education-13336?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Attaining Higher Education</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-inclusive-teaching-supporting-all-students-in-the-college-classroom-13690?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Inclusive Teaching: Supporting All Students in the College Classroom</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/learning-success-21907?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Learning Success</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-university-studies-for-student-veterans-9129?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">University Studies for Student Veterans</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/supporting-veteran-success-in-higher-education-62878?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Supporting Veteran Success in Higher Education</a>, da <em>Universidade de</em> <em><em>Columbia</em></em></li><li><a href="https://www.classcentral.com/course/edx-an-introduction-to-evidence-based-undergraduate-stem-teaching-6994?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">An Introduction to Evidence-Based Undergraduate STEM Teaching</a>, da <em>Universidade de</em> <em><em>Cornel</em>l</em></li></ul><h2 id="desenvolvimento-pessoal-16-"><strong>Desenvolvimento Pessoal (16)</strong></h2><ul><li><a href="https://www.classcentral.com/course/wharton-communication-skills-8235?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Improving Communication Skills</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(25)</li><li><a href="https://www.classcentral.com/course/negotiation-4336?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Introduction to Negotiation: A Strategic Playbook for Becoming a Principled and Persuasive Negotiator</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(13)</li><li><a href="https://www.classcentral.com/course/positive-psychology-resilience-8331?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Positive Psychology: Resilience Skills</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/edx-rhetoric-the-art-of-persuasive-writing-and-public-speaking-16993?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Rhetoric: The Art of Persuasive Writing and Public Speaking</a>, da <em>Universidade de</em> <em><em>Harvard</em></em> ★★★★☆(5)</li><li><a href="https://www.classcentral.com/course/wharton-succcess-6893?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Success</a> da <em>Universidade da Pensilvânia</em> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/remote-work-37070?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Remote Work Revolution for Everyone</a>, da <em>Faculdade de Negócios de</em> <em><em>Harvard</em> </em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/removing-barriers-to-change-20203?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Removing Barriers to Change</a>, da <em>Universidade da Pensilvânia</em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/do-good-feel-good-58183?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science of Generosity: Do Good...Feel Good</a>, da <em>Universidade da Pensilvânia</em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/managing-emotions-uncertainty-stress-22856?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Managing Emotions in Times of Uncertainty &amp; Stress</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/-genius-106126?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Nature of Genius</a>, da <em>Universidade de</em> <em><em>Yale</em></em> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/edx-find-your-calling-career-transition-principles-for-returning-veterans-12258?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Find Your Calling: Career Transition Principles for Returning Veterans</a>, da <em>Universidade de</em> <em><em>Columbia</em></em> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/building-personal-resilience-managing-anxiety-and-120495?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">[New] Building Personal Resilience: Managing Anxiety and Mental Health</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/managing-happiness-65624?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Managing Happiness</a>, da <em>Universidade de</em> <em><em>Harvard</em></em></li><li><a href="https://www.classcentral.com/course/the-science-of-generosity-do-goodfeel-good-48153?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">The Science of Generosity: Do Good…Feel Good</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/wharton-online-negotiations-58635?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">Negotiations</a>, da <em>Universidade da Pensilvânia</em></li><li><a href="https://www.classcentral.com/course/negotiation-ar-13419?utm_source=fcc_medium&amp;utm_medium=web&amp;utm_campaign=ivy_league_courses_2023">مقدمة عن التفاوض: دليل استراتيجي لتصبح مُفاوضًا ذا مبادئ ومُقنعًا</a> da <em>Universidade de</em> <em><em>Yale</em></em> (em árabe)</li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
