<?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>DEV Community: Mateus Bougleux</title>
    <description>The latest articles on DEV Community by Mateus Bougleux (@tipomrsk).</description>
    <link>https://dev.to/tipomrsk</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%2F2784710%2F3ad41896-a91f-4f9c-b301-fedff31a5128.jpeg</url>
      <title>DEV Community: Mateus Bougleux</title>
      <link>https://dev.to/tipomrsk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tipomrsk"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Sat, 15 Feb 2025 06:43:32 +0000</pubDate>
      <link>https://dev.to/tipomrsk/-3ng7</link>
      <guid>https://dev.to/tipomrsk/-3ng7</guid>
      <description></description>
    </item>
    <item>
      <title>Minimal VSCode: How I Crafted a Clean, Keyboard-Driven Coding Setup</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Fri, 31 Jan 2025 03:49:36 +0000</pubDate>
      <link>https://dev.to/tipomrsk/minimal-vscode-how-i-crafted-a-clean-keyboard-driven-coding-setup-401d</link>
      <guid>https://dev.to/tipomrsk/minimal-vscode-how-i-crafted-a-clean-keyboard-driven-coding-setup-401d</guid>
      <description>&lt;p&gt;Hey everyone! Let’s talk about productivity hacks. Today, I’m sharing how I transformed my vscode into a minimalist powerhouse—stripping away distractions, optimizing workflows, and embracing keyboard shortcuts so much that my mouse now collects dust (rsrsrs)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tipomrsk/minimal-vscode" rel="noopener noreferrer"&gt;Github-Repo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Minimalism Matters
&lt;/h2&gt;

&lt;p&gt;Let’s face it: we spend &lt;em&gt;hours&lt;/em&gt; staring at our editors. Why not make that time as pleasant and efficient as possible? My goal was simple: &lt;strong&gt;remove the noise&lt;/strong&gt;. Status bar? Hidden. Tab clutter? Eliminated. The result? A Zen-like interface that feels like coding in a distraction-free zone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fonts: Where Readability Meets Personality
&lt;/h2&gt;

&lt;p&gt;Fonts aren’t just about aesthetics—they’re about reducing eye strain and staying in the flow. After testing dozens, here’s my top trio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MonoLisa&lt;/strong&gt; &lt;em&gt;(current obsession)&lt;/em&gt;: Crisp, modern, and oddly satisfying.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Mono&lt;/strong&gt; &lt;em&gt;(old reliable)&lt;/em&gt;: Balanced and battle-tested.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DankMono&lt;/strong&gt; &lt;em&gt;(wildcard)&lt;/em&gt;: For those who like a touch of flair.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Apc Customize UI++
&lt;/h2&gt;

&lt;p&gt;Want to turn VSCode into a minimalist dream? Meet &lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=drcika.apc-extension" rel="noopener noreferrer"&gt;Apc Customize UI++&lt;/a&gt;&lt;/strong&gt;. This extension is a game-changer. With it, you can:&lt;br&gt;&lt;br&gt;
✅ Hide UI elements&lt;br&gt;
✅ Tweak margins and spacing&lt;br&gt;
✅ Create a truly &lt;em&gt;yours&lt;/em&gt; editor&lt;/p&gt;




&lt;h2&gt;
  
  
  Dark Mode FTW (Mostly)
&lt;/h2&gt;

&lt;p&gt;Color themes set the mood. Here’s my lineup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme" rel="noopener noreferrer"&gt;One Dark Pro&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
My ride-or-die theme. Smooth, easy on the eyes, and perfect for late-night sessions. I’ve tried alternatives, but nothing dethrones this one.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme" rel="noopener noreferrer"&gt;GitHub Theme&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For light mode lovers: clean and familiar. The dark version is decent, but One Dark Pro still wins my heart.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Shortcuts &amp;amp; Layouts
&lt;/h2&gt;

&lt;p&gt;This is where the magic happens. My setup revolves around &lt;strong&gt;minimizing mouse dependency&lt;/strong&gt;. Here’s how:&lt;/p&gt;

&lt;h3&gt;
  
  
  ⌨️ Shortcut Philosophy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Everything at your fingertips&lt;/strong&gt;: Toggle terminal, navigate files, and Copilot with keystrokes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proximity is key&lt;/strong&gt;: I map shortcuts close to the home row to avoid finger gymnastics.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The 75% Keyboard Sweet Spot
&lt;/h3&gt;

&lt;p&gt;After testing 60%, TKL, and full-size boards, I settled on a &lt;strong&gt;75% layout&lt;/strong&gt;. Why?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It keeps &lt;code&gt;Home&lt;/code&gt;, &lt;code&gt;End&lt;/code&gt;, &lt;code&gt;Pg Up/Dn&lt;/code&gt; accessible—critical for code navigation.
&lt;/li&gt;
&lt;li&gt;Compact but not cramped (my hands aren’t tiny, but stretching a finger works!).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smaller layouts forced me into awkward combos (looking at you, 60% 😒). Your mileage may vary, but &lt;em&gt;find what lets you code without friction&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2d30yi5xyp10kaad9jb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2d30yi5xyp10kaad9jb.png" alt="init-one-dark" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwnukd9jmbpwresgywba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwnukd9jmbpwresgywba.png" alt="init-github-dark" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffffxgtbcc8qs9geormjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffffxgtbcc8qs9geormjv.png" alt="code-github-light" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t41pwjulcynsk4ngxw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t41pwjulcynsk4ngxw2.png" alt="code-github-dark" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9nk2o3bpn1zup74l817y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9nk2o3bpn1zup74l817y.png" alt="code-one-dark" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Less Really &lt;em&gt;Is&lt;/em&gt; More
&lt;/h2&gt;

&lt;p&gt;This setup isn’t just about looks—it’s about &lt;strong&gt;flow&lt;/strong&gt;. Fewer distractions mean deeper focus. Yes, adapting to shortcuts takes time, but the payoff is worth it.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your turn!&lt;/strong&gt; What’s your editor setup like? Any killer extensions or themes I should try? Let’s geek out in the comments! 👇  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vscode</category>
      <category>programming</category>
      <category>php</category>
    </item>
    <item>
      <title>Optimizing Performance in PHP Applications</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Thu, 30 Jan 2025 03:25:01 +0000</pubDate>
      <link>https://dev.to/tipomrsk/optimizing-performance-in-php-applications-5287</link>
      <guid>https://dev.to/tipomrsk/optimizing-performance-in-php-applications-5287</guid>
      <description>&lt;p&gt;When we are programming, regardless of the language, there are concepts and techniques we can adopt to improve both the readability and understanding of the code, as well as the performance of the application.&lt;/p&gt;

&lt;p&gt;The biggest lesson here is: &lt;strong&gt;don't try to reinvent the wheel&lt;/strong&gt;. As I always say: study and research. Most likely, someone has already faced the same problem as you and found an efficient solution. Leveraging the knowledge accumulated by the community not only saves time but also helps avoid common pitfalls and errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queries and Databases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On this topic, which is very important in applications, I have already written a bit, and it's worth a read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;Optimizing Data Persistence and Reading in MySQL and Application&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Optimization Techniques
&lt;/h3&gt;

&lt;p&gt;In addition to queries and databases, there are other fundamental areas to optimize applications. Let's highlight some:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache&lt;/strong&gt;&lt;br&gt;
The use of cache is essential to reduce the load on the database by temporarily storing data that is frequently accessed. The community widely uses &lt;strong&gt;Redis&lt;/strong&gt; for this purpose.&lt;/p&gt;

&lt;p&gt;Redis is an in-memory NoSQL database, highly performant but volatile, as memory is not persistent. It is ideal for cases such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time consumption data&lt;/li&gt;
&lt;li&gt;User sessions&lt;/li&gt;
&lt;li&gt;Shopping carts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81zomeifeww13x4v1mp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81zomeifeww13x4v1mp2.png" alt="redis" width="308" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Laravel abstracts the use of Redis very well, both for caching and for other purposes. However, use it with caution! Perform many tests and learn about failover techniques to handle possible unavailability. For example, if your real-time dashboard depends on Redis, what will you do if it becomes inoperative? Planning alternatives is crucial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Optimizations
&lt;/h3&gt;

