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