MacBook Air again in 2021

Previously installed Arch Linux on my wife’s old MacBook Air. Then just recently, due to the need of using Zoom Meeting on a device, I tried to re-use this MacBook Air again.

Sadly, Mac OS X 10.6.8 is not supported anymore. I cannot install latest Google Chrome, latest Firefox, or Zoom. The only solution is running Linux on it.

First of all, I have to update Arch Linux. However, the last update was in November 2019. Due to WiFi driver issue (slow, damn slow!), I just remove all unnecessary packages, such as LibreOffice, Wine, SMPlayer, Audacious, etc, and do the upgrade according to this forum post.

There are two main problems in MacBook Air when running Arch Linux: (1) Wi-Fi and (2) graphic card.

For WiFi, at the end, I blacklist bcma. It is damn slow. For Internet connection, I just solve it by using Android phone USB tethering. That’s far more better than WiFi download speed, which is around 200 kilobytes per second.

The second problem is nvidia-380xx-dkms driver. Since it is old machine, I use linux-lts kernel, which can work smoothly with nvidia-380xx-dkms. However, I am not sure what’s the reason, if running glxgears, the OpenGL fails to work. OpenGL is required for Zoom to run. Luckily, I found that if I restart lightdm, then OpenGL will be able to work, so does Zoom.

Med (Linux Memory Editor) version 3.7

Med version 3.7 released.

The custom search feature now allows other scan types (int8, int16, …, int64, float32, float64), including the operators. Now also supports int64 scan type, which can be found in 64-bit games.

Besides that, there is new operator “~”, which acts like “search within”. I use it as a shortcut for search within, especially search the float number we see in the game, 999, which may be 998.999 or 999.1111. By using “~”, it will translate to search within [998, 1000]. It allows second argument, as “± x”. Without second argument, it is “± 1”.

The custom search allows to search data structure, such as a character level 10 (int32), HP 1000 (float32), HP Max 1000 (float 32). By using custom search, we can enter i32:10, f32:1000, f32:1000.

Moreover, there is a bug fix on scope search.

Simple music generator

I just revived my very old hobby project, Musgen.

I was interested in artificial creativity, was intended to advanced my study of doctorate on this topic. However, due to lack of the expertise in the local universities, I didn’t advance my study on artificial creativity.

Imagine that, if I can generate musics, then I can create my own game with any random background musics.

Hades (game) cheat

If you feel that Hades is too difficult to play, and want to cheat, can try the following patch in Content\Scripts.

diff –git a/Combat.lua b/Combat.lua
index d9df948..2cc3e32 100644
— a/Combat.lua
+++ b/Combat.lua
@@ -867,6 +867,7 @@ function DamageEnemy( victim, triggerArgs )
+ triggerArgs.DamageAmount = triggerArgs.DamageAmount * 10
if triggerArgs.DamageAmount == 0 then
diff –git a/DeathLoop.lua b/DeathLoop.lua
index d36c3f8..226a93b 100644
— a/DeathLoop.lua
+++ b/DeathLoop.lua
@@ -162,6 +162,7 @@ function StartDeathLoop( currentRun )
+ currentRun.Money = 80000
function SetupDeathArea( currentRun )
@@ -346,7 +347,7 @@ function StartOver()
AddInputBlock({ Name = "MapLoad" })
LoadMap({ Name = currentRun.CurrentRoom.Name, ResetBinks = true, ResetWeaponBinks = true })
+ currentRun.Money = 80000
function FlashbackLeftBedroom( source )
diff –git a/HeroData.lua b/HeroData.lua
index 72cb55a..2b2705a 100644
— a/HeroData.lua
+++ b/HeroData.lua
@@ -3,8 +3,8 @@ HeroData =
DefaultHero =
DefaultWeapon = "SwordWeapon",
MaxHealth = 50,
MaxHealthMultiplier = 1,
+ MaxHealth = 90000,
+ MaxHealthMultiplier = 2,
LastStands = {},
UnusedWeaponThreshold = 3,
DashManeuverTimeThreshold = 0.4,
view raw hades-cheat.diff hosted with ❤ by GitHub

Wine tips

To play Windows games on Linux, Wine is necessary. Even Steam Proton is also based on Wine.

To play most modern Windows games, I will suggest NVidia graphic card as the hardware requirement. Without good graphic card, a lot of 3D games are not able to render properly. Moreover, some pixelated games perform better with NVidia graphic card.


In my opinion, to configure Wine to the best compatibility, we need to install several libraries (DLLs) using winetricks.

  • dxvk
  • d9vk

Then it is able to use Vulkan for DirectX 9, 10, and 11. For more details about dxvk and Vulkan installation, can read here and here.

Media Foundation

Recently, I found that some games require Media Foundation for playing movie. Though winetricks can install Media Foundation, it doesn’t work. A more promising solution is mf-install.

Heat and laptop fan issue

I also experienced that, quite a lot of games cause my laptop to produce loud fan, due to the heat. I prefer performance rather than good graphics. At the end, I found that, libstrangle is able to solve the problem. I use 25 FPS for most of the games.

CJK support

Just in case you need to render some CJK fonts, can try to import this registry file using regedit, then run the wine with LANG environment variable. However, this solution only works on the Window user interface like menu items.

For some games that render CJK fonts, may need to install the font and also fontconfig.

Emulate virtual desktop

I experienced that, Alt-Tab causes the game not functioning. To solve this issue, emulate virtual desktop is the best solution. This can be done by using winecfg. Alternatively, we can run

wine explorer /desktop=wine,1024x768 explorer

“explorer /desktop=wine,1024×768” will run the application with the emulated virtual desktop. By this, we need not to use winecfg to configure the virtual desktop.

