Winston Lee https://winstonlee.org Sun, 22 Feb 2026 01:07:23 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://i0.wp.com/winstonlee.org/wp-content/uploads/2023/05/3-1.png?fit=32%2C32&ssl=1 Winston Lee https://winstonlee.org 32 32 210831128 Unlocking Multilingual Typing: Dvorak Meets Vietnamese and Korean https://winstonlee.org/2024/11/15/unlocking-multilingual-typing-dvorak-meets-vietnamese-and-korean/ https://winstonlee.org/2024/11/15/unlocking-multilingual-typing-dvorak-meets-vietnamese-and-korean/#comments Fri, 15 Nov 2024 01:24:47 +0000 https://winstonlee.org/?p=2011 As a typist who frequently alternates between Vietnamese and Korean, I encountered the challenges of using different keyboard layouts effectively. This is especially true for Dvorak layout users. After exploring various solutions, I settled on OpenKey, an open-source input method that meets our unique typing demands.

Why OpenKey Stands Out

OpenKey is specially designed for typing in Vietnamese and is built to be flexible and customizable. Its open-source nature means that anyone can modify it to suit their needs. Recognizing the potential for improvement, I decided to fork OpenKey and create a version optimized for the Dvorak layout. You can find my modifications in the branch features/dvorak-layout.

This version allows Dvorak users to type Vietnamese effortlessly, while also providing the flexibility to switch to Korean typing. By combining this Dvorak layout with YoonD IME for Korean typing, users can transition smoothly between Korean – English – Vietnamese.

Enhanced Multilingual Support

In addition to the Dvorak layout, I also created the branch features/allow-other-languages-win32-v2. This branch add on option in the Windows UI to enable OpenKey for use with other languages.

2025 Update: this got merged into the main OpenKey repository.

How to

  1. Download OpenKey: Download the branches above. I have included pre-built binaries in the releases section.
  2. Configure Your Input Method: Once installed, run OpenKey.
  3. Combine with YoonD IME: For Korean typing, download and install YoonD IME.
  4. Configure: Set the turn on / off key in OpenKey the same as language switching key in Windows
  5. Typing: In English mode, you can type in Vietnamese / English. In Korean mode you can still use your Dvorak shortcuts

]]>
https://winstonlee.org/2024/11/15/unlocking-multilingual-typing-dvorak-meets-vietnamese-and-korean/feed/ 1 2011
A4 Poster for Desiderata https://winstonlee.org/2024/06/27/a4-poster-for-desiderata/ https://winstonlee.org/2024/06/27/a4-poster-for-desiderata/#respond Thu, 27 Jun 2024 03:45:10 +0000 https://winstonlee.org/?p=2007 I deeply empathize with the message of Desiderata by Max Ehrmann because it speaks to the quiet struggles of everyday life with such gentle reassurance. Its reminder to “go placidly amid the noise and haste” feels especially meaningful in a world that often feels overwhelming and fast-paced. I connect with its encouragement to be kind to oneself, to recognize personal worth without comparison, and to trust that there is a place for each of us in the universe.

So I created a printable PDF anyone can print and be peacefully reminded of this.

]]>
https://winstonlee.org/2024/06/27/a4-poster-for-desiderata/feed/ 0 2007
Note on using the Reon Pocket 4 https://winstonlee.org/2023/12/10/revisit-using-the-reon-pocket-4/ https://winstonlee.org/2023/12/10/revisit-using-the-reon-pocket-4/#respond Sun, 10 Dec 2023 13:29:34 +0000 https://winstonlee.org/?p=1966 I found that Bluetooth doesn’t work well. You are often greeted with this screen

When this happens, the right thing to do is not to unregister as the message said, but instead just close the app and restart it. The next time the app opens the Reon will connect again.

]]>
https://winstonlee.org/2023/12/10/revisit-using-the-reon-pocket-4/feed/ 0 1966
Running a Hackintosh in VMWare player 17 with Ryzen 9 https://winstonlee.org/2023/07/15/running-a-hackintosh-in-vmware-player-17-with-ryzen-9/ https://winstonlee.org/2023/07/15/running-a-hackintosh-in-vmware-player-17-with-ryzen-9/#respond Sat, 15 Jul 2023 15:08:50 +0000 https://winstonlee.org/?p=1958 Hackintosh is a term used to describe the process of installing macOS on a non-Apple computer. The term “Hackintosh” is a combination of the words “hack” and “Macintosh.” A Hackintosh is essentially a custom-built computer that runs macOS, which is the operating system that powers Apple’s Mac computers. While building a Hackintosh is not officially supported by Apple, it has become a popular way for enthusiasts to experience macOS on non-Apple hardware.

