<?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: Josimar Costa</title>
    <description>The latest articles on Forem by Josimar Costa (@josimar_canejo).</description>
    <link>https://forem.com/josimar_canejo</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%2F1516497%2Fbeb9d888-9f55-4f6d-8001-1c94f5aa902b.jpg</url>
      <title>Forem: Josimar Costa</title>
      <link>https://forem.com/josimar_canejo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/josimar_canejo"/>
    <language>en</language>
    <item>
      <title>Construindo uma rede social de estudos com IA: desafios e aprendizados</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Sun, 12 Apr 2026 21:20:18 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/construindo-uma-rede-social-de-estudos-com-ia-desafios-e-aprendizados-3og</link>
      <guid>https://forem.com/josimar_canejo/construindo-uma-rede-social-de-estudos-com-ia-desafios-e-aprendizados-3og</guid>
      <description>&lt;p&gt;Criar uma plataforma de estudos já é desafiador. Criar uma rede social focada em aprendizado, com integração de inteligência artificial, leva esse desafio para outro nível.&lt;/p&gt;

&lt;p&gt;O Enturmando nasceu com uma proposta simples: conectar estudantes. Mas evoluiu para algo maior — um ambiente onde tecnologia e colaboração se unem para melhorar a forma como as pessoas aprendem.&lt;/p&gt;

&lt;p&gt;Acessar: &lt;a href="https://enturmando.com.br" rel="noopener noreferrer"&gt;https://enturmando.com.br&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste post, compartilho alguns dos principais desafios que enfrentei ao desenvolver a plataforma e como a IA se tornou peça central nessa jornada.&lt;/p&gt;

&lt;p&gt;🧩 O desafio: manter o foco em um ambiente social&lt;/p&gt;

&lt;p&gt;Redes sociais são, por natureza, distraentes.&lt;/p&gt;

&lt;p&gt;Então a pergunta foi: como criar uma rede social que incentive o foco, e não o contrário?&lt;/p&gt;

&lt;p&gt;A solução não foi apenas limitar funcionalidades, mas redesenhar a experiência:&lt;/p&gt;

&lt;p&gt;Interações com propósito (discussões, dúvidas, compartilhamento de conteúdo)&lt;/p&gt;

&lt;p&gt;Menos estímulos irrelevantes&lt;/p&gt;

&lt;p&gt;Ferramentas que incentivam produtividade&lt;/p&gt;

&lt;p&gt;🤖 IA como camada de produtividade&lt;/p&gt;

&lt;p&gt;A inteligência artificial não foi pensada como “feature de marketing”, mas como infraestrutura de aprendizado.&lt;/p&gt;

&lt;p&gt;Algumas decisões importantes:&lt;/p&gt;

&lt;p&gt;IA integrada diretamente no fluxo de estudo (não separada)&lt;/p&gt;

&lt;p&gt;Respostas rápidas e objetivas (evitando excesso de informação)&lt;/p&gt;

&lt;p&gt;Ferramentas práticas, não apenas conversacionais&lt;/p&gt;

&lt;p&gt;Hoje, a IA no Enturmando resolve problemas reais do estudante:&lt;/p&gt;

&lt;p&gt;Geração de planos de estudo personalizados&lt;/p&gt;

&lt;p&gt;Resumos automáticos de conteúdos&lt;/p&gt;

&lt;p&gt;Criação de flashcards para revisão ativa&lt;/p&gt;

&lt;p&gt;Mapas mentais para organização do conhecimento&lt;/p&gt;

&lt;p&gt;Simulados para validação de aprendizado&lt;/p&gt;

&lt;p&gt;Correção de redações com feedback imediato&lt;/p&gt;

&lt;p&gt;⚙️ Desafios técnicos&lt;/p&gt;

&lt;p&gt;Alguns dos principais desafios no desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Performance vs. custo de IA
Chamadas a modelos podem ser caras e lentas. Foi necessário:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Otimizar prompts&lt;/p&gt;

&lt;p&gt;Reduzir chamadas desnecessárias&lt;/p&gt;

&lt;p&gt;Pensar em cache e reaproveitamento&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Experiência do usuário
IA pode ser poderosa, mas também confusa. Então:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Interfaces simples foram prioridade&lt;/p&gt;

&lt;p&gt;Evitei expor complexidade técnica&lt;/p&gt;

&lt;p&gt;Foco em “1 clique = resultado útil”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contexto e personalização
A IA só é útil se entender o usuário:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Histórico de estudos&lt;/p&gt;

