Tuesday, November 29, 2022

Mini review of Qubo Pro dashcam

There are various reviews on youtube, like this one, which give more details about this dashcam. I purchased it since it was one of the lowest priced dashcams with good reviews on Amazon. 
  • The "audio notification" feature quickly turns annoying on our rough roads, it keeps chiming. So I turned it off via the app. 

  • I used it initially with my existing 2 GB mini-SD card, but they recommend faster newer cards - maybe with a faster card, I won't see the frame skipping as seen in the "manual mode" recording below.

  • If we download a recording, it is approx 1 minute long, as the reviews suggest. Around 30 MB. So, a 64 GB card can have around 2000 minutes or 30 hours of video.

  • General recordings are FIFO auto-deleted, "Emergency" recordings, based on the accelerometer jerk detection, are not auto-deleted as quickly. We can set the number of "Emergency" recordings to keep, and it will auto-delete older ones only after that limit is reached.  

  • The time-lapse feature captures 640 x 480 frames - an example embedded below. The audio track for the time-lapse is also created by the app. Apparently it is something which is licensed for Youtube uploads.

  • I will add a video recorded in "manual mode" on the app below. During manual mode recording, I believe nothing is saved on the mini-SD card, and the app needs to be in the foreground with the mobile switched on. If we turn off the mobile's screen during recording, the recording is lost. We need to manually press the record icon and stop recording, only then the recording is seen in the app gallery. It is saved as mp4, but with a H265 or HEVC codec or something like that. Probably the dropped frames are due to my mobile phone's internal memory or CPU not being fast enough? Samsung Galaxy M12. 


  • Edit: Found that the one minute clips recorded on the miniSD card have a small overlap of a few frames - 10 frames or so - each. So no data is supposed to be lost between clips. 1800 frames recorded in each segment. So, with the overlap, slightly less than a minute of unique content each. Filenames are like  
    VIDEO_30112022085501_1669778701951.mp4
    VIDEO_30112022085600_1669778760947.mp4
    So assuming a time-stamp in milliseconds, via Epoch Converter
    08:55:01.951 to 08:56:00.947 - so probably one second of overlap.

  • Edit: Here are a couple of videos - one from the running car, one from the timelapse generated for an entire day of driving to Bangalore and back.
    Approx. six hours of driving = 6*3600 = 21600 seconds.
    The timelapse = approx. 3 minutes at 5 fps = 900 frames. 
    So, the timelapse was shot at approx. one frame every 30 seconds? Or some other scene-based method? Will try looking at the raw files and see.

    Looking at the files saved on the miniSD card, there is a folder called Timelapse created, with the saved files used to make timelapse videos. There are 5 timestamp files per minute. According to the timestamp of the file, once every 12 seconds. According to the filename, which is like
    timelapse_1669964034331.jpeg
    timelapse_1669964022031.jpeg
    subtracting the unix timestamps, 12.3 seconds between the frames.




Edit: More videos of the complete drive are available at this post.



Sunday, November 20, 2022

Google Play store blues - trying in vain to update our app - shortcut to update version code

Updates to one of our apps was being blocked by Google Play console.

Initially, in the developer console, there was a Policy Declaration we had to make, stating the reason for adding a particular sensitive permission - in this case, REQUEST_INSTALL_PACKAGES permission.

There was a form to appeal the rejection, but submitting that just gave a generic reply saying the appeal was rejected.

The Moodle app's repository meanwhile mentioned this issue, and gave a fix - https://tracker.moodle.org/projects/MOBILE/issues/MOBILE-4134?filter=doneissues

But even after uploading a version of the app with these fixes, the same generic automated rejection of the update. Then I tried the "reaching out to our policy support team" link at the bottom of the email. 

It was not very clear where exactly I should reach out to the policy support team in this screen, but I guessed it was via the arrow to the right of the "Appeals" section. I specifically mentioned that this permission had been removed, but the "policy declaration" could not be removed - there is no provision on the console to do that.

Again I got a template email as a reply saying "we are unable to approve your app's use of REQUEST_INSTALL_PACKAGES", but at the bottom of that email, there was some additional information -

