Author Archives: Rex

zsh PS1 setup

macOS Catalina uses zsh as the new default shell (instead of bash) in Terminal. This means that many people will be looking to re-setup their CLI with ~/.zshrc instead of ~/.bash_profile.

While customizing my .zshrc was a hassle, it was also an opportunity to clean up my profile and remove legacy settings.

Zsh offers an optional right side prompt, but I only used the left side prompt for now.

Here are some misc tips that I’ve found helpful:

  • For basic PS1 exports (time/date, current dir, user, etc), you can find examples here. Things like %D for the current date, %~ for the current directoy, and more.
  • In your PS1 export, you can start color formatting with %F{117} and end color formatting with %f. Replace 117 with whatever color your desire. You can find color codes here.
  • You can make your tab auto completion case insensitive (ignore case) by adding:
    zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]}'
    autoload -Uz compinit && compinit -i
  • You can show your current git branch with:
    autoload -Uz vcs_info
    precmd() { vcs_info }
    zstyle ':vcs_info:git:*' formats '(%b)'
    setopt prompt_subst

    Note: you also need to add $vcs_info_msg_0_ in your PS1 export line.

I’ve thought about creating a zshrc WYSIWYG tool, ala Halloween Bash, but I’ve shelved those plans since there’s only so much time in a day. With macOS Catalina inevitable for macOS users, more and more people are going to be looking for easy ~/.zshrc customization.

Kauai, Hawaii Trip Recap

Last month, I was blessed to be able to spend a few days in Kauai (Hawaii) with family. The island is green, tropical, and beautiful.

We stayed at the Grand Hyatt in the south side of the island. The resort was great and there’s plenty of things to do on the south side. Around Koloa/Poipu, where our hotel was, there were lots of great things to eat. We enjoyed shaved ice at Waikomo Shave Ice, where they use fresh fruit. Puka Dog was good, since they combine a hot dog with fruity relish & Hawaiian mustard. Puka Dog is famous since Anthony Bourdain ate there.

On the day with the best (relative) weather, we drove up to Waimea Canyon State Park. The view from the canyon lookout was great, but weather & visibility changes fast. As we were taking photos of the canyon, the area fogged up and we couldn’t see much. We drove to the nearby Kōkeʻe State Park, but we couldn’t see anything due to the fog & rain. As we drove down the mountain, the weather improved and we were able to get decent views from roadside lookouts.

Leaving Waimea Canyon, we stopped at the town of Waimea for lunch. There were plenty of shops, and we enjoyed the Shrimp Station. Heading back towards our hotel, we also stopped at the small town of Hanapepe. Hanapepe’s main street was small, and there was cool Lilo & Stitch art among the shops. Unfortunately, the Hanapepe Swinging Bridge was closed on our visit.

The next day, we went up to the north side of the island (by driving along the east side). We stopped by Opaeka’a Falls along the way, and it was worth it since the double waterfall is easily accessible near the parking lot. We checked out Kilauea Lighthouse, which is cool for bird enthusiasts. The lighthouse was windy and packed with visitors.

After the lighthouse, we headed to Hanalei. The Hanalei Valley Lookout was definitely worth stopping along the highway for a nice view. Hanalei was a cool town with lots of restaurants and shops. Unfortunately it rained a lot while we were there. We ate at Hanalei Bread Company and Wishing Well Shave Ice. Hanalei Bread Company was really popular, but they seem to run out of things. Wishing Well Shave Ice was really good, but we had to dodge the rain. I wish we stayed longer in Hanalei to browse the shops, but the weather was too much. We left to check out nearby Princeville, but Princeville seemed very hostile to visitors as there’s no public parking?

Besides driving around the island, we were able to enjoy our hotel pool & beach. We weren’t able to spend much time exploring the east side, but we did enjoy a plate lunch from Mark’s Place (get the Korean Chicken!). Having stayed on the south side, I would definitely recommend the south side. Kauai was fun, and there were wild chickens everywhere.

Using the MIYA Pro Mac Keyboard

I recently picked up the Ducky MIYA Pro Mac White LED 65% Dye Sub PBT Mechanical Keyboard. This seems to be a rebranded Varmilo keyboard as the cables are branded with Varmilo.