&lt;p&gt;Some important points when talking about code optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loops:&lt;/strong&gt; Not always replacing &lt;code&gt;for&lt;/code&gt; with &lt;code&gt;foreach&lt;/code&gt; will improve performance. Although the code may become more readable, it is essential to test using tools like &lt;strong&gt;Xdebug&lt;/strong&gt; or simple functions like &lt;code&gt;microtime()&lt;/code&gt; to validate the real impact. Pay attention to data manipulation inside the loop and avoid memory waste.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Native Operations:&lt;/strong&gt; Using native PHP functions, such as &lt;code&gt;array_map&lt;/code&gt;, is generally safer and more efficient than creating custom solutions. Remember: "No need to reinvent the wheel."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minimize Loop Operations:&lt;/strong&gt; Avoid creating unnecessary nested loops. A nested &lt;code&gt;foreach&lt;/code&gt; can be as harmful as a &lt;code&gt;SELECT *&lt;/code&gt;. Instead, consider alternative solutions, such as rewriting the logic or using more efficient queries to reduce complexity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PSR (PHP Standards Recommendations):&lt;/strong&gt; Adhering to PSR practices improves code readability and maintainability. Today, IDEs offer extensions that automate the application of these standards when saving changes. This not only helps in code quality but also makes life easier for those who will maintain it in the future.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Queues:&lt;/strong&gt; The use of queues is becoming increasingly common. The idea is simple: if the processing of a task can be done later, remove it from the immediate execution of the method.&lt;br&gt;
&lt;em&gt;Example&lt;/em&gt;:&lt;br&gt;
When a user makes a purchase on an e-commerce site, is it necessary to send the confirmation email instantly? Often, no. In this case, you can send the email to a queue, which will be processed in batches, saving resources and ensuring scalability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sub-Processes:&lt;/strong&gt; It's not a silver bullet, but depending on the situation, it can be implemented and is worth it.&lt;br&gt;
&lt;em&gt;Example&lt;/em&gt;:&lt;br&gt;
Imagine an application responsible for processing hundreds of invoices simultaneously, calculating taxes for each one. If all these operations are performed sequentially, you may face slow performance alerts, even with computational resources to spare (CPU and RAM).&lt;br&gt;
In this case, subprocesses can be a solution. Divide the processing into small parts and execute them in parallel. For example, each subprocess can be responsible for calculating taxes for a group of invoices. This allows your application to make better use of available resources, speed up processing, and avoid bottlenecks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requires and Includes:&lt;/strong&gt; Prefer the use of autoload to manage class and file loading. This not only improves performance but also avoids issues with large and unnecessary classes (the famous "megazords"). For example, loading a class with 7,000 lines just to use a method that performs a SELECT is extremely inefficient. In these situations, it is important to consider &lt;strong&gt;refactoring&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About the megazord, it's worth a chat about Refactoring.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Optimizations
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46z8opuf6hrpjro0eia1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46z8opuf6hrpjro0eia1.jpg" alt="data_center" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first thing you need to know is that PHP is a very lightweight language. Under normal conditions, with a machine suitable for the number of requests and with the proper code optimizations, everything tends to work well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"But Mateus, what is a machine corresponding to the number of requests?"&lt;/strong&gt;&lt;br&gt;
I have participated in the implementation and optimization of complex applications that received more than &lt;strong&gt;6 million requests per day&lt;/strong&gt; using, on average, &lt;strong&gt;two machines with 2 vCPUs and 2 GB of RAM each&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now, talking about tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PHP-FPM&lt;/strong&gt;&lt;br&gt;
It is a FastCGI process manager for PHP, an alternative to the Apache PHP module. PHP-FPM is faster, more flexible, and widely used in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpCache&lt;/strong&gt;&lt;br&gt;
A caching system for PHP scripts. It stores pre-compiled PHP code in memory, allowing PHP to execute faster, reducing execution time and resource consumption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep Versions Updated&lt;/strong&gt;&lt;br&gt;
It is crucial to keep packages, tools, frameworks, and the PHP language as up-to-date as possible. I understand that, often, the effort to migrate from an older version, such as PHP 7.4, to a newer one, such as PHP 8.x, may seem high. However, the benefits in terms of performance, security, and support are worth the effort.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important Considerations:&lt;/strong&gt;&lt;br&gt;
Pay special attention to the configuration of threads and child processes. Setting values too high for these configurations or allowing the use of large files can overload the machine, leading to failures and unavailability. Always adjust these configurations according to the machine's capacity and the application's actual requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring
&lt;/h3&gt;

&lt;p&gt;One of the most important items when talking about optimizations is understanding what needs to be optimized. For this, a good APM (Application Performance Monitoring) tool can provide valuable insights, in addition to allowing preventive actions before problems become critical.&lt;/p&gt;

&lt;p&gt;There are several approaches to monitoring, from manually searching PHP logs to automated solutions. Among the automated tools, the following stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Relic&lt;/li&gt;
&lt;li&gt;DataDog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools are known as "plug and play": just install the agent, restart the service, and configure the dashboards to create metrics and alerts.&lt;/p&gt;

&lt;p&gt;On the other hand, there are more manual options that, although requiring more effort and knowledge from the team, may be worth it depending on the context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana&lt;/li&gt;
&lt;li&gt;Elastic Stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge in using these manual tools lies in the complexity they add, especially in robust applications without a dedicated support team. These solutions require a lot of configuration, rigorous testing, and care to avoid negatively impacting performance. Additionally, they need layers and layers of failover—just one redundancy machine is often not enough.&lt;/p&gt;

&lt;p&gt;Despite this, implementing and testing these tools can be a great challenge for a weekend!&lt;/p&gt;

&lt;p&gt;In most cases, tools like New Relic offer a great starting point, providing significant capacity to prevent catastrophes. However, it is important to be aware of the cost, which can become significant depending on usage.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Maximizando a aplicação — PHP</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Thu, 30 Jan 2025 03:10:53 +0000</pubDate>
      <link>https://dev.to/tipomrsk/maximizando-a-aplicacao-php-2eml</link>
      <guid>https://dev.to/tipomrsk/maximizando-a-aplicacao-php-2eml</guid>
      <description>&lt;p&gt;Quando estamos programando, independentemente da linguagem, existem conceitos e técnicas que podemos adotar para melhorar tanto a legibilidade e o entendimento do código quanto o desempenho da aplicação.&lt;/p&gt;

&lt;p&gt;O maior aprendizado aqui é: &lt;strong&gt;não tente reinventar a roda&lt;/strong&gt;. Como eu sempre digo: estude e pesquise. Muito provavelmente, alguém já enfrentou o mesmo problema que você e encontrou uma solução eficiente. Aproveitar o conhecimento acumulado pela comunidade não apenas economiza tempo, mas também ajuda a evitar armadilhas e erros comuns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queries e Banco de Dados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sobre esse assunto, que é muito importante nas aplicações, eu já escrevi um pouco, vale a pena dar uma lida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;Otimizando Persistência e Leitura de dados no MySQL e Aplicação&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Técnicas de Otimização de Performance
&lt;/h3&gt;

&lt;p&gt;Além de queries e banco de dados, existem outras áreas fundamentais para otimizar aplicações. Vamos destacar algumas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache&lt;/strong&gt;&lt;br&gt;
O uso de cache é essencial para reduzir a carga no banco de dados, armazenando temporariamente dados que são acessados frequentemente. A comunidade utiliza amplamente o &lt;strong&gt;Redis&lt;/strong&gt; para esse propósito.&lt;/p&gt;

