Compare commits

..

No commits in common. "59fb0ada2473139affc600cbd2bce1e9c53e6bbc" and "415985d08ce2e5df81afbc9d5d3646d903793ac0" have entirely different histories.

86 changed files with 250 additions and 474 deletions

View File

@ -4,8 +4,6 @@ EDITOR ?= vi
FZF != command -v sk || command -v fzy || command -v fzf || \ FZF != command -v sk || command -v fzy || command -v fzf || \
{ echo install a fuzzy finder && exit 1 ;} { echo install a fuzzy finder && exit 1 ;}
spill_contents = sed -e '1,/---/d'
help: ## Print the help message help: ## Print the help message
@awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z._-]+:.*?## / {printf "\033[36m%s\033[0m : %s\n", $$1, $$2}' $(MAKEFILE_LIST) | \ @awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z._-]+:.*?## / {printf "\033[36m%s\033[0m : %s\n", $$1, $$2}' $(MAKEFILE_LIST) | \
sort | \ sort | \
@ -13,38 +11,31 @@ help: ## Print the help message
articles != find * -type f -name "*.md" articles != find * -type f -name "*.md"
dirs != ls -d */ categories != ls -d */
categories = $(patsubst %/, %, $(dirs))
databases = $(patsubst %, .dbs/%.rec, $(categories)) databases = $(patsubst %/, .dbs/%.rec, $(categories))
default += $(databases) default += $(databases)
$(foreach dir, $(categories), \ $(databases): .dbs/%.rec: %/ | .dbs/
$(eval .dbs/$(dir).rec: $(wildcard $(dir)/*)) \
)
$(databases): .dbs/%.rec: %/
$(info making $(@F)) $(info making $(@F))
@mkdir -p $(@D) mkdir -p $(@D)
for entry in $(shell find $< -type f -name "*.md") ; do \ for entry in $(shell find $< -type f -name "*.md") ; do \
sed -n '2,/^---$$/ {/^---$$/d; p}' "$$entry" |\ sed -n '2,/^---$$/ {/^---$$/d; p}' "$$entry" |\
sed -e 's/\[ //' -e 's/ \]//' |\ sed -e 's/\[ //' -e 's/ \]//' |\
tr -d '"' ;\ tr -d '"' ;\
printf "wordcount: %s\n" "$$(wc -w < $$entry)" ;\ printf "wordcount: %s\n" "$$(wc -w < $$entry)" ;\
printf "file: %s\n\n" "$$entry" ;\ printf "file: %s\n\n" "$$entry" ;\
done > $@ done >> $@
for entry in $(shell find $< -type f -name "*.md"); do \ for entry in $(shell find $< -type f -name "*.md"); do \
recset $@ -e "file = '$${entry}'" -f wordcount --set-add="$$(wc -w < $${entry})" ;\ recset $@ -e "file = '$${entry}'" -f wordcount --set-add="$$(wc -w < $${entry})" ;\
recset $@ -e "file = '$${entry}'" -f content --set-add="$$($(spill_contents) $${entry})" ;\
done done
db.rec: $(databases) db.rec: $(databases)
printf '%s\n' '%rec: guide' > $@ printf '%s\n' '%rec: guide' > $@
printf '%s\n' '%key: title' >> $@
printf '%s\n' '%type: wordcount int' >> $@ printf '%s\n' '%type: wordcount int' >> $@
printf '%s\n\n' '%sort: title' >> $@ printf '%s\n\n' '%sort: title' >> $@
recsel $^ >> $@ cat $^ >> $@
recsel $@ -e "requires != ''" -CR title,requires |\ recsel $@ -e "requires != ''" -CR title,requires |\
while read title requires; do \ while read title requires; do \
IFS=', ' && for provider in $$requires; do \ IFS=', ' && for provider in $$requires; do \
@ -71,7 +62,7 @@ article: ## Write an article
filename="$$(echo "$$title" | tr '[:upper:]' '[:lower:]' | tr ' ' '_')" ;\ filename="$$(echo "$$title" | tr '[:upper:]' '[:lower:]' | tr ' ' '_')" ;\
printf '%s\n' '---' >> $$path/$$filename.md ;\ printf '%s\n' '---' >> $$path/$$filename.md ;\
printf 'title: "%s"\n' "$$title" >> $$path/$$filename.md ;\ printf 'title: "%s"\n' "$$title" >> $$path/$$filename.md ;\
printf 'tags: [ "%s" ]\n' "$$path" | tr '[:upper:]' '[:lower:]' | sed 's#\/#", "#g' >> $$path/$$filename.md ;\ printf 'tags: [ "%s" ]\n' "$$path" | sed 's#\/#", "#g' >> $$path/$$filename.md ;\
printf '%s\n\n' '---' >> $$path/$$filename.md ;\ printf '%s\n\n' '---' >> $$path/$$filename.md ;\
$(EDITOR) +5 "$$path/$$filename.md" $(EDITOR) +5 "$$path/$$filename.md"

View File

@ -20,7 +20,6 @@ recsel db.rec -q gpg
recsel db.rec -e "title = 'ssh'" recsel db.rec -e "title = 'ssh'"
recsel db.rec -e "title ~ 'ssh'" recsel db.rec -e "title ~ 'ssh'"
recsel db.rec -e "title ~ 'bash'" -R title,wordcount recsel db.rec -e "title ~ 'bash'" -R title,wordcount
recsel db.rec -m 1 -P content | less -R
``` ```
# Style # Style

View File

@ -1,6 +1,6 @@
--- ---
title: "at" title: "at"
tags: [ "basics", "time" ] tags: [ "Basics", "time" ]
--- ---
Install with: Install with:

View File

@ -1,6 +1,6 @@
--- ---
title: "Basics" title: "Basics"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
You need about a dozen commands to move around Linux. You need about a dozen commands to move around Linux.

View File

@ -1,6 +1,6 @@
--- ---
title: "clock" title: "clock"
tags: [ "basics", "time" ] tags: [ "Basics", "time" ]
--- ---
Show system time: Show system time:

View File

@ -1,6 +1,6 @@
--- ---
title: "conditionals" title: "conditionals"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
# If statements # If statements

View File

@ -1,6 +1,6 @@
--- ---
title: "cron" title: "cron"
tags: [ "basics", "time" ] tags: [ "Basics", "time" ]
--- ---
# Cronie # Cronie

View File

@ -1,6 +1,6 @@
--- ---
title: "bash games" title: "bash games"
tags: [ "games" ] tags: [ "Games" ]
--- ---
Games are a great way to learn bash. Games are a great way to learn bash.

34
basics/kernel.md Normal file
View File

@ -0,0 +1,34 @@
---
title: "kernel"
tags: [ "Basics" ]
---
## Living Space
Kernel modules live in lib/modules/$(uname -r)
## Change
Load them with
```bash
sudo modprobe ath9k
```
Or remove one with
```bash
sudo modprove uvcvideo
```
The PC's irritating speaker beep can be really annoying. Disable it with:
```bash
sudo modprobe -r pcspeaker
```
Permanently disable a module by blacklisting it in `/etc/modprobe.d`:
```bash
echo 'blacklist pcspkr' > /etc/modprobe.d/*nobeep*.conf
```

View File

@ -1,6 +1,6 @@
--- ---
title: "kill" title: "kill"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
If you want to kill a program in a graphical environment, open a terminal and type: If you want to kill a program in a graphical environment, open a terminal and type:

View File

@ -1,6 +1,6 @@
--- ---
title: "locale" title: "locale"
tags: [ "basics", "time" ] tags: [ "Basics", "time" ]
--- ---
Your locale tells the computer your location, preferred time-and-date format, standard language, papersize, et c. Your locale tells the computer your location, preferred time-and-date format, standard language, papersize, et c.

View File

@ -1,6 +1,6 @@
--- ---
title: "locating" title: "locating"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
# Type # Type

View File

@ -1,6 +1,6 @@
--- ---
title: "processes" title: "processes"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
# Proccesses # Proccesses

View File

@ -1,6 +1,6 @@
--- ---
title: "time" title: "time"
tags: [ "basics", "time" ] tags: [ "Basics", "time" ]
--- ---
# systemd # systemd

View File

@ -1,6 +1,6 @@
--- ---
title: "users" title: "users"
tags: [ "basics" ] tags: [ "Basics" ]
--- ---
# Basic Information # Basic Information

View File

@ -1,6 +1,6 @@
--- ---
title: "profanity" title: "profanity"
tags: [ "chat", "omemo" ] tags: [ "Chat", "omemo" ]
--- ---
# Setup (Commands) # Setup (Commands)

View File

@ -1,6 +1,6 @@
--- ---
title: "wgetpaste" title: "wgetpaste"
tags: [ "chat" ] tags: [ "Chat" ]
--- ---
See available pastebins: See available pastebins:

View File

@ -1,6 +1,6 @@
--- ---
title: "unison" title: "unison"
tags: [ "backups", "synch" ] tags: [ "Backups", "synch" ]
--- ---
Install unison on both machines, and make sure both have the same version of unison, with the same version of the ocaml compiler (the smallest difference will cause problems). Install unison on both machines, and make sure both have the same version of unison, with the same version of the ocaml compiler (the smallest difference will cause problems).

View File

@ -1,6 +1,6 @@
--- ---
title: "Base 16" title: "Base 16"
tags: [ "data" ] tags: [ "Data" ]
--- ---
```bash ```bash

View File

@ -5,10 +5,5 @@ tags: [ "data", "calendar", "daylight savings" ]
## Setup ## Setup
The UK government keeps an `ics` file with clock. The UK government keeps an ics file with clock, [here](https://www.gov.uk/when-do-the-clocks-change/united-kingdom.ics).
```sh
wget https://www.gov.uk/when-do-the-clocks-change/united-kingdom.ics
calcurse -i united-kingdom.ics
```

View File

@ -9,10 +9,10 @@ Install `opensmtpd` (or similar), then `ncat` or `nc` or `netcat` (this mysterio
Start the `opensmtpd` service, then use netcat to speak with the mail-daemon: Start the `opensmtpd` service, then use netcat to speak with the mail-daemon:
```sh
```
nc localhost 25 nc localhost 25
``` ```
The computer should respond with code `220`, which means 'I am listening'. The computer should respond with code `220`, which means 'I am listening'.
> 220 hex ESMTP OpenSMTPD > 220 hex ESMTP OpenSMTPD
@ -40,7 +40,7 @@ Tell the mail daemon who you are in this format.
Then tell it who you're sending to. Then tell it who you're sending to.
```sh ```
RCPT TO: <www@dmz.rs> RCPT TO: <www@dmz.rs>
``` ```
@ -67,7 +67,7 @@ You will find the email under `/var/spool` or `/var/mail` or similar.
If unsure, just take a part of your email, like `FRAGMENT="turn off server please"`, then `grep` for it: If unsure, just take a part of your email, like `FRAGMENT="turn off server please"`, then `grep` for it:
```sh ```bash
sudo grep -r $FRAGMENT /var/spool/* sudo grep -r $FRAGMENT /var/spool/*
``` ```

View File

@ -1,17 +1,17 @@
--- ---
title: "exiftool" title: "exiftool"
tags: [ "metadata", "exifdata" ] tags: [ "Metadata" ]
--- ---
Find metadata: Find metadata.
```sh ```bash
exiftool "$file".jpg exiftool image.jpg
``` ```
Find info on all `.png` images in current directory. Find info on all images in current directory.
```sh ```bash
exiftool -ext .png . exiftool -ext .png .
``` ```
@ -19,14 +19,22 @@ You can make this recurring with the -r switch.
And overwrite all metadata: And overwrite all metadata:
```sh ```bash
exiftool -all= -overwrite_original -ext jpg . exiftool -all= -overwrite_original -ext jpg .
``` ```
(NB: This does not work on pdf data. See [here](pdf_erasure.md) for erasing all pdf data) (NB: This does not work on pdf data. See [here](pdf_erasure.md) for erasing all pdf data)
Or just GPS data: Or just GPS data:
```sh ```bash
exiftool -gps:all= *.jpg exiftool -gps:all= *.jpg
``` ```
You can also use the imagemagick tool:
```bash
identify -verbose
```

View File

@ -1,72 +1,24 @@
--- ---
title: "git-lfs" title: "git-lfs"
tags: [ "data", "git" ] tags: [ "data" ]
--- ---
Git Large File Storage ('LFS') needs to change your `~/.gitconfig` to check out those binary files: Install, and add with
```sh ```bash
cat ~/.gitconfig
git lfs install git lfs install
cat ~/.gitconfig
``` ```
Then track some filetypes with: Then track some filetype with:
```sh ```bash
cd $git_repository git lfs track "\*.ttf"
ext=ttf
git lfs track "*.$ext"
``` ```
Or a directory with: Or a directory with:
```sh ```bash
git lfs track "images/" git lfs track "images/"
``` ```
Track the changes to `.gitattributes`: All changes require adding `.gitattributes`.
```sh
git status
git add .gitattributes
git commit -m "add $ext to lfs"
```
## Bash Completion
If bash completion does not work, you'll have to add it:
```sh
git lfs completion bash | sudo tee /usr/share/bash-completion/completions/git-lfs
```
## Trouble Shooting
You have some file "$FILE".png, which has some problem.
Check the filetype:
```sh
file "$FILE".png
```
This should say the type is 'image'.
If it says the type is 'text', then this file is really just a reminder to `git-lfs` to check out that file.
Check `git-lfs` is expecting that file:
```sh
git lfs status
git lfs ls-files
```
...then try these commands, and check the filetype again:
```sh
git lfs fetch --all
git lfs fsck
git lfs checkout
git lfs status
```

View File

@ -1,5 +1,5 @@
--- ---
title: "git subtree" title: "git"
tags: [ "data", "git", "subtree" ] tags: [ "data", "git", "subtree" ]
--- ---

View File

@ -1,6 +1,6 @@
--- ---
title: "gpg" title: "gpg"
tags: [ "data", "gpg" ] tags: [ "data", "GPG" ]
--- ---
- [Setup](gpg/basics.md) - [Setup](gpg/basics.md)

View File

@ -1,5 +1,5 @@
--- ---
title: "gpg with vim" title: "gpg"
tags: [ "vim", "data", "GPG" ] tags: [ "vim", "data", "GPG" ]
requires: [ "GPG Basics", "vim basics" ] requires: [ "GPG Basics", "vim basics" ]
--- ---

View File

@ -1,6 +1,6 @@
--- ---
title: "groff" title: "groff"
tags: [ "data", "logic" ] tags: [ "Data" ]
--- ---
# Basic Documents # Basic Documents

View File

@ -1,52 +1,60 @@
--- ---
title: "khard" title: "khard"
tags: [ "data" ] tags: [ "Data" ]
--- ---
Get the basic config: Get the basic config:
```sh ```bash
mkdir ~/.config/khard mkdir ~/.config/khard
``` ```
```sh ```bash
cp /usr/share/doc/khard/examples/khard/khard.conf.example ~/.config/khard.conf cp /usr/share/doc/khard/examples/khard/khard.conf.example ~/.config/khard.conf
``` ```
Short list Short list
```sh ```bash
khard list khard list
``` ```
Longer list Longer list
```sh ```bash
khard show khard show
``` ```
Show from addressbook 'work' Show from addressbook 'work'
```sh ```bash
khard list -a work khard list -a work
``` ```
Make a new contact in address book 'family' Make a new contact in address book 'family'
```sh ```bash
khard new -a family khard new -a family
``` ```
```sh ```bash
khard edit grampa khard edit grampa
``` ```
```sh ```bash
khard remove bob khard remove bob
``` ```
Move contact 'nina' from 'work' to 'home' address book. Move contact 'nina' from 'work' to 'home' address book.
```sh ```bash
khard move -a home nina -A work khard move -a home nina -A work
``` ```
## Advanced
Merge:
```bash
khard merge [-a source_abook] [-u uid|search terms [search terms ...]] [-A target_abook] [-U target_uid|-t target_search_terms]
```

View File

@ -1,42 +1,42 @@
--- ---
title: "pass" title: "pass"
tags: [ "data" ] tags: [ "data" ]
requires: "GPG Basics"
--- ---
[Video instructions](https://www.hooktube.com/watch?v=hlRQTj1D9LA)
Setup [gpg](./gpg.md) keys. Setup [gpg](./gpg.md) keys.
Show your gpg secret it: Show your gpg secret it:
```sh ```bash
gpg --list-secret-keys gpg --list-secret-keys
``` ```
Then use the id number under `sec` to make a pass repo: Then use the id number under `sec` to make a pass repo:
```sh ```bash
KEY="$(gpg --list-secret-keys | grep -m 1 -A1 '^sec' | tail -n 1)" KEY="$(gpg --list-secret-keys | grep -m 1 -A1 '^sec' | tail -n 1)"
``` ```
```sh ```bash
pass init $KEY pass init $KEY
``` ```
To add a basic password, e.g. for `$WEBSITE`: To add a basic password, e.g. for `$WEBSITE`:
```sh ```bash
pass $WEBSITE pass $WEBSITE
``` ```
To insert a multiline password, e.g. with a login name: To insert a multiline password, e.g. with a login name:
```sh ```bash
pass add -m $WEBSITE pass add -m $WEBSITE
``` ```
Remove a password: Remove a password:
```sh ```bash
pass rm $WEBSITE pass rm $WEBSITE
``` ```

View File

@ -2,8 +2,7 @@
title: "pdf to txt" title: "pdf to txt"
tags: [ "data", "pdf", "ocr" ] tags: [ "data", "pdf", "ocr" ]
--- ---
How to translate pdf book images to text (results are very poor, and will need lots of corrections).
How to translate pdfs to text (results are very poor, and will need lots of corrections).
## Dependencies ## Dependencies
@ -18,8 +17,8 @@ pdftoppm -png *file*.pdf test
``` ```
```bash ```bash
for x in *png; do for x in \*png; do
tesseract -l eng "$x" - >> out.txt tesseract -l eng "$x" - >> *out*.txt
done done
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "PDF Metadata Erasure" title: "PDF Metadata Erasure"
tags: [ "metadata", "ghost script", "gs", ".pdf" ] tags: [ "Metadata", "Ghost Script", "gs", ".pdf" ]
--- ---
You cannot erase pdf metadata with `exiftool` (it only *appends* your changes). You cannot erase pdf metadata with `exiftool` (it only *appends* your changes).

View File

@ -44,9 +44,6 @@ recset -f "$new_field" --delete $database
- [Extended example](recfiles/extended.md) - [Extended example](recfiles/extended.md)
- [Playing with board games data](recfiles/Board_Games.md) - [Playing with board games data](recfiles/Board_Games.md)
- [Playing with IP addresses](recfiles/IP_ASN.md)
- [Manage LaTeX Bibliographies](recfiles/bibliography.md)
- [Fixes](recfiles/recfixes.md)
# Resources # Resources

View File

@ -1,16 +0,0 @@
---
title: "IP Addresses with Recfiles"
tags: [ "data", "recfiles", "games" ]
requires: "Recfiles"
---
## Download the Database
Download the csv data, and separate the ipv4 data from the ipv6.
```sh
curl -Lo ips.zip 'https://www.kaggle.com/api/v1/datasets/download/ipinfo/ipinfo-country-asn'
unzip -p ips.zip country_asn.csv | csv2rec | recsel -e "start_ip ~ '\.'" > ipv4.rec
unzip -p ips.zip country_asn.csv | csv2rec | recsel -e "start_ip ~ '::'" > ipv6.rec
```

View File

@ -1,121 +0,0 @@
---
title: "Recfile Bibliography for TeX"
tags: [ "data", "database", "recfiles", "tex" ]
requires: [ "Recfiles", "TeX", "Makefile" ]
---
Store your bibliography in a `recfile` database, then extract any part with `make`.
For example, you could store books like this in `bibliography.rec`:
```recfile
%rec: book
%key: slug
slug: thinkingexperience
author: H. H. Price
title: Thinking and Experience
year: 1953
publisher: Harvard University Press, Cambridge
slug: inventingrightwrong
author: John Leslie Mackie
title: Inventing Right and Wrong
year: 1997
publisher: Penguin Books, England
```
Run `make book` to extract `book.bib`, ready for LaTeX to use:
```bib
@book{thinkingexperience,
author = {H. H. Price},
title = {Thinking and Experience},
year = {1953},
publisher = {Harvard University Press, Cambridge},
}
@book{inventingrightwrong,
author = {John Leslie Mackie},
title = {Inventing Right and Wrong},
year = {1997},
publisher = {Penguin Books, England},
}
```
The `makefile` syntax is just a few lines (though admittedly employs some garbled shell-crud):
```make
bibs != grep -Po '%rec: \K.*' bibliography.rec
bibfiles = $(patsubst %, %.bib, $(bibs))
$(bibfiles): %.bib: bibliography.rec
recsel $< -t $(basename $@) |\
sed 's/slug: \(.*\)/@$(basename $@){\1,/g' |\
sed 's/^\(\b.*\b\): \(.*\)/ \1 = {\2},/gI' |\
sed 's/^$$/}\n/g' > $@
echo '}' >> $@
```
Here's a longer `bibliography.rec` file, which can also produce `article.bib`:
```recfile
%rec: book
%key: slug
%type: year int
%constraint: year > -2000
%sort: year month
slug: thinkingexperience
author: H. H. Price
title: Thinking and Experience
year: 1953
publisher: Harvard University Press, Cambridge
slug: inventingrightwrong
author: John Leslie Mackie
title: Inventing Right and Wrong
year: 1997
publisher: Penguin Books, England
slug: metaphysicscontemporaryintro
author: Michael J. Loux
title: Metaphysics: A Contemporary Introduction
year: 1998
publisher: Routledge, London
slug: pluralityworlds
author: David Lewis
title: On the Plurality of Worlds
publisher: Blackwell Publishing, Oxford
year: 2001
%rec: article
%key: slug
%sort: year month
slug: genuinerealisttheory
author: John Divers
title: A Genuine Realist Theory of Advanced Modalizing
year: 1999
pages: 217240
month: april
journaltitle: Mind
uri: https://academic.oup.com/mind/article-abstract/108/430/217/975258?redirectedFrom=fulltext
volume: 108
publisher: Harvard University Press, Cambridge
slug: twokindsmentalrealism
author: Tam\'{a}s Demeter
title: Two Kinds of Mental Realism
year: 2009
pages: 40:59-71
uri: https://www.researchgate.net/profile/Tamas_Demeter2/publication/41554923_Two_Kinds_of_Mental_Realism/links/0deec53247f5a4ae21000000.pdf
month: august
journaltitle: Journal for General Philosophy of Science
volume: 30
publisher: Harvard University Press, Cambridge
```

View File

@ -1,33 +0,0 @@
---
title: "Recfixes"
tags: [ "data", "recfiles" ]
requires: "Recfiles"
---
Sometimes `recsel` chokes on a large query, and you need to break the query into chunks with a pipe.
This Kickstarter file has 374,853 records.
Here's the chonky query:
```sh
recsel kick.rec -e "Category = 'Games'" -p "Subcategory,Avg(Goal)" -G Subcategory
```
It breaks down like this:
| Chunk | Meaning |
|:-----------------------------:|:---------------------------------------------:|
| `recsel kick.rec` | Select records from `kick.rec` |
| `-e "Category = 'Games'"` | Select only records where Category = 'Games' |
| `-p "Subcategory,Avg(Goal)"` | Print the Subcategory and average goal |
| `-G "Subcategory"` | Group by subcategory |
Two ways to break the query apart:
```sh
recsel kick.rec -e "Category = 'Games'" | recsel -p "Subcategory,Avg(Goal)" -G "Subcategory"
recsel kick.rec -e "Category = 'Games'" > games.rec
recsel games.rec -p "Subcategory" -G "Subcategory"
```

View File

@ -1,6 +1,6 @@
--- ---
title: "task" title: "task"
tags: [ "organization" ] tags: [ "Organization" ]
--- ---
Set up the configuration file: Set up the configuration file:

View File

@ -1,6 +1,6 @@
--- ---
title: "timewarrior" title: "timewarrior"
tags: [ "data", "tracking", "time", "timew" ] tags: [ "Data", "tracking", "time", "timew" ]
--- ---
# Summaries # Summaries

View File

@ -1,6 +1,6 @@
--- ---
title: "autologin" title: "autologin"
tags: [ "distros", "arch" ] tags: [ "Distros", "Arch" ]
--- ---
# Automatic Login # Automatic Login

View File

@ -1,6 +1,6 @@
--- ---
title: "Ach Linux GPU Setup" title: "fonts"
tags: [ "arch", "GPU" ] tags: [ "distros" ]
--- ---
# Step 1: Multilib # Step 1: Multilib
@ -60,3 +60,4 @@ You should see 'true' here.
```bash ```bash
sudo pacman -S --needed lib32-mesa vulkan-radeon lib32-vulkan-radeon vulkan-icd-loader lib32-vulkan-icd-loader xf86-video-amdgpu sudo pacman -S --needed lib32-mesa vulkan-radeon lib32-vulkan-radeon vulkan-icd-loader lib32-vulkan-icd-loader xf86-video-amdgpu
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "Aeroplane Mode in Void" title: "Aeroplane Mode in Void"
tags: [ "void" ] tags: [ "Void" ]
--- ---
Put your device in 'aeroplane' mode (e.g. where no trace of signal leaves it) by turning off Wi-Fi and blue-tooth. Put your device in 'aeroplane' mode (e.g. where no trace of signal leaves it) by turning off Wi-Fi and blue-tooth.
@ -9,7 +9,7 @@ su root
sv stop wpa_supplicant bluetoothd sv stop wpa_supplicant bluetoothd
``` ```
Find your device's name with `ip -color addr`. Find your device's name with `ip a`.
If unsure, try this: If unsure, try this:
```sh ```sh

View File

@ -1,6 +1,6 @@
--- ---
title: "Void Autologin" title: "Void Autologin"
tags: [ "void" ] tags: [ "Void" ]
--- ---
Make the autologin service: Make the autologin service:

View File

@ -1,6 +1,6 @@
--- ---
title: "extrace" title: "extrace"
tags: [ "void" ] tags: [ "Void" ]
--- ---
Monitor all processes: Monitor all processes:

View File

@ -1,6 +1,6 @@
--- ---
title: "sv" title: "sv"
tags: [ "void" ] tags: [ "Void" ]
--- ---
# List Services # List Services

View File

@ -1,6 +1,6 @@
--- ---
title: "Void Linux Basics" title: "Void Linux Basics"
tags: [ "void" ] tags: [ "Void" ]
--- ---
# Updates # Updates

View File

@ -1,6 +1,6 @@
--- ---
title: "xbps" title: "xbps"
tags: [ "void" ] tags: [ "Void" ]
--- ---
## Search ## Search

View File

@ -9,7 +9,7 @@ This works everywhere, including in a bare-ass tty.
Select a keymap, and create a new custom map. Select a keymap, and create a new custom map.
```sh ```bash
su root su root
basemap=/usr/share/kbd/keymaps/i386/qwerty/pl1.map.gz basemap=/usr/share/kbd/keymaps/i386/qwerty/pl1.map.gz
@ -22,7 +22,7 @@ gunzip -c $basemap | \
Tell the system to use this keymap at startup by naming it in the `rc.conf` file: Tell the system to use this keymap at startup by naming it in the `rc.conf` file:
```sh ```bash
echo "KEYMAP=$newmap" >> /etc/rc.conf echo "KEYMAP=$newmap" >> /etc/rc.conf
cat /etc/rc.conf cat /etc/rc.conf
@ -33,24 +33,24 @@ reboot
Set layout to British English. Set layout to British English.
```sh ```bash
setxkbmap -layout gb setxkbmap -layout gb
``` ```
Or Polish with: Or Polish with:
```sh ```bash
setxkbmap -layout pl setxkbmap -layout pl
``` ```
| Language | short | | Language | short |
|:---------|:------| |:--------|:------|
| Polish | `pl` | | Polish | pl |
| Serbian | `rs` | | Serbian | rs |
Set 'alt + shift', as the command which cycles through the British English, Polish and Serbian keyboard layout. Set 'alt + shift', as the command which cycles through the British English, Polish and Serbian keyboard layout.
```sh ```bash
setxkbmap -layout gb,pl,rs -option grp:alt_shift_toggle setxkbmap -layout gb,pl,rs -option grp:alt_shift_toggle
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "fail2ban" title: "fail2ban"
tags: [ "networking" ] tags: [ "Networking" ]
requires: [ "ssh" ] requires: [ "ssh" ]
--- ---
# SSH Daemon Jail # SSH Daemon Jail

View File

@ -1,6 +1,6 @@
--- ---
title: "Easy Network Graph" title: "Easy Network Graph"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
Set up a file like this, called `troubleshooting.txt`. Set up a file like this, called `troubleshooting.txt`.

View File

@ -1,6 +1,6 @@
--- ---
title: "iptables" title: "iptables"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
# Intro # Intro

View File

@ -1,6 +1,6 @@
--- ---
title: "nmap" title: "nmap"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
Example: Example:

View File

@ -1,6 +1,6 @@
--- ---
title: "pi-hole-server" title: "pi-hole-server"
tags: [ "distros" ] tags: [ "Distros" ]
--- ---
# Installation # Installation

View File

@ -1,6 +1,6 @@
--- ---
title: "rclone" title: "rclone"
tags: [ "networking", "synch" ] tags: [ "Networking" ]
--- ---
The manpage's 'Synopsis' provides a fast reference. The manpage's 'Synopsis' provides a fast reference.
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "Download videos" title: "Download videos"
tags: [ "scraping" ] tags: [ "Scraping" ]
--- ---
Install `yt-dlp`. Install `yt-dlp`.

View File

@ -1,6 +1,6 @@
--- ---
title: "Agate on Arch Linux" title: "Agate on Arch Linux"
tags: [ "networking", "arch", "gemini" ] tags: [ "Networking", "Arch", "Gemini" ]
--- ---
Docs are [here](https://github.com/mbrubeck/agate). Docs are [here](https://github.com/mbrubeck/agate).

View File

@ -7,7 +7,7 @@ tags: [ "networking" ]
Try out basic ssh by accessing `git.charm.sh`, without needing authentication: Try out basic ssh by accessing `git.charm.sh`, without needing authentication:
```sh ```bash
ssh git.charm.sh ssh git.charm.sh
``` ```
@ -16,32 +16,32 @@ The ssh server is sometimes in a package called `openssh`, and sometimes only in
Once it's installed, check it's working: Once it's installed, check it's working:
```sh ```bash
sudo systemctl status ssh sudo systemctl status ssh
``` ```
If that doesn't work, the service may be called `sshd`. If that doesn't work, the service may be called `sshd`.
```sh ```bash
sudo systemctl status sshd sudo systemctl status sshd
``` ```
Then start that service: Then start that service:
```sh ```bash
sudo systemctl start sshd sudo systemctl start sshd
``` ```
Test it works by using ssh into your own system, from inside: Test it works by using ssh into your own system, from inside:
```sh ```bash
ssh $USER@localhost ssh $USER@localhost
``` ```
Access the computer from another computer on the same local network by finding your computer's IP address. Access the computer from another computer on the same local network by finding your computer's IP address.
```sh ```bash
ip address | grep inet ip address | grep inet
``` ```
@ -56,24 +56,24 @@ Here is mine:
The first one starts `127`, which means it returns back to that computer (like `localhost`). The first one starts `127`, which means it returns back to that computer (like `localhost`).
The second is an ipv6 address, which is too angelic for this world, and has yet to descend. The second is an ipv6 address, which is too angelic for this world, and has yet to ascend.
The third will work from a remote computer. The third will work from a remote computer.
```sh ```bash
ssh $USERNAME@IP_ADDRESS ssh $USERNAME@IP_ADDRESS
``` ```
Once you have that, generate some ssh keys: Once you have that, generate some ssh keys:
```sh ```bash
ssh-keygen ssh-keygen
``` ```
Look at your keys: Look at your keys:
```sh ```bash
ls ~/.ssh ls ~/.ssh
``` ```
@ -82,7 +82,7 @@ The other is secret.
Now send those keys to a remote computer: Now send those keys to a remote computer:
```sh ```bash
ssh-copy-id $USERNAME@IP_ADDRESS ssh-copy-id $USERNAME@IP_ADDRESS
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "sshfs" title: "sshfs"
tags: [ "networking" ] tags: [ "Networking" ]
requires: [ "ssh" ] requires: [ "ssh" ]
--- ---
# Mount # Mount

View File

@ -1,6 +1,6 @@
--- ---
title: "ssh-tricks" title: "ssh-tricks"
tags: [ "networking", "ssh", "tricks" ] tags: [ "Networking", "ssh", "tricks" ]
requires: [ "ssh" ] requires: [ "ssh" ]
--- ---

View File

@ -1,6 +1,6 @@
--- ---
title: "tor" title: "tor"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
# Get a hostname # Get a hostname

View File

@ -1,6 +1,6 @@
--- ---
title: "transmission" title: "transmission"
tags: [ "networking", "torrenting" ] tags: [ "Networking", "Torrenting" ]
--- ---
# Torrench # Torrench

View File

@ -1,11 +1,11 @@
--- ---
title: "troubleshooting" title: "troubleshooting"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
# Do you have an IP? # Do you have an IP?
If not, try checking out what your local networking interfaces are, then check if they have been picked up: If not, try checking out what your local Networking interfaces are, then check if they have been picked up:
```bash ```bash
dmesg | grep eth0 dmesg | grep eth0

View File

@ -1,6 +1,6 @@
--- ---
title: "nginx" title: "nginx"
tags: [ "networking", "web" ] tags: [ "Networking" ]
--- ---
Install nginx: Install nginx:

View File

@ -1,8 +1,7 @@
--- ---
title: "network" title: "wifi"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
# Netstat Stuff # Netstat Stuff
Stats on local net usage within domain. Stats on local net usage within domain.

View File

@ -1,6 +1,6 @@
--- ---
title: "wireguard" title: "wireguard"
tags: [ "networking", "VPN" ] tags: [ "Networking", "VPN" ]
--- ---
<!-- <!--
from from
@ -11,22 +11,25 @@ https://engineerworkshop.com/blog/how-to-set-up-wireguard-on-a-raspberry-pi/
Install `wireguard-tools` on the server. Install `wireguard-tools` on the server.
```sh ```bash
su root sudo -i
```
```bash
cd /etc/wireguard cd /etc/wireguard
``` ```
umask 077 umask 077
```sh ```bash
wg genkey | tee server_private_key | wg pubkey > server_public_key wg genkey | tee server_private_key | wg pubkey > server_public_key
``` ```
```sh ```bash
wg genkey | tee client_private_key | wg pubkey > client_public_key wg genkey | tee client_private_key | wg pubkey > client_public_key
``` ```
```sh ```bash
echo " echo "
[Interface] [Interface]
Address = 10.0.0.1/24 Address = 10.0.0.1/24
@ -43,20 +46,20 @@ wg genkey | tee client_private_key | wg pubkey > client_public_key
" > /etc/wireguard/wg0.conf " > /etc/wireguard/wg0.conf
``` ```
```sh ```bash
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/wg.conf echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/wg.conf
``` ```
```sh ```bash
systemctl enable --now wg-quiqck@wg0 systemctl enable --now wg-quiqck@wg0
``` ```
```sh ```bash
chown -R root:root /etc/wireguard/ chown -R root:root /etc/wireguard/
``` ```
```sh ```bash
chmod -R og-rwx /etc/wireguard/* chmod -R og-rwx /etc/wireguard/\*
``` ```
Forward traffic from port 51900 to the server. Forward traffic from port 51900 to the server.
@ -69,25 +72,21 @@ Install `wireguard-tools` on the client.
Copy the client private key and server public key to the server (or just fill in the variables). Copy the client private key and server public key to the server (or just fill in the variables).
> server_ip=*your server's public ip*
```sh echo "
server_ip=$PUBLIC_IP [Interface]
Address = 10.0.0.2/32
PrivateKey = $(cat client_private_key)
DNS = 9.9.9.9
[Peer]
PublicKey = $(cat server_public_key)
Endpoint = $(echo $server_ip:51900)
AllowedIPs = 0.0.0.0/0, ::/0
" > /etc/wireguard/wg0-client.conf
echo " > wg-quick up wg0-client
[Interface]
Address = 10.0.0.2/32
PrivateKey = $(cat client_private_key)
DNS = 9.9.9.9
[Peer]
PublicKey = $(cat server_public_key)
Endpoint = $(echo $server_ip:51900)
AllowedIPs = 0.0.0.0/0, ::/0
" > /etc/wireguard/wg0-client.conf
wg-quick up wg0-client
```
## Extras ## Extras
@ -99,6 +98,6 @@ Add multiple peers by copying the `[peer]` section (they each get called `peer`)
Make a standard client configuration, then: Make a standard client configuration, then:
```sh ```bash
qrencode -t ansiutf8 < /etc/wireguard/mobile_user.conf qrencode -t ansiutf8 < /etc/wireguard/mobile_user.conf
``` ```

View File

@ -1,63 +1,60 @@
--- ---
title: "wireless" title: "wireless"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
Check wifi's working # Check wifi's working
```bash
```sh
lspci -k lspci -k
``` ```
Or for usb wifi: Or for usb wifi:
```sh ```bash
dmesg | grep usbcore dmesg | grep usbcore
``` ```
...and hopefully it'll say the new interface is registered. ... and hopefully it'll say the new interface is registered.
Check if a wifi interface has been created # Check if a wifi interface has been created
```sh ```bash
ip link ip link
``` ```
...or or
```sh ```bash
iw dev iw dev
``` ```
Assuming it's wlan0, bring it up with Assuming it's wlan0, bring it up with
```sh ```bash
ip link set wlan0 up ip link set wlan0 up
``` ```
Error messages probably means your wireless chipset requires a firmware to function. In this case, check the kernel messages for firmware being loaded Error messages probably means your wireless chipset requires a firmware to function. In this case, check the kernel messages for firmware being loaded
```sh ```bash
dmesg | grep firmware dmesg | grep firmware
``` ```
# Utilities # Utilities
- `iw` doesn't do wpa/wpa2. iw doesn't do wpa/wpa2. wpa_supplicant does everything. iwd does everything except WEXT encryption.
- `iwd` does everything except WEXT encryption.
- `wpa_supplicant` does everything.
# Connecting # Connecting
Get the link status: Get the link status:
```sh ```bash
iw dev wlan0 link iw dev wlan0 link
``` ```
Scan for available points: Scan for available points:
```sh ```bash
iw dev wlan0 scan iw dev wlan0 scan
``` ```

View File

@ -1,57 +1,57 @@
--- ---
title: "wpa_supplicant" title: "wpa_supplicant"
tags: [ "networking" ] tags: [ "Networking" ]
--- ---
`wpa_supplicant` configurations are stored in `/etc/wpa_supplicant/wpa_supplicant-wlan0` (or equivalent). wpa_supplicant configurations are stored in /etc/wpa_supplicant/wpa_supplicant-wlan0 (or equivalent).
## WiFi Connection ## WiFi Connection
```sh ```bash
wpa_cli wpa_cli
``` ```
Once in, scan the network, add an empty place to store credentials, then input them. Once in, scan the network, add an empty place to store credentials, then input them.
```sh ```bash
scan scan
``` ```
```sh ```bash
scan_results scan_results
``` ```
```sh ```bash
add_network add_network
``` ```
This outputs a network number, e.g. '3'. This is the new network you'll work with. This outputs a network number, e.g. '3'. This is the new network you'll work with.
```sh ```bash
set_network *3* ssid *"Kosachok Cafe"* set_network *3* ssid *"Kosachok Cafe"*
``` ```
```sh ```bash
set_network 3 psk *"Kosachok2019"* set_network 3 psk *"Kosachok2019"*
``` ```
OR (for no password) OR (for no password)
```sh ```bash
set_network *3* key_mgmt NONE set_network *3* key_mgmt NONE
``` ```
```sh ```bash
enable_network 3 enable_network 3
``` ```
```sh ```bash
save_config save_config
``` ```
This takes a while to connect, so to speed things up, restart the service: This takes a while to connect, so to speed things up, restart the service:
```sh ```bash
sudo sv restart wpa_supplicant sudo sv restart wpa_supplicant
``` ```
@ -59,13 +59,13 @@ sudo sv restart wpa_supplicant
You can script like this: You can script like this:
```sh ```bash
wpa_cli add_network wpa_cli add_network
``` ```
That returns an ID, so you can say: That returns an ID, so you can say:
```sh ```bash
newNetwork="$(wpa_cli add_network)" newNetwork="$(wpa_cli add_network)"
``` ```
@ -73,19 +73,19 @@ Then `$newNetwork` would equal that number, and you can add/ remove networks wit
But remember to escape the quotes, so adding a network would be: But remember to escape the quotes, so adding a network would be:
```sh ```bash
wpa_cli set_network *3* psk *\""passphrase"\"* wpa_cli set_network *3* psk *\""passphrase"\"*
``` ```
## Generating Keys Manually ## Generating Keys Manually
```sh ```bash
wpa_passphrase [ssid] [password] wpa_passphrase [ssid] [password]
``` ```
For example: For example:
```sh ```bash
wpa_passphrase 'Cafe Kosachok' 'Kosachok2019' wpa_passphrase 'Cafe Kosachok' 'Kosachok2019'
``` ```
@ -95,11 +95,8 @@ If you encounter problems, you will probably need to delete the old device pid i
Next up, start wpa_supplicant: Next up, start wpa_supplicant:
```sh ```bash
wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant-wlan0 wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant-wlan0
``` ```
The `-B` flag runs this as a background process. The -B flag runs this as a background process. Remove this to see real-time output in order to solve problems. The -i flag denotes the physical device used for the wifi. The -c flag points to the configuration file for use.
Remove this to see real-time output in order to solve problems.
The `-i` flag denotes the physical device used for the wifi.
The `-c` flag points to the configuration file for use.

View File

@ -1,6 +1,6 @@
--- ---
title: "Basic Sound" title: "Basic Sound"
tags: [ "sound" ] tags: [ "Sound" ]
--- ---
# Pulse # Pulse

View File

@ -1,6 +1,6 @@
--- ---
title: "festival" title: "festival"
tags: [ "sound" ] tags: [ "Sound" ]
--- ---
# Basics # Basics

View File

@ -1,6 +1,6 @@
--- ---
title: "mpd" title: "mpd"
tags: [ "sound" ] tags: [ "Sound" ]
--- ---
# Setup # Setup

View File

@ -1,6 +1,6 @@
--- ---
title: "ncmpcpp" title: "ncmpcpp"
tags: [ "sound" ] tags: [ "Sound" ]
--- ---
# Music Player Daemon # Music Player Daemon

View File

@ -1,5 +1,5 @@
--- ---
title: "make help target" title: "Makefiles"
tags: [ "system", "make", "help" ] tags: [ "system", "make", "help" ]
--- ---
@ -7,13 +7,11 @@ Make your first target 'help' to give an overview of the main targets.
Running `make help` will search for text which starts with `## ` and show what that target does. Running `make help` will search for text which starts with `## ` and show what that target does.
```make ```make
.PHONY: help
help: ## Print the help message help: ## Print the help message
@awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z._-]+:.*?## / {printf "\033[36m%s\033[0m : %s\n", $$1, $$2}' $(MAKEFILE_LIST) | \ @awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z._-]+:.*?## / {printf "\033[36m%s\033[0m : %s\n", $$1, $$2}' $(MAKEFILE_LIST) | \
sort | \ sort | \
column -s ':' -t column -s ':' -t
.PHONY: clean
clean: ## Remove generated files clean: ## Remove generated files
$(RM) $(defaults) $(RM) $(defaults)
``` ```

View File

@ -1,6 +1,6 @@
--- ---
title: "android" title: "android"
tags: [ "system", "phone" ] tags: [ "System", "phone" ]
--- ---
# mtpfs # mtpfs

View File

@ -1,6 +1,6 @@
--- ---
title: "awk" title: "awk"
tags: [ "system", ".csv" ] tags: [ "System", ".csv" ]
--- ---
# Basics # Basics

View File

@ -1,6 +1,6 @@
--- ---
title: "bash tips" title: "bash tips"
tags: [ "shell", "POSIX" ] tags: [ "Shell", "POSIX" ]
--- ---
## Track Live Changes ## Track Live Changes

View File

@ -1,6 +1,6 @@
--- ---
title: "character-encoding" title: "character-encoding"
tags: [ "system", "encoding" ] tags: [ "System", "encoding" ]
--- ---
Convert a text file from one encoding type to another with: Convert a text file from one encoding type to another with:

View File

@ -1,6 +1,6 @@
--- ---
title: "Default Programs" title: "Default Programs"
tags: [ "defaults", "mime type" ] tags: [ "Defaults", "Mime Type" ]
--- ---
Install the package `xdg-utils`, then make very liberal use of the tab button. Install the package `xdg-utils`, then make very liberal use of the tab button.

View File

@ -1,36 +1,8 @@
--- ---
title: "kernel modules" title: "kernel"
tags: [ "system" ] tags: [ "system" ]
--- ---
Kernel modules live in lib/modules/$(uname -r)
## Change
Load them with
```sh
modprobe ath9k
```
Or remove one with
```sh
modprove uvcvideo
```
The PC's irritating speaker beep can be really annoying. Disable it with:
```sh
modprobe -r pcspeaker
```
Permanently disable a module by blacklisting it in `/etc/modprobe.d`:
```sh
echo 'blacklist pcspkr' > /etc/modprobe.d/*nobeep*.conf
```
Check which kernel modules are loaded into memory: Check which kernel modules are loaded into memory:
```sh ```sh

View File

@ -1,6 +1,6 @@
--- ---
title: "lf - The Light File Manager" title: "lf - The Light File Manager"
tags: [ "file browser", "TUI" ] tags: [ "File Browser", "TUI" ]
--- ---
## Config File ## Config File

View File

@ -1,6 +1,6 @@
--- ---
title: "logs" title: "logs"
tags: [ "system" ] tags: [ "System" ]
--- ---
# Basic # Basic

View File

@ -1,6 +1,6 @@
--- ---
title: "Monitoring" title: "Monitoring"
tags: [ "system", "CPU", "memory" ] tags: [ "System", "CPU", "Memory" ]
--- ---
Print the average CPU load over 1 minute, 5 minutes, and 15 minutes: Print the average CPU load over 1 minute, 5 minutes, and 15 minutes:

View File

@ -1,6 +1,6 @@
--- ---
title: "partitions" title: "partitions"
tags: [ "system" ] tags: [ "System" ]
--- ---
# FDisk Basics # FDisk Basics

View File

@ -1,6 +1,6 @@
--- ---
title: "snaps" title: "snaps"
tags: [ "system", "Ubuntu", "snap" ] tags: [ "System", "Ubuntu", "snap" ]
--- ---
> sudo apt-get purge -y snapd > sudo apt-get purge -y snapd

View File

@ -1,6 +1,6 @@
--- ---
title: "Docker" title: "Docker"
tags: [ "documentation", "virtualization" ] tags: [ "documentation", "Virtualization" ]
--- ---
```sh ```sh
sudo pacman -S docker sudo pacman -S docker

View File

@ -1,6 +1,6 @@
--- ---
title: "virtualbox" title: "virtualbox"
tags: [ "system" ] tags: [ "System" ]
--- ---
# Setup # Setup

View File

@ -1,6 +1,6 @@
--- ---
title: "ffmpeg" title: "ffmpeg"
tags: [ "sound", "vision" ] tags: [ "Sound", "Vision" ]
--- ---
# Basics # Basics

View File

@ -1,6 +1,6 @@
--- ---
title: "imagemagick" title: "imagemagick"
tags: [ "vision" ] tags: [ "Vision" ]
--- ---
Convert jpg to png. Convert jpg to png.

View File

@ -1,6 +1,6 @@
--- ---
title: "Markdown to PDF" title: "Markdown to PDF"
tags: [ "markdown", ".pdf", "vision" ] tags: [ "Markdown", "PDF", "Vision" ]
--- ---
Turn a markdown file into a pdf: Turn a markdown file into a pdf: