Different Ways to Prep a Concrete Floor to Accept Paint or Epoxy

Concrete in your home is everywhere. From your driveway, garage floor, patio, porch, and backyard, everyone has concrete. Unfortunately, concrete is porous and can easily get dirty. Oil, dirt, and stains from all sorts of things can permeate and discolor concrete seemingly permanently. Pressure washing concrete with a high-pressure washer won’t even remove the discoloration. To protect your concrete from stains, you’ll need to seal it. If your concrete is already ugly or if you want to change the way it looks, you’ll need to apply a coating on it, e.g. epoxy. But, in order for any coating to adhere and not peel off, you’ll need to prepare (prep) the surface very well. This is the most important step when renovating concrete. Do it right, and you’ll vastly improve and transform the look of your concrete and your home. Here’s an example before and after picture of a garage floor I renovated.

This is not the step where you want to be lackadaisical. Following are different ways you can prep your concrete surfaces.


You can pour acid on bare concrete and scrub it around. However, the chemicals are toxic, smelly, and harmful.

Floor Polisher with Diamabrush Concrete Prep Attachment

The concrete prep attachment is for etching bare concrete floors to prepare for adhesive coatings. This option is much better than using acid, IMHO. But, it’s a bit more expensive. I think I rented it for $140 for 4 hours from the Home Depot. It’s a bit tiring to use because the polisher likes to move in one direction so you need to force it to go in the other direction.

Floor polisher
Diamabrush concrete prep attachment

Make sure you choose the concrete prep attachment and not the coating removal attachment picture below. Both look similar but the latter is for removal of mastics, glue, adhesives, thinset epoxies and paint from interior concrete.

Diamabrush coating removal attachment

Angle Grinder with Concrete Grinder Attachment and Dush Shroud

Another option is to grind the concrete down. This, however, requires getting down on the ground and can take a long time. You’ll also need to use a shopvac to suction the dust as this will product a ton of dust. Concrete dust is harmful because it contains silica which can mess with your lungs. If you have a small area to grind or if you need to grind edges, this tool is handy.

Walk-Behind Concrete Grinder

This commercial-grade concrete grinder can be rented at the Home Depot. It grinds down concrete high spots, removes sealers and thin mil paints, removes mastics and preps floors to accept new coatings.

This tool should also be used with a concrete grinder dust vacuum.

Shot Blaster

This tool can be rented from Sunbelt Rentals for $270 / day. This tool works by blasting media (shot) at the concrete to scour the surface. This is one of the best ways to prepare concrete. However, what’s annoying about it is you have to periodically pick up the shot media that escapes the tool.

Dustless Blasting

You can hire a company, like this one in Stockton, California, to prep your concrete for you. This tool uses a combination of water and shot media.

Active Ingredients for Common Illnesses

With so many over-the-counter medicine options to choose from, it can be confusing to know which one to get. Then there’s the brand name medicine versus the generic or store brand medicine. What only really matters is the “active ingredients”. This post will list and describe the active ingredients for common illnesses so you can make better decisions when deciding which medicine to buy.

Tip: Always buy store-brand medicine, e.g. Target’s Up & Up or Costco Kirkland brands. They contain the same active ingredients and are always cheaper.

Cough Suppressant

Generic name: Dextromethorphan HBr

Common brands: Robitussen

Generic name: Eucalyptus Oil (topical)

Common brands: Vicks VapoRub


Generic name: Guaifenesin

Common brands: Robitussen

An expectorant is a medicine you can use when you have a cough that produces mucus. Expectorants help thin the secretions in your airway and loosen up mucus, so you can make your cough more productive.

Allergy Symptom Reliever

Generic name: Fluticasone Propionate (glucocorticoid)

Common brands: Flonase, Aller-Flo (Costco Kirkland)

Temporarily relieves symptoms of hay fever or other upper respiratory allergies including nasal congestion, itchy nose, runny nose, sneezing, and itchy, watery eyes

