Back Original

Today I Learned

Learned about the “Dreadful Diamond on Derivation” problem…

Full credit to this stack overflow

Basically, you have an inheritance hierarchy that looks like

  A
 / \
B   C
 \ /
  D

The issue is that if we do A.D(), we could be referring to A::B.D() or A::C.D().

So you can do class A : public virtual B, public C{…) to only inherit the actual methods from C to solve this problem.

I set up neotest and nvim-dap and then removed them from my config. Turns out I prefer vscode once I’m debugging/testing.

Some vscode shortcuts:

  • control+1 focus the text editor group
  • control+shift+e toggle focus of the file tree and text editor group
  • “control+`” focus the terminal, and then toggle it

In information theorylinguistics, and computer science, the Levenshtein distance is a string metric for measuring the difference between two sequences. The Levenshtein distance between two words is the minimum number of single-character edits (insertions, deletions or substitutions) required to change one word into the other. It is named after Soviet mathematician Vladimir Levenshtein, who defined the metric in 1965.[1]

Learned sql, used <https://sqlbolt.com\>. Very helpful tutorial.

Neovim has built in spell checking! No plugins needed

https://neovim.io/doc/user/spell.html :setlocal spell spelllang=en_us enable built in neovim spell checking z= - see spelling suggestions

You can use git mv <from> <to> and git rm [-r] <thing> to move and delete things with git without consequences if you have things like submodules.

https://github.com/mikavilpas/yazi.nvim

Make dunst go to the top right origin = "top-right"; offset = "10x10";

Bash variable parameter extraction + glob stuff

  • ${VARIABLE}%ff removes the first occurrence of ff from the back of VARIABLE
  • ${VARIABLE}#ff removes the first occurrence of ff from the front of VARIABLE
  • ${variable//pattern/replacement} is a form of parameter expansion that replaces all occurrences of pattern with replacement in the value of variable

Open source alternative to zoom https://p2p.mirotalk.com/

In bash you can use ** to get a list of files in the current directory. You can even pattern match with like **.nix

So, like

for file in **; do
    echo $file
done

And file is the relative path of the file from where you run the command.

css has a not function to target things that are not the thing. So like, p:not(.foobar #barbar) will target everything that is not of class foobar and with id barbar.

Capital W and capital B take you forward and backward a word in vim without regard for periods

WindowsError

Apparently python has a Windows specific error message

You can easily get example videos in various formats at <https://sample-videos.com/\>

gm goes to the center of the current line in vim

Powershell is open source. You can use Powershell as your default Linux shell. Who knew.

Powershell as Linux Shell

Also, Windows has a cool app called “Sandbox,” which you can create xml config files to template, that are basically Windows virtual machines without bloat (not even the microsoft store). They work really well, I think they should be a distribution of Windows itself.

Windows sandbox

https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-overview

Used this to create this script to yoink a specific section from a markdown string (for example, I want to get the # Description section’s paragraphs only)

export function getContentOfSection(
  markdown: string,
  header: string,
  depth: number = 1,
) {
  const ast = unified().use(remarkParse).parse(markdown)

  const output: string[] = []
  let inHeadersSection = false
  let nextIsWantedText = false
  visit(ast, (node) => {
    if (
      node.type === 'heading' &&
      node.depth === depth &&
      node.children.length > 0 &&
      node.children[0].type === 'text' &&
      node.children[0].value === header
    )
      inHeadersSection = true
    if (inHeadersSection) {
      if (nextIsWantedText) {
        if (node.type === 'text') output.push(node.value)
        else if (node.type !== 'paragraph') return false
      }
      if (node.type === 'paragraph') nextIsWantedText = true
    }
  })
  return output.join('\n')
}

Going to try to be more consistent with this again!

console.trace('How did we get here?')

Will do a console.log and also spit out a stack trace