Introduction

I keep some notes here, mostly development related things, as well as "quick ref"-guides on Linux commands and similar things.

Note: This book contains public notes only. My private notes are kept elsewhere.

The source code from which this book is generated is available on github.com/christianfosli/notes.

Bash / Linux / GNU tools quick ref

Terminal Signals :stop_sign:

  • Exit Ctrl-D

  • Cancel (kill) app/job Ctrl-C

  • Suspend Ctrl-Z suspend (pause) an app/job (go back to bash)

    • Resume job fg (list all with jobs)

Readline :ledger:

  • Go to beginning of line Ctrl-a

  • Go to end of line Ctrl-e

  • Delete line Ctrl-x <Backspace>

  • Move by words Ctrl- <Arrow-Keys>

  • Open command in $EDITOR, execute upon exit Ctrl-x Ctrl-e or fc

Files and Directories :file_folder:

  • Copy file contents to clipboard (on WSL) cat $file | clip.exe

  • Copy file contents to clipboard (on Wayland) cat $file | wl-copy

  • Search command history: <C-r> startOfCommand

  • Search for "pattern" and print matching lines: grep. Hint: ripgrep rg is easier to use and super fast.

  • Find files by filename: find . -name Foo.txt.

    • Find files case insensitive filename: find . -iname "*foo*txt"

    • Or use a fuzzy finder (fzf/skim/neovim telescope).

  • Create symlink ln -s actual_file_path symlink_path

  • Extract .tar.gz file tar -xzf <filename (remember eXtract tZe File)

Networking :globe_with_meridians:

  • List ip-address ip addr

  • List ip addresses on same network: ip neigh

  • nslookup

  • SSH ssh username@ip -p portnumber

    • Start ssh service to allow log-ins (fedora) systemctl start sshd.service
  • Copy files between local computer and remote scp $file username@ip:/home/$dir or scp username@ip:/home/$file $localdir

tmux :computer:

  • list sessions tmux ls or Ctrl-b s

  • attach tmux attach #

  • rename window Ctrl-b ,

  • new pane Ctrl-b " or Ctrl-b %

  • break out pane to a new window Ctrl-b !

  • toggle layouts Ctrl-b <space>

  • resize pane Ctrl-b :resize-pane -{L|R|D|U} {cellSize}. Can also be done from the shell:

    $ tmux resize-pane -R 10
    
  • resize panes Ctrl-b alt-arrows

  • popup tmux display-popup [-E 'python']

