Authorhenrypoon

Running Selenium Webdriver on Bash for Windows

Bash for Windows has been working pretty great for me until I needed to run Selenium Webdriveron it. I quickly learned that it wouldn’t work just work right out of the box, and the set up for it is quite convoluted.

You will need

Bash setup

Install Firefox:

sudo apt-get install firefox

Export DISPLAY variable in ~/.bashrc. Just add this to the ~/.bashrc:

export DISPLAY=:0

Xming setup

Just download it from the link above and run it.

Download geckodriver

Download geckodriver from the link above and put in the /usr/bin/ folder in Bash for Windows.

Running Selenium

Here is a piece of sample Python code I used to setup the web browser. It will setup the browser, open Google, sit there for 10 second and then quit.

import time

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities

def execute_with_retry(method, max_attempts):
    e = None
    for i in range(0, max_attempts):
        try:
            return method()
        except Exception as e:
            print(e)
            time.sleep(1)
    if e is not None:
        raise e

capabilities = DesiredCapabilities.FIREFOX
capabilities["marionette"] = True
firefox_bin = "/usr/bin/firefox"
browser = execute_with_retry(lambda: webdriver.Firefox(
    firefox_binary=firefox_bin, capabilities=capabilities), 10)

browser.get("https://www.google.com")

time.sleep(10)

browser.close()

Coca Cola Museum (Go there with a Pepsi shirt)

We had taken a super early flight out from Guadalajara that morning and had a short layover in Atlanta. Because of the early flight, I was still wearing the Chivas jersey from the day before, which was cool because randomly in the airport I’d see other people wearing the same jersey and we’d acknowledge each other in our mutual support for the Guadalajara team.

During the layover, we went to the Coca Cola Museum. At the ticket counter, one of the staff members randomly approaches me and asks me, “do you want a free T-shirt?”. When anybody offers anybody free anything, the first response is always skeptism and confusion. “What do I have to do?”, I replied. She replies, “WELL, you’ve got a Pepsi logo on your shirt”. The entire time, I never realized the Chivas jersey I was wearing even had a Pepsi logo. Kudos to her for picking that out (or maybe it was the red white and blue colours of the jersey that happen to be the Pepsi colours). At this point, I see the irony, and I take the free T-shirt and put it over my Chivas jersey. Pro tip to everyone going to the Coca Cola Museum: wear something with a Pepsi logo for a free T-shirt.

Inside the museum, they show off a ton of cool advertising/merchandise that Coke has made over the years in different countries. The museum was pretty busy and so it was pretty crowded in a lot of places.

Imagine decorating your living room like this!

This was probably the best part: drinking Coke branded drinks from different continents around the world.

For people into touristy things, then this museum would be a pretty cool place to go!

Photo album here

Spontaneous Trip to Guadalajara and the Liga MX Finals

My Mexican friend, who is an almost fanatical fan of the Guadalajara Chivas football team in Mexico and who also grew up in Guadalajara, asked me, “there’s a good chance that the Chivas will make it into the finals this year. If they do, I’m going to go back to Guadalajara and go to the game. Wanna come?” I replied back, “OK let’s do it”. Three weeks go by and my friend says, “so the Chivas made it into the final!” We bought our plane tickets and flew out two days later. We didn’t even have tickets to the game yet. An American friend of ours even bought his tickets to fly to Guadalajara even before the guy who is actually from there.

Alright, now let’s get the tickets for the game

“Don’t worry about the tickets for the game”, my friend said. Next thing we know, the tickets were all sold out to season ticket holders. Our other friend found some tickets on viagogo, BUT, we didn’t know if they were fake. We needed a new plan. “It’s OK, we can buy tickets off scalpers on the black market”, my friend says. The black market sounded all well and good until the news reported armed robberies occurring where scalpers were robbed of their legitimate tickets which were now worth a couple hundred US dollars, a value that is a large chunk of a typical local’s monthly salary. We could now only rely on the viagogo tickets being legitimate. Then there is me, the clueless foreigner in his country and doesn’t speak any Spanish, who can only helplessly watch events unfold without knowing at all how to help.

In our already not-so-good situation, a representative from viagogo calls us and said that the tickets can only be picked up at 5pm close to downtown. The problem was that the stadium is on the edge of the city and the game starts at 6pm. There was no way to go to the pickup location for the tickets AND get to the game on time because traffic on game day would be terrible. My friend calls the viagogo representative and tells him the situation and guilts him into letting us pick up the tickets earlier by saying how we trusted the company with these tickets and whatnot and the rep agrees to let us pick up the tickets earlier. Whether or not the rep was sincere in that offer we didn’t know. We needed a plan B in case we really had to pick up the tickets at 5pm. This is where our plan got SUPER elaborate. We spent a good hour brainstorming a good plan and this is what we came up with:

The guy who bought the tickets (the American), would have to ride a motorcycle to the ticket pickup location, pick up the tickets, and go to the stadium, while the rest of us would get to the stadium early with a van so that when the bike arrived with the tickets, we could hide the bike inside the van. When his dad heard the plan, he began to scold him saying how crazy it was, and in his scolding, I heard a word come up over and over again. When I looked it up, I found out it was profanity. Awesome! My Mexican friend called all of his connections that he had to see how we’d get our hands on a van and a motorcycle. According to him, “he knows a lot of people, people owe him favours”. The problem with that plan was that the guy who had the van got into an accident (whether or not that was true, we’ll never know), which suddenly broke our whole plan.

Okay, so what if he rode a bicycle to pick up the tickets? He’d have to ride 12km from the pick up location to the stadium in terrible traffic. Not to mention the person riding the bike isn’t familiar with traffic in Mexico (traffic that does not respect bikers), and that most streets don’t have stop signs or lights. Throw in some lack of sleep – the guy would be flying in that morning in an overnight flight from LA. He was up to the challenge. My Mexican friend summarized the whole plan into a PowerPoint, calling it “the story to be told about this amazing adventure”. We wouldn’t be able to execute this plan until the day of the game. In the meantime, my Mexican friend showed me around.

Lake Chapala

Lake Chapala is Mexico’s largest freshwater lake, and for whatever reason, there is a substantial population of Canadian and American retirees here.

Tequila

Got to see some Agave fields (and eat some Agave too!) on a tour at the Jose Cuervo Distillery in a town called Tequila (where the name of the alcohol comes from). I made the tour guide speak English because I was the only guy on the tour who didn’t know Spanish.

Driving in Mexico?!

At one point, my friend’s brother asked me if I wanted to drive. I thought to myself, “okay, so there are no stop signs anywhere, I have no idea where to stop, and based on the driving I’ve seen, nobody really follows the rules on the road”. I drove anyway!

Knowing that I was a complete newb on the road in Mexico, my friend and his brother were both very watchful to make sure I was stopping at the right times. They had practically memorized all the places where cars should and shouldn’t stop. I had no clue whatsoever. I stopped and went when they told me to.

Later on, we saw police cars stopped on the side of the street in front of us. My friends just told me to play it cool and just drive normally. I also realized I didn’t have ID on me, so if I had gotten pulled over or something, I would have had to pay $100 USD just to get out. But luckily, nothing happened.

Picking up the tickets

Now it was time to execute the plan. My friend called the Viagogo rep in the morning and he says that we can pick up the tickets at noon. Okay, so no problem. We went and picked up the tickets while in the back of our minds we were still wondering if the tickets are fake. If the tickets were fake, then our whole plan would be meaningless.

We meet the rep and he gives us the tickets. We closely inspect them, and everything looks good. We were in a bit of a disbelief. Everything seemed too easy. But we wouldn’t know if the tickets were real for sure until we actually go to the ticket counter. At this point, we wouldn’t have to execute our crazy bike plan, and could only wait and see when we got to the stadium. With the couple of hours until the game, we spent some time walking around the city center of Guadalajara.

Touring the city center

Lots of people out and about on a hot day. We went in May, statistically the hottest time of year in Guadalajara.

The local boy/girl scouts were running a recycling campaign or something.

Game time

After lunch, my friend’s dad drove us to the game. As expected, the traffic was real bad. On the way there, as my friend’s dad drove, he says to us that he’s going to break a bunch of traffic rules and not learn from him. He then proceeds to cut a bunch of lanes, crossing the hatched areas on the road, and cuts in in front of people. He even made use of an handicapped sign on his car to get into the parking lot quicker even though he wasn’t handicapped at all (seniors just get those because they’re above a certain age). With his epic driving, we got to the stadium right on time.

Now, the moment of truth. The guard checking the tickets would be the one to tell us if the tickets were real or not. As we got closer, we got more and more nervous. The guard scanned our tickets and waved us through. What a relief. We didn’t need any of our contingency plans after all. Logically, everything went smoother than we could have possibly imagined. Now it was time to enjoy the game!

The entire crowd pretty much supported the home team, and there was a small section of Tigres fans, probably about 50-100 people only. Tons of people waved Chivas flags, and some even waved the French flag because it had the same colours as the Chivas jersey. We all bought jerseys for the game too!

As the game went on, the crowd cheered and chanted, “dale dale dale rebaño!”, which roughly means “let’s go herd [of goats]” (chivas means goats). At one point, when it looked like the Tigres were making a comeback, the crowd cheered even harder. With an amazing 2-1 finish (4-3 aggregate), the Chivas had beaten the Tigres to win their 12th championship!

Celebration

That night, large crowds gathered at the Minerva statue in the city to celebrate the team’s big win. My friend’s dad said he’s never seen the crowd this big in a long time. To celebrate, the dad made us all tequila cocktails (there was probably 3-4 shots worth of tequila in that) before we headed out and had a great time. As the only Asians in the city (my American friend is of Japanese descent), we stood out a lot and people occasionally said random phrases to us in different Asian languages. I guess that’s what happens when two Asians show up with Chivas jerseys!

Last, but not least, the food

My first meal when I arrived in Mexico: Menudo. My friend thought my stomach wouldn’t be able to handle it, because the meat in the soup was tripe. But, nope! Chinese people eat tripe all the time!

Not exactly a meal that I had, but there is a running joke that a guy can take a girl out with roses and a can of Jack Daniels. Once that joke caught on, the store intentionally started putting roses next to the Jack Daniels in the store.

Tacos with carnitas and guacamole? Sign me up!

Lonches. Basically a sandwich with meat inside served with a dipping sauce on the side (can also just be poured onto the plate to let the bread soak). The bread used is a kind local to Guadalajara (birote/bolillo).

Then there are tortas ahogadas. Very similar to lonches. It has a the same bread, but this one is way meatier and the sauce is a tiny bit of spice.

Ceviche! A dish with raw fish cured in lemon/lime with added spices. Can’t say no to seafood!

My friend’s mom also cooked food for us and I totally wish I had taken some pictures of that food. She cooked a pork stew and I wish I knew what was in the sauce! Both parents encouraged me to eat so much and they showed so much hospitality! They kept offering me more and more food until I was super stuffed. Good thing my friend’s brother taught me “estoy bien”! This was definitely one of the best trips I ever had – full of excitement and not just doing touristy things. Having a local show you around really helps!

Link to photo album: here

Why are the days of the week in Japanese named after classical elements?

A random thought stumbled into my mind the other day when I realized that Sunday matched the Japanese word for Sunday is “日曜日”. The “日” part means “sun”. At first I thought it was just a coincidence, then I realized that Monday represented the moon, and in Japanese that’s “月曜日” and the “月” part means moon. Something is clearly going on here. Since the idea of seven days in a week doesn’t originate from Asia, the Japanese days of the week probably just followed western convention, which makes sense. Now when it comes to the English days of the week, the names were originally named by the Romans with the names of the sun, the moon, and the five known planets at the time [1].

Day of the week Latin word (English word)
Sunday Solis (sun)
Monday Lunae (moon)
Tuesday Martis (Mars)
Wednesday Mercurii (Mercury)
Thursday Jovis (Jupiter)
Friday Veneris (Venus)
Saturday Saturni (Saturn)

Now on the other side of the world, the Chinese and the Japanese gave names to these planets using their classical elements (the Chinese and Japanese names are the same). They gave the celestial bodies these names:

Celestial body Chinese/Japanese name Corresponding element
The sun
The moon
Mars 火星 Fire
Mercury 水星 Water
Jupiter 木星 Wood
Venus 金星 Gold
Saturn 土星 Earth/soil

So now, when the Japanese went to adopt the western calendar, they took the base meanings of the days of the weeks by their planets, and used their planet names in their place. So Sunday (from the sun) became “日曜日”, Monday (from the moon) became “月曜日” and so forth. Like this:

Celestial body English day of the week Japanese day of the week
Sun Sunday 日曜日
Moon Monday 月曜日
Mars Tuesday 火曜日
Mercury Wednesday 水曜日
Jupiter Thursday 木曜日
Venus Friday 金曜日
Saturn Saturday 土曜日

Cool, huh?

Jenkins pipeline for Spring with beta and prod stages and deployment rollback

In the past couple of days, I’ve been experimenting a bit with the Jenkins pipeline plugin to create a code deployment pipeline with independent beta and prod stages for a Spring Boot app. I even managed to add rolling back a deployment in case a prod deployment fails! It took me a bit of time to Google my way through how to do everything, so I figure I just lay it all out here in case it helps other people do the same thing.

The nice thing about all of this is that I can push a code change to git, and Jenkins can build it, run through all the tests and then deploy to production automatically.

Layout of a pipeline script

Pipeline scripts are written in Groovy, which is a variant of Java. In general, a pipeline script is laid out like this:

node {
    def SOME_CONSTANT = "whatever"
    ...

    stage('some stage name like Build') {
        // Stuff to do as a part of this stage
    }

    stage('another stage') {
        // More stuff
    }

    ...
}

Each stage represents a stage in the pipeline (e.g. building, beta deployment, prod deployment etc.)

Defining some constants

First, a list of constants can be defined that can be used throughout the pipeline so that if the pipeline script gets reused somewhere, only these constants have to be changed. I’m not aware of anything that lets me reuse a pipeline in Jenkins without copying and pasting the code somewhere else so for now I’ll have to live with copying and pasting.

My project uses Maven so I got Jenkins to download its own copy of Maven that it can use to execute builds and have defined it as a constant. The name I’ve given it in the Jenkins Global Tool Configuration is “Maven 3.3.9” exactly. My project also uses Tomcat so there are some Tomcat specific things in there that may or may not be relevant to your use case.

    
def MAVEN_HOME = tool 'Maven 3.3.9'
    def WORKSPACE = pwd()

    def PROJECT_NAME = "name-of-project"
    def WAR_PATH_RELATIVE = "App/target/${PROJECT_NAME}.war"
    def WAR_PATH_FULL = "${WORKSPACE}/${WAR_PATH_RELATIVE}"
    def TOMCAT_CTX_PATH_BETA = "Tomcat-context-path-for-the-beta-stage"
    def TOMCAT_CTX_PATH_PROD = "Tomcat-context-path-for-the-prod-stage"
    def GIT_REPO_URL = "URL-to-git-repo-ending-in-.git"

Preparation Stage

First, the code has to be retrieved from the repository before it gets built. Jenkins allows storing username/password pairs so that they can be referenced without having to write out the password in plaintext. Jenkins uses a “credential ID” for this.

   
    stage('Preparation') {
        git branch: "master",
        credentialsId: "credentials-ID-stored-in-Jenkins-that-can-access-the-git-repo",
        url: "${GIT_REPO_URL}"
    }

Build Stage

Next, the code must be built and unit tested. “mvn clean install” will do just that (depending on what you want, you can always put in a different maven goal). The junit command is just there to take the resulting XML that gets generated during the build process and posts a graph of how many tests were run for each build.

    
    stage('Build') {
        sh "'${MAVEN_HOME}/bin/mvn' clean install"
        junit '**/target/surefire-reports/TEST-*.xml'
    }

Beta Stage