&lt;p&gt;O Redis é um banco de dados NoSQL em memória, altamente performático, mas volátil, já que a memória não é persistente. Ele é ideal para casos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dados de consumo em tempo real&lt;/li&gt;
&lt;li&gt;Sessões de usuários&lt;/li&gt;
&lt;li&gt;Carrinhos de compra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81zomeifeww13x4v1mp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81zomeifeww13x4v1mp2.png" alt="redis" width="308" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Laravel abstrai muito bem o uso do Redis, tanto para cache quanto para outras finalidades. No entanto, use-o com cautela! Realize muitos testes e aprenda sobre técnicas de failover para lidar com possíveis indisponibilidades. Por exemplo, se seu dashboard em tempo real depende do Redis, o que você fará se ele ficar inoperante? Planejar alternativas é crucial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Otimizações de código
&lt;/h3&gt;

&lt;p&gt;Alguns pontos importante quando falamos sobre otimização de escrita de código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loops:&lt;/strong&gt; Nem sempre substituir for por foreach vai melhorar o desempenho. Embora o código possa ficar mais legível, é essencial testar usando ferramentas como o *&lt;em&gt;Xdebug *&lt;/em&gt; ou funções simples como microtime() para validar o impacto real. Preste atenção na manipulação de dados dentro do loop e evite desperdício de memória.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operações Nativas:&lt;/strong&gt; Utilizar funções nativas do PHP, como array_map, geralmente é mais seguro e eficiente do que criar soluções personalizadas. Lembre-se: "Não precisa reinventar a roda".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minimize operações em Loop:&lt;/strong&gt; Evite criar loops dentro de loops desnecessariamente. Um foreach aninhado pode ser tão prejudicial quanto um &lt;code&gt;SELECT *&lt;/code&gt;. Em vez disso, considere soluções alternativas, como reescrever a lógica ou usar queries mais eficientes para reduzir a complexidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PSR (PHP Standards Recommendations)&lt;/strong&gt;: Aderir às práticas da PSR melhora a legibilidade e a manutenção do código. Hoje, IDEs oferecem extensões que automatizam a aplicação desses padrões ao salvar alterações. Isso não apenas ajuda na qualidade do código, mas também facilita a vida de quem dará manutenção no futuro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Filas:&lt;/strong&gt; O uso de filas (queues) é cada vez mais comum. A ideia é simples: se o processamento de uma tarefa pode ser feito posteriormente, remova-a da execução imediata do método.&lt;br&gt;
&lt;em&gt;Exemplo&lt;/em&gt;:&lt;br&gt;
Quando um usuário faz uma compra no e-commerce, é necessário enviar o e-mail de confirmação instantaneamente? Muitas vezes, não. Nesse caso, você pode enviar o e-mail para uma fila, que será processada em lotes, economizando recursos e garantindo escalabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sub-Processos&lt;/strong&gt;: Não é bala de prata, mas dependendo da situação pode ser implementado e vale a pena.&lt;br&gt;
&lt;em&gt;Exemplo&lt;/em&gt;:&lt;br&gt;
Imagine uma aplicação responsável por processar centenas de notas fiscais simultaneamente, calculando impostos para cada uma. Se todas essas operações forem realizadas em sequência, você poderá enfrentar alertas de lentidão, mesmo com recursos computacionais sobrando (CPU e RAM).&lt;br&gt;
Nesse caso, subprocessos podem ser uma solução. Divida o processamento em pequenas partes e execute-as em paralelo. Por exemplo, cada subprocesso pode ser responsável por calcular impostos para um grupo de notas fiscais. Isso permite que sua aplicação aproveite melhor os recursos disponíveis, acelere o processamento e evite gargalos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requires e includes&lt;/strong&gt;: Prefira o uso de autoload para gerenciar carregamento de classes e arquivos. Isso não só melhora o desempenho como evita problemas com classes grandes e desnecessárias (os famosos “megazords”). Por exemplo, carregar uma classe com 7.000 linhas apenas para usar um método que faz um SELECT é extremamente ineficiente. Nessas situações, é importante considerar uma &lt;strong&gt;refatoração&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sobre o megazord, vale a pena um papo sobre Refatoração.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Otimizações de servidor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46z8opuf6hrpjro0eia1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46z8opuf6hrpjro0eia1.jpg" alt="data_center" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A primeira coisa que você precisa saber é que o PHP é uma linguagem muito leve. Em condições normais de temperatura e pressão, com uma máquina adequada à quantidade de requisições e com as devidas otimizações no código, tudo tende a funcionar bem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Mas Mateus, o que é uma máquina correspondente à quantidade de requisições?”&lt;/strong&gt;&lt;br&gt;
Já participei da implementação e otimização de aplicações complexas que recebiam mais de &lt;strong&gt;6 milhões de requisições por dia&lt;/strong&gt; utilizando, em média, &lt;strong&gt;duas máquinas com 2 vCPUs e 2 GB de RAM cada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agora, falando sobre ferramentas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PHP-FPM&lt;/strong&gt;&lt;br&gt;
É um gerenciador de processos FastCGI para PHP, uma alternativa ao módulo PHP do Apache. O PHP-FPM é mais rápido, flexível e amplamente utilizado em produção.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpCache&lt;/strong&gt;&lt;br&gt;
Um sistema de cache para os scripts PHP. Ele armazena o código PHP pré-compilado na memória, permitindo que o PHP execute com maior rapidez, reduzindo o tempo de execução e o consumo de recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manter as versões atualizadas&lt;/strong&gt;&lt;br&gt;
É fundamental manter os pacotes, ferramentas, frameworks e a linguagem PHP o mais atualizados possível. Entendo que, muitas vezes, o esforço para migrar de uma versão mais antiga, como o PHP 7.4, para uma mais recente, como o PHP 8.x, pode parecer alto. Porém, os benefícios em termos de desempenho, segurança e suporte valem o esforço.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cuidados importantes:&lt;/strong&gt;&lt;br&gt;
Tenha atenção especial à configuração de threads e child processes (processos filhos). Definir valores muito altos para essas configurações ou permitir o uso de arquivos grandes pode sobrecarregar a máquina, levando a falhas e indisponibilidades. Sempre ajuste essas configurações de acordo com a capacidade da máquina e os requisitos reais da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoramento
&lt;/h3&gt;

