Best Caribbean Beaches & Travel Considerations

The Caribbean is a subregion of the Americas that includes the Caribbean Sea and its islands.

Best Beaches

If your idea of the best beach is like mine, which are beaches that have

  • shallow turquoise or clear water,
  • fine white sand,
  • no garbage, seaweed, rocks and corral

like this

then, looking at the Google satellite image above, it should be evident that one spot stands out: The Bahamas! Actually, if we zoom in on that area, we’ll find that the Turks and Caicos Islands also have that same turquoise color.

Both of these countries have many beaches, and some are better than others. According to the World Travel Awards, Turks and Caicos Islands has the best beaches, and the country has held that rank since 2012.

According to the award history for 2012, 2013 and 2014, and according to the “Visit Turks & Caicos Islands‘” website, the best beach is Grace Bay Beach on Providenciales island. Learn more about Grace Bay Beach.

Grace Bay Beach

Grace Bay Beach is located on the west side of Providenciales island. As you can see in the picture above, it looks amazing. But, the beach and water on the eastern side looks even better according to the zoomed-out photo below.

So, what about the Bahamas? According to Lonely Planet, two beaches that meet the criteria above are

  1. Junkanoo beach
    Located in the city of Nassau on the island of New Providence and near the cruise port, this beach gets really crowded.
  2. Tropic of Cancer Beach
    This beach is located in a small town far from Nassau. You may feel lonely at this beach.
Junkanoo Beach
Tropic of Cancer Beach

Another popular beach is Cabbage beach on Paradise Island where the Atlantis resort is in Nassau, Bahamas.

Best Luxury Island Destination

Though the Bahamas may not have won the record for having the best beach, it did consistently win for being the best luxury island destination in the Caribbean.

Probably the most notable luxury spot in the Bahamas is the Atlantis resort on Paradise island.

Other Islands

I’m sure there are many other islands with very nice beaches. Some may even be better than the ones mentioned above, but they may be so remote that they would be difficult to get to. You may think that the U.S. and British Virgin Islands (U.S.V.I and B.V.I.) have nice beaches, but from my personal experience visiting them, they are nowhere as nice as the ones mentioned above. There is one beach on Sint Maarten however that is nice and very unique and attractive among tourists. It’s the Sint Maarten Airport Beach or Maho Beach, where the airport landing strip is literally right next to the beach.

The airport runway is half the length of typical runways, so airplanes have to land close to the start of it to avoid overrunning the landing strip.

Tourists love taking photos of themselves standing right below a plane coming in for a landing.


The best time to go to the Caribbean is during the winter months when the temperature isn’t too high and rainfall is low. Below are average temperatures and rainfall by month for the Bahamas, Turks & Caicos, and Sint Maarten.

The Bahamas

Turks & Caicos

Sint Maarten

And since many cruises depart from Miami, it may be worth it to spend a few days in Miami before or after the cruise. The weather is Miami similar to that in the Caribbean.


Based on the graphs above, it would appear that February is the best time to go.

Humidity and Heat Index

Note that the Caribbean has a humid climate, and high humidity actually makes you feel hotter than in low humidity climates. The heat index is a measure of how hot you feel when taking into both temperature and humidity into consideration. Learn more.

In Nassau, Bahamas,

  • On average, September is the most humid month, at 81.0%.
  • On average, April is the least humid month, at 74.0%.
  • The average annual percentage of humidity is: 78%

According to this heat index calculator, if the temperature is 79 degrees and the humidity is 78%, then the heat index is 82 degrees Fahrenheit.


You can easily find flights from Miami to the Bahamas, Turks and Caicos, and Sint Maarten. Below are non-stop flights to each country, flight time, and cost for travel in February 2024.

DestinationTravel TimeCost
Nassau, Bahamas1 hr 10 min$262
Sint Maarten3 hr$400
Turks and Caicos2 hr$200


The Caribbean is a popular region for cruises. Many cruise lines go to all 3 countries mentioned above. But, cruise ships don’t necessarily dock at the specific islands mentioned above. Here are the cruise ship ports of call for each country.

CountryPort of Call
The BahamasNassau City, New Providence Island
The BahamasPrincess Cays
Turks & CaicosGrand Turk
Sint MaartenSint Maarten

In particular, note that Grand Turk is an island in Turks & Caicos that is very far from Providenciales island where the best beach (Grace Bay Beach) is. You’d have to fly from Grand Turk to Grace Bay Beach.

If you are looking for a cruise ship that goes to these islands, you can do a search from sites like where you can specify search criteria like

  • month (January, February)
  • ports of call (Nassau and Grand Turk)
  • etc

The cruise line that primarily goes to Grand Turk is Carnival. Following are some cruise itineraries that meet the criteria above.

Ship: Carnival Magic – 6-Night Cruise

Sun Feb 18, 2024 – Sat Feb 24, 2024

Feb 18, 2024Miami3:30 PM
Feb 19, 2024Fun Day At Sea
Feb 20, 2024Grand Turk, Turks & Caicos8:00 AM5:00 PM
Feb 21, 2024Amber Cove, Dominican Republic8:00 AM5:00 PM
Feb 22, 2024Fun Day At Sea
Feb 23, 2024Nassau8:00 AM4:00 PM
Feb 24, 2024Miami8:00 AM

Ship: Princess Cruises – 14-Night Cruise

Feb 11, 2024Fort Lauderdale (Port Everglades), Florida3:00 PM
Feb 12, 2024Princess Cays, Bahamas9:00 AM4:00 PM
Feb 13, 2024Cruising
Feb 14, 2024Ocho Rios, Jamaica8:00 AM4:00 PM
Feb 15, 2024Georgetown, Grand Cayman, Cayman Islands7:00 AM4:00 PM
Feb 16, 2024Cozumel, Mexico10:00 AM7:00 PM
Feb 17, 2024Cruising
Feb 18, 2024Fort Lauderdale (Port Everglades), Florida7:00 AM3:00 PM
Feb 19, 2024Princess Cays, Bahamas9:00 AM4:00 PM
Feb 20, 2024Cruising
Feb 21, 2024San Juan, Puerto Rico9:00 AM10:00 PM
Feb 22, 2024St. Thomas, U.S. Virgin Islands8:00 AM5:00 PM
Feb 23, 2024Cruising
Feb 24, 2024Cruising
Feb 25, 2024Fort Lauderdale (Port Everglades), Florida7:00 AM

Cruise Line Private Islands

Some cruise lines bought or made islands just for their passengers. Since the islands were custom-made for tourists, they have many tourist benefits that you may not find on other islands. Following are some notable islands.

Ocean Cay, The Bahamas: MSC Cruises

This island is located on a former sand extraction site. MSC Cruises owns it. It’s located pretty close to Miami.

Google Maps’ satellite view shows a lot of beaches with turquoise water.

There’s a beach right by the port where the cruise ship docks. If you want calm water and are afraid of accidentally being pulled out to sea, you can swim between the two beaches at the lagoon.

View hi-res version of this photo

Perfect Day at CocoCay, Bahamas: Royal Caribbean

This island is owned by Royal Caribbean and is exclusively for Royal Caribbean guests. The Google Maps satellite view may make you think the water isn’t turquoise, but it’s deceiving. Many photos show that the water is actually very turquoise. Note that the pier can accommodate two ships, so if you want to avoid crowds, try to find a trip when only your ship will dock there.

With so many activities and attractions, CocoCay looks more like an amusement park. Some activities and amenities include

  • waterpark with slides and a wave pool
  • private over-water cabanas
  • freshwater lagoon
  • 1600-foot-long zipline
  • helium balloon ride

Learn more

View Map (PDF)

Castaway Cay, Bahamas: Disney Cruise Line

Castaway Cay is owned by Disney. Most of the island appears undeveloped. The water by the pier seems to be pretty turquoise.

According to the Disney map, the only developed area is by the pier. It’s nice how they have a breakwater barrier to keep the water calm and to block you from accidentally getting pulled out to sea.

Half Moon Cay, Bahamas: Holland America Line

Below is a satellite view of Half Moon Cay, also called Little San Salvador. Only 3% of the island has been developed for cruise passengers. The color of the water looks pretty good. You will find a 2-mile-long powdery white sand beach and a rugged coastline beyond. There is a natural lagoon called Bone Fish Lagoon that is a breeding ground for sharks, turtles and bonefish.

One interesting activity you can do there is ride a horse in the water.

Great Stirrup Cay, Bahamas: Norwegian Cruise Line

Great Stirrup Cay is located next to Perfect Day CocoCay.

Labadee, Haiti: Royal Caribbean

This destination offers some interesting activities. You can go to the mountaintop for a ride on the alpine Dragon’s Tail Coaster. The thrilling descent begins with panoramic views of Labadee from 680 feet above the coastline atop Santa Maria’s lookout mountain. On the way down you’ll reach speeds of 30 miles per hour and zip through 360-degree twists and turns.

There is also a zip line and Superman-style flight line that both let you soar a half mile over the water.



There are many activities you can do when visiting Caribbean islands, including


When snorkeling, it would seem better to wear a full-face snorkel mask and a snorkel vest. The mask will give you better visibility and you don’t have to keep your mouth closed. The snorkel vest will easily keep you afloat while allowing your face to be submerged in the water. A life jacket, unlike a snorkel vest, will keep your head above the water, which is not what you want for snorkeling.

Full-face snorkel mask
Snorkel vest

Power snorkeling

Lounging in the water

Whether in a swimming pool or at the beach, these inflatable hammocks are great as they keep your head above the water but your body in it.

Jet ski tour

Explore the island by scooter

Catamaran tour


Ride a banana boat

Cruise around in a seabob

Mini Personal SUB

Other activities include

  • Snuba (with an “n”) diving
  • Scuba diving
  • Fishing
  • Horseback riding in the water
  • Dune buggy tour
  • Swimming
  • Playing at a water park with slides and wave pool
  • Exploring the island by foot, bike, scooter
  • Ziplining
  • Kayaking

Sint Maarten/Saint Martin

This island of Sint Maarten/Saint Martin is shared by 2 nations. Sint Maarten is Dutch and Saint Martin is French. It is the smallest inhabited island in the world. The entire island is just 37 square miles.

Some things to do there include


At Maho beach, you can watch commercial jet planes fly really low over your head as they come in for a landing.

The Royal Islander Club Resort La Plage is located next to the airport landing strip and has access to the beach where planes directly fly over.

Soualiga  Sky Explorer

The Sky Explorer is a chairlift attraction in St. Maarten. The ride is approximately 25 minutes long and takes riders to the top of Sentry Hill, the highest elevation in St. Maarten. The ride spans 2,997 feet and includes two lifts.

Flying Dutchman

The Flying Dutchman is the world’s steepest zip line! You’ll be attached to a flight line in a secure harnessed chair, launching you on the 1050-foot drop in elevation over 2800 feet to experience the ride of a lifetime.

Sentry Hill Zip Line

Schooner Ride

Melange Grill

This restaurant is similar to Brazilian BBQ and Korean BBQ.

  1. Select your Appetizer
  2. Choose your Salad
  3. Enjoy a continuous flow of grilled meats and Seafood right at your table with an assortment of sauces and sides !!

Horseback Riding (1-hour tour)

Lucky Stables at Seaside Nature Park offers a wide variety of tours and trail rides. Ride horses peacefully along one of the many trails that span this beautiful island. Or, ride into the sea with your horse and treat the animals to a cooling swim in the ocean!

Hiking Tour

The many trails at Seaside Nature Park can be explored easily with some water and sturdy hiking shoes while sharing in the extensive knowledge of a professional guide about the flora, fauna and history of the park.

Price starting at $ 10 per person per hour.

Guana Bay hiking tour: $39

Explore the boardwalk

Segway Tour

Explore the boardwalk by segway.

Jet Ski Tour

Jet Ski 30 min = $60
Jet Ski 60 min = $120
Jet Ski Tour 2 hours = $200

E-bike Tour

ATV Tour

Itinerary for Maximum Activities

People have different preferences when it comes to vacation. Some may want to just be a beach bum. Others may want to just do casual sightseeing. For me, I want maximum activity options and clean, turquoise beaches with fine white sand. I also want to go on a cruise because that in and of itself is an experience full of on-board fun activities. Since it’s not possible to cruise to the best beach in the world, Grace Bay Beach in Turks and Caicos, and since Perfect Day at CocoCay is the most developed cruise-owned island full of convenient vacation activities, I think my preferred itinerary would include Perfect Day at CocoCay. And since Nassau is nearby, is a common cruise port of call, and is a popular destination, it would also be on my itinerary. Sint Maarten is one particular island with a lot of fun activities as well, but it may not be possible to find a cruise that goes to all 3 locations. Plus, spending one day at Sint Maarten is likely not long enough. So, I think my preferred itinerary would be

  • Flight: Home > Miami (spend 0 to 3 nights)
  • Cruise:
    • Miami
    • Nassau (Atlantic AquaVenture, Cottage Beach, Downtown)
    • Perfect Day at CocoCay
    • Day at Sea
    • Miami
  • Flight: Miami > Sint Maarten (2 or 3 nights) > Miami
  • Flight: Miami > Home (spend 0 to 3 nights)

Here’s one actual itinerary.

4 Night Bahamas & Perfect Day Cruise

Ship: Royal Caribbean Freedom of the Seas

Mon, Feb 12, 2024Miami4:30 PM
Tue, Feb 13, 2024Perfect Day at CocoCay7:00 AM5:00 PM
Wed, Feb 14, 2024Cruising Day at Sea
Thu, Feb 15, 2024Nassau, Bahamas8:00 AM5:00 PM
Fri, Feb 16, 2024Miami6:00 AM

Pricing by Room Category:

Outside View$422

Note that the balcony is pretty small.

Atlantis Resort

  • Hotel room: Minimum 2-night stay: $270 – $359 / night.
  • Day Pass: $190 / person

There’s a hack to get access to Atlantis without spending 2 nights and paying a high price. If you stay at the Comfort Suites on Paradise Island, Bahamas, you’ll have full access to Atlantis, which is just a 3-minute drive away. As an example, the cheapest cost to stay at Atlantis on February 19. 2024 is $363 / night with a minimum 4-night stay. The cost to stay at Comfort Suites on the same dates is just $246 with no 4-night-minimum restriction.

Cruise Ports

Some cruise ports can accommodate multiple ships at the same time. The more ships there are, the more crowded the place will be. Therefore, it’s preferable to choose a trip with the fewest ships at your scheduled ports of call.


As you can see, the port at Nassau can accommodate up to 5 ships.

For the itinerary above, the ship “Freedom of the Seas” is scheduled to dock on Feb 14, 2024. The Nassau, Bahamas cruise terminal website shows the schedule by month. Here’s the schedule for February 2024. Unfortunately, it looks like the terminal will be full of ships that day.

Perfect Day at CocoCay

Perfect Day at CocoCay is owned by Royal Caribbean, so only their ships can dock there. The port is smaller. It can accommodate a maximum of 2 ships. For the itinerary above, the ship “Freedom of the Seas” is scheduled to dock on February 13, 2024. According to, there will be 2 ships that day.


Since many cruises depart from Miami and Miami itself is an interesting destination, it makes sense to spend some time there before or after going on a cruise.

Following are some things to do when visiting Miami.

Miami Hop-On-Hop-Off Bus

Go on a double-decker, open-air hop-on-hop-off bus and be taken around many of the tourist spots. This is an easy way to see a lot and get a sense of the area. Afterwards, you can spend time at individual spots you are interested in. There are many tour bus operators. BigBus, shown below, is just one of them.

Day Tour (Red Loop): $43

Stop #Location
1Bayside Marketplace
Island Queen Millionaire’s Row Cruise
Skyviews Miami
Miami Beach Boardwalk
2South Beach
Big Pink (restaurant)
Miami Beach Boardwalk
3Soundscape Park
Espanola Way
Museum Of Illusions
Miami Beach Boardwalk
4Indian Creek
Miami Beach Boardwalk
5Mid Beach / RIU Hotel
Miami Beach Boardwalk
6North Beach / Fontainebleu & Lexington Hotels
Miami Beach Boardwalk
7Design District / Midtown
8Wynwood Walls
9Downtown / Holiday Inn
Bayside Marketplace
Thriller Miami Speedboat Experience
10Little Havana
Learn more

Wynwood Walls

Unique outdoor destination featuring huge, colorful street murals by artists from around the globe.

Bayside Marketplace

Enjoy a drink along the water (or on it), snagging a seat at one of Bayside Marketplace’s big-name restaurants or setting off on a sunset cruise touring Biscayne Bay’s islands.

Lock & Load Museum

Look at all sorts of guns and practice shooting some.


Art + Technology Museum

Superblue Miami Immersive Art Experience

Explore a mirrored labyrinth, see digital worlds immersed in seasonal flowers and waterfalls, and watch your own heartbeat as it glows with 3,000 lights.

Airboat Everglades Tour

Thriller Miami Speedboat Experience

Learn more

Yellow path is Thriller Miami Speedboat Route

Jet Ski Tour

Wings Over Miami Air Museum

Skyviews Miami Observation Wheel

Miami Beach

Explore Miami Beach / South Beach by E-Bike or Segway

Fat tire e-bikes can ride on sand.

E-bikes are prohibited on all sidewalks in Miami Beach, including along the Beachwalk. They are also prohibited on South Pointe Park and Pier, Marina Baywalk, and Lincoln Road Mall.

However, Florida state law allows e-bikes to be operated in the same locations as regular bicycles. This means they can be ridden on: Roads, Bike lanes, Bike paths, Multi-use paths, Sidewalks.

If your e-bike is class 1 (or maybe 2) and limited to 20mph, you should be legally allowed on the beach.

Florida allows all classes of e-bikes, including Class 3 e-bikes — provided they don’t exceed speeds of 28 mph. The bike also can’t have an electric motor power with a wattage exceeding 750.

Miami Beach also has 11 miles of green bicycle lanes.

Free Miami Beach Trolley

From 8 a.m. to 11 p.m., 7 days a week at approximately 20-minute average service frequency along each route.


  • North Beach Loop
  • Middle Beach Loop
  • South Beach Loop (A and B)
  • Collins Express

Millionaire’s Row™ Cruise

Explore Miami aboard a fully-narrated bilingual sightseeing cruise along scenic Biscayne Bay – a top-rated thing to do in Miami! Cruise around Biscayne Bay and see the spectacular coastal sites including the beautiful downtown Miami skyline, the Port of Miami, Fisher Island, Miami Beach and “Millionaire’s Row™” – the Homes of the Rich and Famous™.

Learn More

The Phillip & Patricia Frost Museum Of Science

This is a science museum, aquarium and planetarium. The cutting-edge 250-seat Frost Planetarium takes you on visual joyrides that both thrill and educate. Though it might seem like you’re really hurtling through space or weaving through a coral reef or DNA strand, that ultra-real immersive experience is the result of a 16-million-color 8K visual system using six 3D-capable projectors and surround sound. The dome is tilted forward at 23.5 degrees, allowing its 67-foot span to fill your field of vision as if you’re flying—imagery comes at you from above, below and the peripheral edges, creating a nearly 360-degree view of whatever world you’re in.

Learn More

Espanola Way

Española Way is a historic street in Miami Beach, Florida. It’s located between 14th and 15th Streets, between Washington Avenue and Pennsylvania Avenue. It’s a pedestrian-only street with shops, galleries, restaurants, and bars. 

Museum Of Illusions


Experience stunning 3D illusions and art at the Museum of Illusions in Miami. Capture memorable, interactive photos and have fun with friends and family.

Lincoln Road Shopping District

Miami Beach’s Lincoln Road is one of the most unique shopping districts in the world,  full of stunning architecture, world-class culture and destination retail stores spanning 8 blocks.


How to Clearly Explain Website Update Requests

If you’re a non-technical person who is part of a marketing team working for a company that depends a lot on a website, chances are you will often need to ask a team of web developers to make website updates for you. Your particular website may not be easily updated using a content management system (CMS), and even if it could, many non-technical people would rather just send an email to request their website changes. Asking developers to update a website is fine, but only if the update requests are clear. Otherwise, the requestors risk wasting their time and other people’s as well. Unfortunately, the reality is most people don’t know how to clearly communicate their change requests. There are many website annotation tools that claim to be able to simplify the communication process, but in real-world situations, I haven’t found any that were good enough. Plus, adding a new tool requires learning something new, which many people are unwilling to do or don’t have time for.

In this post, I’ll share one approach that non-technical people can use to easily and clearly communicate website change requests to minimize misunderstandings, delays, and lots of back-and-forth messages. And since most people already know and are comfortable using MS Word or Google Docs, this approach only requires a word processor.

Website Sections

Most websites contain a vertical series of sections. For example, Adobe has a product page for its video editing software, Adobe Premier. This web page can easily be divided into a bunch of sections.

Change Request Doc

