photo credits: Scott Webb

AWS Key Management Service (KMS) has been a go to for developers since its creation. Featuring key creation, management, and encryption of data at competitive costs, you can get more out of this service with Data Keys.

A data key is a unique symmetric key for client-side encryption. Due to each key costing around $1 a month per key, Costs can quickly rise when you want individual users to have their own keys for their own data. Data keys are generated under a specific symmetric Client Managed Key (CMK) that is used to encrypt the data key. …

We have all been writing in Java and experienced the deadly NullPointerException, so Java introduced Optionals.

// before Optionalsif (obj1 != null) {
Object2 obj2 = obj1.getObj2();
if (obj2 != null) {
...the nightmare continues

Along came Optionals in Java 8. Without diving too deep an Optional is a container object which may or may not contain a non-null value. So problem solved no more null checks right?

// with Optionals
if (obj1.isPresent()) {
Object2 obj2 = obj2.get
if (obj2.isPresent()) {
...not really

Now yes Optionals did provide improvement and put a nice bandaid over the NullPointerException. The issue…


Liquibase is a great tool to version control your database. It allows you to perform updates, rollbacks, and many other goodies. It’s a robust tool that has great language support.

Docker allows you to containerize an application, creating OS-level virtualization to nearly eliminate cross platform issues.

So why would you want to containerize migrations? Let’s say you’re developing an AWS Elastic Container Service that can apply migrations to an RDS database in a single task then shutdown. This allows us to separate our Application deploys from our Database migrations, versioning independently.

Technologies used
- Spring Boot
- Liquibase
- Docker

Photo by Caspar Camille Rubin on Unsplash

Whether it’s a login screen or any form input, if users are required to meet a specific format you want to ensure they are aware. Regex is a great way to ensure the Strings are formatted to your specification. Let’s begin an example with a simple login.

Let’s start by making a simple login screen

const Login = props => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const onSubmit = () => {
login with email and password
return (

Spencer Nicol

Full stack software engineer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store