Generic name: Cetirizine HCI (Antihistimine)

Common brands: Zyrtec, Aller-Tec (Costco Kirkland)

Temporarily relieves symptoms of hay fever or other upper respiratory allergies including runny nose, sneezing, and itchy, watery eyes, itching of the nose or throat

Generic name: Loratadine (Antihistimine)

Common brands: Claritin

Temporarily Relieves These Symptoms Due To Hay Fever Or Other Upper Respiratory Allergies: Runny Nose, Sneezing, Itchy, Watery Eyes, Itching Of The Nose Or Throat

Generic name: Mometasone Furoate Monohydrate (Glucocorticoid)

Common brands: Nasonex

Uses temporarily relieves these symptoms of hay fever or other upper respiratory allergies: nasal congestion runny nose sneezing itchy nose

Generic name: Fexofenadine Hci

Common brands: Allegra

Temporarily relieves these symptoms due to hay fever or other upper respiratory allergies: – runny nose itchy, watery eyes sneezing – itching of the nose or throat

Generic name: Triamcinolone Acetonide

Common brands: Nasacort

Temporarily relieves these symptoms of hay fever or other upper respiratory allergies: nasal congestion runny nose sneezing itchy nose

Generic name: Azelastine Hci (Antihistamine)

Common brands: Astepro

Generic name: Diphenhydramine Hcl (Antihistamine)

Common brands: Benadryl

Nasal congestion, runny nose, sneezing, itchy nose

Temporarily Relieves These Symptoms Due To Hay Fever Or Other Upper Respiratory Allergies: Runny Nose Sneezing Itchy, Watery Eyes Itching Of The Nose Or Throat

Generic name: Levocetirizine Dihydrochloride (Antihistamine)

Common brands: Xyzal

Temporarily relieves these symptoms due to hay fever or other respiratory allergies: runny nose itchy, watery eyes sneezing itching of the nose or throat

Generic name: Triprolidine Hcl (Antihistamine)

Common brands: Mucinex

Triprolidine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, watery eyes, itchy eyes/nose/throat/skin, cough, runny nose, and sneezing.

Generic name: Chlorpheniramine Maleate (Antihistamine)

Chlorpheniramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, watery eyes, itchy eyes/nose/throat/skin, cough, runny nose, and sneezing.

Generic name: Doxylamine Succinate (Antihistamine)

Doxylamine is an antihistamine, used to relieve symptoms of allergy, hay fever, and the common cold. This medication works by blocking certain natural substances (histamine, acetylcholine) that your body makes. This effect helps to relieve allergy/cold symptoms such as watery eyes, runny nose, and sneezing.

Generic name: Brompheniramine Maleate (Antihistamine)

Common brands: Dimetapp

Used to relieve watery eyes, itchy eyes/nose/throat, runny nose, and sneezing.

Pain Reliever / Fever Reducer

Generic name: Acetaminophen

Common brands: Tylenol

Relieves mild to moderate pain (from headaches, menstrual periods, toothaches, backaches, osteoarthritis, or cold/flu aches and pains) and to reduce fever.

Generic name: Ibuprofen

Common brands: Advil

Relieves pain from various conditions such as headache, dental pain, menstrual cramps, muscle aches, or arthritis. It is also used to reduce fever and to relieve minor aches and pain due to the common cold or flu.

Generic name: Aspirin

Used to reduce the risk of having a heart attack in people who have heart disease.

Generic name: Naproxen Sodium

Common brands: Aleve, Anaprox, Naprosyn

Used to relieve pain from various conditions such as headache, muscle aches, tendonitis, dental pain, and menstrual cramps. It also reduces pain, swelling, and joint stiffness caused by arthritisbursitis, and gout attacks.

Nasal Decongestant

Generic name: Phenylephrine Hcl, Phenylephrine Bitartrate

Common brands: Sudafed PE

Generic name: Oxymetazoline Hydrochloride