&lt;p&gt;Objetivos&lt;/p&gt;

&lt;p&gt;Nível de conhecimento&lt;/p&gt;

&lt;p&gt;📈 O maior aprendizado&lt;/p&gt;

&lt;p&gt;O maior insight foi simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IA não substitui o estudo. Ela potencializa quem já quer aprender.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ferramentas só funcionam quando reduzem fricção.&lt;br&gt;
Se a IA complica, ela falha.&lt;/p&gt;

&lt;p&gt;🚀 Próximos passos&lt;/p&gt;

&lt;p&gt;Ainda há muito a evoluir:&lt;/p&gt;

&lt;p&gt;Melhor personalização com base em comportamento&lt;/p&gt;

&lt;p&gt;Recomendações inteligentes de conteúdo&lt;/p&gt;

&lt;p&gt;Maior integração entre comunidade e IA&lt;/p&gt;

&lt;p&gt;💬 Conclusão&lt;/p&gt;

&lt;p&gt;Construir o Enturmando tem sido um exercício constante de equilíbrio entre:&lt;/p&gt;

&lt;p&gt;social vs. foco&lt;/p&gt;

&lt;p&gt;tecnologia vs. simplicidade&lt;/p&gt;

&lt;p&gt;automação vs. controle do usuário&lt;/p&gt;

&lt;p&gt;Acredito que o futuro da educação passa por isso:&lt;br&gt;
plataformas que unem pessoas + inteligência artificial de forma prática.&lt;/p&gt;

</description>
      <category>redesocial</category>
      <category>devia</category>
    </item>
    <item>
      <title>Entendendo e Implementando o Scroll Infinito com JavaScript</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Mon, 22 Jul 2024 16:01:44 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/entendendo-e-implementando-o-scroll-infinito-com-javascript-4526</link>
      <guid>https://forem.com/josimar_canejo/entendendo-e-implementando-o-scroll-infinito-com-javascript-4526</guid>
      <description>&lt;h4&gt;
  
  
  O que é Scroll Infinito?
&lt;/h4&gt;

&lt;p&gt;Você já deve ter visto sites como lojas online em que ao descer a página os produtos vão aparecendo de forma continua. Outro exemplo é o do &lt;a href="http://endless.horse/" rel="noopener noreferrer"&gt;endless.horse&lt;/a&gt;, ele pode parecer simples mas é um excelente exemplo para demonstrar a funcionalidade do "Scrolls infinito". Ao acessar o site, você vê um cavalo, mas ao rolar a página para baixo, percebe que as pernas do cavalo continuam a crescer indefinidamente, e nunca se chega aos pés do cavalo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementando Scroll Infinito
&lt;/h4&gt;

&lt;p&gt;Esta funcionalidade é amplamente utilizada no desenvolvimento moderno. Podemos ver o scroll infinito em ação nas principais redes sociais, como Twitter, Facebook e especialmente no Instagram, onde o conteúdo parece nunca acabar à medida que rolamos a página.&lt;/p&gt;

&lt;p&gt;Neste artigo, vou demonstrar uma implementação básica dessa funcionalidade. No entanto, esta abordagem não aborda questões como problemas com consultas demoradas, implementação de cache e outras soluções necessárias para aplicações em produção. Ainda assim, este é um ponto de partida para entender como podemos implementar esse recurso.&lt;/p&gt;

&lt;h5&gt;
  
  
  Passo 1: Decida onde adicionar a funcionalidade de scroll infinito
&lt;/h5&gt;

&lt;p&gt;Primeiro, decida onde você vai adicionar a funcionalidade de scroll infinito. Será uma lista de postagens ou de imagens? Também será necessário decidir de onde virão os dados. Para este exemplo, vamos usar imagens de uma API básica, o Random Fox API.&lt;/p&gt;

&lt;h5&gt;
  
  
  Passo 2: Crie seu arquivo HTML
&lt;/h5&gt;

&lt;p&gt;Crie o arquivo HTML e inclua um contêiner para suas imagens de raposas aleatórias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Fox Images&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Fox Images&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Passo 3: Crie seu arquivo CSS
&lt;/h5&gt;

&lt;p&gt;Para este exemplo, manteremos a folha de estilos bem simples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Verdana&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Passo 4: Crie seu arquivo JavaScript
&lt;/h5&gt;

&lt;p&gt;Selecione o contêiner e pegue a URL da Random Fox API. Não se esqueça de linkar seus arquivos JavaScript e CSS no HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://randomfox.ca/images/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getRandomNumber&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadImages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numImages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;numImages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;img&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nf"&gt;getRandomNumber&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;.jpg`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;loadImages&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Passo 5: Adicione o Evento de Scroll
&lt;/h5&gt;