&lt;p&gt;Um dos itens mais importantes quando falamos sobre otimizações é entender o que precisa ser otimizado. Para isso, uma boa ferramenta de monitoramento no nível de APM (Application Performance Monitoring) pode fornecer informações valiosas, além de permitir ações preventivas antes que os problemas se tornem críticos.&lt;/p&gt;

&lt;p&gt;Existem várias abordagens para monitoramento, desde a busca manual em logs do PHP até soluções automatizadas. Entre as ferramentas automatizadas, destacam-se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Relic&lt;/li&gt;
&lt;li&gt;DataDog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas ferramentas são conhecidas como “plug and play”: basta instalar o agente, reiniciar o serviço e configurar os painéis para criar métricas e alertas.&lt;/p&gt;

&lt;p&gt;Por outro lado, existem opções mais manuais que, embora exijam maior esforço e conhecimento da equipe, podem valer a pena dependendo do contexto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana&lt;/li&gt;
&lt;li&gt;Elastic Stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O desafio em utilizar essas ferramentas manuais está na complexidade que elas adicionam, especialmente em aplicações robustas sem um time dedicado para sustentação. Essas soluções demandam muita configuração, testes rigorosos e cuidado para evitar que os agentes impactem negativamente o desempenho. Além disso, elas precisam de camadas e camadas de failover — apenas uma máquina de redundância muitas vezes não é suficiente.&lt;/p&gt;

&lt;p&gt;Apesar disso, implementar e testar essas ferramentas pode ser um ótimo desafio para um final de semana!&lt;/p&gt;

&lt;p&gt;Na maioria dos casos, ferramentas como o New Relic oferecem um ótimo ponto de partida, proporcionando grande capacidade para prevenir catástrofes. No entanto, é importante ficar atento ao custo, que pode se tornar significativo dependendo do uso.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>performance</category>
      <category>programming</category>
    </item>
    <item>
      <title>Docker: A Week or a Few Hours</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Thu, 30 Jan 2025 02:58:29 +0000</pubDate>
      <link>https://dev.to/tipomrsk/docker-a-week-or-a-few-hours-4chl</link>
      <guid>https://dev.to/tipomrsk/docker-a-week-or-a-few-hours-4chl</guid>
      <description>&lt;p&gt;Starting a new project always comes with a mix of excitement and hesitation. Will the code run? Will the environment cooperate? And most importantly: how long will it take until everything is up and running?&lt;/p&gt;

&lt;p&gt;That’s exactly how I found myself facing a new repository, surrounded by an equally new team. Before I even wrote a single line of code, I was given a warning:&lt;/p&gt;

&lt;p&gt;— It took me a week to get this project running on my machine. It works in production, though. I’ve never changed anything there.&lt;/p&gt;

&lt;p&gt;Nothing like a little motivation before getting started, right? I took a deep breath and did what any rational person would do: I opened the README.md. Not much information. Okay, plan B: check language versions, dependencies, tools. Incompatible versions, conflicting packages, a festival of minor roadblocks. Three-quarters of the day spent, and still, the application wouldn't run.&lt;/p&gt;

&lt;p&gt;Then it hit me: with everything I had already changed and installed, how could I be sure I was on the right track? What if, instead of fighting the environment, I simply dockerized it?&lt;/p&gt;

&lt;p&gt;That’s the real power of containers: predictability. I can break everything as many times as I want and always have a clean environment to start over. A few hours later, the application was running. Not perfectly, but it worked. A bit more effort, and I had something presentable, a first step toward building a solid and reliable environment.&lt;/p&gt;

