<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Your Site's RSS Feed]]></title><description><![CDATA[A blog for bits and ends]]></description><link>https://gatsby-starter-blog-demo.netlify.com</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 27 Oct 2021 07:06:56 GMT</lastBuildDate><item><title><![CDATA[Webhooks]]></title><description><![CDATA[Webhooks, sometimes called web callbacks or HTTP push APIs, are simple on-to-one connections that allow real-time data to be sent from one…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/webhooks/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/webhooks/</guid><pubDate>Tue, 26 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Webhooks, sometimes called web callbacks or HTTP push APIs, are simple on-to-one connections that allow real-time data to be sent from one application to a unique URL provided by another application whenever a specified event occurs.&lt;/p&gt;&lt;h2&gt;Consuming a Webhook&lt;/h2&gt;&lt;p&gt;The first step in consuming a webhook is giving the webhook provider (where the event is triggered) a URL to deliver requests to. This is most often done through a backend panel or an API.&lt;/p&gt;&lt;p&gt;Once a tracked event occurs on the trigger application, data is serialized and sent to the webhook URL of the destination application via an HTTP request. The destination application contains the logic to be executed upon receiving the webhook request payload. It can then send a callback message, often with an HTTP status code such as 302 if the data was received successfully, or 404 if not.&lt;/p&gt;&lt;p&gt;Webhooks take the form of GET or POST requests depending on the webhooks provider. While GET requests have payloads appended to the webhook URL as a query string, POST webhook requests contain the payload in the request body, and might also include additional properties such as authentication tokens. The majority of webhooks will POST data in one of three ways: as JSON, as XML, or as form data.&lt;/p&gt;&lt;p&gt;For example, say an application needs to dispatch an emailed copy of a receipt immediately after a customer checks out at a store. If there is a webhook URL registered to this payment action, the trigger application (where the event occured) might send a HTTP POST, with a body containing order information, to the webhook route belonging to the destination application. Upon receiving this information, further action to compose and send that automated email will take place.&lt;/p&gt;&lt;h2&gt;Webhooks vs APIs&lt;/h2&gt;&lt;p&gt;Similar to webhooks, APIs provide applications with a means to receive data. While webhooks involve pushing data to an application when specific events occur, APIs allow clients to make requests to retrieve, edit, add, and remove data residing elsewhere.&lt;/p&gt;&lt;p&gt;If a client wishes to detect when new information is available or be notified of backend events via an API, it must periodically send a request to the relevant API to check for updates. This pattern of making requests at fixed intervals regardless whether or not data has changed is known as polling.&lt;/p&gt;&lt;p&gt;Polling intervals must be highly frequent for returning “real time” data. In contrast, webhooks send data to an application if and only when that data has changed.&lt;/p&gt;&lt;p&gt;However, polling may be better suited for use-cases not requiring real-time updates. In the event of rapidly changing data, polling a server every five to ten minutes to fetch needed information is less work for a system and could potentially consume fewer resources than webhooks, which will fire after every tracked change. Improperly configured servers may be overwhelmed by the high load volume of requests. Applications must therefore be designed with the expected scale of each webhook in mind.&lt;/p&gt;&lt;h2&gt;What about WebSockets?&lt;/h2&gt;&lt;p&gt;Webhooks and WebSockets both solve the problem of real time communication in different ways.&lt;/p&gt;&lt;p&gt;While webhooks are mostly used by two servers to pass information, WebSockets are used primarily for server-to-client (mostly web browsers) communication.&lt;/p&gt;&lt;p&gt;WebSockets facilitate a two-way information stream between server and client, and keep the socket connection open for as long as required to allow numerous transfers of information. With webhooks, the connection is terminated once a response has been returned.&lt;/p&gt;&lt;p&gt;With regards to communication protocols, WebSocket uses its own custom WS protocol while webhooks use regular HTTP.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;In short, webhooks are a tool for automatically pushing fresh data to a server sans polling. Due to their utility and ease of implementation, webhooks are quickly becoming ubiquitous in real-time software architectures.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debounce vs. Throttle]]></title><description><![CDATA[After setting up document or window event listeners such as resize or scroll, events are emitted, captured, and handled many times a second…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/debounce-throttle-request-animation-frame/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/debounce-throttle-request-animation-frame/</guid><pubDate>Wed, 01 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After setting up document or window event listeners such as resize or scroll, events are emitted, captured, and handled many times a second. This high rate of execution can significantly impact the performance of a website or application. Here, debounce and throttling methods can really shine.&lt;/p&gt;&lt;p&gt;Debouncing and throttling are two techniques used to control the number of times your event handler responds to emitted events. These are the main differences between them:&lt;/p&gt;&lt;h2&gt;Debouncing&lt;/h2&gt;&lt;p&gt;Debouncing is used to group a burst of events into one. This is particularly useful for features like autocomplete. Using a debounce function from a utility library like Lodash, users can define whether they would like their event to fire at the beginning of the burst, or at the end. An autocomplete implementation would use a debounce to wait until events have stopped firing (users have stopped typing) before executing the event handler.  &lt;/p&gt;&lt;h2&gt;Throttling&lt;/h2&gt;&lt;p&gt;Unlike with debouncing where an event is handled at the beginning or end of a burst, throttling guarantees a constant flow of callback executions every X milliseconds. This is useful in situations such as when a user needs to detect the scroll position of a page to trigger an animation. A throttle function is also available via Lodash.&lt;/p&gt;&lt;p&gt;One important thing to note about a lot of throttle functions is that they do not fire the callback at the end of the throttling phase. This can result in the last call being skipped, and can negatively impact interactions that require this final call.&lt;/p&gt;&lt;p&gt;Alternatively, using &lt;code class=&quot;language-text&quot;&gt;requestAnimationFrame&lt;/code&gt; to throttle events like resize, scroll, wheel, keydown, mousemouve, touchmove, and pointermove might be a preferable approach. See &lt;a href=&quot;https://greensock.com/forums/topic/17577-requestanimationframe-vs-throttle/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;requestAnimationFrame&lt;/h2&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;requestAnimationFrom&lt;/code&gt; is a throttle alternative that is supported natively in the browser. &lt;code class=&quot;language-text&quot;&gt;requestAnimationFrame&lt;/code&gt; will limit the execution of an event handler to six times a second. &lt;/p&gt;&lt;br/&gt;Debounce, throttle and requestAnimationFrame all work to optimize the handling of rapidly emitted events. If ever you are experiencing lag due to expensive event listeners, take a shot at implementing whichever of these solutions best fits your use case.</content:encoded></item><item><title><![CDATA[Javascript's Function Argument Object]]></title><description><![CDATA[arguments  is an array-like object available within Javascript functions. As its name suggests,  arguments  contains the values of the…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/javascript-function-argument/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/javascript-function-argument/</guid><pubDate>Tue, 30 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;arguments&lt;/code&gt; is an array-like object available within Javascript functions. As its name suggests, &lt;code class=&quot;language-text&quot;&gt;arguments&lt;/code&gt; contains the values of the arguments passed to the function within which it is accessed.&lt;/p&gt;&lt;p&gt;Similar to arrays, the arguments object has a length property. In addition, its values are ordered, and can be retrieved via index:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-74cce10dc068da35732a40c3153ee80c&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Unlike arrays,  &lt;code class=&quot;language-text&quot;&gt;arguments&lt;/code&gt; does not have any built-in array methods like map(), filter(), splice(), etc.&lt;/p&gt;&lt;p&gt;Nevertheless, we can convert &lt;code class=&quot;language-text&quot;&gt;arguments&lt;/code&gt; into an array easily:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-28d44231c650f198c9a41e61601d1e64&quot;&gt;&lt;/iframe&gt;&lt;p&gt;This information is particularly useful when working with functions that are called with more arguments than they have been declared to accept. It’s also useful for creating functions that can be passed a variable number of arguments:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-ec3db6f400f15b9225c74526470682ad&quot;&gt;&lt;/iframe&gt;&lt;h2&gt;Arrow Functions and the &lt;code class=&quot;language-text&quot;&gt;rest&lt;/code&gt; Parameter&lt;/h2&gt;&lt;p&gt;Arrow functions do not have an arguments binding in their scope. In other words, no arguments &lt;code class=&quot;language-text&quot;&gt;object&lt;/code&gt; is created they are called.&lt;/p&gt;&lt;p&gt;However, if you do want to capture arguments in an arrow function, you can use the rest parameter.&lt;/p&gt;&lt;p&gt;With the rest parameter (…args), the memoize function below will accept a function as a parameter, and call it with whatever number of arguments are provided. This pattern allows memoize to be incredible flexible in it’s application.&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-baa337365206b12b7d68d2aa1fecdd03&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Another familiar example is the debounce method. Here, a generic callback function can again accept any number of arguments: &lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-8c2d65971545f3479e29048aa6a5edf9&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Rest parameters can also be combined with other parameters, but must always be included as the last parameter&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-01071a2d8f4cc904648aa5a1de713a27&quot;&gt;&lt;/iframe&gt;</content:encoded></item><item><title><![CDATA[Gists, Gatsby, and MDX]]></title><description><![CDATA[I really enjoy working with Github gists. They have a great look without having to tinker around with themes (such as with Prism), are…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/working-with-gists/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/working-with-gists/</guid><pubDate>Thu, 25 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I really enjoy working with Github gists. They have a great look without having to tinker around with themes (such as with Prism), are highly readable, and provide out-of-the-box syntax highlighting and line numbering for numerous languages and formats.&lt;/p&gt;&lt;p&gt;I also like having all of my code snippets stored in one central place. Whenever I need to reference or update them again, it’s easy.&lt;/p&gt;&lt;p&gt;For these reasons, I wanted to use gists for writing blog posts. As things are, I ran into some roadblocks along the way. &lt;/p&gt;&lt;p&gt;My first plan of attack was the
&lt;a href=&quot;https://www.gatsbyjs.org/packages/gatsby-remark-embed-gist/&quot;&gt;gatsby-remark-embed-gist&lt;/a&gt; plugin. I spent a good chunk of time trying to get this to work, but was only ever able to render
the literal code block:&lt;/p&gt;&lt;p&gt; &lt;code class=&quot;language-text&quot;&gt;gist:Mikaelia/1234567#example-file.js&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;By this time, I was investigating transitioning to MDX files.&lt;/p&gt;&lt;p&gt; As written in the docs: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;MDX is an authorable format that lets you seamlessly write JSX in your Markdown documents.
You can import components, such as interactive charts or alerts, and embed them within your content.
This makes writing long-form content with components a blast 🚀.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Having the freedom to write JSX into my markdown sounded great, and it would open the door for writing more visual and potentially interactive content in the future. &lt;/p&gt;&lt;p&gt;In addition, I had recently come across &lt;code class=&quot;language-text&quot;&gt;react-gist&lt;/code&gt;. This package provides the user with a gist component. This would serve as a perfect use-case for a MDX file, and would solve my gist rendering problem.&lt;/p&gt;&lt;p&gt;Once I had &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-mdx&lt;/code&gt; set up properly, all I needed to do was import, and include my gist components wherever I needed them:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-fb695cda0d12970e932d105a83c79d91&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Easy!&lt;/p&gt;&lt;br/&gt;&lt;h2&gt;Gotchas&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Do not forget the quotes around your &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; string else your gist will not render&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Please be aware that if you are using a frontmatter, you will need to include your import statement &lt;i&gt;after&lt;/i&gt; the frontmatter. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you are experiencing errors, be sure to try clearing your &lt;code class=&quot;language-text&quot;&gt;.cache&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;public&lt;/code&gt; folders by running `gatsby-clean.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Gists, Gatsby, and MDX]]></title><description><![CDATA[I really enjoy working with Github gists. They have a nice look without having to tinker with themes (such as with Prism), are highly…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/working-with-gists/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/working-with-gists/</guid><pubDate>Thu, 25 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I really enjoy working with Github gists. They have a nice look without having to tinker with themes (such as with Prism), are highly readable, and provide out-of-the-box syntax highlighting and line numbering for numerous languages and formats.&lt;/p&gt;&lt;p&gt;I also like having all of my code snippets stored in one central place. Whenever I need to reference or update them again, it’s easy.&lt;/p&gt;&lt;p&gt;For these reasons, I wanted to use gists for writing blog posts. As things are, I ran into some roadblocks along the way. &lt;/p&gt;&lt;p&gt;My first plan of attack was the
&lt;a href=&quot;https://www.gatsbyjs.org/packages/gatsby-remark-embed-gist/&quot;&gt;gatsby-remark-embed-gist&lt;/a&gt; plugin. I spent a good chunk of time trying to get this to work, but was only ever able to render
the literal code block:&lt;/p&gt;&lt;p&gt; &lt;code class=&quot;language-text&quot;&gt;gist:Mikaelia/1234567#example-file.js&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;By this time, I was investigating transitioning to MDX files.&lt;/p&gt;&lt;p&gt; As written in the docs: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;MDX is an authorable format that lets you seamlessly write JSX in your Markdown documents.
You can import components, such as interactive charts or alerts, and embed them within your content.
This makes writing long-form content with components a blast 🚀.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Having the freedom to write JSX into my markdown sounded great, and it would open the door for writing more visual and potentially interactive content in the future. &lt;/p&gt;&lt;p&gt;In addition, I had recently come across &lt;code class=&quot;language-text&quot;&gt;react-gist&lt;/code&gt;. This package provides the user with a gist component. This would serve as a perfect use-case for a MDX file, and would solve my gist rendering problem.&lt;/p&gt;&lt;p&gt;Once I had &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-mdx&lt;/code&gt; set up properly, all I needed to do was import, and include my gist components wherever I needed them:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-fb695cda0d12970e932d105a83c79d91&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Easy!&lt;/p&gt;&lt;br/&gt;&lt;h2&gt;Gotchas&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Do not forget the quotes around your &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; string else your gist will not render&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Please be aware that if you are using a frontmatter, you will need to include your import statement &lt;i&gt;after&lt;/i&gt; the frontmatter. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you are experiencing errors, be sure to try clearing your &lt;code class=&quot;language-text&quot;&gt;.cache&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;public&lt;/code&gt; folders by running `gatsby-clean.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Correcting `gatsby-plugin-mdx` Static HTML Build Error]]></title><description><![CDATA[I recently transitioned from Markdown files to MDX using  this  guide. While everything seemed to be running smoothly in dev, on build I…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/static-build-error/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/static-build-error/</guid><pubDate>Tue, 23 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently transitioned from Markdown files to MDX using &lt;a href=&quot;https://www.gatsbyjs.org/blog/2019-11-21-how-to-convert-an-existing-gatsby-blog-to-use-mdx/&quot;&gt;this&lt;/a&gt; guide.&lt;/p&gt;&lt;p&gt;While everything seemed to be running smoothly in dev, on build I received the error:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;Building static HTML failed for path &amp;quot;/blog/fixing-FOUC/&amp;quot;

See our docs page for more info on this error: https://gatsby.dev/debug-html

WebpackError: TypeError: Cannot read property &amp;#x27;mdx&amp;#x27; of undefined&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;If you’re experiencing this error, you may very well have done what I did, and included your blog folder inside of your &lt;code class=&quot;language-text&quot;&gt;pages&lt;/code&gt; directory.&lt;/p&gt;&lt;p&gt; In this case, the GQL query for your individual post will fail because the post page is created twice on build — once manually by you, and then again automatically by the mdx plugin. &lt;/p&gt;&lt;p&gt; The mdx plugin will see the .mdx file in the pages folder, and create a page without a query slug. It is this that causes the query to fail and the error to display.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Correcting `gatsby-plugin-mdx` Static HTML Build Error]]></title><description><![CDATA[I recently transitioned from Markdown files to MDX using  this  guide. While everything seemed to be running smoothly in dev, on build I…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/static-build-error/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/static-build-error/</guid><pubDate>Tue, 23 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently transitioned from Markdown files to MDX using &lt;a href=&quot;https://www.gatsbyjs.org/blog/2019-11-21-how-to-convert-an-existing-gatsby-blog-to-use-mdx/&quot;&gt;this&lt;/a&gt; guide.&lt;/p&gt;&lt;p&gt;While everything seemed to be running smoothly in dev, on build I received the error:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;Building static HTML failed for path &amp;quot;/blog/fixing-FOUC/&amp;quot;

See our docs page for more info on this error: https://gatsby.dev/debug-html

WebpackError: TypeError: Cannot read property &amp;#x27;mdx&amp;#x27; of undefined&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;If you’re experiencing this error, you may very well have done what I did, and included your blog folder inside of your &lt;code class=&quot;language-text&quot;&gt;pages&lt;/code&gt; directory.&lt;/p&gt;&lt;p&gt; In this case, the GQL query for your individual post will fail because the post page is created twice on build — once manually by you, and then again automatically by the mdx plugin. &lt;/p&gt;&lt;p&gt; The mdx plugin will see the .mdx file in the pages folder, and create a page without a query slug. It is this that causes the query to fail and the error to display.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Removing FOUC in a Netlify-deployed Gatsby Project]]></title><description><![CDATA[As I've been working more with Gatsby and styled-components, I've run across an issue with flashes of unstyled content showing on page load…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/fixing-FOUC/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/fixing-FOUC/</guid><pubDate>Sun, 07 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As I’ve been working more with Gatsby and styled-components, I’ve run across an issue with flashes of unstyled content showing on page load and refresh in an application deployed to Netlify. Squashing this required a bit of exploration.&lt;/p&gt;&lt;p&gt;Here are the two steps that eventually fixed my problem:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Install the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-styled-components&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;babel-plugin-styled-components&lt;/code&gt; plugins and update the &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; file (example below). I had only imported &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt; library, not knowing the other packages were needed.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This corrected the majority of issues I was having on page refresh. However, the unstyled font flicker was a little tricker to fix. After some experimentation I finally discovered that the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-typograpy&lt;/code&gt; package did the trick.&lt;/p&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Install the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-typography&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;react-typography&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;typography&lt;/code&gt; packages and update the &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; (also below) in order to fix font issues.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This involves creating a &lt;code class=&quot;language-text&quot;&gt;src/utils&lt;/code&gt; folder, with a &lt;code class=&quot;language-text&quot;&gt;typography.js&lt;/code&gt; file. In order to use Google fonts, the typography file required some configurations.&lt;/p&gt;&lt;p&gt;Here’s mine:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-d90e9831710cd398b3c1d251dea9761a-typography.js&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Despite not setting the &lt;code class=&quot;language-text&quot;&gt;Bai Jamjuree&lt;/code&gt; font to either &lt;code class=&quot;language-text&quot;&gt;headerFontFamily&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;bodyFontFamily&lt;/code&gt;, I was able to use it elsewhere in my application.&lt;/p&gt;&lt;p&gt;Here’s my &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; file:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-6e1e0a62f0c4b37b25424e9f0160ee30-gatsby-config.js&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Hope this helps!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Removing FOUC in a Netlify-deployed Gatsby Project]]></title><description><![CDATA[As I've been working more with Gatsby and styled-components, I've run across an issue with flashes of unstyled content showing on page load…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/fixing-FOUC/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/fixing-FOUC/</guid><pubDate>Sun, 07 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As I’ve been working more with Gatsby and styled-components, I’ve run across an issue with flashes of unstyled content showing on page load and refresh in an application deployed to Netlify. Squashing this required a bit of exploration.&lt;/p&gt;&lt;p&gt;Here are the two steps that eventually fixed my problem:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Install the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-styled-components&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;babel-plugin-styled-components&lt;/code&gt; plugins and update the &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; file (example below). I had only imported &lt;code class=&quot;language-text&quot;&gt;styled-components&lt;/code&gt; library, not knowing the other packages were needed.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This corrected the majority of issues I was having on page refresh. However, the unstyled font flicker was a little tricker to fix. After some experimentation I finally discovered that the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-typograpy&lt;/code&gt; package did the trick.&lt;/p&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Install the &lt;code class=&quot;language-text&quot;&gt;gatsby-plugin-typography&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;react-typography&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;typography&lt;/code&gt; packages and update the &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; (also below) in order to fix font issues.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This involves creating a &lt;code class=&quot;language-text&quot;&gt;src/utils&lt;/code&gt; folder, with a &lt;code class=&quot;language-text&quot;&gt;typography.js&lt;/code&gt; file. In order to use Google fonts, the typography file required some configurations.&lt;/p&gt;&lt;p&gt;Here’s mine:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-d90e9831710cd398b3c1d251dea9761a-typography.js&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Despite not setting the &lt;code class=&quot;language-text&quot;&gt;Bai Jamjuree&lt;/code&gt; font to either &lt;code class=&quot;language-text&quot;&gt;headerFontFamily&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;bodyFontFamily&lt;/code&gt;, I was able to use it elsewhere in my application.&lt;/p&gt;&lt;p&gt;Here’s my &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; file:&lt;/p&gt;&lt;iframe width=&quot;100%&quot; frameBorder=&quot;0&quot; id=&quot;gist-6e1e0a62f0c4b37b25424e9f0160ee30-gatsby-config.js&quot;&gt;&lt;/iframe&gt;&lt;p&gt;Hope this helps!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What Actually Happens When you Enter a URL]]></title><description><![CDATA[TL;DR: A lot! Here’s a high-level overview: To start, let’s look at the URL  https://www.example.com It contains: A protocol — https A…]]></description><link>https://gatsby-starter-blog-demo.netlify.com/what-happens-when-you-type/</link><guid isPermaLink="false">https://gatsby-starter-blog-demo.netlify.com/what-happens-when-you-type/</guid><pubDate>Sun, 05 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TL;DR: A lot!&lt;/p&gt;&lt;p&gt;Here’s a high-level overview:&lt;/p&gt;&lt;p&gt;To start, let’s look at the URL &lt;a href=&quot;https://www.example.com&quot;&gt;https://www.example.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It contains:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A protocol — https&lt;/li&gt;&lt;li&gt;A domain name — &lt;a href=&quot;http://www.example.com&quot;&gt;www.example.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Domain Names: IP Addresses in Disguise&lt;/h2&gt;&lt;p&gt;What is a domain name? In the same way that you might query Google Maps with the name of a restaurant instead of its physical address, you’ll likely search for a website using its domain name rather than its IP address.&lt;/p&gt;&lt;p&gt;IP addresses are unique sets of numbers (e.g. 151.101.65.121) assigned to each network device, which help these machines identify each other and ensure that data and requests are routed to the correct destinations. Domain names, on the other hand, are the human-friendly, easy-to-remember aliases that refer to these numbers.&lt;/p&gt;&lt;h2&gt;How does your browser translate a domain name into an IP address?&lt;/h2&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/54032a769ce668367c2bd801cd0e1206/2cefc/bp-url-1.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:42.567567567567565%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsSAAALEgHS3X78AAACaElEQVQoz32SW0ySYRjH3+/jwxPLZVvlJJooIkvLZLG6q4tu3Gpt3XXV4d7mRa11cFnLqJvQNY0gQA4COmKkIxUPCMQhPIAIctIPSgXnZltdON1aT++nrHnVs/32/L/3/+z53vd5X4RwvOiUUiRJCrFsQATBJ4rLjiEWJUAUm0uQJJfFYp3AXjWGyVWYk5gaTCOHw6llelg/jZGh8AKBDoSIIIhzCBFnsK6jEGrGrhjrUxRFCcvLy8XYb8bfTRgBph6vn8eZf7AJSqQy0fRy5ubBtUO3pUdw4mJVde/BoyL0nwCAmmQ6G0ikaHk+n6tEmWwOUmkabPbRDqagWhm5w/sQ3bnUv7gp0kTzF18aH7sdI3Pe4NyNvQ5kCVHTJCG7lX17P5qPLsl//NyGpcQyTDldW8jnD+z6/EHQmy09TIHAQLfUapOB68MZO9+8pr6rH+/cWFuF3MYmfA3OKgq7Qr8AKEZ75yNvY/EkOF3uHduQHZDb492ddLrgnVzRjf0STAWGzRR/NunEz552eCwfrX/Wc3nw+wOOwkmLCqCFULh7MRaH8Unnts5g/I1m58Pg8/rgoUxhEilDEy362dhZXSwuNqXbvzinRlUaLbS2tkG/wQAyjbG34tWUpb5r2tUgD/jKlMtS10xISWey4PH6QaXWAvL4AurpcUfbtd4RiXiAnrk6/C0mMac3j79fbGd2sPJ9/ZbVNhTv6ZI9v6Jyi06b6JxkgN66MLiyLehLRJ6MRRsjobDUMeF8M2ixXkaFaz/MjPvf1fHuswuKmROvTigU4Vy5PwrZviN5XVykWS0t1DFv8iim9C/0vgtboQilWwAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;dns lookup image&quot; title=&quot;dns lookup image&quot; src=&quot;/static/54032a769ce668367c2bd801cd0e1206/fcda8/bp-url-1.png&quot; srcSet=&quot;/static/54032a769ce668367c2bd801cd0e1206/12f09/bp-url-1.png 148w,/static/54032a769ce668367c2bd801cd0e1206/e4a3f/bp-url-1.png 295w,/static/54032a769ce668367c2bd801cd0e1206/fcda8/bp-url-1.png 590w,/static/54032a769ce668367c2bd801cd0e1206/efc66/bp-url-1.png 885w,/static/54032a769ce668367c2bd801cd0e1206/c83ae/bp-url-1.png 1180w,/static/54032a769ce668367c2bd801cd0e1206/2cefc/bp-url-1.png 1400w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;&lt;/undefined&gt;&lt;h3&gt;Cache check&lt;/h3&gt;&lt;p&gt;Before your browser can send its request to the proper web server, it has to figure out which IP address corresponds to the domain name that you have entered.&lt;/p&gt;&lt;p&gt;First, your browser will check its cache(memory) to see if the IP address in question has been previously saved. If it has not, your OS cache will be searched, then your router cache, and finally your ISP (Internet Service Provider) cache will be examined. If the IP has not been stored in any of these locations, a DNS server (generally provided by your ISP) will proceed to resolve the domain name to its IP address.&lt;/p&gt;&lt;p&gt;DNS resolvers are part of the DNS (Domain Name System), which comprises a massive database of domain name and IP address mappings.&lt;/p&gt;&lt;h3&gt;Anatomy of a Domain Name:&lt;/h3&gt;&lt;p&gt;Let’s break down the domain name a little more. Domain names consist of multiple parts:&lt;/p&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/6891c96d2efbd8498bc9ccc53eb9541f/a1792/bp-url-2.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:41.21621621621622%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsSAAALEgHS3X78AAABbElEQVQoz2NgYGAQZmJmUQTSPAxIgI2LjxFIkYLhgFlUxYjHrXI5PwMFIGv7HwjDNmMCmHYpXSgjqmpsL6Zmqidr7GbAwMioDRRWBmKQ69WBWAfKV4WyVaBYBog1gJgFbBA7rxDYuSbRtZySOrZKYupmCmZxjTI6PpmSWh7JUuoucUoSWlZKMoYuckrWQbIKZt7yQL4ykC+r7hwjp+2dDhJXDJ18mgPuXA5+ERTnMzIy8Unr2SuIKhuK6/nnsoHEeERkBKV0bCXF1c0kOQXEBaJmXWHmFZcXEVEyEJEz8ZBiYecSByrjA+pmAhsiqW3DyMrJAwtcbiAWAGHrtF7BqJlXuDVc4iVVHSIktDxSxI1Cy6SSlj/nArpQUsUuVErdOVZK1shNEuQ2FJcxMbMCzWdGibH///8zhE48ARZj5xEUYuXik+OXVlViZuOUXg6UIxbADOWERoQcECtAA18XGil6QCwPFQdFnDTIMQA8fTiH//Oj3QAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;domain name image&quot; title=&quot;domain name image&quot; src=&quot;/static/6891c96d2efbd8498bc9ccc53eb9541f/fcda8/bp-url-2.png&quot; srcSet=&quot;/static/6891c96d2efbd8498bc9ccc53eb9541f/12f09/bp-url-2.png 148w,/static/6891c96d2efbd8498bc9ccc53eb9541f/e4a3f/bp-url-2.png 295w,/static/6891c96d2efbd8498bc9ccc53eb9541f/fcda8/bp-url-2.png 590w,/static/6891c96d2efbd8498bc9ccc53eb9541f/a1792/bp-url-2.png 780w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;
- The last dot-separated portion is called the top-level domain (.com, .online, .org etc.).&lt;/undefined&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Each word-and-dot combination that precedes the top-level domain indicates a new level in the domain structure. In &lt;a href=&quot;http://www.example.com&quot;&gt;www.example.com&lt;/a&gt;, ‘example’ would be considered the second-level domain).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The left-most part of the domain name, (www) is referred to as the host name or subdomain.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Where are you?&lt;/h3&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/b033ee6c096e9f7b564f17df484d403f/2cefc/bp-url-3.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:35.810810810810814%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAABB0lEQVQY04VPy07DMBDM//8EKhfeIEAcKipeLRKkQUr6TpMokVLbsY2T2E4E3JgcyqWqWK0sz3jGu+OYPaWNWRCF1mZvObuUtearsarWFxN6HpCy1oAg/zFrbX5amxTV4UfupvJmRq9n1E3FgZcnRYknrXfMertnYw0v62Es+iv2HPH7sBiExVPE+0s2jLkoNQR/4s7cNt00sFgM52NUYM6cqJ6Xj2IBT8/bIDlI/NJuZd+txd0JmToNiJuJyym5nbPXhB/7m3EqT3zyEnN0BzN55JNRwu8W7GraBTmb0JCWTsYr7LZm6i2VXiZXVD2sORJiZpB/opECEOSSKgjeUwnxIOSZqH4BLLl3XNasNM8AAAAASUVORK5CYII=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;dns lookup image&quot; title=&quot;dns lookup image&quot; src=&quot;/static/b033ee6c096e9f7b564f17df484d403f/fcda8/bp-url-3.png&quot; srcSet=&quot;/static/b033ee6c096e9f7b564f17df484d403f/12f09/bp-url-3.png 148w,/static/b033ee6c096e9f7b564f17df484d403f/e4a3f/bp-url-3.png 295w,/static/b033ee6c096e9f7b564f17df484d403f/fcda8/bp-url-3.png 590w,/static/b033ee6c096e9f7b564f17df484d403f/efc66/bp-url-3.png 885w,/static/b033ee6c096e9f7b564f17df484d403f/c83ae/bp-url-3.png 1180w,/static/b033ee6c096e9f7b564f17df484d403f/2cefc/bp-url-3.png 1400w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;
To locate an IP address, the resolver begins by querying the root DNS server (represented by the invisible ‘.’ at the end of a domain name: www.example.com.←)&lt;/undefined&gt;&lt;p&gt;Root servers hold the locations of all of the top-level domain servers, which will be queried next, followed by the second-level servers.&lt;/p&gt;&lt;p&gt;After the second-level domain servers are queried, the DNS resolver will be directed to the authoritative name server, which will return the IP address of “&lt;a href=&quot;http://www.example.com.%E2%80%9D&quot;&gt;www.example.com.”&lt;/a&gt; to the browser. The browser will store this address in its cache for a specified amount of time to speed lookup when that particular URL is called again.&lt;/p&gt;&lt;h2&gt;Making a Connection&lt;/h2&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:300px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/25fb17d17c22b39f919c1de5dd6643c3/5a46d/bp-url-4.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:100%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEPUlEQVQ4y2VVW2hcVRQ9Mw3YJopf0mp84AMLIgVF/BKrsa2d3DvPzCvTPCZpJo/JZO45M5kkFGMs9YFKUVtKQUXEDyHgs9KP+IB8K34oihWx2smjsTWWxGqdZO5Z7n3nTmLrhcU+nHv3Onvvs/e6QhhSOI+hPKL++NR22s8KU54iWyasEdYJC4TTtJ8T+9WOje9NWfMNKnfDkN76O48hDxGWPZExeIIlCFOB3rtQ8IZK8LSNwxuQfzQE5KENUn+dw1C1hVlsIqdPRWgCwl+EaKWIGIalydZgEPZYVcK62EcHmfytnBGhYmON1M2y+CM4ys+YbLt/pPJIOGvvDAzru/w5l4hJLU2R69QzSh84rNAxpey+51Rla5xITfK96jHkpIcja5WVR4NZPRE/iFwso1tCQ7xHqVo1tFp4aEjqXX1SPzAgwVb4ZEVEHN9Jt6DqZjr5EtfnTn/Ovs0/wrXSdCqngwbTwhaydYgniXg/k0t9d4/EDRFpU6pc41Xyaxb0YkSExjjs9S1+i4k0k29gD5HsJoLHrJp93EWLxI0Jp7Z0CNU6MM6kJb7yT0S4hGZ/vvpwKKtjkX50t2XQGc0gFcwgnR9G/ysFZF5U6D9K9iXlYOCoQuKIQouS+v4uWW2KjnHUM1y/8j0hCzLarz9KdemFdByrvVGs9MVwqT2CtdfTgC4BNmGlULNro8CVIrBaxJdfFfSRY8re2UWd4ZNnOeXKLqrbaDSj30916jPdCZwj0nLPJs5PduDCy92YH07i9zd7UV0ZRfXPUfx0poATbxe0Pyf1tqBkwjWOsNJs5tEdGdBvJNP6264kykzYHcd8VwzzRDiXimIuGcVSsR3zHTFcmOrA2jmF5YslzM5ShCeU3p1VdIGyKrYaVtkM5/BavNf+ujOll3so1Z4oljMxLOSTDulCbxyLQwksUoRMNjdEdiAO/JDDb0uj+t33CnZirIhtARrT6wz58R2hIh4MDq/vDQ9qf3RQt7QOYPrVIeDXPOZyScy1R7GYTWBpPIXyYBKXp1L4JncAbx0fxvPvFHWiIKs7kiW+lFlOeVAEx91R43GiHvSRDStMfyCBs3mcf7oDCyNJh/zviSROH+zELeE8tYviUeTerLfNs8JrqJuosS96SAS8pmUTuJm12Gvh+ojEsWm62XmFv06mceWpdkynu9AUrDV2A42kh/rWYzriUaW+va8+euOOKJg0RtzYNGJetvvI0WfhiZLCh6ckXsj00ZRIh8zLQ8CTwz7sa8iT187zjAg76lEhQpsnwGO6wtBiMTnPrSMWHqMWIXeICDupfi+MQtPVwuorNBLZ56JtojZyrRbLF6Uhba9LTEQ22aortnAj+04E1K2u0Hr/J7C0Pky47FxUgAW2sCmwvOa9oBNVhXCcImu8lqxuN38BhrrdqSsLriF/JvzjEvxC+IIwRd/c+59fgNdVbfEvpT62WiQoEVYAAAAASUVORK5CYII=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;connection image&quot; title=&quot;connection image&quot; src=&quot;/static/25fb17d17c22b39f919c1de5dd6643c3/5a46d/bp-url-4.png&quot; srcSet=&quot;/static/25fb17d17c22b39f919c1de5dd6643c3/12f09/bp-url-4.png 148w,/static/25fb17d17c22b39f919c1de5dd6643c3/e4a3f/bp-url-4.png 295w,/static/25fb17d17c22b39f919c1de5dd6643c3/5a46d/bp-url-4.png 300w&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;
TCP/IP (Transmission Control Protocol/Internet Protocol) is a set of procedures and rules for regulating how data is broken up, and exchanged between a client (in this case, your browser) and a server (such as example.com’s). With an IP address, your browser will attempt to initiate a TCP connection with the indicated server in order to send and receive information.&lt;/undefined&gt;&lt;h3&gt;Connection Security&lt;/h3&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/5a190/bp-url-5.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:30.405405405405407%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsSAAALEgHS3X78AAAA20lEQVQY032O207DMAyG++K8B0/CG3AFF9XgYsAmpTmnU6M2cZoDqYaXSmhX+2RbPsi/3V0btdacc4ppt5xyyWXbtutDOnTv/WwXN/vgQ4A1QAAPzrllcaWUR8u4OZoL1aT/eYfol3WGCLng+YgjlACAgJqAqmto3PJ1TSl1lNGLnF75y/Pn0+jkUX8c2NtRHwZGzqdz3/eEEMbYHimlwzBgLqWcpqlTWgkuCCPfw5cxZjQjl0wqKYRQSt06DXPHXmqtu9rAl+xkOeeozRlXUllrY4w4+m3UO/7LPzzbUbBEvxKcAAAAAElFTkSuQmCC&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;connection image&quot; title=&quot;connection image&quot; src=&quot;/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/fcda8/bp-url-5.png&quot; srcSet=&quot;/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/12f09/bp-url-5.png 148w,/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/e4a3f/bp-url-5.png 295w,/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/fcda8/bp-url-5.png 590w,/static/1b7710d1a3d0e35f4a3a9fc1b1f17d80/5a190/bp-url-5.png 800w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;
In the beginning of this article, I mentioned that https:// was the protocol for www.example.com. HTTPS stands for Hyper Text Transfer Protocol Secure. It is the secure version of HTTP, which is the protocol that defines how messages are formatted and transmitted across the web, and what actions web servers and browsers should perform in response to various commands.&lt;/undefined&gt;&lt;p&gt;HTTPS increases the security of a connection via SSL(Secured Sockets Layer), a standard security protocol for establishing encrypted links between the client and server via the use of public and private keys. Without SSL, any computer on any other networks between you and the web server can access your connection.
Firewalls also increase security by restricting traffic and preventing unwanted port connections.&lt;/p&gt;&lt;h3&gt;Load Balancers&lt;/h3&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/975112ef858418b64759f01c7322cad5/2cefc/bp-url-6.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:50%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABf0lEQVQoz5VRu27CQBDkd0LBN9GQAin8ByUVJV8AFVJEFQqsICUiiniFYIxxCA/Lz9v1ng0IsgcGRekyOp3ndDc769lMdAXywuhfyNxYLImXJMWJIlK1FG5HItrtdlJKvJqkYsDI3Pqztbf1BD/yBQLifr/n13wrEENQYsuywjCMr3olZjcvhPZ43Zls3uY2CLHYspz06VTX9SSOV7a78bHeaGSzd4XCPUb01/lFt9uj9WztywgihOFwkM/ni8WiYRgIYr9LNE0rl8uVSiUUqrtUzMQX0DPs/sIZL10QIft+TCb1er3Vapmm6XiqkWazmcvlHkolJIk3ZxYLwKfR6vF9ObAcAFxsA6T4dDodj0due+MGKyfsdLRarVatVl3PT53Vh4jb5ki4PqoIOHPiSOAMJlINQh4Oh0u5i1KJbYj7SzH4Fq+mP7WhZwWC4nTyqhReCIfMuzjj15xJsicHGAAHpXb1G4hJknBmn/OvlYeO6z13u9y8E4Cx8Xk0F+8f9SIgloYIeMQAAAAASUVORK5CYII=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;load balancer&quot; title=&quot;load balancer&quot; src=&quot;/static/975112ef858418b64759f01c7322cad5/fcda8/bp-url-6.png&quot; srcSet=&quot;/static/975112ef858418b64759f01c7322cad5/12f09/bp-url-6.png 148w,/static/975112ef858418b64759f01c7322cad5/e4a3f/bp-url-6.png 295w,/static/975112ef858418b64759f01c7322cad5/fcda8/bp-url-6.png 590w,/static/975112ef858418b64759f01c7322cad5/efc66/bp-url-6.png 885w,/static/975112ef858418b64759f01c7322cad5/c83ae/bp-url-6.png 1180w,/static/975112ef858418b64759f01c7322cad5/2cefc/bp-url-6.png 1400w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;&lt;/undefined&gt;&lt;p&gt;Another piece of technology that your request might encounter en route to a web server is a load balancer. Load balancers distribute requests across server systems to increase the reliability, efficiency, and availability of the queried application or website.&lt;/p&gt;&lt;h3&gt;Web, Application, and Database Servers&lt;/h3&gt;&lt;undefined&gt;&lt;br/&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:590px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/8528d6f0e8c7223db565eb182521bc3a/6aca1/bp-url-7.jpg&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:37.83783783783784%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdYJIZ//xAAaEAABBQEAAAAAAAAAAAAAAAABAAMREiEi/9oACAEBAAEFApcrqJ6//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BV//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABwQAAIBBQEAAAAAAAAAAAAAAAABIQIRIkFxkf/aAAgBAQAGPwLJWnRV0cvw/8QAGBAAAwEBAAAAAAAAAAAAAAAAAAERMSH/2gAIAQEAAT8hTGm8SrwbyuB+F0f/2gAMAwEAAgADAAAAEIPP/8QAFxEAAwEAAAAAAAAAAAAAAAAAABEhAf/aAAgBAwEBPxBKG0f/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPxBH/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARITFBUf/aAAgBAQABPxB0GgMjqWNoAo0YvyFOoaCQwd7P/9k=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;connection image&quot; title=&quot;connection image&quot; src=&quot;/static/8528d6f0e8c7223db565eb182521bc3a/1c72d/bp-url-7.jpg&quot; srcSet=&quot;/static/8528d6f0e8c7223db565eb182521bc3a/a80bd/bp-url-7.jpg 148w,/static/8528d6f0e8c7223db565eb182521bc3a/1c91a/bp-url-7.jpg 295w,/static/8528d6f0e8c7223db565eb182521bc3a/1c72d/bp-url-7.jpg 590w,/static/8528d6f0e8c7223db565eb182521bc3a/6aca1/bp-url-7.jpg 650w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;br/&gt;
Once your request has reached www.example.com’s web server, the web server serves up a HTML file to your browser.&lt;/undefined&gt;&lt;p&gt;In order to process dynamic content, such as a Javascript file, the web sever must communicate with an application server, which will run the dynamic content, translate the results into static HTML, and return it to the web server.&lt;/p&gt;&lt;p&gt;Databases store website and application data. If requests for such information (usernames, passwords etc.) occur, a query to the database will be made and the relevant data will be sent back to the web server, which will, finally, return the necessary static code to the browser for your viewing pleasure.&lt;/p&gt;</content:encoded></item></channel></rss>