Step 2: Submit a compliant update or remove the permission from your app

Once you’re ready to submit a compliant version of your app:

  1. Make the necessary updates to address the issue(s) identified above OR please remove the permission from your manifest AND in-app functionality.
  2. Double check that your app is compliant with all other Developer Program Policies.
  3. Sign in to your Play Console, upload the modified, policy compliant APK across all tracks, and deactivate the non-compliant APK(s). 
    1. To deactivate a non-compliant APK, please create a new release and upload a compliant APK to the same track.
    2. Be sure to increment the APK version number and set the release to 100% rollout, in order to successfully override and deactivate the non-compliant APK. 
  4. To save any changes you make to your release, select Save.
  5. When you've finished preparing your release, select Review release.

Kindly note that your changes aren't sent for review automatically. You must go to the Publishing overview page and click Send for review to submit your changes.

Aha - so I have to deactivate non-compliant APKs on all tracks - not just the Production track. And how should I deactivate?

https://stackoverflow.com/questions/48624580/how-to-deactivate-my-previous-version-retained-apk-in-play-store

So I have to go to each track and add a new version with "Create New Release". For that, I had to create one more version of the "fixed" APK, since the current "proper" release had been auto-rejected - I had to build another apk with an incremented version code. One of the rejected apks had a higher version code than the current "fixed" version. So, I added one to that to get my next version code - though retaining the same version name and version number displayed inside the app, which have to be changed via config.xml and moodle.config.json. 

For changing only the version code, I just did Edit --> Find --> "Replace in files" inside Android Studio for the old version code with the new version code, with "Scope" as the "search in" parameter. It found 7 matches in 6 files or something like that. 7 clicks of "Replace" later, clicking on "Generate signed APK" got me the fresh apk which I could upload to the Play store. Much easier than going through the entire Cordova build process. 

Now, after submitting all these tracks, it looks like the update has not been auto-rejected. I also edited the "Policy declaration" mentioning that this permission is no longer needed. Perhaps after the update is reviewed, the policy declaration change - where this permission is not listed - would also happen. We have to wait and see. Maybe a week.

Edit: The update went through in 2 days.



Friday, November 18, 2022

Avisynth Resize and not Blur

I wanted an effect similar to news videos which have blurred bands on both sides of the frame. First, I tried Avisynth Blur filter, but even with a 3x chained filter with the max settings, the blurring was not sufficient. Then I tried Avisynth Resize, something like 

BilinearResize(1920, 1080, src_left=10, src_top=10, src_width=200, src_height=300)

That did the trick. Not perfect, since only a part of the source video is being sampled, but sufficient for my purpose. 

cloudflare origin server certificate for a bitnami moodle server

An earlier post had noted various workarounds for renewing certificates of cloudflare proxied bitnami servers. When a new server was required now, I tried out the cloudflare-provided origin server certificate.

We get the certificate and private key from Cloudflare dashboard --> Domain --> SSL/TLS --> Origin server. We just have to ssh into the bitnami server and copy-paste the content of the certificate to server.crt and contents of the private key to server.key respectively, at /opt/bitnami/apache/conf/bitnami/certs/

This is so because the Bitnami Moodle installation already had the ssl configuration set up in the ssl conf file at at /opt/bitnami/apache/conf/

Edit: 10 Feb 2023 - on a fresh bitnami moodle install, just doing the above was causing bitnami services to not start up after a restart. An additional step - I needed to save the root certificate as

/opt/bitnami/apache/conf/server-ca.crt

as mentioned at serial number (4.) at

https://developers.cloudflare.com/ssl/origin-configuration/origin-ca

and linked from that page.

Thursday, November 17, 2022

increase swap size on Linux

From Linux Mint forums,

inxi -Sp
swapon
# to see if a swapfile is being used. If yes, then
sudo swapoff -a
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress
# took around 10-15 seconds
sudo chmod 0600 /swapfile
sudo mkswap /swapfile
sudo swapon -a

and then reboot for the changes to take effect. 

Wednesday, November 16, 2022

mailchimp as an alternative to feedburner emails

