Thursday, December 25, 2025

can't update a git submodule from github web interface

Short answer - not currently possible to do it from the web interface. Discussion about this is at https://github.com/orgs/community/discussions/15079#discussioncomment-9292900

The same terminal commands are needed as referenced in the earlier post, https://hnsws.blogspot.com/2025/04/change-submodule-for-git-repository.html

In my case, since I'm using github actions to build OpenSpace (which I don't have commit access to), what I can do is to just 

cd whichever/submodule/parentdirectory
rm -Rf submoduledirectory
git clone https://fresh.git.subdirectory.url submoduledirectory
cd submoduledirectory
git checkout whatever-branch

before the configure and build steps. Or, of course, if just updating the branch is needed, only the git checkout line would be needed.

Wednesday, December 24, 2025

test a Mac app to see if it has everything it needs packaged

One way would be to remove all homebrew packages, which would not be recommended - apparently this can be done like
brew remove --force $(brew list --formula) --ignore-dependencies
(not tested)

But an easier way is to just rename the homebrew directory, for eg on Apple Silicon Macs,
sudo mv /opt/homebrew /opt/homebrew-backup

(and after finishing the tests, rename it back.)

Sunday, December 21, 2025

adding a 'slow-send' functionality for Google Apps mailing list

I've updated the github repo Google-Apps-Script-mailing-list with a script file which does 'slow-send' for large mailing lists which can be sent over several days. 


Features - 
  • time-based trigger, programmatically created and removed
  • sends emails to each recipient individually, ramping up from sending
    24 emails per day (once an hour)
    to 96 (once every 15 minutes)
    to 144 (once every 10 minutes)
    to 288 emails per day (once every 5 minutes). This could be increased further, too.
  • uses GmailApp instead of MailApp, so we can have features like name (of sender), alias, reply-to, etc.

Saturday, December 20, 2025

uninstalling coderabbit

I had signed up for the free trial of coderabbit, but did not find the free plan's functionality of "summarizing pull requests" to be of much use. In order to "uninstall" it, followed the method at 

To revote authorization, on any github page after logging in, profile picture on top right > Settings > Integrations (on lhs) > Applications > Authorized GitHub Apps tab > click Revoke button for coderabbit.

Thursday, December 18, 2025

how to do a homebrew install - avidemux - example

The workflow of installing an app with homebrew, with avidemux as an example, from https://www.avidemux.org/smf/index.php?topic=9960.msg53651#msg53651

After installation an App will be created in your Applications folder and there is finally a audio output device available (you have to select it in the preferences of the App: Edit -> Preferences -> Audio -> AudioDevice: "CoreAudio").

(1) Install XCode and the Command Line Tools of XCode.

(2) Install Homebrew using the following Terminal command:

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

(Perhaps these steps 1 & 2 are now superceded by the instructions at brew.sh)


(3) Install the latest version of Avidemux (nightly version, recommended) using the following Terminal command:

brew install --HEAD avidemux


(4) When the installation has finished, you are asked to make an alias of the app in your Application folder using this command:

brew linkapps

--------------------------------
If you want to update Avidemux to the latest nightly version:

brew rm -f avidemux
brew install --HEAD avidemux


If you want to install the "stable" version of Avidemux (Milestone):

brew install avidemux


set up file sharing on Mac

In order to move files from the internal drive of the Mac to an external NTFS drive, though Mounty does work, it has the issue that after we finish copying, unmouting the drive seems to make Finder unresponsive. Copying over the network to the Linux machine seems to be more hassle-free.

This has the how-to, and the official documentation is at

Apple menu > System Settings > (searched for Sharing) and enable "File Sharing" and in my case, allowed full disk access to my user.

Setting up smb share as it would help Windows also.

For setting up file sharing on Linux Mint - https://www.siberoloji.com/how-to-set-up-file-sharing-on-linux-mint/ (this seems to be an outdated post? It mentions 
sudo apt install samba samba-common system-config-samba
and we get
E: Unable to locate package system-config-samba 

So, not doing this right now.)

file transfer - Android to and from Mac

Macdroid for USB transfers, but only free for Android to Mac - 