Why you would want to run a Hackintosh

  1. Cost: Building a Hackintosh can be a more cost-effective way to obtain a computer that is capable of running macOS than buying a brand new Mac.
  2. Compatibility: Some software applications or hardware may only be compatible with macOS. Running a Hackintosh allows users to take advantage of the macOS ecosystem while still using their preferred hardware.
  3. Learning opportunity: Building a Hackintosh can be a learning opportunity for users who want to gain a deeper understanding of computer hardware and software.
  4. Development: For developers, running a Hackintosh can be useful for testing and developing macOS and iOS (iPhone) applications.

Instructions

Step 1: Grab the BigSur VMWare image here

Step 2: Install VMWare Player 17 if you haven’t

Step 3: Install the VMWare Unlocker patch https://github.com/paolo-projects/unlocker/

Step 4: Extract the VMWare Image above

Step 5: Modify the .vmx file to make it compatible with Ryzen (Pointers 1 and 2)

cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011"
cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111"
cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110"
cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001"
cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001"
cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000"
cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011"
cpuid.1.edx = "0000:0111:1000:1011:1111:1011:1111:1111"
ulm.disableMitigations="TRUE"

Step 6: Run the VMWare image

Yay!

]]>
https://winstonlee.org/2023/07/15/running-a-hackintosh-in-vmware-player-17-with-ryzen-9/feed/ 0 1958
Using the Reon Pocket 4 outside Japan https://winstonlee.org/2023/07/15/using-the-reon-pocket-4-outside-japan/ https://winstonlee.org/2023/07/15/using-the-reon-pocket-4-outside-japan/#respond Sat, 15 Jul 2023 02:47:20 +0000 https://winstonlee.org/?p=1954 Introduction to the Reon Pocket

The Sony Reon Pocket is a unique and innovative wearable device that was introduced by Sony in 2019. It’s a small, lightweight device that sits under your shirt collar, and uses thermoelectric technology to cool or warm the wearer’s body, depending on the weather conditions.

The Reon Pocket 4 and the Reon Tag, no longer requires a special undershirt
The Reon Pocket 4 and the Reon Tag, no longer requires a special undershirt

The Reon Pocket is controlled by a mobile app, which allows users to adjust the temperature to their comfort level. It’s designed to be discreet and easy to use, making it a great option for people who want to stay comfortable in hot or cold weather without having to carry bulky or heavy clothing.

Unboxing the Reon Pocket 4
Unboxing the Reon Pocket 4

Excitement

I recently purchased the device and upon receiving I was excited to try out this innovative wearable device. However, I quickly discovered that the controlling app for the Reon Pocket was region locked. You can’t download it outside Japan and Hong Kong, the only two places the device is sold. And you can’t do much with the button on the device. Press it once and it turns the device on or off, and holding it reset the device, but that’s it.

Disappointment

Because Android allow side loading installing apps freely, I downloaded the latest xapk and tried installing it with an APK utility available on the Play store, but the app crash repeatedly.

I tried to download an older version in apk format, and this time it worked but couldn’t connect to the newer version of the Reon Pocket.

Resolution

Finally I tried the old trusty adb (via this answer on the Android stack exchange) and wasn’t disappointed. Basically the steps are:

  1. Rename the .xapk to .zip
  2. Extract the files
  3. Connect your phone to your pc
  4. Check that adb can communicate with your phone with adb devices
  5. Finally, adb install-multiple jp.co.sony.reonpocket.apk config.xxxhdpi.apk config.en.apk config.ar.apk config.de.apk config.es.apk config.fr.apk config.hi.apk config.in.apk config.it.apk conig.ja.apk config.ko.apk config.my.apk conig.pt.apk config.ru.apk config.th.apk config.tr.apk config.vi.apk config.zh.apk

(Weird that Sony supported so many languages but won’t sell it outside Japan and Hong Kong)

2025 update

