Compare commits

...

17 Commits

19 changed files with 354 additions and 85 deletions

View File

@@ -5,6 +5,8 @@ PAGER ?= less -Ri
READER != command -v mdless bat glow less more pg | head -1
FZF != command -v fzf sk | head -1
markdown = $(wildcard */*.md */*/*.md)
ifeq "$(FZF)" ""
$(info Install fzf)
endif
@@ -32,7 +34,7 @@ default += .dbs/map.fmt
include cmd.mk
.dbs/head.rec: | .dbs/ $(lists)
.dbs/head.rec: | .dbs/
printf '%s\n' '%rec: guide' > $@
printf '%s\n' '%key: path' >> $@
printf '%s\n' '%type: requires rec guide' >> $@
@@ -40,7 +42,7 @@ include cmd.mk
printf '%s\n' '%type: wordcount int' >> $@
printf '%s\n\n' '%sort: wordcount' >> $@
.dbs/new.rec: $(wildcard */*.md */*/*.md) | .dbs/head.rec
.dbs/new.rec: $(markdown) | .dbs/head.rec
$(info Updating: $?)
grep -q guide $@ 2>/dev/null || cp $| $@
@-$(foreach entry, $?, \

5
cmd.mk
View File

@@ -2,8 +2,6 @@
cmds != recsel command.rec -t command -G bin -CP bin | sort -u
lists = $(patsubst %,lists/%.md, $(cmds))
default += $(lists)
get_title = printf 'title: %s\n' '${1}'
get_tags = recsel -t $(basename $<) $< -G bin \
-e 'bin = "$(1)"' -U -CP tag,bin | \
@@ -20,9 +18,6 @@ $(lists): lists/%.md: command.rec | lists/
@printf '%s\n' '---' >> $@
@$(call list_commands,$(basename $(notdir $@))) >> $@
.PHONY: cmd
cmd: $(lists) ## Big lists of commands
.PHONY: function
function: ## Output a search function for .bashrc
${MAKE} --silent --touch query

View File

@@ -157,12 +157,37 @@ shell: sh
bin: journalctl
tag: system
aim: Edit users in /etc/passwd directly
cmd: sudo vipw
note: You can't edit passwords with black magic.
shell: sh
bin: vipw
bin: sudo
tag: system
tag: users
aim: Edit groups in /etc/group directly
cmd: sudo vigr
note: You can't edit passwords with black magic.
shell: sh
bin: vipw
bin: sudo
tag: system
tag: groups
aim: Follow the `ssh` daemon service
cmd: journalctl -f -u sshd
shell: sh
bin: journalctl
tag: system
aim: Get back terminal after ssh freezes remote machine
cmd: <Return>~.
shell: sh
bin: ssh
tag: system
tag: comfy
aim: Find errors since a date
cmd: date=2027-01-01
+ journalctl --since=${date} --grep="EXT4-fs error"
@@ -170,18 +195,22 @@ shell: sh
bin: journalctl
tag: system
aim: Limit the journal's size to 2 gigabytes
aim: Limit the systemd's journal size to 2 gigabytes
cmd: journalctl --vacuum-size=2G
+ journalctl --disk-usage
shell: sh
bin: journalctl
tag: system
tag: logs
aim: Log the fact that you've installed your own `dnsmasq` on your system to `journalctl`, so that you can determine why your system's broken later
cmd: logger "Installed new dnsmasq"
+ sudo journalctl -f
shell: sh
bin: journalctl
bin: logger
tag: system
tag: logs
aim: Convert markdown table to csv
cmd: mlr --imarkdown --ocsv cat ${file}.md
@@ -218,8 +247,8 @@ cmd: grep -o "\b${word}\b" ${file}
bin: grep
tag: search
aim: Reformat variable for shell input
cmd: printf "%q\n" "${variable}"
aim: Reformat text for shell input
cmd: printf "%q\n" "${text}"
bin: printf
tag: xargs
tag: stdout

View File

@@ -1,5 +1,5 @@
---
title: Edit gpg encrypted files easily
title: Edit gpg encrypted files with vim
tags:
- vim
- data

View File

@@ -1,5 +1,5 @@
---
title: pdf to txt
title: Convert a scanned pdf to text
tags:
- data
- pdf

View File

@@ -16,23 +16,23 @@ Make a database for your boardgames, specifying only one field and value:
database=games.rec
n=Name
g=Vojvodina
touch $database
recins -f $n --value $g $database
recsel $database
touch ${database}
recins -f ${n} --value ${g} ${database}
recsel ${database}
```
Insert a few more, with the estimated playtime:
```sh
recins -f Name -v Saboter -f Playtime -v 30 $database
recins -f Name -v Chess -f Playtime -v 30 $database
recins -f Name -v Saboter -f Playtime -v 30 ${database}
recins -f Name -v Chess -f Playtime -v 30 ${database}
```
View all games, or select one by number:
```sh
recsel $database
recsel -n 0 $database
recsel ${database}
recsel -n 0 ${database}
```
Each game should note whether or not you have played it yet, so you can add that field and set the default to `yes`.
@@ -40,14 +40,14 @@ Each game should note whether or not you have played it yet, so you can add that
```sh
f=played
v=yes
recset -f $f -a $v $database
recset -f ${f} -a ${v} ${database}
```
...but the field is wrong, it should have a capital letter:
```sh
new_field=Played
recset -f $f --rename $new_field
recset -f ${f} --rename ${new_field}
```
## Read
@@ -55,20 +55,20 @@ recset -f $f --rename $new_field
Check how many records the database has:
```sh
recinf $database
recinf ${database}
```
Look at just the games you've never played:
```sh
recsel --expression="Played = 'no'" $database
recsel --expression="Played = 'no'" ${database}
```
Print how many, then just print the names:
```sh
recsel -e "Played = 'no'" --count $database
recsel -e "Played = 'no'" --print=Name $database
recsel -e "Played = 'no'" --count ${database}
recsel -e "Played = 'no'" --print=Name ${database}
```
## Update
@@ -79,8 +79,8 @@ To change a game's `Played` field from `no` to `yes`, use `recset` to specify th
num=0
f=Played
value=yes
recsel --number=$num $database
recset --number=$num -f $f --set=$value $database
recsel --number=${num} ${database}
recset --number=${num} -f ${f} --set=${value} ${database}
```
Find all games with a playtime of `30`, and set the field `Max_Players` to `4`.
@@ -102,22 +102,22 @@ Remove `Played` record from first game:
```sh
num=0
recset --number=$num -f Played --delete $database
recset --number=${num} -f Played --delete ${database}
```
You can comment the line instead of deleting it:
```sh
num=1
recset --number=$num -f Played --delete $database
recsel $database
cat $database
recset --number=${num} -f Played --delete ${database}
recsel ${database}
cat ${database}
```
Delete an entire record:
```sh
num=2
recdel --number=$num $database
recdel --number=${num} ${database}
```

View File

@@ -9,8 +9,6 @@ requires:
- writing/vim.md
---
- [Sample file](sc-im/sample.sc)
# Basic Commands
## See Cells

View File

@@ -54,9 +54,8 @@ brightnessctl s 10%-
brightnessctl s 10%+
```
# Other Tricks
# Related
- [autologin](autologin.md)
- [services](sv.md)
- [wifi](networking/wpa_supplicant.md)
- [autologin](distros/void/autologin.md)
- [services](distros/void/sv.md)

View File

@@ -120,3 +120,36 @@ content: output: all
+
+ clean :
+ rm -rf public html
filename: Makefile
bin: make
usage: make
content: ### Variables
+
+ PAGER ?= $(shell command -v mdless bat less | head -1 )
+ EDITOR ?= vi
+
+ requirements += lowdown
+
+ ### Dependencies
+
+ out: help
+
+ ### Patterns
+
+
+ ### Phonies
+
+ .PHONY: help
+ help:
+ @awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z._-]+:.*?## / {printf "\033[36m%s\033[0m : %s\n", $$1, $$2}' $(MAKEFILE_LIST) | \
+ sort | \
+ column -s ':' -t
+
+ .PHONY: check
+ check: ## Check you have the required dependencies
+ @$(foreach dep, $(requirements), type $(dep) >/dev/null || echo "Install $(dep)." ; )
+
+ .PHONY: clean
+ clean: ## Remove generated files.
+ $(RM) $(defaults)

View File

@@ -12,7 +12,7 @@ tags:
| CNAME | Alternative Address | "$domain".rs, "$subdomain.$domain".com |
| NS | Nameserver | ns1.fastname.com |
| MX | Email server | "$domain".com |
| TXT | Literally anything,including ownership of a domain | - |
| TXT | Literally anything | "drunk giraffes can't spell" |
Query a host's IP and email handlers with the `host` command.

22
networking/stop_email.md Normal file
View File

@@ -0,0 +1,22 @@
---
title: Stop email impersonating your domain
tags:
- networking
requires:
- networking/dns_records.md
---
There is nothing to stop scammers from sending email claiming to be coming from your domain.
And the older it gets, the more valuable it is for spoofing.
Just add these two TXT records to the DNS for your domain:
Name | Type | Value
:------|:----:|:-----
@ | TXT | v=spf1 -all
_dmarc | TXT | v=DMARC1; p=reject;
The first says there is not a single SMTP server on earth authorized to send email on behalf of your domain.
The second says that any email that says otherwise should be trashed.

View File

@@ -46,5 +46,5 @@ Just press `!`, e.g. `!ls`.
# Edit a File
While reading a file, press `v` to edit it ('v' stands of `vi`).
While reading a file, press `v` to edit it ('v' stands for `vi`).

View File

@@ -180,6 +180,6 @@ In this case, the makefile can see that `backup` depends on the current backup f
# The Rest
- [File patterns](makefiles/patterns.md)
- [Makefile graphs](makefiles/graph-easy.md)
- [In-build help](makefiles/help.md)
- [File patterns](system/makefiles/patterns.md)
- [Makefile graphs](system/makefiles/graph-easy.md)
- [In-build help](system/makefiles/help.md)

View File

@@ -24,11 +24,11 @@ Note the asterisk marking the boot partition.
# IDs
| ID | Meaning |
|----|:--------|
|83 |Linux |
| 5 |Extended |
| 82 |Swap |
| ID | Meaning |
|:----------:|:-----------|
| 83 | Linux |
| 5 | Extended |
| 82 | Swap |
fdisk will not help with a GPT formatted drive. For this, use gdisk, which is mostly the same.
@@ -52,15 +52,15 @@ mkreiserfs /dev/sdc2
# File System Types
| Type | Advantages | Disadvantages |
|------|:-----------|:--------------|
|ext2 | |No journaling means that the file offers no crash recovery.
|ext3 | Journaling |
|ext4 | Journaling and handles files of up to 16TB.|
|reiserfs| Journalin and stable.|
|btrfs |Reliable and stable|
|XFS |Journaling, great for large files.|
|VFAT |Comptable with Windows, like FAT32|
| Type | Advantages | Disadvantages |
|----------------|:----------------------------------------------|:-------------------------------------------------------------|
| ext2 | | No journaling means that the file offers no crash recovery. |
| ext3 | Journaling | |
| ext4 | Journaling and handles files of up to 16TB. | |
| reiserfs | Journalin and stable. | |
| btrfs | Reliable and stable | |
| XFS | Journaling, great for large files. | |
| VFAT | Comptable with Windows, like FAT32 | |
# Parted

View File

@@ -13,23 +13,23 @@ Input a command with C-b
In addition to Windows, there are panes.
|Commands | Key |
| ---- | ---- |
| New Window | c |
| Previous Window | p |
| next window | n |
| list windows | w |
| vertical split | % |
| horizontal split | " |
| name a command | : |
| kill pane | x |
| kill session | d |
|Commands | Key |
|------------------|------|
| New Window | c |
| Previous Window | p |
| next window | n |
| list windows | w |
| vertical split | % |
| horizontal split | " |
| name a command | : |
| kill pane | x |
| kill session | d |
|Name Commands|
| --------|
| split-window |
| rename-window |
### Name Commands
- split-window
- rename-window
# Sessions

View File

@@ -12,14 +12,6 @@ Turn a markdown file into a pdf:
lowdown -stms "$FILE".md | pdfroff -itk -mspdf > "$FILE".pdf
```
*Example:* put [this Makefile](lowdown/example.txt) in a directory, rename it `Makefile`, then do:
```sh
make example
make
```
To give the document a title, put that title in the metadata:
```sh

View File

@@ -20,8 +20,9 @@ Keybind to exit this mode is `Ctrl+q`
## Extras
- [Learning Vim](vim/vi.md)
- [Navigation](vim/navigate.md)
- [Completion](vim/completion.md)
- [Window Splits](vim/windows.md)
- [Use vim bindings in bash](vim/vim_in_bash.md)
- [Learning Vim](writing/vim/vi.md)
- [Navigation](writing/vim/navigate.md)
- [Completion](writing/vim/completion.md)
- [Window Splits](writing/vim/windows.md)
- [Use vim bindings in bash](writing/vim/vim_in_bash.md)
- [A game to learn how to code in Vim](https://www.vim-hero.com/)

116
writing/vim/csv_to_md.md Normal file
View File

@@ -0,0 +1,116 @@
---
title: CSV to Markdown in Vim
tags:
- writing
- vim
- csv
- markdown
requires:
- writing/vim.md
---
Open a CSV table (I made this one with `:r!sed 's/:/,/g' /etc/passwd | head`).
```csv
root,x,0,0,,/root,/bin/bash
bin,x,1,1,,/,/usr/bin/nologin
daemon,x,2,2,,/,/usr/bin/nologin
mail,x,8,12,,/var/spool/mail,/usr/bin/nologin
ftp,x,14,11,,/srv/ftp,/usr/bin/nologin
http,x,33,33,,/srv/http,/usr/bin/nologin
nobody,x,65534,65534,Nobody,/,/usr/bin/nologin
dbus,x,81,81,System Message Bus,/,/usr/bin/nologin
systemd-coredump,x,981,981,systemd Core Dumper,/,/usr/bin/nologin
systemd-network,x,980,980,systemd Network Management,/,/usr/bin/nologin
```
Highlight the table.
- Go to the top, with 'root'.
- Type `V9j`.
- `:!column -ts, -o '|'`
- Return!
```csv
root |x|0 |0 | |/root |/bin/bash
bin |x|1 |1 | |/ |/usr/bin/nologin
daemon |x|2 |2 | |/ |/usr/bin/nologin
mail |x|8 |12 | |/var/spool/mail|/usr/bin/nologin
ftp |x|14 |11 | |/srv/ftp |/usr/bin/nologin
http |x|33 |33 | |/srv/http |/usr/bin/nologin
nobody |x|65534|65534|Nobody |/ |/usr/bin/nologin
dbus |x|81 |81 |System Message Bus |/ |/usr/bin/nologin
systemd-coredump|x|981 |981 |systemd Core Dumper |/ |/usr/bin/nologin
systemd-network |x|980 |980 |systemd Network Management|/ |/usr/bin/nologin
```
The command displays as `:'<,'>!column -ts, -o '|'`.
This looks better, but the spacing is bad because the output separate is `-o '|'`.
You can put spaces around that pipe by making the separator a pipe (`-s'|'`)
and making the output separator a pipe with spaces (`-o' | '`).
```vim
:'<,'>!column -ts'|' -o ' | '
```
```csv
root | x | 0 | 0 | | /root | /bin/bash
bin | x | 1 | 1 | | / | /usr/bin/nologin
daemon | x | 2 | 2 | | / | /usr/bin/nologin
mail | x | 8 | 12 | | /var/spool/mail | /usr/bin/nologin
ftp | x | 14 | 11 | | /srv/ftp | /usr/bin/nologin
http | x | 33 | 33 | | /srv/http | /usr/bin/nologin
nobody | x | 65534 | 65534 | Nobody | / | /usr/bin/nologin
dbus | x | 81 | 81 | System Message Bus | / | /usr/bin/nologin
systemd-coredump | x | 981 | 981 | systemd Core Dumper | / | /usr/bin/nologin
systemd-network | x | 980 | 980 | systemd Network Management | / | /usr/bin/nologin
```
Make a header by copying the top line and replacing text (`yypkR`).
That's nicer, but the formatting's wrong again.
```markdown
User | Passwords | UID | GID | Description | Home | Shell
root | x | 0 | 0 | | /root | /bin/bash
[...]
```
Time to fix it with `:'<,'>!column -ts'|' -o'|'`.
```csv
User | Passwords | UID | GID | Description | Home | Shell
----------------- | ----------- | ------- | ------- | ---------------------------- | ----------------- | ----------
root | x | 0 | 0 | | /root | /bin/bash
bin | x | 1 | 1 | | / | /usr/bin/nologin
daemon | x | 2 | 2 | | / | /usr/bin/nologin
mail | x | 8 | 12 | | /var/spool/mail | /usr/bin/nologin
ftp | x | 14 | 11 | | /srv/ftp | /usr/bin/nologin
http | x | 33 | 33 | | /srv/http | /usr/bin/nologin
nobody | x | 65534 | 65534 | Nobody | / | /usr/bin/nologin
dbus | x | 81 | 81 | System Message Bus | / | /usr/bin/nologin
systemd-coredump | x | 981 | 981 | systemd Core Dumper | / | /usr/bin/nologin
systemd-network | x | 980 | 980 | systemd Network Management | / | /usr/bin/nologin
```
Now we just need the spacer line.
Copy the top line (`yyp`) and replace (`:s/not-pipe/-/g`).
You can say 'not the pipe symbol' with `[^|]` or 'not-pipe-or-colon' with `[^:|]`.
```vim
:s/[^:|]/-/g
```
# Keyboard Shortcut
Put this in your `~/.vimrc` to map 'Control + s' to reformat CSV while in visual mode.
```vim
vmap <C-s> :!column -ts, -o " \| "<Enter>yyp:s/[^\|:]/-/g<Enter>
```

82
writing/vim/format_md.md Normal file
View File

@@ -0,0 +1,82 @@
---
title: Reformat a Markdown Table
tags:
- writing
- vim
- markdown
requires:
- writing/vim.md
---
This markdown table is badly messed up:
```markdown
| File | Category |
|:------|:---------|
| calendar.md | tex|
| tex_packages.md | tex|
| completion.md | vim|
| csv_to_md.md | vim|
| format_md.md | vim|
```
Highight from the top with `V6j`, then run `column` to fix the output:
```vim
:!column -ts'|' -o '|'
```
It displays like this:
```vim
:'<,'>!column -ts'|' -o '|'
```
```markdown
| File | Category |
|:------ |:---------|
| calendar.md | tex |
| tex_packages.md | tex |
| completion.md | vim |
| csv_to_md.md | vim |
| format_md.md | vim |
```
That's better, but the header is broken.
Fix is by replacing spaces with dashes.
```vim
:s/ /-/g
```
The lines have too much whitespace.
You can fix this with the 'truncate' command, to squeeze repeating spaces or dashes.
```vim
tr -s ' -' |column -ts '|' -o '|'
```
```markdown
| File | Category |
|:----------------|:---------|
| calendar.md | tex |
| tex_packages.md | tex |
| completion.md | vim |
| csv_to_md.md | vim |
| format_md.md | vim |
```
# Keyboard Shortcut
Put this in your `~/.vimrc` to map 'Control + t' to reformat markdown tables in visual mode.
```vim
vmap <C-t> :!tr -s ' -' \|column -ts '\|' -o '\|'<Enter>j:s/ /-/g<Enter>k
```