programs

#define programs: \ I-----------------------------------------------------------------------------------------------------------\ I-----------------------------------------------------------------------------------------------------------\ I-----------------------------------------------------------------------------------------------------------\ I /$$$$$$$ \ I | $$__ $$ \ I | $$ \ $$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$/$$$$ /$$$$$$$ \ I | $$$$$$$//$$__ $$ /$$__ $$ /$$__ $$ /$$__ $$|____ $$| $$_ $$_ $$ /$$_____/ \ I | $$____/| $$ \__/| $$ \ $$| $$ \ $$| $$ \__/ /$$$$$$$| $$ \ $$ \ $$| $$$$$$ \ I | $$ | $$ | $$ | $$| $$ | $$| $$ /$$__ $$| $$ | $$ | $$ \____ $$ \ I | $$ | $$ | $$$$$$/| $$$$$$$| $$ | $$$$$$$| $$ | $$ | $$ /$$$$$$$/ \ I |__/ |__/ \______/ \____ $$|__/ \_______/|__/ |__/ |__/|_______/ \ I /$$ \ $$ \ I | $$$$$$/ \ I \______/ \ I-----------------------------------------------------------------------------------------------------------\ I-----------------------------------------------------------------------------------------------------------\ I-----------------------------------------------------------------------------------------------------------I

manuvering

#define manuvering:: ag (<typename>) ([options]) [pattern] ([path]) : recursively searches for [pattern] in all <typename> files AT [path] and prints results dependent on [options]

binary

#define binary:: hexedit : trusty TUI hex editor ImHex : robust GUI hex editor // ATU's recommendation

text

#define text:: \ I----------------------------\ I _____ _______ _______ \ I |_ _| ____\ \/ /_ _| \ I | | | _| \ / | | \ I | | | |___ / \ | | \ I |_| |_____/_/\_\ |_| \ I----------------------------I • any program manipulating on text/plain text files

vim

#define vim::: \ I-----------------\ I __ ___ \ I \ \ / (_)_ __ \ I \ V /| | ' \ \ I \_/ |_|_|_|_| \ I-----------------I "Vi IMpoved" • descends from Vi; Vi is similar enough that its comfortable for smaller edits • Vi keybindings are extremely comfortable • many programs use Vi like controls or support a "Vi(m) mode", enabling alternative key bindings; therefor it is recommended to be aware of Vi controls even if you do not use Vi or its derivatives vim [options] [file] : "a programmer's text editor" — R : read only — b : binary mode — i [path] : specifies [path] as the file to be used as .viminfo (see BELOW) vimdiff [file1] [file2] • alias of "vim -d" • allows for the user to easily compare differing version of the same file • highlights changes color marked by type side by side • matching regions are folded up • better alternative for diff • im not using the my usual square bracket - key-combination notation for a reference on vim is almost entirely composed of key-combinations because such quantity of square brackets would actually make it harder to read Files: .exrc : ?! .vimrc : where settings and prefrences are read from .viminfo : where dynamically set informations are stored (marks/registers) Modes: Normal_mode: esc : to enter Integer_manipulation: ctrl + A : increment the number under the cursor ctrl + x : decrease the number under the cursor String_manipulation: x : deletes char under cursor i : enters insert mode at the cursor I : enters insert mode before the cursor o : starts new line after the cursors line and enters insert mode O : starts new line before the cursors line and enters insert mode A : jumps to the end of the last word in the line and enters insert mode r [char] : replace the character under the cursor with [char] Operation: u : undo U : undo line crtl + r : redo p : put the previously deleted P : put the previously deleted before cursor Operators: [operator] ([num]) [motion] d : delete J : join ("$d") c : delete and enter insert mode . : repeat last operation Motion: ([num]) [motion] +--------------------+ //move; ?! | A H ^ | H : High k : up | │ k | M : Middle j : down | │ M < h l > | L : Low l : right | │ j | h : left | V L v | +--------------------+ w : start of the next word e : end of the current word $ : end of the current line Movement: ctrl + u : moves up half a screen ctrl + d : moves down half a screen ctrl + b : moves up a screen ctrl + f : moves down a screen H : jumps to first line on the screen M : jumps to middle line on the screen L : jumps to lowest line on the screen gg : jumps to the start of the document (ctrl + home) G : jumps to the end of the document (ctrl + end) Marks: • marks are file specific • stored season cross • they are not stored directly at the file, but rather at a .viminfo file m & [char] : places mark with ID [char] ' & [char] : jumps to the mark with the ID [char] :marks : lists existing marks Searcing: /[regex] : searches for [regular expression] ?[regex] : searches for [regular expression] from the end n : jumps to the next result of previous search N : jumps to the previous result of previous search * : searches for the word currently under the cursor # : searches for the word currently under the cursor from the end Regex: \< : beginning of a word \> : end of a word . : any char except '\n' \p : printable char \P : \p - \d • upper case not-ed { \d = digit; \D = not digit } \s : whitespace \d : digit \x : hex digit \o : octal digit \h : ?! \w : word char \a : letter \l : lower case char \u : upper case char Camera_movement: zz : center line to cursor Query: ga : print value of the char under the cursor Insert_mode: • normal typing • <int> is the times ti repeat the operation after return from insert mode Entering: (<int>) i : enter before the cursor (<int>) a : enter after the cursor (<int>) I : enter at the beginning of the line (<int>) A : enter at the end of the line Special_chars: • chars that normal people are not capable of entering with just their keyboards ctrl + k && [digraph] : inserts [digraph] char (see BELOW) :digra : brings up a list of [digraph]s ctrl + v && [code] : inserts char by value [num][num][num] : by decimal value \ O[num][num][num] : by octal value } 0<= n <= 255 x[num][num] : by hex value / u[num][num][num][num] : by hex value U[num][num][num][num][num][num][num][num] : by hex value Visual_mode: v : to enter regular visual mode shift + v : to enter line visual mode ctrl + v : to enter block visual mode u : converts selection to lowercase U : converts selection to uppercase = : fix indentation Command_mode: : : to enter Commands: :[command] q : quit w : write (save) echo [var] : prints the value of vim variable [var] ![cmd] : spawns a shell and runs [cmd] r [file] : insert the contents of [file] after the cursor r ![cmd] : insert the output of [cmd] after the cursor • see window commands AT ../../Windows • see mark commands AT ?! • see register commands AT ../../Registers ([range] = .)s/[pattern]/<string>(/[flags] [count]) : substitutes a maximum of [patern]s in [range] with <string> using [flags] [range]: % : all lines [int1];[int2] : from line [int1] till [int2] . : current line $ : last line +<int> || -<int>: relative line to current line [flags]: g : replace all occurrences of [pattern] in current line c : ask for conformation before replacing (each) a : case insensitive Notes: • use '\r' instead of '\n' Replace_mode: [R] : to enter Short_cuts: • things that can be done with more key presses too dd : "Vd" Windows: • not that kind of Windows! • a new window doesnt mean a new buffer ctrl + w && v : split the document vertically ctrl + w && s : split the document horizontally ctrl + w && [h || j || k || l] : move the cursor to an adjacent window (the last letters correspond to motions) ctrl + w && [H || J || K || L] : move window to far [position] ctrl + w && x : swap this window with the next one ctrl + w && r : rotate window positions crtl + w && c : close the currently selected window ctrl + w && o : close all windows but the one currently selected ctrl + + : increase size of currently selected window horizontally ctrl + - : decrease size of currently selected window horizontally :(vertical) res (+ || -)<int> : resize currently selected window, <int> meaning rows by default or columns if "vertical" is specified add a '+' or a '-' to make <int> be interpreted relatively Tabs: :ls : list buffers (<int> &&) ctrl + 6 : switch to tab <int> or the previously used tab Registers: Commands: reg ([register]) : view contents of [register] or contents of main registers Operating: " "[register][operation] : refers to register Operation: • please see the table AT the end of this section p : paste P : paste before cursor y : yank x : cut Registers: — Unnamed register: • used in common copying and pasting (deleting and yanking) — Numbered registers: • 0-9 (10 total) • store previous copies — Named registers: • a-z • refer to them as "A-Z" to append to contents of the corresponding register — Selection and drop registers (>name; content) — Black hole register _ : abyss • exist so one can delete text without affecting any register values • always contains nothingness — Read-only registers: % : file name : : most recently executed command # : alternate file (most recently edited file thats not the current one) . : last edit (what '.' would do) — Expression register = : ?! — Search register / : last search expression Colorschemes: • default themes are stored at /usr/share/vim/vim[version]/colors • user specific themes are stored at ~/.vim/colors colo : prints name of currently used colorscheme colo [scheme] : loads [scheme] highlight : brings up a list of the current colorscheme settings Macros: • stored in registers • a (literal) string of key presses which can be played to automate repetitive jobs q[char]<string>q : records macro with a value of <string> stored in register [char] (<int>)@[char] : plays macro [char] <int> times Marks: • way to navigate • marks are similar to registers in the sense that [a-zA-Z] are valid user marks and there are special reserved ones m<id> : sets mark to current line `<id> : jumps to mark :marks : shows a list of assigned marks Builtin: . : last change ' : "jump back"; position from where the last jump occurred < : last visual selection start • : last visual selection end Programming: Autocomplete_menus: ctrl + n : loads "Next" option ctrl + p : loads "Previous" option ctrl + x : ?! ctrl + f : displays path autocomplete menu (see BELOW) Hints: ctrl + k : open man page for the symbol under the cursor Scripting: Commenting: " [...] : single line comment //(") Settings: set [setting](=[value]) : sets a bool setting to [setting] otherwise sets a setting named [setting] to [value] Variables: let [scope]:[name] (= [value]) : declares variable called name visible at scope [scope] (and assignes it to [value]) v : global, predefined by vim g : global b : buffer w : window t : tab a : "argument"; function l : function s : sourced vim script @[register] : refers to a register as it were a variable Folding: • vim allows for "folding" multiple physical lines into one displayed line zc : close under cursor zo : open under cursor za : toggle under cursor zR : open all zM : close all Spelling: :set spell zg : add word under the cursor as a correct spelling z= : suggest spelling correction for word under the cursor ((( ----------------- -------- Neovim -------- • Vim fork • Vim and Neovim features have branched, but if one implements a well liked feature, the other usually adds its own alternative --------- Kakoune --------- • Vim like text editor • reverse action order ----- bat ----- • cat clone with syntax highlighting

tui

#define tui:: ----------------- -------- aspell -------- • spell checking tool Files: /etc/aspell.conf : global configuration file ~/aspell.conf : user spefific configuration file ~/.aspell.[lang].pws : personal directory (see BELOW) ~/.aspell.[lang].prepl : personal replacement directory (see BELOW) Personal_directory: metadata: personal_ws-1.1 [lang] [num] ([encoding]) • the first Word is simply an indication, that this, indeed, is a personal dictionary • [lang] is the language the dictionary is for • [num] is the count of words, technically not important, might as well be any number • [encoding] represents the encoding, not mandatory dictionary: • simply a list of word each on new lines representing the correctly spelled word Personal_replacement_directory: • used for containing correction suggestions metadata: persoanl_repl-1.1 [lang] [num] ([encoding]) • follows mostly the same logic as personal directories (see ABOVE) • [num] is unused and therefor is always 0 dictionary: • a list of replacements, each on a new line [misspelled word] [correction] aspell [options] : performs specified spell checks — ? : displays short help message --help : displays long help message — c [file] : specifies [file] to be checked — l --lang=[lang] : sets language of grammar config : prints configuration [actions]: • commands after aspell interactive mode is entered [num] : replace current word with suggestion number [num] a : adds current word to personal dictionary A : adds tolower(current word) to personal dictionary r : replaces word with user entered input R : replaces all occurrences of word with user entered input i : ignores current occurrence of misspelled word I : ignores all occurrences of misspelled word b : exit without saving x : save and exit

image