Common brands: Mucinex Sinus-Max, Afrin

Sore Throat, Sore Mouth, Canker Sores

Generic name: Benzocaine, Menthol

Common brands: Mucinex

Gargle with salt water

Form Backends for Static Websites

If you’re getting on the Jamstack bandwagon, you’ll probably get to a point where you need to figure out a way to handle web forms. That’s what happened to me when I migrated from WordPress (PHP) to static HTML. I needed a way to handle my contact form. Fortunately, there are many form backend services like

After reviewing each one, I find KwesForms to be the best, but to have one of the worst costs because it’s one of the most expensive.

At $29 / month, that’s cheap for a company but more than I would want to pay for a personal blog. There is a free version but it has some limitations and has the KwesForms logo on confirmation emails. Anyway, KwesForms has the best features, what super easy to integrate, includes form validation, custom redirects, clear documentation, and more. You can view and edit form data and export it all as a CSV file.

Since I don’t want to pay $29 / month for a contact form, and since I’ll be hosting my new blog on Netlify, I’m just going to use Netlify Forms. It’s not as user-friendly and feature-packed as KwesForms, which is to be expected since Netlify specializes in static site hosting, not form handling, but it’s free (up to 100 submissions per month). However, unlike KwesFroms, which comes with form validation, I’ll have to add my write my own form validation code. Instead of reinvent the wheel, I’ll use .validate, a jQuery validation plugin.

As you can see from their website and the video below, it’s dead simple to use.

Website Speed Comparison: WordPress (PHP) on GoDaddy vs Static HTML on Netlify

I’m in the process of migrating this blog from a managed WordPress instance on GoDaddy to a static HTML site on Netlify. Before I switch over the domain, I wanted to compare the Google Lighthouse performance scores for each site. In Google Chrome Developer Tools, I clicked the Lighthouse tab and ran a test for each site. Here are the results.

Performance score for WordPress (PHP) version of site on GoDaddy

Performance score for static HTML version of site on Netlify

Now, you might be thinking, why would the PHP site get a slightly higher score than the static HTML site? The static site has a lower cumulative layout shift score (see definition below). This factor has nothing to do with PHP vs HTML or GoDaddy vs Netlify. This factor has to do with how elements on the page shift their position. The original theme in the WordPress site came from one developer and the theme in the static HTML site came from another developer who recreated the original theme. This tells me that the original theme was coded better than the recreated theme. Since I’m more concerned with speed rather than layout shift, we can see that the static HTML site on Netlify is much faster than the PHP site on GoDaddy. This is to be expected. If we add up all scores except for the Cumulative Layout Shift score, we get

  • PHP on GoDaddy Performance Score: 3.9 s
  • HTML on Netlify Performance Score: 1.3 s

The new site performs 3x faster than the old one! That’s a speed gain of 300%!

First Contentful Paint

First Contentful Paint marks the time at which the first text or image is painted. Learn more.

Time to Interactive

Time to interactive is the amount of time it takes for the page to become fully interactive. Learn more.

Speed Index

Speed Index shows how quickly the contents of a page are visibly populated. Learn more.

Total Blocking Time

Sum of all time periods between FCP and Time to Interactive, when task length exceeded 50ms, expressed in milliseconds. Learn more.

Largest Contentful Paint

Largest Contentful Paint marks the time at which the largest text or image is painted. Learn more

Cumulative Layout Shift

Cumulative Layout Shift measures the movement of visible elements within the viewport. Learn more.

Virtually Stage a Room

I just finished renovating one of my rental apartments. I took a bunch of photos and, though the apartment looks nice, it looks extremely plain and uninviting without furniture. Some people have a good imagination and sense of design and can visualize what a room could look like with furniture the right furniture, but most people are clueless when it comes to interior design. I definitely don’t want to spend a lot of time, money, and energy paying a professional stager to come and bring real furniture to my apartment. Fortunately, there are online services where you can pay companies (or individuals) to virtually stage photos of your rooms for you. Or, you can use one of many DIY websites where you can virtually stage your rooms yourself.

