Compare commits

..

54 Commits

Author SHA1 Message Date
65217b8673 Merge branch 'dev' into vhs 2025-05-21 01:04:56 +02:00
42886b3c1d Merge branch 'dev' into vhs 2025-04-30 15:39:44 +02:00
8a86d9dc29 Merge branch 'dev' into vhs 2025-03-29 14:26:40 +01:00
2f328f3b70 Merge branch 'dev' into vhs 2025-03-18 18:54:29 +01:00
219ea021e1 Merge branch 'dev' into vhs 2025-03-04 13:30:14 +01:00
28c6a99b0e Merge branch 'dev' into vhs 2025-02-27 16:59:25 +01:00
30bc3b7055 Merge branch 'dev' into vhs 2025-02-14 13:06:12 +01:00
c95ad1076e Merge branch 'dev' into vhs 2025-02-12 17:06:33 +01:00
8f5298bc2f Merge branch 'dev' into vhs 2025-02-11 20:51:23 +01:00
dcfe955cfe Merge branch 'dev' into vhs 2025-02-10 20:32:15 +01:00
1dc717bdc1 Merge branch 'dev' into vhs 2025-02-10 01:02:29 +01:00
fe5f856590 place tape in recfiles.md 2025-02-07 20:30:35 +01:00
987208d232 Merge branch 'dev' into vhs 2025-02-07 20:26:22 +01:00
d0d0ddf079 make recfiles tape 2025-02-07 20:24:45 +01:00
a26b9a8287 remove recfiles tape 2025-02-07 19:20:06 +01:00
6e9d2bd0c0 Merge branch 'dev' into vhs 2025-02-07 19:15:07 +01:00
5460e90137 Merge branch 'dev' into vhs 2025-01-17 19:23:42 +01:00
4cc4603b2e Merge branch 'dev' into vhs 2025-01-14 05:05:49 +01:00
a8617fb5b1 Merge branch 'dev' into vhs 2024-12-16 00:44:45 +01:00
04814ff498 Merge branch 'dev' into vhs 2024-12-07 14:06:39 +01:00
7eea76f2be Merge branch 'dev' into vhs 2024-12-05 16:28:34 +01:00
f3143876db Merge branch 'master' into vhs 2024-11-28 17:08:54 +01:00
3457ed4c61 Merge branch 'dev' into vhs 2024-11-28 02:50:59 +01:00
786178195b Merge branch 'master' into vhs 2024-08-13 19:05:17 +02:00
29bff234fd place requirements for at tape 2024-08-07 18:01:34 +02:00
3e3e072623 Merge branch 'master' into vhs 2024-08-06 20:47:23 +01:00
a6907d7a91 Merge branch 'master' into vhs 2024-06-02 05:27:58 +02:00
3f98db3d3a Merge branch 'dev' into vhs 2023-12-02 03:10:14 +01:00
17b90a54cb Merge branch 'dev' into vhs 2023-09-23 09:29:51 +02:00
0587e9914a place requirements for tapes 2023-09-14 19:06:16 +02:00
257ece871c provide yes.tape 2023-09-14 19:05:47 +02:00
89ec9614e5 Merge branch 'dev' into vhs 2023-09-14 19:00:06 +02:00
6f8902ff8f add lf tape 2023-09-04 21:06:03 +02:00
1eab64e1bc Merge branch 'dev' into vhs 2023-09-04 20:29:11 +02:00
92f90b51f7 Merge branch 'dev' into vhs 2023-09-04 19:24:52 +02:00
b44d6b88ed Merge branch 'dev' into vhs 2023-08-23 22:10:21 +02:00
23160b22ad Merge branch 'dev' into vhs 2023-07-19 15:16:42 +02:00
fd2c44f49b Merge branch 'dev' into vhs 2023-07-12 03:23:28 +02:00
8b599e2c77 Merge branch 'master' into vhs 2023-07-02 12:39:49 +02:00
4a9d2d61d2 Merge branch 'dev' into vhs 2023-06-20 15:08:40 +02:00
fda9fcdec4 unify sc-im formatting 2023-06-08 17:45:22 +02:00
395cb363db place w3m gif in file 2023-06-08 16:34:33 +02:00
abc2add177 add w3m tape 2023-06-08 16:30:59 +02:00
2dbc7965da Merge branch 'master' into vhs 2023-06-08 13:37:46 +02:00
4dd6c979b6 Merge branch 'dev' into vhs 2023-04-20 21:02:21 +02:00
8672905dc4 fix at.gif syntax 2023-04-13 22:23:05 +02:00
6a3703a2d0 add at tape 2023-04-13 06:18:57 +02:00
8bb0c57ddb Merge branch 'master' into vhs 2023-04-13 06:17:15 +02:00
8994bbe0e2 include tapes in xbps 2023-04-11 14:02:51 +02:00
ea5ecad274 Merge branch 'master' into vhs 2023-04-11 14:02:28 +02:00
c6f2891003 add xbps tapes 2023-04-11 14:01:43 +02:00
46f538bbe8 Merge branch 'master' into vhs 2023-04-11 12:37:51 +02:00
f80bc47a24 fix path 2023-04-10 17:15:31 +02:00
6162bb1502 add which.tape 2023-04-10 17:09:30 +02:00
47 changed files with 423 additions and 496 deletions