Gnome :framed_picture:

  • Activities overview: <super>

  • Move focus to menubar: <super> <f10>

  • Move focus between window and menubar: <control> <alt> <tab>

  • Switch between windows: <super> <tab>

    • Then press ` or <down> to switch through windows within an application
  • Switch between workspaces: <super> <alt> <arrow>

  • Snap window: <super> <arrow-keys>

  • Move window to another screen: <shift> <super> <arrow-keys>

  • Pop open window menu: <alt> <space>

  • Focus on active notification: <super> n

  • Show notification list: <super> v

  • Send notification from terminal:

    $ notify-send 'Hello world' 'the command has finished'
    
  • Lock screen: <super> l

  • Screenshot...: <PrintScreen>

  • Project external displays: <super> P

  • Toggle zoom: <alt> <super> 8

  • Emoji picker: <windows> <.> <keyword> <space> <space>

    • Note: Does not work in all applications. E.g. Currently doesn't work in Chrome.

alacritty :keyboard:

  • Launch vi mode: Ctrl Shift Space

systemctl & UEFI/BIOS :control_knobs:

  • Boot into UEFI/BIOS: sudo systemctl reboot --firmware-setup

  • See boot order sudo efibootmgr

  • Boot next sudo efibootmgr --bootnext XXXX

Configure systemd-resolved to not use azure private endpoints

  • Create file /etc/systemd/resolved.conf.d/az_blob_pub.conf with the following content

    # Work around missconfigured peerings from on-prem networks to azure blob storage private endpoints
    # by forcing DNS to a public DNS server (in this case cloudflare DNS)
    [Resolve]
    DNS=1.1.1.1 2606:4700:4700::1111
    Domains=~blob.core.windows.net
    

Good to know cURL options

  • Download to file using filename from URL: -O | --remote-name

  • Silent: -s | --silent. Don't show the progress bar.

  • Follow redirects: -L | --location

  • Retries: --retry <n>

  • Fail silently on HTTP errors / bad status codes: -f | --fail

  • Include response headers in output: -i | --include

  • Username/password: -u username:pass

  • Client certs: --cert cert-w-key.pem:password or --cert cert.crt --key key.key

  • Allow insecure TLS connections (i.e. untrusted certs): -k | --insecure

  • STDIN as body: -d@-. E.g. cat f.json | curl -H "Content-Type: application/json" -d @- http://api

  • json (curl >= 7.82): jo name=christian tool=curl | curl --json @- http://api | jq

  • Override dns resolve: curl https://domain.example --connect-to domain.example:443:203.0.113.81:443

Docker quick ref :whale:

  • Most used commands: docker ps, docker images, docker build, docker run

  • Most used docker-run flags: -it interactive terminal, -d detached (in the background)

  • Detach from running container: Ctrl P Q

  • Remove all non-running images: docker rmi $(docker ps -aq) or docker image prune -a

  • Check disk usage: docker system df

  • Exec as specific user: docker exec -u root -it <containername>

  • Run container with the same network namespace as another: docker run -it --network container:<containername> alpine

.NET Quick-Ref

  • run xunit tests with output to console: dotnet test --logger "console;verbosity=detailed" --filter <filterexpr>

    • <filterexpr> can be e.g. the test name, or with XUnit.Categories e.g. Feature=83922. But if we are interested in the output then it's best to run one test at a time, otherwise it's hard to find.
  • run fsharp fsx script dotnet fsi <filename>

  • open fsharp interpreter dotnet fsi --readline

Fixes and work-arounds

  • Strings.PlatformNotSupported_DataSqlClient error when running ef core database migrations on (some) linux platforms

    • Add --runtime linux-x64 to the cli command
  • Microsoft.Data.SqlClient.SqlException when connecting to database over HTTPS on older versions of dotnet core with newer versions of OpenSSL

    Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught)
    ...
     ---> System.TypeInitializationException: The type initializer for 'SslInitializer' threw an exception.
     ---> Interop+Crypto+OpenSslCryptographicException: error:0E076071:configuration file routines:module_run:unknown module name
    
    • Set environment variable OPENSSL_CONF=/dev/null before/while running your command Source: https://stackoverflow.com/questions/73004195/phantomjs-wont-install-autoconfiguration-error

Git quick-ref :tanabata_tree:

Open help-page: git help command

  • Everyday work

    • Check what's up git status

    • See what happened git log [--graph --date=human --stat])

      • one-line commits: git log [--graph] --oneline

      • show the patch: git log [--graph] -p

    • Add files to stage git add filename

      • Stage part of file git add -p filename
    • Unstage file git restore --staged <filename>

    • Check diff git diff branch1 branch2 or file1 file2 etc

      • Check message and diff of commit: git show <commit-hash>

        • Include commit (as well as author) date: git show --format=fuller <commit-hash>
      • Check diff for a merge commit:

        • Given this commit:
        commit ccc333
        Merge: aaa111 bbb222 
        
        git diff aaa111...bbb222
        
      • Exclude specific file from diff: git diff -- . ':!package-lock.json' or git show HEAD -- . ':!Cargo.lock'

    • Commit stage to current branch git commit

      • Commit all tracked files with changes: git commit -a

      • Use interactive patch selection to decide what to commit: git commit -p

      • Show diff below the commit message: git commit -v

    • Restore file to HEAD git restore <filename>

    • Restore file to branch git restore -s <branchname> <filename>

  • Misc

    • Does origin/master have new commits? (commits not reachable from HEAD)

      git fetch origin && git log ..origin/master

    • Ignore future local changes to a tracked file (useful for config files...) git update-index --skip-worktree <filename>

      • Undo with git update-index --no-skip-worktree <filename>
    • Apply patch (3-way merge)

      git show <sha1> | git apply -3

  • Branches

    • Show branches git branch or git branch -vv or git branch -r

    • Create branch git branch <branch-name>

    • Switch to branch git switch <branch>

    • Do both 2 above git switch -c <branch name>

    • Merge/rebase branch first checkout the to-branch then git merge <from-branch> or git rebase <from-branch>

    • Delete branch git branch -d <branch> force delete with git branch -D <branch>

    • Delete every branch except master git branch | grep -v "master" | xargs git branch -D

    • Reset branch to earlier commit / branch / tag git reset --hard <commit>

    • Clean up latest n commits (opens interactive rebase editor letting you squash, pick, fixup, reorder)

      git rebase -i HEAD~n

    • Rebase and update intermediate "feature branches" git rebase --update-refs

  • Remotes

    • Fetch latest changes git fetch <remote>

      • And remove remote remote tracking branches which have been deleted git fetch -p <remote> (shows [gone] on git branch -v)
    • Show remote info git remote -v or more info with git remote show <remote>

    • Fetch and merge git pull

    • Push to remote git push <remote> <branch> [--force-with-lease]

    • Push and add upstream (tracking) reference git push -u <remote> <branch>

    • Delete remote branch git push <remote> -d <branch>

    • Update submodules git submodule update or git submodule update --remote

  • Finding commits

    • Search by author: git log --author <name>

    • Search by commit message: git log --grep <regexp>

    • Search by patch text (i.e. diff content): git log -G <regexp>


GitHub tips and tricks

  • Clear cache, if using GitHub Actions cache (e.g. for docker build): gh cache delete --all --repo {org}/{repo}

Notes about TLS, PKI, certs and keys.

Everything you should know about certificates and PKI but are too afraid to ask

Good read 😊 by SmallStep

https://smallstep.com/blog/everything-pki/

Fun facts

PEM stands for Privacy Enhanced Email. It was originally developed to encrypt emails. It never cought on, though, and the related RFC's were eventually obsoleted by PGP and S/MIME.

Step CLI

Similar to openssl but with better UX. https://github.com/smallstep/cli

ssh-rsa

EC cryptography for dummies

https://blog.boot.dev/cryptography/elliptic-curve-cryptography/

Microsoft 365 related notes

Roadmap items I'm interested in

MS Teams keyboard shortcuts

  • Focus on search field: Ctrl-E

  • Focus on search field for command: Ctrl-/

  • Switch chats: Alt-

  • Switch sidebar tabs: Ctrl-1/2/3/4.. (web Ctrl-Shift-1/2/3/4..)

  • Keyboard driven chat: Switch focus with <up> and <down>, enter reaction menu with <enter>

Python Quick-Ref

Managing python versions, environments and dependencies

Use uv!

"uv-first" projects

  • Initialize project and create venv

    uv init {project_name}
    
  • Add dep

    uv add {dep}[version_constraint]
    
  • Remove dep

    uv remove {dep}
    
  • Upgrade dep

    uv lock --upgrade-package {dep}
    

"pip-first" projects

  • Initialize venv

    uv venv --python 3.12
    . .venv/bin/activate
    
    • If relying on internal packages using Azure DevOps Artifacts, the UV_EXTRA_INDEX_URL env variable can be used to configure this. A personal access token can be included in the URL for basic auth (see uv docs for details).

      For my current (2024) project I'm adjusting the venv activate script to set this environment variable when activating venv, and unset it in the deactivate function. It is also possible to add the index url to pyproject.toml, but then authorization must be handled differently, e.g. with artifacts-keyring (obviously don't check your PAT into git).

  • Add dep

    uv pip install {dep}
    

    Or add it to requirements.txt and

    uv pip install -r requirements.txt
    

    Or add it to pyproject.toml dependencies and

    uv pip install -e .
    
  • Remove dep

    uv pip uninstall {dep}
    
  • Upgrade dep

    uv pip install -U {dep}
    

    Or update version constraints in requirements.txt if needed and

    uv pip install -U -r requirements.txt
    

Convenient cli's

  • Generate a uuid: python -m uuid

  • Serve static files in current directory: python -m http.server 8000

Logging in pytest output

pytest -o log_cli=true --log-level=DEBUG

or persistant in a config file, which by convention resides in the root directory of the repository

# pytest.ini
log_cli=true
log_level=DEBUG
# pyproject.toml
[tool.pytest.ini_options]
log_cli="true"
log_level="DEBUG"

ref pytest docs

Ruff

  • Format: ruff format {file|dir}

  • Lint: ruff check [--fix] {file|dir}

  • Organize imports: ruff check --fix --select I or add to pyproject.toml:

    [tool.ruff.lint]
    extend-select = ["I"]
    
  • Example config:

    [tool.ruff]
    line-length = 120
    
    [tool.ruff.lint]
    extend-select = ["I"]
    
    [tool.ruff.lint.isort]
    known-first-party = ["myorg_*"]
    

BasedPyright

A fork of the Pyright LSP with various feature improvements, such as code action for missing imports!

Works nicely with terminal editors like Helix.

See https://docs.basedpyright.com/latest/

Interesting Python / JS Interop project

PythonMonkey Kode24 Article

Vim favorite commands / built in stuff

  • CTRL-] or gd - Jump to definition

  • CTRL-O Jump back

  • CTRL-I Jump forward

  • K show definition of keyword

  • f {char} - go to first occurance of char

  • t {char} - go just before first occurance of char

Helix (move me somewhere?)

  • Due to some intelligent(ish) workspace root detection looking for .git folder, make sure to open deno files from the correct folder.

Web related notes

Chromium features to follow :eyes:

Chrome & Web news

  • https://web.dev

    • Check https://web.dev/learn for tutorials :smile: e.g. https://web.dev/learn/pwa/ to learn about progressive web apps

"New" HTML elements

WebAuthn

Web authentication using public key cryptography instead of passwords

FedCM

Federated credential management without needing third-party cookies.

Patterns

Check patterns.dev