Use different Wine prefix for different usage

To understand Wine prefix, read here. I personally uses this script to manage Wine prefix. Because some installations require to run Wine as Windows XP, but the game can only run with Wine as Windows 7 and above. Keep changing the version with winecfg is inconvenient.

Besides that, some games may require dotnet4x installed. Yet dotnet may break other games in the same prefix.

Use Proton as an alternative

Some of the games may have poor performance on Wine. In that case, can try on Proton. I have wrote a script to make the Proton invocation easier.

But my personal experience is that, Proton doesn’t have good support on joystick/gamepad as Wine.

Note: Proton version 5.x has an issue that I have reported here.

Other libraries

Not only Wine libraries affect the games, Linux libraries are also important to make the games work, for instance, Vulkan. This wiki page suggested several libraries as well.

Compatibility databases

I found that ProtonDB is a good place to find whether a game is compatible to Proton. And some users also shared the solutions on how to make the games work.

Alternatively, Wine official application database also provides some details on game configuration.

Offline mode

Just in case we prefer to run certain apps without Internet connection, we can use firejail. Eg, firejail --noprofile --net=none wine explorer.

Solution on Evernote login issue

I faced the login issue with Evernote since around two weeks ago. It leads me to a blank page, with the HTTP status code 418. There is similar issue reported here. I made the bug report, but the issue not yet solved. Looks like it happened in Malaysia and Vietnam according to the forum. Suggested solution in the forum was to use VPN.

This is how I solved the issue as a temporary solution to login.


  • Google account
  • Tor browser or any VPN related connection

Try to login successfully from the web, by luck or by Tor browser or any VPN related connection.

After login, go to Settings > Connected Services, and enable “Sign in with Google (Sign in to Evernote with 1 click)”.

By enabling the above, I can just sign in with my Google account, which skips the status code 418 issue.

Med (Linux memory editor) version 3.6.1

I released version 3.6.1 for my hobby project, Med (Linux Memory Editor). There are several great changes in UI (since 3.5), especially the larger window, due to more components in the UI.

Named scans

Now it supports named scans (the bottom part of the window).

New UI

I create this named scans feature because sometimes I need to scan for several values of interested. For example, a game character A’s experience point and character B’s experience point. By using named scans, I can scan these two values without destroying the scan result of each others. This makes my (game cheating) life become much easy.

Improved memory editing

Memory edit

Memory editing is now improved with preview the values in int32, float32, and float64 (double as in C/C++). This is useful for me to discover the pattern surrounding the game character status. For example, there is a game I played, the character has non-rounded float32. This causes me failed to search the values for various trial. Lastly I found the address by scan unknown. By using these three values preview, I can discover the values easier without doing actual scanning.

Furthermore, memory editing now supports “entering” the value according to the scan type (the Enter button). In the versions prior to 3.6, memory editing can only directly edit the hexadecimal. This is troublesome to edit the float values. Previously, I have to create a new memory address in the stored list, then edit the value. But now, I can update the values directly.

Besides that, in the memory editing, it supports “string” scan type, for entering the string directly.
WARNING: Longer string may cause the memory overflow.
NOTE: Entering string is not null-terminated. Add the null (0) value at the end if necessary.

Lastly, I fixed the cursor in the memory editing (hexadecimal area).

Med: Experimental feature

I just tested with my new experimental feature for Med (Linux Memory Editor) on Sea Dogs, i.e. Custom Scan.

Sea Dogs is very difficult to do memory editing, as the values are stored in string. Luckily someone wrote a superb guide on how to do memory editing, which can be found here.

But the problem is that, the guide is written for CE (Cheat Engine). Unfortunately, CE is for either Windows or Mac. And to cheat in Sea Dogs, need to use “Group Search” feature of CE. WTF is Group Search?

After some studies from here, finally I wrote similar feature on Med. The related source code can be found here (not yet merge into master branch). I use similar syntax as CE’s Group Search.

s:'6', w:87, s:'5', w:31, s:'5', w:151, s:'6', w:31, s:'7', w:159, s:'7', w:199, s:'6'

The current code in Med uses block alignment 8, which cannot be changed, since I am doing experiment. Different from CE, I use comma separation instead of space separation. The s is string, follows by single quotes, w is wildcard. So far I only wrote the code for s and w. Nothing else.

Yeah! Now I can play the protagonist as superman.

Brave and Chromium

I have switched my primary web browser to Brave. But also found that Chromium (or any alternative web browser) is necessary. Since I am a software developer, sometimes need to implement ads related feature. Brave will block ads by default. That’s why I need an alternative web browser that I can freely to turn off the adblock. Though I can turn off the adblock in Brave, it will affect my browsing experience. As a result, using an alternative web browser for development on ads related feature is necessary.

Brave or Chromium

I am in dilemma of choosing Brave or Chromium as my default browser.

The following is my comparison,

Arch Linux official repoYes, in ExtraAUR
SyncSync a lot of things, including tabs, history, compatible to Google ChromeSync bookmark only
AdBlockRequire extension, such as uBlock OriginBuilt-in adblock, but leads to difficulty to customize blocking certain HTML elements.
Adblock also breaks some anti-adblock sites.
But adblock works on mobile version on both Android and iPhone
StartFast startSlower than Chromium, because it runs pacman (Arch Linux package manager) to check pepper-flash.
PrivacyNothing specialBuilt-in Tor feature for private browsing with Tor

I am still continue using Brave, because I prefer Brave over Firefox on Android. In order to conform with Brave on Android, I choose Brave on desktop.

Besides that, Brave has built-in Tor. Alternatively, we can use Tor Browser (based on Firefox), which means I need to use two browsers: Firefox and Tor Browser.