&lt;p&gt;Para implementar a funcionalidade de scroll infinito, adicione este event listener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollY&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHeight&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;loadImages&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a soma de &lt;code&gt;scrollY&lt;/code&gt; e &lt;code&gt;innerHeight&lt;/code&gt; for maior ou igual a &lt;code&gt;scrollHeight&lt;/code&gt;, significa que chegamos ao fim do documento e, portanto, precisamos carregar mais imagens.&lt;/p&gt;

&lt;h5&gt;
  
  
  Conclusão
&lt;/h5&gt;

&lt;p&gt;Sua página agora deve estar funcional com a técnica de scroll infinito. Aqui está um desafio para você: tente refazer este projeto usando uma outra API de sua escolha, implemente também algum estilo mais elaborado para exibir seus items. Boa sorte!&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Aprimorando suas habilidades com Git e GitHub</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Sun, 21 Jul 2024 14:00:33 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/aprimorando-suas-habilidades-com-git-e-github-b51</link>
      <guid>https://forem.com/josimar_canejo/aprimorando-suas-habilidades-com-git-e-github-b51</guid>
      <description>&lt;p&gt;Este artigo para iniciantes aborda comandos e conceitos que são essenciais para desenvolvedores que desejam elevar seu nível de programação utilizando um sistema de controle de versão.&lt;/p&gt;

&lt;p&gt;Primeiramente iremos entender o que é o GIT e o GITHUB:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; é um sistema de controle de versão distribuído que permite aos desenvolvedores rastrear e gerenciar alterações no código-fonte ao longo do tempo. Ele foi criado por Linus Torvalds em 2005 para ajudar na coordenação do desenvolvimento do kernel do Linux. Aqui estão alguns conceitos chave sobre o Git:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Controle de Versão Distribuído&lt;/strong&gt;: Cada desenvolvedor tem uma cópia completa do repositório, incluindo todo o histórico de alterações, em sua máquina local.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshots&lt;/strong&gt;: Ao invés de armazenar diferenças entre versões, o Git armazena uma "foto" completa de cada versão do código, o que facilita a restauração de estados anteriores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branching e Merging&lt;/strong&gt;: Git permite criar ramificações (branches) para trabalhar em funcionalidades ou correções de bugs de forma isolada, e depois mesclá-las (merge) de volta ao ramo principal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging Area&lt;/strong&gt;: Antes de confirmar alterações (commits), elas são adicionadas a uma área intermediária chamada de área de staging, permitindo um controle granular sobre quais mudanças serão incluídas no commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; é uma plataforma de hospedagem de código-fonte baseada na web que utiliza o Git como sistema de controle de versão. Ela oferece uma série de funcionalidades adicionais que facilitam a colaboração e o gerenciamento de projetos de software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repositórios Remotos&lt;/strong&gt;: GitHub permite que desenvolvedores hospedem repositórios Git na nuvem, facilitando o acesso e a colaboração de qualquer lugar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forking&lt;/strong&gt;: Usuários podem criar uma cópia de um repositório (fork) para realizar mudanças sem afetar o repositório original.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull Requests&lt;/strong&gt;: Um pull request é uma proposta de integração de mudanças de um repositório forkado ou de uma ramificação para outro, permitindo revisões de código e discussões antes de mesclar as mudanças.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues e Projetos&lt;/strong&gt;: GitHub oferece ferramentas para rastreamento de bugs, solicitações de funcionalidades e gerenciamento de tarefas através de issues e projetos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrações e Actions&lt;/strong&gt;: GitHub Actions permite a automação de fluxos de trabalho, como integração contínua e entrega contínua (CI/CD), diretamente no repositório.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que já entendemos o que é cada um desses elementos vamos conhecer um pouco dos principais conceitos e comandos utilizados na manipulação deles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurações do Git:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git config&lt;/code&gt; é usado para ajustar as configurações do Git, tanto a nível global quanto local.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Seu Nome"&lt;/span&gt;
  git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"seu.email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Status e Área de Staging:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git status&lt;/code&gt; exibe o estado do diretório de trabalho e da área de staging, mostrando quais mudanças foram ou não preparadas para commit.&lt;/li&gt;
