<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://karreiro.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://karreiro.com/" rel="alternate" type="text/html" /><updated>2026-01-06T19:28:16+00:00</updated><id>https://karreiro.com/feed.xml</id><title type="html">Guilherme Carreiro</title><subtitle>Guilherme Carreiro, Staff Engineer</subtitle><author><name>Guilherme Carreiro</name></author><entry><title type="html">Navigating the world of Language Servers</title><link href="https://karreiro.com/2023/01/22/navigating-the-world-of-language-servers/" rel="alternate" type="text/html" title="Navigating the world of Language Servers" /><published>2023-01-22T00:00:00+00:00</published><updated>2023-01-22T00:00:00+00:00</updated><id>https://karreiro.com/2023/01/22/navigating-the-world-of-language-servers</id><content type="html" xml:base="https://karreiro.com/2023/01/22/navigating-the-world-of-language-servers/"><![CDATA[<p>We all use language servers, even before we learn to program, still, it took me a few years to finally notice what they really are.</p>

<p>Have you ever thought about that?</p>

<p><a href="/assets/language-server-demo.png"><img src="/assets/language-server-demo.png" alt="Language Server demo" title="Language Server demo" /></a></p>

<p>The editor knows we can call <code class="language-plaintext highlighter-rouge">fill</code> or <code class="language-plaintext highlighter-rouge">filter</code>! How does the editor know that <code class="language-plaintext highlighter-rouge">elements</code> is an array of numbers? How do those things work under the hoods?!</p>

<p>The language server does that magic! ✨</p>

<p>The editor (e.g. VS Code) plays the client-side role and takes care of presenting UI elements and firing UI events. On the other side, each language has its LSP implementation to take care of realizing possible methods, variables, etc. Hmm, ok.. things may be getting a bit confusing, so let’s take a step back, and get some terms out of our way first:</p>

<ul>
  <li>
    <p><strong>LSP (Language Server Protocol)</strong> is an Open-Source <a href="https://github.com/Microsoft/language-server-protocol">project</a> that defines a common protocol for language servers. So, for example, when users press <code class="language-plaintext highlighter-rouge">Ctrl + Space</code> in the editor, it knows it needs to send the <code class="language-plaintext highlighter-rouge">"textDocument/completion"</code> message to the language server to get some code completions. On the other side, language servers follow that standard and answer that message</p>
  </li>
  <li>
    <p><strong>Language Server</strong> is a process that receives requests and provides responses. As you’re probably wondering <a href="https://microsoft.github.io/language-server-protocol/implementors/servers/">each language has its language server</a>: Rust has Rust Analyzer, Liquid has Theme Check, TypeScript has the typescript-language-server, and so on</p>
  </li>
  <li>
    <p><strong>Intelligent code completion</strong> refers to context-aware code completion features, like in the example <a href="/assets/language-server-demo.png">above</a> (notice that the suggestions had the context of the <code class="language-plaintext highlighter-rouge">elements</code> variable and cursor position)</p>
  </li>
  <li>
    <p><strong>IntelliSense</strong> is a set of code editing features built into VS Code. I’ve noticed that sometimes this term is used interchangeably with intelligent code completion, but IntelliSense incorporates <a href="https://code.visualstudio.com/docs/editor/intellisense#_intellisense-features">more features</a> than that</p>
  </li>
</ul>

<p>So, when you want suggestions and press <code class="language-plaintext highlighter-rouge">Ctrl + Space</code>, the following process happens in a matter of a couple of milliseconds:</p>

<p><a href="/assets/language-server-overview.png"><img src="/assets/language-server-overview.png" alt="Language Server Protocol overview" title="Language Server Protocol overview" /></a></p>

<ul>
  <li>Notice how the language server builds an <a href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a> to get more information about the current context</li>
  <li>After that, it considers the cursor (<code class="language-plaintext highlighter-rouge">█</code>) position and realizes it needs to list fields for the <code class="language-plaintext highlighter-rouge">foo</code> variable</li>
  <li>With the AST, it knows that <code class="language-plaintext highlighter-rouge">foo</code> is a <code class="language-plaintext highlighter-rouge">product</code></li>
  <li>With the metadata for types, it also knows that <code class="language-plaintext highlighter-rouge">product</code> objects have the fields <code class="language-plaintext highlighter-rouge">available</code>, <code class="language-plaintext highlighter-rouge">collections</code>, and <code class="language-plaintext highlighter-rouge">compare_at_price</code></li>
  <li>Finally, the language server answers that JSON-RPC message with proper suggestions.</li>