&lt;p&gt;Docker is a tool for standardization, automation, and easier deployments. But it’s also a great ally in experimentation and learning. It allows us to fail without fear, to test, to optimize. And at the end of the day, it doesn’t matter whether it took seven days or just a few hours—what matters is that now, the project runs.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>programming</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Geoespacial no Laravel: Otimizações para Mapas Interativos e Grandes Volumes de Dados</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Wed, 29 Jan 2025 14:48:17 +0000</pubDate>
      <link>https://dev.to/tipomrsk/geoespacial-no-laravel-otimizacoes-para-mapas-interativos-e-grandes-volumes-de-dados-2j3n</link>
      <guid>https://dev.to/tipomrsk/geoespacial-no-laravel-otimizacoes-para-mapas-interativos-e-grandes-volumes-de-dados-2j3n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Com mais de 7 milhões de registros e a necessidade de transformar dados em insights acionáveis, como podemos utilizar tecnologias geoespaciais para criar mapas interativos eficientes? Neste artigo, exploramos como Laravel e MySQL podem enfrentar esse desafio de maneira escalável e eficaz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  O Desafio Inicial
&lt;/h3&gt;

&lt;p&gt;O projeto surgiu com a seguinte demanda: “Temos mais de 7 milhões de registros em uma tabela no MySQL e queremos gerar valor com esses dados.”&lt;/p&gt;

&lt;p&gt;A primeira coisa que muitas pessoas pensam é: “Qual linguagem usar para construir a aplicação?” Contudo, frequentemente esquecemos o artefato mais crucial nesse tipo de situação: o banco de dados. Será que ele aguenta a demanda? Preciso migrar? Mudar a estrutura? Será que o MySQL é capaz de lidar com essa carga?&lt;/p&gt;

&lt;p&gt;Minha resposta inicial foi: &lt;strong&gt;“Provavelmente, o MySQL consegue resolver isso.”&lt;/strong&gt; Mas antes de mergulhar no desafio do polígono (que é uma história à parte), precisamos entender como o MySQL lidará com os filtros. Quais são os filtros necessários? Quais atributos realmente importam?&lt;/p&gt;

&lt;p&gt;A tabela em questão tinha dezenas de atributos, mas poucos eram relevantes para a solução (como de costume). Validamos as possibilidades de preenchimento nos filtros e criamos algumas restrições para afinar as buscas.&lt;br&gt;
Como estamos falando sobre mapa, presumimos que a base da busca vai ser a cidade ou algo mais específico, nesse caso eram os bairros. Sabendo disso, a partir da seleção do estado e da cidade por parte do usuário, podemos buscar todos os bairros da cidade, permitindo o uso de um select2 onde o usuário pudesse escolher a partir de uma estrutura controlada.&lt;/p&gt;

&lt;p&gt;Assim, com o bairro preenchido, poderíamos disponibilizar outros filtros, como nomes, categorias, avaliações e outras possíveis características. Isso tornaria as buscas ainda mais precisas, oferecendo aos usuários a capacidade de encontrar exatamente o que procuram, sem comprometer a performance do sistema.&lt;/p&gt;

&lt;p&gt;Com essa abordagem, conseguimos criar filtros dinâmicos e bem definidos, permitindo a escrita de queries mais completas e otimizadas. Além disso, com a aplicação de alguns índices adequados, garantimos especificidade nas buscas. Até aqui, o filtro estava resolvido.&lt;/p&gt;

&lt;p&gt;Agora, o desafio do polígono. Mas antes disso, vamos falar sobre a aplicação que dá suporte a tudo isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Aplicação
&lt;/h3&gt;

&lt;p&gt;Sabendo da quantidade massiva de registros, mas que apenas uma fração seria renderizada simultaneamente no mapa, a aplicação foi planejada com foco na eficiência. Para isso, escolhi uma stack robusta e flexível que pra mim é (como eu normalmente digo) “Toque me voi”: Laravel e React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6jdxnrktraok3xji463.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6jdxnrktraok3xji463.png" alt="Laravel" width="700" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel&lt;/strong&gt;&lt;br&gt;
O back-end, desenvolvido com Laravel 11, utilizei o Breeze para estruturar rapidamente a base do projeto e permitir foco nas funcionalidades críticas. Além da arquitetura MVC padrão, adicionei camadas de Service e Repository para organizar responsabilidades e facilitar a manutenção do código.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fniw90wudvkqe3b9asdu5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fniw90wudvkqe3b9asdu5.png" alt="React" width="522" height="343"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;React&lt;/strong&gt;&lt;br&gt;
No front-end, a aplicação foi totalmente modularizada com React. Componentes bem definidos e o uso de partials garantiram a reutilização de elementos e um fluxo claro de comunicação entre as partes do sistema. Essa organização permitiu que o front-end se comunicasse eficientemente com o back-end através de requisições Axios, garantindo simplicidade e eficiência.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vale Saber
&lt;/h3&gt;

&lt;p&gt;Embora o projeto fosse inicialmente interno e de baixa demanda, a arquitetura foi projetada para possibilitar escalabilidade futura, como o uso de serviços independentes na AWS com por exemplo, Fargate para a API e CloudFront para o front-end.&lt;/p&gt;

&lt;p&gt;Essa arquitetura é possível porque toda a interação acontece via API, e o serviço não mantém estado no lado do servidor, o que facilita a separação de responsabilidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j6ioxlzby2zzomsdorf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j6ioxlzby2zzomsdorf.jpg" alt="PestPHP" width="471" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Testes
&lt;/h3&gt;