After doing some research, I came across Apply Design. They charge up to $10 per photo. You can try it for free on one photo. So, I gave it a try and here’s what I came up with.

Living Room When Occupied by Tenant

The photo is distorted because I used a 360-degree camera placed in the center of the room. To show more of the room, I had to zoom out which made the walls look wider or narrower.

Living Room Right After I Kicked Out My Inherited Tenant

Again, the photo above is distorted.

Living Room After Renovating It

The photo above is the one I uploaded to Apply Design.

Virtually Staged Photo (Before Rendering)

This is how the living room looked after I drag and dropped furniture and design elements onto the previous photo but before rending the objects.

Virtually Staged Photo (After Rendering)

This is the final, rendered version of the photos. As you can see, it not only looks realistic, but it looks way more attractive and inviting than the empty room. When you compare it to the pre-rendered version, you see much more detail, shadows and vibrant colors.

How it Works

Virtually staging a room is actually very easy. Here are the steps using Apply Design.

  1. Upload photos
    Apply Design will take a few minutes to analyze each photo. I think it’s trying to determine where the walls are and the depth of field.
  2. Drag furniture and interior elements
    You can search or browse for furniture and then drag them to your photo. You can edit each object by moving, resizing, rotating, etc.
  3. Render a photo
    Rendering a photo takes around 5-10 minutes.

Overall, I think this is a great way to improve your home sale or rental potential.

Other Examples

Bedroom when occupied by tenants
Bedroom after (necessarily) renovating it
Bedroom after virtually staging it
Master bedroom when occupied by tenants
Master bedroom after (necessarily) renovating it
Master bedroom after virtually staging it
After virtual staging

11ty: Ways to Debug Data

I’m in the process of migrating this blog from Managed WordPress on GoDaddy to Eleventy, GitHub and Netlify. Since I like the convenience of writing content in WordPress, I decided to continue to use it, but just as a headless CMS. When 11ty builds the site, it would fetch WordPress post, page, category, tag, and author data and, using the eleventy-fetch plugin, cache the data locally for a customizable period (I chose 1 day). Since Netlify automatically triggers a build when it detects a commit or push to GitHub, an automated build only happens when I make changes that are tracked by git and not changes in WordPress. For WordPress changes that I want published, I would manually trigger a build in the Netlify admin panel.

During this migration project, there were coding bugs that needed to be fixed. Following are some of the ways I discovered helped me to debug in Eleventy.

Debugging data in JavaScript files in the _data folder

As mentioned above, my project fetches data from WordPress to dynamically build pages. For example, I have a file at _data/authors.js that fetches data from the WordPress remote API endpoint, does some custom processing, and returns the data. It is often necessary to see if the data at different points of the code is as expected. To see this data, you can simply console out the data variable (see line 53 in the screenshot below).

When 11ty builds the site, the console.log statement will output the data in the console / terminal. However, f you are running the default 11ty build command, depending on how many files are being built (in my case, 11ty wrote 1015 files), the data dump may get truncated or lost in the console output. To remove the noise and status messages in the 11ty output, enable quiet mode. Since I’m on Windows, I use the following command.

npx @11ty/eleventy --serve --incremental --quiet 

Now, the output is much simpler, and I can see the data dump immediately.

Debugging data in template files

If you’d like to view the value of data variables in template files, you can do that by outputting the value and passing it to the log function (see example on line 9 below). This will tell 11ty to output the data to the console / terminal.

Dumping all data to a built page

Viewing data in the console terminal is handy for some situations. But, sometimes you can have a lot of JSON data that you’d like to see. In this case, it can be easier to dump the data to a page that you can view the entirety of in a file or at a URL To do this, first add a filter with the following code to .eleventy.js.