</ul>

<h3 id="the-fun-part">The fun part</h3>

<p>There are many roles to play when it comes about building a good editor DX. Language servers clearly have one the most challenging, fun, and critical ones, as they need to understand what’s happening in the code even when it’s broken to guide developers towards the solution.</p>

<p>Months ago, I built <a href="https://karreiro.com/2021/03/30/how-the-new-feel-code-completion-works-under-the-hoods">a tiny context-aware language server</a> for the <a href="https://learn-dmn-in-15-minutes.com/learn/the-feel-language">FEEL</a> language, and these weeks I’ve been working on the <a href="https://shopify.github.io/liquid">Liquid</a> context-aware code-completion. Now, I can notice so many patterns, but also how the language design heavily impacts the language server implementations.</p>

<p>If you’re interested in learning more about that hands-on part or the conceptual part of building a language servers, please don’t hesitate to reach out to me. I’m planning to write even more articles related to LSP and how to make our lives as developers more fun. Follow my RSS feed to stay updated on the latest posts :)</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[We all use language servers, even before we learn to program, still, it took me a few years to finally notice what they really are.]]></summary></entry><entry><title type="html">[URLOTW] The master guide to smooth, realistic shadows in CSS</title><link href="https://karreiro.com/2021/06/26/urlotw-the-master-guide-to-smooth-realistic-shadows-in-css/" rel="alternate" type="text/html" title="[URLOTW] The master guide to smooth, realistic shadows in CSS" /><published>2021-06-26T00:00:00+00:00</published><updated>2021-06-26T00:00:00+00:00</updated><id>https://karreiro.com/2021/06/26/urlotw-the-master-guide-to-smooth-realistic-shadows-in-css</id><content type="html" xml:base="https://karreiro.com/2021/06/26/urlotw-the-master-guide-to-smooth-realistic-shadows-in-css/"><![CDATA[<p>
  <b>URL of the week</b> (<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<svg width="16px" height="16pxpx" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#fff">
    <path d="M501.902,150.373l-138.666,-143.998c-4.524,-4.692 -11.457,-6.164 -17.492,-3.735c-6.059,2.453 -10.027,8.321 -10.027,14.848l-0,69.335l-5.332,-0c-114.687,-0 -207.998,93.311 -207.998,207.998l0,31.999c0,7.422 5.227,13.609 12.457,15.297c1.176,0.297 2.348,0.426 3.519,0.426c6.039,-0 11.821,-3.543 14.614,-9.11c29.995,-60.011 90.303,-97.28 157.396,-97.28l25.344,0l-0,69.332c-0,6.531 3.968,12.398 10.027,14.828c5.996,2.453 12.968,0.96 17.492,-3.735l138.666,-143.998c5.973,-6.207 5.973,-15.977 0,-22.207Z" />
    <path d="M448.002,511.998l-383.996,0c-35.285,0 -63.999,-28.71 -63.999,-63.999l-0,-298.661c-0,-35.285 28.714,-63.999 63.999,-63.999l63.999,-0c11.797,-0 21.332,9.535 21.332,21.332c0,11.796 -9.535,21.331 -21.332,21.331l-63.999,0c-11.777,0 -21.336,9.559 -21.336,21.336l0,298.661c0,11.777 9.559,21.336 21.336,21.336l383.996,-0c11.773,-0 21.332,-9.559 21.332,-21.336l-0,-170.662c-0,-11.797 9.535,-21.336 21.331,-21.336c11.801,0 21.336,9.539 21.336,21.336l0,170.662c0,35.289 -28.715,63.999 -63.999,63.999Z" />
</svg>
) is a kind of post where I share a relevant URL with you :-)
</p>

<p>This week the winner is <strong>The master guide to smooth, realistic shadows in CSS</strong>:
<a href="https://dev.to/devang/the-master-guide-to-smooth-realistic-shadows-in-css-463p">dev.to/devang/the-master-guide-to-smooth-realistic-shadows-in-css-463p</a>.</p>

<p><img src="/assets/the-master-guide-to-smooth-realistic-shadows-in-css.png" alt="The master guide to smooth, realistic shadows in CSS - website screenshot" title="The master guide to smooth, realistic shadows in CSS - website screenshot" /></p>

<p>I got myself surprised by the use of multiple shadow layers to achieve such excellent results. Still, the <a href="https://caniuse.com/mdn-css_properties_box-shadow_multiple_shadows">support</a> of most of the browsers for this feature is quite extensive.</p>

<p>I hope you like this CSS tip too!</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[URL of the week ( ) is a kind of post where I share a relevant URL with you :-)]]></summary></entry><entry><title type="html">DMN lives in the KIE Group YouTube channel - Part 3</title><link href="https://karreiro.com/2021/06/20/dmn-lives-in-the-kie-group-youtube-channel-part-3/" rel="alternate" type="text/html" title="DMN lives in the KIE Group YouTube channel - Part 3" /><published>2021-06-20T00:00:00+00:00</published><updated>2021-06-20T00:00:00+00:00</updated><id>https://karreiro.com/2021/06/20/dmn-lives-in-the-kie-group-youtube-channel-part-3</id><content type="html" xml:base="https://karreiro.com/2021/06/20/dmn-lives-in-the-kie-group-youtube-channel-part-3/"><![CDATA[<p>The <a href="https://www.youtube.com/channel/UCUjeymTM-TrwHs36388VRbw">KIE YouTube channel</a> is regularly posting quite interesting content!</p>

<p>Last week I had the pleasure of present my talk <strong>How to play with DMN</strong> at the <strong>KieLive#36</strong>:</p>

<iframe width="100%" height="450" src="https://www.youtube.com/embed/HQHjrf3i91Q" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>During the presentation, I created a simple snake game using a DMN model (it has an interesting plot twist in the end).</p>

<p>Also, if you’ve enjoyed it, I’d recommend <a href="https://www.youtube.com/watch?v=66Q--bWibKQ">KieLive#11</a>, <a href="https://www.youtube.com/watch?v=E7JU0E5FN-w">KieLive#26</a>, and <a href="https://www.youtube.com/watch?v=WMnGDgVUwHQ">KieLive#31</a> - all these lives approach the use of DMN models from different perspectives.</p>

<p>I hope you like it!</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[The KIE YouTube channel is regularly posting quite interesting content!]]></summary></entry><entry><title type="html">[URLOTW] React: Glossary + Explain Like I’m Five</title><link href="https://karreiro.com/2021/06/19/urlotw-glossary-explain-like-im-five/" rel="alternate" type="text/html" title="[URLOTW] React: Glossary + Explain Like I’m Five" /><published>2021-06-19T00:00:00+00:00</published><updated>2021-06-19T00:00:00+00:00</updated><id>https://karreiro.com/2021/06/19/urlotw-glossary-explain-like-im-five</id><content type="html" xml:base="https://karreiro.com/2021/06/19/urlotw-glossary-explain-like-im-five/"><![CDATA[<p>
  <b>URL of the week</b> (<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<svg width="16px" height="16pxpx" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#fff">
    <path d="M501.902,150.373l-138.666,-143.998c-4.524,-4.692 -11.457,-6.164 -17.492,-3.735c-6.059,2.453 -10.027,8.321 -10.027,14.848l-0,69.335l-5.332,-0c-114.687,-0 -207.998,93.311 -207.998,207.998l0,31.999c0,7.422 5.227,13.609 12.457,15.297c1.176,0.297 2.348,0.426 3.519,0.426c6.039,-0 11.821,-3.543 14.614,-9.11c29.995,-60.011 90.303,-97.28 157.396,-97.28l25.344,0l-0,69.332c-0,6.531 3.968,12.398 10.027,14.828c5.996,2.453 12.968,0.96 17.492,-3.735l138.666,-143.998c5.973,-6.207 5.973,-15.977 0,-22.207Z" />
    <path d="M448.002,511.998l-383.996,0c-35.285,0 -63.999,-28.71 -63.999,-63.999l-0,-298.661c-0,-35.285 28.714,-63.999 63.999,-63.999l63.999,-0c11.797,-0 21.332,9.535 21.332,21.332c0,11.796 -9.535,21.331 -21.332,21.331l-63.999,0c-11.777,0 -21.336,9.559 -21.336,21.336l0,298.661c0,11.777 9.559,21.336 21.336,21.336l383.996,-0c11.773,-0 21.332,-9.559 21.332,-21.336l-0,-170.662c-0,-11.797 9.535,-21.336 21.331,-21.336c11.801,0 21.336,9.539 21.336,21.336l0,170.662c0,35.289 -28.715,63.999 -63.999,63.999Z" />
</svg>
) is a kind of post where I share a relevant URL with you :-)
</p>

<p>This week the winner is <strong>React: Glossary + Explain Like I’m Five</strong>:
<a href="https://github.com/reactwg/react-18/discussions/46">github.com/reactwg/react-18/discussions/46</a>.</p>

<p><a href="/assets/glossary-explain-like-im-five.png"><img src="/assets/glossary-explain-like-im-five.png" alt="React: Glossary + Explain Like I'm Five - website screenshot" title="React: Glossary + Explain Like I'm Five - website screenshot" /></a></p>

<p>Even if you already know the topics mentioned in this thread, it is still worth checking. Sometimes, we already comprehend something, but we do not have good enough words to clarify it for other people.</p>

<p>It has many one-tweet definitions and quick explanations that help you when you need to explain something quickly. For me, the “debouncing and throttling” part was quite pleasant to read.</p>

<p>I hope you like this URL too!</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[URL of the week ( ) is a kind of post where I share a relevant URL with you :-)]]></summary></entry><entry><title type="html">WASI: WebAssembly System Interface</title><link href="https://karreiro.com/2021/05/30/wasi-webassembly-system-interface/" rel="alternate" type="text/html" title="WASI: WebAssembly System Interface" /><published>2021-05-30T00:00:00+00:00</published><updated>2021-05-30T00:00:00+00:00</updated><id>https://karreiro.com/2021/05/30/wasi-webassembly-system-interface</id><content type="html" xml:base="https://karreiro.com/2021/05/30/wasi-webassembly-system-interface/"><![CDATA[<p>In the latest two weeks, I had the opportunity of watching many QCon Plus talks. One of my favorite ones was the “<strong>WASI: A New Kind of System Interface</strong>” from Lin Clark <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, an excellent explanation of WASI and why the <strong>Bytecode Alliance</strong> is so important.</p>

<p><a href="/assets/wasi-webassembly-system-interface-qcon-plus.png"><img src="/assets/wasi-webassembly-system-interface-qcon-plus.png" alt="QCon Plus - WASI: A New Kind of System Interface screenshot" title="QCon Plus - WASI: A New Kind of System Interface screenshot" /></a></p>

<p>I believe the main exciting point of the talk lives in the fact that WebAssembly is designed to run on the Web, but it’s not limited to Web <sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. Many developers are already taking advantage of WASM capabilities to use whatever language they want in near-native performance.</p>

<p>However, that kind of WASM usage was losing some main principles of WebAssembly, and applications were getting too aware of the environment for performing operations involving, for example, IO. That’s where WASI shines.</p>

<p>WASI exposes system interfaces to WebAssembly <sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup> programs and hides all the implementation details so that you may have a file system based on cloud, Git, or even ext4. It does that by relying on an abstract modular OS that preserves the effectiveness of standard WASM applications.</p>

<p>If you want to know more about this, I highly recommend the <strong>Bytecode Alliance website</strong> - <a href="https://bytecodealliance.org">bytecodealliance.org</a> - it’s an excellent source of apprehensible information :-)</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>QCon Plus talk: <a href="https://plus.qconferences.com/plus2021/presentation/wasi-new-kind-system-interface">“WASI: A New Kind of System Interface”, from Lin Clark</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p><code class="language-plaintext highlighter-rouge">github@WebAssembly/design/NonWeb.md</code> - <a href="https://github.com/WebAssembly/design/blob/main/NonWeb.md">https://github.com/WebAssembly/design/blob/main/NonWeb.md</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p><code class="language-plaintext highlighter-rouge">github@WASI/docs/WASI-overview.md</code> - <a href="https://github.com/WebAssembly/WASI/blob/main/docs/WASI-overview.md#wasi-webassembly-system-interface">https://github.com/WebAssembly/WASI/blob/main/docs/WASI-overview.md#wasi-webassembly-system-interface</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[In the latest two weeks, I had the opportunity of watching many QCon Plus talks. One of my favorite ones was the “WASI: A New Kind of System Interface” from Lin Clark 1, an excellent explanation of WASI and why the Bytecode Alliance is so important. QCon Plus talk: “WASI: A New Kind of System Interface”, from Lin Clark &#8617;]]></summary></entry><entry><title type="html">Are your CSS properties expensive?</title><link href="https://karreiro.com/2021/05/26/are-your-css-properties-expensive/" rel="alternate" type="text/html" title="Are your CSS properties expensive?" /><published>2021-05-26T00:00:00+00:00</published><updated>2021-05-26T00:00:00+00:00</updated><id>https://karreiro.com/2021/05/26/are-your-css-properties-expensive</id><content type="html" xml:base="https://karreiro.com/2021/05/26/are-your-css-properties-expensive/"><![CDATA[<p>Working in a web IDE is a challenging but fun trial. I frequently face the edge of browser capabilities and often need to find bottlenecks to ensure a good user experience. Today, I will show you one of these challenges.</p>

<p>First of all, let’s remember that our browsers have five major phases during the rendering lifecycle:</p>

<p><img src="/assets/2-browser-phases.jpg" style="display: block; width: 65%; margin: 2rem auto" alt="The five major phases during the rendering lifecycle on browsers: JavaScript, Style, Layout, Paint, and Composite" title="The five major phases during the rendering lifecycle on browsers: JavaScript, Style, Layout, Paint, and Composite" />
<span class="source">Image source: https://developers.google.com/web/fundamentals/performance/rendering</span></p>

<p>Generally, we pay too much attention to the first one. However, today, I will show how the second and the third one may impact your web app’s performance. Check this simple example:</p>

<p><a href="/assets/1-expensive-css-demo.gif"><img src="/assets/1-expensive-css-demo.gif" alt="Example of expensive client-side operation" title="Example of expensive client-side operation" /></a></p>

<p>The JavaScript code of the “<strong>Click me</strong>” button is:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">button</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">button</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">elements</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">.element</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">button</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">elements</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">element</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">element</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">element--left</span><span class="dl">"</span><span class="p">));</span>
<span class="p">};</span>
</code></pre></div></div>

<p>When users click on that button, all 5000 elements receive the new CSS class and move. That seems a bit drastic, but some operations in an IDE may affect other components at a comparable level.</p>

<p>Now, let’s finally check the following two examples and understand how different CSS properties impact the page’s performance differently.</p>

<hr />

<h3 id="1-the-slow-approach">1. The slow approach</h3>

<p>All right, let’s take a look at the performance of this page:</p>

<p><a href="/assets/3-expensive-css-slow.png"><img src="/assets/3-expensive-css-slow.png" alt="Example of slow CSS properties in action" title="Example of slow CSS properties in action" /></a></p>

<p><strong>It takes 567ms during the rendering phase</strong>! This approach relies on the <code class="language-plaintext highlighter-rouge">transform</code> property to move the elements and the <code class="language-plaintext highlighter-rouge">opacity</code> to change their color when they move.</p>

<h3 id="2-the-fast-approach">2. The fast approach</h3>

<p>Now, let’s quickly tweak our CSS logic a bit to do the same thing but getting a considerable faster result:</p>

<p><a href="/assets/4-expensive-css-fast.png"><img src="/assets/4-expensive-css-fast.png" alt="Example of fast CSS properties in action" title="Example of fast CSS properties in action" /></a></p>

<p><strong>It takes only 92ms for rendering now</strong> 🚀 We just changed the CSS by using <code class="language-plaintext highlighter-rouge">margin-left</code> instead of the <code class="language-plaintext highlighter-rouge">transform</code> property and the <code class="language-plaintext highlighter-rouge">color</code> instead of the <code class="language-plaintext highlighter-rouge">opacity</code>.</p>

<hr />

<p>Some CSS properties demand more browser resources than others. During my investigations, I found that the following properties may harm your web app performance, so let’s keep one or two eyes on them:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">border-radius</code></li>
  <li><code class="language-plaintext highlighter-rouge">box-shadow</code></li>
  <li><code class="language-plaintext highlighter-rouge">opacity</code></li>
  <li><code class="language-plaintext highlighter-rouge">transform</code></li>
  <li><code class="language-plaintext highlighter-rouge">filter</code></li>
  <li><code class="language-plaintext highlighter-rouge">position: fixed</code></li>