Since a picture is worth a thousand words, it’ll be a lot easier to show a screenshot of a section of a web page rather than try to explain the section using words. And since you may want to move some sections around, it’s helpful to number each section. And since you may collaborate with other people in requesting website changes, we’ll use MS Word or Google Docs for our change requests. I’m going to use Google Docs because I find it easier to use.

  1. Create a new Google doc
  2. Give it a name like “Adobe Premier Product Page Changes”.
  3. Change the page margins to 0.25″ on all sides
  4. Under View, uncheck “Show print layout” if it is checked.
  5. At the top of the doc, put the URL to the page, e.g.
  6. Insert a table containing 3 columns and 20 rows.
  7. In row 1, cell 1, enter “#”
  8. In row 1, cell 2, enter “SECTION”
  9. In row 1, cell 3, enter “CHANGES”
  10. In the first column, enter a consecutive number in each cell starting from 1 and make it narrow enough just for the numbers
  11. Take a screenshot of each section and paste them in the middle column
  12. In the right column, describe your change request.

Here’s an example.

View the sample Change Request Google Doc.

Israel-Palestine Conflict 2023: Israel Ignores the Rules of War and Behaves Like Their Terrorist Enemy

When terrorists attacked the United States on 9/11 by flying airplanes into the Twin Towers, they killed around 3,000 civilians. In response, the U.S. killed the terrorists, including Osama bin Laden. It took time, but it was done by following the rules of war and by carefully avoiding the killing of innocent civilians.

Read the Rules of War

In October of 2023, Hamas, a Sunni Islamist political and militant organization currently governing the Gaza Strip of the Palestinian territories headquartered in Gaza City, attacked Israel by killing around 1300 civilians and taking about 200 hostages. Israel, the US, and the EU designate Hamas as a terrorist organization, similar to the terrorist organization Al-Qaeda led by Osama bin Laden which was responsible for 9/11.

In response to Hamas’ attack on Israel, Israel responded by

  • calling Palestinian civilians in the Gaza Strip and giving them 10 minutes to evacuate to avoid being bombed
  • dropping 6000 bombs on dense residential buildings in Gaza
  • cutting off electricity, food, water, and fuel to residents of Gaza
  • blocking the border so that Gaza civilians can’t evacuate
  • preventing humanitarian aid from entering the Gaza Strip until the Israeli hostages are released

So far, the result of Israel’s response attack was the death of over 1000 civilians, a big percentage of which were women and children who had nothing to do with Hamas’ attack on Israel. (Update: As of Nov 3, over 9000 Gaza civilians have been killed by Israel).

While it is understandable and completely reasonable for Israel to defend itself and to retaliate when attacked, you’ll notice a big difference in how Israel and the US deal with “terrorists”. Unlike the US, which carefully avoided civilian casualties when going after Al-Qaeda, Israel appears to follow the rule of “an eye for an eye” rather than the international rules of war. The fact that Israel bombed so many buildings while people were sleeping and gave them only 10 minutes to leave is completely outrageous. Israel’s argument was that they were targeting members of Hamas, but for every member of Hamas killed, Israel probably killed 30 or so civilians. To make matters worse, Israel has blocked humanitarian aid from reaching those civilians as if Israel wants the civilians to suffer and die. In the video below, the president of Israel said that the entirety of Gaza, including civilians, was responsible for Hamas attacking Israel. He argues that civilians should have stopped Hamas. His mindset justifies the killing of civilians, including at least 1,000 children. Sadly, when Israel makes these outrageous statements, the international community, including the U.S., says and does nothing. It seems as though Israel is using this opportunity to ethnically cleanse Gaza of Palestinians under the guise of “self-defense”.


The Israeli government has clearly violated the rules of war and its actions are just as bad as the terrorist group Hamas, which they blame for starting the war.

Land Dispute

Everyone knows that the Palestinians have been living in Palestine for a long time. Since Jews in Europe were hated by others, treated unfairly, and even killed, they wanted a land of their own. So, they argued that they should go create their own state in Palestine for 2 reasons:

  1. they believe that God said it was their land according to the Jewish bible
  2. their ancestors lived there 2000 years ago

Both of these reasons are a joke. If someone came knocking on your door and said that they were going to take all or half of your house or your backyard for the reasons above, no one in their right mind, including a reputable court of law, would agree to it. Unfortunately, with the help of the British, Jews were able to just take land from the Palestinians and create the nation of Israel.

What Hamas Should Have Done

What Hamas did on Oct 7 was clearly inexcusable. There’s no justification for the killing of innocent civilians. It’s no wonder why some countries label Hamas a terrorist organization. When violence is used to achieve a goal, it’s hard to get support from the international community. What Hamas should have done is like what the Jews did when they took Palestinian land in the first place. The Jews would not have been successful without the help of the British. Likewise, Palestinians will not be successful without powerful and influential allies. Those allies could be neighboring states like Egypt, Syria, Lebanon, Jordan, Saudi Arabia, Iran, etc. When you have that type of support, war can be avoided. Israel would be under pressure to negotiate and Israel’s allies like the US would support talks over war. If Israel refuses to talk, then the Palestinian alliance could announce that they will peacefully reclaim the land that the Israelis took from them under their “right of return“. Upon exercising their “right of return, if the Israelis fight the Palestinians and people are killed, then the Israelis will be at fault. At that point, the alliance can give an ultimatum to Israel that if Israel doesn’t participate in peace talks to resolve land and governance disputes, then the alliance will retaliate for the people Israel killed. Israel would be surrounded by an alliance of countries supporting Palestine, and Israel would know that they would lose. Under these circumstances, the US and the West would find it difficult to justify supporting a war against an alliance of Arab states.

One-state or Two-state Solution

Some people support a one-state solution where both Jews and Palestinians share the same land. Others support a two-state solution like there sort of is now. I think a one-state solution is necessary to force the Jews and Palestinians to get along. It may take some time, but eventually they will get along. In the US, African Americans and Whites didn’t get along, but eventually they did. To be fair, the government in a one-state solution would have to comprise 50% Jews and 50% Palestinians.

As for the conflict between Saudi Arabia and Iran, they need to put aside their religious differences (Sunni vs Shia) while supporting Palestine.

Improve Music Audio Quality with a Wireless Bluetooth DAC+AMP

There are at least 3 major things that affect music audio quality:

  1. Speakers
  2. Audio source, e.g. mp3 file, FLAC file, etc
  3. Digital-to-Analog Converter (DAC)

Some people may argue that transmitting audio over Bluetooth degrades sound quality, but the reality is the difference is so small that it’s negligible.


Needless to say, quality speakers are necessary to hear music at a higher quality. Don’t expect to hear quality audio from cheap $10 earphones. Since I’m not an audiophile and I’m not interested in spending thousands of dollars just for speakers, I just have what I guess are prosumer speakers. Specifically, I have:

And since it makes no sense to buy them at full price, I buy them renewed on Amazon for a big discount because even renewed, they look and function exactly like they are brand new.

The WH-1000XM4 has a better sound stage, but it’s bulkier and leaks audio a lot. Also, it’s not great for working out because I feel it moves around too much and gets in the way of my workout. The WI-1000XM2 is compact, doesn’t leak audio, and can easily rest on my neck when not in use. The problem is when listening to music on my phone, the volume is often not high enough, especially when at the gym or when traveling by plane. This is where having an amplifier (amp) takes care of volume issues.

