Mostly work related stuff which I would've entered into my "Log book". Instead of hosting it on an intranet site, outsourcing the hosting to blogger!
Friday, November 28, 2025
MIDI-mapper for OpenSpace (or any javascript API)
Thursday, November 27, 2025
Bosch Wiper blades for Hyundai Santro
PB helped me out with the following info:
List shows 20" on Driver side and 16" on Passenger side
Bosch Clear Advantage — a flat-blade / beam-style wiper. Designed to give uniform pressure across the windshield, better contact, smoother wiping, and more streak-free clearing (especially good in heavy rain or at high speeds).
Bosch ECO (conventional / bracket-frame wiper) — a more traditional wiper with a metal (or mixed) frame + rubber blade. Usually more budget-friendly and covers basic everyday wiping needs.
Bosch Clear Advantage 16"
Friday, November 21, 2025
hardware accelerated video encoding on Intel Iris graphics has issues with jpg frames input - resolved
From ChatGPT,
ffmpeg -i filename_%05d.jpg -c:v hevc_qsv -preset veryslow -global_quality 0 output_lossless_qsv.mkv
- -i must come before input options end.
- All encoder options (-c:v, -preset, -global_quality) must be placed after the input and before the output filename.
With audio, we would need something like
ffmpeg -r 30 -i KG-LS_%05d.jpg -i audio.wav \
-c:v hevc_qsv -preset veryslow -global_quality 0 \
-c:a aac -b:a 192k \
-shortest \
output_with_audio.mkv
# or on Windows,
ffmpeg -r 30 -i KG-LS_%05d.jpg -i audio.wav ^
-c:v hevc_qsv -preset veryslow -global_quality 0 ^
-c:a aac -b:a 192k ^
-shortest ^
output_with_audio.mkv
....
....
Brevo transactional emails and DNS setup.
Saturday, November 15, 2025
strategies for dealing with Google Workspace account filling up
Sunday, November 09, 2025
Send user digests - Moodle task fails - sends hundreds of emails to Admin
# Individual discussion subscriptions might still exist
DELETE FROM prefix_forum_digests;
DELETE FROM prefix_forum_discussion_subs;UPDATE prefix_user SET maildigest = 0 WHERE emailstop = 1;# Users might be getting auto-subscribed when they post
UPDATE prefix_forum SET trackingtype = 0;TRUNCATE prefix_forum_track_prefs;Tuesday, November 04, 2025
run 'Issue Certificates' task more often
Set to run every hour at the 30th minute (8:30, 9:30 etc) on one instance and at the 45th minute (8:45, 9:45, etc) on the other instance, in Site Administration > Server > Tasks > Scheduled tasks > \mod_customcert\task\issue_certificates_task
Wednesday, October 29, 2025
installing python modules on Linux and Windows
Tuesday, October 28, 2025
proctoring plugins for Moodle
... would require us to conduct a proctored test. Moodle has several plug-ins. They are promoting 'Proctoring for Moodle'. I also find Quilgo to be good. Can we install these 2 plug-ins (and any other plug-in recommended by you) in (our dev server) for us to test them out?
Here is a list of proctoring plugins for Moodle, probably you would have seen this already. https://moodle.org/plugins/?q=proctor
'Proctoring for Moodle' is free software, but if you want to use the automated face-recognition, they ask us to contact them. "Moodle Proctoring plugin is a Quiz Access plugin designed to capture a user's picture via webcam to identify the individual attempting the Moodle quiz."
A demo is at https://www.youtube.com/watch?v=NcrE1OIj6_Q
In that video, it is mentioned that features like capturing student's screen for "suspicious behaviour" like copy-pasting into Google etc, requires Proctoring Pro.
But the "purchase" Proctoring Pro link seems to be broken. -
https://proctoring.elearning23.com/
https://elearning23.com/moodle-proctoring-pro-details/
https://elearning23.com/wp-content/uploads/2024/10/Proctoring-Pro-v2.0.0-User-Manual.pdf
(page not found etc)
"Quilgo® Proctoring for Moodle is a highly scalable plugin that allows you to include a camera, screen, track activity, and receive reports on test completion. Online assessments become easier and more reliable. Easy to use, no API customization or maintenance required." But the free plan is only for 20 tests, and the cheapest paid plan is $1200 for a year or $140 for a month.
https://quilgo.com/products/moodle
A demo/tutorial is at https://www.youtube.com/watch?v=-pwwImIprSM
I have installed 'Proctoring for Moodle' and "Quilgo® Proctoring for Moodle" on (our dev server) now.
Saturday, October 25, 2025
can QUIC be added to our dot net app
Sunday, October 19, 2025
handwriting recognition - ChatGPT is still the best
Saturday, October 18, 2025
claude is good at coding
Friday, October 17, 2025
slerp javascript
Thursday, October 09, 2025
python QT UI in VisOCT-Explorer
Via email notification from researchgate about this preprint, https://doi.org/10.1101/2025.10.01.679626
https://github.com/FOIL-NU/VisOCT-Explorer
uses python QT gui,
https://wiki.qt.io/PySide_Binaries_Linux
Tuesday, October 07, 2025
Moodle Course Completion
Friday, October 03, 2025
hidden restrictions in Airtel's "unlimited 5G" plans
According to this youtube video, there are some terms and conditions which are shown only in the Airtel app, by which
- If Airtel thinks it is being used for commercial purposes, they can restrict the "unlimited 5G"
- If the data transferred exceeds 300 GB in a month, they can consider it "commercial"
- Tethered use of 5G data - using a mobile hotspot - is not included in the "unlimited 5G"
https://androidsrc.net/android-samsung-phone-symbols/
Sunday, September 28, 2025
Youtube 360 VR videos with a poor internet connection
internet problems with our old wifi router
Tuesday, September 23, 2025
Google Apps Script - get the email of signed in user
Edit - In this implementation, the second script would open in a new tab or new window, with target=_blank when submitting the form - I was asked if it could open in the same window. Tried it, the answer was that no, opening in the same window will not work. Probably because of “X-Frame-Options” or other HTTP headers that block embedding / cross origin operations.
Monday, September 22, 2025
warping with ffmpeg - and some filter_complex examples
ffmpeg -i input.mp4 -i map_x_directp2.pgm -i map_y_directp2.pgm -i weight_alpha_mask.png -filter_complex " [0:v]scale=3840:2160[scaled]; [scaled][1:v][2:v]remap[remapped]; [3:v]format=gray,scale=3840:2160,colorchannelmixer=rr=1:gg=1:bb=1[mask_rgb]; [remapped][mask_rgb]blend=all_mode=multiply[out] " -map "[out]" -map 0:a -c:v hevc_nvenc -preset p5 \
-cq 23 -rc vbr -maxrate 15M -bufsize 26M \ -c:a aac -b:a 128k output.mp4
-t for the duration should come just before the filter_complex -
Friday, September 19, 2025
screen capture or screen recording with Linux on NVidia cards
Thursday, September 18, 2025
dd command to create linux boot disk
via https://linuxvox.com/blog/create-usb-boot-linux-mint/
sudo dd if='/path/to/linuxmint-22-cinnamon-64bit.iso' of=/dev/sdd bs=4M status=progress
2810183680 bytes (2.8 GB, 2.6 GiB) copied, 140 s, 20.1 MB/s
So, on my machine, it took less than three minutes to create a 2.8 GB boot disk.
Wednesday, September 17, 2025
Fujitsu mini PC not booting
Edwiser Bridge Plugin for Moodle
Tuesday, September 16, 2025
the find command and mtime - finding disk space used by old files
Asked ChatGPT, "linux commandline to list total disk space used of all files created or modified inside a directory more than one year ago" and got the following -
You can do this with find + du or find + stat + awk.
Here’s a one-liner that lists the total disk space used by files in a directory older than one year:
find /path/to/dir -type f -mtime +365 -printf "%s\n" | \
awk '{sum+=$1} END {print sum/1024/1024 " MB"}'
Explanation:
-
find /path/to/dir→ search inside that directory. -
-type f→ only files. -
-mtime +365→ modified more than 365 days ago (roughly one year). -
-printf "%s\n"→ print file sizes in bytes. -
awk→ sums up sizes and prints total in MB (divide by1024/1024).
If you prefer human-readable output directly:
find /path/to/dir -type f -mtime +365 -print0 | du --files0-from=- -ch | tail -n1
This gives you a total in du’s human-readable format.
Asked ChatGPT, "tree view of files and directories larger than 1 GB from linux command line" and got the following -
You can combine find, du, and tree-style output to list only files/directories larger than 1 GB in a tree view. Here are a couple of approaches:
1. Using find with tree
find /path/to/search -type f -size +1G -print | tree --fromfile
-
find ... -size +1G→ finds files > 1 GB -
tree --fromfile→ prints a tree structure from the list
If you want directories too (based on contents size), use du instead (see below).
2. Using du for directories/files with sizes
du -h --threshold=1G --max-depth=3 /path/to/search | sort -h
-
--threshold=1G→ only show entries larger than 1 GB -
--max-depth=3→ how deep to go -
sort -h→ human-readable sort
This shows sizes and paths (not tree formatting, but size summary is clearer).
3. Pretty tree-like display with du
du -h --threshold=1G --max-depth=3 /path/to/search | sort -hr |
awk '{print $2}' | tree --fromfile
This gives you a tree structure of directories/files whose total size is ≥ 1 GB.
✅ If you want only the largest offenders (say top 20 big files/directories over 1 GB), you can do:
find /path/to/search -type f -size +1G -exec du -h {} + | sort -hr | head -20
For this, I had to sudo apt install tree
Sunday, September 14, 2025
started using github projects for task tracking
How to use github projects - a getting started video -
https://www.youtube.com/watch?v=oPQgFxHcjAw
Opened a private repo with issues, and with ChatGPT's help, linked it to a project. (Projects --> New Project in the github web UI for that repo). Automation to create a new issue worked after some tweaking - the github actions yml is copy-pasted below:
name: Instantiate Planetarium Show Task
on:
workflow_dispatch:
inputs:
show_title:
description: 'Title of the Planetarium Show'
required: true
deadline:
description: 'Deadline'
required: false
permissions:
issues: write
contents: read
jobs:
create_task_issue:
runs-on: ubuntu-latest
steps:
- name: Build issue content
run: |
echo "## Show Details" > issue.md
echo " " >> issue.md
echo "**Show Title:** " >> issue.md
echo "${{ github.event.inputs.show_title }}" >> issue.md
echo "" >> issue.md
echo "**Deadline:** " >> issue.md
echo "${{ github.event.inputs.deadline }}" >> issue.md
echo "" >> issue.md
echo "## Steps" >> issue.md
echo "" >> issue.md
echo "- [ ] Create script" >> issue.md
echo "- [ ] Create Hindi translation" >> issue.md
echo "- [ ] Create Telugu translation" >> issue.md
echo "- [ ] Review Hindi translation" >> issue.md
echo "- [ ] Review Telugu translation" >> issue.md
echo "- [ ] Record Hindi VO" >> issue.md
echo "- [ ] Record Telugu VO" >> issue.md
echo "- [ ] Edit Hindi VO" >> issue.md
echo "- [ ] Edit Telugu VO" >> issue.md
echo "- [ ] Warp ready for our theatre" >> issue.md
echo "- [ ] Eng-Hin-Tel audio" >> issue.md
echo "- [ ] Final audio mix" >> issue.md
echo "- [ ] Save backups" >> issue.md
echo "- [ ] Post on website" >> issue.md
echo "" >> issue.md
echo "---" >> issue.md
echo "" >> issue.md
echo "" >> issue.md
- name: Create issue from template
uses: peter-evans/create-issue-from-file@v4
with:
title: "[Show] ${{ github.event.inputs.show_title }}"
content-filepath: issue.md
token: ${{ secrets.GITHUB_TOKEN }}
labels: show,task
This script had to be re-written due to ChatGPT repeatedly using heredoc syntax which would clash with github's yml. I had to explicitly ask it to "Please use echo >> on each line, and no heredoc."
One more automation script to automatically move the items in the project from "TODO" to "In Progress" when any of the checkboxes above were clicked, failed. ChatGPT usually fails when the documentation is not complete and / or there are conflicting earlier documentation pages, as in this case. It would repeatedly suggest using
permissions: issues: write projects: write
when actually such a permission is no longer accepted by Github - it was part of "classic projects" - https://docs.github.com/en/enterprise-server@3.16/issues/planning-and-tracking-with-projects/creating-projects/migrating-from-projects-classic.
Apparently with projectsV2, the REST api does not work, only GraphQL API works. And it needs a classic personal access token to work. And the code generated by ChatGPT had errors which I could not get it to fix after multiple iterations over multiple days, so I just left updates to be done manually by clicking on the drop-down seen in the linked project for each issue. I could probably read the GraphQL API documentation and try again, but right now, not motivated to do so.
Tuesday, September 09, 2025
unable to use key-based auth
Monday, September 08, 2025
forcing 2FA for all cloudflare users
After a cloudflare advisory asking us to rotate credentials due to a "Compromise Impacting Cloudflare Salesforce Cases", I was asked to force 2FA for all cloudflare users.
https://developers.cloudflare.com/fundamentals/user-profiles/2fa/
The force-2FA option is available for super-admins in the cloudflare admin panel, at
Manage Account > Members > Members 2FA enforcement.
Saturday, September 06, 2025
getting referral ids for Moodle course enrolments
https://github.com/hn-88/moodle-plugin-local-referrals/tree/main/temporary%20python%20code
error_log('[local_referrals] function on_user_enrolled() ... ');
the referral id in $SESSION was being set to null when the user was logging in to our site.
https://github.com/hn-88/moodle-plugin-local-referrals/
https://github.com/hn-88/moodle-plugin-local-referrals/wiki
Friday, September 05, 2025
Microsoft Azure - no meaningful way to contact regarding technical issues for non-profits
Thursday, August 28, 2025
resizing an Azure VM
Tuesday, August 26, 2025
admin takeover of subdomain in Microsoft Azure
One of the subdomains of one of our domains had users actively using OneDrive and so on, and the admin of that domain wanted to implement some policies / restrict some users / or something like that. Looking around for options,
https://learn.microsoft.com/en-us/entra/identity/users/domains-admin-takeover
Probably need to do internal takeover since OneDrive etc don't support external takeover. But right now, nothing has been done.
Saturday, August 23, 2025
connections problems to an AWS server
Wednesday, August 13, 2025
using ABeeZee TTF font on a Moodle instance
Tuesday, August 12, 2025
making persistent USB Ubuntu 24.04
Wednesday, July 30, 2025
Virtualbox error - Cannot register - the hard disk already exists
Sunday, July 27, 2025
turn off gmail "smart" summaries
via https://www.digitalinformationworld.com/2025/05/gmail-is-reading-and-summarizing-your.html
On Android --> GMail app --> Hamburger menu --> Settings --> choose the account for which you want to disable --> Untick smart features checkbox
Monday, July 21, 2025
lots of github and Mac learnings
- XCode support for some C++ features is missing - C++ language support - and in some cases, AppleClang's interpretation is stricter than gnu c++ or MSVC. Also, some flags specific to MacOS would change from old versions to new versions of MacOS. And homebrew support for older Macs is spotty. So, supporting Macs is a challenge.
- Verifying and testing on github runners has some issues due to their headless nature.
- Uploading to draft releases works best if that draft release is pre-created - sometimes the tag creation takes a few seconds, leading to failure in uploading the artifact to the draft release. Or, can create a new tag, wait for a few seconds, and then upload the artifact to draft release using a personal access token - PAT.
- MacOS, especially after 15.2, does not make it easy to run unsigned apps. Some workarounds which exist now, like removing the quarantine flag from the internal binary, may not work in the future. It is possible that Debug builds may work and (unsigned) Release builds may not work as in the case of Android apk files - unless we add a codesign step after the build.
- Even with the bundling of dylibs using otool, the binary still seems to look for dylibs in /opt/homebrew etc. So, the bundling code suggested by ChatGPT still has flaws. Or maybe there are some dependency calls which are only at runtime and hence not detected by otool.
Saturday, July 12, 2025
2FA required for Google Workspace admin users
- Click your avatar (top-right) and choose Manage your Google Account.
- Click Security in the left pane.
- In the Signing in to Google section, click 2-Step Verification.
- Click the Get Started button.
- Enter your password (if requested).
- Click Continue.
- Click Send to send a text message to your phone.
- Enter the 6 digit code sent to your phone and click Next.
- Click Turn On to finish the process.
- Your account is now protected with 2 step verification.
Monday, June 30, 2025
manual time sync on Ubuntu 24.04
Saturday, June 28, 2025
solution for rendering black frame & moving a Blender keyframe to a different time
Wednesday, June 18, 2025
just git push after git checkout -b existingbranch
Tuesday, June 17, 2025
descreen and perspective correction with gimp
To remove moire patterns due to silk-screened photos from prints, gmic plugin's fourier filter can be used. To install - gimp-gmic is in software manager of Linux Mint.
https://www.youtube.com/watch?v=3137dDa6P4s
According to this video, the way to do it -
1. first fourier transform in gmic
2. Then make the white dots black for everything except centre
3. then inverse
4. then smooth medium (also in gmic)
(This page refers to a specific descreen plugin, but that is for Gimp 2.0 and the link also seems broken, so didn't try out that.)
For perspective correction, especially for "re-clicked" photos taken with mobile from an angle,
Tools --> Transform tools --> Perspective --> choose Corrective (backward) for Direction,
put the four corners in the four corners of the photo to be corrected. Then, the four corners will be stretched to the aspect ratio of the original image. After that, some Transform --> Scale changes may be needed, with aspect ratio unlocked, in case the photo being corrected has a different aspect ratio.
http working but not https
Found that http was working but not httpsThen did the following:root@ourserver:openssl s_client -connect our.domain.org:443 -servername our.domain.organd got the error messageverify error:num=20:unable to get local issuer certificate# comment out in /etc/apache2/sites-enabled/our.domain.org-le-ssl.conf# SSLCertificateChainFile /etc/letsencrypt/live/our.domain.org/chain.pemand then restarted apache2