The controlling app is no longer region locked, hurray!

]]>
https://winstonlee.org/2023/07/15/using-the-reon-pocket-4-outside-japan/feed/ 0 1954
List of Korean routers you can install OpenWRT on https://winstonlee.org/2023/04/26/list-of-korean-routers-you-can-install-openwrt-on/ https://winstonlee.org/2023/04/26/list-of-korean-routers-you-can-install-openwrt-on/#respond Wed, 26 Apr 2023 07:53:18 +0000 https://winstonlee.org/?p=1929 Controlling your router in Korea

When it comes to purchasing routers in Korea, there is a limited selection of brands available compared to other countries. This is because many international router manufacturers do not have a strong presence in the Korean market, and instead, local brands dominate the market.

As a result, foreigners who are not familiar with the local brands may find it difficult to choose a router that meets their needs. Moreover, most of these routers come with a Korean language interface by default, which can be challenging for non-Korean speakers.

To switch the interface to English, one would need to navigate through the router’s settings and menus. However, without knowledge of the Korean language, this can be a daunting task. Therefore, having a Korean friend or colleague who can help with the set-up process can be a significant advantage.

Many Korean routers come with outdated firmware that has not been updated for security vulnerabilities. This leaves the devices susceptible to cyber attacks such as hacking and malware infections. In addition, many Korean routers have default passwords that are easy to guess or have not been changed by users, leaving them vulnerable to unauthorized access.

Secondly, Korean routers are often limited in terms of features and customization options. This can lead to slower speeds and less reliable connections, especially when multiple devices are connected to the same network.

OpenWRT to the rescue

OpenWRT is a free, Linux-based firmware that provides advanced features and security options not found in the default firmware provided by router manufacturers.

By installing OpenWRT, users can enjoy faster speeds, improved security, and greater control over their network settings. For example, OpenWRT allows users to set up virtual private networks (VPNs), customize firewall settings, and configure advanced routing protocols to optimize network performance.

In addition, OpenWRT provides regular security updates to address vulnerabilities and bugs, keeping the network safe from potential threats.

The next task, buy a router available in Korea that supports OpenWRT

List of routers you can buy in Korea that support OpenWRT

Source: OpenWRT device list, Danawa

ManufacturerModelPrice, Link to buy
ipTIMEA8004T99000
ipTIMEA604M37250
ipTIMEA3004T59900
ipTIMET500445100
ipTIMEAX2004M87800
ASUSRT-AX53U79900
XiaomiRedmi AX6000156500
]]>
https://winstonlee.org/2023/04/26/list-of-korean-routers-you-can-install-openwrt-on/feed/ 0 1929
Using git patch or how to live with your packages not updating https://winstonlee.org/2022/04/06/using-git-patch-or-how-to-live-with-your-packages-not-updating/ https://winstonlee.org/2022/04/06/using-git-patch-or-how-to-live-with-your-packages-not-updating/#respond Wed, 06 Apr 2022 08:56:10 +0000 https://thanhphu.net/?p=1734 There’s a longstanding bug in react-native that has been active since 2018. Korean text is broken on iOS (especially if you move the input cursor to the beginning of the line)

https://github.com/facebook/react-native/issues/19339

Various fixes were merged and reverted over the years (they cause problems in some other places)

Recently (2022 – 4 years later), a better fix were merged into react-native’s main branch

https://github.com/facebook/react-native/pull/32523

However it’s still unclear when this will get released, and it will take even more time for us to upgrade react-native

In order to use this in our final product, we’ll need to patch react-native manually

  1. Download react-native normally via npm install
  2. Patch node_modules/react-native/Libraries/Text/TextInput/RCTBaseTexinputView.m
  3. Build the project

Generating the patch

Let’s download the react-native repository

git clone https://github.com/facebook/react-native.git

You’ll find that it take a veeery long time

Let’s just get the last 1,000 commits instead

git clone --depth 1000 https://github.com/facebook/react-native.git

Much faster!

Next, reset the branch to the commit we want to extract (You can get the commit ID from the pull request, look at the end)

git reset --hard 1a83dc36ce0af33ac7a3c311354fce4bfa5ba1a3

Next, generate the patch file

git format-patch -1 main Libraries/Text/TextInput/RCTBaseTextInputView.m

Explanation

  • git format-patch: generate patch file
  • -1: from last 1 commit
  • main: from main branch
  • Libraries/Text/TextInput/RCTBaseTextInputView.m: patch to the file, omit to generate patch for the whole commit

Applying the patch

A cursory search on the internet will give you some npm package that you should install to apply a patch file. However, most *nix environment have a tool called patch already installed. We can utilize this

Let’s add some script to `package.json`:

    "patch-3882": "patch -st -p1 -d node_modules/react-native < patches/3882-fix-reactnative-textinput.patch",
    "pod": "pod-install",
    "postinstall": "npm run patch-3882; npm run pod",
    "postuninstall": "npm run patch-3882; npm run pod",

Explanation

  • postinstall / postuninstall will run after each package installation with npm. This will ensure our version of react-native stays patched. Also this will work on your existing build pipelines
  • patch-3882: name of your custom build action
  • patch: the patch command
  • -st: run silently, ignore errors, assume the best
  • -p1: convert git’s format to patch format by truncating the first level of directory from the patch file
  • -d: specify the working directory, in this case, react-native’s
  • < patchfile: pipe the patchfile into the patch command, this is not an input parameter

Gotchas:

  • don’t use “&&” to combine commands, use “;” if you are using Microsoft AppCenter to build your binaries. “&&” will give an “unexpected end of file” error due to the shell on the build agent
]]>
https://winstonlee.org/2022/04/06/using-git-patch-or-how-to-live-with-your-packages-not-updating/feed/ 0 1734
TIL about twine https://winstonlee.org/2022/01/13/til-about-twine/ https://winstonlee.org/2022/01/13/til-about-twine/#respond Thu, 13 Jan 2022 02:49:42 +0000 https://thanhphu.net/?p=1718 A simple, interactive storytelling tool

It’s useful for creating interactive flow chart too.

]]>
https://winstonlee.org/2022/01/13/til-about-twine/feed/ 0 1718
TIL (react native, EC2, gvm) https://winstonlee.org/2021/10/07/til-react-native-ec2-gvm/ https://winstonlee.org/2021/10/07/til-react-native-ec2-gvm/#respond Thu, 07 Oct 2021 09:17:33 +0000 https://thanhphu.net/?p=1706 react-native

Launching two instances of a react-native project in two simulators

You’ll see this error when you try to run the second instance

error Failed to launch the app on simulator, An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
Unable to lookup in current state: Shutdown

This is because react-native runner won’t start the second emulator instance automatically. You need to start it by opening xcode -> window -> devices & simulators -> simulators -> start the desired simulator.

Then you can run npx react-native run-ios --simulator="iPhone XXX" again

Or you can just run the program in XCode and select the second simulator.

When cannot connect to EC2 instance with external IP

  • Check the subnet’s routing table
  • There should be an igw-something route. If not, won’t be able to connect to the instance from the internet
  • Select a different subnet if such a function is desired
  • Don’t need to allocate an Elastic IP address

gvm install go1.14

  • Will install go 1.14.0 (not the latest version of go)
  • Must specify specific version of go to install latest (which is different from nvm)
]]>
https://winstonlee.org/2021/10/07/til-react-native-ec2-gvm/feed/ 0 1706
Run Flutter app on iOS 2021 edition https://winstonlee.org/2021/06/06/run-flutter-app-on-ios-2021-edition/ https://winstonlee.org/2021/06/06/run-flutter-app-on-ios-2021-edition/#respond Sun, 06 Jun 2021 03:49:15 +0000 https://thanhphu.net/?p=1678 ...]]> You need an apple developer account and XCode

Open the Flutter app in XCode

In Android Studio, go to Tools / Flutter / Open iOS module in XCode. I know, using ANDROID studio to make apps for an iPhone…

Prepare XCode

Connect your phone to the computer. On the top left part, click Runner > and select your phone. If you don’t see your device you’ll need to troubleshoot, don’t select “Any iOS device”

Go to XCode / Preferences / Account tab, press the plus button, select Apple ID and login to your Developer account. You’ll be prompted for keychain access, allow all. After you are done, make sure a team is available. Some tutorials made you do this step by manually creating a CSR key on your computer and upload it to Apple, following the wizard in XCode is much easier

Next, select runner on the left pane, and select signing & capabilities, make sure automatically manage signing is selected

Remotely debug your app

  • In XCode, select Windows / Device and simulators
  • Click on your phone, check the connect via network button

Wait until there’s a globe next to your phone’s name. That’s it, you can now disconnect your phone from the computer and deploy your app remotely to your phone by clicking the Run button

The run button
]]>
https://winstonlee.org/2021/06/06/run-flutter-app-on-ios-2021-edition/feed/ 0 1678