When google turned off feedburner emails, I just removed the "subscribe to emails" link. The other day, I happened to come across this link, 
https://cascadevalleydesigns.com/moving-subscribers-away-from-feedburner-and-into-mailchimp-updated-guide/

So, I'm trying out this on another blog. 

Some points to note:
  • After logging in to feedburner, we can download the list of email subscribers as csv from the "three vertical dots" menu.
  • We can import this with or without editing into mailchimp contacts.
  • Mailchimp free account has a footer with mailchimp logo etc.
  • I tried to customize my feed by choosing the rss feed to be
    myblogname.blogspot.com/feeds/posts/default?updated-min=2022-11-14T00:00:00
    because my latest posts there are dated 1992. If we choose the default feed, the 1992 posts are not shown, only 2022, 2021 etc are shown. 
  • We can preview RSS feeds using online tools like RSS Feed Viewer
  • As mentioned in the howto post at the top of this email, mailchimp has made it difficult to find RSS integration. Google search for mailchimp rss by email finds the relevant page with a link to the rss setup, to which we can directly click through if logged in to mailchimp. 
  • After choosing the campaign email theme, we are redirected to a graphical design page. There, we need to drag and drop the RSS title and RSS content blocks into our email. Otherwise the RSS feed won't be part of the email!

Edit: Unfortunately, the RSS feed which I have mentioned above does not seem to work with Mailchimp. Since I don't want to use the blog/feeds/posts/default feed, I'm stuck with either manual campaigns on Mailchimp or some other solution. Perhaps using Google Apps Scripts, since the number of emails to be sent is very small. 

Tuesday, November 15, 2022

exploring jekyll for our websites

Since Github Pages support jekyll, I took a look at some jekyll templates which could be customized to fit the desired "menu links on the left, full-page content on the right" theme. 

Among the supported themes, Dinky seemed to be the best bet, after customizing its colours. But the amount of work needed to customize the themes, followed by re-writing the existing HTML pages in markup, seems to be unnecessary for our needs. I can probably just tweak the css files and/or edit html tags and get the desired results. Jekyll might be more useful for someone who wants to create fresh pages every day, or blog, or something like that. 

Moodle manual backup

Followed the broad outline at https://www.handybackup.net/moodle-backup.shtml, so

  1. SQL db data dump - I used DBeaver on my local machine. Using the command-line on the server would have been faster, but I was not sure if some options would have caused problems.

  2. Moodle code - just for safety, zipped the entire directory - but I could have discarded the .git sub-directory.
    zip -r moodledir.zip /var/www/moodledir

  3. Moodle data - Zipped only filedir directory, since other things like cache are not required for the backup. 

After using rclone to copy the 72 GB data dir zip file to a Shared drive in Google Drive, I tried using Google Drive Desktop on Windows to make a local copy. First attempt at directly copying from drive to a USB external hard disk - failed with semaphore timeout has expired error. Then tried with internal SSD, again the same error. Then I tried with rclone, success.

rclone copyto gdrive:/our_data-filedir20221112.zip ../our_data-filedir20221112.zip --progress

Transferred:       73.856 GiB / 73.856 GiB, 100%, 0 B/s, ETA 0s
Transferred:            1 / 1, 100%
Elapsed time:    2h40m9.5s

Monday, November 14, 2022

Blogger does not show correct preview image for youtube playlists - workaround

If we embed a youtube playlist in a blog post on Blogger, the preview image for the post shown on index pages is the youtube broken link preview image. My workaround was to embed the videos in the playlist BEFORE the playlist on the same post, in reduced size - only 81 pixels wide. Then the preview shows the preview image of the first video embedded, and all is well.

Sunday, November 13, 2022

using Google Drive for desktop

Some points for using Google Drive for desktop - may be easier to use than rclone for some users, but the following can be potential stumbling blocks:
  • By default, C:\Users\yourusername\Appdata\Local\Google\DriveFS is used as a temp file location - this can cause problems when trying to "stream" large files with C: drive running out of disk space.

  • To change this setting - and to change from "streaming" to "mirroring" and so on, we need to right-click on the taskbar icon (which is usually hidden by default, so we have to click on the up-arrow to show this icon first) --> the Gear icon --> Preferences then again click on the Gear icon in the window which comes up. A bit clunky.

  • This is the interface now (November 2022), but may change in the future.

  • Edit: Google Drive for Desktop does not work very well with very large files. rclone is better in such cases. For example, see my next post.

rclone and out of band flow authentication error

I needed to copy some files from our server to Google Drive. Tried to download directly to my local machine where google drive desktop had been installed. Failed twice, then realized that the error shown by Filezilla was "unable to write to local file" and not connection error - the temp folder was running out of disk space, I guess. So, tried rclone to directly transfer from the server to Google Drive. 

Rclone initially gave the out of band flow authentication error. Then I installed version 1.6 by downloading the deb file,

wget https://github.com/rclone/rclone/releases/download/v1.60.0/rclone-v1.60.0-linux-amd64.deb
sudo dpkg -i rclone-v1.60.0-linux-amd64.deb
rclone config

With that, when I choose n for whether to use auto config, it asks for a local machine with a browser which has rclone installed. So I downloaded rclone to my local machine, ran rclone as requested with the required parameters as prompted, pasted the auth key, and could create the GDrive remote. 

Since I needed to copy only a single file, instead of mounting the remote, I just did
screen 
rclone copyto src/file/path remotename:/path --progress 

The file copy was going at around 2 or 3 MBytes per second when I was transferring via my local machine on BSNL fiber with Google drive desktop in "streaming" mode. 

When doing direct server to server transfer from Azure to GDrive using this rclone method, the transfer was going approx 10x faster. 200+ Mbps.

Thursday, November 10, 2022

adding google analytics 4 code to Blogger

There seem to be many requests for adding google analytics 4 to Blogger, but as of now, it looks as if support is only through adding the javascript code as a custom HTML/JS block in Blogger's Layout settings - screenshot below.



Monday, November 07, 2022

Building the cordova-based Moodle app v4.0.2 on Github Actions

It turns out that building the latest version (4.0.2) of the Moodle app on github actions is much easier than on travis-ci, because
  • The Travis build environment seems to have Java 8 by default, and the latest version of the Android SDK (for SDK level 31 and above) need Java 11 
  • Github actions seem to have all the latest build tools etc pre-installed.
The github actions yml file, which has all the commands necessary for a debug build, is at 
https://github.com/hn-88/LMSapp/blob/main/.github/workflows/buildSSSVV.yml 

Can refer to Notes on building the cordova-based Moodle app for Android for more info on building release version, etc.

Edit: In my implementation, I used manually triggered actions - https://levelup.gitconnected.com/how-to-manually-trigger-a-github-actions-workflow-4712542f1960 - by having the line
on: workflow_dispatch




Thursday, November 03, 2022

subtitling and flat video workflow

For subtitling and displaying a flat video on the planetarium dome,

  • Aegisub for subtitling

  • Avidemux for resizing - for a quick and dirty solution, adding 360 pixels of black padding above a 720p video (and suitable padding on left and right) gives an acceptable video.

  • Better aesthetics can be done with adding a background video with an alpha mask (created in Gimp) and overlaid with Avisynth's Overlay and Mask. Or Layer, which I used, similar to the example in the documentation, where our video was the bg, and the "background video" was on top.
    bg  = AviSource("the-flat-video.avi").ConvertToRGB32      
    mk  = ImageSource("mask.jpg").ConvertToRGB32       
    top = AviSource("video-to-fill-rest-of-space.avi").ConvertToRGB32.Mask(mk) 
    Layer(bg, top)                                   
  • For wider dome coverage - like 180 degrees horizontal coverage for a 1080p flat video - we can use OCVWarp after overlaying the video on a 4k background. Or use OCVvid2fulldome if final output is a square-frame fulldome file.

Wednesday, November 02, 2022

project language shown as Mercury in Github

One of my github repos was being displayed as having Language: Mercury instead of C or C++. The problem and resolution is at https://github.com/hn-88/OCVWarp/issues/16 - following https://dev.to/katkelly/changing-your-repo-s-language-in-github-5gjo

Basically I just needed to create a .gitattributes file, with the line

*.m linguist-detectable=false