Skip to content

Instantly share code, notes, and snippets.

@khansgithub
Last active July 25, 2024 17:50
Show Gist options
  • Save khansgithub/c7a6bfca57631a4c45e2c75b7b5f881e to your computer and use it in GitHub Desktop.
Save khansgithub/c7a6bfca57631a4c45e2c75b7b5f881e to your computer and use it in GitHub Desktop.

contents


git

global user.email user.name

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

switch user and choose which shell to use

su -s /bin/bash <user>

credential cache helper

git config --global credential.helper cache
git config --local credential.helper cache

git config --global --unset credential.helper

disable credential helper for single command

git clone https://bitbucket.org/<repo>.git --config credential.helper=

s6

list services

ls /run/service/

restart service

s6-svc -r /run/service/svc-openssh-server

docker

get docker

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker

list containers by name

docker ps -a --format "{{.Names}}" 

basic health check

docker run \
    ...
    --health-cmd "set -e;  nc -zv localhost 22; if [ $? -eq 0 ]; then exit 0; else exit 1; fi" \
    --health-interval=10s 
    ...

troubleshooting

Error response from daemon: client version 1.40 is too new...

# set to working version
DOCKER_API_VERSION=1.41

etc

docker ps name and status format

docker ps --format "{{printf \"%-30s %-20s\" .Names .Status}}"
watch 'docker ps --format "{{printf \"%-30s %-20s\" .Names .Status}}"'

python

monkeytype add type hints

# foo.py
import foo.bar
foo.bar.foobar()
monkeytype run foo.py
...
monkeytype apply foo.bar

interactive pdb

import ipdb
ipdb.set_trace()

module structure

https://ianhopkinson.org.uk/2022/02/understanding-setup-py-setup-cfg-and-pyproject-toml-in-python/

├── README
├── pyproject.toml
├── setup.py
└── src
    └── foobar
        └── __init__.py
pyproject.toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
setup.py
#! /usr/bin/env python

from setuptools import setup

if __name__ == "__main__":
    setup()

install module develop mode

pip install --editable .
pip install -e .

go

safe map look up

value, exists := foo["bar"]
if (!exists) {}

get go

# https://go.dev/doc/install
wget <tar_from_https://go.dev/doc/install>
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz
sudo ln -s /usr/local/go/bin/go /usr/bin/go
#sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz

linux

jobs

# view jobs
jobs

# send job to background and stop
ctrl  + z

# resume background job
bg [job id]

# switch to job
fg [job id]

# run command as background job
tail -f log.txt &

cd follow sym link

cd -P ./sym-link-dir

list all listening ports and associated services

sudo netstat -tunlp

get umask

stat -c %a foo.txt

tmux

basics

        new window - CTRL + b + c
     switch window - CTRL + b + [0-9]+
  vertical split | - CTRL + b + %
 horizonal split _ - CTRL + b + "
   navigate panels - CTRL + b + ↑ / ↓ / ← / →

rename window / pane

window

CTRL + B + ,

pane

CTRL + B + :
select-pane -T <PANE NAME>

session

minimise session

CTRL + b + d

attach to running session

tmux a

redis

redis-cli

list keys

keys * 

read stream

xrange <key> - + 

find keys and pipe to delete

#             < query >
redis-cli keys rq:res* | awk '{print $1}' | xargs redis-cli del

curl

pass file to curl as data

curl localhost:3000/workflow -X POST  -H 'Content-Type: application/json' --data-binary "@data.json"

nodejs

set NODE_PATH

sometimes when using Node interactive, it might not be able to find global packages. hence it's necessary to set NODE_PATH

export NODE_PATH=$(npm root --quiet -g)

node_modules bin dir

/home/node/app/node_modules/.bin

typescript

installing on corp VM

sudo apt-get update

sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
sudo chmod 644 /etc/apt/keyrings/nodesource.gpg

sudo apt-get update

sudo apt-get install nodejs -y

sudo npm install -g typescript
sudo chwon ubuntu -R /usr/lib/node_modules/typescript 
sudo chwon ubuntu /usr/lib/node_modules/typescript

debug in vscode

// launch.json
{
    "type": "node",
    "request": "launch",
    "name": "ts debug",
    "skipFiles": ["<node_internals>/**"],
    "program": "${workspaceFolder}/src/index.ts",
    "runtimeArgs": ["-r", "ts-node/register", "-r", "tsconfig-paths/register"],
    "console": "internalConsole"
}

// tsconfig.json
{
    "sourceMap": true    
}

transpile multile ts files

// /package.json
{
    "scripts": {
        "start": "nodemon ./src/index.ts"
    },
    "nodemonConfig": {
        "exec": "tsc && ts-node .",
        "ext": "ts"
    }
}

// /src/tsconfig.json
{
    ...
    "include": ["./src/frontend/foobar.ts"]
}

// /src/frontend/tsconfig.json
{
    "compilerOptions": {
        "module": "ES6",
        "target": "ES2017",
        "outFile": "./foobar.js",
        "rootDir": ".",
        "sourceMap": true,
        "noEmit": false
    }
}