</ul>

<p>Happily, some new properties may help us, like the new <code class="language-plaintext highlighter-rouge">content-visibility</code>, which enables the user agent to skip some elements from the rendering phase <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<p>I hope that after this reading, you may think about CSS as a powerful, measurable, and understandable tool :-)</p>

<p>–</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p><code class="language-plaintext highlighter-rouge">content-visibility</code>: the new CSS property that boosts your rendering performance - <a href="https://web.dev/content-visibility">https://web.dev/content-visibility</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[Working in a web IDE is a challenging but fun trial. I frequently face the edge of browser capabilities and often need to find bottlenecks to ensure a good user experience. Today, I will show you one of these challenges.]]></summary></entry><entry><title type="html">[URLOTW] Rust GameDev Workgroup’s monthly newsletter</title><link href="https://karreiro.com/2021/05/14/urlotw-rust-gamedev-workgroups-monthly-newsletter/" rel="alternate" type="text/html" title="[URLOTW] Rust GameDev Workgroup’s monthly newsletter" /><published>2021-05-14T00:00:00+00:00</published><updated>2021-05-14T00:00:00+00:00</updated><id>https://karreiro.com/2021/05/14/urlotw-rust-gamedev-workgroups-monthly-newsletter</id><content type="html" xml:base="https://karreiro.com/2021/05/14/urlotw-rust-gamedev-workgroups-monthly-newsletter/"><![CDATA[<p>
  <b>URL of the week</b> (<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<svg width="16px" height="16pxpx" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#fff">
    <path d="M501.902,150.373l-138.666,-143.998c-4.524,-4.692 -11.457,-6.164 -17.492,-3.735c-6.059,2.453 -10.027,8.321 -10.027,14.848l-0,69.335l-5.332,-0c-114.687,-0 -207.998,93.311 -207.998,207.998l0,31.999c0,7.422 5.227,13.609 12.457,15.297c1.176,0.297 2.348,0.426 3.519,0.426c6.039,-0 11.821,-3.543 14.614,-9.11c29.995,-60.011 90.303,-97.28 157.396,-97.28l25.344,0l-0,69.332c-0,6.531 3.968,12.398 10.027,14.828c5.996,2.453 12.968,0.96 17.492,-3.735l138.666,-143.998c5.973,-6.207 5.973,-15.977 0,-22.207Z" />
    <path d="M448.002,511.998l-383.996,0c-35.285,0 -63.999,-28.71 -63.999,-63.999l-0,-298.661c-0,-35.285 28.714,-63.999 63.999,-63.999l63.999,-0c11.797,-0 21.332,9.535 21.332,21.332c0,11.796 -9.535,21.331 -21.332,21.331l-63.999,0c-11.777,0 -21.336,9.559 -21.336,21.336l0,298.661c0,11.777 9.559,21.336 21.336,21.336l383.996,-0c11.773,-0 21.332,-9.559 21.332,-21.336l-0,-170.662c-0,-11.797 9.535,-21.336 21.331,-21.336c11.801,0 21.336,9.539 21.336,21.336l0,170.662c0,35.289 -28.715,63.999 -63.999,63.999Z" />
</svg>
) is a kind of post where I share a relevant URL with you :-)
</p>