View File

@@ -38,7 +38,6 @@ $(databases): .dbs/%.rec: %/ | .dbs/
# This two-variable read can only happen because of the quotes in the titles.
db.rec: $(databases)
$(warning rebuilding from $? )
printf '%s\n' '%rec: guide' > $@
printf '%s\n' '%key: title' >> $@
printf '%s\n' '%type: requires rec guide' >> $@

View File

@@ -44,8 +44,6 @@ They should not assume the reader knows much beyond common terminal commands, an
People should be able to read an article from the beginning, then keep going until the end, and then stop.
Articles should not take a detour through a chain of other articles of unknown size.
[Do not Jaquays documentation](https://splint.rs/posts/no_links)
## Be Opinionated
- Guides should not ask the reader to select options half-way through.

View File

@@ -64,6 +64,8 @@ atrm 2
Check `/var/spool/atd/` to see the jobs.
![At it again](/tapes/at.gif)
## Automation
Automatically add a job for later, by setting the date, then using echo for the command.

42
basics/at.tape Normal file
View File

@@ -0,0 +1,42 @@
Require at
Require atd
Sleep 500ms
Type "at teatime"
Enter
Sleep 1.5s
Type "./"
Sleep 500ms
Type "baskup.sh"
Sleep 1.5s
Enter
Sleep 1.5s
Ctrl+D
Sleep 3.5s
Type "atq"
Enter
Sleep 1.5s
Type "atq 1"
Sleep 500ms
Type "4"
Enter
Sleep 500ms
Type "at"
Sleep 1s
Type " -c 15"
Enter
Sleep 1.5s
Type "at"
Sleep 500ms
Type " "
Sleep 500ms
Type "-"
Sleep 500ms
Type "c 15 | grep PWD"
Enter
Sleep 5.5s
Type "atrm 15"
Sleep 2s
Enter
Sleep 3s
Ctrl+D

View File

@@ -13,6 +13,8 @@ type -P ls
type -a cat
```
![where is cmus?](/tapes/which.gif)
# Whereis the Program
Where is `grep` and all its configuration files?

33
basics/which.tape Normal file
View File

@@ -0,0 +1,33 @@
Require cmus
Type "whereis cmus"
Enter
Sleep 1s
Type "which cmus"
Enter
Sleep 500ms
Type "type /bin/cmus"
Enter
Sleep 5s
Type "man cmus"
Enter
Sleep 1s
Type " "
Sleep 1s
Type " "
Sleep 1s
Type " "
Sleep 500ms
Type " "
Sleep 1.5s
Type " "
Sleep 500ms
Type " "
Sleep 1.5s
Type " "
Sleep 500ms
Type " q"
Sleep 500ms
Type "cmus"
Sleep 3s
Ctrl+D

View File

@@ -1,7 +1,6 @@
---
title: "git-lfs"
tags: [ "data", "git" ]
requires: [ "git" ]
---
Git Large File Storage ('LFS') needs to change your `~/.gitconfig` to check out those binary files:

View File

@@ -1,69 +0,0 @@
---
title: "git stash"
tags: [ "data", "git" ]
requires: [ "git" ]
---
Save file-changes without committing anything.
Change a file:
```sh
file=README.md
fortune >> ${file}
git diff
git stash save
```
List which stashes you have:
```sh
git stash list
stash@{1}: WIP on master: c21f102 init git
```
Make a new file, then stash it:
```sh
otherfile=file.log
fortune > ${otherfile}
git add ${otherfile}
stashname=logfile
git stash save ${stashname}
```
Now you can see two stashed changes, and the most recent has a name:
```sh
git stash list
stash@{0}: On master: logfile
stash@{1}: WIP on master: c21f102 init git
```
You can delete a stash by referring to its index number, or name (if it has one).
```sh
choice=1
git stash drop ${choice}
choice=${stashname}
git stash drop ${choice}
```
Or just run `git stash drop` to remove the most recent (labelled `{0}`).
Return stashed changes with an index number (or the most recent).
```sh
git stash pop ${choice}
```
Delete all stashes:
```sh
git stash clear
```

View File

@@ -1,13 +0,0 @@
---
title: "ijq"
tags: [ "data", "json", "TUI" ]
---
Analyse `json` easier with `ijq`.
```sh
column -J -ts: -H PW,GID,shell -N User,PW,UID,GID,Description,Home,shell /etc/passwd > host.json
ijq !$
```
If you get stuck, try adding `.[]`.

View File

@@ -52,3 +52,5 @@ recset -f "$new_field" --delete $database
- [Recfiles for gemini capsules](gemini://tilde.town/~dozens/gemlog/21.gmi)
![Recfiles](/tapes/recfiles.gif)

View File

@@ -0,0 +1,68 @@
Require recins
Set Shell "bash"
Set TypingSpeed 0.1
Set FontSize 25
Set Width 900
Set Height 700
Enter
Type "touch games.rec"
Enter
Sleep 2s
Type 'recins --record "Name: Vojvodina" games.rec'
Enter
Sleep 2s
Type 'recsel games.rec'
Enter
Sleep 2s
Type 'for g in Saboter Carcassonne Chess; do recins -r "Name: $g" games.rec; done'
Enter
Type 'recsel games.rec'
Enter
Sleep 2s
Type 'cat games.rec'
Enter
Sleep 1s
Type 'recsel --quick=Carc games.rec'
Enter
Type 'recsel -q Carc games.rec'
Enter
Sleep 2s
Type 'recsel -q "sabot" --print=Name games.rec'
Enter
Sleep 1s
Type 'recsel --case-insensitive -q "sabot" --print=Name games.rec'
Enter
Sleep 2s
Type 'recsel -i -q "chess" -p Name games.rec'
Enter
Sleep 1s
Type 'recset -f "Played" --set-add="no" games.rec'
Enter
Type 'recsel games.rec'
Enter
Sleep 1s
Type 'recset -iq chess -f "Played" --set=yes games.rec'
Enter
Type 'recsel games.rec'
Enter
Sleep 1s
Type 'recset -f "Played" --delete games.rec'
Enter
Type 'recsel games.rec'
Enter
Hide
Type 'rm games.rec'
Enter
Sleep 3s

View File

@@ -48,6 +48,7 @@ echo 'set autowrap' >> .config/sc-im/scimrc
|:----------------------|:---:|
| text (left align) | < |
| text (right align) | > |
| text (right align) | `|` |
| Edit existing text | E |
### Meta Actions
@@ -62,6 +63,26 @@ echo 'set autowrap' >> .config/sc-im/scimrc
| paste with format | Pc |
| delete a cell | x |
# Movement
| Action | Key |
|:-------------------------------:|:---:|
| highest part | H |
| lowest part | L |
| top | gg |
| move right | g$ |
| move left | g0 |
| insert middle | \ |
| insert left | \> |
| insert right | < |
| to to cell b4 | b4 |
| see all text in cells | aa |
| format cells so you can see it. | f |
| format wider right | fl |
| format smaller left | fh |
| format wider down | fj |
| format smaller down | fk |
### Functions

View File

@@ -1,34 +0,0 @@
---
title: "Taskwarrior Contexts"
tags: [ "data", "task" ]
requires: [ "Taskwarrior" ]
---
# Contexts
Set three contexts by their tags:
```sh
task context define work +sa or +hr
```
```sh
task context define study +ed or +void or +rat
```
```sh
task context define home -sa -hr -ed -void -rat
```
Change to the first context.
```sh
task context work
```
Then stop.
```sh
task context none
```

View File

@@ -1,20 +0,0 @@
---
title: "Taskwarrior Configuration"
tags: [ "data", "task" ]
requires: [ "Taskwarrior" ]
---
Show your current config:
```sh
task show
```
Use machine-readable output to make a config file with all configuration keys shown, then make it your configuration file.
```sh
task _show > ${file}
mv ${file} ~/.config/task/taskrc
```

View File

@@ -1,6 +1,6 @@
---
title: "Taskwarrior"
tags: [ "data", "organization" ]
title: "task"
tags: [ "organization" ]
---
Set up the configuration file:
@@ -9,18 +9,6 @@ Set up the configuration file:
task
```
Taskwarrior published a new feature to synchronize tasks others, but the feature was not ready.
The server's default installation instructions assume that users pay for hosting services.
All listed providers run proprietary software and actively support genocide.
To ignore the synchronization, tell the configuration file to use a local synchronization file.
```
task config sync.local.server_dir
task config data.location ~/.local/state/
```
Add a task:
```sh
@@ -56,16 +44,18 @@ task add project:house buy potted plant
task add proj:house.repair buy screwdriver
task add proj:house.repair buy shelf brackets
task add pro:house.paint buy white paint
for t in "buy red paint" "buy black paint" "buy brushes" ; do
task add pro:house.paint $t
done
task add pro:house.paint buy red paint
task add pro:house.paint buy black paint
task add pro:house.paint buy brushes
```
## Summary
```sh
task pro:house sum
```
```sh
task burndown.daily pro:house
```
@@ -73,12 +63,44 @@ The summaries will show how fast a project is being completed, and when you can
# Tags
```sh
task add +buy toothbrush
```
You can then see only tasks which involve buying something with:
```sh
task +buy
```
# Contexts
Set three contexts by their tags:
```sh
task context define work +sa or +hr
```
```sh
task context define study +ed or +void or +rat
```
```sh
task context define home -sa -hr -ed -void -rat
```
Change to the first context.
```sh
task context work
```
Then stop.
```sh
task context none
```
# Review
View list of tasks completed in the last week:
@@ -89,17 +111,21 @@ task end.after:today-1wk completed
# User Defined Attributes
Define a new attribute for tasks called 'size'.
The 'user defined attribute' (UDA) needs a `type` and `label`.
Make a UDA 'size'.
```sh
task config uda.size.type string
```
```sh
task config uda.size.label Size
```
You can also ensure task tasks can only be `large`, `medium`, or `small`, then set a default.
```sh
task config uda.size.values large,medium,small
```
```sh
uda.size.default=medium
```

View File

@@ -19,3 +19,4 @@ w3m ddg.gg
| T | new tab |
| { / } | switch tabs |
![w3m browser](/tapes/w3m.gif)

43
data/w3m.tape Normal file
View File

@@ -0,0 +1,43 @@
Require w3m
Sleep 1s
Type "w3m ddg.gg"
Sleep 500ms
Enter
Sleep 1.5s
Tab
Enter
Type "cats"
Enter
Sleep 2s
Tab
Enter
Sleep 2s
Type "jjjjjjjjjjjj"
Tab
Enter
Sleep 2s
Type "U"
Sleep 500ms
Ctrl+U
Sleep 500ms
Type "dmz.rs"
Sleep 500ms
Enter
Sleep 4.5s
Type "jjjjjjjj"
Tab
Type "j"
Sleep 500ms
Enter
Sleep 1s
Type " "
Sleep 2s
Backspace
Sleep 500ms
Type " "
Sleep 1.5s
Type " "
Sleep 2s
Type "qy"
Sleep 500ms

View File

@@ -0,0 +1,28 @@
Require xbps-query
Require xbps-install
Set Shell "bash"
Set FontSize 20
Set Width 1400
Set Height 900
Type "sudo xbps-install --sync" Enter Sleep 700ms Enter
Type "sudo xbps-install --update --yes" Sleep 700ms
Backspace 33
Type "echo same but faster!" Sleep 200ms Enter
Type "sudo xbps-install -uy" Enter Sleep 700ms
Type "echo now we just download" Sleep 2s Enter
Type "sudo xbps-install -SD --yes" Sleep 700ms Enter
Type "echo and install from the downloaded updates..." Sleep 2s Enter
Type "sudo xbps-install -Du" Sleep 700ms Enter
Sleep 4s

View File

@@ -0,0 +1,64 @@
Require xbps-query
Require xbps-install
Set Shell "bash"
#Set FontSize 20
#Set Width 1400
#Set Height 900
#Hide
#
#Type "sudo xbps-remove -y cowsay xcowsay aerc"
Show
Type "xbps-query cows" Enter Sleep 1s
Type "nothing..."
Backspace 11
Type "xbps-query --search cows" Sleep 500ms Enter
Type "xbps-query --repository --search cows" Sleep 500ms Enter
Type "echo same but faster!" Sleep 200ms Enter
Type "xbps-query -Rs cows" Sleep 500ms Enter
Sleep 3s
Type "sudo xbps-install -y xcowsay" Enter Sleep 700ms Enter
Sleep 5
Type "xbps-query --repository --search 'email'" Sleep 300ms Enter
Type "too much...." Sleep 1s
Backspace 13
Sleep 1s
Type "xbps-query -R --search '^email'" Sleep 300ms Enter
Sleep 2s
Type "xbps-query -Rs --regex '^email terminal'" Sleep 300ms Enter
Type "???" Sleep 2s
Backspace 3
Sleep 3s
Type "regex first!" Sleep 2s
Backspace 12
Type "xbps-query --regex -Rs '^email.*terminal'" Sleep 300ms Enter Sleep 900ms
Type "xbps-query --regex -Rs '^terminal.*email'" Sleep 300ms Enter Sleep 900ms
Type "sudo xbps-install aerc" Enter Sleep 300ms Enter Sleep 2s

View File

@@ -0,0 +1,28 @@
Require xbps-query
Require xbps-install
Set Shell "bash"
#Set FontSize 20
#Set Width 1400
#Set Height 900
Type "sudo xbps-remove --yes thunderbird" Enter Sleep 2s
Type "time to kill orphans" Sleep 600ms
Backspace 21
Enter
Type "xbps-remove --remove-orphans --dry-run" Sleep 700ms
Backspace 38
Enter
Type "xbps-remove -on | cowsay" Sleep 300ms Enter Sleep 1.5s
Type "sudo xbps-remove --yes -o" Sleep 700ms Enter
Sleep 2s

View File

@@ -22,6 +22,8 @@ Search with regex:
xbps-query --regex -Rs 'cow(s)?\w'
```
![xbps searches](/tapes/xbps-query.gif)
List what's required for cowsay
```bash
@@ -68,6 +70,8 @@ Upgrade current packages.
xbps-install -Suv
```
![xbps searches](/tapes/xbps-install.gif)
## Remove/ Uninstall
Remove cowsay
@@ -90,6 +94,8 @@ xbps-remove -o
Show information about cowsay
![xbps searches](/tapes/xbps-remove.gif)
## Fixes
Reinstall cowsay

View File

@@ -1,25 +0,0 @@
---
title: "Port Scan"
tags: [ "networking" ]
repo: 'https://github.com/mrjackwills/havn/'
---
`havn` scans ports.
It's not in many repos, but if you can `cargo install havn`.
```sh
havn -h
havn -a
domain=splint.rs
havn -p 19-90 ${domain}
```
That last command doesn't work reliably, so increase the number of retries (`-r`), or decrease concurrent requests (`-c`).
```sh
havn -p 19-443 -r 6 ${domain}
havn -p 1-1000 -c 500 -r 5 ${domain}
```

View File

@@ -1,3 +1,4 @@
---
title: "Makefile Patterns"
tags: [ "system", "make" ]

View File

@@ -1,114 +0,0 @@
---
title: "Ansible with Docker"
tags: [ "system", "ansible", "docker" ]
requires: [ "Docker" ]
---
Set up two containers: `deb` and `arch`, add them to an `ansible` hosts file, then do a 'ping' to see if they respond.
## Required Packages
- `ansible`
- `jq`
- `docker`
## Debian Container
```sh
docker run -di --rm --name deb --hostname deb debian
docker exec -it deb sh -c 'apt update && apt -y install openssh-server python3 sudo'
```
Generate the host's ssh keys, then start the ssh daemon:
```sh
docker exec -it deb sh -c 'ssh-keygen -A'
docker exec -d deb /usr/sbin/sshd -D
```
## Arch Linux Container
```sh
docker run -di --rm --name arch --hostname arch archlinux
docker exec -it arch sh -c 'pacman -Syu --noconfirm python sudo openssh'
docker exec -it arch sh -c 'ssh-keygen -A'
docker exec -d arch /usr/sbin/sshd -D
```
## `ssh` Keys
Copy across your public ssh key to the container's `authorized_keys` file:
```sh
pubkey=~/.ssh/id_rsa.pub
for hostname in arch deb; do
docker cp $pubkey $hostname:/root/.ssh/authorized_keys
docker exec -it $hostname sh -c "chown -R root:root /root/.ssh/"
docker exec -it $hostname sh -c "chmod -R 700 /root/.ssh/"
done
```
## Hosts File
Find name of containers' IPv4 addresses.
```sh
docker network inspect bridge
```
The output is awful.
Use `jq` to parse the `json`:
```sh
docker network inspect bridge | jq -r '.[].Containers | .[].IPv4Address'
```
Now put those into a host file:
```sh
docker_hosts=hosts.txt
echo '[containers]' > $docker_hosts
docker network inspect bridge | \
jq -r '.[].Containers | .[] | "root@" + .IPv4Address' | \
cut -d/ -f1 >> $docker_hosts
```
You may need to add those host keys to your known hosts file.
Either connect interactively, or (for scripts):
```sh
hosts="$(docker network inspect bridge | jq -r '.[].Containers | .[] | .Name + " " + .IPv4Address' | \
cut -d/ -f1)"
echo "$hosts"
echo "$hosts" | while read hostname ip; do
printf "%s" "$ip"
key="$(docker exec $hostname cat /etc/ssh/ssh_host_ed25519_key.pub)"
echo "$ip $key" >> ~/.ssh/known_hosts
done
```
Check if they ping:
```sh
ansible -i $docker_hosts all -m ping
```
This command produces an irritating warning about the python interpreter (i.e., `python3`).
Make the warning shut-up:
```sh
echo '
[containers:vars]
ansible_python_interpreter=/usr/bin/python3.13' >> $docker_hosts
```
Now the ping is cleaner:
```sh
ansible -i $docker_hosts all -m ping
```

View File

@@ -3,6 +3,8 @@ title: "lf - The Light File Manager"
tags: [ "file browser", "TUI" ]
---
![lf](/tapes/lf.gif)
## Config File
If you don't have a `~/.config/lf/lfrc` file, you can probably find an example in `/usr/share/examples/lf`.

24
system/lf.tape Normal file
View File

@@ -0,0 +1,24 @@
Require lf
Set Shell "bash"
Set FontSize 12
Set Width 800
Set Height 600
Type "lf"
Sleep 1.5s
Enter
Sleep 1.5s
Type "jjj"
Sleep 1s
Enter
Sleep 2s
Type "fortune > file"
Enter
Sleep 2s
Enter
Type "/file"
Enter
Sleep 3s
Type "q"

View File

@@ -1,98 +0,0 @@
---
title: "Python Projects with Makefiles"
tags: [ "tutorial", "system", "makefiles", "graphviz", "python" ]
requires: [ "Makefiles" ]
---
If you have a python script which requires a packages - e.g. `graphviz` - you can automate the setup with a `Makefile`.
The `Makefile` will:
1. Make three copies of an 8-line installer script.
2. Use one of the installer script to install local packages.
3. Install a symbolic link to python.
3. Make a script called `activate`, which tells python to use
# Context
Python coders don't like updating their projects, they just expect everyone to install the same version of everything that they have.
Historically, people dealt with this by installing only half a dozen copies of `graphviz`; but now each python project uses a local environment, with a local copy of `graphviz`, which means everyone gets to install a new copy of `graphviz` every time they try out a project.
Downloading 40MB of software for each 40-line script you write is called 'virtual environments' because it sounds cool.
We can make it even cooler with `make`, but not yet, because python - like the fae of old - will not fetch anything until you know its true name.
# Setup
```sh
command -v python
realpath `!!`
```
You must reveal that true path, because `python` is always a relative symbolic link, to an absolute symbolic link, which leads to a shortcut.
We can finally let `make` know how to invoke python, and where it will install `graphviz`.
If your python's version is '3.14', then python needs its packages placed in `${somewhere}/lib/python3.14/site-packages/`.
You must create a new, local, name for these packages, because - like the fey of old - python demands a private name in return for revealing its true name.
I'll call mine `camelot`, because the path is long and arduous.
Set up the Makefiles like this:
```make
py_link != command -v python
py != realpath $(py_link)
version != basename $(py)
virtenv = camelot
```
Now you can ask for a local `pip` script, which can install the python packages:
```make
[...]
$(virtenv)/bin/pip:
$(py) -m venv $(virtenv)
```
Finally, list the packages you want in `requirements.txt`, and make `pip` install from it.
```sh
ppkg=graphviz
echo ${ppkg} > requirements.txt
```
```make
[...]
pkgs = $(virtenv)/lib/$(version)/site-packages/
$(pkgs): $(virtenv)/bin/pip
$(pkgs): requirements.txt
$(virtenv)/bin/pip install -r $<
```
The complete Makefile looks like this:
```make
all: .default
py_link != command -v python
py != realpath $(py_link)
version != basename $(py)
virtenv = camelot
$(virtenv)/bin/pip:
$(py) -m venv $(virtenv)
pkgs = $(virtenv)/lib/$(version)/site-packages/
$(pkgs): $(virtenv)/bin/pip
$(pkgs): requirements.txt
$(virtenv)/bin/pip install -r $<
.PHONY: .default
.default: $(pkgs)
```

View File

@@ -17,10 +17,10 @@ Remove yourself from all groups, and add yourself back to only `wheel`, `audio`,
sudo usermod --groups wheel,audio,$USER
```
Add yourself to the `docker` group:
Add yourself to the `wheel` group:
```sh
su root -c "usermod --append --groups docker $USER"
su root -c "usermod --append --groups wheel $USER"
```
Add yourself to the `network` group:
@@ -28,11 +28,5 @@ Add yourself to the `network` group:
sudo usermod -aG network $USER
```
The changes have not taken effect, so log into your own account again with `su`:
The changes will not take effect until you log in again, so reboot or log into `localhost` with [ssh](../networking/ssh.md).
```sh
groups
sudo su $USER
groups
```

View File

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

View File

@@ -10,7 +10,7 @@ ffmpeg -i [input file] output_file.mkv
The input file might be a device, such as a camera.
# Record screen
#Record screen
Take the format as 'grab the x11 screen'.
@@ -30,8 +30,7 @@ or maybe just...
ffmpeg -f x11grab -s "$(xdpyinfo | grep dimensions | awk '{print $2}')" -i :1.0 out.mkv
```
# Add default pulse audio
#Add default pulse audio
```bash
ffmpeg -f x11grab -s [screensize] -i :0.0 -f alsa -i default out.mkv
```

View File

@@ -1,22 +0,0 @@
---
title: "Make a gif"
tags: [ "vision" ]
---
Split your video into frames.
```sh
d=$(mktemp -d)
cp $vid.mp4 $d
cd $d
ffmpeg -i $vid.mp4 -vf "fps=10, scale=360:-1" frame%04d.png
gifski --fps 10 -o ${out}.gif frame*.png
```
Optimize:
```sh
gifsicle --optimize=3 --lossy=100 -o ${final}.gif ${out}.gif
```

View File

@@ -1,5 +1,5 @@
---
title: "LaTeX Packages"
title: "LaTeX Setup the Hard Way"
tags: [ "writing" ]
---
@@ -21,7 +21,7 @@ ls /opt/texlive/${YEAR}/texmf-dist/scripts/texlive/tlmgr.pl
```
Double-check the year.
It should *not* match the current year, it should match the `texlive`.
It should *not* match the real year, it should match the `texlive`.
## Problems along the Path

View File

@@ -1,12 +0,0 @@
---
title: "Calendar"
tags: [ "writing", "tex", "fun" ]
requires: [ "LaTeX Packages" ]
---
```sh
yplan $(date +%Y) > ${file}.tex
pdflatex -output-directory=/tmp/ ${file}.tex
mv /tmp/${file}.pdf .
```

View File

@@ -3,14 +3,13 @@ title: "vim basics"
tags: [ "vim", "basic" ]
---
1. Insert text by pressing `a`.
1. Insert text by pressing `i`.
1. Stop inserting text by pressing `Ctrl+[`.
1. Exit with `ZZ`.
1. Congratulations, you now know `vim`.
## Extras
- [Learning Vim](vim/vi.md)
- [Navigation](vim/navigate.md)
- [Completion](vim/completion.md)
- [Search](vim/search.md)

View File

@@ -1,46 +0,0 @@
---
title: "How to Learn `vim`"
tags: [ "vim", "learning" ]
requires: [ "vim basics" ]
---
1. Uninstall `vim`.
1. Install `vi`.
1. Write a few blog posts.
The [ancient wisdom](https://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118) is correct - everyone should start with `vi`.
But the standard wisdom fails to mention writing.
So people just 'try to remember', then they edit a couple of configuration files with `vim`, then stop, because it's a pain to think about keystrokes while thinking about how the configuration file works.
Nobody can learn like that.
Learn with a blog, or writing emails in `vim`, or writing anything, as long as it's *real writing*.
Write a journal or some recipes.
Write literally anything which is written in paragraphs.
And while you're writing, remember one rule: if you want something, `vi` can do it, you just need to look up how.
Blog first, then try out some of these commands:
- `hjkl`
- `x`
- `:!grep very %`
- `onew line<Esc>...`
- `Onew line<Esc>...`
- `~`
- `~~~~`
- `$r!`
- `w %-2`
- `x!`
- `0RTipex`
- `_4rX`
- `bc2e`
- `c2E`
- `cw`
- `cW`
- `ci'`
- `zz`
- `:set number`
- `:set nonumber`
- `:set relativenumber`
- `:set number relativenumber`