<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://maximorlov.com/about/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/how-to-fix-your-ejs-modals-when-they-dont-show-the-correct-info/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/travel.jpg</image:loc>
      <image:caption><![CDATA[camera, pair of brown shoes, white ceramic mug, grey and black pen, brown smoking pipe]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/6-common-sequelize-queries-rewritten-in-sql/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/sequelize-to-sql_1200x630.png</image:loc>
      <image:caption><![CDATA[Sequelize logo with an arrow pointing to a SQL logo]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/a-beginners-guide-to-building-a-docker-image-of-your-nodejs-application/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/docker-and-node.png</image:loc>
      <image:caption><![CDATA[Docker and Node.js logos]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/why-docker-whats-all-the-hype-about/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/why-docker.png</image:loc>
      <image:caption><![CDATA[Docker logo and a bunch of question marks]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/process-signals-inside-docker-containers/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/process-signals-with-docker.png</image:loc>
      <image:caption><![CDATA[A line depicting a process signal that enters a container with Docker logo on the side. Inside the container, the line whirls around trying to find the Node.js logo]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/exposing-a-port-in-docker-what-does-it-do/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/docker-expose.png</image:loc>
      <image:caption><![CDATA[Docker logo with dockerfile contents in the background highlighting the EXPOSE configuration line]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/automate-your-docker-deployments/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/automating-with-docker2.png</image:loc>
      <image:caption><![CDATA[Docker logo and 5 gear wheels]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/4-reasons-why-your-docker-containers-cant-talk-to-each-other/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/docker-communication.png</image:loc>
      <image:caption><![CDATA[Two Docker whales with text bubbles above them. One saying "Hey!" and the other "What?! I can't hear you"]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/docker-compose-syntax-volume-or-bind-mount/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/compose-volumes.png</image:loc>
      <image:caption><![CDATA[5 different ways of defining volumes and bind mounts with a question mark next to each, together with the Docker Compose logo and text "Volume or Bind mount?"]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/install-mysql-with-phpmyadmin-using-docker/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/mysql-phpmyadmin-docker.png</image:loc>
      <image:caption><![CDATA[MySQL, phpMyAdmin and Docker logos]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/pm2-to-docker-automatic-restarts/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/pm2-to-docker-restarts.png</image:loc>
      <image:caption><![CDATA[PM2 logo pointing to Docker logo, and below the words "Automatic restarts" and two clockwise arrows]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/from-pm2-to-docker-cluster-mode/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/pm2-to-docker-scaling.png</image:loc>
      <image:caption><![CDATA[PM2 Logo pointing to Docker logo, and below the words "Cluster Mode" with 4 Node.js logos]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/start-node-js-in-production/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/production-nodejs.png</image:loc>
      <image:caption><![CDATA[Node.js logo on top of a factory production band]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/host-your-personal-projects-on-a-single-vps/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/host-your-personal-projects-on-a-single-vps.png</image:loc>
      <image:caption><![CDATA[Host Your Personal Projects on a Single VPS]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/deploying-to-github-pages-dont-forget-to-fix-your-links/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/github-pages-fix-links.png</image:loc>
      <image:caption><![CDATA[Broken link without a repository name, and working link with a repository name]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/4-essential-steps-to-securing-a-vps/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/securing-a-vps.png</image:loc>
      <image:caption><![CDATA[4 Essential Steps to Securing a VPS]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/fix-permission-denied-error-from-github/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/github-permission-denied.png</image:loc>
      <image:caption><![CDATA[Terminal screenshot of permission denied error]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/server-template/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/server-template-cover-post-release.png</image:loc>
      <image:caption><![CDATA[Server Template for Busy Hackers. Hosting your full-stack projects shouldn't cost you a fortune.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/automated-deployments-from-github-with-webhook/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/auto-deploys-github-webhook.png</image:loc>
      <image:caption><![CDATA[Automated Deployments text with Github and Webhook logos]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/node-js-15-is-out-what-does-it-mean-for-you/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/nodejs-15.png</image:loc>
      <image:caption><![CDATA[Node.js logo and number 15]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/getting-started-with-eleventy/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/getting-started-with-eleventy.png</image:loc>
      <image:caption><![CDATA[Getting Started with Eleventy, Notes by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/es-modules-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/es-modules-in-nodejs-cover.png</image:loc>
      <image:caption><![CDATA[ES Modules in Node.js, Notes by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/why-your-calc-function-in-css-might-be-broken/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/why-your-calc-function-in-css-might-be-broken.png</image:loc>
      <image:caption><![CDATA[Why Your calc() Function in CSS Might Be Broken, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/request-parsing-nodejs-guide/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/request-parsing-nodejs-guide-cover.png</image:loc>
      <image:caption><![CDATA[Parsing Requests in Node.js, a free reference guide. Examples, concise explanations and best practices.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/fix-unexpected-field-error-multer/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/fix-unexpected-field-error-multer.png</image:loc>
      <image:caption><![CDATA[Fix &quot;Unexpected field&quot; Error From Multer, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/send-a-file-with-axios-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/send-a-file-with-axios-in-nodejs.png</image:loc>
      <image:caption><![CDATA[Send a File With Axios in Node.js, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/why-storing-files-database-bad-practice/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/why-storing-files-database-bad-practice.png</image:loc>
      <image:caption><![CDATA[Why Storing Files in the Database Is Considered Bad Practice, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/visual-guide-refactoring-callback-functions/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/visual-guide-refactoring-callback-functions.png</image:loc>
      <image:caption><![CDATA[A Visual Guide to Refactoring Callback Functions to Promises &amp; Async/await, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/vps-security-cheatsheet/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/vps-security-cheatsheet-cover.png</image:loc>
      <image:caption><![CDATA[4 Essential Steps to Securing a VPS, A FREE Security Cheatsheet.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/javascript-event-loop-talk/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/javascript-event-loop-talk-cover.png</image:loc>
      <image:caption><![CDATA[The Talk That Made Me Finally Understand How the Event Loop Works, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/synchronous-vs-asynchronous-callbacks/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/synchronous-vs-asynchronous-callbacks-cover.png</image:loc>
      <image:caption><![CDATA[Synchronous vs Asynchronous Callbacks, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/forof-vs-forin-memory-trick/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/forof-vs-forin-memory-trick-cover.png</image:loc>
      <image:caption><![CDATA[A Memory Trick To Remember When to Use for...of vs for...in, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/parallel-tasks-with-pure-javascript/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/parallel-tasks-with-pure-javascript-cover.png</image:loc>
      <image:caption><![CDATA[Run Concurrent Tasks With a Limit Using Pure JavaScript, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/linting-rules-for-asynchronous-code-in-javascript/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/linting-rules-for-asynchronous-code-in-javascript-cover.png</image:loc>
      <image:caption><![CDATA[14 Linting Rules To Help You Write Asynchronous Code in JavaScript, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/why-you-shouldnt-mix-promise-then-with-async-await/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/why-you-shouldnt-mix-promise-then-with-async-await-cover.png</image:loc>
      <image:caption><![CDATA[Why You Shouldn&#39;t Mix Promise.then() With Async/Await Syntax, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/async-await-inside-foreach/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/async-await-inside-foreach-cover.png</image:loc>
      <image:caption><![CDATA[Why Async/Await Inside forEach Is a Bad Idea, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/understanding-async-await/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/understanding-async-await-cover.png</image:loc>
      <image:caption><![CDATA[Understanding Async &amp; Await, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/caching-asynchronous-results/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/caching-asynchronous-results-cover.png</image:loc>
      <image:caption><![CDATA[Avoid This Mistake When Caching Asynchronous Results, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/using-callbacks-with-async-await/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/using-callbacks-with-async-await-cover.png</image:loc>
      <image:caption><![CDATA[Using Callbacks With Async/Await, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/async-await-better-than-chaining-promises/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/async-await-better-than-chaining-promises-cover.png</image:loc>
      <image:caption><![CDATA[3 Reasons Why Async/Await Is Better Than Chaining Promises, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/practical-async-await/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/practical-async-await-cover.png</image:loc>
      <image:caption><![CDATA[Practical Async/Await, write modern asynchronous JavaScript that just works — today. Beginner & intermediate modules, 16 video lessons, bonus content.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/backend-portfolio-projects-no-css/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/backend-portfolio-projects-without-css-cover.png</image:loc>
      <image:caption><![CDATA[Backend Portfolio Projects for Developers Who Dread CSS, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/awesome-apis-for-nodejs-projects/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/awesome-apis-for-nodejs-projects-cover.png</image:loc>
      <image:caption><![CDATA[7 Awesome Free APIs for Your Next Node.js Project, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/char-varchar-text-postgresql/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/char-varchar-text-postgresql-cover.png</image:loc>
      <image:caption><![CDATA[Should You Use char, varchar, or text in PostgreSQL?, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/unfinished-projects-on-resume/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/unfinished-projects-resume-cover.png</image:loc>
      <image:caption><![CDATA[Unfinished Projects on Resume: Wise or Not?, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/navigating-new-codebases/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/navigating-new-codebases.png</image:loc>
      <image:caption><![CDATA[Navigate New Codebases Like a Seasoned Pro, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/understanding-property-of-undefined-typeerror-in-javascript/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/understanding-property-of-undefined-typeerror-in-javascript-cover.png</image:loc>
      <image:caption><![CDATA[Understanding &quot;Property of Undefined&quot; TypeError in JavaScript, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/eslint-setup-nodejs-detailed-guide-beginners/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/eslint-setup-nodejs-detailed-guide-beginners-cover.png</image:loc>
      <image:caption><![CDATA[ESLint Setup in Node.js: A Detailed Guide, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/mentorship/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/mentorship-cover.png</image:loc>
      <image:caption><![CDATA[Graphic with text and illustration. The text reads 'Let's propel your career forward. Leapfrog the learning curve with a mentor, paving your way to a successful career in web development.' Below the text is the name 'Maxim Orlov' with a circular headshot of a smiling man. On the right, there is an illustration of two people, one male and one female, in casual clothes, giving each other a high five.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/job-hunt/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/job-hunt-cover.png</image:loc>
      <image:caption><![CDATA[Graphic with text and illustration. The text reads 'Stand out, get noticed, and land interviews. Uncover mistakes that hinder your job search, and showcase your value to potential employers.' Below the text is the name 'Maxim Orlov' with a circular headshot of a smiling man. On the right, there is an illustration of a man and a woman in business attire, shaking hands in front of a document or certificate on the wall, with speech bubbles above their heads.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/one-or-two-column-resumes/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/one-or-two-column-resumes-cover.png</image:loc>
      <image:caption><![CDATA[One or Two-Column Resumes: Best Choice for Aspiring Web Developers, Articles by Maxim Orlov]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/website-design-development-services/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/collaboration-creative-workspace.jpg</image:loc>
      <image:caption><![CDATA[Two people collaborating at a meeting table with a laptop and notebook, discussing ideas with hand gestures, focusing on a project displayed on the screen.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/articles/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/courses/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/goodies/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/icebuddy-data-deletion/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/how-to-wait-or-pause-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/wait-in-nodejs.png</image:loc>
      <image:caption><![CDATA[Native delay/sleep implementation by importing setTimeout from "timers/promises" core API and running with: await setTimeout(1000)]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/settimeout-execution-time/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/front-matter-cms-for-vscode/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/real-time-collaboration-with-dockside/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/what-is-a-callback-function/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/callback-function.png</image:loc>
      <image:caption><![CDATA[Initialising two functions: printToConsole and getGreeting. printToConsole takes a single argument and console.logs it. getGreeting takes a string and a callback function as arguments and calls the callback function with "Hello" prepended to the string. Calling getGreeting with "Maxim" and printToConsole as arguments outputs: Hello Maxim]]></image:caption>
    </image:image>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/anonymous-callback-function.png</image:loc>
      <image:caption><![CDATA[Initialising a getGreeting function that takes two arguments: a name and a callback. getGreeting calls the callback function with "Hello" prepended to the name. Calling getGreeting with name="Maxim" and an inlined anonymous callback function which prints the argument to the console results in "Hello Maxim" as output]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/skip-to-content-link/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/skip-to-content.png</image:loc>
      <image:caption><![CDATA[An a tag with href="#main" right after the opening body tag. Followed by fictional navigation bar and headers, and then a main tag with id="main" holding the main content.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/using-theme-color-meta-tag/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/theme-color-desktop.png</image:loc>
      <image:caption><![CDATA[Screenshot of maximorlov.com homepage on desktop showing a red top navigation bar with a smooth transition to, an equally red, browser interface.]]></image:caption>
    </image:image>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/theme-color-mobile.png</image:loc>
      <image:caption><![CDATA[Screenshot of maximorlov.com homepage on mobile showing a red top navigation bar with a smooth transition to, an equally red, mobile status bar.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/debug-requests-using-a-mirror-api/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/colour-contrast-for-accessibility/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/convert-curl-to-javascript-fetch/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/curl-to-fetch.png</image:loc>
      <image:caption><![CDATA[Screenshot of https://kigiri.github.io/fetch/ with a cURL request to Twitter API at the top and the fetch equivalent at the bottom.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/using-data-attributes/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/using-data-attributes.png</image:loc>
      <image:caption><![CDATA[A div element inside an HTML page with two custom data attributes: data-country and data-city. We grab the element in JavaScript and access the custom data through the dataset property: document.querySelector('#card').dataset.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/typescript-declarations-for-npm-packages/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/declarations-included.png</image:loc>
      <image:caption><![CDATA[Screenshot of Vue package in NPM showing TS icon next to its name with the text: "This package contains built-in TypeScript declarations."]]></image:caption>
    </image:image>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/declarations-available.png</image:loc>
      <image:caption><![CDATA[Screenshot of Express package in NPM showing DT icon next to its name with the text: "This package has TypeScript declarations provided by @types/express"]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/nodejs-port-already-in-use/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/copyright-format-in-website-footer/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/ping-google-on-sitemap-update/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/debug-srcset-and-sizes-attributes-in-images/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/debug-srcset-and-sizes-attributes-in-images.jpg</image:loc>
      <image:caption><![CDATA[Importing responsive-image-test from unpkg and hooking it to an image with observeSizes function.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/using-html-tags-in-markdown/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/html-tags-in-markdown.jpg</image:loc>
      <image:caption><![CDATA[Two examples of markdown content inside an aside HTML tag surrounded with, and without, empty lines.]]></image:caption>
    </image:image>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/rendering-of-html-tags-in-markdown.jpg</image:loc>
      <image:caption><![CDATA[Two examples showing raw formatted content, and content parsed as markdown.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/find-nearest-tailwind-colour/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/practice-algorithms-and-data-structures-in-javascript/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/sort-tailwind-classes/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/support-esm-and-commonjs-uses-of-your-library/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/supporting-esm-and-commonjs-library-users.png</image:loc>
      <image:caption><![CDATA[Support ESM and CommonJS by setting exports[.].import for ESM and exports[.].require for CommonJS in package.json of your library.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/using-es-modules-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/using-esmodules-in-nodejs.jpg</image:loc>
      <image:caption><![CDATA[Two ways to use ESM: 1. Use .mjs file extension, or 2. Add type: module to your package.json.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/playground-application-for-javascript-and-nodejs/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/github-notifications-for-new-releases/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/cloudflare-plugin-for-certbot/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/use-certbot-with-cloudflare-plugin.jpg</image:loc>
      <image:caption><![CDATA[Use --dns-cloudflare and --dns-cloudflare-credentials flags during certificate generation with certbot to automate domain verification through DNS TXT records.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/list-globally-installed-npm-libraries/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/test-css-selectors-with-devtools/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/test-css-selectors-with-devtools.jpg</image:loc>
      <image:caption><![CDATA[In the lower part of DevTools on the Elements tab, type your CSS selector and the corresponding HTML element will be selected.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-your-cookies/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/restrict-an-object-in-javascript/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/restrict-object-in-javascript.jpg</image:loc>
      <image:caption><![CDATA[Object Restriction table with add, modify and remove property as rows and default, preventExtensions, seal and freeze functions as columns.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/run-locally-installed-npm-library/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/well-known-url-for-changing-passwords/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/well-known-url-for-changing-passwords.jpg</image:loc>
      <image:caption><![CDATA[In Chrome's check password feature the change password button leads .well-known/change-password page at the website's domain.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/strict-vs-non-strict-mode-in-ecmascript/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/strict-vs-non-strict-mode-in-ecmascript.jpg</image:loc>
      <image:caption><![CDATA[In non-strict mode you can use a reserved keyword such as let as a variable name. In strict mode the JavaScript compiler throws a SyntaxError.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/protect-against-parameter-pollution-in-express/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/protect-against-parameter-pollution-in-express.jpg</image:loc>
      <image:caption><![CDATA[Without HPP Protection, parameter type changes from string to array on multiple values. The hpp package for Express protects always resolves to the last value and thus type will always be the same.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/nginx-configuration-for-websocket-applications/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/nginx-and-websockets.jpg</image:loc>
      <image:caption><![CDATA[To have Nginx work smoothly with Websocket apps, use proxy_http_version 1.1 and set the following headers with proxy_set_header: Upgrade $http_upgrade, Connection $http_connection, Host $host.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/automatic-restart-on-system-reboot-with-pm2/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/quickly-navigate-to-folder-in-shell/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/quickly-navigate-to-folder-in-shell.png</image:loc>
      <image:caption><![CDATA[Enable using variables with cd in Z Shell with: setopt cdablevars and in Bash with: shopt -s cdable_vars. Then run export yourapp="path/to/yourapp" after which you can use cd $yourapp.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/check-if-port-is-open-to-public/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/use-native-promises-with-nodejs-fs-module/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/built-in-promises-nodejs-fs-module.jpg</image:loc>
      <image:caption><![CDATA[Use the built-in promisified version of fs module in Node.js by importing fs/promises.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/relinquish-process-privileges-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/relinquish-process-privileges-in-nodejs.jpg</image:loc>
      <image:caption><![CDATA[Inside the callback function for server.listen, change process user with process.setuid('nodejs') and process.setguid('nodejs') to relinquish privileges and reduce damage potential in case of a breach.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/measure-execution-time-with-consoletime/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/measure-execution-time-in-javascript.jpg</image:loc>
      <image:caption><![CDATA[To start the timer, use console.time('fetch'). console.timeEnd('fetch') ends the timer and outputs the time in milliseconds.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/mapping-of-http-status-messages-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/using-status-codes-mapping-nodejs.jpg</image:loc>
      <image:caption><![CDATA[The STATUS_CODES (uppercase) object of the http module has a mapping of status code to status message (e.g. STATUS_CODES[404]).]]></image:caption>
    </image:image>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/status-code-to-message-mapping-nodejs.jpg</image:loc>
      <image:caption><![CDATA[Node.js mapping of status codes and their corresponding message.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/large-nodejs-project-example-to-learn-from/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/collection-of-nginx-snippets/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/disable-npm-update-notifications/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/npm-update-notification.jpg</image:loc>
      <image:caption><![CDATA[A wild NPM update notification in the terminal has appeared.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/test-your-regex-in-a-playground/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/tiny-json-db-for-quick-prototyping/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/generate-secure-and-clean-unique-ids/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/organise-large-nginx-configs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/organise-large-nginx-configs.png</image:loc>
      <image:caption><![CDATA[Typical Nginx configuration using two includes to import configurations from snippets/security.conf and snippets/general.conf.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/difference-between-apt-and-apt-get/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/quickly-test-glob-patterns/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/find-vulnerabilities-in-your-nginx-configuration/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-your-vps-use-non-root-user/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/secure-vps-disable-root-login.png</image:loc>
      <image:caption><![CDATA[Set PermitRootLogin to no in /etc/ssh/sshd_config to disable root login.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/sites-available-vs-sites-enabled-in-nginx/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/sites-available-vs-sites-enabled-nginx.jpg</image:loc>
      <image:caption><![CDATA[Create a symlink with ln -s from sites-enabled to sites-available to enable a site's configuration.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-your-vps-disable-password-login/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/secure-vps-disable-password-login.png</image:loc>
      <image:caption><![CDATA[Set PasswordAuthentication to no in /etc/ssh/sshd_config to disable password login.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/find-popular-javascript-nodejs-libraries/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-file-transfer-from-to-remote-server/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/secure-file-transfer-from-to-remote-server.png</image:loc>
      <image:caption><![CDATA[Run scp source destination to transfer files from/to remote server in a secure way. Prepend user@host: to the remote path.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/improve-nginx-performance-direct-file-transfers/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/nginx-performance-direct-file-transfers.jpg</image:loc>
      <image:caption><![CDATA[Improve Nginx performance by setting sendfile directive in the https block to on.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/use-sudo-without-password-prompt-in-scripts/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/sudo-without-password-prompt-in-scripts.jpg</image:loc>
      <image:caption><![CDATA[To allow a user named ansible to use all sudo commands without a password, add ansible ALL=(ALL:ALL) NOPASSWD: ALL in /etc/sudoers file.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/programatically-check-if-system-requires-restart/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/programatically-check-if-system-requires-restart.png</image:loc>
      <image:caption><![CDATA[Run cat /var/run/reboot-required to check if system requires a reboot. cat /var/run/reboot-required.pkgs shows the packages that involved.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/dont-accidentally-serve-dotfiles-with-nginx/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/hide-dotfiles-nginx.jpg</image:loc>
      <image:caption><![CDATA[Add deny all inside a location block matching ~ /\.(?!well-known) paths to not serve dotfiles in your project.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/a-better-minimum-compression-size-in-nginx/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/minimum-compression-size-nginx.jpg</image:loc>
      <image:caption><![CDATA[Set gzip_min_length directive to 256 to tell Nginx to start compressing at a bigger size. Default value of 20 usually leads to larger files after gzipping because of the small size.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-phrase-generator-for-passwords-and-secrets/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/secure-phrase-generator.png</image:loc>
      <image:caption><![CDATA[Different sets of generated phrases labeled as memorable, strong and fort knox passwords.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/disable-nginx-server-header/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/disable-nginx-server-header.jpg</image:loc>
      <image:caption><![CDATA[Set server_tokens value to off in the http block to disable emitting nginx version on error pages and in the Server response header.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/improve-nginx-performance-multi-threading/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/nginx-performance-multi-threading.jpg</image:loc>
      <image:caption><![CDATA[By setting worker_processes to auto, Nginx will spin up a number of threads equal to available CPU cores.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/use-systemd-to-manage-processes/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/use-systemd-to-manage-processes.png</image:loc>
      <image:caption><![CDATA[A basic systemd unit file with a service description and start command.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/get-process-environment-from-terminal/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/get-process-environment-from-terminal.png</image:loc>
      <image:caption><![CDATA[Get the ENV vars of a running process with cat /proc/$PID/environ | tr '0' '
'.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/get-nodejs-port-using-pm2-name/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/get-nodejs-port-using-pm2-name.jpg</image:loc>
      <image:caption><![CDATA[Get the port of a running Node.js process by its PM2 Name with the following command: ss -ntlp | grep $(pm2 ls | grep <app_name> | awk '{print $12}') | awk '{print $4}' | grep -oP '(?<=:)[0-9]{2,}'.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/quick-server-for-incoming-webhooks/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/update-packages-on-ubuntu/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/assign-a-random-port-to-nodejs-server/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/assign-random-port-nodejs-server.jpg</image:loc>
      <image:caption><![CDATA[Use server.listen(0) to let the OS assign a randomly available port to the Node.js server. Print the assigned port with server.address().port.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/companies-that-provide-visa-sponsorship/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/github-actions-workflows-vs-actions/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/project-ideas-list/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/how-big-tech-companies-test-code/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/cron-jobs-with-github-actions/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/cron-job-with-github-actions.png</image:loc>
      <image:caption><![CDATA[Example cronjob in Github Actions to backup a database once a day.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/validate-github-action-workflow-in-vscode/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/manage-your-projects-on-localhost/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/rename-default-branch-on-github/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/rename-default-git-branch.png</image:loc>
      <image:caption><![CDATA[Rename default git branch with: git config --global init.defaultBranch <name>.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/debug-ssh-connection-failures/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/awesome-github-profile-readmes/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/aws-serverless-cost-calculator/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/aws-serverless-cost-calculator.jpg</image:loc>
      <image:caption><![CDATA[Main sheet of AWS Serverless Cost Calculator with variables on left side and result on the right. Variables include # of sessions/day, avg size of uploaded files, # of pages visited. Result include cost/month, cost/session and a cost breakdown per service such as Lambda, Cognito, S3, Cloudfront etc..]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/quickly-get-javascript-event-keycode/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/get-javascript-event-keycode.jpg</image:loc>
      <image:caption><![CDATA[Frontpage of keycode.info showing keycode and event name as you type a key.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/how-to-ask-for-help/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/easily-customise-your-shell-prompt/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/easily-customise-your-shell-prompt.jpg</image:loc>
      <image:caption><![CDATA[Terminal prompt with folder name followed by active branch and a yellow x indicating presence of uncommitted changes.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/github-profile-readme-chess-game/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/full-rest-api-without-any-coding/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/print-your-environment/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/print-your-environment-with-envinfo.jpg</image:loc>
      <image:caption><![CDATA[Simplistic green landscape as logo with the text: envinfo generates a report of the common details needed when troubleshooting software issues.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/enabling-https-during-development/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/upload-files-from-terminal/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/upload-files-from-terminal.jpg</image:loc>
      <image:caption><![CDATA[Upload a hello.txt file by running: curl --upload-file ./hello.txt https://transfer.sh/hello.txt]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/http-service-backend-for-fast-prototyping/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/emoji-guide-for-commit-messages/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/check-worldwide-dns-propagation/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/nginx-location-match-tester/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/nginx-location-match-tester.jpg</image:loc>
      <image:caption><![CDATA[Nginx location tester tool where you can paste your Nginx configuration and url to test and it will describe in detail how it evaluated your configuration.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/easily-test-your-htaccess-rewrite-rules/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/top-level-await-in-nodejs/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/top-level-await-in-nodejs.jpg</image:loc>
      <image:caption><![CDATA[Prior to Node.js 14.8 you had to wrap async/await in an IIFE. From Node.js 14.8 and up, you can use top-level await in ES Modules.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/public-urls-for-your-local-server/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/make-your-site-portable-by-using-permalinks/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/iaas-vs-paas-explained-using-a-store-analogy/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/nginx-reverse-proxy-configuration/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/nginx-reverse-proxy-configuration.png</image:loc>
      <image:caption><![CDATA[Basic Nginx reverse proxy configuration with two server blocks and each having a server_name directive indicating which domain it should match.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/simplified-man-pages/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/find-out-why-your-site-isnt-fully-secure/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/what-makes-a-website-dynamic/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/what-makes-a-website-static/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/nextjs-or-gatsby-a-dynamic-vs-static-choice/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/tell-heroku-how-to-start-your-app-with-procfile/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/fix-r10-error-from-heroku/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/101-ways-to-make-your-website-more-awesome/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/devops-roadmap/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/add-public-key-to-server-with-ssh-copy-id/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/single-non-www-and-https-redirect-in-apache/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/single-non-www-and-https-redirect-in-apache.png</image:loc>
      <image:caption><![CDATA[Redirecting from (non-)www and https in a single step with Apache. Source available at: https://gist.github.com/Maximization/fd1745fe21dda13bcbbc620ec195291d]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/restrict-ssh-key-to-specific-commands/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/simple-editor-for-cron-schedule-expressions/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/what-does-this-bash-command-do/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/explainshellcom-frontpage.jpg</image:loc>
      <image:caption><![CDATA[Frontpage of explainshell.com breaking down an example command and explaining what each flag does.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/bash-scripting-cheatsheet/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-your-vps-setup-firewall/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/secure-vps-setup-firewall.png</image:loc>
      <image:caption><![CDATA[Setting up a firewall with ufw in Ubuntu by blocking all incoming traffic except SSH, HTTP & HTTPS.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/secure-your-vps-enable-automatic-updates/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/find-digitalocean-region-with-lowest-ping/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/tips/find-digitalocean-region-with-lowest-ping.jpg</image:loc>
      <image:caption><![CDATA[Average ping times of Digital Ocean regions sorted by fastest first.]]></image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/practical-guide-to-amazon-web-services/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/explore-layers-in-a-docker-image/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/synchronous-container-startup-in-docker-compose/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/assign-a-static-ip-address-to-docker-container/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/list-all-containers-in-a-network-by-name/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/prune-docker-objects-and-free-up-space/</loc>
  </url>
  <url>
    <loc>https://maximorlov.com/tips/</loc>
    <image:image>
      <image:loc>https://maximorlov.com/images/handy-tips.png</image:loc>
      <image:caption><![CDATA[(Really) Handy Web Dev Tips.]]></image:caption>
    </image:image>
  </url>
</urlset>