stupid front end stuff

appending innerHTML breaks all event listeners

var html_to_insert = "<p>New paragraph</p>";

// with .innerHTML, destroys event listeners
document.getElementById('mydiv').innerHTML += html_to_insert;

// with .insertAdjacentHTML, preserves event listeners
document.getElementById('mydiv').insertAdjacentHTML('beforeend', html_to_insert);

vs code

custom tasks

// example file
// .vscode/tasks.json
{
	"version": "2.0.0",
	"inputs": [
		{
			"id": "imageName",
			"type": "promptString",
			"description": "Enter the image name",
			"default": "my-container-image"
		},
	],
	"tasks": [
		{
			"type": "typescript",
			"tsconfig": "portal/client/tsconfig.json",
			"problemMatcher": [
				"$tsc"
			],
			"group": "build",
			"label": "tsc: build - portal/client/tsconfig.json"
		},
		{
			"label": "Build Image",
			"type": "shell",
			"command": "podman",
			"args": [
				"build",
				"-f",
				"${file}",
				"-t",
				"${input:imageName}:${input:imageTag}"
			],
			"group": {
				"kind": "build"
			}
		}
	]
}

k8

restart deployment

kubectl rollout restart deployment/core-service  -n osna 
@gamma-khan
Copy link

gamma-khan commented May 27, 2024

  • node
  • fs.readdir is NOT blocking; use fs.readdirSync instead

@gamma-khan
Copy link

@gamma-khan
Copy link

  • python
  • function overload. functools.singledispatch only dispatches on the type of the first argument.
from functools import singledispatch

@singledispatch
def func(arg):
    print(f"Default: {arg}")

@func.register(int)
def _(arg):
    print(f"Integer: {arg}")

@func.register(str)
def _(arg):
    print(f"String: {arg}")

func(1)        # Output: Integer: 1
func('hello')  # Output: String: hello

@gamma-khan
Copy link

interface["name"].startswith(("ge", "xe", "ae", "et"))

@gamma-khan
Copy link

gamma-khan commented Jun 14, 2024

  • python
  • decorators are applied from bottom up
def b():
    print("Running function: b")

def a():
    print("Running function: a")

def main():
    return_a = a()
    return_b = b()
    
    print(f"{return_a=}, {return_b=}")

@patch("__main__.b")  # <- Second parameter to `mock`
@patch("__main__.a")  # <- First parameter to `mock`
def mock(a: MagicMock, b: MagicMock,):
    a.return_value = "mocked a"
    b.return_value = "mocked b"
    main()
    
mock()
'''
 > return_a='mocked a', return_b='mocked b'
'''
################

@patch("__main__.a")
@patch("__main__.b")  # <- First parameter, mismatched with naming it parameter 'a;MagicMock'
def mock(a: MagicMock, b: MagicMock,):
    a.return_value = "mocked a"
    b.return_value = "mocked b"
    main()
'''
> return_a='mocked b', return_b='mocked a'
         ^         ^ 
    mocked with wrong value
'''

@gamma-khan
Copy link

  • python
  • disable default console logger after adding more handlers by disabling propagate
logger = logging.getLogger("foo")
rh = RichHandler(show_level=True, show_path=True,
                        markup=True, rich_tracebacks=True)

logger.handlers = [rh]
logger.propagate = False

@gamma-khan
Copy link

@gamma-khan
Copy link

  • python
  • poetry
poetry new <project name>
cd <project name>
poetry lock
poetry add [list of packages to add]
poetry add --editable <path to editable another python repo>
poetry install # this actually installs the packages into site_packages in a new venv

poetry shell # activate python venv
python3 main.py
exit

@khansgithub
Copy link
Author

  • rust
  • a reference and pointer are not the same thing (i think)
// https://ntietz.com/blog/rust-references-vs-pointers/
fn main() {
    let x: u32 = 10;
    let ref_x: &u32 = &x;
    let pointer_x: *const u32 = &x;

    println!("x: {x}");
    println!("ref_x: {}", ref_x);
    println!("pointer_x: {:?}", pointer_x);
}

@gamma-khan
Copy link

  • pytest
  • label a test, and run all tests with that label
# test.py
@pytest.mark.solo
def test_solo(mocker):
    pass
# pytest.ini
[pytest]
markers =
    solo: mark a test as a solo test
pytest -m solo

@gamma-khan
Copy link

  • bash
  • retain environment variables when using sudo
sudo -E foobar

@gamma-khan
Copy link

  • python
  • learnings for making programs easier to test
  1. never define top level variables, which at any point require connectivity (ssh, http, etc...). keep them dumb.
  2. try consolidate all networking functionality into a class which deals with its lifecycle. make a getter that returns connection objects
def get_netbox() -> api:
  global nb
  return nb if nb else setup_nb()

@gamma-khan
Copy link

  • pyenv
  • some libraries required
sudo apt-get install -y build-essential curl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev libffi-dev liblzma-dev zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev wget
pyenv install 3.11

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment