My use case for git submodules

I have been chatting on IRC about how I’m learning git so I can use submodules and my friend @indigo wants to know my use case, so this post makes some effort to explain that with reference to one specific example.

I have a web framework/toolkit I am experimenting with called Mudball which is here: https://github.com/jj5/mudball

I use Mudball in (some of) my web projects, for example: https://github.com/jj5/www.jjlab.net

In the main project (in this case www.jjlab.net) I have a copy of Mudball in the ext/mudball directory. At the moment ext/mudball is setup as a git submodule.

I open the main project in my IDE (or text editor) and I want to be able to work on both the main application and the web framework/toolkit at the same time. Then when I’m done with some changes I want to run my `gui` script (it stands for “git update interactive”, not “graphical user interface”) which will increment my version numbers in inc/version.php and ext/mudball/inc/version.php and then add/commit/push any changes in both the main project and the web framework/toolkit.

The code for the `gui` command is here: kickass-libexec/bin/lx-gui.sh, it mostly just defers to lx_vcs_sync() which is here: kickass-libexec/src/2-module/vcs/vcs.sh.

The code which updates the version numbers is here: kickass-libexec/bin/lx-version-increment-patch.sh, it mostly just defers to other modules which are here: kickass-libexec/bin/libexec/version-increment-patch.php and here: kickass-libexec/bin/libexec/inc/version.php.

I have been using a similar setup for a long time with Subversion which uses the svn:externals facility (in place of git submodules) and I have a few scripts which help me manage that. My main tooling for this is known as svnman which is a bunch of scripts I wrote myself: Svnman.

I figured out how to avoid connascence of position

Instead of passing positional arguments to constructors (or functions), instead pass a list of value objects. The type of the value object will tell you the type of the value, so you don’t need to worry about the position. This is a super powerful means of supporting back-compat within your code base so you can move ahead at speed. Having value objects instead of simple types (bools, ints, floats, strings, etc) might have performance implications, but it also can be quite handy. So far so good for my use cases.

Symbol Keyboard | Mini Project JMP001 | Learning Electronics In The Lab With Jay Jay

This post is part of my video blog and you can find more information about this video over here.

You can support this channel on Patreon: patreon.com/JohnElliotV

This is the inaugural Mini Project! I introduced the Mini Projects recently. They are developed and published by Silicon Chip magazine, and sponsored by Jaycar Electronics (which is an Austrlaian electronics store, similar to Radio Shack in the USA, hopefully it doesn’t end up suffering the same fate.)

In this project, codenamed JMP001, we develop a USB keyboard which can send interesting and unusual symbols (which aren’t usually available on a keyboard) to a Windows computer using the alt-codes that it supports in a typical codepage.

For this first Mini Project I felt it was important to actually buy my components from Jaycar which I did for roughly eighty Australian dollary doos. Approximately US$50. The parts I ordered were these:

Belatedly I did also search for rubber feet.

There was quite a lot that went into the production of this video, and we accumulated a lot of links. Those are here:

In the end this first project was relatively successful, and we did get it to work fairly well on one of my Windows computers. As for the rest you can find out for youself in the video!

Thanks very much for watching! And please remember to hit like and subscribe! :)


Following is a product I use picked at random from my collection which may appear in my videos. Clicking through on this to find and click on the green affiliate links before purchasing from eBay or AliExpress is a great way to support the channel at no cost to you. Thanks!

Yum Cha HSC8 6-4A Ferrule Crimper KitThis is an image of the product.notes

Let’s go shopping!

Getting info about recent core dump (on Debian)

This is a note for Future John about how to report a recent coredump (with debugging symbols) on Debian:

DEBUGINFOD_URLS="https://debuginfod.debian.net" coredumpctl gdb

Then bt is a magical gdb command to run to give you the call stack of the thread which… failed?

Fixing duplication in HTML title element for WordPress with Yoast SEO installed

I was having a problem in WordPress for my blog where the title contained duplicate values, like “John’s blogJohn’s blog”.