&lt;p&gt;A estabilidade do sistema foi garantida com uma suíte de testes robusta, implementada em Pest, cobrindo 22 endpoints com cerca de 500 testes. Adotar uma abordagem orientada a testes trouxe confiança nos deploys e eficiência na manutenção, mostrando o valor indispensável dessa prática no desenvolvimento de software escalável e confiável.&lt;/p&gt;

&lt;h3&gt;
  
  
  O core da aplicação
&lt;/h3&gt;

&lt;p&gt;A parte central da aplicação gira em torno do mapa. Para gerenciar essa funcionalidade, utilizei o Leaflet, uma biblioteca leve e poderosa para manipulação de mapas, complementada por alguns pacotes que trouxeram mais eficiência e recursos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clusterização de Markers&lt;/strong&gt;&lt;br&gt;
Uma das principais otimizações foi feita com o pacote &lt;strong&gt;&lt;u&gt;react-leaflet-markercluster&lt;/u&gt;&lt;/strong&gt;, que permite agrupar os markers em clusters dinâmicos. Como a aplicação lida com um grande número de pontos no mapa, tentar renderizar todos de uma só vez resultaria em uma degradação significativa de desempenho. Com a clusterização, conseguimos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduzir a sobrecarga de renderização&lt;/strong&gt;, agrupando markers próximos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhorar a experiência do usuário&lt;/strong&gt;, exibindo os pontos de forma mais limpa e organizada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manter a performance estável&lt;/strong&gt;, mesmo com milhares de registros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desenho de Polígonos&lt;/strong&gt;&lt;br&gt;
Outro elemento crucial foi o &lt;strong&gt;&lt;u&gt;react-leaflet-draw&lt;/u&gt;&lt;/strong&gt;, utilizado para permitir que os usuários desenhem polígonos diretamente no mapa. Esse recurso possibilitou:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capturar as coordenadas dos vértices do polígono desenhado.&lt;/li&gt;
&lt;li&gt;Usar essas coordenadas para construir uma query no banco de dados, filtrando os registros com base na interseção dos pontos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integração e Usabilidade
&lt;/h3&gt;

&lt;p&gt;Os filtros adicionais, como seleção de estado, cidade e bairro, foram incorporados diretamente no fluxo do mapa. Isso garantiu uma experiência intuitiva, onde o usuário pode refinar sua busca antes ou depois de desenhar o polígono.&lt;/p&gt;

&lt;p&gt;Além disso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camadas personalizadas&lt;/strong&gt; foram configuradas no Leaflet para diferenciar tipos de registros, categorias e outros atributos relevantes.&lt;/li&gt;
&lt;li&gt;O mapa foi otimizado para lidar com &lt;strong&gt;lazy loading&lt;/strong&gt; de pontos, carregando apenas os dados visíveis na área em foco, o que ajuda a reduzir a sobrecarga no cliente e no servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Tabela e Índices
&lt;/h3&gt;

&lt;p&gt;A tabela utilizada é semelhante a uma tabela de usuários comum, mas com foco no endereço e uma coluna específica para armazenar os pares de coordenadas. Essas coordenadas são armazenadas em uma coluna do tipo &lt;strong&gt;POINT&lt;/strong&gt;, que representa um ponto no espaço em um sistema de coordenadas geográficas ou cartesianas. Além disso, foi adicionado um índice geoespacial para otimizar as consultas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como Funciona o Índice Geoespacial
&lt;/h3&gt;

&lt;p&gt;O índice geoespacial é uma estrutura especializada para acelerar consultas relacionadas a dados espaciais, como pontos, linhas e polígonos. No caso do MySQL, o índice espacial é implementado usando R-Tree (Regional Tree) em tabelas do tipo MyISAM ou InnoDB para colunas do tipo POINT, LINESTRING ou POLYGON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Otimização com o Índice Geoespacial&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Armazenamento Estruturado&lt;br&gt;
O índice organiza os dados espaciais de forma hierárquica, dividindo-os em regiões menores que representam partes do espaço. Isso permite localizar rapidamente quais áreas são relevantes para uma consulta específica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consultas com Funções Espaciais&lt;br&gt;
As funções espaciais do MySQL, como &lt;strong&gt;ST_Contains, ST_Within e ST_Intersects&lt;/strong&gt;, utilizam o índice para identificar quais registros se encontram dentro de uma área específica, como um polígono desenhado no mapa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplo: A função **ST_Contains **verifica se um polígono contém um ponto e utiliza o índice para determinar rapidamente quais pontos estão dentro do polígono.&lt;br&gt;
&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;SELECT id, name, address
FROM users
WHERE ST_Contains(
    ST_GeomFromText('POLYGON((...))'),
    coordinates
);
-- Esse é um exemplo de escrita para buscar registros dentro de um polígono.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nessa consulta:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ST_GeomFromText&lt;/code&gt; cria o polígono baseado nas coordenadas enviadas pela aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ST_Contains&lt;/code&gt; usa o índice geoespacial para verificar quais pontos estão dentro do polígono.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Considerações Finais
&lt;/h3&gt;

