<?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[Gajus Blog]]></title><description><![CDATA[Gajus blog posts.]]></description><link>https://gajus.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 22:53:48 GMT</lastBuildDate><atom:link href="https://gajus.com/blog/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><item><title><![CDATA[Isolated Development Environments for Agentic Development]]></title><description><![CDATA[Branches and worktrees isolate code, but not services. In the age of agentic development, that gap becomes a real problem. Here's how combining Git worktrees with OrbStack VMs gives every agent its own world.]]></description><link>https://gajus.com/blog/isolated-development-environments-for-agentic-development</link><guid isPermaLink="false">https://gajus.com/blog/a5fc64ad-8e28-4cd3-a0d1-813d62abd654</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 18 Mar 2026 12:00:00 GMT</pubDate></item><item><title><![CDATA[Batching Redis lookups with DataLoader and MGET]]></title><description><![CDATA[How to use DataLoader to batch individual Redis GET calls into a single MGET roundtrip.]]></description><link>https://gajus.com/blog/batching-redis-lookups-with-dataloader-and-mget</link><guid isPermaLink="false">https://gajus.com/blog/b3248450-4725-4e81-8682-3d521a3cdae4</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 12 Mar 2026 12:00:00 GMT</pubDate></item><item><title><![CDATA[This Blog Was Made by AI]]></title><description><![CDATA[I rebuilt my entire blog without writing a single line of code. Here's how Claude Code, voice dictation, and autonomous agents made it happen.]]></description><link>https://gajus.com/blog/this-blog-was-made-by-ai</link><guid isPermaLink="false">https://gajus.com/blog/8f99e474-796c-4395-82f5-83569689219b</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 21 Jan 2026 09:00:00 GMT</pubDate></item><item><title><![CDATA[Test Markdown]]></title><description><![CDATA[A comprehensive test of all markdown edge cases and styling scenarios.]]></description><link>https://gajus.com/blog/test-markdown</link><guid isPermaLink="false">https://gajus.com/blog/01948a5e-7c3f-7a8b-9d4e-2b6f8c1a3e5d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[X "For You" Algorithm Explained]]></title><description><![CDATA[Summary of X's For You algorithm.]]></description><link>https://gajus.com/blog/x-for-you-algorithm-disected</link><guid isPermaLink="false">https://gajus.com/blog/36fe42e5-e05b-4781-bf72-3ddf0273b391</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 20 Jan 2026 10:00:00 GMT</pubDate></item><item><title><![CDATA[Twitter (most likely) regrets adding Follow]]></title><description><![CDATA[Lists is a better form of social categorization.]]></description><link>https://gajus.com/blog/twitter-most-likely-regrets-adding-follow</link><guid isPermaLink="false">https://gajus.com/blog/f09f2647-c563-4bb2-8800-5659062b32d0</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 14 Nov 2024 14:27:00 GMT</pubDate></item><item><title><![CDATA[Fine-tuning OpenAI models]]></title><description><![CDATA[Run-through of how to train OpenAI models with a custom data sets, and a summary of what to expect in terms of accuracy, speed, and cost.]]></description><link>https://gajus.com/blog/fine-tuning-openai-models</link><guid isPermaLink="false">https://gajus.com/blog/0c24ab4d-64e5-458f-bef5-1b36c4524a99</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 24 Apr 2024 09:42:10 GMT</pubDate></item><item><title><![CDATA[Understanding and avoiding visually ambiguous characters in IDs]]></title><description><![CDATA[Designing a dictionary of visually unambiguous characters for IDs.]]></description><link>https://gajus.com/blog/avoiding-visually-ambiguous-characters-in-ids</link><guid isPermaLink="false">https://gajus.com/blog/81835e07-7884-4f4d-a826-9915e3cb9db9</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 22 Apr 2024 16:59:17 GMT</pubDate></item><item><title><![CDATA[Setting up PostgreSQL for running integration tests]]></title><description><![CDATA[Setting up PostgreSQL for tests is crucial for achieving performance and reliability. In this article, I'll explain how to set up PostgreSQL for tests and discuss some common pitfalls to avoid.]]></description><link>https://gajus.com/blog/setting-up-postgre-sql-for-running-integration-tests</link><guid isPermaLink="false">https://gajus.com/blog/ea154808-5e3b-4ea1-8f43-4f7836829071</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 12 Apr 2024 08:59:15 GMT</pubDate></item><item><title><![CDATA[Designing one-to-one relationships in PostgreSQL]]></title><description><![CDATA[Discovering a new perspective on a familiar path. Unveiling the inherent flaws in a longstanding one-to-one design pattern and embracing a superior approach]]></description><link>https://gajus.com/blog/designing-one-to-one-relationships-in-postgresql</link><guid isPermaLink="false">https://gajus.com/blog/4ebdb30d-cdb2-441d-af59-5059b6959d40</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 03 Apr 2024 17:16:57 GMT</pubDate></item><item><title><![CDATA[The case for native assertions in PostgreSQL]]></title><description><![CDATA[Dangers of DISTINCT and implicit assumptions in SQL queries]]></description><link>https://gajus.com/blog/the-case-for-native-assertions-in-postgresql</link><guid isPermaLink="false">https://gajus.com/blog/f7af39f1-6d8d-439a-94c6-d3e3e1952778</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 02 Apr 2024 17:37:46 GMT</pubDate></item><item><title><![CDATA[How to add Sentry tracing to your Node.js app]]></title><description><![CDATA[Challenges adding OpenTelemetry and Sentry tracing to a Node.js app]]></description><link>https://gajus.com/blog/how-to-add-sentry-tracing-to-your-node-js-app</link><guid isPermaLink="false">https://gajus.com/blog/938ebd51-4965-477d-b866-bb7c6481189b</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 21 Mar 2024 18:24:06 GMT</pubDate></item><item><title><![CDATA[What makes great engineering teams?]]></title><description><![CDATA[Sparse notes on what makes great engineering teams]]></description><link>https://gajus.com/blog/what-makes-great-engineering-teams</link><guid isPermaLink="false">https://gajus.com/blog/018b38d5-ee84-7be5-a607-bb6c77ec8275</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 16 Oct 2023 14:13:19 GMT</pubDate></item><item><title><![CDATA[Testing Rehype Pretty Code]]></title><description><![CDATA[A playground for testing Rehype Pretty Code and styling code blocks.]]></description><link>https://gajus.com/blog/testing-rehype-pretty-code</link><guid isPermaLink="false">https://gajus.com/blog/018b35fc-a3d3-7561-8084-6281fca807dd</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 16 Oct 2023 00:57:18 GMT</pubDate></item><item><title><![CDATA[Integrating Fastify with Slonik]]></title><description><![CDATA[In the world of Node.js development, the combination of Fastify, a high-performance web framework, and Slonik, a robust SQL query builder and executor, offers an enticing proposition.]]></description><link>https://gajus.com/blog/integrating-fastify-with-slonik</link><guid isPermaLink="false">https://gajus.com/blog/018b16ed-d388-78c9-817c-d5994d5578aa</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 30 Sep 2023 12:55:58 GMT</pubDate></item><item><title><![CDATA[Integrating Slonik with Express.js]]></title><description><![CDATA[A comprehensive guide to integrating Slonik, a battle-tested SQL query building and execution library, with Express.js for Node.js applications.]]></description><link>https://gajus.com/blog/integrating-slonik-with-express-js</link><guid isPermaLink="false">https://gajus.com/blog/1e8ed2ab-81b1-4f26-ac19-517c11017c29</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Attempting Large Code Refactor using LLMs]]></title><description><![CDATA[How to use GPT-4 to automate large code refactors, transforming 83 files with a React component export pattern change, including gotchas and lessons learned.]]></description><link>https://gajus.com/blog/attempting-large-code-refactor-using-llms</link><guid isPermaLink="false">https://gajus.com/blog/b0558ef3-5da2-4ec5-97d0-bd944e4b3bc0</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 29 Jun 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Detecting unnecessarily mounted React components in a large app]]></title><description><![CDATA[My learnings from tracking down dead code in a frontend application.]]></description><link>https://gajus.com/blog/detecting-unnecessarily-mounted-react-components-in-a-large-app</link><guid isPermaLink="false">https://gajus.com/blog/0a71dda9-b0b1-4d94-803c-a081260ce85e</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 15 Feb 2023 12:00:00 GMT</pubDate></item><item><title><![CDATA[Debugging mysterious traffic from Boardman, OR]]></title><description><![CDATA[A journey of debugging mysterious traffic spikes coming from Boardman, OR.]]></description><link>https://gajus.com/blog/debugging-mysterious-traffic-from-boardman-or</link><guid isPermaLink="false">https://gajus.com/blog/52f115e0-381f-4280-9c0b-9ec84a9d254d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 16 Nov 2022 12:00:00 GMT</pubDate></item><item><title><![CDATA[Bulk inserting nested data into the database (part II)]]></title><description><![CDATA[Using jsonb to process and insert large and complex datasets into the database in a single query.]]></description><link>https://gajus.com/blog/bulk-inserting-nested-data-into-the-database-part-ii</link><guid isPermaLink="false">https://gajus.com/blog/fbfaa3bd-4761-4559-98b5-830de924687a</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 06 Oct 2022 12:00:00 GMT</pubDate></item><item><title><![CDATA[How a few lines of code reduced database load by a few million queries]]></title><description><![CDATA[Discover how using jsonb_to_recordset instead of unnest can dramatically reduce database query load when inserting large datasets with nested data structures in PostgreSQL.]]></description><link>https://gajus.com/blog/how-a-few-lines-of-code-reduced-database-load</link><guid isPermaLink="false">https://gajus.com/blog/34b26aa7-08c2-49fe-8d63-d4f2354d5f4c</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 06 Oct 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Routing PostgreSQL queries between read-write & read-only instances]]></title><description><![CDATA[Load balancing application between read-write and read-only PostgreSQL instances using query routing.]]></description><link>https://gajus.com/blog/routing-postgresql-queries-between-read-write-and-read-only-instances</link><guid isPermaLink="false">https://gajus.com/blog/0cec5bac-43ae-46f4-8da7-d2dbb472229d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 05 Oct 2022 12:00:00 GMT</pubDate></item><item><title><![CDATA[Building advanced SQL search from a user text input]]></title><description><![CDATA[Learn how to build a program that parses user search queries and converts them into SQL statements, supporting field-specific searches, exclusions, range queries, and boolean operators.]]></description><link>https://gajus.com/blog/building-advanced-sql-search-from-a-user-text-input</link><guid isPermaLink="false">https://gajus.com/blog/fbbd9651-e98d-4370-bb22-b078f97df275</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 30 Sep 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Writing composable SQL using JavaScript]]></title><description><![CDATA[A walkthrough of common patterns of writing SQL queries in JavaScript with the help of Slonik.]]></description><link>https://gajus.com/blog/writing-composable-sql-using-javascript</link><guid isPermaLink="false">https://gajus.com/blog/cc4dc77c-5d8d-4192-aff2-1dc902788291</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 23 Sep 2022 12:00:00 GMT</pubDate></item><item><title><![CDATA[Fully qualified names vs a jungle of imports]]></title><description><![CDATA[Exploring a simpler approach to imports in Node.js by using fully qualified names from a single entry point, eliminating the need to remember complex file paths.]]></description><link>https://gajus.com/blog/fully-qualified-names-vs-a-jungle-of-imports</link><guid isPermaLink="false">https://gajus.com/blog/68d7b2d3-7c1d-41a5-b183-c9ca7ea855fd</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 11 Sep 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Rewriting tests from Cypress to Playwright using GPT3]]></title><description><![CDATA[Using OpenAI's text-davinci-002 model to rewrite tests from one framework to another.]]></description><link>https://gajus.com/blog/rewriting-tests-from-cypress-to-playwright-using-gpt3</link><guid isPermaLink="false">https://gajus.com/blog/ebf99293-4f07-4a8a-963a-615b2a6446a6</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 07 Sep 2022 12:00:00 GMT</pubDate></item><item><title><![CDATA[Migrating from Cypress to Playwright using GPT3]]></title><description><![CDATA[Learn how to use GPT-3 to automatically migrate 400+ Cypress tests to Playwright, saving massive amounts of manual work by leveraging AI for code transformation.]]></description><link>https://gajus.com/blog/migrating-from-cypress-to-playwright-using-gpt3</link><guid isPermaLink="false">https://gajus.com/blog/16af8f59-237f-4f12-aabe-06fa09706ffb</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 07 Sep 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[Validating PostgreSQL results & inferring query static types]]></title><description><![CDATA[Learn how to use Zod and Slonik to add runtime validation to PostgreSQL queries while inferring static types, preventing database drift issues and catching schema mismatches before they cause problems.]]></description><link>https://gajus.com/blog/validating-postgresql-results-inferring-query-static-types</link><guid isPermaLink="false">https://gajus.com/blog/fcb70035-a331-4b63-adda-716bda16bb42</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 05 Aug 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[What makes a good commit]]></title><description><![CDATA[Learn how to create atomic commits that make code reviews easier, enable safe reverts, and demonstrate good engineering practices through proper interactive staging and thoughtful git workflow.]]></description><link>https://gajus.com/blog/what-makes-a-good-commit</link><guid isPermaLink="false">https://gajus.com/blog/c4eff82b-feac-4034-93ed-c3e43ce835cd</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate></item><item><title><![CDATA[CTO vs Head of Engineering]]></title><description><![CDATA[Understanding the difference between CTO and Head of Engineering roles at a growing startup, including when to split these responsibilities and how they complement each other.]]></description><link>https://gajus.com/blog/cto-vs-head-of-engineer</link><guid isPermaLink="false">https://gajus.com/blog/05bc7a80-7dfe-4eab-9538-e846cf863471</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 10 Aug 2021 00:00:00 GMT</pubDate></item><item><title><![CDATA[Redesigning Remote Team Culture]]></title><description><![CDATA[As the world becomes "virtual first", businesses need to step up their company culture game beyond motivational posters in the office. Learn the 5 pillars of success for maintaining vibrant remote team culture.]]></description><link>https://gajus.com/blog/redesigning-remote-team-culture</link><guid isPermaLink="false">https://gajus.com/blog/aea1147e-6cb5-4868-82f6-d872170cc09e</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 26 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[How I got my first Node.js job]]></title><description><![CDATA[A story of shameless persistence to inspire those who are seeking their first job in IT.]]></description><link>https://gajus.com/blog/how-i-got-my-first-nodejs-job</link><guid isPermaLink="false">https://gajus.com/blog/0f255ec9-0fea-4285-afed-02f321843794</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 25 Sep 2020 10:00:00 GMT</pubDate></item><item><title><![CDATA[.gitignore mistake that everyone makes]]></title><description><![CDATA[Learn why .gitignore should be a whitelist, not a blacklist, and how to properly configure it to avoid common mistakes.]]></description><link>https://gajus.com/blog/gitignore-mistake-that-everyone-makes</link><guid isPermaLink="false">https://gajus.com/blog/b37f2084-a292-462a-9b63-870b3c0a2892</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 21 Sep 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Onboarding email with 80% response rate]]></title><description><![CDATA[How to get feedback from early product adopters]]></description><link>https://gajus.com/blog/onboarding-email-with-80-response-rate</link><guid isPermaLink="false">https://gajus.com/blog/08b80aaf-d1b2-4f22-b28c-c11bada0beeb</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 23 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Why Remote Working Is Bad]]></title><description><![CDATA[Tips for when the novelty of remote working wears off]]></description><link>https://gajus.com/blog/why-remote-working-is-bad</link><guid isPermaLink="false">https://gajus.com/blog/26e360f2-9275-4061-b126-e6e1e21d74a8</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 15 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Magic of Engineered Serendipity]]></title><description><![CDATA[What I learned from OnDeck & why you should join it too]]></description><link>https://gajus.com/blog/the-magic-of-engineered-serendipity</link><guid isPermaLink="false">https://gajus.com/blog/740d5684-6080-491a-8654-de446c6cccd2</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 09 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[5 tips for remote job seekers]]></title><description><![CDATA[Tips based on experience evaluating hundreds of remote work job applications daily.]]></description><link>https://gajus.com/blog/5-tips-for-remote-job-seekers</link><guid isPermaLink="false">https://gajus.com/blog/9f137ee5-bfe4-4e54-95ea-e9a0acbb5922</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 05 Jun 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[How to execute effective daily standups using Slack?]]></title><description><![CDATA[A practical guide to running effective daily standups using Slack, focusing on meaningful communication rather than just ticket IDs]]></description><link>https://gajus.com/blog/how-to-execute-effective-daily-standups-using-slack</link><guid isPermaLink="false">https://gajus.com/blog/4da147dd-8468-4704-a9e6-071db4ad8084</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 30 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Solving social isolation]]></title><description><![CDATA[A video chat roulette for distributed teams as a way to stay in touch with each other when working from home]]></description><link>https://gajus.com/blog/solving-social-isolation</link><guid isPermaLink="false">https://gajus.com/blog/ed96a21a-c759-4914-a059-373636341f0a</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 22 Apr 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stack Overflow is leaking user emails]]></title><description><![CDATA[Unsafe use of md5 hashes]]></description><link>https://gajus.com/blog/stack-overflow-is-leaking-user-emails</link><guid isPermaLink="false">https://gajus.com/blog/2595d8a3-1edb-46f1-ad4d-bfdd786f95b6</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 22 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Mocking PostgreSQL queries in Node.js]]></title><description><![CDATA[How to test database interactions without a database using Slonik]]></description><link>https://gajus.com/blog/mocking-postgresql-queries-in-node-js</link><guid isPermaLink="false">https://gajus.com/blog/5487bc9c-a5c5-44f7-9780-376f15f34e63</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 07 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ultimate guide to concurrent logging in Node.js]]></title><description><![CDATA[How to use domains and Roarr to associate context with asynchronous call chains]]></description><link>https://gajus.com/blog/ultimate-guide-to-concurrent-logging-in-node-js</link><guid isPermaLink="false">https://gajus.com/blog/4f561cc7-d0e3-4891-81df-53dc67917559</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 31 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Using HTTP proxy with Puppeteer]]></title><description><![CDATA[I had requirement to evaluate remote JavaScript using Headless Chrome, but requests had to be routed through an internal proxy and different proxies had to be used for different URLs.]]></description><link>https://gajus.com/blog/using-http-proxy-with-puppeteer</link><guid isPermaLink="false">https://gajus.com/blog/3341bb22-2caf-427d-9a25-8db59a4cf631</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 29 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Traveling and working remotely from Japan. 20 oddities]]></title><description><![CDATA[I am traveling and working remotely on my startup from Japan. As I travel, I keep making notes of things that surprise me that I share with my friends and family. In no particular order, below is a summary of 20 oddities.]]></description><link>https://gajus.com/blog/traveling-and-working-remotely-from-japan</link><guid isPermaLink="false">https://gajus.com/blog/fbe5c469-bcc5-41d9-8234-ed66a4de597b</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 27 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[How to terminate a HTTP server in Node.js?]]></title><description><![CDATA[One of the most popular support questions I answer is a variation of "how to terminate a HTTP server" or "why does HTTP server not stop after calling server.close()".]]></description><link>https://gajus.com/blog/how-to-terminate-a-http-server-in-nodejs</link><guid isPermaLink="false">https://gajus.com/blog/2498cc24-e09a-4397-9301-d715a8766ea0</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 19 Jan 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Why IMDb IDs cannot be trusted and why not to use padded IDs]]></title><description><![CDATA[We can all agree that IDs should be unambiguous, i.e. if I told you to fetch a resource "1", I expect to get the same resource every time. I also expect that I can store a reference to that same resource by storing this ID and use that reference to fetch the same resource at a later date.]]></description><link>https://gajus.com/blog/why-imdb-ids-cannot-be-trusted-and-why-not-to-use-padded-ids</link><guid isPermaLink="false">https://gajus.com/blog/0beb0ab9-3503-46a4-8a18-aa97e7c8bba1</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 18 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ensuring healthy Node.js program using watchdog timer]]></title><description><![CDATA[If you have a Node.js program that is designed to pull tasks and process them asynchronously, then you should watch out for hanging processes.]]></description><link>https://gajus.com/blog/ensuring-healthy-nodejs-program-using-watchdog-timer</link><guid isPermaLink="false">https://gajus.com/blog/f4582aaa-c264-4f93-be06-24c3bc9983ee</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 09 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[A declarative way to cache PostgreSQL queries using Node.js]]></title><description><![CDATA[There can be many reasons to make you want to cache SQL queries. Some of them are valid, e.g. reducing the number of round-trips (esp. when dealing with high-latency). Others might be micro-optimizations that are just not worth it. Regardless of your reasons for wanting to cache SQL queries, implementing them can be cumbersome.]]></description><link>https://gajus.com/blog/declarative-way-to-cache-postgresql-queries-using-nodejs</link><guid isPermaLink="false">https://gajus.com/blog/6e34813e-d2cf-4eaf-9fe3-944c3d886fd5</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 02 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Handling unhandled promise rejections in async functions]]></title><description><![CDATA[Understanding and solving unhandled promise rejections in asynchronous JavaScript code]]></description><link>https://gajus.com/blog/handling-unhandled-promise-rejections</link><guid isPermaLink="false">https://gajus.com/blog/f0fe1bc2-c0b5-47aa-b4d7-ef77377e7bec</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 02 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Detecting a promise that will never resolve/ reject]]></title><description><![CDATA[Exploring how to detect promises that will never resolve or reject using Node.js async_hooks to monitor asynchronous activity]]></description><link>https://gajus.com/blog/detecting-a-promise-that-will-never-resolve-reject</link><guid isPermaLink="false">https://gajus.com/blog/e35e64fa-3816-4db5-ae20-9d0f93639328</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 01 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stop using package-lock.json or yarn.lock]]></title><description><![CDATA[Why dependency lock files are not designed to be used by packages that are themselves dependencies of other packages]]></description><link>https://gajus.com/blog/stop-using-package-lock-json-or-yarn-lock</link><guid isPermaLink="false">https://gajus.com/blog/81ec7e7f-f53c-44aa-a847-b0d8d72a43f9</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 26 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Mistake that cost thousands (Kubernetes, GKE)]]></title><description><![CDATA[Lessons learned scaling Kubernetes cluster on Google Kubernetes Engine, exploring resource allocation strategies and cost optimization]]></description><link>https://gajus.com/blog/mistake-that-cost-thousands-kubernetes-gke</link><guid isPermaLink="false">https://gajus.com/blog/a6269c81-c578-4e42-a571-2a6337a7aa3e</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 11 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[My favorite CSS hack]]></title><description><![CDATA[A simple CSS snippet for visualizing HTML layout by applying colored backgrounds to elements at different depths.]]></description><link>https://gajus.com/blog/my-favorite-css-hack</link><guid isPermaLink="false">https://gajus.com/blog/1a84bac9-7843-4c17-9b01-22c7b4c7fd2a</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 04 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Dynamically generating SQL queries using Node.js]]></title><description><![CDATA[Real-world examples of safely generating dynamic SQL queries using Slonik PostgreSQL client, covering value bindings, dynamic columns, WHERE clauses, and nested queries while preventing SQL injection.]]></description><link>https://gajus.com/blog/dynamically-generating-sql-queries-using-nodejs</link><guid isPermaLink="false">https://gajus.com/blog/f1f41847-08d1-4f9b-89e6-4755125cc043</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 30 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Logging in Browser]]></title><description><![CDATA[Using a structured logger in your frontend project]]></description><link>https://gajus.com/blog/logging-in-browser</link><guid isPermaLink="false">https://gajus.com/blog/7dead3cc-003b-419b-9179-2b2150bff7a9</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 14 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Warming cache]]></title><description><![CDATA[When cache is slower than one query]]></description><link>https://gajus.com/blog/warming-cache</link><guid isPermaLink="false">https://gajus.com/blog/053e1355-1dd0-48b0-b00d-cf4d667f6533</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 09 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Capturing stdout/ stderr in Node.js using Domain module]]></title><description><![CDATA[Learn how to capture stdout and stderr output from concurrent asynchronous operations in Node.js using the domain module to maintain execution context.]]></description><link>https://gajus.com/blog/capturing-stdout-stderr-in-node-js-using-domain-module</link><guid isPermaLink="false">https://gajus.com/blog/7b66db12-39f7-4d28-9086-c6a43c940d92</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 03 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stop using Knex.js]]></title><description><![CDATA[Using SQL query builder is an anti-pattern. Learn why raw SQL with proper clients like Slonik provides better maintainability, security, and developer experience.]]></description><link>https://gajus.com/blog/stop-using-knex-js</link><guid isPermaLink="false">https://gajus.com/blog/c7c294fa-bd42-44cc-a1af-49b7d20b5cab</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 12 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Processing large volumes of data safely and fast using Node.js and PostgreSQL]]></title><description><![CDATA[About designing a PostgreSQL client for Node.js - learn how Slonik protects against SQL injections, unsafe connection handling, and provides type safety for processing large datasets.]]></description><link>https://gajus.com/blog/processing-large-volumes-of-data-safely-and-fast-using-nodejs-and-postgresql</link><guid isPermaLink="false">https://gajus.com/blog/c5b520ee-8139-4d93-9859-57818ae63d3d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 11 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Lessons learned scaling PostgreSQL database to 1.2bn records/month]]></title><description><![CDATA[Choosing where to host the database, materialising data and using database as a job queue - lessons from scaling PostgreSQL to handle 1.2 billion records per month.]]></description><link>https://gajus.com/blog/lessons-learned-scaling-postgresql-database-to-1-2bn-records-month</link><guid isPermaLink="false">https://gajus.com/blog/3980737c-2a6c-4ac8-865e-be453282c208</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 28 Jan 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[The case for Array#replace()]]></title><description><![CDATA[Overriding an array without intermediate variables]]></description><link>https://gajus.com/blog/the-case-for-array-replace</link><guid isPermaLink="false">https://gajus.com/blog/8b76a991-9079-4655-a0b5-b7ac04605762</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 06 Jul 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Ensuring good service health by automating thorough integration testing and alerting]]></title><description><![CDATA[Palantir automates service health checks and communication with developers - learn how to be the first to know when things break and automate communication with responsible developers.]]></description><link>https://gajus.com/blog/automating-persistent-integration-testing-and-alerting</link><guid isPermaLink="false">https://gajus.com/blog/574bb818-4dca-40f0-aa60-d23981999f2d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 22 Jun 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[I've accessed my email inbox that I have not used for 7 years & found 15,559 emails]]></title><description><![CDATA[My account has seen a lot of emails over that time]]></description><link>https://gajus.com/blog/ive-accessed-my-email-inbox-that-i-have-not-used-for-7-years-and-found-15559-emails</link><guid isPermaLink="false">https://gajus.com/blog/8ea8341a-acb1-4902-811a-d00c22683672</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 25 May 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Do not protect your website from scraping (part 1, technology barriers)]]></title><description><![CDATA[Resistance is futile]]></description><link>https://gajus.com/blog/do-not-protect-your-website-from-scraping-part-1-technology-barriers</link><guid isPermaLink="false">https://gajus.com/blog/7a1961dd-5611-45b0-a9c3-fc352f0e2fa8</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 09 Apr 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Compressing GraphQL response]]></title><description><![CDATA[Using basic principles of compression to reduce the response size]]></description><link>https://gajus.com/blog/compressing-graphql-response</link><guid isPermaLink="false">https://gajus.com/blog/949f605a-2021-4a2e-94d1-bba4e5f49179</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 14 Feb 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[Applaudience ❤ GO2CINEMA]]></title><description><![CDATA[Announcing GO2CINEMA, a cinema ticket discovery service that helps people find the cheapest cinema tickets, largest auditoriums, and most comfortable seats across UK and Ireland.]]></description><link>https://gajus.com/blog/applaudience-go2cinema</link><guid isPermaLink="false">https://gajus.com/blog/c805c6f5-6ed7-4c93-98ed-842ad61b7b69</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 03 Dec 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[I reduced GraphQL codebase size by 40% and increased type coverage to 90%+]]></title><description><![CDATA[Using code generation to create data loaders for all database resources]]></description><link>https://gajus.com/blog/i-reduced-graphql-codebase-size-by-40-and-increased-type-coverage-to-90</link><guid isPermaLink="false">https://gajus.com/blog/1a50cae9-0d00-409b-98a9-ad9875cb68bb</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 15 Nov 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Using DataLoader to batch requests]]></title><description><![CDATA[Learn how Facebook's DataLoader utility solves the N+1 problem in GraphQL by batching requests and improving performance. This thing is pure pony magic genius.]]></description><link>https://gajus.com/blog/using-dataloader-to-batch-requests</link><guid isPermaLink="false">https://gajus.com/blog/31db5032-bd0f-409d-9362-e549c631a7ed</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 15 Nov 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[I have been doing web app error tracking and debugging wrong all these years]]></title><description><![CDATA[Learn how to protect source maps and improve web app debugging experience in production using Sentry.io. Discover how to secure source maps, integrate with React and Redux, and leverage breadcrumbs for better error tracking.]]></description><link>https://gajus.com/blog/web-app-error-tracking</link><guid isPermaLink="false">https://gajus.com/blog/9c9e0e45-e488-4302-b058-0c7c08555043</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 31 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Using flow-runtime to enforce strict type constraints at runtime]]></title><description><![CDATA[Learn how flow-runtime enables runtime type checking for Flow annotations, catching API contract violations and data inconsistencies that compilation-time checking misses. A must-use tool for applications consuming third-party data.]]></description><link>https://gajus.com/blog/flow-runtime</link><guid isPermaLink="false">https://gajus.com/blog/f0e9e1be-a889-4c41-aa42-4c6690adbb05</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 27 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Roarr! the perfect JSON logger for Node.js and browser]]></title><description><![CDATA[Zero-configuration, out of process transports and adheres to the Twelve Factors]]></description><link>https://gajus.com/blog/roarr-the-perfect-json-logger</link><guid isPermaLink="false">https://gajus.com/blog/287d116b-1d1b-46dc-af85-ec84cbebab32</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 02 Oct 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Twitter effect]]></title><description><![CDATA[How micro-blogging word of mouth on Twitter influences movie success and consumer decisions. Research shows negative tweets can make or break a film's opening weekend.]]></description><link>https://gajus.com/blog/the-twitter-effect</link><guid isPermaLink="false">https://gajus.com/blog/9e67a30b-9a4e-4118-beb8-392618a43bfa</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 30 Sep 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Do file sharing and piracy "eat at the roots" of the cinema industry?]]></title><description><![CDATA[Research shows file sharing causes $90M revenue loss for cinema but banning it would create $640M dead weight loss. Analysis of piracy effects on box office and consumer welfare.]]></description><link>https://gajus.com/blog/file-sharing-and-piracy-cinema-industry</link><guid isPermaLink="false">https://gajus.com/blog/c71f6c1c-a128-4373-ab45-dd5fb06e2d45</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 09 Sep 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Do file sharing and piracy "eat at the roots" of the cinema industry?]]></title><description><![CDATA[Research findings on the impact of file sharing on movie box office revenue and consumer welfare]]></description><link>https://gajus.com/blog/do-file-sharing-and-piracy-eat-at-the-roots</link><guid isPermaLink="false">https://gajus.com/blog/3813c63d-c61d-47c4-9570-a897eec98969</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 08 Sep 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Hacking Medium to create a self-hosted blogging platform]]></title><description><![CDATA[A free-rider's guide to using Medium editor to create content for hosting on a personal website]]></description><link>https://gajus.com/blog/hacking-medium-self-hosted-blogging</link><guid isPermaLink="false">https://gajus.com/blog/0d863327-0b04-4bda-855f-808d3a093296</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 05 Sep 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Using React v16 to create self-destructing components]]></title><description><![CDATA[react-aux is one of those tiny things that make development helluva simpler]]></description><link>https://gajus.com/blog/react-v16-self-destructing-components</link><guid isPermaLink="false">https://gajus.com/blog/f3e6076d-e911-4916-8522-62697fd777c4</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 20 Aug 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[The biggest UX mistake in e-commerce: discount code input on the checkout page]]></title><description><![CDATA[Increasing the conversion rate by removing the unnecessary friction from the purchase flow]]></description><link>https://gajus.com/blog/biggest-ux-mistake-ecommerce-discount-code</link><guid isPermaLink="false">https://gajus.com/blog/a2b826d2-b48f-415a-bbc9-9ef75cba93cf</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 07 Aug 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Filming sites of the IMDb top 1000 movies]]></title><description><![CDATA[Interactive map showing where famous movies were filmed in London]]></description><link>https://gajus.com/blog/london-filming-sites-imdb-top-1000</link><guid isPermaLink="false">https://gajus.com/blog/518782a0-f70e-4568-87dd-385b6d3164c5</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 29 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Replacing coordinates with MGRS]]></title><description><![CDATA[Alternative geolocation resource identifier for link building and cache strategy]]></description><link>https://gajus.com/blog/replacing-coordinates-with-mgrs</link><guid isPermaLink="false">https://gajus.com/blog/d37b332a-37ca-4bf6-aab3-cbb419389e00</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Tue, 11 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Pre-rendering SPA for SEO and improved perceived page loading speed]]></title><description><![CDATA[Putting your Single Page Application to the top of the Google search result page (SERP)]]></description><link>https://gajus.com/blog/pre-rendering-spa-for-seo-and-improved-perceived-page-loading-speed</link><guid isPermaLink="false">https://gajus.com/blog/0dc1332c-fc1c-472e-a2ad-128515f0af7f</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 08 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Making the anchor links work in SPA applications]]></title><description><![CDATA[A solution for react-router and other history based routing #hash navigation]]></description><link>https://gajus.com/blog/making-anchor-links-work-spa</link><guid isPermaLink="false">https://gajus.com/blog/b2b05022-e59d-4b89-9492-ad1c34164c3b</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 05 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[React application seen as a blank page via "Fetch as Google"]]></title><description><![CDATA[Ensuring that SPA application is correctly indexed by the search engines]]></description><link>https://gajus.com/blog/react-application-seen-as-a-blank-page-via-fetch-as-google</link><guid isPermaLink="false">https://gajus.com/blog/1b534f21-ad78-48a4-9b2f-32183b04654c</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 01 Jul 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Distributing a self-replicating malicious code using NPM]]></title><description><![CDATA[Security risks that come with highly automated systems]]></description><link>https://gajus.com/blog/distributing-a-self-replicating-malicious-code-using-npm</link><guid isPermaLink="false">https://gajus.com/blog/8252faa9-267f-45ca-9a25-5acb4874fd9a</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 12 May 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stop using CSS in JavaScript for web development]]></title><description><![CDATA[9 fairy tales about styled-components and why CSS is still the right tool for the job]]></description><link>https://gajus.com/blog/stop-using-css-in-javascript-for-web-development</link><guid isPermaLink="false">https://gajus.com/blog/53425c7f-28f7-49b8-97f1-966462f26b01</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 27 Apr 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Protecting APIs from the DDoS attacks by signing the resource identifiers]]></title><description><![CDATA[Lessons I have learned from working on one of the most visited websites on the planet Earth]]></description><link>https://gajus.com/blog/protecting-apis-from-ddos-attacks-by-signing-resource-identifiers</link><guid isPermaLink="false">https://gajus.com/blog/bbb02c38-27e9-4312-ab8b-63df5d1fb316</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 02 Feb 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[The wheels of open-source]]></title><description><![CDATA[we've got many of them]]></description><link>https://gajus.com/blog/the-wheels-of-open-source</link><guid isPermaLink="false">https://gajus.com/blog/2cb0d8cc-ef97-49ef-8202-aa8883fe18f1</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Thu, 26 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Making docker-in-docker builds x2 faster using Docker "cache-from" option]]></title><description><![CDATA[There are many reasons for not using docker-in-docker (DIND) in a CI setup. The biggest reason against using DIND in CI is: you cannot use images from the host machine.]]></description><link>https://gajus.com/blog/making-docker-in-docker-builds-x2-faster</link><guid isPermaLink="false">https://gajus.com/blog/49ba9b1f-a115-41df-8bdb-70bd02a22358</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 25 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Parsing absolutely anything in JavaScript using Earley algorithm]]></title><description><![CDATA[Let me start by saying — I was surprised how easy it was to write grammar for an Earley parser. I have been using regular expressions for over a decade, but familiarising with parsing algorithms changed this attitude forever.]]></description><link>https://gajus.com/blog/parsing-absolutely-anything-in-javascript</link><guid isPermaLink="false">https://gajus.com/blog/05097a31-9399-41e1-8571-ab95f7ee63d3</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 20 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Developing isomorphic applications using webpack]]></title><description><![CDATA[tl;dr; I have set out to develop a program that enables rendering of any client-side code base server-side using webpack. The end result is https://github.com/gajus/isomorphic-webpack]]></description><link>https://gajus.com/blog/developing-isomorphic-applications-using-webpack</link><guid isPermaLink="false">https://gajus.com/blog/62307159-92e7-486c-b6fa-4675cfa9fca7</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 09 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[The missing CI/CD Kubernetes component: Helm package manager]]></title><description><![CDATA[An introduction to Helm, the Kubernetes package manager, and how it simplifies application deployment and management in Kubernetes clusters.]]></description><link>https://gajus.com/blog/helm-kubernetes</link><guid isPermaLink="false">https://gajus.com/blog/5e523596-b994-4e82-b626-328bb7db1907</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 08 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[I am calling for better Git GUI client change staging support]]></title><description><![CDATA[A call for improved Git GUI clients with better support for staging partial changes, discussing the limitations of current tools and what developers need.]]></description><link>https://gajus.com/blog/git-gui-staging</link><guid isPermaLink="false">https://gajus.com/blog/3b59667a-0015-49f3-bdcd-f04ff2145915</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 06 Jan 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[Don't use Babel transpilers when debugging an application]]></title><description><![CDATA[Why using Babel transpilers during debugging can make troubleshooting more difficult, and strategies for debugging without transpilation.]]></description><link>https://gajus.com/blog/babel-debugging</link><guid isPermaLink="false">https://gajus.com/blog/f6afc5ca-10a8-4bda-9265-45a33ae6e6d2</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 30 Dec 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Don't use Babel transpilers when debugging an application]]></title><description><![CDATA[A practical tip about avoiding Babel transpilers during development to improve debugging experience through better source maps, breakpoints, and faster execution.]]></description><link>https://gajus.com/blog/dont-use-babel-transpilers-when-debugging-an-application</link><guid isPermaLink="false">https://gajus.com/blog/73099f0a-b08c-49d2-a309-5761ab9fd803</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 09 Dec 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Using DataLoader to batch queries]]></title><description><![CDATA[Facebook DataLoader is a generic utility to be used as part of your application data fetching layer to provide a simplified and consistent API over various remote data sources such as databases or web services via batching and caching.]]></description><link>https://gajus.com/blog/using-dataloader-to-batch-requests</link><guid isPermaLink="false">https://gajus.com/blog/018b1756-4d3f-7536-ba7a-1cee929e6404</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Fri, 19 Aug 2016 14:59:43 GMT</pubDate></item><item><title><![CDATA[Using MySQL in Node.js]]></title><description><![CDATA[Best practices for using MySQL with Node.js, covering connection pooling, promisification with Bluebird, async/await patterns, named placeholders, query construction, and debugging techniques.]]></description><link>https://gajus.com/blog/using-mysql-in-node-js</link><guid isPermaLink="false">https://gajus.com/blog/b090e8ce-cc0c-4086-93bc-a0ca91c16136</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 18:48:33 GMT</pubDate></item><item><title><![CDATA[Behaviour Driven Development with JavaScript]]></title><description><![CDATA[Comprehensive guide exploring BDD principles and practical applications in JavaScript development, covering test doubles, spec patterns, and outside-in development approaches.]]></description><link>https://gajus.com/blog/behaviour-driven-development-with-javascript</link><guid isPermaLink="false">https://gajus.com/blog/7f9df061-a9d2-4984-9496-6c846194a94d</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 17:39:20 GMT</pubDate></item><item><title><![CDATA[MySQL SINSERT]]></title><description><![CDATA[A pattern for handling UPSERT operations in MySQL when working with external unique identifiers, exploring SELECT-INSERT-UPDATE workflows and nullable metadata columns.]]></description><link>https://gajus.com/blog/mysql-sinsert</link><guid isPermaLink="false">https://gajus.com/blog/b9801460-6131-4058-8d08-7a2018c77580</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 17:39:20 GMT</pubDate></item><item><title><![CDATA[Pro AngularJS]]></title><description><![CDATA[Comprehensive guide to AngularJS (1.3) components and architecture, covering MVC patterns, directives, templates, dependency injection, and community conventions for building single-page applications.]]></description><link>https://gajus.com/blog/pro-angularjs</link><guid isPermaLink="false">https://gajus.com/blog/4dda961d-f9d6-415e-98b8-9e12c5f909af</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 17:39:20 GMT</pubDate></item><item><title><![CDATA[The Definitive Guide to the ES7 Async Functions]]></title><description><![CDATA[Comprehensive guide to ES7 async/await syntax, exploring how it compares to ES6 Promises, error handling patterns, testing strategies, and practical examples of asynchronous JavaScript code.]]></description><link>https://gajus.com/blog/the-definitive-guide-to-the-es7-async-functions</link><guid isPermaLink="false">https://gajus.com/blog/01737a95-f1ff-48fc-8f7f-24eb400bd8e1</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 17:39:20 GMT</pubDate></item><item><title><![CDATA[The Definitive Guide to the JavaScript Generators]]></title><description><![CDATA[Comprehensive guide to ES6 generators, exploring execution flow, yield delegation, error handling, and practical applications for simplifying asynchronous code with iterator-based control flow.]]></description><link>https://gajus.com/blog/the-definitive-guide-to-the-javascript-generators</link><guid isPermaLink="false">https://gajus.com/blog/a02517b0-7b7e-4990-a51f-99b66f6e184f</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sun, 24 Apr 2016 17:39:20 GMT</pubDate></item><item><title><![CDATA[Harder, Better, Faster, Stronger: Lo-Dash v3]]></title><description><![CDATA[Comprehensive overview of Lo-Dash version 3.0.0, exploring performance improvements, lazy evaluation, shortcut fusion, and 47 new methods added to the utility library.]]></description><link>https://gajus.com/blog/harder-better-faster-stronger-lodash-v3</link><guid isPermaLink="false">https://gajus.com/blog/16228d5b-6667-4db6-a0e6-3faef7d8d89e</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Mon, 26 Jan 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[The Definitive Guide to the JavaScript Generators]]></title><description><![CDATA[Understanding the execution order and use cases of the ES6 generators.]]></description><link>https://gajus.com/blog/the-definitive-guide-to-the-javascript-generators</link><guid isPermaLink="false">https://gajus.com/blog/018b1761-1d53-7f9d-a147-9f1e8d4f3b3c</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Sat, 04 Oct 2014 10:58:48 GMT</pubDate></item><item><title><![CDATA[Behaviour Driven Development with Javascript]]></title><description><![CDATA[Spec/Error driven coding. Using baby-steps to achieve a "tight feedback-loop".]]></description><link>https://gajus.com/blog/behaviour-driven-development-with-javascript</link><guid isPermaLink="false">https://gajus.com/blog/018b175b-90ef-7888-b54e-ccb9c43a2dfe</guid><dc:creator><![CDATA[Gajus Kuizinas]]></dc:creator><pubDate>Wed, 24 Sep 2014 14:37:34 GMT</pubDate></item></channel></rss>