The fix for me was to edit wp-content/themes/twentyeleven/header.php and disable a bit of the output, as shown below. I basically just added an if ( false ) to disable the code which caused the duplicate content.

This seems to effectively mean that Yoast SEO is in charge of the titles now. You can configure separately the homepage, posts, and pages titles in the Yoast SEO settings. I configure mine in Yoast SEO Settings / Content Types like this:

Homepage
Site title Separator Tagline
Posts
Title Separator Site title
Pages
Title Separator Site title
<title>
<?php
  // Print the <title> tag based on what is being viewed.
  global $page, $paged;

  wp_title( '|', true, 'right' );

// 2024-07-14 jj5 - OLD: I removed this because wp_title() (above) does everything that needs to be done.
if ( false ) {
  // Add the site name.
  bloginfo( 'name' );

  // Add the site description for the home/front page.
  $site_description = get_bloginfo( 'description', 'display' );
  if ( $site_description && ( is_home() || is_front_page() ) ) {
    echo " | $site_description";
  }

  // Add a page number if necessary:
  if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
    /* translators: %s: Page number. */
    echo esc_html( ' | ' . sprintf( __( 'Page %s', 'twentyeleven' ), max( $paged, $page ) ) );
  }
}
?>
</title>

InTheLabWithJayJay.com now with RSS feed

I added RSS capabilities for InTheLabWithJayJay.com. You can subscribe to the whole thing, or just one channel, or just one show, or just one feature… it was difficulty to create the UI to support that without overcomplicating things. I made the link on the RSS icon support different feed depending on which page you are on.

Refactoring jjlab.net

I just spent two whole days refactoring and improving my jjlab.net website.

One thing I had to think very carefully about for my modeling was the class/instance distinction for various things, you can see my notes below.

So channels have shows, and shows have features.

A series has segments, and segments have a video.

A series is an instance of a show, and a segment is an instance of a feature.

Everything is easy when you know how!

John's notes about the design of his model

Fixing compile_commands.json for VS Code and Linux kernel sources

I have my Linux kernel sources setup like this:

-------------------
Fri Jun 14 00:35:24 [bash:5.2.15 jobs:0 error:0 time:2449]
jj5@virtuoso:/home/jj5/repo/git/git.kernel.org/torvalds-linux
$ git remote show origin
* remote origin
  Fetch URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
  Push  URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)
-------------------

The scripts/clang-tools/gen_compile_commands.py runs just fine:

-------------------
Fri Jun 14 00:35:28 [bash:5.2.15 jobs:0 error:0 time:2453]
jj5@virtuoso:/home/jj5/repo/git/git.kernel.org/torvalds-linux
$ scripts/clang-tools/gen_compile_commands.py 
-------------------

But there is a problem with some unknown clang options, as you can see here:

Problems with clang commands in VS Code

So I wrote this collection of sed scripts to delete the problematic options:

-------------------
Fri Jun 14 00:11:28 [bash:5.2.15 jobs:0 error:0 time:1013]
jj5@virtuoso:/home/jj5/repo/git/git.kernel.org/torvalds-linux
$ cat jj5/fix-commands.sh 
#!/bin/bash

main() {

  set -euo pipefail;

  cd "$( dirname "$0" )";

  cd ..;

  local file="compile_commands.json";

  sed -i 's/-mpreferred-stack-boundary=3//g' "$file"
  sed -i 's/-mfunction-return=thunk-extern//g' "$file"
  sed -i 's/-mindirect-branch=thunk-extern//g' "$file"
  sed -i 's/-mindirect-branch-register//g' "$file"
  sed -i 's/-fno-allow-store-data-races//g' "$file"
  sed -i 's/-fconserve-stack//g' "$file"
  sed -i 's/-mrecord-mcount//g' "$file"

}

main "$@";
-------------------

Bug fixed! Thanks to my mates on IRC for helping me fix this one. This clangd extension for VS Code seems to work really well.

p.s. another possible solution is here.

Spiral

My friend sent me this:

a bunch of hardcoded print statement which spiral a counter

It pretty much forced me to write spiral.php and spiral.sh to generate this:

print('1')

print('7 8 9')
print('6 1 2')
print('5 4 3')

print('21 22 23 24 25')
print('20  7  8  9 10')
print('19  6  1  2 11')
print('18  5  4  3 12')
print('17 16 15 14 13')

print('43 44 45 46 47 48 49')
print('42 21 22 23 24 25 26')
print('41 20  7  8  9 10 27')
print('40 19  6  1  2 11 28')
print('39 18  5  4  3 12 29')
print('38 17 16 15 14 13 30')
print('37 36 35 34 33 32 31')

print('73 74 75 76 77 78 79 80 81')
print('72 43 44 45 46 47 48 49 50')
print('71 42 21 22 23 24 25 26 51')
print('70 41 20  7  8  9 10 27 52')
print('69 40 19  6  1  2 11 28 53')
print('68 39 18  5  4  3 12 29 54')
print('67 38 17 16 15 14 13 30 55')
print('66 37 36 35 34 33 32 31 56')
print('65 64 63 62 61 60 59 58 57')

print('111 112 113 114 115 116 117 118 119 120 121')
print('110  73  74  75  76  77  78  79  80  81  82')
print('109  72  43  44  45  46  47  48  49  50  83')
print('108  71  42  21  22  23  24  25  26  51  84')
print('107  70  41  20   7   8   9  10  27  52  85')
print('106  69  40  19   6   1   2  11  28  53  86')
print('105  68  39  18   5   4   3  12  29  54  87')
print('104  67  38  17  16  15  14  13  30  55  88')
print('103  66  37  36  35  34  33  32  31  56  89')
print('102  65  64  63  62  61  60  59  58  57  90')
print('101 100  99  98  97  96  95  94  93  92  91')

print('157 158 159 160 161 162 163 164 165 166 167 168 169')
print('156 111 112 113 114 115 116 117 118 119 120 121 122')
print('155 110  73  74  75  76  77  78  79  80  81  82 123')
print('154 109  72  43  44  45  46  47  48  49  50  83 124')
print('153 108  71  42  21  22  23  24  25  26  51  84 125')
print('152 107  70  41  20   7   8   9  10  27  52  85 126')
print('151 106  69  40  19   6   1   2  11  28  53  86 127')
print('150 105  68  39  18   5   4   3  12  29  54  87 128')
print('149 104  67  38  17  16  15  14  13  30  55  88 129')
print('148 103  66  37  36  35  34  33  32  31  56  89 130')
print('147 102  65  64  63  62  61  60  59  58  57  90 131')
print('146 101 100  99  98  97  96  95  94  93  92  91 132')
print('145 144 143 142 141 140 139 138 137 136 135 134 133')

print('211 212 213 214 215 216 217 218 219 220 221 222 223 224 225')
print('210 157 158 159 160 161 162 163 164 165 166 167 168 169 170')
print('209 156 111 112 113 114 115 116 117 118 119 120 121 122 171')
print('208 155 110  73  74  75  76  77  78  79  80  81  82 123 172')
print('207 154 109  72  43  44  45  46  47  48  49  50  83 124 173')
print('206 153 108  71  42  21  22  23  24  25  26  51  84 125 174')
print('205 152 107  70  41  20   7   8   9  10  27  52  85 126 175')
print('204 151 106  69  40  19   6   1   2  11  28  53  86 127 176')
print('203 150 105  68  39  18   5   4   3  12  29  54  87 128 177')
print('202 149 104  67  38  17  16  15  14  13  30  55  88 129 178')
print('201 148 103  66  37  36  35  34  33  32  31  56  89 130 179')
print('200 147 102  65  64  63  62  61  60  59  58  57  90 131 180')
print('199 146 101 100  99  98  97  96  95  94  93  92  91 132 181')
print('198 145 144 143 142 141 140 139 138 137 136 135 134 133 182')
print('197 196 195 194 193 192 191 190 189 188 187 186 185 184 183')