&lt;li&gt;A área de staging é um espaço intermediário onde você pode preparar mudanças antes de confirmar.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git add &amp;lt;arquivo&amp;gt;
  git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"mensagem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Commits e Push:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git commit&lt;/code&gt; captura um snapshot das mudanças atualmente preparadas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git push&lt;/code&gt; envia o conteúdo do repositório local para um repositório remoto, geralmente no GitHub.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Branches e Merges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git branch&lt;/code&gt; permite criar e gerenciar ramificações no seu projeto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git merge&lt;/code&gt; integra linhas de desenvolvimento independentes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git branch nome_da_branch
  git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; nome_da_branch
  git merge nome_da_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pull Requests e Resolução de Conflitos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um pull request é uma proposta de integração de mudanças de uma ramificação para outra, facilitando a revisão e discussão das alterações.&lt;/li&gt;
&lt;li&gt;Conflitos de merge ocorrem quando alterações diferentes são feitas na mesma linha de um arquivo ou quando um arquivo editado por uma pessoa é excluído por outra. É necessário resolver todos os conflitos antes de concluir um merge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Revertendo Alterações:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git reset&lt;/code&gt; é uma ferramenta versátil para desfazer mudanças, com três modos principais: --soft, --mixed e --hard.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git reset &lt;span class="nt"&gt;--soft&lt;/span&gt;
  git reset &lt;span class="nt"&gt;--mixed&lt;/span&gt;
  git reset &lt;span class="nt"&gt;--hard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Clonando e Atualizando Repositórios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git pull&lt;/code&gt; busca e baixa conteúdo de um repositório remoto, atualizando imediatamente o repositório local para corresponder a esse conteúdo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git clone&lt;/code&gt; cria uma cópia de um repositório existente.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git pull nome_do_repositorio
  git clone nome_do_repositorio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este artigo oferece as ferramentas e conhecimentos necessários para aprimorar seu uso do Git e GitHub, tornando-o um desenvolvedor mais eficiente e eficaz. Pratique regularmente para dominar esses conceitos e comandos.&lt;/p&gt;

</description>
      <category>jotadevelopers</category>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A Relação Entre Processos Ruins e o Desenvolvimento de Sistemas Ineficazes</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Wed, 17 Jul 2024 14:10:11 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/a-relacao-entre-processos-ruins-e-o-desenvolvimento-de-sistemas-ineficazes-1i4j</link>
      <guid>https://forem.com/josimar_canejo/a-relacao-entre-processos-ruins-e-o-desenvolvimento-de-sistemas-ineficazes-1i4j</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Em muitas organizações, a implementação de novos sistemas tecnológicos é vista como uma solução mágica para diversos problemas operacionais. No entanto, a realidade é que sistemas de tecnologia, por mais avançados que sejam, não conseguem agregar valor a uma organização cujos processos internos estão falhos ou mal estruturados. A relação entre processos ruins e o desenvolvimento de sistemas ineficazes é intrínseca e pode levar a um ciclo de frustração, desperdício de recursos e falta de melhoria real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Análise da Situação
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Processos Ineficientes e Falhas na Implementação de Sistemas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando uma organização possui processos internos deficientes, a tentativa de automatizá-los ou melhorá-los com a implementação de novos sistemas tecnológicos pode amplificar os problemas existentes. Um processo mal definido, quando automatizado, simplesmente realiza uma má prática de maneira mais rápida e consistente, mas não resolve a raiz do problema. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Falta de Alinhamento entre Negócio e Tecnologia&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em muitas organizações, há uma desconexão significativa entre as áreas de negócio e a equipe de TI. As necessidades reais do negócio podem não ser compreendidas corretamente pelos desenvolvedores de sistemas, resultando em soluções que não atendem às demandas operacionais ou estratégicas da empresa.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Resistência à Mudança&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Processos ruins frequentemente estão enraizados na cultura organizacional. A mudança para novos sistemas muitas vezes enfrenta resistência dos funcionários, que podem estar acostumados com os métodos antigos, apesar de suas ineficiências. Sem uma mudança cultural e um engajamento adequado dos funcionários, a implementação de novos sistemas pode falhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo Prático
&lt;/h2&gt;

&lt;p&gt;Considere uma empresa de logística que enfrenta problemas de atraso na entrega de produtos. A solução imediata poderia parecer a implementação de um novo sistema de gerenciamento de entregas. No entanto, se os processos de planejamento de rotas, gestão de estoque e comunicação com motoristas estiverem falhos, o novo sistema apenas digitalizará esses problemas, sem realmente melhorar a eficiência das entregas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como lidar com esta questão
&lt;/h3&gt;

