Software and Hardware Usage

Records of techniques for using various software and hardware, for future reference.

Problems encountered when cloning submodules in a GitHub project

GitHub is truly a treasure trove of open source, not only for learning code but also for learning how to use git!

Recently I studied the Off‑the‑Record‑iOS project (https://github.com/chrisballinger/Off-the-Record-iOS) and practiced using git submodules.

This project has a Submodules folder containing other open source projects it depends on. At first I did not notice, and just downloaded the ZIP. In XCode many file names showed up in red, revealing missing dependencies. There were quite a few, so I abandoned manual downloading.

Searching, I found issue #87 where someone asked the same question: https://github.com/chrisballinger/Off-the-Record-iOS/issues/87. Following the answer, I cloned the project with git and ran git submodule init && git submodule update (for git 1.6 and later you can use git clone –recursive). Updating worked for the first few submodules, but then a new error appeared:

Submodule path ‘Submodules/DAKeyboardControl’: checked out ‘5352d1ff2d1131d974d94406ed8fcf8eb068aa72’
Cloning into ‘Submodules/LibOrange’…
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Clone of ‘git@github.com:ChatSecure/LibOrange.git’ into submodule path ‘Submodules/LibOrange’ failed

Continue reading…

Windows symbolic link (shortcut) follow behavior in network shares

This issue appeared during the following operation. First, a PowerShell script was used to create a symbolic link:

New-Item -ItemType SymbolicLink -Path d:\share_folder\ -Name latest -Target d:\share_folder\v1000 -Force

This command creates a shortcut named ‘latest’ inside d:\share_folder, pointing to the sibling folder v1000. Then share_folder was shared over the network. When accessing \\xxx.xxx.xxx.xxx\share_folder\latest from another machine, the error appeared: ‘Cannot follow symbolic link because its type is disabled’. Searching online revealed the reason, for example: https://www.zywvvd.com/notes/system/windows/symlink-disabled/symlink-disabled/

By default, Windows only allows symbolic link following locally. Remote‑to‑local (a shortcut inside a share pointing to a local path) and remote‑to‑remote (a shortcut inside a share pointing to another share path) are disabled. Following the solution, running: fsutil behavior set SymlinkEvaluation R2L:1 enables remote‑to‑local following. But then accessing the link produced ‘target folder does not exist’.

Continue reading…

A deeper look into the issue of PS2 failing to recognize certain PS1 memory cards

After installing the 816HD mod chip on my long‑unused PS2, the console essentially reached the 230 BIOS 9W perfect state. PS1 games were also fully supported (so far I have not seen any functional impact from the two‑reset behavior). Naturally, when replaying classic PS1 titles, saving is essential, so I dug out my PS1 memory card that had been stored for 15 years (I used it back in arcade shops):
IMG_0744
When I inserted it into the PS2, the browser could not recognize it. Searching online, I found many forum discussions about this issue. In short, PS2 has poor compatibility with PS1 memory cards, especially assembled or off‑brand cards (mine is clearly a cheap clone using the so‑called ‘cow dung’ chip). Some users even reported the opposite: clone cards work but original Sony cards do not. Others mentioned that Sony’s PocketStation, which has an LCD screen, works 100% reliably. I also saw sellers on Taobao offering PS1 original cards claiming full PS2 compatibility.

Just when I was about to buy an original PS1 card, I discovered something surprising: although my old clone card could not be recognized in the PS2 memory card management screen, once I booted into a PS1 game, the card was recognized. It showed messages like ‘memory card full’ or ‘no usable save data’. This suggested the card was not broken, but simply suffering from a compatibility issue.

Later, while playing a Chinese‑translated Japanese version of Resident Evil 3, I found an old save file on the card. Loading worked normally, and saving (overwriting) also worked. So the card functions perfectly during PS1 mode on the PS2, even though the PS2’s memory card manager (and tools like uLaunchElf) cannot detect it.

Continue reading…

OpenWRT accidental deletion of uhttpd service configuration causing LuCI management page inaccessible

I compiled my own OpenWRT firmware with uHTTPd providing the LuCI UI. While experimenting with server mapping I clicked delete in the top right and applied it:

After that the LuCI interface could no longer be accessed. I realized the configuration I deleted was the web server supporting LuCI. After several reboots the router functions were still normal, but the web management was gone. Dropbear SSH still worked. I was ready to reflash the firmware, but then I found this forum post:

https://forum.openwrt.org/t/cannot-access-luci-after-messing-with-settings/147903

By running the following command:

cp /rom/etc/config/uhttpd /etc/config/uhttpd

The default uhttpd configuration file is restored. Then restart the uhttpd service with service uhttpd restart, or simply reboot the router. The LuCI management page comes back without reflashing, quickly recovering access.

Proxmox VE upgrade from 7 to 8 and the networking.service/start hang issue

Recently I noticed that the Proxmox VE 7 management page started showing red text about support expiration (officially ending July 2024). So I upgraded to version 8. Before starting I carefully read the official upgrade guide: https://pve.proxmox.com/wiki/Upgrade_from_7_to_8. It describes two methods:

One is a fresh install of 8, then migrating disks and VMs via backup/restore. The other is an in‑place upgrade using apt update/upgrade. The first is safer but requires two servers or identical disk setups. The second carries more risk, since any problem interrupts VM services and may require reinstall and restore. For me, only the in‑place upgrade was possible due to limited hardware.

Despite preparation, the upgrade process was bumpy. The biggest issue was the networking.service/start hang. After the upgrade completed, rebooting the system resulted in a freeze at this state:

At first I waited, but the disk activity light stayed off, so I realized something was wrong. Searching online showed many people with similar problems. This post explained the underlying issue: “Job networking.service/start running

Continue reading…

Perforce (P4) server Unicode mode setup to fix Chinese filename/folder garbled text

Perforce (P4) server Unicode mode setup to fix Chinese filename/folder garbled text

Problem environment: p4d running on a Linux server, P4ROOT created with default settings, Unicode not enabled. Clients: Windows P4V and Mac P4V. In P4Admin, Server Info showed Unicode support: disabled. When a Windows client added files/folders with Chinese names and submitted them, the Mac client displayed garbled text in the Depot. After Get, filenames were saved with %20 style encoding.

Checking further: with Unicode disabled, in P4V the Connections → Choose Character Encoding… menu was grayed out. In Preferences → Display → Set encoding for all connections to:, Windows default was CP936 GBK, Mac default was UTF‑8. This mismatch caused Chinese names uploaded from Windows to appear garbled on Mac. Forcing P4CHARSET to UTF‑8 or using p4 set produced the error: ‘Unicode clients require a unicode enabled server‘.

Solution: enable Unicode mode on the server.

Continue reading…

Modding a Chinese ST‑LINK V2 clone to add SWO support

Recently a colleague mentioned that Luatos Mall was running a promotion for the AIR32F103 BluePill development boardhttps://wiki.luatos.com/_static/bom/BluePill.html). At 9.9 RMB you get a board plus an extra AIR32F103CCT6 chip. I had never used STM32 MCUs before, so I picked one up to study, at least as a collectible.

After receiving it, I quickly learned from Luatos documentation and searched for STM32 beginner guides online. I discovered various ways to upload programs. Since I had previously bought an ST‑LINK V2 (originally intended for flashing firmware to a WY815P soldering station), I chose to test using ST‑LINK SWD. After soldering headers and wiring according to the silkscreen, the PC recognized the debugger with STM32 ST‑LINK Utility. I then installed the research version of Keil (v5.23 from the netdisk bundled with the ST‑LINK), added the AIR32 software library per Luatos wiki, learned GPIO basics, and successfully lit the onboard LED. At this point I realized how much simpler Arduino is 😂. Breakpoint debugging in Keil also worked. But then I hit a problem: unlike Arduino Nano, which can easily use the IDE serial monitor for logs and command‑line interaction, this setup had no simple way to view printf output. So I spent time researching.

Continue reading…

Lenovo ThinkBook 14+ 2024 shutdown battery drain issue – one possible cause

Around February 2024 I traded in my ten‑year‑old MacBook Air 2013 for a Lenovo ThinkBook 14+ 2024 U7 version (certified model: ThinkBook 14 G6+ IMH). After using it for some time, aside from slightly rough build quality (uneven screen hinge, keyboard not perfectly level on the C‑side), the functionality and performance were quite good. Since I mainly use a desktop at home, this laptop spends most of its time in standby. Recently, however, I noticed that in shutdown state the battery drains rather quickly, on average 1%–3% per day. Searching online, I found many reports of similar issues from other laptop users, for example: https://learn.microsoft.com/zh-cn/answers/questions/5562378/win11https://tieba.baidu.com/p/7795883672 and many more. These laptops show continuous battery drain after shutdown, and in Windows 11 battery usage records the screen is shown as being on for nearly 24 hours during shutdown periods.

Continue reading…

A record of handling abnormally large Proxmox VE VM disk backup size

First, a brief description of this PVE server’s disk setup: there are two 2T mechanical hard drives. One is used to install the PVE system and allocate virtual disks to VMs. The other 2T drive is dedicated to periodic automatic VM backups (stored with ZSTD compression, keeping the last 3 backups). One VM, vm-100 (KVM mode, though the issue should be independent of virtualization type), has two virtual disks: a 200G /dev/sda1 and a 1T /dev/sdb1. The 200G disk is used to install the OS (Debian 10), and the 1T disk is used for service data storage.

Initially, one service’s data was stored on the main system partition on the 200G virtual disk. Since I did not anticipate how fast the service data would grow, the 200G system disk quickly filled up. So I scheduled some time to migrate that service’s data directory to the 1T disk mount point. After a series of operations (I even messed up once by using cp without preserving file permissions, causing the service to fail to start after migration, and had to redo it with cp -a), the service resumed normal operation.

However, during subsequent PVE automatic backup tasks, backup failures started to occur. Checking the PVE logs, I saw errors like this (from the automatic backup notification email):

Continue reading…

Solution to stuttering and dropped frames when watching high‑resolution 60fps YouTube videos in Chrome

Solution to stuttering and dropped frames when watching high‑resolution 60fps YouTube videos in Chrome

On my old Core 2 Duo machine, watching high‑resolution 60fps YouTube videos in Chrome resulted in obvious frame drops. Using the video stats (Stats for nerds), I could see that at 1080p 60fps the dropped frames counter kept increasing. At the same time, both CPU cores were maxed out. Clearly, the HTML5 video player was not using hardware decoding.

At first I thought it was a Chrome settings issue. I toggled the hardware acceleration option and restarted Chrome, but the problem remained. After searching online, I found that due to some behavior in Chrome (many people reported that Firefox and newer versions of IE do not have this issue), YouTube sends VP8/VP9 encoded video streams (also visible in the stats panel). These formats do not support hardware decoding on older hardware, so the CPU becomes fully loaded and frames are dropped constantly.

Therefore, the solution is to force YouTube to send a hardware‑decodable format. Fortunately, someone created a Chrome extension that does exactly this: h264ify: https://chrome.google.com/webstore/detail/h264ify/aleakchihdccplidncghkekgioiakgal, After installing it, YouTube starts sending AVC‑encoded video instead. CPU usage drops significantly, and the frame‑drop issue improves noticeably.