<p>This week the winner is the <strong>Rust GameDev Workgroup’s monthly newsletter (#21)”</strong>:
<a href="https://gamedev.rs/news/021/">gamedev.rs/news/021/</a>.</p>

<p><a href="/assets/rust-gamedev-workgroups-monthly-newsletter-21.png"><img src="/assets/rust-gamedev-workgroups-monthly-newsletter-21.png" alt="Rust GameDev  newsletter (#21) website screenshot" title="Rust GameDev  newsletter (#21) website screenshot" /></a></p>

<p>That’s one of my favorite newsletters. It’s refreshing to see the fantastic results people already reach with Rust.</p>

<p>This month, I’ve noticed the “<strong>Requests for Contribution</strong>” section, where everyone may find simple issues to start contributing on some repositories. That’s an inspiring community-friendly approach for engaging people, which is something that worths a try on other communities/projects as well :-)</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[URL of the week ( ) is a kind of post where I share a relevant URL with you :-)]]></summary></entry><entry><title type="html">[URLOTW] Notes on “Philosophy of Software Design”</title><link href="https://karreiro.com/2021/04/30/urlotw-notes-on-philosophy-of-software-design/" rel="alternate" type="text/html" title="[URLOTW] Notes on “Philosophy of Software Design”" /><published>2021-04-30T00:00:00+00:00</published><updated>2021-04-30T00:00:00+00:00</updated><id>https://karreiro.com/2021/04/30/urlotw-notes-on-philosophy-of-software-design</id><content type="html" xml:base="https://karreiro.com/2021/04/30/urlotw-notes-on-philosophy-of-software-design/"><![CDATA[<p>
  <b>URL of the week</b> (<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<svg width="16px" height="16pxpx" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#fff">
    <path d="M501.902,150.373l-138.666,-143.998c-4.524,-4.692 -11.457,-6.164 -17.492,-3.735c-6.059,2.453 -10.027,8.321 -10.027,14.848l-0,69.335l-5.332,-0c-114.687,-0 -207.998,93.311 -207.998,207.998l0,31.999c0,7.422 5.227,13.609 12.457,15.297c1.176,0.297 2.348,0.426 3.519,0.426c6.039,-0 11.821,-3.543 14.614,-9.11c29.995,-60.011 90.303,-97.28 157.396,-97.28l25.344,0l-0,69.332c-0,6.531 3.968,12.398 10.027,14.828c5.996,2.453 12.968,0.96 17.492,-3.735l138.666,-143.998c5.973,-6.207 5.973,-15.977 0,-22.207Z" />
    <path d="M448.002,511.998l-383.996,0c-35.285,0 -63.999,-28.71 -63.999,-63.999l-0,-298.661c-0,-35.285 28.714,-63.999 63.999,-63.999l63.999,-0c11.797,-0 21.332,9.535 21.332,21.332c0,11.796 -9.535,21.331 -21.332,21.331l-63.999,0c-11.777,0 -21.336,9.559 -21.336,21.336l0,298.661c0,11.777 9.559,21.336 21.336,21.336l383.996,-0c11.773,-0 21.332,-9.559 21.332,-21.336l-0,-170.662c-0,-11.797 9.535,-21.336 21.331,-21.336c11.801,0 21.336,9.539 21.336,21.336l0,170.662c0,35.289 -28.715,63.999 -63.999,63.999Z" />
</svg>
) is a kind of post where I share a relevant URL with you :-)
</p>

<p>This week the winner is <strong>Notes on “Philosophy of Software Design”</strong>:
<a href="http://jmoiron.net/blog/notes-on-philosophy-of-software-design">jmoiron.net/blog/notes-on-philosophy-of-software-design</a>.</p>

<p><a href="/assets/notes-on-philosophy-of-software-design.png"><img src="/assets/notes-on-philosophy-of-software-design.png" alt="jmoiron - Notes on &quot;Philosophy of Software Design&quot; website screenshot" title="jmoiron - Notes on &quot;Philosophy of Software Design&quot; website screenshot" /></a></p>

<p>Reading other’s people notes about books is a fun way to find the next picks :-) “Philosophy of Software Design” entered on my list this week.</p>

<p>I hope you like this URL as well!</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[URL of the week ( ) is a kind of post where I share a relevant URL with you :-)]]></summary></entry><entry><title type="html">DMN lives in the KIE Group YouTube channel - Part 2</title><link href="https://karreiro.com/2021/04/18/dmn-lives-in-the-kie-group-youtube-channel-part-2/" rel="alternate" type="text/html" title="DMN lives in the KIE Group YouTube channel - Part 2" /><published>2021-04-18T00:00:00+00:00</published><updated>2021-04-18T00:00:00+00:00</updated><id>https://karreiro.com/2021/04/18/dmn-lives-in-the-kie-group-youtube-channel-part-2</id><content type="html" xml:base="https://karreiro.com/2021/04/18/dmn-lives-in-the-kie-group-youtube-channel-part-2/"><![CDATA[<p>The <a href="https://www.youtube.com/channel/UCUjeymTM-TrwHs36388VRbw">KIE YouTube channel</a> is regularly posting quite interesting content!</p>

<p>Last week I had the pleasure of seeing my friend <a href="https://ederign.me">Eder</a> demonstrating the DMN Runner prototype at the <strong>KieLive#30</strong> session:</p>