Audio source

I’ve dabbled with lossless FLAC files, but when compared to high-bitrate mp3 files, I personally can’t notice a big enough improvement to justify the cost and huge file size. I’m okay with mp3s as long as the bitrate is high enough. I normally just buy mp3s from Amazon Music. Don’t expect to hear quality audio from low-bitrate mp3s, though. The compression is too lossy.

Digital-to-Analog Converter (DAC)

Chances are you probably listen to music from your phone and sometimes from your laptop like me. The problem is the converters in them that convert digital audio signals to analog signals are likely of low quality. I have the Google Pixel 4a 5G smartphone. It’s a mid-range phone. But even if you have a high-end phone, the digital-to-analog converter (DAC) is most likely not as good as a dedicated DAC. Fortunately, there are small Bluetooth DACs that are lightweight and can clip onto your shirt. I tested the EarStudio ES100 MK 2 ($60 renewed, $80 new on Amazon).

When comparing the audio quality with and without this DAC, it’s clear that the DAC makes a decent, if not big, difference, depending on the song I’m listening to. The DAC is also an amplifier and can increase the volume to levels higher than I’d ever need it to be. It didn’t come with an aux cable, so I bought a short 4-inch one. The setup might seem complex, but it’s not that bad, especially if you’re just sitting for a long time, like on a long flight.

Instead of pairing your head/earphones to your audio source (phone, laptop, etc), you pair the DAC to it.

Though it has volume controls, I find it easier to adjust the volume from the phone app. It’s recommended to set the source volume (phone or laptop volume) to max and to adjust the analog (DAC) volume. The app has a lot of options and clear explanations, but I find the default settings to be sufficient.

Host PDFs in AWS CloudFront CDN and Enable Redirects Using CloudFront Functions & Lambda Functions

Many website files include PDFs. These PDF files are usually much larger than other file types and can take up a lot of space. You may want to keep all website files like images and PDFs (binary files) together with your HTML, CSS and JS files (text files) and put them all in version control, like GitHub, but there are downsides to this:

  1. Git version control is designed for text files, not binary files. Even though you can use Git LFS so you can version your binary files, there are simpler, better alternatives.
  2. Website images are better served from an image CDN like Cloudinary or ImageKit. These services will automatically and quickly optimize images on the fly.
  3. PDF files are better served from a CDN. Amazon AWS S3 can be used to store your PDFs with versioning and AWS CloudFront can serve those PDFs from a CDN. With CloudFront, you can also write a function to redirect one PDF file to another in case you need to delete a file.

As of this writing, the AWS CloudFront CDN has 218 global edge locations.

The steps below describe how to set up AWS S3 and CloudFront to host PDFs and to set up redirects.

Note: you can create redirects using AWS Lambda functions (launched in 2017), but they are more complicated and cost 6 times as much as the cost of CloudFront functions (launched in 2021). Learn more.

1. Create an S3 bucket

Log in to the AWS console, go to S3, and click “Create bucket”. Choose a bucket name like “pdfs”.

Since you want people to be able to access the PDFs, uncheck “Block all public access” and check “I acknowledge that the current settings might result in this bucket and the objects within becoming public.”

If you want, click the radio button that enables versioning

Ignore the other options, if you want, and then click the “Create bucket” button.

2. Upload PDFs

You can drag and drop your PDFs to upload them. If you have many PDFs, like thousands, then it’s better to use the AWS CLI S3 Sync command.

As a test, I just uploaded 2 PDF files/

3. Create a CloudFront Distribution

In the AWs console, go to CloudFront and click “Create Distribution”. For “Origin domain, choose the Amazon S3 bucket you created in step 1.

For the viewer protocol policy, choose “Redirect HTTP to HTTPS” since that’s a good policy IMO.

Ignore all other options, if you want, and click the “Create Distribution” button.

Now, the PDF files in your S3 bucket will be available in a CDN at the CloudFront domain provided, e.g.

4. Create a CloudFront Function to Redirect Requests

Click on the distribution and then click on “Functions” in the left sidebar.

Click the “Create Function” button and enter a name for the function, e.g. “Redirects”.

You will see 3 tabs: Build, Test, and Publish.

In the “Build” tab, enter the code below and customize as needed.

Note that there is a 10 KB limit on the size of your CloudFront function.

Click the “Save Changes” button and then click the “Test” tab. You will see a field labeled “URL Path” with a default value of “/index.html”.

Since we don’t have a redirect rule for that URL path, we don’t expect any redirection to happen. Click the “Test Function” button. You will see output like below indicated that the response URI is “/index.html” as expected.

Now, change the URL path to one you have a redirect for. In my example code, I am redirecting “/test-pdf-2.pdf” to “”. Click the “Test Function” button. The output shows “”.

Now, publish the CloudFront function. Click the “Publish” tab, then click the “Publish Function” button.

Click “Add Association” to associate the function to your distribution. Choose your distribution in the Distribution field. Leave Event Type as “Viewer Request” and ignore Cache behavior. Click the “Add association” button.

Note that you can only have one CloudFront function for a given cache behavior and event type.

Wait for the function to be deployed. Go back to the function list page and check the status column. It will say “Updating” for a few minutes.

Wait a few minutes. Reload the page. The status should change to “Deployed”.

Now, test out the redirect in production by going to the CloudFront URL of a path you have a redirect for. You should see the redirect work.

Using Lambda Functions

Make sure the location is set to us-east-1.

Go to the Lambda page and click “Create function”.

  1. Enter a name for your function.
  2. Under “Execution Role”, choose “Create a new role from AWS policy templates”
  3. Enter a role name
  4. Under “Policy Templates”, choose “Basic Lambda@Edge permissions (for CloudFront trigger)”. This is IMPORTANT. Do NOT choose “Create a new role with basic Lambda permissions”.

In the “Code” tab, enter the redirect code below and then click File > Save.