eleventyConfig.addFilter('dump', obj => {
    const getCircularReplacer = () => {
      const seen = new WeakSet();
      return (key, value) => {
        if (typeof value === "object" && value !== null) {
          if (seen.has(value)) {
        return value;
    return JSON.stringify(obj, getCircularReplacer(), 4);

Then, create a file to dump the data. In the example below, I have 2 files.

  • dump-posts.njk (to dump WordPress post data)
  • dump-pages.njk (to dump WordPress page data)
permalink: dump-post-data.json
{{ readyPosts.all | dump | safe }}
permalink: dump-page-data.json
{{ pages | dump | safe }}

Now, when 11ty builds the site, two pages are created at the following URLs.

  • http://localhost:8080/dump-page-data.json
  • http://localhost:8080/dump-page-data.json

Assembling a 12′ x 14′ Gazebo

Costco had this 12’x14′ gazebo on sale from $2099 to $1699 if you buy it in store.

The assembly instructions say you need 4 people to assemble it.

It turns out, I was able to assemble it with just 2 people by using the Rockwell RK9034 JawStand XP Work Support Stand.

Assembling the posts and beams was easy but time-consuming. It took one day.

The hard part was assembling the roof. Half a day was spent screwing in the aluminum roof panels. Another half was spent raising the roof up and fastening everything together. In the picture below, we used the Jawstand to hold a 2×4 piece of wood which supported the center peak of the roof. The Jawstand made it easy to adjust the height of the 2×4 since the angle of the roof had to constantly be adjusted to get all 4 roof panels to fit right.

Here’s the end result. Two days. Two people.

Strong, Waterproof Glue: Liquid Nails Fuze-It Max VS Loctite PL Marine

I wanted to find a glue that was simple to use, not too expensive, was very strong, and would maintain its strength in wet conditions. There are many glue options to choose from. I ended up choosing two popular brands: Liquid Nails and Loctite. For each brand, I chose either the strongest option or the option that was designed for wet environments. I didn’t include epoxy in my test because I didn’t want to mix two parts together and apply the mixture using a stick. Below are the two options I chose.

I first glued a piece of 2×4 to a concrete landscape block.

After waiting 1.5 to 2 days to fully cure, I attached each piece of wood to a chain to suspend the wood / concrete block combo in the air.

After 2 days, both adhesives kept the wood attached to the concrete block. I then wanted to see if water would affect the bond. I submerged each test in water without having it touch the bottom of the bucket of water.

LeftL Fuze-it | Right: PL Marine

After 12 hours, the wood pieces were still connected to the concrete blocks. But, after 23 hours, the Liquid Nails Fuze-It MAX lost its strength and the wood piece became disconnected from the concrete block.

Left: Fuze-It MAX, Right: PL Marine

So, the winner is Loctite PL Marine, although if you are gluing something in a dry environment, Liquid Nails Fuze-It MAX is probably sufficient. Unsurprisingly, the Marine adhesive is stronger both in dry and wet environments, including while being completely submerged in water.

How To Fix Open / Close Door Error on Microwave

I have the KitchenAid 1.9 cu. ft. Over the Range Convection Microwave in Stainless Steel with Sensor Cooking Technology microwave (model # KMHC319ESS).

Recently, the microwave would keep giving an error saying I needed to “open / close door” no matter how many times I open and close the door. This prevented me from microwaving anything. Since this was an expensive microwave, I didn’t really want to buy a new one. Fortunately, fixing this error was easy. It turns out that there is a sensor along the inside front bottom edge that detects whether the door is closed or not. I prefer to clean using wet Clorox disinfectant wipes. I find that they lift dirt up easily. I’d then wipe again using a dry paper towel. After doing that, the open/close door error goes away and the microwave can start.

Door sensor along inside bottom edge of microwave
Door sensor along inside bottom edge of microwave door
Cleaning the door sensor
Cleaning the door sensor

Although my microwave is a KitchenAid, apparently this happens to other microwaves as well.