<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Andres dos Santos</title>
    <description>The latest articles on Forem by Andres dos Santos (@andresdossantos).</description>
    <link>https://forem.com/andresdossantos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3487264%2F0addc9d0-3377-4e83-b95e-1f98054c67c2.png</url>
      <title>Forem: Andres dos Santos</title>
      <link>https://forem.com/andresdossantos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/andresdossantos"/>
    <language>en</language>
    <item>
      <title>The Importance of Maintaining Standards</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Mon, 26 Jan 2026 14:11:13 +0000</pubDate>
      <link>https://forem.com/andresdossantos/the-importance-of-maintaining-standards-4422</link>
      <guid>https://forem.com/andresdossantos/the-importance-of-maintaining-standards-4422</guid>
      <description>&lt;p&gt;In this post, I want to talk a bit about &lt;strong&gt;productivity, safety, and scalability&lt;/strong&gt;, and also about &lt;strong&gt;structure&lt;/strong&gt;. A good folder structure helps guarantee all of that in your code.&lt;/p&gt;

&lt;p&gt;My goal is to make you leave here thinking:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;“From today on, I will help my team standardize a good folder and file structure.”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code is read far more than it is written
&lt;/h3&gt;

&lt;p&gt;A good standard makes this possible: someone looks at the project and immediately understands where everything is, without asking anyone.  &lt;/p&gt;

&lt;p&gt;The structure becomes a &lt;strong&gt;mental map&lt;/strong&gt;, where following that path guarantees you’ll find the information you need.&lt;/p&gt;

&lt;p&gt;Navigation becomes automatic:  &lt;/p&gt;

&lt;p&gt;“Okay, I need to go here, access this, enter that folder, click here — done.”&lt;/p&gt;

&lt;p&gt;Without a standard, you waste time looking for files:  &lt;/p&gt;

&lt;p&gt;“Hmm, I need to go here… but now what? Maybe I should ask someone… oh, they’re in a meeting. I’ll have to wait.”&lt;/p&gt;

&lt;p&gt;And many times, the company itself becomes hostage to the people who know where everything is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduces errors (especially in large projects)
&lt;/h3&gt;

&lt;p&gt;Without standards, things like this start to appear:&lt;br&gt;&lt;br&gt;
&lt;code&gt;userService&lt;/code&gt;, &lt;code&gt;User_service&lt;/code&gt;, &lt;code&gt;serviceUser&lt;/code&gt;, or even &lt;code&gt;utils&lt;/code&gt;, &lt;code&gt;helpers&lt;/code&gt;, &lt;code&gt;common&lt;/code&gt;, &lt;code&gt;misc&lt;/code&gt; — all meaning roughly the same thing.&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  duplicated logic&lt;/li&gt;
&lt;li&gt;  wrong files being imported&lt;/li&gt;
&lt;li&gt;  “mysterious” bugs that exist only because someone got lost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A standard prevents errors &lt;strong&gt;before they even exist&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Makes maintenance and refactoring easier
&lt;/h3&gt;

&lt;p&gt;When folders follow a clear rule (by layer, by domain, or by feature):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  you know where to make changes&lt;/li&gt;
&lt;li&gt;  you know what might break&lt;/li&gt;
&lt;li&gt;  refactoring stops being a risk and becomes a task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a standard, changing code feels like this:  &lt;/p&gt;

&lt;p&gt;“I’ll touch this and hope nothing breaks.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Helps the team (and your reputation)
&lt;/h3&gt;

&lt;p&gt;This is important for your career.&lt;/p&gt;

&lt;p&gt;A well-structured project sends a clear message:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  “This person thinks before writing code”&lt;/li&gt;
&lt;li&gt;  “This code is maintainable”&lt;/li&gt;
&lt;li&gt;  “This isn’t hidden chaos that only the author understands”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leaders trust people who deliver organized code.  &lt;/p&gt;

&lt;p&gt;Even if no one praises it, &lt;strong&gt;everyone notices&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scales the project — and scales you
&lt;/h3&gt;

&lt;p&gt;Small projects can “tolerate” mess.  &lt;/p&gt;

&lt;p&gt;Real projects can’t.&lt;/p&gt;

&lt;p&gt;If you’re just starting an app, you don’t need to obsess over patterns — just write code.  &lt;/p&gt;

&lt;p&gt;But once your app has a solid user base, you &lt;strong&gt;must&lt;/strong&gt; start standardizing things.&lt;/p&gt;

&lt;p&gt;Here’s a tip:  &lt;/p&gt;

&lt;p&gt;If your company struggles with this and you want to grow there — or move to a bigger company — standards stop being optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  A standard is not rigidity, it’s an agreement
&lt;/h3&gt;

&lt;p&gt;This isn’t about the &lt;em&gt;perfect&lt;/em&gt; standard.  &lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;having a standard and following it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It can vary from company to company — and still work very well.&lt;/p&gt;

&lt;p&gt;An average standard + consistency  &lt;/p&gt;

&lt;p&gt;is infinitely better than a brilliant standard that no one follows.&lt;/p&gt;

&lt;p&gt;That’s it, folks. It’s not much, but it’s honest 😂&lt;/p&gt;

&lt;p&gt;Standardizing names and folders reduces time, errors, and maintenance costs, while allowing the project to grow without becoming technical debt.&lt;/p&gt;

&lt;p&gt;And remember:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;it doesn’t matter which standard you use — what matters is following one.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What To Expect For My 2026</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Wed, 21 Jan 2026 01:26:51 +0000</pubDate>
      <link>https://forem.com/andresdossantos/what-to-expect-for-my-2026-2gci</link>
      <guid>https://forem.com/andresdossantos/what-to-expect-for-my-2026-2gci</guid>
      <description>&lt;p&gt;Let’s go. This is me being as honest as I can with myself.&lt;/p&gt;

&lt;p&gt;2026 is just another year. Time will pass, and before I realize it, it’ll already be 2027. That doesn’t mean I shouldn’t plan — quite the opposite. A lot can be done in 8,760 hours.&lt;/p&gt;

&lt;p&gt;So here are my plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build a solid technical foundation (without trying to know everything)
&lt;/h3&gt;

&lt;p&gt;This matters to me. I want to master a main stack — in my mind, Spring with React. I want clarity around code organization, to truly understand the decisions I make, and to be able to explain the trade-offs behind them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Work-oriented, functional English
&lt;/h3&gt;

&lt;p&gt;Maybe the most life-changing goal. I want to clearly explain problems, risks, and decisions. To be able to say “no” from a technical standpoint. To speak correctly, calmly, without rushing.&lt;/p&gt;

&lt;h3&gt;
  
  
  A professional profile that actually represents me
&lt;/h3&gt;

&lt;p&gt;I want a resume focused on impact, not task lists. I want my LinkedIn in English and a clean, well-organized GitHub with projects that make sense and tell a story.&lt;/p&gt;

&lt;p&gt;That’s it.  &lt;/p&gt;

&lt;p&gt;No overexplaining. Broad, but intentional.  &lt;/p&gt;

&lt;p&gt;Now it’s time to work, day after day, to make this real.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What To Expect For My 2026</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Wed, 21 Jan 2026 01:20:01 +0000</pubDate>
      <link>https://forem.com/andresdossantos/what-to-expect-for-my-2026-1fp0</link>
      <guid>https://forem.com/andresdossantos/what-to-expect-for-my-2026-1fp0</guid>
      <description>&lt;p&gt;Let’s go.  &lt;/p&gt;

&lt;p&gt;This is me being as honest as I can with myself.&lt;/p&gt;

&lt;p&gt;2026 is just another year. Time will pass, and before I realize it, it’ll already be 2027.  &lt;/p&gt;

&lt;p&gt;That doesn’t mean I shouldn’t plan — quite the opposite. A lot can be done in 8,760 hours.&lt;/p&gt;

&lt;p&gt;So here are my plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build a solid technical foundation (without trying to know everything)
&lt;/h3&gt;

&lt;p&gt;This matters to me. I want to master a main stack — in my mind, Spring with React. I want clarity around code organization, to truly understand the decisions I make, and to be able to explain the trade-offs behind them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Work-oriented, functional English
&lt;/h3&gt;

&lt;p&gt;Maybe the most life-changing goal. I want to clearly explain problems, risks, and decisions. To be able to say “no” from a technical standpoint. To speak correctly, calmly, without rushing.&lt;/p&gt;

&lt;h3&gt;
  
  
  A professional profile that actually represents me
&lt;/h3&gt;

&lt;p&gt;I want a resume focused on impact, not task lists. I want my LinkedIn in English and a clean, well-organized GitHub with projects that make sense and tell a story.&lt;/p&gt;

&lt;p&gt;That’s it.  &lt;/p&gt;

&lt;p&gt;No overexplaining. Broad, but intentional.  &lt;/p&gt;

&lt;p&gt;Now it’s time to work, day after day, to make this real.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What To Expect For My 2026</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Sun, 18 Jan 2026 18:45:12 +0000</pubDate>
      <link>https://forem.com/andresdossantos/what-to-expect-for-my-2026-43lj</link>
      <guid>https://forem.com/andresdossantos/what-to-expect-for-my-2026-43lj</guid>
      <description>&lt;p&gt;Well, here goes a bit of what I expect for my 2026.&lt;/p&gt;

&lt;p&gt;By the end of the year, I hope to come back here and see that I’ve accomplished everything I promised, so let’s go.&lt;/p&gt;

&lt;h3&gt;
  
  
  At work
&lt;/h3&gt;

&lt;p&gt;I work at a bank, so what I expect is to learn a lot about the financial market — about PIX, P2P transactions, cards, boletos, and more.&lt;/p&gt;

&lt;p&gt;One concern of mine is code organization. Well-structured code makes sense and helps with testing and maintainability.&lt;/p&gt;

&lt;p&gt;I don’t need to push this too far — that’s it.&lt;/p&gt;

&lt;h3&gt;
  
  
  In my studies
&lt;/h3&gt;

&lt;p&gt;My plan here is to improve in algorithms and data structures. It’s an interesting topic and has real value in the programming field.&lt;/p&gt;

&lt;p&gt;In addition, I’ve been learning more about PHP syntax and English. This year, I intend to reach the end of the year speaking well enough to confidently take interviews abroad.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Let’s go, 2026.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What to expect for my 2026</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Sun, 18 Jan 2026 18:41:23 +0000</pubDate>
      <link>https://forem.com/andresdossantos/what-to-expect-for-my-2026-jd</link>
      <guid>https://forem.com/andresdossantos/what-to-expect-for-my-2026-jd</guid>
      <description>&lt;p&gt;Well, here goes a bit of what I expect for my 2026.&lt;/p&gt;

&lt;p&gt;By the end of the year, I hope to come back here and see that I’ve done everything I promised, so let’s go.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;At work&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I work at CDC Bank, so what I expect is to learn a lot about the financial market — about PIX, P2P transactions, cards, boletos, and so on.  &lt;/p&gt;

&lt;p&gt;One concern of mine is code organization; well-structured code makes sense and helps with testing and maintainability.  &lt;/p&gt;

&lt;p&gt;I don’t need to push this too far — that’s it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;In my studies&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My plan here is to improve in algorithms and data structures. It’s an interesting topic and has real value in the programming field.  &lt;/p&gt;

&lt;p&gt;Besides that, I’ve been learning more about PHP syntax, and of course there’s always a good course to take.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Let’s go, 2026.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cliente x servidor, entendendo tudo</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Sun, 11 Jan 2026 17:02:18 +0000</pubDate>
      <link>https://forem.com/andresdossantos/cliente-x-servidor-entendendo-tudo-4moc</link>
      <guid>https://forem.com/andresdossantos/cliente-x-servidor-entendendo-tudo-4moc</guid>
      <description>&lt;p&gt;Fala dev, nesse post nós vamos aprender tudo sobre o modelo cliente e servidor, desde como ele funciona até tecnologias usadas tanto no cliente quanto no servidor.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;modelo cliente x servidor&lt;/strong&gt;, o cliente (como um PC ou celular) faz uma requisição solicitando um serviço, e o servidor, que permanece ativo continuamente, recebe essa requisição, processa e devolve uma resposta.&lt;/p&gt;

&lt;p&gt;Esse fluxo caracteriza o ciclo de &lt;strong&gt;requisição e resposta&lt;/strong&gt;, permitindo que o usuário acesse funcionalidades e dados de forma remota.&lt;/p&gt;

&lt;p&gt;Para organizar melhor o sistema, essa arquitetura evoluiu para o &lt;strong&gt;modelo em camadas&lt;/strong&gt;, no qual cada parte tem uma responsabilidade bem definida.&lt;/p&gt;

&lt;p&gt;Inicialmente existia o modelo de &lt;strong&gt;duas camadas&lt;/strong&gt;, onde o cliente cuidava da interface e da lógica de negócio, enquanto o servidor era responsável pelos dados.&lt;/p&gt;

&lt;p&gt;Com o crescimento das aplicações, surgiu o modelo de &lt;strong&gt;três ou quatro camadas&lt;/strong&gt;, separando apresentação, lógica de negócio e dados.&lt;/p&gt;

&lt;p&gt;Nesse modelo mais moderno, o cliente precisa apenas de um navegador, o &lt;strong&gt;servidor web&lt;/strong&gt; cuida da interface e da comunicação, o &lt;strong&gt;servidor de aplicação&lt;/strong&gt; centraliza as regras de negócio e o &lt;strong&gt;servidor de dados&lt;/strong&gt; armazena as informações.&lt;/p&gt;

&lt;p&gt;Essa separação facilita manutenção, escalabilidade e atualização do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  O ambiente web
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;ambiente web&lt;/strong&gt;, baseado no modelo de &lt;strong&gt;quatro camadas&lt;/strong&gt;, o cliente não precisa instalar softwares adicionais: a interface da aplicação é fornecida pelo &lt;strong&gt;servidor web&lt;/strong&gt; e executada diretamente no navegador ou em aplicativos mobile.&lt;/p&gt;

&lt;p&gt;Além dele, existem servidores específicos para &lt;strong&gt;lógica de aplicação&lt;/strong&gt; e &lt;strong&gt;dados&lt;/strong&gt;, que podem estar juntos ou distribuídos, sem que o cliente perceba essa separação.&lt;/p&gt;

&lt;p&gt;Com a evolução das redes internas para a &lt;strong&gt;internet&lt;/strong&gt;, as aplicações passaram a ser acessadas por diversos dispositivos, permitindo que usuários consumam serviços a partir de navegadores e apps.&lt;/p&gt;

&lt;p&gt;A comunicação entre cliente e servidor acontece principalmente por meio do protocolo &lt;strong&gt;HTTP&lt;/strong&gt;, seguindo o modelo de &lt;strong&gt;requisição (request)&lt;/strong&gt; e &lt;strong&gt;resposta (response)&lt;/strong&gt;, podendo também incluir comunicações iniciadas pelo servidor, como notificações &lt;em&gt;push.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nesse contexto, falamos em &lt;strong&gt;client side&lt;/strong&gt; para tudo que é processado no dispositivo do usuário e em &lt;strong&gt;server side&lt;/strong&gt; para o que é executado no servidor, mantendo responsabilidades bem definidas e facilitando a escalabilidade das aplicações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demonstração prática da arquitetura cliente x servidor
&lt;/h3&gt;

&lt;p&gt;Segue um &lt;strong&gt;exemplo passo a passo&lt;/strong&gt;, do momento em que você acessa um site até receber a resposta, no modelo cliente x servidor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Você digita o endereço do site (URL) no navegador e pressiona &lt;strong&gt;Enter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  O navegador (cliente) consulta o &lt;strong&gt;DNS&lt;/strong&gt; para descobrir qual é o endereço IP do servidor daquele site&lt;/li&gt;
&lt;li&gt;  Com o IP em mãos, o navegador abre uma conexão com o &lt;strong&gt;servidor web&lt;/strong&gt; pela internet&lt;/li&gt;
&lt;li&gt;  O navegador envia uma &lt;strong&gt;requisição HTTP (request)&lt;/strong&gt; solicitando a página&lt;/li&gt;
&lt;li&gt;  O &lt;strong&gt;servidor web&lt;/strong&gt; recebe a requisição&lt;/li&gt;
&lt;li&gt;  Se necessário, o servidor web encaminha a requisição para o &lt;strong&gt;servidor de aplicação&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  O servidor de aplicação executa a &lt;strong&gt;lógica de negócio&lt;/strong&gt; (valida dados, regras, permissões, etc.)&lt;/li&gt;
&lt;li&gt;  Caso precise de informações, o servidor de aplicação consulta o &lt;strong&gt;servidor de dados&lt;/strong&gt; (banco de dados)&lt;/li&gt;
&lt;li&gt;  O servidor de dados retorna as informações solicitadas&lt;/li&gt;
&lt;li&gt;  O servidor de aplicação processa os dados e monta a resposta&lt;/li&gt;
&lt;li&gt;  O servidor web recebe essa resposta e gera o conteúdo final (HTML, CSS, JS ou JSON)&lt;/li&gt;
&lt;li&gt;  O servidor envia a &lt;strong&gt;resposta HTTP (response)&lt;/strong&gt; de volta ao navegador&lt;/li&gt;
&lt;li&gt;  O navegador interpreta a resposta e &lt;strong&gt;renderiza a página&lt;/strong&gt; para o usuário&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse fluxo acontece em milissegundos e se repete várias vezes enquanto você navega pelo site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visão geral de interface de usuários
&lt;/h3&gt;

&lt;p&gt;Interfaces de usuário são a ponte entre pessoas e aplicações.&lt;/p&gt;

&lt;p&gt;Uma boa interface precisa ser &lt;strong&gt;clara&lt;/strong&gt;, &lt;strong&gt;intuitiva&lt;/strong&gt; e oferecer &lt;strong&gt;boa usabilidade&lt;/strong&gt;, garantindo uma experiência positiva para o usuário.&lt;/p&gt;

&lt;p&gt;Esse conceito está diretamente ligado à &lt;strong&gt;Interação Humano-Computador (IHC)&lt;/strong&gt;, área que estuda como pessoas interagem com sistemas computacionais.&lt;/p&gt;

&lt;p&gt;No início, o foco era o hardware e o software, exigindo que o usuário se adaptasse ao sistema.&lt;/p&gt;

&lt;p&gt;Com a popularização dos computadores e, principalmente, dos &lt;strong&gt;smartphones&lt;/strong&gt;, o foco passou a ser o inverso: adaptar o sistema ao usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  A interface do lado do cliente
&lt;/h3&gt;

&lt;p&gt;Do ponto de vista da usabilidade, a interface do cliente deve seguir os princípios de &lt;strong&gt;design responsivo&lt;/strong&gt;, permitindo que aplicações web se adaptem a diferentes dispositivos e tamanhos de tela sem perda de informação.&lt;/p&gt;

&lt;p&gt;Dados de utilização de tamanhos de tela (abril/2019 a abril/2020) mostram a diversidade de dispositivos que precisam ser considerados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tamanho da tela (px)&lt;/th&gt;
&lt;th&gt;Uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;360 x 640&lt;/td&gt;
&lt;td&gt;10,11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1366 x 768&lt;/td&gt;
&lt;td&gt;9,69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1920 x 1080&lt;/td&gt;
&lt;td&gt;8,4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;375 x 667&lt;/td&gt;
&lt;td&gt;4,24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;414 x 896&lt;/td&gt;
&lt;td&gt;3,62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1536 x 864&lt;/td&gt;
&lt;td&gt;3,57%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esses números reforçam a importância de interfaces flexíveis, pensadas desde o início para múltiplos contextos de uso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design responsivo
&lt;/h3&gt;

&lt;p&gt;Com o surgimento de dispositivos com diferentes tamanhos de tela, surgiu o &lt;strong&gt;design responsivo&lt;/strong&gt;, cujo objetivo é adaptar páginas e aplicações web ao dispositivo do usuário, oferecendo melhor experiência.&lt;/p&gt;

&lt;p&gt;Segundo Knight (2011), design responsivo é a abordagem em que design e desenvolvimento respondem ao comportamento e ao ambiente do usuário, considerando tamanho de tela, plataforma e orientação.&lt;/p&gt;

&lt;p&gt;Na prática, isso evita a criação de múltiplas versões de uma mesma aplicação para dispositivos diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout fixo x layout fluido
&lt;/h3&gt;

&lt;p&gt;Para entender o design responsivo, é importante conhecer seu oposto: o layout fixo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Layout fixo&lt;/strong&gt; - Utiliza unidades fixas (como pixels) para definir dimensões. Os elementos não se adaptam a diferentes tamanhos de tela.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Layout fluido (responsivo)&lt;/strong&gt; - Utiliza unidades flexíveis, permitindo adaptação ao tamanho da tela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As unidades mais comuns são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;&lt;strong&gt;%&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;(percentual)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;EM&lt;/strong&gt;: relativo ao tamanho da fonte do elemento pai&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;REM&lt;/strong&gt;: relativo ao tamanho da fonte do elemento raiz (&lt;code&gt;html&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Media queries
&lt;/h3&gt;

&lt;p&gt;As &lt;em&gt;media queries&lt;/em&gt; permitem aplicar estilos condicionais conforme características do dispositivo.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, um menu lateral é ocultado em telas menores que 360px:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media (max-width:360px) {
.menu_lateral {
display: none;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A condição será verdadeira quando a largura da tela for inferior a 360px. Caso contrário, o CSS será ignorado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripts
&lt;/h3&gt;

&lt;p&gt;No lado cliente, scripts são linguagens executadas no navegador, sendo o &lt;strong&gt;JavaScript&lt;/strong&gt; o principal exemplo.&lt;/p&gt;

&lt;p&gt;Ele permite adicionar interatividade à página, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Atualização dinâmica de conteúdo&lt;/li&gt;
&lt;li&gt;  Controle de multimídia&lt;/li&gt;
&lt;li&gt;  Animações&lt;/li&gt;
&lt;li&gt;  Manipulação de eventos e dados&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Design responsivo x design adaptativo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Design responsivo&lt;/strong&gt; - ****Utiliza &lt;em&gt;media queries&lt;/em&gt; e scripts para criar layouts fluidos que se adaptam dinamicamente.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Design adaptativo&lt;/strong&gt; - ****Trabalha com layouts estáticos baseados em pontos de quebra, carregando versões específicas conforme o tamanho da tela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De forma geral, o design responsivo é mais flexível, enquanto o adaptativo tende a ser mais trabalhoso e menos dinâmico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile first
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;mobile first&lt;/strong&gt; é uma abordagem muito utilizada no design responsivo atual.&lt;/p&gt;

&lt;p&gt;Ela propõe que o design seja pensado primeiro para dispositivos móveis e, depois, expandido para telas maiores.&lt;/p&gt;

&lt;p&gt;Esse modelo segue o conceito de &lt;strong&gt;progressive enhancement&lt;/strong&gt;, adicionando recursos conforme o tamanho e a capacidade do dispositivo aumentam.&lt;/p&gt;

&lt;p&gt;Em contraste, o modelo tradicional segue a &lt;strong&gt;graceful degradation&lt;/strong&gt;, onde o site é pensado para telas grandes e depois adaptado para dispositivos menores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na prática, mobile first significa priorizar limitações e recursos dos dispositivos móveis, como tamanho de tela, largura de banda e funcionalidades específicas (ex: localização).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  As tecnologias HTML
&lt;/h3&gt;

&lt;p&gt;HTML (&lt;em&gt;HyperText Markup Language&lt;/em&gt;) é a linguagem usada para estruturar páginas web.&lt;/p&gt;

&lt;p&gt;Trata-se de uma linguagem de marcação simples, composta por &lt;strong&gt;tags&lt;/strong&gt; que dão significado a textos e outros conteúdos.&lt;/p&gt;

&lt;p&gt;Além de marcar conteúdo, o HTML define a estrutura lógica do documento, como cabeçalho, menu de navegação, seções e rodapé.&lt;/p&gt;

&lt;p&gt;As tags podem ser classificadas em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Estruturais&lt;/strong&gt; – Em conjunto com o &lt;em&gt;DocType&lt;/em&gt;, formam a estrutura básica e obrigatória da página.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;De conteúdo&lt;/strong&gt; – Marcam o conteúdo de acordo com seu tipo (texto, imagem, links, etc.).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Semânticas&lt;/strong&gt; – Organizam o conteúdo em seções com significado, de acordo com sua função no documento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apesar do HTML5 permitir alguns ajustes visuais, o &lt;strong&gt;CSS&lt;/strong&gt; é a ferramenta mais adequada para controlar estilo e identidade visual, especialmente em aplicações com múltiplas páginas.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS
&lt;/h3&gt;

&lt;p&gt;CSS (&lt;em&gt;Cascading Style Sheets&lt;/em&gt;) é uma linguagem declarativa responsável pela apresentação visual das páginas web.&lt;/p&gt;

&lt;p&gt;Enquanto o HTML cuida da &lt;strong&gt;estrutura e do conteúdo&lt;/strong&gt;, o CSS define &lt;strong&gt;cores, layout, tipografia e responsividade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dominar sua sintaxe e aplicação é essencial para criar interfaces consistentes e reutilizáveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  JS
&lt;/h3&gt;

&lt;p&gt;JavaScript é uma linguagem de programação interpretada pelo navegador e amplamente utilizada no desenvolvimento web.&lt;/p&gt;

&lt;p&gt;Ela é &lt;strong&gt;multiparadigma&lt;/strong&gt; (orientada a objetos, funcional, baseada em protótipos) e tem como principal objetivo adicionar &lt;strong&gt;interatividade&lt;/strong&gt; às páginas.&lt;/p&gt;

&lt;p&gt;O JavaScript permite comunicação assíncrona com o servidor e atualização dinâmica de conteúdo, evitando recarregamentos completos da página.&lt;/p&gt;

&lt;p&gt;Nesse ponto, vale estudar sua sintaxe, manipulação do DOM e até bibliotecas como &lt;strong&gt;jQuery&lt;/strong&gt;, dependendo do contexto do projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tecnologias no lado do servidor: o PHP
&lt;/h3&gt;

&lt;p&gt;PHP é uma linguagem de programação utilizada no &lt;strong&gt;lado do servidor&lt;/strong&gt;, assim como Java ou Python, e muito aplicada no desenvolvimento web.&lt;/p&gt;

&lt;p&gt;Com PHP é possível processar requisições de clientes, integrar aplicações a bancos de dados e trabalhar com diferentes paradigmas, incluindo &lt;strong&gt;orientação a objetos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por ser uma linguagem &lt;strong&gt;interpretada&lt;/strong&gt;, o PHP precisa de um servidor web para ser executado.&lt;/p&gt;

&lt;p&gt;Um ponto fundamental é que o código PHP é processado no servidor e convertido em &lt;strong&gt;HTML&lt;/strong&gt;, de forma que o usuário final visualiza apenas o resultado gerado, nunca o código fonte original.&lt;/p&gt;

&lt;p&gt;PHP (&lt;em&gt;Hypertext Preprocessor&lt;/em&gt;) é open source e focada principalmente na criação de aplicações web dinâmicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como o PHP funciona
&lt;/h3&gt;

&lt;p&gt;O funcionamento do PHP ocorre inteiramente no servidor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; O código PHP é interpretado pelo servidor web.&lt;/li&gt;
&lt;li&gt; O resultado é convertido em HTML.&lt;/li&gt;
&lt;li&gt; O HTML gerado é enviado e exibido no navegador.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso garante que o código fonte PHP permaneça oculto no lado cliente.&lt;/p&gt;

&lt;p&gt;Além disso, o PHP é multiplataforma e compatível com diversos servidores web, como &lt;strong&gt;Apache&lt;/strong&gt;, &lt;strong&gt;Nginx&lt;/strong&gt; e &lt;strong&gt;IIS&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Páginas dinâmicas e acesso a dados
&lt;/h3&gt;

&lt;p&gt;Com a evolução da web, surgiu a necessidade de gerar conteúdo de forma dinâmica, como acontece em redes sociais, e-commerces, sistemas bancários e plataformas de streaming.&lt;/p&gt;

&lt;p&gt;Páginas dinâmicas permitem que usuários interajam com a aplicação, enviando e recebendo dados em tempo real.&lt;/p&gt;

&lt;p&gt;Em um blog, por exemplo, comentários, curtidas e conteúdos podem ser processados e armazenados dinamicamente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A combinação de tecnologias do lado cliente com tecnologias do lado servidor é o que torna possíveis as páginas dinâmicas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse modelo, os dados podem ser recebidos, processados, armazenados e reutilizados sempre que necessário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acesso a dados
&lt;/h3&gt;

&lt;p&gt;Além do cliente e do servidor, o ambiente web inclui o &lt;strong&gt;banco de dados&lt;/strong&gt;, responsável por armazenar informações de forma estruturada.&lt;/p&gt;

&lt;p&gt;No lado servidor, o PHP atua como intermediário entre a aplicação e o banco de dados, permitindo salvar, recuperar e manipular informações que sustentam o funcionamento de aplicações web modernas.&lt;/p&gt;

</description>
      <category>client</category>
    </item>
    <item>
      <title>Entendendo o event loop do NodeJS</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Tue, 14 Oct 2025 14:48:59 +0000</pubDate>
      <link>https://forem.com/andresdossantos/entendendo-o-event-loop-do-nodejs-32le</link>
      <guid>https://forem.com/andresdossantos/entendendo-o-event-loop-do-nodejs-32le</guid>
      <description>&lt;p&gt;Fala!&lt;/p&gt;

&lt;p&gt;Hoje eu quero que você entenda o &lt;em&gt;event loop&lt;/em&gt;, vou te explicar o que você precisa saber para mandar bem nas entrevistas e entender o coração do &lt;em&gt;Node&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Como o nome diz o event loop é um laço de eventos responsável por gerenciar quando e como seu código é executado — especialmente quando tem tarefas assíncronas.&lt;/p&gt;

&lt;p&gt;Tá, mas o que é uma tarefa assíncrona?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Ler um arquivo do disco&lt;/li&gt;
&lt;li&gt;  Esperar uma resposta HTTP&lt;/li&gt;
&lt;li&gt;  Esperar um &lt;code&gt;setTimeout&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Consultar banco de dados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Importante, isso quer dizer que ele pode executar outros processos enquanto consulta dados no banco ou espera uma resposta HTTP.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;Node&lt;/em&gt;, por exemplo, é &lt;em&gt;single-threaded&lt;/em&gt; (roda em uma thread principal), mas ele usa o &lt;em&gt;event loop&lt;/em&gt; para parecer que faz várias coisas ao mesmo tempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  A ideia principal
&lt;/h3&gt;

&lt;p&gt;Agora vou te mostrar a ideia principal do Node e é onde fica a escalabilidade dele e de outras linguagens como o &lt;em&gt;Python&lt;/em&gt; e &lt;em&gt;Java&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O &lt;em&gt;Node&lt;/em&gt; recebe um evento, como uma requisição HTTP — &lt;em&gt;event queue&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;O _callback_associado a esse evento é enviado para execução  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Se for algo demorado do tipo acessar banco ele é delegada para as &lt;em&gt;threads do libuv.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Enquanto isso, o event loop continua livre para processar outros eventos.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Quando a operação assíncrona termina, o resultado é colocado de volta na &lt;em&gt;fila de callbacks&lt;/em&gt;, e o event loop chama o &lt;em&gt;callback&lt;/em&gt; correspondente.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;O ciclo se repete indefinidamente — o loop nunca para, a menos que não haja mais nada para processar.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Node&lt;/em&gt; manda o evento assíncrono para uma thread secundária sem travar a fila. Quando a &lt;em&gt;thread&lt;/em&gt; termina, o resultado do evento é enviado de volta para o loop principal e o &lt;em&gt;callback&lt;/em&gt; é executado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fases do &lt;em&gt;event loop&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Node&lt;/em&gt; executa todas essas fases, mas se não tiver processo nenhum ele pula ela, por exemplo, a fase 1 que é o timer, se não tiver um &lt;code&gt;setTimeout&lt;/code&gt; ou &lt;code&gt;setInterval&lt;/code&gt; no seu código ele pula essa fase.&lt;/p&gt;

&lt;p&gt;Ele divide a execução de &lt;em&gt;callbacks&lt;/em&gt; nessas fases e o loop vai passando por elas de forma cíclica enquanto houver tarefas para executar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Timers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setInterval&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;) — só executa se estiver no código.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Execulta &lt;em&gt;callbacks&lt;/em&gt; de temporizadores cujo tempo já expirou.&lt;/li&gt;
&lt;li&gt; &lt;em&gt;Callback&lt;/em&gt; de 0ms não é instantâneo: ele entra na fila de timers e só é executado quando o loop chegar nessa fase.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;em&gt;Pending callbacks&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Trata &lt;em&gt;callbacks&lt;/em&gt; de operações assíncronas do sistema, como erros TCP ou algumas operações de I/O.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;em&gt;Idle, Prepare&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Fase interna do &lt;em&gt;Node&lt;/em&gt;, não interagimos com ela diretamente&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;em&gt;Poll&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(a mais importante)  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Fica esperando eventos de I/O (rede, arquivos, timers expirados, etc).&lt;/li&gt;
&lt;li&gt; Se houver &lt;em&gt;callbacks&lt;/em&gt; prontos, ele os executa aqui&lt;/li&gt;
&lt;li&gt; Se não hover nada, ele espera ou vai para a fase de check (&lt;code&gt;setImmediate&lt;/code&gt;) dependendo do estado do loop.&lt;/li&gt;
&lt;li&gt; A leitura é feita no &lt;em&gt;poll&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; Quando termina o callback é chamado.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;em&gt;Check&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setImmediate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;)  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Sempre executa após o &lt;em&gt;poll&lt;/em&gt;, mesmo que esteja vazio&lt;/li&gt;
&lt;li&gt; Útil quando você quer rodar algo assim que o I/O atual terminar.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;em&gt;Close callbacks&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Chamado quando algo é fechado, como sockets.&lt;/li&gt;
&lt;li&gt; Sempre executa após o fechamento da conexão.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Algo importante de entender é isso…&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;event loop&lt;/em&gt; do &lt;em&gt;Node&lt;/em&gt; passa por todas as fases em ciclo contínuo, mas cada fase só faz algo se houver &lt;em&gt;callbacks&lt;/em&gt; na fila correspondente.&lt;/p&gt;

&lt;p&gt;Caso contrário, o &lt;em&gt;Node&lt;/em&gt; simplesmente pula para a próxima fase.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loop Infinito:

  1️⃣ Timers -&amp;gt; executa setTimeout/setInterval vencidos, senão pula
  2️⃣ I/O callbacks -&amp;gt; executa callbacks de operações I/O concluídas, senão pula
  3️⃣ Idle, prepare -&amp;gt; interno do Node, pouca coisa pra dev ver
  4️⃣ Poll -&amp;gt; verifica se há novas operações de I/O, senão aguarda
  5️⃣ Check -&amp;gt; executa setImmediate, senão pula
  6️⃣ Close callbacks -&amp;gt; executa callbacks de fechamento de sockets, senão pula
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Então sim, todas as fases são "visitadas" em cada loop, mas só executam algo se tiver trabalho correspondente.&lt;/p&gt;

&lt;p&gt;Bom pessoal é isso, espero que isso tenha te ajudado a entender.&lt;/p&gt;

</description>
      <category>node</category>
    </item>
    <item>
      <title>Camadas de aplicação e transporte</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Tue, 07 Oct 2025 02:25:54 +0000</pubDate>
      <link>https://forem.com/andresdossantos/camadas-de-aplicacao-e-transporte-2doi</link>
      <guid>https://forem.com/andresdossantos/camadas-de-aplicacao-e-transporte-2doi</guid>
      <description>&lt;p&gt;Quando realizamos uma compra com cartão de crédito ou débito em um estabelecimento comercial, é fundamental a existência de uma rede de comunicação, já que ela será o alicerce para execução da operação.&lt;/p&gt;

&lt;p&gt;Ao inseri-lo na máquina de cartão, precisamos colocar uma senha para confirmar a operação.&lt;/p&gt;

&lt;p&gt;Tal dado é inserido no sistema por meio de um software executado nessa máquina. Nesse caso, o software é executado na camada de aplicação.&lt;/p&gt;

&lt;p&gt;Portanto, sempre que houver um serviço na rede, virá à mente a interface com ele.&lt;/p&gt;

&lt;p&gt;Ressaltamos que a camada de aplicação é aquela de mais alto nível do modelo OSI, fazendo a interface com os usuários do sistema e realizando as tarefas que eles desejam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura cliente-servidor
&lt;/h3&gt;

&lt;p&gt;Nesta arquitetura, há pelo menos duas entidades: um cliente e um servidor.&lt;/p&gt;

&lt;p&gt;O servidor executa operações continuamente aguardando por requisições do(s) cliente(s). O mais comum, é que hajam diversos clientes e um único servidor.&lt;/p&gt;

&lt;p&gt;Quando um dos clientes precisa que o trabalho seja realizado pelo servidor, ele monta uma mensagem, especificando o que deve ser realizado.&lt;/p&gt;

&lt;p&gt;Quando a mensagem está montada, é enviada ao servidor por intermédio de algum sistema de comunicação (internet).&lt;/p&gt;

&lt;p&gt;Este recebe a mensagem, processa seu conteúdo e envia a resposta ao cliente.&lt;/p&gt;

&lt;p&gt;O servidor comporta-se passivamente, normalmente limita-se a aguardar solicitações, e quando estas chegam, processa as mensagens com os dados necessários e enviar o resultado do processamento de volta a seus clientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Servidor
&lt;/h3&gt;

&lt;p&gt;Quando chega uma solicitação, o servidor pode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Atender imediatamente caso esteja ocioso&lt;/li&gt;
&lt;li&gt; Gerar um processo-filho para o atendimento da solicitação&lt;/li&gt;
&lt;li&gt; Enfileirar a solicitação para ser atendida mais tarde&lt;/li&gt;
&lt;li&gt; Criar uma thread para esse atendimento.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Independentemente do momento em que uma solicitação é processada, o servidor, no final, envia ao cliente uma mensagem contendo o resultado do processamento.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que determina se uma entidade é cliente ou servidor é a função desempenhada pelo software, e não o tipo de equipamento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Além disso, um processo pode atuar simultaneamente como cliente e servidor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura peer-to-peer
&lt;/h3&gt;

&lt;p&gt;Enquanto existe uma distinção bem clara entre os processos que trocam informações na arquitetura cliente-servidor, na peer-to-peer – também conhecida como arquitetura P2P –, todos os processos envolvidos desempenham funções similares.&lt;/p&gt;

&lt;p&gt;Em geral, nesses sistemas, os processos não são uma propriedade de corporações.&lt;/p&gt;

&lt;p&gt;Quase todos os participantes (senão todos) são provenientes de usuários comuns executando seus programas em desktops e notebooks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tanto o processamento quanto o armazenamento das informações são distribuídos entre os hospedeiros. Isso lhes confere maior escalabilidade em comparação à arquitetura cliente-servidor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Protocolos da camada de aplicação
&lt;/h3&gt;

&lt;p&gt;Enquanto o algoritmo da camada de aplicação determina seu funcionamento no ambiente local, o protocolo dela estipula tudo que é necessário para que aplicações em diferentes hospedeiros possam trocar mensagens de maneira estruturada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serviços da camada de aplicação
&lt;/h3&gt;

&lt;p&gt;Descreveremos a seguir o funcionamento de três importantes aplicações das camadas de aplicação na internet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Serviço web / protocolo HTTP — Implementado pelo protocolo HTTP, que muita gente confunde com a própria internet.&lt;/li&gt;
&lt;li&gt;  Serviço de Correio / protocolos SMTP, IMAP e POP — Serviço do correio eletrônico.&lt;/li&gt;
&lt;li&gt;  Serviço de nomes / DNS — Sistema de resolução de nomes DNS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  HTTP / Serviço web / Protocolo HTTP
&lt;/h3&gt;

&lt;p&gt;Esse protocolo é constituído de duas etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Uma página web típica é um documento em formato HTML que pode conter imagens e outros tipos de objetos, como vídeos, texto, som, etc.&lt;/p&gt;

&lt;p&gt;Para exibir determinada página web, o usuário digita no browser o endereço no qual ela se encontra, indicando o local em que deve ser buscada.&lt;/p&gt;

&lt;p&gt;Para que uma página seja transferida do servidor até o browser, um padrão deve ser seguido pelos softwares.&lt;/p&gt;

&lt;p&gt;Ele especifica como o cliente solicita a página, e o servidor a transfere para o cliente.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Esse padrão é o protocolo HTTP. A mensagem HTTP, por sua vez, é carregada pelo outro protocolo: TCP.&lt;/p&gt;

&lt;p&gt;Uma interação entre cliente e servidor se inicia quando o cliente envia uma requisição a um servidor. A solicitação mais comum consiste em:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   Enviar um texto em formato ASCII.

&lt;ul&gt;
&lt;li&gt;  Iniciar com a palavra GET.&lt;/li&gt;
&lt;li&gt;  Inserir página solicitada, protocolo utilizado na transferência e servidor a ser contatado.
&lt;/li&gt;
&lt;/ul&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;


Correio eletrônico (email)
&lt;/h3&gt;


&lt;p&gt;A arquitetura do sistema de correio eletrônico é construída com base em dois agentes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Do usuário&lt;/li&gt;
&lt;li&gt; De transferência de mensagens&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O agente do usuário é o programa que faz a interface do usuário com o sistema de correio eletrônico.É por meio dele que o usuário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Faz o envio e o download de mensagens e anexos.&lt;/li&gt;
&lt;li&gt;  Lê as mensagens.&lt;/li&gt;
&lt;li&gt;  Realiza a pesquisa, o arquivamento e o descarte de mensagens.&lt;/li&gt;
&lt;li&gt;  Escreve suas mensagens.&lt;/li&gt;
&lt;li&gt;  Anexa arquivos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já os agentes de transferência de mensagens são os responsáveis por fazer com que elas cheguem até o destino.&lt;/p&gt;

&lt;p&gt;Eles são mais conhecidos como servidores de correio eletrônico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Funcionamento do correio eletrônico
&lt;/h3&gt;

&lt;p&gt;Para concluirmos esse estudo, analisaremos importantes características dos protocolos apresentados:&lt;/p&gt;

&lt;h3&gt;
  
  
  SMTP
&lt;/h3&gt;

&lt;p&gt;O protocolo responsável pela transferência da mensagem até seu destino é o SMTP. O servidor SMTP aguarda por conexões de seus clientes.&lt;/p&gt;

&lt;p&gt;Quando uma conexão é estabelecida, o servidor inicia a conversação enviando uma linha de texto na qual se identifica e informa se está pronto (ou não) para receber mensagens.&lt;/p&gt;

&lt;p&gt;Se ele não estiver, o cliente deverá encerrar a conexão e tentar novamente mais tarde.&lt;/p&gt;

&lt;p&gt;Caso o servidor esteja acessível, o cliente precisa informar aos usuários a origem e o destino da mensagem.&lt;/p&gt;

&lt;p&gt;Se o servidor considerar que se trata de uma transferência válida, sinalizará para que ele a envie.&lt;/p&gt;

&lt;p&gt;Após o envio, o servidor confirma sua recepção e a conexão é encerrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  POP3
&lt;/h3&gt;

&lt;p&gt;A RFC 1939 estipula que o POP3 tem a finalidade de fazer o download das mensagens que se encontram no mailbox do usuário para o sistema local.&lt;/p&gt;

&lt;p&gt;Caso estejam neste sistema, ele pode utilizá-las em qualquer momento, mesmo sem ter conexão com a internet.&lt;/p&gt;

&lt;p&gt;O POP3 é implementado na maioria dos agentes de usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  IMAP
&lt;/h3&gt;

&lt;p&gt;Assim como o POP3, o IMAP permite que um usuário tenha acesso às mensagens armazenadas em sua caixa.&lt;/p&gt;

&lt;p&gt;Porém, enquanto o POP3 é baseado na transferência delas para o sistema local a fim de serem lidas, o IMAP consegue permitir sua leitura diretamente no servidor, dispensando, portanto, a transferência para o sistema local.&lt;/p&gt;

&lt;p&gt;Isso será particularmente útil para usuários que não utilizarem sempre o mesmo computador, pois permite que suas mensagens sejam acessadas a partir de qualquer sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS
&lt;/h3&gt;

&lt;p&gt;A comunicação entre hospedeiros na internet ocorre por meio de endereços binários de rede.&lt;/p&gt;

&lt;p&gt;Entretanto, é bem mais fácil trabalhar com nomes de hospedeiros do que com seus endereços de rede.&lt;/p&gt;

&lt;p&gt;Além de ser muito difícil conhecer todos os endereços dos hospedeiros com os quais precisamos trabalhar, precisaríamos ser notificados toda vez que algum deles mudasse de endereço.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema, foi desenvolvido o &lt;em&gt;Domain Name System&lt;/em&gt; (DNS).&lt;/p&gt;

&lt;p&gt;Sua finalidade é a criação de um sistema de nomes de forma hierárquica e baseada em domínios.&lt;/p&gt;

&lt;p&gt;Para acessar um hospedeiro, portanto, basta conhecer seu nome de domínio e fazer uma consulta ao servidor DNS, que é responsável por descobrir seu endereço.&lt;/p&gt;

&lt;h3&gt;
  
  
  Espaços de nomes
&lt;/h3&gt;

&lt;p&gt;O espaço de nomes do DNS é dividido em domínios estruturados em níveis. Confira a organização do primeiro nível:&lt;/p&gt;

&lt;h3&gt;
  
  
  Domínios genéricos
&lt;/h3&gt;

&lt;p&gt;Informam o tipo de organização ao qual o domínio está vinculado. Alguns exemplos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  .com — comercial&lt;/li&gt;
&lt;li&gt;  .edu — instituições educacionais&lt;/li&gt;
&lt;li&gt;  .int — algumas organizações internacionais&lt;/li&gt;
&lt;li&gt;  .org — organizações sem fins lucrativos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Domínios de países
&lt;/h3&gt;

&lt;p&gt;Cada domínio controla como são criados seus subdomínios. Para a criação de um novo domínio, é necessária apenas a permissão daquele no qual será incluído.&lt;/p&gt;

&lt;p&gt;Não há qualquer restrição sobre a quantidade de subdomínios que podem ser criados dentro de um domínio.&lt;/p&gt;

&lt;p&gt;Os nomes de domínio não fazem distinção entre letras maiúsculas e minúsculas. EDU e edu, por exemplo, são o mesmo.&lt;/p&gt;

&lt;p&gt;O DNS é implementado sobre o protocolo UDP. Trata-se de um protocolo do nível de transporte que não garante a entrega dos dados no destino.&lt;/p&gt;

&lt;p&gt;Dessa forma, cabe ao software DNS garantir uma comunicação confiável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolução de nomes
&lt;/h3&gt;

&lt;p&gt;O espaço de nomes do DNS é dividido em zonas. Independentes, elas possuem um servidor de nomes principal e pelo menos um de nomes secundário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Servidor de nomes principal — Configurado com as informações das zonas sob sua responsabilidade, ele faz o repasse delas para os servidores de nomes secundários.&lt;/li&gt;
&lt;li&gt;  Servidor de nomes secundário — Responde pelas zonas caso haja uma falha do servidor de nomes principal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As zonas do DNS definem o que um servidor deve resolver. Se ele for o responsável pela zona pesquisada (servidor autoritativo), deverá fazer a resolução solicitada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Três principais componentes do DNS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Registros de recursos armazenados em um banco de dados distribuído.&lt;/li&gt;
&lt;li&gt;  Servidores de nomes DNS responsáveis pela manutenção de zonas específicas.&lt;/li&gt;
&lt;li&gt;  Solucionadores DNS em execução nos clientes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solucionador x servidor DNS
&lt;/h3&gt;

&lt;p&gt;Quando um solucionador solicita a resolução de um nome para o servidor DNS, pode acontecer o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  O servidor DNS é o responsável pela zona: O servidor resolve o nome solicitado e o devolve ao solucionador.&lt;/li&gt;
&lt;li&gt;  O servidor DNS não é o responsável pela zona, mas possui a resolução em cache: O servidor envia a resolução ao solucionador.&lt;/li&gt;
&lt;li&gt;  O servidor DNS não é o responsável pela zona nem possui a resolução em cache: O servidor precisa realizar uma busca para resolver o nome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok, falamos bastante da camada de aplicação, agora é hora de falar sobre a camada de transporte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas para que serve a camada de transporte?
&lt;/h3&gt;

&lt;p&gt;Executadas na camada de aplicação, as aplicações precisam de um modelo de rede no qual haja a entrega de uma mensagem tanto em um ponto de rede quanto em sua aplicação par no hospedeiro destino.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O objetivo da camada de transporte é, independentemente das redes físicas em uso, promover a confiabilidade na transferência de dados entre os hospedeiros origem e destino.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Aspectos fundamentais da camada de transporte
&lt;/h3&gt;

&lt;p&gt;Em uma arquitetura de camadas, podemos afirmar que o objetivo geral de uma camada é oferecer serviços àquela imediatamente superior.&lt;/p&gt;

&lt;p&gt;No caso da camada de transporte, sua pretensão é oferecê-los à de aplicação.&lt;/p&gt;

&lt;p&gt;Como um dos principais objetivos da camada de transporte é ofertar um serviço confiável e eficiente a seus usuários, ela precisa oferecer, no mínimo, um serviço orientado à conexão e outro sem conexão.&lt;/p&gt;

&lt;p&gt;Para atingir esse objetivo, a camada de transporte utiliza os serviços oferecidos pela de rede.&lt;/p&gt;

&lt;p&gt;No serviço de transporte orientado à conexão, existem três fases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Estabelecimento da conexão&lt;/li&gt;
&lt;li&gt; Transferência de dados&lt;/li&gt;
&lt;li&gt; Encerramento da conexão&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por meio de um controle apurado da conexão, esse serviço de transporte consegue verificar quais pacotes chegaram com erro ao destino e até mesmo aqueles que não foram enviados, sendo capaz de retransmiti-los até que os dados estejam corretos.&lt;/p&gt;

&lt;p&gt;Já no serviço de transporte sem conexão, não existe nenhum controle sobre os pacotes enviados.&lt;/p&gt;

&lt;p&gt;Se um deles se perder ou chegar ao destino com erro, nada será feito para obter a sua recuperação.&lt;/p&gt;

&lt;p&gt;Se a rede oferece um serviço com que garanta uma entrega sem erros, por que uma aplicação optaria por um serviço sem essa garantia?&lt;/p&gt;

&lt;p&gt;A resposta é simples: por questões de desempenho.&lt;/p&gt;

&lt;p&gt;Pelo fato de ser preciso cuidar de cada pacote no serviço orientado à conexão, verificando-os e retransmitindo-os em caso de necessidade, esse controle gera um overhead.&lt;/p&gt;

&lt;p&gt;Aplicações como transferência de arquivos e e-mail exigem que seus dados cheguem ao destino livres de erros. Dessa forma, elas utilizam um serviço orientado à conexão.&lt;/p&gt;

&lt;p&gt;Ainda assim, em certas aplicações, o mais importante é a chegada a tempo de uma informação, mesmo que ela contenha erros ou que a mensagem anterior tenha se perdido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endereçamento (camada de transporte)
&lt;/h3&gt;

&lt;p&gt;Quando seu programa solicita algo a um servidor, o sistema envia uma mensagem para ser entregue à aplicação que executa em um hospedeiro remoto.&lt;/p&gt;

&lt;p&gt;Mas podem existir várias aplicações nele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como identificamos uma aplicação específica?
&lt;/h3&gt;

&lt;p&gt;Surge neste momento o endereçamento no nível de transporte. Sua função é identificar em qual aplicação determinada mensagem deve ser entregue.&lt;/p&gt;

&lt;p&gt;Afinal, toda mensagem do protocolo de transporte carrega o endereço da aplicação.&lt;/p&gt;

&lt;p&gt;Verificaremos agora a importância do endereçamento no nível de transporte.&lt;/p&gt;

&lt;p&gt;Afinal, é necessário indicar em qual aplicação os dados devem ser entregues por meio de seu endereço (de transporte).&lt;/p&gt;

&lt;p&gt;Assim, o hospedeiro destino consegue saber o destino deles.&lt;/p&gt;

&lt;p&gt;Estudaremos mais adiante TCP e UDP, dois protocolos da camada de transporte da arquitetura TCP/IP.&lt;/p&gt;

&lt;p&gt;Neles, o endereço de transporte é conhecido como porta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiplexação e demultiplexação
&lt;/h3&gt;

&lt;p&gt;A multiplexação e a demultiplexação fornecem um serviço de entrega, processo a processo para aplicações executadas nos hospedeiros.&lt;/p&gt;

&lt;p&gt;No hospedeiro destino, a camada de transporte recebe segmentos de dados da camada de rede, tendo a responsabilidade de entregá-los ao processo de aplicação correto.&lt;/p&gt;

&lt;p&gt;Um processo pode ter um ou mais endereços de transporte (conhecidos como portas na arquitetura TCP/IP) pelos quais dados passam da rede para o processo – e vice-versa.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Como o hospedeiro destino direciona à porta correta um segmento que chega?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para essa finalidade, cada segmento da camada de transporte tem um conjunto de campos de endereçamento no cabeçalho.&lt;/p&gt;

&lt;p&gt;No receptor, a camada de transporte examina esses campos para identificar a porta receptora e direcionar o segmento a ela.&lt;/p&gt;

&lt;p&gt;A tarefa de entregar os dados contidos em um segmento para a porta correta é denominada demultiplexação.&lt;/p&gt;

&lt;p&gt;Já a multiplexação consiste no trabalho de, no hospedeiro origem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reunir porções de dados provenientes de diferentes portas.&lt;/li&gt;
&lt;li&gt;  Encapsular cada porção de dados com as informações de cabeçalho (as quais, mais tarde, serão usadas na demultiplexação) para criar segmentos.&lt;/li&gt;
&lt;li&gt;  Passar os segmentos para a camada de rede.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vejamos um exemplo, vamos pensar no computador que Eduardo utiliza em suas atividades.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Navegando na web, ele acessa seu e-mail e faz o download de arquivos usando um programa específico para isso. De fato, o objetivo da multiplexação é possibilitar ****uma melhor utilização ****do meio de comunicação ****ao permitir que ele seja compartilhado pelos diversos programas utilizados.&lt;/li&gt;
&lt;li&gt; Eduardo utiliza a Internet, cujo protocolo de transporte é o TCP.&lt;/li&gt;
&lt;li&gt; Todos os programas operados por ele (browser web, cliente de e-mail e programa de transferência de arquivos) utilizam o TCP, que fará a transferência da informação até o destino.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A multiplexação, portanto, permite que vários programas possam utilizar o TCP ao mesmo tempo, fazendo, assim, com que Eduardo possa ter tantos programas quanto queira ao acessar a rede.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como o TCP sabe quem é quem?
&lt;/h3&gt;

&lt;p&gt;Para fazer uso dele, um processo deve se registrar em uma porta (endereço de transporte) do protocolo TCP.&lt;/p&gt;

&lt;p&gt;Servidores possuem portas conhecidas, mas programas clientes se registram nas aleatórias.&lt;/p&gt;

&lt;p&gt;Vamos supor que os programas de Eduardo se registraram nas seguintes portas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Browser web — 11278&lt;/li&gt;
&lt;li&gt; Cliente de email — 25786&lt;/li&gt;
&lt;li&gt; Transferência de arquivos — 3709&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dessa maneira, o TCP pode identificar cada uma.&lt;/p&gt;

&lt;p&gt;Quando o browser envia uma solicitação a um servidor web, o TCP coloca na informação enviada o número de porta 11278.&lt;/p&gt;

&lt;p&gt;O servidor, portanto, já sabe que deve responder-lhe enviando a resposta para essa porta.&lt;/p&gt;

</description>
      <category>redes</category>
    </item>
    <item>
      <title>Loops avançados e recursividade</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Tue, 16 Sep 2025 21:00:49 +0000</pubDate>
      <link>https://forem.com/andresdossantos/loops-avancados-e-recursividade-4afp</link>
      <guid>https://forem.com/andresdossantos/loops-avancados-e-recursividade-4afp</guid>
      <description>&lt;p&gt;Nesse post vamos ver técnicas avançadas de declarar loops, vou te passar exemplos explicativos de como eles são escritos e usados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loops com múltiplas variáveis
&lt;/h3&gt;

&lt;p&gt;É uma técnica em que muitas variáveis são inicializadas, testadas e atualizadas simultaneamente dentro de um único loop.&lt;/p&gt;

&lt;p&gt;Esse método é útil quando precisamos controlar ou monitorar mais de um valor ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Quando falamos de um loop for, podemos inicializar diversas variáveis, definir condições de continuidade para todas elas e atualizá-las a cada iteração do loop.&lt;/p&gt;

&lt;p&gt;Isso é útil para problemas que envolvem iterações dependentes de múltiplas variáveis ou para manipulações complexas de dados.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    for (int i = 0, j = 10; i &amp;lt; j; i++, j--) {
        printf("i = %d, j = %d\\n", i, j);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse exemplo, i é incrementado e j é decrementado em cada iteração, permitindo um controle simultâneo de duas variáveis dentro do mesmo loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loops com condições múltiplas
&lt;/h3&gt;

&lt;p&gt;Utilizam mais de uma condição para determinar quando devem continuar ou parar.&lt;/p&gt;

&lt;p&gt;Isso é frequentemente realizado com o loop for, em que a expressão de condição pode incluir múltiplas condições combinadas usando operadores lógicos (“&amp;amp;&amp;amp;” para E lógico e “||” para OU lógico).&lt;/p&gt;

&lt;p&gt;Loops com condições múltiplas são úteis para situações em que o controle do loop depende de várias variáveis ou condições que precisam ser verificadas simultaneamente.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    for (int i = 0, j = 10; i &amp;lt; 5 &amp;amp;&amp;amp; j &amp;gt; 5; i++, j--) {
        printf("i = %d, j = %d\\n", i, j);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse exemplo, o loop continua enquanto i for menor que 5 e j for maior que 5.&lt;/p&gt;

&lt;p&gt;As duas condições são avaliadas simultaneamente e o loop só prossegue se ambas forem verdadeiras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loops com atualizações complexas
&lt;/h3&gt;

&lt;p&gt;São loops em que a variável de controle é modificada de maneiras mais sofisticadas que simples incrementos ou decrementos.&lt;/p&gt;

&lt;p&gt;Esses loops frequentemente utilizam expressões condicionais, cálculos matemáticos ou funções para alterar a variável de controle a cada iteração.&lt;/p&gt;

&lt;p&gt;Isso permite uma maior flexibilidade e controle sobre o fluxo do loop, adaptando-se a requisitos específicos ou padrões de iteração não lineares.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    for (int i = 0; i &amp;lt; 100; i += (i % 2 == 0) ? 1 : 2) {
        printf("%d ", i);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse exemplo, a variável i é atualizada de maneira diferente dependendo de sua paridade: se i for par, é incrementado por 1; se for ímpar, é incrementado por 2.&lt;/p&gt;

&lt;p&gt;Essa lógica de atualização complexa permite que o loop siga um padrão de iteração não trivial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso de continue e break
&lt;/h3&gt;

&lt;p&gt;Nos loops for, continue e break são usados para controlar o fluxo de execução.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Uso do continue

while (testExpression) {
  // code
  if (testExpression) {
    continue;
  }
  // code
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Faz com que o loop pule a iteração atual e prossiga com a próxima iteração, verificando a condição do loop novamente.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Uso do continue

while (testExpression) {
  // code
  if (testExpression) {
    break;
  }
  // code
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Interrompe o loop imediatamente, saindo dele antes que todas as iterações sejam concluídas.&lt;/p&gt;

&lt;p&gt;Os comandos continue e break são úteis para evitar certas condições ou para terminar o loop com base em critérios específicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recursividade
&lt;/h3&gt;

&lt;p&gt;Descubra o que é recursividade e aprenda como usá-la para simular loops simples, como while e for.&lt;/p&gt;

&lt;p&gt;Antes disso você precisa saber o que é um procedimento, nada mais é do que um bloco de código que retorna um valor vazio (void).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Procedimentos são frequentemente usados para modularizar o código, dividindo-o em partes mais gerenciáveis e reutilizáveis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

// Definição de procedimento para imprimir uma mensagem
void imprimirMensagem() {
    printf("Olá, mundo!\\n");
}

int main() {
    // Chamada do procedimento
    imprimirMensagem();
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse exemplo, o procedimento &lt;code&gt;imprimirMensagem&lt;/code&gt; é definido com o tipo de retorno &lt;code&gt;void&lt;/code&gt;, o que significa que não retorna nenhum valor.&lt;/p&gt;

&lt;p&gt;Agora sim, vamos a recursividade, é um conceito importante em programação, em que uma função chama a si mesma para resolver problemas de forma mais simples e eficiente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recursividade é uma técnica que pode ser usada para substituir loops, dividir problemas complexos em partes menores e simplificar a lógica de muitos algoritmos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para ilustrar o conceito de recursividade, veja um exemplo simples de uma função recursiva em C que simula o comportamento de um loop.&lt;/p&gt;

&lt;p&gt;Considere o código a seguir, que usa recursividade para imprimir números de n até 1.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

// Função recursiva para imprimir números de n até 1
void recursiveLoop(int n) {
    if (n &amp;gt; 0) {
        printf("%d ", n);  // Imprime o valor atual de n
        recursiveLoop(n - 1);  // Chama a si mesma com n - 1
    }
}

int main() {
    int numero = 5;
    printf("Contagem regressiva: ");
    recursiveLoop(numero);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;  Definição da função — a função &lt;code&gt;recursiveLoop&lt;/code&gt; é definida para aceitar um único argumento. Essa função imprime o valor de n ****e depois chama a si mesma com n - 1.&lt;/li&gt;
&lt;li&gt;  Caso-base — a recursividade é controlada por uma condição base &lt;code&gt;if (n &amp;gt; 0)&lt;/code&gt;&lt;strong&gt;.&lt;/strong&gt; Quando chega a 0, a função para de chamar a si mesma, evitando um loop infinito. Se n for maior que 0, a função imprime o valor atual e faz uma chamada recursiva com n - 1**.**&lt;/li&gt;
&lt;li&gt;  Chamada recursiva — cada chamada de &lt;code&gt;recursiveLoop&lt;/code&gt; ****reduz o valor de em 1. Isso cria uma série de chamadas que eventualmente atingem o caso-base.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recursividade é uma técnica essencial para resolver problemas que podem ser divididos em subproblemas menores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumindo
&lt;/h3&gt;

&lt;p&gt;A chave para entender a recursividade é identificar o caso-base e garantir que cada chamada recursiva se aproxime desse caso-base, prevenindo loops infinitos.&lt;/p&gt;

&lt;p&gt;Embora simples, esse conceito é aplicável a uma gama de problemas, desde travessias de estruturas de dados complexas até algoritmos de ordenação e busca.&lt;/p&gt;

&lt;p&gt;Com a prática, a recursividade se torna uma ferramenta valiosa no arsenal de qualquer programador.&lt;/p&gt;

</description>
      <category>c</category>
    </item>
    <item>
      <title>devto api</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Mon, 08 Sep 2025 18:54:21 +0000</pubDate>
      <link>https://forem.com/andresdossantos/devto-api-3oi6</link>
      <guid>https://forem.com/andresdossantos/devto-api-3oi6</guid>
      <description>&lt;p&gt;Agora sim, temos um post publicado no X.&lt;/p&gt;

</description>
      <category>tags</category>
      <category>dev</category>
      <category>home</category>
    </item>
    <item>
      <title>devto api</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Mon, 08 Sep 2025 18:48:00 +0000</pubDate>
      <link>https://forem.com/andresdossantos/devto-api-3j3j</link>
      <guid>https://forem.com/andresdossantos/devto-api-3j3j</guid>
      <description>&lt;p&gt;Agora sim, temos um post publicado no X.&lt;/p&gt;

</description>
      <category>tags</category>
      <category>dev</category>
      <category>home</category>
    </item>
    <item>
      <title>devto api</title>
      <dc:creator>Andres dos Santos</dc:creator>
      <pubDate>Mon, 08 Sep 2025 18:09:08 +0000</pubDate>
      <link>https://forem.com/andresdossantos/devto-api-2e3k</link>
      <guid>https://forem.com/andresdossantos/devto-api-2e3k</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Agora sim, temos um post publicado no DevTO.


    &amp;lt;p&amp;gt;Confira no meu site https://andresdosantos.com/posts/cmfbf3ohlst6n07lkn0cyx428.&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>tags</category>
      <category>dev</category>
      <category>home</category>
    </item>
  </channel>
</rss>