JustBeamIt - works over wifi? but very slow, and link times out after 10 minutes. <1 Mbps. Suitable only for small files.

Filesharing - maybe if we connect both machines with wired connections (Android phone connected via USB to Linux box, and that to Mac with wired LAN), this might be fastest.

Wednesday, December 17, 2025

freefilesync vs gnome cloud sync

Checking out freefilesync for copying from Google Drive, gnome cloud sync allows to mount, that's more suitable for me - so, uninstalling - 

To uninstall FreeFileSync on Linux Mint, open a terminal and run the command /opt/FreeFileSync/uninstall.sh if it was installed system-wide.

fix mp4 on mac

Solution according to Copilot / ChatGPT for unplayable mp4 video file when ffmpeg is aborted with Ctrl+C on Mac - (for a file encoded with hvc1 codec)

ffmpeg -i gputestfixed.mp4 
  -map 0 \
  -c copy \
  -movflags +faststart \
  -tag:v hvc1 \
  qtplayable.mp4

hardware accelerated encoding on mac


-c:v h264_videotoolbox \ # use Apple Silicon hardware acceleration

Just like
ffmpeg -h encoder=hevc_nvenc

(Trying on Linux running on a PC, 
Codec 'h264_videotoolbox' is not recognized by FFmpeg - will work only on Mac.)

libx265 itself went at 20+fps.

hevc_videotoolbox with warping went at 33 fps.

using py-ffmpeg-warp on Mac

Trying to run py-ffmpeg-warp on the Mac mini, ran into module not found errors.

ModuleNotFoundError: No module named '_tkinter' on mac
had the simple solution as suggested in stackoverflow,

brew install python-tk 

But other modules like scipy, pillow, etc could not be installed this way. ChatGPT suggested a virtual environment to avoid breakage.

1. Create a venv (once per project)
python3 -m venv ~/venvs/gui_env
(this path is just an example.)

2. Activate it
source ~/venvs/gui_env/bin/activate
prompt changes to something like:
(gui_env) %

3. Install the required packages
python -m pip install --upgrade pip
python -m pip install numpy scipy pillow

So, when I want to run py-ffmpeg-warp, I could run the following manually - 

source ~/venvs/gui_env/bin/activate
cd /home/path/to/py/script
python3 py-ffmpeg-warp.py

Or maybe even put those lines in a script as mentioned at https://linuxconfig.org/how-to-use-a-bash-script-to-run-your-python-scripts


ntfs write on MacOS

Current Apple Silicon Macs only have read-only NTFS access out of the box. In order to write to NTFS, we need to jump through some hoops. 


free option seems to be via terminal

brew install --cask macfuse

But
brew install ntfs-3g
ntfs-3g: Linux is required for this software.

Then, ChatGPT suggested

which has installation instructions lower down in that page. FUSE is a bit slow compared to the natively supported exFAT etc, but usually sufficient for our use since our low-cost NTFS external hard disks are also slow.  

Monday, December 15, 2025

sheepit renderfarm statistics for the M4 Mac Mini

Compared to the earlier stats, the CPU speed is nearly double, but lack of NVidia GPU prevents many projects from rendering. Copy-pasting from the session information page (My account > Connected machine > (clicking on the machine) - 

OSmacm1

CPUApple M4 x 10
RAM allowed11.0 GB
RAM available16.8 GB
Max render time per frame
Power CPU208 %
Schedulerdefault

Saturday, December 13, 2025

take a screenshot on Mac

 https://support.apple.com/en-us/102646

Shift + CMD + 3 = full screen capture

Shift + CMD + 4 = capture selected area

Shift + CMD + 4 then press and release spacebar = cursor turns to camera, click on window you want to capture.

Shift + CMD + 5 - capture using screenshot app. (This can also do screen recordings.)

I have put the screenshot app in the menu bar from Control Centre (which is accessed from the icon on top right corner.)

By default, screenshots save to the desktop with the name Screen Shot [date] at [time].

force quit on Mac


Click outside the problematic app - my test build of OpenSpace in this case - to change focus to another app, then click the Apple Menu > Force Quit ... which gives a choice, to choose the running app we should force quit.

Friday, December 12, 2025

after resetting password for a user, recovery info in Google Workspace

Note to self - even though "no contact information has been added" is seen in the first tab of the user in Google Workspace, the Security tab will have recovery information and 2FA information which also needs to be reset if required.

running OpenSpace on Apple Silicon and modern Intel Macs

As written in the documentation, OpenSpace uses OpenGL double precision floating point operations extensively, and Apple Silicon does not have hardware support for it. Checking if it will downgrade gracefully to software rendering, found that OpenSpace would just crash, with Claude.ai telling me that the crash report 

Crashed Thread:        0  CrBrowserMain  Dispatch queue: com.apple.main-thread

Thread 0 Crashed:: CrBrowserMain Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib                   0x190856388 __pthread_kill + 8
1   libsystem_pthread.dylib                  0x19088f848 pthread_kill + 296
2   libsystem_c.dylib                        0x1907989e4 abort + 124
3   libGLProgrammability.dylib               0x1f0ea63e4 glpPrimitiveTypeGetScalarType + 136
4   libGLProgrammability.dylib               0x1f0e8af20 glpLLVMLoadVector + 120
5   libGLProgrammability.dylib               0x1f0e7c8f0 glpLLVMCGLValue + 1160
6   libGLProgrammability.dylib               0x1f0e771b0 glpLLVMCGAssign + 112
7   libGLProgrammability.dylib               0x1f0e7788c glpLLVMCGCommaExpr + 268
8   libGLProgrammability.dylib               0x1f0e7788c glpLLVMCGCommaExpr + 268
9   libGLProgrammability.dylib               0x1f0e771b0 glpLLVMCGAssign + 112
10  libGLProgrammability.dylib               0x1f0e7788c glpLLVMCGCommaExpr + 268
11  libGLProgrammability.dylib               0x1f0e7788c glpLLVMCGCommaExpr + 268
12  libGLProgrammability.dylib               0x1f0e771b0 glpLLVMCGAssign + 112
13  libGLProgrammability.dylib               0x1f0e7788c glpLLVMCGCommaExpr + 268
14  libGLProgrammability.dylib               0x1f0e7b5f8 glpLLVMCGBlock + 516
15  libGLProgrammability.dylib               0x1f0e722c8 glpLLVMCGNode + 632
16  libGLProgrammability.dylib               0x1f0e7b234 glpLLVMCGFunctionDefinition + 2888
17  libGLProgrammability.dylib               0x1f0e70f30 glpLLVMCGTopLevel + 1444
18  libGLProgrammability.dylib               0x1f0e985f8 glpLinkProgram + 10092
19  libGLProgrammability.dylib               0x1f0eb1ea0 ShLink + 208
20  GLEngine                                 0x1f104a3b8 gleLinkProgram + 1140
21  GLEngine                                 0x1f0fc6350 glLinkProgramARB_Exec + 180
22  OpenSpace                                0x1021f8aa4 glbinding::BasicCallHelper<void, unsigned int>::call(glbinding::Function<void, unsigned int> const*, unsigned int&&) + 44
23  OpenSpace                                0x1021f87d0 glbinding::Function<void, unsigned int>::call(unsigned int&) const + 184
24  OpenSpace                                0x1021f3a24 glbinding::Function<void, unsigned int>::operator()(unsigned int&) const + 32
25  OpenSpace                                0x1023470c8 gl::glLinkProgram(unsigned int) + 32
26  OpenSpace                                0x101e5dc2c ghoul::opengl::ProgramObject::linkProgramObject() + 44
27  OpenSpace                                0x101e5e668 ghoul::opengl::ProgramObject::Build(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::__fs::filesystem::path const&, std::__1::__fs::filesystem::path const&, ghoul::Dictionary const&) + 1456
28  OpenSpace                                0x100a5dbac openspace::RenderEngine::buildRenderProgram(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::__fs::filesystem::path const&, std::__1::__fs::filesystem::path const&, ghoul::Dictionary) + 316
29  OpenSpace                                0x1016ce084 openspace::globebrowsing::RenderableGlobe::recompileShaders() + 6156
30  OpenSpace                                0x1016cc82c openspace::globebrowsing::RenderableGlobe::initializeGL() + 208
31  OpenSpace                                0x100b47b88 openspace::SceneGraphNode::initializeGL() + 584
32  OpenSpace                                0x100ae4bb0 openspace::Scene::update(openspace::UpdateData const&) + 132
33  OpenSpace                                0x100a5a6d0 openspace::RenderEngine::updateScene() + 196
34  OpenSpace                                0x1007eb428 openspace::OpenSpaceEngine::loadAssets() + 972
35  OpenSpace                                0x1007ed234 openspace::OpenSpaceEngine::preSynchronization() + 156
36  OpenSpace                                0x1004303ac (anonymous namespace)::mainPreSyncFunc() + 80
37  OpenSpace                                0x100ce8b90 sgct::Engine::exec() + 288
38  OpenSpace                                0x10042d170 main + 14684
39  dyld                                     0x1904eeb98 start + 6076

indicates that 

The crash is happening in Apple's OpenGL shader compiler (libGLProgrammability.dylib) when OpenSpace tries to compile shaders for the globe rendering. Look at the stack:

Frame 26-29: OpenSpace is compiling shaders for RenderableGlobe
Frame 19-21: Apple's OpenGL implementation tries to link the shader program
Frame 3: The shader compiler encounters something it can't handle and aborts 

Now, this could possibly be due to some filesystem issues, restrictions due to running OpenSpace from command-line from a sub-folder of my home folder instead of Applications folder, but I got a similar crash when running OpenSpace inside UTM on Ubuntu 24.04 (using the daily build deb file yesterday) if I enable hardware acceleration. 

Unfortunately, mesa on MacOS doesn't seem to enable software rendering - 
brew install mesa

# Set environment variables to use Mesa's software renderer
export LIBGL_ALWAYS_SOFTWARE=1
export GALLIUM_DRIVER=llvmpipe

# Run OpenSpace
./OpenSpace.app/Contents/MacOS/OpenSpace 

But the same crash is observed. Claude says,
Unfortunately, Mesa on macOS is limited. The Homebrew Mesa package primarily provides: OSMesa (off-screen rendering) and some utilities

But it won't override Apple's OpenGL framework the way it does on Linux. macOS applications are hardcoded to use /System/Library/Frameworks/OpenGL.framework. 

Then, tried disabling hardware acceleration and running the same OpenSpace deb file on Ubuntu 24.04, and that works. Around 8 fps, and the frame-rate does not seem to improve much beyond 20 fps or so even if we use something like onlyEarth.profile or loading individual assets to the empty profile, etc. But this could be still useful for offline work, validating single-precision builds and so on.

And so now to single-precision builds - I'll try to build for Mac Apple Silicon and see what happens.

Also, maybe I can try building for Intel Macs with these patches - with XCode for MacOS26, many of the incompatibilities and unsupported implementations are now ironed out, so we need far fewer patches. And github now has MacOS26 public runners.

Edit: 11 Jan 2026 - Finally OpenSpace for MacOS - Apple silicon - is up and running. Lots of shader patching, especially a tricky one here - Mac build - crashes when shader is called · Issue #75 · hn-88/OpenSpace-AppImage

Thursday, December 11, 2025

Cloudflare timeout - how to use admin site without cloudflare

Copy-pasting from an email thread, about a connection timeout Cloudflare error seen by one of our Wordpress site admins - 

The screenshot shows that you were trying to open a WordfenceScan page. Such pages usually take a long time to load, and it is natural for Cloudflare to time out. 

In case those pages don't have any option to email you the results of the scan or such workarounds, you can disable cloudflare for yourself by directly accessing the site, without cloudflare proxying, by editing the hosts file on your computer.

On Windows, you would do this by going to the start menu, and start typing notepad.exe, right click on Notepad, choose Run as Administrator, and open the file
C:\Windows\System32\drivers\etc\hosts
(since it is just hosts and not hosts.txt, when using File->open to find it, you must choose the drop-down "All files *. *" option.)

In that file, you can add extra lines at the end,

1.2.3.4 ourserver.org

4.5.6.7 staging.ourserver.org


When you are through with your admin work and if you want to access through cloudflare again, you can comment out each of these lines by adding the # symbol as the first character on those lines. This is optional, you can continue to access without cloudflare also.

Why this solution is better than just disabling cloudflare - this can allow general users to have the snappiness of cloudflare proxying while only admins can access the unproxied direct URL.

(After making changes to the hosts file, you may need to close your browser, open it again, and perhaps re-login for the changes to take effect. Or perhaps restart your computer.)

Wednesday, December 10, 2025

where to change the CEF helper executable's name on MacOS - two LLM answers

Two answers from ChatGPT (or is it Copilot?) and Gemini respectively.

Yes — on macOS the CEF helper does not need to be named “AppName Helper.app”.
You can rename it, but the name must be configured in the app bundle structure, the build system, and each helper’s Info.plist.
It is not set in cefhost.cpp.

Below is the definitive breakdown.


✅ Where the helper name comes from (macOS)

CEF on macOS requires three helper bundles:

MyApp.app
 └─ Contents
     └─ Frameworks
         ├─ MyApp Helper.app
         ├─ MyApp Helper (GPU).app
         └─ MyApp Helper (Renderer).app

The names of these helper apps must match the names embedded in Info.plist entries, including:

  • CFBundleName

  • CFBundleExecutable

  • CFBundleIdentifier

  • LSEnvironment (for specifying the subprocess type)


⚙️ Where to change the name

### 1. Xcode / CMake / GN build target name

If you use CMake (CEF standard):

set_target_properties(my_custom_helper PROPERTIES
    OUTPUT_NAME "MyCustom Helper"
)

This determines:

MyCustom Helper.app

2. Helper’s Info.plist

You must update the plist inside each helper bundle:

<key>CFBundleName</key>
<string>MyCustom Helper</string>

<key>CFBundleExecutable</key>
<string>MyCustom Helper</string>

<key>CFBundleIdentifier</key>
<string>com.mycompany.myapp.helper</string>

Each helper type also requires:

<key>LSEnvironment</key>
<dict>
    <key>CEF_PROCESS_TYPE</key>
    <string>renderer</string>
</dict>

(“renderer”, “gpu”, or “zygote” depending on helper.)


3. Main app’s Info.plist linking to helpers

The main app references the helpers in:

  • CEFSubprocessPath

  • or the ChromeHelper mechanism depending on version

A typical example:

<key>CEFSubprocessPath</key>
<string>Contents/Frameworks/MyCustom Helper.app/Contents/MacOS/MyCustom Helper</string>

🚫 NOT set in cefhost.cpp

cefhost.cpp (and other platform code in CEF) does not control helper names.
CEF simply launches whatever bundle/executable path you specify.


✔️ Summary

SettingWhere changed
Helper app nameBuild system (Xcode/CMake/GN)
Executable nameInfo.plist (CFBundleExecutable)
Bundle nameInfo.plist (CFBundleName)
Bundle identifierInfo.plist (CFBundleIdentifier)
CEF subprocess pathMain app’s Info.plist or CEF API call

If you want, I can also provide:

  • A ready-to-use CMake configuration for custom helper names

  • A complete set of 3 macOS helper Info.plists

  • A template for an entire renamed CEF macOS bundle layout


Gemini says,

Yes, you can rename the CEF helper application to something other than AppName Helper.app. This is common for branding or obscuring the use of CEF.

To do this, you must coordinate changes in two places: the filesystem (the actual app bundle) and the source code (CefSettings).

Step 1: Rename the Helper Bundle (File System)

You need to change the name of the helper application bundle itself and its internal executable.

  1. Rename the Bundle: Change YourApp Helper.app to CustomName.app inside your main application's Contents/Frameworks/ directory.

  2. Rename the Executable: Inside CustomName.app/Contents/MacOS/, rename the executable binary from YourApp Helper to CustomName.

  3. Update Info.plist: Open CustomName.app/Contents/Info.plist and update these keys to match your new name:

    • CFBundleName: CustomName

    • CFBundleExecutable: CustomName

    • CFBundleIdentifier: (Optional but recommended) com.yourcompany.CustomName

Step 2: Configure CEF (Source Code)

You must explicitly tell CEF where to find this newly renamed sub-process, or it will continue looking for the default AppName Helper name.

You do this by setting the browser_subprocess_path in the CefSettings structure. This should be done in your application's initialization code (likely where you call CefInitialize). If you are using a file named cefhost.cpp, that is likely where this code resides.

Code Example:

C++
// In your main process initialization (e.g., cefhost.cpp or main_mac.mm)
CefSettings settings;

// ... other settings ...

// Get the main bundle path
CefString main_bundle_path = CefGetMainBundlePath();

// Construct the full path to your renamed helper
// Path: Contents/Frameworks/CustomName.app/Contents/MacOS/CustomName
std::string helper_path = main_bundle_path.ToString() + 
                          "/Contents/Frameworks/CustomName.app/Contents/MacOS/CustomName";

// Convert to CefString and assign to settings
CefString(&settings.browser_subprocess_path) = helper_path;

// Initialize CEF
CefInitialize(main_args, settings, app, sandbox_info);

Important Note for Modern macOS (Catalina+)

Since macOS 10.15 (Catalina), strictly secure applications are required to use multiple helper apps with specific entitlements (e.g., one for GPU, one for Rendering, one for Plugins).

If you are shipping a modern, notarized macOS app, you generally need 4 distinct helper bundles:

  1. CustomName.app

  2. CustomName (GPU).app

  3. CustomName (Renderer).app

  4. CustomName (Plugin).app

If you rename the main helper, you should ensure you rename/configure these variants as well if your build system generates them. However, setting browser_subprocess_path usually targets the "main" helper executable, which acts as the entry point for all sub-processes unless configured otherwise.

Summary Checklist

  • [ ] Rename YourApp Helper.app -> CustomName.app

  • [ ] Rename binary inside Contents/MacOS/

  • [ ] Update Info.plist (BundleName, Executable)

  • [ ] Set settings.browser_subprocess_path in your C/C++ code.

Change Application Display Name in Toolbar on macOS

This video demonstrates how to modify the Info.plist and CFBundleName for a macOS application, which is a necessary step when renaming your CEF helper app bundle.


Tuesday, December 09, 2025

Xcode update - "Xcode 1.5 not supported"

Copy-pasting an answer from one of the LLMs (I don't remember which one, maybe duck.ai)

The CMake error "Xcode 1.5 not supported" when building on macOS 15.5 indicates a version mismatch between your CMake installation and your Xcode installation.
Understanding the Issue:
  • Xcode 1.5 is a very old version of Apple's integrated development environment. It predates many modern macOS features and compiler toolchains.
  • macOS 15.5 is a relatively recent operating system. This means it likely requires a much newer version of Xcode and its associated command-line tools to function correctly.
  • CMake needs to be able to find and interact with a compatible Xcode installation: to generate build files and compile your project. If CMake detects an unsupported or outdated Xcode version, it will throw this error.
Resolving the Error:
  • Update Xcode:
    The most likely solution is to update your Xcode installation to a version compatible with macOS 15.5.
    • Open the Mac App Store and search for "Xcode."
    • Download and install the latest available version.
    • After installation, open Xcode to complete any initial setup and agree to the license agreements.
  • Install Xcode Command Line Tools:
    Even if you update Xcode, you might also need to explicitly install or update the Xcode Command Line Tools, as these contain the compilers and other utilities that CMake relies on.
    • Open Terminal and run the following command:
Code
        xcode-select --install
  • Follow the on-screen prompts to complete the installation.
  • Update CMake: While less likely to be the primary cause, ensuring you have a recent version of CMake is good practice.
    • If you installed CMake via Homebrew:
Code
        brew update        brew upgrade cmake
  • If you installed CMake manually, download the latest version from the official CMake website and follow the installation instructions.
  • Verify Xcode Selection: Ensure that your system is pointing to the correct Xcode installation.
    • In Terminal, run:
Code
        xcode-select -p
  • This should output the path to your current Xcode installation (e.g., /Applications/Xcode.app/Contents/Developer). If it's incorrect or points to an older version, you can set it using:
Code
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
(Adjust the path if your Xcode is installed elsewhere).
After performing these steps, try running CMake again to generate your build files. The error should be resolved.