In order to test your code, you must deploy it first. Click the Deploy button.

  1. Test your code by clicking the “Test” tab
  2. Choose “Create new event”
  3. Enter a name for the test
  4. Replace the event JSON with relevant test data, e.g.
  "Records": [
      "cf": {
        "config": {
          "distributionId": "EXAMPLE"
        "request": {
          "uri": "/docs/test-pdf-2.pdf"
        "response": {
          "status": "302",
          "statusDescription": "Found",
          "headers": {
            "location": [
                "key": "Location",
                "value": ""

Click the “Save” button and then the “Test” button.

You will either see an error or a success response similar to what’s shown below.

Under “Actions”, click “Deploy to Lambda@Edge”. This will deploy the Lambda function to the CloudFront edge network.

  1. Choose your CloudFront distribution from the dropdown list.
  2. For CloudFront event, choose “Origin Response”.

The green banner will state that the function is being replicated, but that it will take a few minutes to complete.

Go to the CloudFront distribution. You’ll see the status “Deploying”. Wait till it changes to a date/time indicating the deployment has completed.

Invalidate the CloudFront cache for all objects using /*

When the trigger is created, it will create a new Lambda function version. Click on the “Versions” tab and then click the version number to see that the trigger is saved in the version.

You will then see the CloudFront trigger in the diagram and other saved details.

Test the redirect using the cURL command.

If you need to remove a Lambda function from a Cloudfront distribution,

  1. go to the distribution
  2. click “Behaviors”
  3. choose a behavior and click “Edit”
  4. Scroll down to “Function Association” and select “No association” for the function type
  5. Click “Save changes”
  6. Invalidate the Cloudfront distribution using /*

Put Redirect Data in an External JSON File

The instructions above work, but whenever you want to update the redirects, you have to edit the lambda JavaScript function and redeploy it to the Cloudfront edge. The deployment process takes about 5 minutes. To improve this process, we can move the redirect data to a JSON file in an S3 bucket. Then, you can just upload an updated JSON file, overwriting the existing file, and the updated redirects will work immediately. Here’s how to do that.

Create a JSON file containing all redirects like the following and upload it to S3.

  "/file1.pdf": { "to": "/file2.pdf", "statusCode": 301 },
  "/resources/file3.pdf": { "to": "/resources/file4.pdf", "statusCode": 301 },
  ... etc. ...

Add permissions to the lambda function to have read access to S3. Go to Lambda > Functions > and click on the function name. Then, go to Configuration > Permissions > Execution Role > and click on the role name.

A new tab containing the role’s permission will open. Under “Permissions policies”, click on the policy name.

That will open a new tab showing the permissions defined in the policy. Click the Edit button.

A new table will open showing the existing permission. Add the following S3 permissions. Replace “mybucket” with the name of the S3 bucket where you put the JSON redirect file.

"Effect": "Allow",
	"Action": [
	"Resource": [

The entire JSON object may look like this.

	"Version": "2012-10-17",
	"Statement": [
			"Effect": "Allow",
			"Action": [
			"Resource": [
			"Effect": "Allow",
			"Action": [
			"Resource": [

Back at the lambda function page, click on the Code tab and update the code as follows:

Replace the first 3 constant values with your S3 bucket’s region, bucket name and the path to the redirect JSON file.

const REDIRECTS_DATA_REGION = 'us-east-1';
const REDIRECTS_DATA_OBJECT = 'docs/pdf-redirects.json';

Click “Deploy” so you can test the lambda function. Once you verify it is working, go to Actions > Deploy to Lambda Edge. Follow the remaining steps as shown above.



Passing UTM Name/Value Pairs to Specific Links on a Website

Adding UTM parameters to links is useful for tracking marketing efforts, e.g. if you have a banner or an email with links to a landing page, you’ll want to know which method (banner or email) generated the most page visits and form fills. Google has a campaign URL builder that will generate URLs with UTMs for you. In Google Analytics, you can find pageviews to the landing page by UTM parameter. However, if you want to track any subsequent pages after the landing page, then you’ll need a way to pass the UTMs along to the subsequent pages. In my particular situation, I needed to pass UTMs to a 3rd-party site. The visitor flow would be like this

  1. Click a banner on the home page of The banner has UTMs in the query string, e.g.
  2. Land on an overview page on, e.g.
  3. Maybe visit other pages on
  4. Return to
  5. Click a link to register for something on a 3rd-party site, e.g.

By default, only the first pageview of would include UTMs in the URL. To pass the UTMs to the link to the 3rd-party site, something extra needed to be done. I chose the following approach, which works well.

  1. Write JavaScript code that runs on all pages.
  2. If a URL contains UTM params, save the UTM name/value pairs as session cookies, overwriting any existing UTM cookies.
  3. If a page has any <a> tags with the class “appendUTM”, then rewrite the href value by appending the UTM params.

I then added the class “appendUTM” to any links where I wanted to append the UTMs. In my case, it was the links to the 3rd-party registration site.

Below is the code that accomplishes this.

Separating Website Images and Bulk Uploading Them to AWS S3 Using AWS CLI

I recently had to move 35,000+ website images from Git to AWS S3. The images were in many subfolders. First, I had to separate the images from all other files. Then, when I tried dragging and dropping the parent folder containing all images to the AWS S3 web interface, I had to wait 9 to 17 hours.

When I woke up in the morning, I found the upload completed with errors:

Here’s how I easily separated the images from all other files and successfully uploaded all 35,000+ images.

Separate images from other files

First, I wanted to see a list of all unique file extensions so I could know what image file extensions were being used.

find . -type f | sed 's|.*.||' | sort -u

This returned a list like the one below.


Then, I copied the website root folder and made a new sibling folder called website-images where I’d just have the images.

Then, I deleted all images from the “website” folder using the following command.

find . -type f ( -name 'gif' -or -name 'jpg' -or -name '.JPG' -or -name '.png' -or -name '.PNG' -or -name '.bmp' ) -delete

Then, I deleted all non-image files from the “website-images” folder using the following command.

find . -type f -not ( -name 'gif' -or -name 'jpg' -or -name '.JPG' -or -name '.png' -or -name '.PNG' -or -name '.bmp' ) -delete

The last command resulted in a bunch of empty folders. I deleted the empty folders using this command.

find . -empty -type d -delete

I then wrote and ran a NodeJS script to walk through each HTML file and convert each relative path to a path relative to the website root folder, e.g.




Upload all images to S3

As mentioned earlier, uploading 35000 images to S3 using the web interface took a long time and kept completing with errors. What ended up working was uploading the images using the AWS CLI. Here’s how I did it.

Install AWS CLI

Here’s the documentation. I ran the command line installer.

curl "" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

Create an access key

I had to create an access key to authenticate. I created a new Identity and Access Management (IAM) user and then clicked the “Create access key” button to generate a new key.

I ended up with 2 keys similar to the ones below:

  2. Secret access key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Set access key as environment variables

I then saved those key values as environment variables. Here are the instructions. I basically ran the following commands in the terminal, replacing the values with my actual values.

export AWS_DEFAULT_REGION=us-west-2

For the default region, I chose the region for my S3 bucket.

Upload (sync) files

I then uploaded (synced) files from my local to my remote S3 bucket. Here’s the documentation for the S3 sync command. Since I had already uploaded some files, I was hoping to find a flag to skip uploading files that exist at the destination. It turns out that the “sync” command does this by default. I ran the following command in dry-run mode to verify the output was correct.

aws s3 sync . s3://q-website-images/docs/ --dryrun

Then, I reran the command without the dry-run flag.

aws s3 sync . s3://q-website-images/docs/ 

The command output a list of the files it uploaded.

When it was done, I tried rerunning the command only to find that it completed with no output, indicating that all source files already existed in the destination. That was a sign that the sync was complete. Looking at the number of files in the S3 web console, I could see the correct number of files listed there.

Now that the images are in S3, I’ll use S3 as the origin for an image CDN (ImageKit). ImageKit will auto-optimize the images.

Simple Steps for Losing Weight and Building Muscle

Step 1: Determine Maintenance Calories

Your maintenance calories is the number of calories you consume and burn each day to neither lose nor gain weight. Enter your information in this online calorie calculator by the Mayo Clinic. It uses the Mifflin-St. Jeor equation, which pros consider the gold standard.

For me, my maintenance calories is currently 2650 calories per day.

Step 2: Calculate Calories & Protein to Lose Weight and Build Muscle

Losing Weight (Fat)

In order to lose weight by losing fat, you just need one thing: a net deficit of calories. But you don’t want too large a deficit because then you’ll lose both fat and muscle. You should target a deficit of 5 to 10% of your maintenance calories. You can lose weight by just

  • consuming fewer calories without exercising
  • consuming more calories but burning extra calories by doing cardio exercises like running

Whether you just rest or you exercise, your net calorie deficit should be 5 to 10% of your maintenance calories. For me, this value is currently between 2385 and 2517 calories.

Gaining Muscle

In order to gain muscle, you need 4 things:

  1. a net surplus of calories
  2. strength training until failure
  3. sufficient protein consumption
  4. rest (minimum 7 hours a day)

For the calories, you don’t want too large a surplus because then you’ll gain both muscle and fat. You should target a surplus of 5 to 15% of your maintenance calories. For me, this value is currently between 2782 and 3047 calories.

For the protein, you should target consuming 1 gram of protein for each pound of body weight. So, if you weigh 180 lbs, you should consume 180 grams of protein.

The calorie (energy / fuel) surplus is needed to rebuild the muscle you’ve broken down during strength training. Breaking down muscle fibers only happens if you train to failure. The large protein consumption is needed because muscles are made of protein. Muscle (protein) synthesis occurs while you’re sleeping, which is why it’s necessary to sleep enough after strength training.

Target Calorie & Protein Summary
DayCalorieProteinMy Target
Rest or Cardio5-10% deficitAny amount2385-2517 calories,
any protein
Strength Training5-15% surplus1 gr / lb of body weight2782-3047 calories,
180 grams of protein

Studies show that consuming high amounts of protein while in a calorie deficit can preserve muscle mass and accelerate fat loss. Therefore, if possible, consume a lot of protein daily, not just on strength training days.

Step 3: Make a Weekly Schedule

Your weekly schedule would be a combination of resting days, cardio days, and strength training (weight lifting) days. Here’s an example.

MondayRestCalorie Deficit, Extra Protein
TuesdayStrength TrainingCalorie Surplus, Extra Protein
WednesdayCardioCalorie Deficit, Extra Protein
ThursdayRestCalorie Deficit, Extra Protein
FridayStrength TrainingCalorie Surplus, Extra Protein
SaturdayCardioCalorie Deficit, Extra Protein
SundayStrength TrainingCalorie Surplus, Extra Protein

For strength training, you need to wait at least one day in between working the same muscle group, e.g. don’t do chest presses every day. Do them at most every other day because muscle protein synthesis (MPS) takes 36-48 hours on average and working the same muscles during that time will interfere with synthesis.

Step 4: Make a Meal Plan

When it comes to losing weight, you just need a calorie deficit, but you should consume healthy calories, e.g. no processed food, no added sugar, etc. For me, I try to stick to a keto diet, although that’s not absolutely necessary.

When it comes to building muscle, the hardest part will be trying to consume sufficient protein. If you weigh 180 lbs, you need to consume 180 grams of protein. That’s actually hard to do, which is why many people consume protein shakes to supplement their meals.

Here’s a list of protein-dense foods that can help you reach your protein consumption target.

FoodQuantityProtein (g)CaloriesProtein Density
Egg1 large6788%
Egg Whites1 large41822%
Chicken breast15328419%
96/4 beef pattie12515017%
Greek yogurt6 oz159017%
Soy milk1 cup71006%
Whey protein concentrate supplement1 scoop2513019%
Turkey breast2612521%
Premier protein shake13016019%
Kirkland chewy protein bar1101905%

I personally find chicken breast difficult to cook in a short amount of time while still tasting good. So, I opt for packaged options like Lightly Breaded Chicken Breast Nuggets. These have added protein, are easy to cook, and taste decent. Other similar options taste better, but they have less protein and more calories, e.g. Kirkland Signature Lightly Breaded Chicken Breast Chunks, Boneless Skinless.

Example Meal Plan

Target Protein (grams) Consumption (muscle building):180
Target Daily Calorie Consumption (muscle building):2782-3047
Target Daily Calorie Consumption (weight loss):2385-2517

Since the hardest thing is consuming enough protein, the meal plan below will focus on foods that will hit the target protein amount of 180 without consuming an excess of calories. If there is a calorie deficit, you can easily add any kind of healthy food to reach the calorie target.

Food / IngredientUnitProtein (g)CaloriesQuanitityTotal ProteinTotal CaloriesProtein Density
Eggs1 large6784243127.69%
Mozzarella string cheese stick178017808.75%
Premier Protein Shake (Chocolate)13016013016018.75%
Keto Beef Cheeseburger
Keto burger bun1 bun9801980
96/4 lean beef pattie1 pattie25150125150
Cheddar cheese1 slice5901590
Mayo1 tbsp0351035
Ketchup1 tbsp0201020
Protein Shake00
Vanilla greek yogurt1 cup (150 gr)159011590
Whey protein powder1 scoop25130125130
Unsweetened soy milk1 cup6.310516.3105
Creatine powder1 scoop00100
Glucomannan powder1 scoop00100
Frozen berries1/2 cup0351035
Keto Chicken Cheeseburger
Keto burger bun1 bun980198011.25%
Grilled Chicken Pattie1 pattie2012012012016.67%
Cheddar cheese1 slice59015905.56%
Mayo1 tbsp03510350
Barbecue sauce1 tbsp051050
Kirkland Chewy Protein Bar1 bar101901101905.26%
Anything else (pasta, fries, etc)

Step 5: Exercise


For cardio, you can do anything from hiking, dancing, running, biking, etc. If you’re low on time, you can buy a recumbent exercise bike with resistance. It lets you lay back and exercise in a comfortable position. The one below is lightweight and small and costs $178. You can easily put it in your living room and use it while watching TV.

Marcy Recumbent Exercise Bike with Resistance ME-709

Another low-intensity option is to simply walk. A common goal is to target 10,000 steps per day, which is about 5 miles. You can also walk at home while watching TV. Some walking pads can easily be stored and don’t make a lot of noise. This one, for example, comes with the following features

  • optional 3% incline
  • low 45 dB noise
  • remote control
  • large display
  • belt dimensions: 17″ x 48″
  • overall dimensions: 27″D x 50″W x 5″H
  • supports Zwift and Kinomap
  • Speed: 0.6-7.6 mph (~1350 – 17000 steps)
  • foldable
Strength training

For strength training, you should do the following:

  • For each exercise, do 3 sets of 8-12 reps with 1-3 minutes of rest in between
  • For each set, do as many reps until failure (you can no longer complete a full rep)
  • Periodically increase the weights (progressive overload)
  • Ensure you feel stimulation in the target muscle. If you don’t, then you may be doing the exercise wrong and you will see limited results. Some call this the mind-muscle connection.

When it comes to building muscle, what matters most is volume. For example, both of the following will produce the same results.

Weight (lbs)RepsSetsTotal Volume

While working out, I’ve found the following accessories helpful.

Compression t-shirt

A compression t-shirt helps you see your physique so you can visually see your progress and which areas to target. I use the Under Armour Men’s HeatGear Compression Short-Sleeve T-Shirt.

Bluetooth headphones

Playing certain types of music can be motivating and make exercising more enjoyable. Many people wear bulky on-ear headphones. I prefer in-ear neckband earphones because they don’t move around and are lightweight. They also block out ambient noise pretty well. I wear the Sony Wireless Behind-Neck Headset (WI-C400).

Workout gloves

If you don’t wear padded gloves, you can easily develop calluses (thickened skin that forms as a response to repeated friction or pressure). Lifting weights is much more comfortable while wearing padded gloves.

Step 6: Count Calories

For calorie consumption, you can count calories by adding up all calories for each ingredient or food you consume. Look at the nutrition label on food packaging and/or look at online calorie databases.

For calorie expenditure, don’t rely on a smartwatch. Their calorie tracking can be way off. Instead, wear a heart rate monitor like the Polar H10 Heart Rate Monitor Chest Strap. You can track your calories both on your smartphone and online. Buy it on Amazon.

To see how inaccurate a smartwatch measures calories burned, today I used both my Fossil Gen X watch and the Google Fit watch app to track calories burned. I also used the Polar H10 chest strap. I did strength training for 1 hour and 10 minutes. When I started tracking on my watch, I chose “indoor workout,” and the phone app just started tracking calories, time spent, heart rate, etc. When I started tracking using the Polar H1 app on my phone, I was able to choose “Strength training” before the device started tracking vitals. Once I was done exercising, I stopped both apps. As you can see below, the smartwatch says “Run”, which I guess means it thought I was running on a treadmill. It also says I burned 482 calories. In the Polar H10 app on my phone, it says I burned 759 calories. That’s way more than 482, with a difference of 277 calories. While I was exercising, I had my Bluetooth earphones on. The Polar H10 app would send an audio message like “You are improving your fitness” or “You are burning fat”. It would say the former when I was doing strength training and the latter when I was resting.

Step 7: Measure Progress

Weight Loss Progress

Measuring your weight loss is easy. Just regularly weigh yourself. To automate this, buy a Wi-Fi scale that records and keeps track of your weight and shows a graph of your progress on your phone. I personally use the Withings Body – Digital Wi-Fi Smart Scale with Automatic Smartphone App Sync. If weighing yourself every day, make sure to do it right before bed or first thing in the morning for more accurate results.

Muscle Gain Progress

To track your muscle gain, you’ll need to track your strength training weights, reps and sets for each exercise. Personally, I log my workouts using the free version of the FitNotes app. It’s a simple and easy-to-use app that just works. I can easily see my most recent reps and weights so I can either match or exceed them.

If you are able to lift heavier weights and perform more reps, then you must be building muscle, even if it’s not immediately noticeable in the mirror. You can also try measuring the circumference of different parts of your body, e.g. your upper arm, but that’s a hassle and inaccurate if you measure right after a workout when your muscles are swollen.

Over time, you can compare your strength training limits to see progress. Below is an example showing my actual results.

ExerciseDec 26, 2021March 12, 2022% increaseTarget area
V-bar pushdown5072.545%Triceps
Chest press machine7012071%Chest
Lat pulldown machine9013044%Back
Shoulder press machine407075%Shoulders
Tricep pushdown machine11517047%Triceps
Bicep curl machine6511069%Biceps

Find Pageviews From Custom UTM Parameters in GA4

Google Analytics version 4 (GA4) is quite different than the previous version, called Universal Analytics (UA). GA4 is event-based, and the UI is quite different. If you’ve got a link with UTM parameters like

In GA4, if you go to Reports > Engagement > Pages and screens, you will see stats like pageviews for many pages. You can then filter to just one page like a free trial page by entering the page’s path in the search field, e.g. “/free-trial/”. You can then add a secondary dimension for source and medium. What you’ll end up will be something like this

This may not include the source and medium in your UTM parameters. A better way to get the traffic report based on a specific source and medium or name is by going to Explorations.

Here, you can create a new exploration. In the left “Variables” column

  • give the exploration a name like “Feb 2023 Campaign”
  • add some dimensions like
    • Page path and screen class
    • Session campaign
    • Session source / medium
  • add some metrics like “Views” and “Sessions”

In the middle “Settings” column,

  • drag some or all dimensions from the left column to the “Rows” field
  • drag some or all metrics from the left column to the “Values” field
  • add some filters like
    • Session source / medium contains market
    • Session campaign contains “Feb 2023 Campaign”

You will then see the report on the right.

Here’s the mapping between UTM query parameter and UTM dimension in GA4.

To find the number of clicks on a link with a UTM, go to

  1. Reports > Acquisition > Traffic acquisition
  2. In the primary dimension, choose session source or session medium or session campaign
  3. In the Search field, enter a value for the session source or session medium or session campaign
  4. Choose a date range
  5. Scroll to the right and under “Event count”, choose “click”.

Learn more about GA4 traffic sources

Create a Google Earth Movie/Tour That Flies Along a Path

In Google Earth Pro for Desktop, you can record a tour in real time by clicking the navigation controls or by clicking on saved placemarks. However, unless you are just moving from one point to another, the resulting tour may not be as smooth as you’d like. For example, if you have three placemarks, then as you click each placemark while recording the tour, the transition between placemarks will not be smooth.

To create a smooth tour that appears as if you are flying a plane or drone at a fixed altitude along a multipoint path, you need to create a path in Google Earth. Here’s an example. Let’s say we want to fly along the Las Vegas Strip.

Change Settings

Go to Tools > Options > Touring and change the settings as in this screenshot. Make sure to click the “Apply” button and the “OK” button to save your changes.

Now, click the “Navigation” tag and change the settings to match this screenshot.

Create Path

When adding a path, your mouse pointer will turn into a crosshair and you will need click to add points along your desired path. In this mode, you will not be able to zoom, change altitude, direction or pan by clicking on the screen because doing so would add path points. If you need to move around, you’ll need to use the navigation controls.

When creating a path, I find it easier to have your view facing straight down to the ground like this. In this example, my starting point will be just south of the south end of the Strip before the Mandalay Bay.

Click Add > Path

A dialog window will pop up. We’ll name the path “Las Vegas Strip”. Let’s also specify the altitude we want our flight path to be from the ground.

  1. Click the “Altitude” tab.
  2. Set Altitude to “400m” for 300 meters.
  3. Make sure “Relative to ground” is selected.

Click to add path points

In the screenshot below, you’ll see that I created 3 points. From bottom to top, there’s 2 red points and 1 blue point.

Since I need to pan to the north to add more points along the Strip, I will use the navigation control up arrow to do so.

After adding all the last point (just north of the STRAT), I zoomed out to check the entire path. As you can see, all but the last point are red and the path curves to the right as it goes north.

Now that my path is done, I’ll click the OK button in the path dialog window. That adds the path to My Places.

Since I don’t want to see the white path line / curve, I’ll uncheck the checkbox next to the path name.

To play the path tour, just click the path Play Tour button, as shown below.

If you’re happy with how the tour looks, you can record it by clicking the “Record a Tour” button and then click the Play Tour button.

Then click Tools > Movie Maker to export the video.

Here’s how the video tour came out.