The form factor (tenkeyless) is nice and compact. The lack of numpad on the right gives me much more space for my mouse. As expected from a mechanical keyboard, the sound of the keys is noticeable.

I went with Cherry MX Brown switches. The keyboard typing feel is nice but requires more effort than a flat chiclet keyboard.

I went with this keyboard since I wanted different things: 1.) mac support, 2.) tenkeyless, and 3.) cherry mx browns.

The keyboard comes with an instruction manual in Chinese & English. I find the documentation to be lacking. You’d think a keyboard would be plug and play, but this keyboard is more complicated due to the top row sharing Number keys & Mac media/shortcut keys.

When I got my keyboard, it took me some time to figure out that Fn + A turns the keyboard into Mac mode. Fn + W would change it back to the default, Windows mode. I also had to activate “default mode” (it’s unclear to me what this means) by pressing Fn + D to be able to use the Number keys as numbers and have my Mac recognize the keyboard configuration.

Other things that confused me for a bit was the PgUp & PgDn alternating lights. Apparently one or the other never turns off? This is annoying for someone who values the little details and prefers certain aesthetics. I’ve read online that it lights up (one or the other) to indicate whether the keyboard’s top row is in Numbers mode or Media mode. To switch between the two, it’s Fn + PgUp for Numbers and Fn + PgDn for Media.

To use F1-F12, it’s Fn+PgDn, then Fn+F1 for F1 (and so on through F12).

As a software engineer, it took some time to figure out that Fn + Esc activates the backtick key (`).

Overall, the small form factor & hearty typing key feel are great. It’s unfortunate that a keyboard has a learning curve, but that’s the price to pay for a condensed layout where keys have double or triple duty.

How to install iOS 13 beta (for developers)

With an Apple developer account, you can install the iOS 13 beta. Warning: you should backup your existing device before installing the iOS 13 beta, and “install only on systems you are prepared to erase if necessary.”

From the Apple Developer Download page, you can find the Restore Images. Find your device among the list at https://developer.apple.com/download/#ios-restore-images-iphone-new to download the .ipsw

Next use iTunes & follow Apple’s guide (Installation Using the Restore Image)

  • Make sure you are running the latest version of iTunes on your Mac.
  • Open iTunes on your Mac.
  • Connect your iOS device to your computer with the cable that came with your device.
  • If you’re prompted for your device passcode or to Trust This Computer, follow the onscreen steps. If you forget your passcode, help is available.
  • Select your iOS device when it appears in iTunes.
  • In the Summary panel, hold the Option key and click the Check for Update button.
  • Select the iOS beta software restore image and click Open to start the installation.
  • After installing the beta, your device will reboot and will require a network connection to complete activation.

Follow the on screen instructions and you’ll have iOS 13 beta running on your device.

Note: I ran into an error “Can’t install the software because it is not currently available from the Software Update server”. I waited for my iPhone to fully boot up and I’m able to use iOS 13 beta (despite that error message).

Overall, the experience wasn’t too bad. This is a developer beta and not intended for widespread public distribution. If you are interested in the public beta for iOS 13, you can sign up here https://beta.apple.com/sp/betaprogram/

hiatus

In the past, I’ve tried to post consistently (monthly) and the results have been mixed. I’ve posted some useful tutorials and lots of posts for the sake of posting.

For now, I no longer want to stick to a routine schedule of random content. With some (super minor amount of) time freed up, I’m sure I’ll be able to waste it surfing the web, working on iOS apps, or simply doing life.

I can still see myself posting content (tips, tutorials, observations, etc.) here, but it’ll be more intentional.

Best,
-Rex

iOS Developer iPhone (Dec 2018)

As an indie iOS app developer, keeping up with Apple’s hardware can get expensive fast. From the Mac to the iPhones and iPads.

I’m focusing on native iPhone apps and currently use an iPhone 7 as my daily driver. I’m considering getting a new iPhone and want to find the right balance between 1.) phone size I want to use daily and 2.) phone is optimal for App Store Connect previews (videos) & screenshots.

Since I’m an AR app developer, having iPhone hardware is essential (the Simulator doesn’t cut it).

Looking at the state of iPhone hardware today (Dec 2018), some quick Googling shows that the iPhone 7, 7+/8+, and X form factors are the most common in the US.

When we look at Apple’s App preview & screenshot guidelines, it tells us that the 5.5 inch (iPhone 8+, etc) form factor is required (screenshots) and recommended (app previews).

For 2019, my guess is that supporting the 5.5 inch (8+) form factor and the 5.8 inch (X/XS) on App Store Connect would give me the most bang for my buck. It would be nice to have both a XS & XS Max to test with, but that’s way out of my budget.

Curiously enough, the app preview video resolutions are the same across the X line (X, XS, XS Max, XR at 886 x 1920 pixels (when portrait). The video resolution is bigger at 1080 x 1920 pixels for the plus line (8+, etc).

Using App Store Connect, I was able to manually verify the different screenshot upload resolutions for the iPhone XS Max (1242 × 2688), iPhone XS (1125 × 2436), and iPhone 8+ (1242 × 2208). It seems like there is no point to try to take or upload iPhone XR screenshots.

In summary, the iPhone plus (8+, etc) line is the most important for app previews & screenshots. After that, the XS & XS Max (in that order) will give you more App Store Connect coverage with diminishing returns.

Pokemon Go – Use items to evolve Pokémon 2 times (6/8) Evolve & Walk Chart

In Pokémon Go, I currently have two open Special Quests: Mew & Celebi.

I’m currently at step 6/8 for Celebi. I have too many of each evolution item (Dragon Scale, King’s Rock, Metal Coat, Sun Stone, and Up-Grade) from hitting Poke stops & playing over time. What I don’t have is enough candy. Since catching enough of these monsters is not reliable, I have to walk one as my buddy to get enough candy to evolve (with an item).

What I wanted to find out is which pokemon to walk & evolve. Crucial questions are 1.) how many kilometers it takes to walk as your buddy to get candy and 2.) how many candies it takes to evolve.

From To Item Evolve (candy) Walk (km)
Poliwhirl Politoed King’s Rock 100 3km
Slowpoke Slowking King’s Rock 50 3km
Gloom Bellossom Sun Stone 100 3km
Sunkern Sunflora Sun Stone 50 3km
Porygon Porygon2 Up-Grade 50 3km
Seadra Kingdra Dragon Scale 100 3km
Scyther Scizor Metal Coat 50 5km
Onix Steelix Metal Coat 50 5km

To use this chart, I would recommend looking at which pokemon in the From column you have. Next make a note of how many candy you have for each of those pokemon. To meet the quest requirements in a timely manner, you want to pick pokemon to evolve which only require 50 candy & 3km to walk per candy (also factoring in how much candy you have already).

Driving a rental car in Switzerland

Recently, I visited Switzerland for vacation (Sep ’18) and spent a week driving around sightseeing with family.

Disclaimer: you should do your own research (regarding topics such as driving laws).

While I’ve read many great things about the public transportation system (trains & buses) and I would encourage you to take their excellent train system, driving made sense for our situation.

Pros

  • Direct transportation. Walking between the train station & hotel each day is not trivial. The uphill hike from the train station to Gruyère didn’t seem easy either.
  • Flexible. Not being tied to a train/bus schedule allowed us to see more places.
  • Scalable. Having a large car makes sense financially with a large group. Our 8 day car rental was $400. A 2nd class, 8 day unlimited train ticket is over $400 for one person.
  • Storage capacity. Storing infant items, extra clothes, etc. in your car is very convenient.
  • Park centrally. All the city centers we visited had parking near the tourist areas (such as old town). The blue ‘P’ signs are very easy to find when you are looking for parking nearby.

Cons

  • Parking
    • Expensive. This goes without saying if you are planning a trip to Switzerland. Parking in the city center for a day is not cheap. Bern was particularly expensive to park in. In Bern, I made the tradeoff to pay more for parking and enjoy the city longer.
    • Coins. Older parking areas may require coins (if they do not accept credit card).
    • Tight parking. Many older cities (such as Zurich) have extremely narrow parking spots & turns. This is a huge factor if you care about not scratching your rental car. Drive carefully & slow.
    • Language. The parking signs may not have English instructions.
  • Speed limits. I did my best to stay under the speed limit everywhere. I was told (online & in-person) that speeding in Switzerland comes with big fines. Driving & constantly checking your speed makes for very stressful driving.
  • Expensive. The cost of car rental, parking, and gas quickly add up. However, I felt the cost of driving wasn’t bad compared to buying a few train passes.

Tips

  • While driving in Zurich, many parking garages would show “FREI”. This confused me initially as I read it as “free parking” (no cost). The actual meaning is “free spots” (parking available).
  • Not a big deal, there are a lot of tunnels to drive through around the country.
  • My rental car had a number of helpful features: current location speed limit display, parking collision detection, and standard GPS navigation. I’d highly recommend these features.
  • To stay under or at the speed limit, I often relied on my rental car’s cruise control system to set the exact speed. Beware because you will often enter lower speed areas, and you’ll need to lower your speed suddenly.
  • While driving in Switzerland, your headlights always need to be on. I set my car rental to have automatic lights. Easy.
  • I would recommend renting from Sixt at the Zurich airport. (I have no affiliation with them.) I was able to get my BMW 2 series rental quickly and received good customer service.
  • There are car free areas in Switzerland, so do not plan to drive to them.

Driving in Switzerland is not cheap, but it comes with many benefits. I would recommend driving in Switzerland if you are traveling with a large family or kids.

iOS 12 Siri Shortcuts

The latest update (v1.3.6) of my iPhone app, Power Focus, passed app review today! The App Store review turnaround is amazing nowadays. Super quick.

My app includes minimal iOS 12 Siri Shortcuts support. Watching the WWDC session, there’s two ways to add Siri Shortcuts support: NSUserActivity & Intents. I went with the former since I didn’t need custom Siri UI.

Of different online resources, Anton’s medium post was really helpful as it covers the essentials of using NSUserActivity. With NSUserActivity, the important parts are donating Shortcuts during app usage and handling them in your App Delegate. That’s it.

The experience of implementing minimal iOS 12 Siri Shortcuts was painless and I would recommend your app using NSUserActivity to inform iOS when key actions occur.

Using SVG / PDF assets in your iOS app

This guide covers a simple way to use SVG (Scalable Vector Graphics) assets in your iOS app. This was tested on macOS High Sierra 10.13 with Xcode 9.4 and Swift 4.

There are many websites where you can find SVG icons. Check out Material or ionicons

  1. Install homebrew & python3 for macOS (if you don’t have it)
  2. Install cairosvg. The code below installs various dependencies
    brew install python3 cairo pango gdk-pixbuf libffi
    
    pip3 install cairosvg
  3. Convert your SVG icons to PDF files. Make sure to navigate to the location of your SVG icon files. Run this command for each icon file (with the relevant *.svg & *.pdf input / output file name):
    cairosvg icon.svg -o icon.pdf
  4. Drag your PDF files into your Xcode Assets.xcassets folder
  5. Adjust the settings for each icon in your xcassets. You may want to adjust:
    1. Name – this is important as you will refer to this in your Swift code to use the icon
    2. Set ‘Render As’ to ‘Template Image’
    3. Check the box for ‘Resizing – Preserve Vector Data’
    4. Set ‘Scales’ to ‘Single Scale’
  6. Use your icon in your app. I did this programmatically in Swift, and this works in your ViewController. Make sure to update the ‘iconName’ to match what is in your xcassets for your icon file.
    if let icon = UIImage(named: "iconName") {
        let image = UIImageView(image: icon)
        image.translatesAutoresizingMaskIntoConstraints = false
        image.tintColor = UIColor.blue
        view.addSubview(image)
    
        NSLayoutConstraint.activate([
            image.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            image.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            image.widthAnchor.constraint(equalToConstant: 24),
            image.heightAnchor.constraint(equalToConstant: 24),
            ])
    }
  7.  That’s it. Your SVG file was converted to a PDF file, added into your Xcode assets, and called from your ViewController!