Once the build succeeds, you’ll want to deploy it to a beta environment, so integration tests can happen. The following happens at this stage:

  1. Get the right credentials to get permissions to Tomcat
  2. Call the deploy method to deploy the war file in Tomcat (more on that later)
  3. If the deployment fails for whatever reason, print out the deployment log for debugging and fail the build
  4. If the deployment succeeds, run the integration tests (the command to do this may differ based on use case)
    
    stage('Beta') {
        withCredentials([[$class: 'UsernamePasswordMultiBinding',
            credentialsId: 'credential-id-for-tomcat',
            usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                // Password is available as an env variable, but will be masked 
                // if you try to print it out any which way
                def output = deploy(WAR_PATH_FULL, TOMCAT_CTX_PATH_BETA,
                        env.USERNAME, env.PASSWORD)
                if (output.contains("FAIL - Deployed application at context path " + 
                        "/${TOMCAT_CTX_PATH_BETA} but context failed to start")) {
                    echo "----- Beta deployment log -----"
                    echo output
                    echo "-------------------------------"
                    currentBuild.result = 'FAILURE'
                    error "Beta stage deployment failure"
                }
            }

        echo "Running integration tests"
        sh "'${MAVEN_HOME}/bin/mvn' -Dtest=*IT test"
        junit '**/target/surefire-reports/TEST-*.xml'
    }

The deploy method is what takes care of the actual deployment to Tomcat, which is how the Jenkins build tells Tomcat about the newly built war file. The deploy method is below (be sure to change the server IP and port). Alternatively, I could have built my project as an embedded jar file, but that has a different challenge in figuring out how to get Jenkins to tell the OS to execute the newly built jar file as a particular user.

  1. Based on the Tomcat context path, decide whether a beta or production deployment is happening
  2. Make a copy of the build war file and add .prod or .beta to the end of it so as to keep the original
  3. Set the Spring profile to use on the newly copied war file (more on that later)
  4. Call the curl command to do the actual deployment to Tomcat (more on that later)
def deploy(warPathFull, tomcatCtxPath, username, password) {
    def envSuffix = ""
    def isBeta = tomcatCtxPath.contains("beta")
    if (isBeta) {
        envSuffix = "beta"
    } else {
        envSuffix = "prod"
    }
    sh script: "cp ${warPathFull} ${warPathFull}.${envSuffix}" 
    setSpringProfile(warPathFull, isBeta)
    def output = sh script: "curl --upload-file '${warPathFull}.${envSuffix}' " +
            "'http://${username}:${password}@localhost:8081/manager/text/deploy" + 
            "?path=/${tomcatCtxPath}&update=true'", returnStdout: true
    return output
}

In the case of my project, I’m building a single war file that does not have a Spring profile (beta/prod) defined. This means that I have to manually define this before I deploy the app to Tomcat since there are some things that differ between beta and prod like database URL’s. To do this, I wrote a method that opens the war file like a zip (jar/war files are zip files) and adds a line to my application.properties to define a Spring profile.

Admittedly, doing this zip file manipulation seems kind of hacky. Alternatively, I could have defined my build such that I had a separate beta build and a prod build to avoid modifying the zip file, but the drawback is that I’d then have to build my code twice.

def setSpringProfile(warPathFull, isBeta) {
    def zipFileFullPath = warPathFull + "." + (isBeta ? "beta" : "prod")
    def zipIn = new File(zipFileFullPath)
    def zip = new ZipFile(zipIn)
    def zipTemp = File.createTempFile("temp_${System.nanoTime()}", 'zip')
    zipTemp.deleteOnExit()
    def zos = new ZipOutputStream(new FileOutputStream(zipTemp))
    def toModify = "WEB-INF/classes/application.properties"

    for(e in zip.entries()) {
        if(!e.name.equalsIgnoreCase(toModify)) {
            zos.putNextEntry(e)
            zos << zip.getInputStream(e).bytes
        } else {
            zos.putNextEntry(new ZipEntry(toModify))
            zos << zip.getInputStream(e).bytes
            zos << ("\nspring.profiles.active=" + (isBeta ? "beta" : "prod")).bytes
        }
        zos.closeEntry()
    }

    zos.close()
    zipIn.delete()
    zipTemp.renameTo(zipIn)
}

A curl command to Tomcat is what actually does the deployment. To deploy a file to Tomcat, do the following below. This will deploy the war file to Tomcat and instantly run it, thus it will be accessible at the given context path.

curl --upload-file 'path-to-war-file' http://username:password@server-address:port/manager/text/deploy?path=/tomcat-context-path&update=true

Prod Stage

The same kind of stuff happens in the prod stage as in the beta stage with a few exceptions. The following happens at this stage:

  1. Get the right credentials to get permissions to Tomcat
  2. Call the deploy method to deploy the war file in Tomcat (except this time it is prod)
  3. If the deployment fails for whatever reason, print out the deployment log for debugging and roll back the deployment
  4. If the deployment succeeds, save the build files, and then the pipeline is finished. Alternatively, smoke tests can be run at this point, but I did not implement this in my project

Rollback is important because if the deployment fails, you don’t want to be stuck with a broken environment. Since build artifacts are saved on successful deployments, these same artifacts can be brought back if future deployments fail. This means they can be redeployed so that the code can be fixed before another deployment happens.

    stage('Prod') {
        withCredentials([[$class: 'UsernamePasswordMultiBinding',
            credentialsId: 'credential-id-for-tomcat',
            usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
                // Password is available as an env variable, but will be masked 
                // if you try to print it out any which way
                def output = deploy(WAR_PATH_FULL, TOMCAT_CTX_PATH_PROD, env.USERNAME, env.PASSWORD)
                if (output.contains("FAIL - Deployed application at context path " + 
                        "/${TOMCAT_CTX_PATH_PROD} but context failed to start")) {
                    echo "Prod stage deployment failure, rolling back deployment"
                    echo "----- Prod deployment log -----"
                    echo output
                    echo "-------------------------------"
                    step([$class: 'CopyArtifact',
                            filter: "${WAR_PATH_RELATIVE}",
                            fingerprintArtifacts: true,
                            projectName: "${PROJECT_NAME}",
                            target: "${WAR_PATH_RELATIVE}.rollback"])
                    deploy(WAR_PATH_FULL + ".rollback/" + WAR_PATH_RELATIVE,
                            TOMCAT_CTX_PATH_PROD, env.USERNAME, env.PASSWORD)
                    currentBuild.result = 'FAILURE'
                    error "Prod deployment rolled back"
                } else {
                    archiveArtifacts artifacts: "${WAR_PATH_RELATIVE}*", fingerprint: true
                }
            }
    }

At the end you get to have something like this:

That pretty much sums up the whole Jenkins pipeline that I’ve been using lately for Spring projects!

Fixing T-Mobile international roaming

T-mobile has awesome phone plans for people living in America to get free international roaming in over 140 countries. For most people, all they’d have to do is flip the switch on their phones that enable international roaming. For a minority of people, there are a few more settings to mess with. In the past year, I’ve had two issues that resulted in me losing my data connection outside of USA and I’m documenting some things below to try since it worked for me – maybe it’ll help some people out.

Check that international data roaming is enabled

Try a different APN

I’m using “T-Mobile US LTE 260”. Not sure if changing this requires a phone restart. I restarted my phone anyway.

Set the APN protocol and APN roaming protocol to IPv4/IPv6

Just tap on the APN you want to change. Hitting the 3 dots will show the save button. Not sure if changing this requires a phone restart. I restarted my phone anyway.

Seoul

My flight back happened to have a 12-hour layover in Seoul, so I got the chance to check out Seoul again. If I had more time, I would have ventured out a bit further. Instead, I just stayed around Myeongdong and got to eat all kinds of street food.

Coming from Hanoi and their warm weather, I walked around in shorts in Seoul even in the cold while everyone was out with their winter clothes. People must’ve thought I was crazy. My flight landed early in the morning too, so I had to kill 2 hours before shops actually opened.

At the time, I had not realized that a massive protest against the government had been happening in Seoul (wiki). If I had known, I would have totally gone there instead!

Myeongdong looking quite festive this time of year!

LINE Friends! This place attracted so much attention from people wanting to take pictures, they they set up a queue for people to line up for photos.

This is Budae Jjigae. It is probably my favourite kind of Korean food. It’s got a spicy soup base, meat, mushrooms, and other things with instant noodles. It’s so simple, but so good.

Street food stand with bacon wrapped sausages, and skewers? How could I say no?

I should have tried these lobster tails. They look so good.

Not a huge fan of dessert, but it looked really cool.

Myeongdong was bustling that day.

The thing I realized that day is that the street market people can haggle in at least 3 languages: Korean, English, and Chinese, as opposed to just the native language, and English like a lot of other places. Good on them for learning all these numbers in different languages!

Link to photo album: here

Halong Bay

Another excursion from Hanoi – 2-day-1-night cruise in Halong Bay! The tour bus picked us up in the morning and we drove for a few hours to our destination. Along the way, we stopped at this sculpture making place. The garden outside was full of marble sculptures that people could buy for some thousands of dollars and get them shipped back to their home country.

After we arrived in Halong Bay, we set sail!

We got to kayak around some of the islands and visit a giant cave in one of them! Apparently my camera was so bad that all my cave pictures were blurry =/

The chefs on the boat crafted this masterpiece.

At night, we just chilled with the other travellers while looking at the night sky. It had been a while since I’d been anywhere remote enough to actually see a starry night.

The next morning, we were taken a fishing village on the water. They had a fishing boat on display and were explaining the various features of it. The fisherman can even sleep in the boat and has a way to cook on it. He can basically live out on the water.

Next, we went on a boat ride to an oyster farm.

At the oyster farm, the guide explained the process of how pearls were farmed. As a demonstration, the guide asked one of the travelers to randomly pick an oyster out of the tank. The guide took it out and immediately killed it and extracted the pearl and the rest of us immediately wondered, “did she just murder that oyster just to show us there was a pearl inside?” Kind of a waste of an oyster, but okay.

That night after the tour ended and we were all back in Hanoi, we randomly bumped into some of the British travellers that we went on the cruise with. We all went barhopping and bonded over our mutual dislike of the Trump presidency and Brexit. It was real fun!

Link to photo album: here

Perfume Pagoda

From Hanoi, we made a day trip to the Perfume Pagoda, a complex of Buddhist temples. The temples were in quite a remote area and it would have been really hard to get to these places without an organized tour. The tour bus first took us to a pier where we all got on small six person boats. Each boat was paddled by a lady, and they each paddled for an hour to go 4km. It was kind of nice to get away from the city a little bit – no more smelling exhaust and bad air.

Interesting way to paddle a barge…

Outside the Thien Tru Pagoda in the rain.

I think this was the first time I ever went to a Buddhist temple in Asia.

I think this was the place where the monks are buried.

Next, we hiked up a mountain to get to Huong Tich Cave. The cave itself is also a religious site.

Pretty amazing how the cave formed naturally over time.

Outside the entrance to the cave.

To go back, we took the same boat paddled by the same lady. Along the way, we came across a man fishing in the river. It’s just so different here compared to the lives we are used to in North America.

Link to photo album: here

Hanoi

With one week of vacation left at my job for this year, I decided to go to Hanoi, Vietnam! I chose Hanoi for a couple reasons: somewhere I’d never been, somewhere I’d like to go, and I can get cheap airfare. My plane tickets there and back only costed $630 USD through Asiana Airlines.

The weirdest part about boarding the plane: all the flight attendants just assumed I was Korean and spoke Korean to me, but changed to English for anyone that didn’t look Chinese/Japanese/Korean. I guess better to do that than to wrongly assume and speak English to actual Koreans. What’s cool about a Korean airline is that they serve Korean food like Bibimbap too. Oh, and they also asked me if I had a Samsung Galaxy Note 7. I guess that makes sense. Exploding plane… not good…

I arrived in Hanoi at night, and after a terrible night of jet lagged sleep, my adventure began.

Crossing the street on busy streets without traffic lights

Probably the biggest WTF moment I had was when I noticed that there are exactly zero traffic lights at intersections and there’s like a hundred people on mopeds crossing these intersections. People here are somehow magically able to weave through each other while crossing the intersection. People crossing the street just walk at a constant pace and just let the drivers drive around them.

The first time I crossed the street, it was like a giant leap of faith. As I’m crossing the street, I’m thinking “I wonder if this is what it feels like to know your life is about to end”. After I crossed, I thought, “Oh that wasn’t so bad”. But then there are like a dozen more intersections to cross before getting to the destination. After a while though, it definitely got easier.

There’s so many people here and the air pollution is epic

I thought I was used to large Asian cities (e.g. Hong Kong, Tokyo, etc.), but Hanoi is on a different level. The average population density of Hong Kong is about 6000 people/square km, but in Hanoi, it’s about 15000. For some reason though, it doesn’t seem like there are as many people walking around as in Hong Kong or Tokyo. Maybe it’s because they’re all driving their mopeds. It’s so crowded here that some people live in front of an unused railway track.

The streets are way less spacious too. People are always selling stuff on the side of the street, or people are parking their mopeds everywhere, so it makes it really hard to just walk in a straight line along the sidewalk. And as you’re walking, you’re constantly smelling exhaust.

Lots of cheap stuff

The street markets are often selling cheap knockoffs of things. People on the street were selling tons of North Face jackets. Apparently, they are made in Vietnam, but I have no idea whether or not the jackets here are real though, but they sure felt real. And they only cost $35 USD. I picked up two football jerseys for Bayern München and Borussia Dortmund for about $5 USD each. Dong Xuan market is another place selling tons of cheap stuff. Stores are tiny, but full of merchandise stacked up and the walkways are super narrow, but to our western standards, everything is super cheap. This is a city where a regular guy like me can walk into a Louis Vuitton store without being judged by all the people working there.

I almost bought this “Lepin” Millenium Falcon for $40 USD. The lady wouldn’t budge on her price =/.

On weekends, there’s a night market selling more cheap stuff.

They’ve got a really cool lake in the middle of the city

It was definitely the most scenic part of Hanoi that I went to.

On weekends afternoons and nights, everybody is going to Hoan Kiem Lake to hang out with their family and friends.

I wanted one of these electric cars as a kid…

Literally everybody came out to hang out that night.

At night, the lake lights up real good.

Of course, there’s the food

A while ago, there was a story about Barack Obama and Anthony Bourdain eating dinner in Hanoi. Since that happened, the restaurant they went to, Bún chả Hương Liên, became famous and tons of people went there to eat the “Obama Special” – Bún chả and spring rolls. A local guide we met later in the trip told us that this restaurant is overrated, but I thought it was good. Thanks Obama!

There was also this barbecue place. There’s a giant selection of meats with different cuts and you pick which ones you want and it all gets cooked on a giant barbecue platter. Aside from the usual beef, chicken, pork, they had an entire frog. Looking back, I should have ordered it. Frog is definitely up there on my list of delicious exotic meats. If I knew Vietnamese, I would have asked them if they had dog meat because I would have ordered that for sure. We ended up picking up a few things that looked good, but had no idea what they were. One of them tasted like beef and was kind of chewy and reminded me of beef intestines that I ate in Osaka.

At one point in the trip, we got a volunteer tour guide to take us around the city to eat stuff. We help them practice their English and pay for their food, and they show us around – it’s a pretty cool idea (Hanoikids). Our guide took us to try some fried eel in a salad and some eel soup.

Our guide also took us to eat this Vietnamese version of a steamed rice roll. Not as good as the kind I eat at Dim Sum.

Everybody knows Pho. It’s a lot different than the ones I eat in Vancouver and not very comparable. The ones I ate in Hanoi were generally plainer and was less savoury. It also costs about $2.50 USD. Some people prefer this taste over the kind we get in the western world, but I would disagree.

By far the best meal of the whole trip was at “The Hung Snake Restaurant“. Yep, I got to eat an entire snake – a bamboo snake. A guy came with a sack with a snake inside. He took it out and let me hold onto it to “play” with it before eating. Sure, okay, playing with a snake is great and all, but that thing was frickin poisonous and the entire time, I was just kind of freaked out and hoped that thing didn’t bite me.

The next thing you know, the guy takes out a platter with scissors and knives like in a surgery and cuts open the snake. As it bleeds to death, he drains its blood into a glass, THEN takes out its beating heart and puts it into another glass. FINALLY, he cuts out part of the stomach and drains its stomach bile into another glass. He hands me the glass with the still beating heart and tells me to eat it. It was exactly what I came here for and it was amazing. I only wish I had chewed the heart before swallowing it instead of swallowing it whole like he told me to.

The blood and bile were mixed with some sort of alcohol and I drank those too. My friend on the other hand, could not bear to watch the snake get murdered like that and barely ate any of it when the food actually came. More for me :). All sorts of snake bits were used with different cooking styles: grilled meat, deep fried bones, deep fried skin, snake tail boiled into a soup, sauteed meat, spring rolls, steamed meat, the stomach, etc. Everything was GREAT. A++, would eat again – the king cobra next time.

In addition to snake, I also wanted to try cat meat. I asked the staff at our hostel and he told me that he knew that people did eat that sort of stuff, but wasn’t able to tell me where. Too bad. I also missed out on this silkworm omelette that they only serve in the mornings. Everywhere I saw a cat or a dog, I’d wonder if people would kidnap them and cook them =/

As usual, I drank the local beer. The Beer Corner is a popular place. It was weird to see a kid who looked about 12 pour my beer. Apparently that’s allowed around here.

Their way of life can be very simple

Just some kids playing Tug of War.

Let’s cut some hair on the side of the street.

Unique history and culture

This is a country where for so much of their history, they were conquered by someone: China, France, Japan, etc. The French left behind some of their architecture too.

Since Vietnam is a communist country, of course there has to be a statue of Lenin.

There was also an influence from Confucianism here. Enough for there to be a Confucian temple, which is also the site of the Imperial Academy, the first national university of Vietnam.

How fitting that when we were there, there were groups of students posing for pictures for graduation.

They’re really proud about going up against their enemies and winning

From going to museums there, they are really happy about finally having their own country back again. There were so many exhibits about their triumphs against the colonialists, against the Japanese, and eventually against the Americans. They even claim that the Americans fabricated the Gulf of Tonkin Incident as an excuse to fight in Vietnam. That could very well have been true, but everything just seemed super biased. During the war, the North Vietnamese shot down a B-52, which they proudly display.

There’s even a bit of a B-52 in the water where it crashed. The buidings in the back are also super narrow, which was because buildings were taxed on their width (not sure if this is still the case though).

They also like to point out all the terrible things that their French conquerors did to them at the Prison Museum.

The body of Ho Chi Minh is preserved and displayed in the mausoleum. When we were there though, his body had been transported to Russia for some work, and so it wasn’t on display.

At their military museum, they went on about how they fought a war against American imperialism and showed off the weapons they used. And of course, every time I see a tank, I think “cuz baby you’re a firreeeworkkkkk” and drinking margaritas.

I think that sums up the visit to Hanoi real good!

Link to photo album: here

© 2017 Henry Poon's Blog

Theme by Anders NorénUp ↑