Home
Books & Courses
All articles
About
AWS
My take on "How AWS needs to change"
CloudTrail's horrible developer experience
AWS management account starter pack
CloudFormation's ZipFile still does not support ESM imports
Fun fact: you can make an unsubscribable subscription to an SNS topic
How to auto-disable leaked IAM credentials
The slow evolution of AppSync RDS support
How Cognito User Pools work
How to use tagged templates in AppSync to send queries to RDS
DynamoDB basic operations
How to use CloudFront signed cookies to serve MPD or HLS videos
How to remove a resource before creating it with the CDK
The problems with implicit AWS resources
Stable S3 signed URLs
The effects of not maintaining consistency with DynamoDB
How to securely generate and store IAM Secret Access Keys with Terraform
How to return a static file with a CloudFront function
How to use KMS keys with CloudFront signed URLs
How to use CloudFront signed URLs
CloudFront function to remove part of the request path
Announcing: S3 and CloudFront Signed URLs first public release
How to use the AWS Lambda streaming response type
How to generate keys for CloudFront URL signing with Terraform
Terraform module to generate secret values and store in SSM Parameter Store
CloudFront function to support HTML5 History API
How to provide information about the backend environment to frontend clients
Let's build a simple MQTT echo on AWS IoT Core
Announcing: Building GraphQL APIs with AWS AppSync book finished
How to detect device connection and disconnection in AWS IoT Core
How to serve files from an AppSync API using S3 signed URLs
TLS certificates in IoT Core
How to implement file uploads to an AppSync API
Efficient multi-level pagination in GraphQL
First experiences with the new AppSync Javascript resolver runtime
How to use Topic Rules to react to MQTT messages in AWS IoT Core
How to generate IoT Core certificates with Terraform
Basic AWS IoT Core policy example and breakdown
How to connect to AWS IoT Core with MQTT.js
How to manage IoT Core resources with Terraform
The basic building blocks of AWS IoT Core
SNS to AppSync subscription
Getting started with the AWS JS SDK v3 included in the Node runtime
How to use AppSync enhanced subscription filtering
How to use SSM Parameter Store for sensitive inputs in Terraform
How to escape inputs in AppSync resolvers
What is the identity in the AppSync resolver context
How to invoke a mutation with AppSync's HTTP data source
How to migrate to CloudFront Origin Access Control from Origin Access Identity
How to interact with IoT Core shadows from AppSync
How to read values from SSM Parameter Store and Secrets Manager with AppSync HTTP data source
How to send notifications to SNS, SQS, and EventBridge from AppSync
Modeling common GraphQL patterns in DynamoDB
How to call API Gateway from AppSync with IAM authorization
How to call a protected external API using AppSync HTTP data source
Use the HTTP data source to interact with HTTP APIs directly from AppSync
How to use RDS as a Data Source for AppSync
Efficient filtering in DynamoDB
The surprising properties of DynamoDB pagination
How to run SQL scripts against the RDS Data API with Terraform
How to remove the RDS master user password from the Terraform state
How to set up Amazon RDS password rotation with Terraform
How to add a custom domain to an AppSync API
How to implement rate limiting for an AppSync API
How to use Lambda authorization with AppSync
How to configure Auth0 with AWS AppSync
Real-time data with AppSync subscriptions
Send notifications to a Telegram bot for events in an AWS account
Error handling in AppSync
Deploy a serverless Telegram bot to AWS using Terraform
How to use ES6 modules and top-level await in AWS Lambda
How to delay calling a Lambda function using Step Functions
How to implement access control in a GraphQL API
How to periodically call a Lambda function
How to use Cognito with AppSync
AppSync Cognito directives
Pipeline resolvers in AppSync
How to use DynamoDB with AppSync
How to use Lambda resolvers with AppSync
Anatomy of an AppSync resolver
How to maintain database consistency in DynamoDB
What are Resolvers in AppSync and how they work
Foreign key constraints in DynamoDB
AWS AppSync: Getting started
What is AWS AppSync
CloudFront cache problems and how to solve them
How to configure CloudFront for the HTML5 history API
How token revocation works in Cognito
How to use the refresh token with Cognito
How to secure the Cognito login flow with a state nonce and PKCE
AWS security case study: Vulnerable roles
How to add Cognito login to a website
AWS security case study: Unprotected logs
AWS security case study: Hardcoded credentials
Lambda development toolbox: Set environment variables locally
How authentication and authorization work in AWS
Lambda development toolbox: CLI logs watcher
Introducing: AWS IAM masterclass video course
How to use CloudFront Functions to change the origin request path
9 tips for working with AWS IAM
How to use CloudFront Trusted Key Groups parameter and the trusted_key_group Terraform resource
AWS architecture icons in an npm package
How serverless cold starts change best practices
How to keep accurate counts in DynamoDB
AWS JS SDK v3 first impressions
How to fix the profile support in the AWS JS SDK v3
How to use cfn-init to set up EC2 instances with CloudFormation
EC2 VPC building blocks
How to properly implement unique constraints in DynamoDB
How to clear a DynamoDB table
How to use DynamoDB batch write with retrying and exponential backoff
My AWS wishlist
Encryption options for S3 objects
How to cache ssm.getParameter calls in a Lambda function
How to handle timeouts in Lambda functions
Use-cases for IAM roles
How to use OpenAPI with API Gateway REST APIs
AWS IAM deep dive: How roles work
How to use OpenAPI to deploy an API Gateway HTTP API
How to implement a Lambda backend based on OpenAPI
Interactive API documentation using Swagger UI deployed with Terraform
How to use a break-glass role for sensitive admin tasks
IAM policy evaluation logic explained with examples
AWS IAM deep dive: How the policy evaluation logic works
AWS IAM deep dive: How IAM users and groups work
Granularity levels in AWS IAM policies
The AWS account administrator's guide to MFA
How to manage IAM user passwords
How to use a custom domain with CloudFront and Route53
How to use a custom domain on CloudFront with Cloudflare-managed DNS
AWS IAM deep dive: Identity-based, and Resource-based policies
How to completely lock down an AWS account with a service control policy (SCP)
The consequences of memory allocation size for a Lambda function
Are S3 signed URLs secure?
How to use the aws_apigatewayv2_api to add an HTTP API to a Lambda function
Avoid excessive costs and save money with S3 storage classes
Easily run CLI commands as an AWS role with AWSudo
Comparing async Javascript functions and callbacks on AWS Lambda
Automatically schedule emails on MailChimp with RSS and AWS Lambda
How to manage Lambda log groups with Terraform
How to solve CORS problems when redirecting to S3 signed URLs
How to deploy a single-page application with Terraform
How to target subscribers in an SNS topic
How CloudFront solves CORS problems
How to setup CORS for Lambda Proxy integration
Seamless S3 encryption does not imply better security
Encryption in the cloud
How to reproduce a Lambda function's environment variables locally
How to define Lambda code with Terraform
How to use Lambda@Edge with Terraform
How to use API Gateway with CloudFront
How to route to multiple origins with CloudFront
AWS Config notifications with CloudWatch Events
How to use unique resource names with Terraform
How to use the AWS SQS CLI to receive messages
How to paginate the AWS JS SDK using async generators
How to clean up Lambda logs
Differences between PUT and POST S3 signed URLs
How to use S3 POST signed URLs
How to use S3 PUT signed URLs
Limit permissions with roles for signed URLs
How to get near-realtime logs for a Terraform-managed Lambda function
Cacheable S3 signed URLs
Why AWS access and secret keys should not be in the codebase
Why a multi-account setup is essential for secure systems
CloudFormation CLI workflows
How to check if your Reserved Instances are used
How Service Control Policies help to secure AWS accounts
AWS: How to query the available CPU credits for t2/t3 instances
AWS: How to limit Lambda and API Gateway scalability
AWS: Increase instance security by allowing SSH only from your IP
AWS: How to get notified on compromised credentials
Optimized SPA deployment CloudFormation template
Keep costs under control when using t3 instances
AWS: How to secure access keys with MFA
Managing EC2 servers at scale: Ansible and RunCommand
AWS: How to get notified on IAM user logins
AWS: How to get notified on root account login
The rocky path to delete an AWS Organizations member account
How to use the PhysicalResourceId for CloudFormation Custom Resources
Custom resources in CloudFormation templates: Lessons learned
How to manage S3 Objects in CloudFormation templates
How to manage custom CloudFormation resources with Lambda
The anatomy of a CloudFormation template with a simple Lambda function
Customizable monitoring script on AWS Lambda
How to secure different types of CloudFront origins
How Origin Access Identity works
The differences between S3 and CloudFront signed URLs
How to use S3 signed URLs with CloudFront
How CloudFront signed URLs work
How S3 Signed URLs work
Historical monitoring on AWS
Javascript
Hard-to-debug unhandled rejection cases
Intro to PureScript for TypeScript developers
How to generate an HTTPS certificate with node-forge
How to sign, verify, and encrypt JWTs in Node
Introducing: Async/await in Javascript video course
Do not use fs sync methods in Javascript, use fs.promises instead
How to avoid uncaught async errors in Javascript
Getting started with the Jest Javascript testing framework
What is the await statement in Javascript
3 genius visual data extraction attacks in Javascript
How to implement a persistent file-based cache in Node.Js
The async lazy initializer pattern in Javascript
How to write a Webpack loader
How to convert between callbacks and Promises in Javascript
How to speed up Puppeteer scraping with parallelization
How to implement an exponential backoff retry strategy in Javascript
RxJS: How to make an ordered mergeMap operator
RxJS: How to use startWith with pairwise
RxJS: The differences between first(), take(1), and single()
What is the async disposer pattern in Javascript
How to cache ssm.getParameter calls in a Lambda function
How to serialize calls to an async function
How to handle timeouts in Lambda functions
How to add timeout to a Promise in Javascript
How to use async/await with postMessage
How to use async functions with gapi, the Google Drive client, and the file picker
Tips to debug NodeJS inside Docker
How to refactor a Promise chain to async functions
Secure tempfiles in NodeJS without dependencies
How to use async functions with Array.some and every in Javascript
How to use async functions with Array.filter in Javascript
How to use async functions with Array.forEach in Javascript
How to use async functions with Array.map in Javascript
How to use async functions with Array.reduce in Javascript
Asynchronous array functions in Javascript
How to lazy load and initialize elements using an Intersection Observer
How to integrate PlantUML into other software
Adding continuous rendering to the PlantUML server
How to paginate the AWS JS SDK using async generators
How to clean up Lambda logs
Why AWS access and secret keys should not be in the codebase
How S3 Signed URLs work
Best practices on how to work with collections in Javascript
What to expect when you decide to migrate from Javascript to Typescript
Introducing: Array#Extras email course
Reuse code with domain-specific steps in collection pipelines
The silver bullet of collection pipelines: Functional composition
Demystifying chaining in Javascript
Where Array#Extras fall short
Ditch for loops. Here is a case study to convince you
Better collection processing with collection pipelines
2 cases where Babel fixes your code but it shouldn't
Generators and ImmutableJS
Generators in Javascript
Iterables in Javascript
Iterators in Javascript
Introducing: Weekly JS Tips & Tricks
Parallel Processing in JS
Simulating movement with ES6 generators
Infinite collections with ES6 generators
More readable Javascript without variables
Proper random numbers in Javascript
Dealing with async in React
The first steps from Grunt to Webpack
Custom CSS animations in React
Global listener patterns in React
React basics
Isolating scripts on a page
Historical monitoring on AWS
Accessing Google Drive in Javascript
Using Google auth in Javascript
Running LP optimisation from Javascript
AppSync
GraphQL tip: Only make fields required if they are present for all users
GraphQL tip: Have the subscription types contain all filterable fields on the top-level.
GraphQL non-nullable fields can lead to cascading null errors.
Apollo's subscribeToMore is the wrong abstraction
The slow evolution of AppSync RDS support
How to use tagged templates in AppSync to send queries to RDS
Announcing: Building GraphQL APIs with AWS AppSync book finished
How to serve files from an AppSync API using S3 signed URLs
How to implement file uploads to an AppSync API
Efficient multi-level pagination in GraphQL
First experiences with the new AppSync Javascript resolver runtime
SNS to AppSync subscription
How to use AppSync enhanced subscription filtering
How to resolve interfaces and union types in AppSync
How to escape inputs in AppSync resolvers
What is the identity in the AppSync resolver context
How to invoke a mutation with AppSync's HTTP data source
How to interact with IoT Core shadows from AppSync
How to read values from SSM Parameter Store and Secrets Manager with AppSync HTTP data source
How to send notifications to SNS, SQS, and EventBridge from AppSync
Modeling common GraphQL patterns in DynamoDB
How to call API Gateway from AppSync with IAM authorization
How to call a protected external API using AppSync HTTP data source
Use the HTTP data source to interact with HTTP APIs directly from AppSync
How to use RDS as a Data Source for AppSync
How to resolve complex types with AppSync resolvers
How IAM permissions work with AppSync
How to add a custom domain to an AppSync API
How to implement rate limiting for an AppSync API
How to use Lambda authorization with AppSync
How to configure Auth0 with AWS AppSync
Real-time data with AppSync subscriptions
Error handling in AppSync
How to implement access control in a GraphQL API
How to use Cognito with AppSync
AppSync Cognito directives
Pipeline resolvers in AppSync
How to use DynamoDB with AppSync
How to use Lambda resolvers with AppSync
Anatomy of an AppSync resolver
What are Resolvers in AppSync and how they work
AWS AppSync: Getting started
What is AWS AppSync
Security
AWS management account starter pack
How to auto-disable leaked IAM credentials
Fooled by encryption
How TOTP works
How to hash passwords and when not to
How to secure the Cognito login flow with a state nonce and PKCE
AWS security case study: Vulnerable roles
AWS security case study: Unprotected logs
AWS security case study: Hardcoded credentials
3 genius visual data extraction attacks in Javascript
What is end-to-end encryption and why it's such a confusing term
What is the principle of least privilege and why it's such a hard thing to achieve
How Firefox's HTTPS-only mode solves the first insecure request problem
AWS IAM deep dive: Identity-based, and Resource-based policies
How to completely lock down an AWS account with a service control policy (SCP)
Are S3 signed URLs secure?
What is the optimal password length
How to setup CORS for Lambda Proxy integration
Is Access-Control-Allow-Origin: * insecure?
Seamless S3 encryption does not imply better security
Encryption in the cloud
Why a multi-account setup is essential for secure systems
How Service Control Policies help to secure AWS accounts
AWS: Increase instance security by allowing SSH only from your IP
AWS: How to get notified on compromised credentials
AWS: How to secure access keys with MFA
AWS: How to get notified on IAM user logins
AWS: How to get notified on root account login
How to secure different types of CloudFront origins
How CloudFront signed URLs work
How I failed to implement CSP
How to securely check your LastPass vault against the Pwned Passwords database
Why certificate pinning with HPKP is a bad idea
HTTPS security best practices
CloudFront
How to use CloudFront signed cookies to serve MPD or HLS videos
How to return a static file with a CloudFront function
How to use KMS keys with CloudFront signed URLs
How to use CloudFront signed URLs
CloudFront function to remove part of the request path
How to generate keys for CloudFront URL signing with Terraform
CloudFront function to support HTML5 History API
How to migrate to CloudFront Origin Access Control from Origin Access Identity
CloudFront cache problems and how to solve them
How to configure CloudFront for the HTML5 history API
Why use a single domain for the backend and the frontend
How to use CloudFront Functions to change the origin request path
How to use CloudFront Trusted Key Groups parameter and the trusted_key_group Terraform resource
How to debug CloudFront origin requests
How CloudFront determines the origin request URL
How CloudFront speeds up content delivery
How CloudFront routing works
How to use a custom domain with CloudFront and Route53
How to use a custom domain on CloudFront with Cloudflare-managed DNS
How to use the aws_apigatewayv2_api to add an HTTP API to a Lambda function
How CloudFront solves CORS problems
How to use Lambda@Edge with Terraform
How to use API Gateway with CloudFront
How to route to multiple origins with CloudFront
Optimized SPA deployment CloudFormation template
How to secure different types of CloudFront origins
How Origin Access Identity works
The differences between S3 and CloudFront signed URLs
How to use S3 signed URLs with CloudFront
How CloudFront signed URLs work
Lambda
CloudFormation's ZipFile still does not support ESM imports
How to use the AWS Lambda streaming response type
Getting started with the AWS JS SDK v3 included in the Node runtime
Deploy a serverless Telegram bot to AWS using Terraform
How to use ES6 modules and top-level await in AWS Lambda
How to delay calling a Lambda function using Step Functions
How to periodically call a Lambda function
Lambda development toolbox: Set environment variables locally
Lambda development toolbox: CLI logs watcher
How serverless cold starts change best practices
How to cache ssm.getParameter calls in a Lambda function
How to handle timeouts in Lambda functions
How to implement a Lambda backend based on OpenAPI
The consequences of memory allocation size for a Lambda function
How to use the aws_apigatewayv2_api to add an HTTP API to a Lambda function
Comparing async Javascript functions and callbacks on AWS Lambda
Automatically schedule emails on MailChimp with RSS and AWS Lambda
How to manage Lambda log groups with Terraform
How to setup CORS for Lambda Proxy integration
How to reproduce a Lambda function's environment variables locally
How to define Lambda code with Terraform
How to use Lambda@Edge with Terraform
How to clean up Lambda logs
How to get near-realtime logs for a Terraform-managed Lambda function
AWS: How to limit Lambda and API Gateway scalability
Optimized SPA deployment CloudFormation template
How to manage S3 Objects in CloudFormation templates
The anatomy of a CloudFormation template with a simple Lambda function
Customizable monitoring script on AWS Lambda
Java
New language features since Java 8 to 21
A categorized list of all Java and JVM features since JDK 8 to 21
Intro to Lucene
How to integrate with Elastic Stack via Logstash
How to integrate a containerized application with the Elastic Stack
Using external libraries in JShell
Prototyping with JShell
Working with structured data in Java
Two ways of skipping tests in Maven
Dependency Injection Boundaries
JUnit and Cucumber test reports based on source code and behavior
Effective debugging with breakpoints
Effective print debugging
Profile-based optimization techniques in the JVM
JVM JIT optimization techniques - part 2
JVM JIT optimization techniques
Using Java Generics to express variance of Collections and Functions
Detecting errors in the browser with Selenium
Getting started with OpenCV for Java on Ubuntu
Crazy Search Results in Eclipse for Multiple Module Maven Projects
Walkthrough for a TDD Kata in Eclipse
Automated tests with Eclipse using MoreUnit
Scott: detailed failure reports and hassle free assertions for Java tests
Calm assertions with Spock
Animated failure reports with Selenium and Cucumber
Log review guided by tests
Testing for undesired log output
Attached Maven tests with Cucumber
Running LP and IP optimisation from Java
Terraform
Stable S3 signed URLs
How to securely generate and store IAM Secret Access Keys with Terraform
How to use KMS keys with CloudFront signed URLs
How to generate keys for CloudFront URL signing with Terraform
Terraform module to generate secret values and store in SSM Parameter Store
How to use SSM Parameter Store for sensitive inputs in Terraform
How to run SQL scripts against the RDS Data API with Terraform
How to remove the RDS master user password from the Terraform state
How to set up Amazon RDS password rotation with Terraform
How to implement access control for a Telegram bot
How to run npm ci from Terraform
Interactive API documentation using Swagger UI deployed with Terraform
Automatically schedule emails on MailChimp with RSS and AWS Lambda
How to manage Lambda log groups with Terraform
How to solve CORS problems when redirecting to S3 signed URLs
How to deploy a single-page application with Terraform
How to run a build script with Terraform
How to reproduce a Lambda function's environment variables locally
How to define Lambda code with Terraform
How to use Lambda@Edge with Terraform
How to use API Gateway with CloudFront
How to route to multiple origins with CloudFront
How to use unique resource names with Terraform
How to get near-realtime logs for a Terraform-managed Lambda function
async/await
Hard-to-debug unhandled rejection cases
Introducing: Async/await in Javascript video course
Do not use fs sync methods in Javascript, use fs.promises instead
How to avoid uncaught async errors in Javascript
What is the await statement in Javascript
The async lazy initializer pattern in Javascript
How to convert between callbacks and Promises in Javascript
How to speed up Puppeteer scraping with parallelization
How to implement an exponential backoff retry strategy in Javascript
What is the async disposer pattern in Javascript
How to serialize calls to an async function
How to add timeout to a Promise in Javascript
How to use async/await with postMessage
How to use async functions with gapi, the Google Drive client, and the file picker
How to refactor a Promise chain to async functions
Comparing async Javascript functions and callbacks on AWS Lambda
How to use async functions with Array.some and every in Javascript
How to use async functions with Array.filter in Javascript
How to use async functions with Array.forEach in Javascript
How to use async functions with Array.map in Javascript
How to use async functions with Array.reduce in Javascript
Asynchronous array functions in Javascript
IAM
AWS management account starter pack
How to securely generate and store IAM Secret Access Keys with Terraform
How IAM permissions work with AppSync
How authentication and authorization work in AWS
Introducing: AWS IAM masterclass video course
9 tips for working with AWS IAM
Use-cases for IAM roles
AWS IAM deep dive: How roles work
How to use a break-glass role for sensitive admin tasks
IAM policy evaluation logic explained with examples
AWS IAM deep dive: How the policy evaluation logic works
AWS IAM deep dive: How IAM users and groups work
Granularity levels in AWS IAM policies
The AWS account administrator's guide to MFA
How to manage IAM user passwords
AWS IAM deep dive: Identity-based, and Resource-based policies
Limit permissions with roles for signed URLs
AWS: How to secure access keys with MFA
Test
Getting started with the Jest Javascript testing framework
Testing Bash scripts with the Bats testing framework
Function tests in Bash and the errexit mode
How to mock in Bash tests
Unit testing Bash scripts
The need for an additional refactor phase in TDD
JUnit and Cucumber test reports based on source code and behavior
3 Common Cucumber Mistakes You've Probably Made
Detecting errors in the browser with Selenium
Walkthrough for a TDD Kata in Eclipse
Automated tests with Eclipse using MoreUnit
Scott: detailed failure reports and hassle free assertions for Java tests
Calm assertions with Spock
Animated failure reports with Selenium and Cucumber
Log review guided by tests
Testing for undesired log output
Attached Maven tests with Cucumber
Webdev
Hardcoded assumptions
Intro to PureScript for TypeScript developers
Why use a single domain for the backend and the frontend
How to use SRI hashes to secure third-party dependencies
How to use async functions with gapi, the Google Drive client, and the file picker
Refresh the browser when a text appears on the terminal
Is Access-Control-Allow-Origin: * insecure?
Introducing: Array#Extras email course
Introducing: Weekly JS Tips & Tricks
Why Webpack 2's Tree Shaking is not as effective as you think
Getting started with Browserify
JSPM basics and review
Why Bower is still relevant
Frontend dependencies without tools
React basics
Static HTTP preview server using Docker
S3 signed URLs
Stable S3 signed URLs
Announcing: S3 and CloudFront Signed URLs first public release
How to serve files from an AppSync API using S3 signed URLs
How to implement file uploads to an AppSync API
Are S3 signed URLs secure?
How to solve CORS problems when redirecting to S3 signed URLs
Differences between PUT and POST S3 signed URLs
How to use S3 POST signed URLs
How to use S3 PUT signed URLs
Limit permissions with roles for signed URLs
Cacheable S3 signed URLs
The differences between S3 and CloudFront signed URLs
How to use S3 signed URLs with CloudFront
How S3 Signed URLs work
Vim
How to compare file revisions with fugitive.vim
Dive into Git history with fugitive.vim
Working with the system clipboard in Vim
Tips on window management in Vim
Use last-position-jump to recover context after reopening a file with Vim
Use Persistent Undo in Vim for maximum comfort
Never lose a change again: Undo branches in Vim
Copy-pasting in Vim without +clipboard
Managing Scala projects in Vim with Ag and Ctags
One year with Vim
5 Productivity Power Tools for Software Development on Linux
Scala development in Vim
Why you should care about Vim
DynamoDB
DynamoDB basic operations
The effects of not maintaining consistency with DynamoDB
Modeling common GraphQL patterns in DynamoDB
Efficient filtering in DynamoDB
The surprising properties of DynamoDB pagination
How to use DynamoDB with AppSync
How to maintain database consistency in DynamoDB
Foreign key constraints in DynamoDB
How to keep accurate counts in DynamoDB
How to properly implement unique constraints in DynamoDB
How to clear a DynamoDB table
How to use DynamoDB batch write with retrying and exponential backoff
IoT
Let's build a simple MQTT echo on AWS IoT Core
How to detect device connection and disconnection in AWS IoT Core
TLS certificates in IoT Core
How to use Topic Rules to react to MQTT messages in AWS IoT Core
How to generate IoT Core certificates with Terraform
Basic AWS IoT Core policy example and breakdown
How to connect to AWS IoT Core with MQTT.js
How to manage IoT Core resources with Terraform
The basic building blocks of AWS IoT Core
How to interact with IoT Core shadows from AppSync
CloudFormation
AWS management account starter pack
CloudFormation's ZipFile still does not support ESM imports
How to auto-disable leaked IAM credentials
How to use cfn-init to set up EC2 instances with CloudFormation
CloudFormation CLI workflows
Optimized SPA deployment CloudFormation template
How to use the PhysicalResourceId for CloudFormation Custom Resources
Custom resources in CloudFormation templates: Lessons learned
How to manage custom CloudFormation resources with Lambda
The anatomy of a CloudFormation template with a simple Lambda function
Bash
How to save entered values in Bash
Refresh the browser when a text appears on the terminal
Testing Bash scripts with the Bats testing framework
Function tests in Bash and the errexit mode
How to mock in Bash tests
Unit testing Bash scripts
Debugging Bash scripts
How to Bash and jq: generate statistics for a REST API
How to securely check your LastPass vault against the Pwned Passwords database
Deploying Docker images via SSH
Docker
Tips to debug NodeJS inside Docker
Using Let's Encrypt with Supervisor
Supervisor with Docker: Lessons learned
Fully automated dockerized Let's Encrypt reverse proxy
Static HTTP preview server using Docker
Revisiting webapp performance on HTTP/2
Historical monitoring on AWS
Deploying Docker images via SSH
Quick and dirty way to build PhantomJS2 from source
Maven
Two ways of skipping tests in Maven
JUnit and Cucumber test reports based on source code and behavior
Crazy Search Results in Eclipse for Multiple Module Maven Projects
Scott: detailed failure reports and hassle free assertions for Java tests
Calm assertions with Spock
Animated failure reports with Selenium and Cucumber
Log review guided by tests
Testing for undesired log output
Attached Maven tests with Cucumber
Linux
How to write a simple systemd timer
Supervisor with Docker: Lessons learned
Copy-pasting in Vim without +clipboard
Managing Scala projects in Vim with Ag and Ctags
Lessons learned from using xmonad for a year
5 Productivity Power Tools for Software Development on Linux
Scala development in Vim
Quick and dirty way to build PhantomJS2 from source
GraphQL
GraphQL tip: Only make fields required if they are present for all users
GraphQL tip: Have the subscription types contain all filterable fields on the top-level.
GraphQL non-nullable fields can lead to cascading null errors.
Apollo's subscribeToMore is the wrong abstraction
How to resolve interfaces and union types in AppSync
How to resolve complex types with AppSync resolvers
What is AWS AppSync
Cognito
How Cognito User Pools work
How to use Cognito with AppSync
AppSync Cognito directives
How token revocation works in Cognito
How to use the refresh token with Cognito
How to secure the Cognito login flow with a state nonce and PKCE
How to add Cognito login to a website
S3
Stable S3 signed URLs
Encryption options for S3 objects
How to route to an arbitrary S3 bucket website with Cloudflare Workers
How to add HTTPS for an S3 bucket website with Cloudflare
Avoid excessive costs and save money with S3 storage classes
Seamless S3 encryption does not imply better security
How to manage S3 Objects in CloudFormation templates
Let's Encrypt
How to use Let's Encrypt with Node.js and Express
Using Let's Encrypt with Supervisor
Let's Encrypt hooks use cases
When to use Let's Encrypt's webroot and standalone authorization
Let's Encrypt tips
Getting started with Let's Encrypt
Fully automated dockerized Let's Encrypt reverse proxy
Integration-test
JUnit and Cucumber test reports based on source code and behavior
3 Common Cucumber Mistakes You've Probably Made
Detecting errors in the browser with Selenium
Animated failure reports with Selenium and Cucumber
Log review guided by tests
Testing for undesired log output
Attached Maven tests with Cucumber
API Gateway
How to call API Gateway from AppSync with IAM authorization
How to use OpenAPI with API Gateway REST APIs
How to use OpenAPI to deploy an API Gateway HTTP API
How to use the aws_apigatewayv2_api to add an HTTP API to a Lambda function
How to use API Gateway with CloudFront
AWS: How to limit Lambda and API Gateway scalability
Git
Git Tips and Tricks
How to compare file revisions with fugitive.vim
Dive into Git history with fugitive.vim
How to create a good Pull Request
3 ways to set up author information in Git
Git to track local history, without a remote
Eclipse
Effective debugging with breakpoints
Effective print debugging
Getting started with OpenCV for Java on Ubuntu
Crazy Search Results in Eclipse for Multiple Module Maven Projects
Walkthrough for a TDD Kata in Eclipse
Automated tests with Eclipse using MoreUnit
Cucumber
JUnit and Cucumber test reports based on source code and behavior
3 Common Cucumber Mistakes You've Probably Made
Detecting errors in the browser with Selenium
Animated failure reports with Selenium and Cucumber
Log review guided by tests
Attached Maven tests with Cucumber
RDS
How to use tagged templates in AppSync to send queries to RDS
How to use RDS as a Data Source for AppSync
How to run SQL scripts against the RDS Data API with Terraform
How to remove the RDS master user password from the Terraform state
How to set up Amazon RDS password rotation with Terraform
Telegram
How to call a protected external API using AppSync HTTP data source
The easiest way to set up a chat with your Telegram bot
How to implement access control for a Telegram bot
Send notifications to a Telegram bot for events in an AWS account
Deploy a serverless Telegram bot to AWS using Terraform
CLI
Lambda development toolbox: Set environment variables locally
Lambda development toolbox: CLI logs watcher
How to use the AWS SQS CLI to receive messages
How to get near-realtime logs for a Terraform-managed Lambda function
CloudFormation CLI workflows
Debugging
Debugging Bash scripts
Effective debugging with breakpoints
Effective print debugging
End-to-end manual verification
Listen to your code: Problem-solving techniques in programming
HTTPS
How to add HTTPS for an S3 bucket website with Cloudflare
How to handle mixed content with CSP
Why certificate pinning with HPKP is a bad idea
HTTPS security best practices
Fully automated dockerized Let's Encrypt reverse proxy
React
Dealing with async in React
The first steps from Grunt to Webpack
Custom CSS animations in React
Global listener patterns in React
React basics
CORS
How to solve CORS problems when redirecting to S3 signed URLs
How CloudFront solves CORS problems
How to setup CORS for Lambda Proxy integration
Is Access-Control-Allow-Origin: * insecure?
A simple proxy to circumvent the SOP
RxJS
How to speed up Puppeteer scraping with parallelization
RxJS: How to make an ordered mergeMap operator
RxJS: How to use startWith with pairwise
RxJS: The differences between first(), take(1), and single()
OpenAPI
How to use OpenAPI with API Gateway REST APIs
How to use OpenAPI to deploy an API Gateway HTTP API
How to implement a Lambda backend based on OpenAPI
Interactive API documentation using Swagger UI deployed with Terraform
DNS
How to test with a live domain name for free
How to use a custom domain with CloudFront and Route53
How to use a custom domain on CloudFront with Cloudflare-managed DNS
What is CNAME flattening and how it helps redirecting the apex domain
Cloudflare
How to use a custom domain on CloudFront with Cloudflare-managed DNS
What is CNAME flattening and how it helps redirecting the apex domain
How to route to an arbitrary S3 bucket website with Cloudflare Workers
How to add HTTPS for an S3 bucket website with Cloudflare
Typescript
Modern JavaScript library starter
Intro to PureScript for TypeScript developers
Getting started with the Jest Javascript testing framework
What to expect when you decide to migrate from Javascript to Typescript
generators
Generators and ImmutableJS
Generators in Javascript
Simulating movement with ES6 generators
Infinite collections with ES6 generators
JVM
A categorized list of all Java and JVM features since JDK 8 to 21
Profile-based optimization techniques in the JVM
JVM JIT optimization techniques - part 2
JVM JIT optimization techniques
Webpack
How to write a Webpack loader
Why Webpack 2's Tree Shaking is not as effective as you think
Parallel Processing in JS
The first steps from Grunt to Webpack
Node.js
How to sign, verify, and encrypt JWTs in Node
How to use Let's Encrypt with Node.js and Express
A simple proxy to circumvent the SOP
Detecting possibly duplicate Strings
NodeJs
Dataset preparation for training a neural text-to-speech model with Piper TTS
How to transfer binary data efficiently across worker threads in NodeJs
Using worker pools in NodeJs
Elastic Stack
Custom Aggregations in Logstash with the Ruby Filter Plugin
How to integrate with Elastic Stack via Logstash
How to integrate a containerized application with the Elastic Stack
SNS
Fun fact: you can make an unsubscribable subscription to an SNS topic
SNS to AppSync subscription
How to target subscribers in an SNS topic
Organizations
Why a multi-account setup is essential for secure systems
How Service Control Policies help to secure AWS accounts
The rocky path to delete an AWS Organizations member account
Performance
Profile-based optimization techniques in the JVM
JVM JIT optimization techniques - part 2
JVM JIT optimization techniques
JIT
Profile-based optimization techniques in the JVM
JVM JIT optimization techniques - part 2
JVM JIT optimization techniques
ES6
Simulating movement with ES6 generators
Infinite collections with ES6 generators
More readable Javascript without variables
commentary
A brief overview of hack.summit() 2016 (part 3)
A brief overview of hack.summit() 2016 (part 2)
A brief overview of hack.summit() 2016 (part 1)
hack.summit() 2016
A brief overview of hack.summit() 2016 (part 3)
A brief overview of hack.summit() 2016 (part 2)
A brief overview of hack.summit() 2016 (part 1)
TDD
The need for an additional refactor phase in TDD
Walkthrough for a TDD Kata in Eclipse
Automated tests with Eclipse using MoreUnit
gapi
How to use async functions with gapi, the Google Drive client, and the file picker
Accessing Google Drive in Javascript
Using Google auth in Javascript
Selenium
3 Common Cucumber Mistakes You've Probably Made
Detecting errors in the browser with Selenium
Animated failure reports with Selenium and Cucumber
Logging
Detecting errors in the browser with Selenium
Log review guided by tests
Testing for undesired log output
AI
Thoughts on unreliable computing
Thoughts on using AI for coding
JavaScript
How to transfer binary data efficiently across worker threads in NodeJs
Using worker pools in NodeJs
CDK
How to remove a resource before creating it with the CDK
The problems with implicit AWS resources
Syncthing
How to monitor Syncthing
How Syncthing provides secure file syncing without sharing your files with a third party
Spring Boot
How to integrate with Elastic Stack via Logstash
How to integrate a containerized application with the Elastic Stack
CloudWatch
AWS Config notifications with CloudWatch Events
AWS: How to query the available CPU credits for t2/t3 instances
CloudTrail
CloudTrail's horrible developer experience
AWS: How to get notified on compromised credentials
NPM
Modern JavaScript library starter
How to automate development tasks using NPX
Cost Optimizations
How to check if your Reserved Instances are used
Keep costs under control when using t3 instances
EC2
EC2 VPC building blocks
Keep costs under control when using t3 instances
MFA
The AWS account administrator's guide to MFA
AWS: How to secure access keys with MFA
Custom Resources
How to use the PhysicalResourceId for CloudFormation Custom Resources
Custom resources in CloudFormation templates: Lessons learned
CSP
How to handle mixed content with CSP
How I failed to implement CSP
Supervisor
Using Let's Encrypt with Supervisor
Supervisor with Docker: Lessons learned
IntelliJ IDEA
Effective debugging with breakpoints
Effective print debugging
Magento
Magento 2 - Programmatically recreate the missing Catalog Search index table
How to create a Theme Plugin for Magento
Dotfiles
Lessons learned from using xmonad for a year
5 Productivity Power Tools for Software Development on Linux
xmonad
Lessons learned from using xmonad for a year
5 Productivity Power Tools for Software Development on Linux
Management
A tale of two development competitions
Some thoughts on managing small development teams
Scott
JUnit and Cucumber test reports based on source code and behavior
Scott: detailed failure reports and hassle free assertions for Java tests
SOP
Isolating scripts on a page
A simple proxy to circumvent the SOP
Spock
Scott: detailed failure reports and hassle free assertions for Java tests
Calm assertions with Spock
Scala
Managing Scala projects in Vim with Ag and Ctags
Scala development in Vim
AngularJS
Accessing Google Drive in Javascript
Using Google auth in Javascript
Ruby
How to integrate PlantUML into other software
MathJax processing on the server-side
JSON
Working with structured data in Java
Efficient SQLite backup on Android
Backup Manager
Efficient SQLite backup on Android
Practical measurement of the Android Backup Manager
Android
Efficient SQLite backup on Android
Practical measurement of the Android Backup Manager
LP
Running LP optimisation from Javascript
Running LP and IP optimisation from Java
mathematics
Running LP optimisation from Javascript
Running LP and IP optimisation from Java
integration
Integrating Facebook Comment Count Sum
Integrating Facebook Comments
facebook
Integrating Facebook Comment Count Sum
Integrating Facebook Comments
privacy
How things work matters
security
How things work matters
puzzle
The twists of the Ballmer puzzle
cloud
The hidden cost multiplier of fixed-price cloud resources
cost
The hidden cost multiplier of fixed-price cloud resources
aws
The hidden cost multiplier of fixed-price cloud resources
recommendation
Notes on "Hardest Problem in Computer Science: Centering Things"
complexity
Notes on "Hardest Problem in Computer Science: Centering Things"
EventBridge
CloudTrail's horrible developer experience
TTS
Dataset preparation for training a neural text-to-speech model with Piper TTS
Courses
Introducing: subscriptions to books and courses
Books
Introducing: subscriptions to books and courses
Nix
First experiences with Nix shell
KMS
How to use KMS keys with CloudFront signed URLs
Functional Programming
Intro to PureScript for TypeScript developers
PureScript
Intro to PureScript for TypeScript developers
TOTP
How TOTP works
Search
Intro to Lucene
Lucene
Intro to Lucene
WAF
How to implement rate limiting for an AppSync API
GCP
Intro to AppSheet
AppSheet
Intro to AppSheet
Ruby Filter Plugin
Custom Aggregations in Logstash with the Ruby Filter Plugin
Logstash
Custom Aggregations in Logstash with the Ruby Filter Plugin
Jest
Getting started with the Jest Javascript testing framework
VPC
EC2 VPC building blocks
SCP
How to completely lock down an AWS account with a service control policy (SCP)
melt
Generating a crossfaded slideshow video from images with ffmpeg and melt
ffmpeg
Generating a crossfaded slideshow video from images with ffmpeg and melt
Jekyll
How to change a blog's permalinks and not lose all organic traffic
jq
How to Bash and jq: generate statistics for a REST API
MailChimp
Automatically schedule emails on MailChimp with RSS and AWS Lambda
PlantUML
How to integrate PlantUML into other software
Config Rules
AWS Config notifications with CloudWatch Events
SQS
How to use the AWS SQS CLI to receive messages
SSH
AWS: Increase instance security by allowing SSH only from your IP
SSM
Managing EC2 servers at scale: Ansible and RunCommand
Ansible
Managing EC2 servers at scale: Ansible and RunCommand
Serverless
Customizable monitoring script on AWS Lambda
Pwned Passwords
How to securely check your LastPass vault against the Pwned Passwords database
LastPass
How to securely check your LastPass vault against the Pwned Passwords database
HPKP
Why certificate pinning with HPKP is a bad idea
Spring
Dependency Injection Boundaries
Dependency Injection
Dependency Injection Boundaries
Komodo
Effective print debugging
Babel
2 cases where Babel fixes your code but it shouldn't
Browserify
Getting started with Browserify
JSPM
JSPM basics and review
Ctags
Managing Scala projects in Vim with Ag and Ctags
Ag
Managing Scala projects in Vim with Ag and Ctags
Bower
Why Bower is still relevant
Web Workers
Parallel Processing in JS
Generics
Using Java Generics to express variance of Collections and Functions
random
Proper random numbers in Javascript
Ubuntu
Getting started with OpenCV for Java on Ubuntu
OpenCV
Getting started with OpenCV for Java on Ubuntu
Grunt
The first steps from Grunt to Webpack
Broken windows theory
Unbroken windows - overengineering in the name of clean code
Refactoring
Unbroken windows - overengineering in the name of clean code
Konsole
5 Productivity Power Tools for Software Development on Linux
Less
5 Productivity Power Tools for Software Development on Linux
Zsh
5 Productivity Power Tools for Software Development on Linux
HTTP/2
Revisiting webapp performance on HTTP/2
SQL
A solution to Codility Kalium
Codility
A solution to Codility Kalium
Groovy
Calm assertions with Spock
D3.js
Historical monitoring on AWS
Google Drive
Accessing Google Drive in Javascript
Google auth
Using Google auth in Javascript
Gem
MathJax processing on the server-side
MathJax
MathJax processing on the server-side
Pocket
MathJax processing on the server-side
PhantomJS
Quick and dirty way to build PhantomJS2 from source
Levenshtein distance
Detecting possibly duplicate Strings
duplicates
Detecting possibly duplicate Strings
Strings
Detecting possibly duplicate Strings
GZIP
Efficient SQLite backup on Android
SQLite
Efficient SQLite backup on Android
IP
Running LP and IP optimisation from Java
SVG
Plotting charts with SVG
Catmull-Rom
Plotting charts with SVG
spdy
Integrating Facebook Comment Count Sum
http
Integrating Facebook Comment Count Sum