<iframe width="100%" height="450" src="https://www.youtube.com/embed/WMnGDgVUwHQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>That’s a game-changer on how users built DMN models. If you enjoy the presentation, I’d recommend the <a href="https://www.youtube.com/watch?v=5HSdDQzG0wE">KieLive#24</a>, the <a href="https://www.youtube.com/watch?v=DoxbhfQRpF4">KieLive#25</a>, and the <a href="https://www.youtube.com/watch?v=E7JU0E5FN-w">KieLive#26</a>, yeah, 3 in a roll! These lives have enjoyable and heterogeneous content for DMN enthusiasts.</p>

<p>I hope you like it! ;-)</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[The KIE YouTube channel is regularly posting quite interesting content!]]></summary></entry><entry><title type="html">[URLOTW] Hyrum’s Law</title><link href="https://karreiro.com/2021/04/17/urlotw-hyrums-law/" rel="alternate" type="text/html" title="[URLOTW] Hyrum’s Law" /><published>2021-04-17T00:00:00+00:00</published><updated>2021-04-17T00:00:00+00:00</updated><id>https://karreiro.com/2021/04/17/urlotw-hyrums-law</id><content type="html" xml:base="https://karreiro.com/2021/04/17/urlotw-hyrums-law/"><![CDATA[<p>
  <b>URL of the week</b> (<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<svg width="16px" height="16pxpx" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#fff">
    <path d="M501.902,150.373l-138.666,-143.998c-4.524,-4.692 -11.457,-6.164 -17.492,-3.735c-6.059,2.453 -10.027,8.321 -10.027,14.848l-0,69.335l-5.332,-0c-114.687,-0 -207.998,93.311 -207.998,207.998l0,31.999c0,7.422 5.227,13.609 12.457,15.297c1.176,0.297 2.348,0.426 3.519,0.426c6.039,-0 11.821,-3.543 14.614,-9.11c29.995,-60.011 90.303,-97.28 157.396,-97.28l25.344,0l-0,69.332c-0,6.531 3.968,12.398 10.027,14.828c5.996,2.453 12.968,0.96 17.492,-3.735l138.666,-143.998c5.973,-6.207 5.973,-15.977 0,-22.207Z" />
    <path d="M448.002,511.998l-383.996,0c-35.285,0 -63.999,-28.71 -63.999,-63.999l-0,-298.661c-0,-35.285 28.714,-63.999 63.999,-63.999l63.999,-0c11.797,-0 21.332,9.535 21.332,21.332c0,11.796 -9.535,21.331 -21.332,21.331l-63.999,0c-11.777,0 -21.336,9.559 -21.336,21.336l0,298.661c0,11.777 9.559,21.336 21.336,21.336l383.996,-0c11.773,-0 21.332,-9.559 21.332,-21.336l-0,-170.662c-0,-11.797 9.535,-21.336 21.331,-21.336c11.801,0 21.336,9.539 21.336,21.336l0,170.662c0,35.289 -28.715,63.999 -63.999,63.999Z" />
</svg>
) is a kind of post where I share a relevant URL with you :-)
</p>

<p>This week the winner is <strong>Hyrum’s Law</strong>:
<a href="https://www.hyrumslaw.com">hyrumslaw.com</a>.</p>

<p><a href="/assets/hyrumslaw.png"><img src="/assets/hyrumslaw.png" alt="Hyrum's Law website screenshot" title="Hyrum's Law website screenshot" /></a></p>

<p>It has pretty intriguing thoughts about APIs, which I believe are actually appliable in many other contexts involving user experience as a whole.</p>

<p>Reading that, I recalled situations when I was updating my profile picture on some website, and the image appeared outdated right after I submitted the form. Generally, we somehow guess: <em>- ohh, probably that’s a cache issue or even eventual consistency, I don’t know!</em> 🤪.</p>

<p>However, I don’t think users should need to guess that. Also, knowing all the clauses we’re singing on our <del>APIs</del> contracts help us on having more simple and predictable implementations, which benefits API users as well :-)</p>

<p>I hope you find this URL interesting too!</p>]]></content><author><name>Guilherme Carreiro</name></author><summary type="html"><![CDATA[URL of the week ( ) is a kind of post where I share a relevant URL with you :-)]]></summary></entry></feed>