&lt;p&gt;Ao concluir o projeto, alguns pontos de aprendizado e observações se destacaram. Estes detalhes podem ser úteis para quem trabalha com projetos similares e busca otimizar tanto o desempenho quanto a arquitetura das aplicações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Migração das Coordenadas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As coordenadas previamente existentes estavam em colunas separadas (latitude e longitude), o que inviabilizava o uso direto do índice geoespacial. Para resolver isso:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Foi necessário criar um script que percorresse os registros e os transformasse em uma nova coluna chamada coordinates, do tipo POINT.&lt;br&gt;
Esse processo garantiu a compatibilidade com o índice espacial e viabilizou a utilização das funções geoespaciais do MySQL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Eficiência no JavaScript&lt;/strong&gt;&lt;br&gt;
Embora o JavaScript seja versátil, a escolha do método de iteração pode impactar a performance dependendo do contexto. Um exemplo prático:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O uso do array.map é comum por sua sintaxe limpa e funcionalidade, mas pode ser menos performático em comparação com um loop for...in dependendo da situação.&lt;/li&gt;
&lt;li&gt;É importante analisar o caso específico e realizar testes de desempenho para determinar qual abordagem é mais eficiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Soluções Alternativas para Otimização&lt;/strong&gt;&lt;br&gt;
Sempre busque formas de melhorar a eficiência e a experiência do usuário. No contexto deste projeto, algumas técnicas foram essenciais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loading&lt;/strong&gt;: Carregar os dados apenas quando eles são necessários, como ao aproximar ou mover o mapa, reduziu significativamente a carga na aplicação e no servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clusterização&lt;/strong&gt;: Mostrar grupos de registros em vez de pontos individuais evitou a sobrecarga de renderização e melhorou a experiência de visualização no mapa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Tratamentos e Validações Concretas&lt;/strong&gt;&lt;br&gt;
Um dos maiores gargalos de performance pode ser causado por retrabalhos desnecessários na busca de dados. Exemplos de boas práticas incluem atualizações localizadas, se um registro precisa ser atualizado (como o status em um relatório), execute o update no banco, e se for retornado sucesso atualize apenas o necessário no front sem buscar todo data set novamente.&lt;/p&gt;

&lt;p&gt;Projetos como esse mostram como pequenos detalhes fazem a diferença na performance e escalabilidade de uma aplicação. Investir em otimizações direcionadas, evitar desperdícios de recursos e adotar boas práticas de desenvolvimento garante não apenas um melhor desempenho, mas também uma base sólida para crescer com o projeto.&lt;br&gt;
Último mas não menos importante: &lt;strong&gt;&lt;em&gt;Mantenha o foco na entrega.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>mysql</category>
      <category>performance</category>
    </item>
    <item>
      <title>Docker, Uma Semana ou Algumas Horas</title>
      <dc:creator>Mateus Bougleux</dc:creator>
      <pubDate>Wed, 29 Jan 2025 14:35:42 +0000</pubDate>
      <link>https://dev.to/tipomrsk/docker-uma-semana-ou-algumas-horas-51a8</link>
      <guid>https://dev.to/tipomrsk/docker-uma-semana-ou-algumas-horas-51a8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j9l2jec3aw9pav8mnrq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j9l2jec3aw9pav8mnrq.jpg" alt="docker" width="728" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Começar um projeto novo sempre vem com um misto de empolgação e receio. O código vai rodar? O ambiente vai cooperar? E, principalmente: quanto tempo vai levar até tudo estar funcionando?&lt;/p&gt;

&lt;p&gt;Foi assim que me vi diante de um repositório novo, cercado por uma equipe igualmente nova. Antes mesmo de escrever uma linha de código, me deram um aviso:&lt;/p&gt;

&lt;p&gt;— Demorei uma semana pra fazer esse projeto rodar na minha máquina. Em produção, já funciona. Nunca alterei nada por lá.&lt;/p&gt;

&lt;p&gt;Nada como um pouco de motivação antes de começar, né? Respirei fundo e fiz o que qualquer pessoa racional faria: abri o README.md. Pouca informação. Ok, plano B: checar versões de linguagens, dependências, ferramentas. Versões incompatíveis, pacotes conflitantes, um festival de pequenos empecilhos. Três quartos do dia investidos e nada da aplicação funcionar.&lt;/p&gt;

&lt;p&gt;Foi então que me ocorreu: com tudo que já alterei e instalei, como eu posso garantir que estou no caminho certo? E se, em vez de lutar contra o ambiente, eu simplesmente dockerizasse?&lt;/p&gt;

&lt;p&gt;A grande sacada dos containers é essa: a previsibilidade. Eu posso quebrar tudo quantas vezes quiser, e sempre terei um ambiente limpo para recomeçar. Depois de algumas horas, a aplicação rodava. Não perfeitamente, mas funcionava. Um pouco mais de esforço e já havia algo digno de ser apresentado, um primeiro passo para estruturar um ambiente sólido e confiável.&lt;/p&gt;

&lt;p&gt;Docker é ferramenta para padronizar, automatizar, facilitar deploys. Mas também é um grande aliado na experimentação e aprendizado. Ele nos permite errar sem medo, testar, otimizar. E no fim do dia, não importa se levaram sete dias ou algumas horas — o que importa é que, agora, o projeto roda.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>docker</category>
      <category>programming</category>
      <category>development</category>
    </item>
  </channel>
</rss>