&lt;p&gt;Para garantir que o desenvolvimento de novos sistemas realmente agregue valor, é crucial primeiro melhorar os processos internos. A seguir, uma linha de ação sugerida:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Avaliação e Mapeamento de Processos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Realize uma avaliação completa dos processos internos existentes. Identifique pontos de ineficiência, gargalos e redundâncias. Utilize metodologias como mapeamento de processos e análise SWOT para ter uma visão clara das áreas que precisam de melhoria.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reengenharia de Processos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com base na avaliação, redesenhe os processos internos para torná-los mais eficientes e alinhados com os objetivos estratégicos da organização. A reengenharia de processos pode incluir a simplificação de etapas, a eliminação de atividades redundantes e a redefinição de responsabilidades.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Engajamento dos Stakeholders&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Envolva todos os stakeholders relevantes no processo de melhoria. Isso inclui desde a alta gestão até os funcionários que executam os processos no dia a dia. O engajamento é essencial para garantir que as mudanças sejam compreendidas e aceitas por todos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Treinamento e Desenvolvimento&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ofereça treinamento adequado aos funcionários sobre os novos processos e, eventualmente, sobre os novos sistemas a serem implementados. Um bom programa de capacitação pode reduzir a resistência à mudança e aumentar a eficiência operacional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implementação de Sistemas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com os processos internos bem definidos e otimizados, a implementação de novos sistemas pode ser realizada de forma mais eficaz. Os sistemas devem ser desenvolvidos ou escolhidos com base nas necessidades específicas dos novos processos, garantindo que agreguem valor real à organização.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Monitoramento e Melhoria Contínua&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Após a implementação dos novos sistemas, estabeleça um processo de monitoramento contínuo para avaliar o desempenho e identificar áreas para melhorias futuras. A melhoria contínua deve ser um componente central da cultura organizacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Melhorar processos internos antes de desenvolver sistemas é uma abordagem estratégica que pode transformar a eficiência e a eficácia de uma organização. Ao focar primeiro na otimização dos processos, as organizações podem garantir que os sistemas implementados realmente agreguem valor e conduzam a melhorias sustentáveis e significativas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Síndrome do Impostor na Programação: Quando o Sucesso Parece uma Fraude</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Wed, 05 Jun 2024 09:27:01 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/a-sindrome-do-impostor-na-programacao-quando-o-sucesso-parece-uma-fraude-1hi3</link>
      <guid>https://forem.com/josimar_canejo/a-sindrome-do-impostor-na-programacao-quando-o-sucesso-parece-uma-fraude-1hi3</guid>
      <description>&lt;p&gt;A Síndrome do Impostor é um fenômeno psicológico que afeta muitos estudantes e profissionais da programação, gerando sentimentos de inadequação e dúvida sobre suas próprias habilidades. É comum sentir que suas conquistas são resultado de sorte ou de engano, ao invés de mérito próprio.&lt;/p&gt;

&lt;h4&gt;
  
  
  Causas da Síndrome do Impostor
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pressão por Conhecimento Constante&lt;/strong&gt;: A necessidade de estar sempre atualizado com as novas tecnologias pode ser esmagadora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação com Outros&lt;/strong&gt;: Comparar-se constantemente com colegas pode levar à sensação de não estar à altura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medo de Falhar&lt;/strong&gt;: O medo de cometer erros ou falhar em projetos pode paralisar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de Reconhecimento&lt;/strong&gt;: A ausência de feedback positivo pode reforçar a sensação de inadequação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses fatores podem resultar em burnout, baixa autoestima e evitação de novos desafios.&lt;/p&gt;

&lt;h4&gt;
  
  
  Dicas para Superar a Síndrome do Impostor
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconheça Seus Sentimentos&lt;/strong&gt;: Entender que é comum sentir-se como um impostor é o primeiro passo para superá-los. Aceite esses sentimentos sem se deixar dominar por eles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compartilhe com Colegas&lt;/strong&gt;: Falar sobre suas inseguranças com outros desenvolvedores pode ser extremamente reconfortante. Muitas pessoas na área passam ou passaram por isso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Estabeleça Metas Realistas&lt;/strong&gt;: Definir metas alcançáveis e celebrar cada conquista, por menor que seja, ajuda a construir confiança ao longo do tempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aprenda com seus Erros&lt;/strong&gt;: Encarar os erros como oportunidades de aprendizado, e não como falhas, é crucial para o crescimento profissional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Busque Orientação&lt;/strong&gt;: Ter um mentor pode fornecer a perspectiva e o apoio necessários para enxergar seu progresso e suas habilidades de forma mais clara.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pratique Autocompaixão&lt;/strong&gt;: Seja gentil consigo mesmo. Todos cometem erros e isso faz parte do processo de aprendizado e crescimento.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Enfrentar a Síndrome do Impostor é essencial para o sucesso e bem-estar na carreira de programação. Lembre-se de que suas habilidades são valiosas, independentemente dos desafios enfrentados. Acredite em si mesmo e continue avançando – você é mais capaz do que imagina!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Configurando Ferramentas de Desenvolvimento no Ubuntu em ambiente corporativo</title>
      <dc:creator>Josimar Costa</dc:creator>
      <pubDate>Wed, 22 May 2024 17:18:29 +0000</pubDate>
      <link>https://forem.com/josimar_canejo/configurando-ferramentas-de-desenvolvimento-no-ubuntu-em-ambiente-corporativo-4kbk</link>
      <guid>https://forem.com/josimar_canejo/configurando-ferramentas-de-desenvolvimento-no-ubuntu-em-ambiente-corporativo-4kbk</guid>
      <description>&lt;p&gt;Neste tutorial,  para ambientes que rodam atrás de um proxy corporativo. Esse guia é especialmente útil para desenvolvedores que trabalham em ambientes corporativos com restrições de rede.Vamos passar por um processo detalhado de configuração de certificados,proxy, Docker e outras ferramentas essenciais no Ubuntu 22.04&lt;/p&gt;

&lt;h2&gt;
  
  
  Adicionando Certificados
&lt;/h2&gt;

&lt;p&gt;Primeiro, precisamos adicionar certificados à nossa máquina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1: Instalar &lt;code&gt;ca-certificates&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ca-certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 2: Baixar e Copiar o certificado padrão do seu ambiente corporativo, copie o certificado para o diretório correto:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;ssl_ca.crt /usr/local/share/ca-certificates/ssl_ca.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3: Atualizar os Certificados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;update-ca-certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando o Proxy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1: Editar o Arquivo &lt;code&gt;/etc/environment&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Adicione as seguintes linhas no arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;no_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 2: Ativar o Proxy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/environment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3: Editar o Arquivo &lt;code&gt;/etc/apt/apt.conf.d/proxy.conf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Adicione as linhas abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Acquire::http::Proxy &lt;span class="s2"&gt;"http://username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
Acquire::https::Proxy &lt;span class="s2"&gt;"https://username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 4: Atualizar o Sistema Operacional
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalando Docker e Docker Compose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1: Remover Versões Anteriores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get remove docker docker-engine docker.io
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 2: Adicionar a Chave GPG Oficial do Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/docker-archive-keyring.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3: Adicionar Repositório do Docker no APT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository &lt;span class="se"&gt;\&lt;/span&gt;
   &lt;span class="s2"&gt;"deb [arch=amd64] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
   &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
   stable"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 4: Instalar o Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 5: Configurar Docker para Executar sem &lt;code&gt;sudo&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 6: Configurar Proxy para o Docker
&lt;/h3&gt;

&lt;p&gt;Crie o diretório &lt;code&gt;docker.service.d&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/systemd/system/docker.service.d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o arquivo &lt;code&gt;http-proxy.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/systemd/system/docker.service.d/http-proxy.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione as linhas abaixo no arquivo criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"HTTP_PROXY=http://usuario:senha@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;
&lt;span class="nv"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"HTTPS_PROXY=http://usuario:senha@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicie o Docker para carregar o proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 7: Instalar Docker Compose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/docker/compose/releases/download/1.15.0/docker-compose-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/docker-compose
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurar Proxy para npm
&lt;/h3&gt;

&lt;p&gt;Execute os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm config &lt;span class="nb"&gt;set &lt;/span&gt;strict-ssl &lt;span class="nb"&gt;false
&lt;/span&gt;npm &lt;span class="nb"&gt;set &lt;/span&gt;proxy http://username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;
npm &lt;span class="nb"&gt;set &lt;/span&gt;https-proxy http://username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurar Proxy para Git
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; http.proxy http://username:password@&amp;lt;proxy-url&amp;gt;:&amp;lt;proxy-port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seguindo esses passos, você terá configurado adequadamente certificados, proxy, Docker, Docker Compose e outras ferramentas de desenvolvimento no Ubuntu. Este guia deve ajudar a garantir que seu ambiente de desenvolvimento esteja pronto para uso em um cenário corporativo.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