#define image:: \ I-----------------------------------\ I ___ __ __ _ ____ _____ \ I |_ _| \/ | / \ / ___| ____| \ I | || |\/| | / _ \| | _| _| \ I | || | | |/ ___ \ |_| | |___ \ I |___|_| |_/_/ \_\____|_____| \ I-----------------------------------I ------------- ImageMagick ------------- convert [files] ([options]) [file] : manipulate images; [files] being source files; [file] being the output file • by changing the extension on the output file, convert will convert the file type — rotate <int> : rotate image by <int> degrees — append : append [files] vertically to each other +append : append [files] horizontally to each other — resize [dim] : resizes the input to resemble the given dimensions [spec]x[spec]([mark]) ○ [spec] [uint]([sign]) : [uint] is the desired number of pixels ○ [sign] ^ : follow exactly ○ [mark] ! : do not preserve aspect ratios — crop [uint-1]x[uint-2]+[uint-3]+[uint-4] : crops image; [uint-1] specifies desired width; [uint-2] specifies desired height; [uint-3] specifies horizontal offset (from the left); [uint-4] specifies vertical offset (from the top) identify [options] [files] : displays information on image files ------ gimp ------ • "GNU Image Manipulator Program"/"Green Is My Pepper" • Photoshop alternative • featureful, but not as convenient to use as could be / one would hope so • OK, but not great for drawing, its primary job is in fact image manipulation Scripting: • uses the Scheme dialect called "Script-fu" • allows for python bindings • under "/Filters" one can find the options to launch a console with an interpreter • has a piss easy server/client protocol // if only browsers had this; but clearly Google just doesnt have the resources to finance such a complicated task

video

#define video:: \ I----------------------------------\ I __ _____ ____ _____ ___ \ I \ \ / /_ _| _ \| ____/ _ \ \ I \ \ / / | || | | | _|| | | | \ I \ V / | || |_| | |__| |_| | \ I \_/ |___|____/|_____\___/ \ I----------------------------------I -------- ffmpeg -------- • video converter ffmpeg [options] : yes ; ([input_options]) -i [file] : specifies input file ○ [input_options] — ss [pos] : seeks file till [pos] — t [dur] : limit duration read from input — to [pos] : stop reading the input at [pos] ○ [output_options] — ss [pos] : discards footage until [pos] — t [dur] : stop writing output after [dur] — to [pos] : stop writing the input at [pos] • "-t" and "-to" are mutually exclusive; "-t" takes priority ○ [pos] • "position" • a time point in the video • uses time_syntax ○ [dur] • "duration" • an amount of time which is summed with a time point to determine its position • uses time_syntax ○ [time_syntax] (-)[<HH>](:<MM>(:<SS>)(.<m>)) : specifies duration (-)[<SS>](.<m>) : specifies duration '-' is a negative sign <HH> marks the hour <MM> marks the minute <SS> marks the second <m> marks the decimal fraction of <SS> ○ [size]: • either a string as follows: [int1]x[int2] or an abbreviation ○ [abbreviation] | String | Meaning | | :-------: | :-------: | tsc 720x480 pal 720x576 qntsc 352x240 qpal 352x288 sntsc 640x480 spal 768x576 film 352x240 ntsc_film 352x240 sqcif 128x96 qcif 176x144 cif 352x288 4cif 704x576 16cif 1408x1152 qqvga 160x120 qvga 320x240 vga 640x480 svga 800x600 xga 1024x768 uxga 1600x1200 qxga 2048x1536 sxga 1280x1024 qsxga 2560x2048 hsxga 5120x4096 wvga 852x480 wxga 1366x768 wsxga 1600x1024 wuxga 1920x1200 woxga 2560x1600 wqsxga 3200x2048 wquxga 3840x2400 whsxga 6400x4096 whuxga 7680x4800 cga 320x200 ega 640x350 hd480 852x480 hd720 1280x720 hd1080 1920x1080 2k 2048x1080 2kflat 1998x1080 2kscope 2048x858 4k 4096x2160 4kflat 3996x2160 4kscope 4096x1716 nhd 640x360 hqvga 240x160 wqvga 400x240 fwqvga 432x240 hvga 480x320 qhd 960x540 2kdci 2048x1080 4kdci 4096x2160 uhd2160 3840x2160 uhd4320 7680x4320 — filter:v [...] fps=<int> Transcoding: _______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________| Examples: Concatanation: Same_codec: $ tree . ├── 1.webm ├── 2.webm └── 3.webm 0 directories, 3 files $ for i in *; do > echo "file '$i'" >> files.list > done $ ffmpeg -f concat -safe 0 -i files.list -c copy output.webm # one liner for i in *.mp3; do echo "file '$i'" >> files.list; done; ffmpeg -f concat -safe 0 -i files.list -c copy output.mp3 ----------- mpv ----------- • "Media Player for the People" • pretty good • for audio it can play on the cli, multimedia opens a dummy GUI for which you are supposed to get a 3th party full-fetched frontend of your liking, but the default is ok too mpv [options] <file> : plays file --loop : play while true CLI: / : volume down * : volume up

filesystem_management

#define filesystem_management:: \ I------------------------------------------------------\ I ______ _ _ _ \ I | ___(_) | | | \ I | |_ _| | ___ ___ _ _ ___| |_ ___ _ __ ___ \ I | _| | | |/ _ \ / __| | | / __| __/ _ \ '_ ` _ \ \ I | | | | | __/ \__ \ |_| \__ \ || __/ | | | | | \ I \_| |_|_|\___| |___/\__, |___/\__\___|_| |_| |_| \ I __/ | \ I |___/ \ I------------------------------------------------------I File_managers: Terminal: ranger : too slow. takes a gorillion years to start up nnn : i dont remember what what wrong with it, but it was bad fff : meh clifm : very cool, but the defaults break too much and there is no documentation Gui: thunar : xfce default; can recommend spacefm : coonfiger's wetdream ----- fff ----- "Fucking Fast File-manager" Usage: • very vim-ish (see AT ../Text/Vim) j : scroll down k : scroll up h : go to parent dir l : go to child dir // down : scroll down up : scroll up left : go to parent dir right : go to child dir // enter : go to child dir backspace : go to parent dir // — : Go to previous dir. // g : go to top G : go to bottom // : : go to a directory by typing. // . : toggle hidden files / : search t : go to trash ~ : go to home e : refresh current dir ! : open shell in current dir // x : view file/dir attributes i : display image with w3m-img // f : new file n : new dir r : rename X : toggle executable // y : mark copy m : mark move d : mark trash (~/.local/share/fff/trash/) s : mark symbolic link b : mark bulk rename // Y : mark all for copy M : mark all for move D : mark all for trash (~/.local/share/fff/trash/) S : mark all for symbolic link B : mark all for bulk rename // p : paste/move/delete/bulk_rename c : clear file selections // [1-9] : favourites/bookmarks (see customization) // q : exit with 'cd' (if enabled). [Ctrl] + [C] : exit without 'cd'. //------- //------- //------- ------ luks ------ $ cryptsetup luksFormat <partition> $ cryptsetup luksOpen <partition> <name> $ mount /dev/mapper/<name> <dest> $ umount /dev/mapper/<name> $ cryptsetup luksClose <name>

processes

#define processes:: \ I---------------------------------------------------------\ I ____ ____ ___ ____ _____ ____ ____ _____ ____ \ I | _ \| _ \ / _ \ / ___| ____/ ___/ ___|| ____/ ___| \ I | |_| | |_| | | | | | | _| \__ \__ \| _| \__ \ \ I | __/| _ <| |_| | |___| |___ __| |__| || |___ __| | \ I |_| |_| \_\\___/ \____|_____|____/____/|_____|____/ \ I---------------------------------------------------------I -------- bpytop -------- >modern alternative for top >kinda bloated, looks amazing tho ------ btop ------ • modern alternative for top • rewrite of bpytop in C++, runs like lightning • looks amazing

virtualization

#define virtualization:: \ I---------------------------------------------------------------------------------------\ I __ _____ ____ _____ _ _ _ _ ___ ____ _ _____ ___ ___ _ _ \ I \ \ / /_ _| _ \|_ _| | | | / \ | | |_ _|_ | / \ |_ _|_ _| / _ \| \ | | \ I \ \ / / | || |_| | | | | | | | / _ \ | | | | / / / _ \ | | | | | | | | \| | \ I \ V / | || _ < | | | |_| |/ ___ \| |__ | | / /_ / ___ \ | | | | | |_| | |\ | \ I \_/ |___|_| \_| |_| \___//_/ \_\____|___|____/_/ \_\|_| |___| \___/|_| \_| \ I---------------------------------------------------------------------------------------I Files: .ovf : "Open Virtualization Format descriptor" .ova : "Open Virtual Appliance" • preconfigured • archive format packed with individial files ├── *.mf ├── *.ovf └── *.vmdk -------- docker -------- systemctl start docker Files: ~/.docker Dockerfile docker-compose.yaml Programs: docker <operation> : docker cli; the main docker tool // image_operations build pull <image> : downloads docker image [image] images : lists installed images run <options> <image> <command> <arg>* : runs an image inside a new container, performing the specified action — v <volume-specification> : binds host location to virtual location (see BELOW) --rm : auto delete the container on exit rmi <image> : "ReMove Image" // container operations kill <container>+ : kill running cotainer rm <container>+ : delete container inspect <container> : dump data in json attach <container> : hook the terminal to a container (running in the background) start [options] <container> : runs an existing container — a : "attach"; hook up stdout && stderr — i : "interactive"; hook up stdin ps : print all running containers (as if they were normal processes) — a : print exited containers too stats : live "UNIX top" like view // volumes volume <verb> ls : list named volumes inspect <named-volume> : dump volume info; the dump contains what host filesystem directory it maps to (should be somewhere in /var/lib/docker/volumes) docker-desktop : nice gui wrapper for docker; too bad that its a pain in the ass to install in 2024 docker-compose : utility to manage multi-containers up : execute the "docker-compose.yaml" in the current directory Docker_images: • read-only container templates (consisting of code, libraries and dependencies) • identified by a name or an ID number attaining: https://hub.docker.com/ • use the verb "search" or the hub Docker_container: • writable initialazation of an image • each has a hash-like id and a name; these can be used to refer to the container in commands Volumes: • a physical directory that is mounted to the containers virtual filesystem • its purpise is to have data that persists between runs and or saving that data perminently • volumes must be specified when creating the image; they CANNOT be added to an existing container • a named volume is storage manged by docker • a bind mount is a volume map-ping to a local directory; they are created by passing absolute paths volume_specification: <host-volume>:<virtual-path> : meaning something along the lines of: slave@container$ mount <host_path> <virtual_path> Multi_containers: • a cluster of containers intended to work together Dockerfile: { (# comment)* | (<keyword> <arguments>)+ } • used to create docker images • the Dockerfile has an image working directory; it is used to alias '.' FROM <image> : source image; the current image will be a moded version of the source image; very common MAINTAINER <string> : arbitrary data identifying the maintainer of the image; NOT required RUN <string> : arbitrary script to run while building the image CMD <string> : arbitrary script to run when running the image WORKDIR <path> : change current working directory of the Dockerfile ADD <source> <destination> : copy host file into the image EXPOSE <image-port>:<host-port> : proxy a port to the host machine; by default no ports are exposed; similar to how Tor handles it; you still have to pass the appropriate -p flag when running the machine ENV <key>=<value> : set environment variable Compose: docker-compose.yaml • fuck yaml, use the JSON subset "version" // version number "services" : { // dictionary of docker containers to be included in the multi-container <string> : { // arbitrarily named container "container_name" "image" "ports" "command" "volumes" "envirnment" } } -------- VMWare -------- Files: *.vmdk : "Virtual Machine DisK" ------------ virtualbox ------------ linux-headers // installed modprobe vboxdrv ### Setting up a Virtualbox shared folder ### 1. Start up the guest machine 2. Install "guest additions" • lauch the virtual machine click "Devices/Insert Guest Additions CD image..." (on the top bar) • run the contents of the CD 3. Configurate • in the main menu click the guest systems settings • find the "Shared Folders" tab • click the pluss folder sign input: Folder path: [host machine folder path] [X] Auto-mount Mount point: [guest machine folder path] # ------ qemu ------ • kernel level virtualization • runs smooth as hell • much better than virtualbox Files: qcow2 : "Qemu Copy On Write 2"; disk image Deamons: libvirtd Programs: qemu-img <global-options> <verb> : "disk IMaGe utility" — h : print help; lists supported image formats <verb> convert <input> <output> — f <format> { $ qemu-img convert -f vmdk ubuntu/Ubuntu-20.04.5-EN-disk001.vmdk ubuntu.qcow2 } Front_ends: qemu provides the virtualization and a communication protocol, its up to specific and various front-ends to provide guis virt-manager : pretty cool qemu front-end

networking

#define networking:: \ I------------------------------------------------------------------\ I _ _ _____ _______ _____ ____ _ _____ _ _ ____ \ I | \ | | ____|_ _\ \ / / _ \| _ \| |/ /_ _| \ | |/ ___| \ I | \| | _| | | \ \ /\ / / | | | |_| | ' / | || \| | | _ \ I | |\ | |___ | | \ V V /| |_| | _ <| . \ | || |\ | |_| | \ I |_| \_|_____| |_| \_/\_/ \___/|_| \_\_|\_\___|_| \_|\____| \ I------------------------------------------------------------------I -------------- netcat: -------------- /* . . \`-"'"-'/ } 6 6 { ==. Y ,== /^^^\ . / \ ) ( )-( )/ _ -""---""--- / / Ncat \_/ ( ____ \_.=|____E */"The Swiss Army Knife of Networking" • from a single implementation it has evolved into a whole family of similarly named and partially compatible software • the core idea is providing a cli utility to quickly spawn TCP(/UDP) clients/servers for testing mostly, but using it as a chat program or a reverse proxy service is not unheard of either Implementations: (Unix) netcat (GNU) netcat (OpenBSD) nc (BusyBox) nc (Nmap) ncat ○ practical usages include • testing whether a server of some arcane protocol is listening at all — quickly transferring files on LAN: # we wish to transfer something from PC1 to PC2 PC1$ echo 'this is my message' > file.txt # find the local IP of PC2 and start listening for incoming traffic PC2$ ip a | grep inet | grep global inet 192.168.0.192/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp0s20f3 PC2$ nc -l 5050 > download.txt # send the message PC1$ cat file.txt | nc -q 0 192.168.0.192 5050 # the transaction should be done with both netcat instances exiting with 0 # if it did not work, its probable that the LAN was restricted by an administrator

git

#define git:: \ I ___ _ _ \ I / __(_) |_ \ I | (_ | | _| \ I \___|_|\__| I • made by Saint Linus Torvalds • project version tracking software, ie. a "version control system" • stores compressed stapshots of groups of files so they may be easily reverted, read back and or versions are easily comparable • used for easing software development • a project managed by git is called a repository Files: [project_root] : folder of a project managed by git ├── .git/ : each repository has one; used for storing development data {version, backups, branches} ├── .gitignore : plain text file for listing files in the project directory which shall be ignored by git {swap files left by editors} └── .gitmodules : ini file containing submodule information; see AT "../Nesting" git [options] [verb] [opts] [verb]: . init : creates a ".git" folder in ${PWD} config [field] [value] : sets config option [field] to [value] [field]: user.name user.email . status log branch [options] add [file] : specify that [file] shall be included int the next commit restore clone [repository] : copy [repository] to ${PWD}; [repository] is free to be an url diff [file] : shows differences of [file] and its previous version commited (something like GNU diff) . commit [options] : ?!; added statuses reset on commit — m <string> : specify message for the git log tag [options] : manages tags which are usually for realise marking; without arguments it lists all tags [options]: <string> : adds tag named <string> — d <string> : delete-s tag named <string> submodule : see AT "../Nesting" // format-patch <branch> : create *.patch files for all commits on <branch> am <path> : apply *.patch files from <path> to the current branch COMMIT: ┏━━━━━━━━━━━━━━━━━━━━━┓ ┃ Commit ┃ ┣━┯━━━━━━━━━━━━━━━━━━━┫ ┃ ├── hash ┃ ┃ ├── parent ┃ ┃ ├── message ┃ ┃ ├── commiter ┃ ┃ └── change snapshot ┃ ┗━━━━━━━━━━━━━━━━━━━━━┛ REPOSITORY: — can be well abstracted as a stack of commits • past commits cannot be easily modified • you can only append to the top (or branch) ┏━━━━━━━━━━━━┓ ┃ Repository ┃ ┃ ┌────────┐ ┃ ┃ │ Commit │ ┃ ┃ ├────────┤ ┃ ┃ │ Commit │ ┃ ┃ ├────────┤ ┃ ┃ │ Commit │ ┃ ┃ └────────┘ ┃ ┗━━━━━━━━━━━━┛ • after you have shared your local changes, consider the online history immutable; to change and resync it with others is a major pain and mostly not advised Visualizing_using_git_for_team_work: (You) | Server | Anon --------------------+-----------+-------------------- ┌───┐ | .-. | .-. │ C │ | I\\ I | I\\ I ├───┤ | I \\I | I \\I │ C │ | ^-^ | ^-^ ├───┤ | | │ C │ | . | . └───┘ | | | | . | . +-------+ | | | | . | . | | | ┓───┏ | | ┓───┏ | . ┃ C ┃ <---+---> | ┃ C ┃ | ┣━━━┫ push | ┣━━━┫ | . ┃ C ┃ | ┃ C ┃ | ┣━━━┫ | ┣━━━┫ | . ┃ C ┃ | ┃ C ┃ | ┗━━━┛ | ┗━━━┛ | . | | . | . | . | | . | . | ┓───┏ | | ┃ C ┃ . | . | pull ┣━━━┫ | | --------> ┃ C ┃ . | . | ┣━━━┫ | | ┃ C ┃ . | . | ┗━━━┛ | | | . | . | | | | | commit -m "Added new bugs" . | . | | | | | . | . | V | | ┌───┐ . pull | . | │ C │ "Already up" <---- | | ┓───┏ "to date." | . | ┃ C ┃ | | ┣━━━┫ . | . | ┃ C ┃ | | ┣━━━┫ . | . | ┃ C ┃ | | ┗━━━┛ . | . | | | | +-------+ . | . | | | | | ┓───┏ | ┓───┏ | | ┓───┏ ┃ C ┃ | ┃ C ┃ | <---+---> ┃ C ┃ ┣━━━┫ | ┣━━━┫ | push ┣━━━┫ ┃ C ┃ | ┃ C ┃ | ┃ C ┃ ┣━━━┫ pull | ┣━━━┫ | ┣━━━┫ ┃ C ┃ <-------- | ┃ C ┃ | ┃ C ┃ ┣━━━┫ | ┣━━━┫ | ┣━━━┫ ┃ C ┃ | ┃ C ┃ | ┃ C ┃ ┗━━━┛ | ┗━━━┛ | ┗━━━┛ | | HEAD: • an imaginary pointer that specifies which version is currently selected • the version pointed by HEAD is the one that is currently located in ${PWD} Front_ends: • using git without a front-end is quite tiresome and tidious gitui : tui for git; easy to get into, manouver and use; great for terminal based workflows Nesting: • makes the repository structure strictly hierarchical • practically marks the submodule as a dependency • submodules do not behave as regular subdirectories git submodule add <path> <remote> ### Oh no, I fucked up and commited with Git ### 1. Revert head until necessary $ git rebase -i HEAD~<int> # where <int> the number of the commint counted from the last commit, starting from 1 • this command is perfectly safe, it does not automatically affect your history and or state just by invocation 2. Read the help comment carefully • one thing it doesnt explicitly mention is that "pick" can be used for cherry-picking too 3. ??? 4. Profit # ### Managing git conflicts (with Vim) ### — git will place a conflict marker into a conflicting file: { <<<<<<< <version-1> <Content from version-1> ======= <Content from version-2> • >>>>>> <version-2> } {// make sure to set the following in your .gitconfig: [merge] tool = vimdiff } { // invocation / how to read $ git mergetool +-------+----------+--------+ | | | | | local | previous | remote | | | | | +-------+----------+--------+ | | | resolution | | | +---------------------------+ } • the top 3 sections serve as cheatsheets • in the bottom, "resolution" area, delete either sections between the guards ("[<>=]+") or mix (perhaps append) their contents to the desired effect • ":qa" after all conflict markers are done with; the next conflict will auto open # ?!: git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch <file>' HEAD git log --follow -- <file> ------------ peru: ------------ • submoduling tool • works better and is more general than Git submodules • integrates nicely with Make ○ supports: • git • hg • svg • curl pip install peru peru <verb> sync : install modules clean : delete modules; only delete modules previously installed according to .peru, reinstalling kinda breaks it reup : fetch the newest versions and add "rev" entries to peru.yaml Files: peru.yaml : main configuration file for modules .peru/ : local magic folder, keeping module information peru.yaml: { imports: (<name>: <destination_folder>)+ } { <method> module <name>: <option>: <value> } <method>: git url pick: <file_list> : only install these files rev: <commit> : select exact commit instead of main/master curl url unpack // {tar} Usage_with_make: { .peru/lastimports: peru.yaml peru sync }

tor

#define tor::: \ I _____ \ I |_ _|__ _ _ \ I | |/ _ \ '_| \ I |_|\___/_| I • tor daemon https://github.com/grugq/PORTALofPi // ?! tor (-f <torrc>) • "The Onion Router" • connection-oriented anonymizing communication service • many layers of individual encryption, hence the onion • directory servers with an overview of all relays and their public keys • exit nodes are essention man-in-the-middles, tho they dont know the source, they can see all data as encrypted as they normally would be • both the local network and the remote target should have no clue about the identity of a tor user • both the local network and the remote target can easily tell if one is using tor • there are protocols to hide connections to tor from the local network (see AT /?!) • is tor the tor protocol safe? yes. • is tor browser safe? no, not with javascript enabled, it isnt. — clearnet sites may advertise their onion counterpart by adding a special HTTP header to the form: Onion-Location: http://vwc43ag5jyewlfgf.onion Files: /etc/tor/ └── torrc : config file; see BELOW Config: • done throught a config file • all directives must have their own line • empty lines are ignored • C style escape sequances are allowed inside quotes #[...] : comment [option] [value] : sets [option] to [value] ○ [options] User <string> : who to use as; a literal user on ones machine (look inside /etc/shadow) DataDirectory [path] : store working data in [path] ClientDNSRejectInternalAddresses [bool] : reject any DNS anwares pointing to internal addresses { 168.192.0.1 } as that allows for some types of attacks; default 1 # # Minimal torrc so tor will work out of the box # User tor PIDFile /run/tor/tor.pid Log notice syslog DataDirectory /var/lib/tor/data Dependant_programs: torbrowser : webbrowser routing throught the tor network and having onion site support; uses Modzilla Firefox as its backbone torghost [options] : routes all traffic throught the tor network -s : starts -r : switches tor node -x : exits torctl [command] : routes all traffic throught the tor network start : starts stop : stops restart : restarts status : displays status information ip : prints current public ipv4 address Tor_services: • or "hidden services" • .onion sites • often mistakenly referred to as the dark web while in reality its only a sub-set of it • onion links are public key hashes ### How to Set Up a Hidden (Onion|Tor) Service ### • insanely easy, especially compared to conventional web hosting 1. Have a service running • this can be any service • write down what port its running on, this address will be referenced BELOW as <port> • for testing purposes lets use netcat { $ nc -l 1234 } 2. Configure Tor { HiddenServiceDir <data_dir> HiddenServicePort <service_port> 127.0.0.1:<port> } • open the torrc your daemon is using ("/etc/tor/torrc" by default) • tor will need to know where to store relevant information about the site and which port it must mirror/proxy to the tor network • you will also have to specify the dir for Tor to create(!) and store stuff at {"mynetcat"} • if you're planning on hosting multiple hidden services its a good idea to create a designated parent directory for all {"/var/lib/tor/hidden_service/"}; double check permissions and owner (have it '7xx tor') • <service_port> is the outbound port through which one must connect to the service to access it • while <service_port> in our case will be the same as <port>, this would not apply, if we had, lets say, a gitea running on port 3000; there, <service_port> we would set it to 80 (or 443), because we would want to to behave normally from a browser { // configuration template populated with our example case HiddenServiceDir /var/lib/tor/hidden_service/mynetcat HiddenServicePort 1234 127.0.0.1:1234 } • for debugging, "tor --runasdaemon 0 --verify-config" could be useful 3. Restart tor { $ sudo systemctl restart tor # or with whatever init system you have, obviously } 4. Get the address { $ cat <data_dir>/hostname } • an onion address is automatically created for your hidden service { // address location in our example $ cat /var/lib/tor/hidden_service/mynetcat/hostname } 5. Verify • it should be online now, allowing us to connect • test it { $ torify nc jsBsjBsn2j59poqndnajk45ndtjsbA6bsjubyeqzfqhxcgujsadnmi5d.onion 1234 } # ### Fixing Git address-resolving issues with Hidden (Onion) Services ### $ [proxychains|torify] git clone http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion/anon/test.git Cloning into 'test'... fatal: unable to access 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion/anon/test.git/': Not resolving .onion address (RFC 7686) • no clue why proxychains actually fails • the error doesnt even have a mark in the source code, not sure what throws it • not understanding the issue does not prevent us from solving it 1. Configure git to consult a proxy for onion addresses • open your ".gitconfig" (presumably under "~/") — append: { # assuming the service is http, not https; you could add both by duplicating, # however git with self-signed https certs is its own can of worms [http "http://*.onion"] sslVerify = false proxy = "socks5h://127.0.0.1:9050" } 2. Ensure Tor provides a SOCKS5 proxy at the configured port (9050 in our case) • open your torrc (presumably under "/etc/tor/torrc") — ensure you have the following line: { SOCKSPort 9050 } 3. Enjoy • from now on .onion urls will work for you like regular ones { $ git clone http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion/anon/test.git Cloning into 'test'... remote: Enumerating objects: 112, done. remote: Counting objects: 100% (112/112), done. remote: Compressing objects: 100% (80/80), done. remote: Total 112 (delta 21), reused 89 (delta 17), pack-reused 0 Receiving objects: 100% (112/112), 128.80 KiB | 241.00 KiB/s, done. Resolving deltas: 100% (21/21), done. } # SURPASSED BY YT-DLP ------------ youtube-dl ------------ >downloader >suitable for youtube videos, playlists and channels, but also for non-youtube content >when specifing a playlist make sure its not a video playing belonging to a playlist, but the unique page of the playlist where all members are listed youtube-dl [options] [url] -v : verbose --write-thumbnail : download thumbnail too --write-description : download description too --write-sub : download subtitles too -F : list avalible [format]s -f [format] : download in [format] bestaudio : download only audio; in the best avalible format >specify multiple formats to (audio and video| by the use of a '+' -------------- yt-dlp: -------------- • video downloader • suitable for youtube videos, playlists and channels, but also for non-youtube content • when specifing a playlist make sure its not a video playing belonging to a playlist, but the unique page of the playlist where all members are listed yt-dlp [options] [url] — v : verbose --write-thumbnail : download thumbnail too --write-description : download description too --write-sub : download subtitles too — F : list avalible [format]s — f [format] : download in [format] bestaudio : download only audio; in the best avalible format • specify multiple formats to (audio and video| by the use of a '+' --------------------- BitTorrenting: --------------------- // ?!; move • the protocol is called BitTorrent, but almost always shortened to "torrent" • the process is called torrenting • torrenting is p2p • peer discovery is federated; its either done using trackers or a DHT, both requires servers File: *.torrent : torrent file; contains information on files and trackers Programs: transmission : fully featured torrent client • has a web interface on 9091 transmission-create : creates new torrent files transmission-edit : edits torrent files transmission-show : reads/info dumps torrent files transmission-daemon : background process and server heavy lifting torrents transmission-cli : CLI front end connecting to the daemon transmission-remote : GUI front end connecting to the daemon transmission-remote-gtk : GUI front end connecting to the daemon; in GTK ---------------- soulseek: ---------------- • a network of the partially peer-to-peer soulseek protocol • older and more obscure torrent • the prime source for pirated music • requires registration, but no verification of any kind, just a username and password • whenever you get banned for leeching, you can just quickly re-register • Nicotine+ is the recommended client {pip install nicotine-plus} -------------- httpie: -------------- • curl for humans • recommended if you invoke curl by hand often http [options] [METHOD] [URL] https [options] [METHOD] [URL] [options]: --verify=[yes|no] : whether to check ssl certificates; <--- ----------- ftp: ----------- • "File Transfer Protocol" • interactive network connection handler • "modern" (read: a train wrecking into a dumpster fire) browsers have removed builtin ftp support ftp [options] ([host]) : creates an ftp connection to [host] • after lauch the user has the option to enter commands ○ commands • the most important commands are marked with a 'Ж' at the begining of their line • [rfile] signals a remote file • [lfile] signals a local file ! $ account append ascii bell binary bye case Ж cd : change directory; operates on the remote machine; analogous to Linuxs cd (see AT "/Linux/Manuvering/cd") cdup chmod close cr delete debug dir disconnect epsv4 form get [rfile] : downloads [rfile] to ${PWD}; see also mget BELOW glob hash help idle image ipany ipv4 ipv6 Ж lcd : local cd; operates on the local machine; analogous to Linuxs cd (see AT "/Linux/Manuvering/cd") lpwd Ж ls : list; analogous to Linuxs cd (see AT "/Linux/Manuvering/ls") macdef mdelete mdir mget [rfiles] : downloads [rfiles] (notice the plural form) to ${PWD}; see also get ABOVE mkdir mls mode modtime mput [lfiles] : uploads [lfiles] (notice the plural form) to the remote machines ${PWD}; see also put BELOW newer nmap nlist ntrans Ж open : connects to host; you do NOT give the host address as an arguemnt, you will be promted to enter it passive prompt proxy sendport Ж put [lfile] : uploads [lfile] to the remote machines ${PWD}; see also mput ABOVE Ж pwd : "Print Working Directory"; outputs the current path Ж quit : closes connection and exits ftp quote recv reget rstatus rhelp rename reset restart rmdir runique site size status struct system sunique tenex trace type user umask verbose ? : alias of help ----------- ssh: ----------- • secure shell protocol and application implementation • server-client struct-ed • running ssh daemon on the target { sudo systemctl start sshd } { sudo rc-service sshd start } Programs: ssh [options] [target] : login with a shell to a remote machine { // Connecting to an ssh server root@Server $ /usr/sbin/sshd anon@Client $ ssh myuser@192.168.0.176 } scp [options] ([target]:)[path-1] ([target]:)[path-2] : "Secure CoPy"; copy file(s) using ssh — P [port] : specifies port — r : recursively [target]: ([username]@)([ip]|[domain]) : [username] is the user one would like to login to the server; can be ommited if it maches ${USER} ([ip]|[domain]) specifies the server ### Set up key only auth for SSH ### • basic knowledge of public key cryptography • the server holds a public key, while the client has a private key which it will use for authentication • this way we protect from brute forcing attacks and optionally avoid having to enter a password manually when connecting 1. Create a key pair anon@Client $ ssh-keygen "Generating public/private rsa key pair." "Enter file in which to save the key (/home/anon/.ssh/id_rsa):" <path> "Enter passphrase (empty for no passphrase):" [password] "Enter same passphrase again:" [password] "Your identification has been saved in ignore" "Your public key has been saved in ignore.pub" "The key fingerprint is:" "SHA256:sAswBDPwdk6wqK8HSOvDBRUrJmYbA0O9i8ZAmTbxve0 anon@Client" "The key's randomart image is:" "+---[RSA 3072]----+ " "|=o=.o o * | " "|.Xx+o+ + a | " "|+BB o.o . b | " "|*o* o | " "|+o* o...S | " "|.=.B .+ r | " "|+ ..+ oE | " "| + .jklas8u | " "| o. | " "+----[SHA256]-----+ " ○ NOTES: <path> : if you're following this tutorial then the default probably good enough for you [password] : optional password; your private key will be encrypted with this, which makes it secure from being plainly stolen, however do note that you'll have to enter it whenever with every new ssh-agent session; dont be afraid to leave it empty 2. Get the server's identifier • if the server is located on the LAN use: root@Server $ ip a //look for the num string which fits the pattern: 192.168.0.<int> • if the server is located on WAN look up its IP online • if the server has a register-ed domain use that • use whatever you got as "<targer>" from now on 3. Add the key to the server anon@Client $ ssh-copy-id <target> • if the key location is not the default, explicit-ly specify its path using the `-i` flag and point it towards the `.pub` file 4. Login to the server anon@Client $ ssh <targer> • this step serves as both ground work for easing the next step and as a test • if you're prompted for a password something went terribly wrong, do not proceed 5. Disable password authentication root@Server $ ${EDITOR} /etc/ssh/sshd_config ○ add or modify lines to match the following rules: PubkeyAuthentication yes PasswordAuthentication no 6. Restart ssh server root@Server $ systemctl restart sshd Troubleshooting: ○ permissions • ssh is very sensitive to the correct permissions on the server (for understandable security reasons, but the error reporting ain't great) :--------------:------------------------: | Permission | File | :--------------:------------------------: : 755 : ~/ : : 700 : ~/.ssh/ : : 600 : ~/.ssh/authorized_keys : :--------------:------------------------: # ------- tmate ------- • ssh wrapper • provides one time secure sessions • uses a central server, dodging all difficulties arrising from ip / port forwarding ------- rhino ------- • Mozillas javascript interpreter rhino [options] : runs javascript — w : enable warnings --------- web-ext --------- • Mozillas command line tool for browser extension development web-ext [options] [verb] • Option values can also be set by declaring an environment variable prefixed with "WEB_EXT_" { --source-dir="~/myExtention" // is the same as: WEB_EXT_SOURCE_DIR="~/myExtention" } ○ [options] — s [path] : source directory; default-s to ./ ○ [verb] build : builds an easily installable version of ones extension sign run : fires up a dummy browser with the extension at ${PWD} installed lint docs

firefox

#define firefox::: \ I-----------------------------\ I ___ _ __ \ I | __(_)_ _ ___ / _|_____ __ \ I | _|| | '_/ -_| _/ _ \ \ / \ I |_| |_|_| \___|_| \___/_\_\ \ I-----------------------------I • web browser Special_pages: • these pages are all imune to extension content scripts accounts-static.cdn.mozilla.net accounts.firefox.com addons.cdn.mozilla.net addons.mozilla.org api.accounts.firefox.com content.cdn.mozilla.net content.cdn.mozilla.net discovery.addons.mozilla.org input.mozilla.org install.mozilla.org oauth.accounts.firefox.com profile.accounts.firefox.com support.mozilla.org sync.services.mozilla.com testpilot.firefox.com Extentions: manifest.json : the main firefox specific file which contains metadat and starts the control flow ○ keys: • all are strings; the values are not neccesserly, but defaults to if not specified otherwise • mandatory pairs are marked with a '#' author : the extensions creators name background : specifies background execution with its properties scripts : list of javascripts which should be treated as background scripts page : a path to a html document which can have its own javascripts; cant be used together with "scripts" (see ABOVE) persistent : bool; whether the background page should be kept in memory (and therefor preserve its state) when its not in use browser_action : controls the button added to the browser toolbar browser_style : bool; whether to include firefoxs stylesheet default_area : [area]; where the button shall be initally placed "navbar" : main browser toolbar; default "menupanel" : popup panel "tabstrip" : tab toolbar "personaltoolbar" : bookmarks toolbar default_icon : string or object; the icon for the button; path(s) relative to the manifest.js; specify multiple files for multiple sizes, where the key is the image height { "default_icon": { "16": "MyFolder/pic16.png", "32": "MyFolder/pic32.png" } } default_popup : path to html file to be used as a popup when the button is clicked; if the page containts đembededđ javascript, it will be threated as a Content Violation Policy error default_title : tooltip for the button (hover) theme_icons : [ThemeIcons] object; specifies what extension themes to be used ○ acording to firefoxs theme properties: "light" : path to the image to be used on light theme "dark" : path to the image to be used on dark theme "size" : size of the "light" and "dark" images commands : defines key combinations which can be listened to with the API [name] : the name of the feature suggested_key : defines key; specific to subproperty "default" "mac" "linux" "windows" "chromeos" "android" "ios" description : feature description — exceptions: • these builtin actions never fire (on the API) when their shortcut is called _execute_browser_action _execute_page_action _execute_sidebar_action content_scripts : specifies content scripts to be loaded default_locale : specifies locale description : a short description of the extension, intended for display in the browsers user interface devtools_page : path to a html file; used to enhance devtools # manifest_version : must always be 2 # version : float; specifies extension version browser_specific_settings : application specific properties "gecko" : chrome_setting_overrides : override-s browser settings "homepage" : url/path to new homepage "search_provider" : adds new search engine chrome_url_override : override-s local browser pages bookmarks : bookmarks page history : history page newtab : new tab newtab : new tab content_security_policy : — content script: • content scripts run on a particular page as embedded code — background script: pass Dev_tools: F12 • since there are 2 usable web engines in existence, every browser supports it ○ [CTRL] & [ALT] & [MOUSE1] : expand element with all children #define\ I----------------------------\ I __ __ ___ ____ ____ \ I | \/ |_ _/ ___| / ___| \ I | |\/| || |\__ \| | \ I | | | || | __| || |___ \ I |_| |_|___|____/ \____| \ I----------------------------I rsnapshot XAMPP: • very popular • winhead cope over proper service management • trivially wraps some common webdev serves using a gui — the services include, but are not limited to: apache2 mysql history: atuin : TUI front-end for shell histories; bloated and has sync philosophy which i find shady hstr : TUI front-end for shell histories; ugly, but useful histui : TUI front-end for bash history