Compare commits

...

4 commits

8 changed files with 655 additions and 6 deletions

View file

@ -1,6 +1,11 @@
PREFIX=/usr
all: build
prepare:
shards install
build:
shards build --error-trace
@ -8,4 +13,11 @@ spec: test
test:
crystal spec --error-trace
.PHONY: spec test build all
install:
install \
-m 755 \
-o root \
bin/code-preloader \
$(PREFIX)/bin
.PHONY: spec test build all prepare install

View file

@ -19,15 +19,43 @@ ChatGPT.
repositories, performance may not be optimal due to processing constraints and
the nature of interactions with ChatGPT.
## Installation
## Prerequisites
To get started with Code-Preloader, ensure that you have Crystal language installed on your system. Follow these steps to install:
Before installing and using Code-Preloader, make sure your system meets the
following requirements:
1. **Crystal Language**: Code-Preloader is written in Crystal. Ensure you have
the Crystal programming language installed on your system. For installation
instructions, refer to the [official Crystal language
website](https://crystal-lang.org/install/).
2. **Required Libraries**: The following libraries are necessary for the proper
functioning of Code-Preloader:
* `libevent`: Used for asynchronous event notification.
* `libyaml`: Required for YAML parsing.
* `libmagic`: Utilized for file type detection.
* `make`: Used to define compilation rules
On a Debian-based system, you can install these libraries using the following
command:
```bash
git clone https://code.apps.glenux.net/glenux/chatgpt-preloader
sudo apt-get install libevent-dev libyaml-dev libmagic-dev make
```
## Installation
To get started with Code-Preloader, ensure that you have the prerequisites
installed on your system (see above).
Then follow these steps to install:
```bash
git clone https://code.apps.glenux.net/glenux/code-preloader
cd code-preloader
shards install
shards build
make prepare
make build
make install
```
## Usage

34
Vagrantfile vendored Normal file
View file

@ -0,0 +1,34 @@
# frozen_string_literal: true
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure('2') do |config|
config.vm.box = 'debian/bookworm64'
config.vm.box_check_update = false
config.vm.provider 'virtualbox' do |vb|
vb.gui = false
vb.memory = '4096'
end
config.vm.provider "libvirt" do |lv|
# lv.cpus = "2"
lv.memory = "4096"
# enable nested virtualization
lv.nested = true
lv.cpu_mode = "host-model"
end
# config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ["vers=3,tcp"]
# config.vm.synced_folder "../../exercises", "/exercises", type: "nfs", mount_options: ["vers=3,tcp"]
config.vm.define 'demo' do |machine|
machine.vm.hostname = 'demo'
machine.vm.network 'forwarded_port', guest: 8080, host: 8080, host_ip: '127.0.0.1'
machine.vm.network 'forwarded_port', guest: 80, host: 1080, host_ip: '127.0.0.1'
end
config.vm.provision 'shell', path: 'misc/vagrant-provision/base.sh'
end

114
misc/SCRIPT.md Normal file
View file

@ -0,0 +1,114 @@
# Minimalist FUSE Manager
---
## Configuration
Let's start by configuring `~/mnt/mfm.yml`!
---
---
## Configuration
We can add as many filesystems we want in the `filesystems:` list.
---
## Configuration
Each filesystem has a `type:` and specific configuration parameters
The current values supported by *mfm* are `gocryptfs`, `httpdirfs` and `sshfs`.
---
## Preparation
Before using *mfm*, lets have a look at the `~/mnt/` directory.
---
---
## Preparation
Yes, it is empty!
Don't worry, the mountpoint will be created automatically.
---
## Usage
Ok. Now, simply run *mfm* and choose your favorite filesystem!
In this demo, I will choose `Public - Debian Repository` which is a remote web
page hosting debian packages and registy catalog.
---
---
## Usage
Hmmm...
What happened?
---
## Usage
A directory was created in `~/mnt`.
It is filled with files and directories from a remote system, in which we can
navigate.
---
## Usage
Let's detach it now!
Simply run *mfm* again, and choose the same filesystem.
---
---
## Usage
It is now detached, and the directory is empty again!
---
## Conclusion
The *mfm* command works in the same way regardless of the filesystem selected.
It's simple, fast and efficient.
---
## Conclusion
The *mfm* project is still in its infancy.
We're looking for contributors to test it, to improve it, to make it even more
useful and enjoyable to use.
---
## Conclusion
But if you're just a user, we're already happy.
---
## Conclusion
Now it's your turn to use *mfm*!

373
misc/record-output.sh Normal file
View file

@ -0,0 +1,373 @@
#!/bin/bash
# shellcheck disable=SC2317
set -u
# parameters
konsole=org.kde.konsole-2913641
session=2
SLEEP_LONG_READ="3"
SLEEP_SHORT_READ="2"
SLEEP_TRANSITION="0.4"
SLEEP_COMMAND_BEFORE="0.4"
SLEEP_COMMAND_AFTER="0.65"
SLEEP_MICROPAUSE="0.25"
SLEEP_TYPESPEED="0.10"
qtype() {
qdbus "$konsole" "/Sessions/$session" sendText "$1"
}
qrun() {
qdbus "$konsole" "/Sessions/$session" runCommand "$1"
}
qctrlb() {
qdbus "$konsole" "/Sessions/$session" sendText $'\002'
}
qctrlc() {
qdbus "$konsole" "/Sessions/$session" sendText $'\003'
}
qtype_slow() {
echo -n "$1" \
| sed 's/\(.\)/\1\n/g' \
| while IFS="" read -r X ; do qtype "$X" ; sleep "$SLEEP_TYPESPEED" ; done
}
tmux_key() {
qctrlb
sleep 0.5
qtype "$1"
}
qtype_arrow_up() {
qtype $'\033'
qtype "[A"
}
qtype_arrow_down() {
qtype $'\033'
qtype "[B"
}
qtype_arrow_left() {
qtype $'\033'
qtype "[D"
}
qtype_arrow_right() {
qtype $'\033'
qtype "[C"
}
## cleanup
qctrlc
tmux_key "d"
qctrlc
qrun "clear"
sleep "$SLEEP_MICROPAUSE"
qrun "cd ~/src/mfm"
sleep "$SLEEP_MICROPAUSE"
qrun "cp doc/demo.mfm.yml ~/.config/mfm.yml"
sleep "$SLEEP_MICROPAUSE"
qrun "rm -f output.rec"
sleep "$SLEEP_MICROPAUSE"
qrun "tmux kill-session -t demo"
sleep "$SLEEP_MICROPAUSE"
qrun "mkdir -p /home/vagrant/mnt"
sleep "$SLEEP_MICROPAUSE"
qrun "fusermount -u \"/home/vagrant/mnt/Public - Remote Debian Repository\""
sleep "$SLEEP_MICROPAUSE"
qrun "rm -fr \"/home/vagrant/mnt/Public - Remote Debian Repository\""
sleep "$SLEEP_MICROPAUSE"
qrun "# cleanup done"
sleep "$SLEEP_LONG_READ"
## reset demo environment
qrun "tmux new -s demo"
sleep "$SLEEP_MICROPAUSE"
tmux_key "c"
qrun "cd ~/src/mfm"
sleep "$SLEEP_MICROPAUSE"
qrun "mdp --noslidenum doc/SCRIPT.md"
sleep "$SLEEP_MICROPAUSE"
tmux_key "c"
qrun "export PATH=\$PATH:~/src/mfm/bin"
sleep "$SLEEP_MICROPAUSE"
qrun "export FZF_DEFAULT_OPTS=\"--height 40% --layout=reverse --border\""
sleep "$SLEEP_MICROPAUSE"
qrun "alias cat=\"batcat -p\""
sleep "$SLEEP_MICROPAUSE"
qrun "cd ~/src/mfm"
sleep "$SLEEP_MICROPAUSE"
qrun "clear"
sleep "$SLEEP_MICROPAUSE"
tmux_key "1"
tmux_key ":"
qrun "set -g status off"
sleep "$SLEEP_MICROPAUSE"
tmux_key "d"
## record
qrun "asciinema rec --cols 80 --rows 24 -c 'tmux attach' output.rec"
# slide 1 (title)
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 2 (config file)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# cmd 2 (show config file)
qtype " "
sleep "$SLEEP_TRANSITION"
tmux_key "2"
qtype_slow "cat "
sleep "$SLEEP_MICROPAUSE"
qtype_slow "~/.config"
sleep "$SLEEP_MICROPAUSE"
qtype_slow "/mfm.yml"
sleep "$SLEEP_MICROPAUSE"
qrun ""
sleep "$SLEEP_LONG_READ" # double
sleep "$SLEEP_LONG_READ"
tmux_key "1"
# slide 3 (config options 1)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 4 (config options 2)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 5 (preparation - mnt)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# demo 5 (show mnt)
qtype " "
sleep "$SLEEP_TRANSITION"
tmux_key "2"
qtype_slow "cd "
sleep "$SLEEP_MICROPAUSE"
qtype_slow "~/mnt"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_LONG_READ"
tmux_key "1"
# slide 6 (preparation - empty mnt!)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 7 (usage - run)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# demo 7 (run mfm)
qtype " "
sleep "$SLEEP_TRANSITION"
tmux_key "2"
qtype_slow "m"
sleep "$SLEEP_MICROPAUSE"
qtype_slow "f"
sleep "$SLEEP_MICROPAUSE"
qtype_slow "m"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_arrow_down
sleep "$SLEEP_MICROPAUSE"
qtype_arrow_down
sleep "$SLEEP_MICROPAUSE"
qtype_arrow_up
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_LONG_READ"
tmux_key "1"
# slide 8 (usage - what?)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# demo 8 (usage - what : show mnt)
tmux_key "2"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_slow "cd \"Pub"
sleep "$SLEEP_MICROPAUSE"
qtype "lic - Remote Debian Repository\""
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
qtype_slow "ls"
sleep "$SLEEP_MICROPAUSE"
qtype $'\015'
sleep "$SLEEP_SHORT_READ"
qtype_slow "cd pool"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_slow "cd main"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_LONG_READ"
tmux_key "1"
# slide 9 (usage - explanation)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 10 (usage - prepare for detach)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# demo 10 (run mfm for detach)
qtype " "
sleep "$SLEEP_TRANSITION"
tmux_key "2"
qtype_slow "cd ~/mnt/"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
qtype_slow "m"
sleep "$SLEEP_MICROPAUSE"
qtype_slow "f"
sleep "$SLEEP_MICROPAUSE"
qtype_slow "m"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_arrow_down
sleep "$SLEEP_MICROPAUSE"
qtype_arrow_down
sleep "$SLEEP_MICROPAUSE"
qtype_arrow_up
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_LONG_READ"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_slow "cd \"Pub"
sleep "$SLEEP_MICROPAUSE"
qtype "lic - Remote Debian Repository\""
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_slow "ls"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_SHORT_READ"
qtype_slow "ls -la"
sleep "$SLEEP_COMMAND_BEFORE"
sleep "$SLEEP_COMMAND_BEFORE"
qtype $'\015'
sleep "$SLEEP_COMMAND_AFTER"
sleep "$SLEEP_LONG_READ"
tmux_key "1"
# slide 11 (usage - detached)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 12 (conclusion)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 13 (conclusion)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 14 (conclusion)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# slide 15 (conclusion)
qtype " "
sleep "$SLEEP_TRANSITION"
sleep "$SLEEP_LONG_READ"
# detach and clean
tmux_key "d"
qrun "tmux kill-session -t demo"
qrun "termtosvg render output.rec output.svg"
qrun "# success!"
exit 0

View file

@ -0,0 +1,32 @@
#!/bin/sh
set -e
set -u
USER="$(test -d /vagrant && echo "vagrant" || echo "debian")"
HOSTNAME="$(hostname)"
export DEBIAN_FRONTEND=noninteractive
echo "Installing required system packages"
apt-get update --allow-releaseinfo-change
apt-get install -y \
apt-transport-https \
ca-certificates \
git \
curl \
wget \
vim \
gnupg2 \
software-properties-common
# echo "Installing mfm requirements"
# apt-get install -y \
# fzf \
# sshfs \
# httpdirfs \
# libyaml-0-2 \
# libyaml-dev \
# libpcre3-dev \
# libevent-dev

View file

@ -0,0 +1,34 @@
#!/bin/sh
# install crystal
set -e
set -u
USER="$(test -d /vagrant && echo "vagrant" || echo "debian")"
HOSTNAME="$(hostname)"
export DEBIAN_FRONTEND=noninteractive
echo "Installing mfm requirements"
apt-get install -y \
fzf \
sshfs \
httpdirfs \
libyaml-0-2 \
libyaml-dev \
libpcre3-dev \
libevent-dev
# Installing asdf
su - "$USER" -c "git config --global advice.detachedHead false"
su - "$USER" -c "rm -rf ~/.asdf"
su - "$USER" -c "git clone --quiet https://github.com/asdf-vm/asdf.git \
~/.asdf \
--branch v0.8.0"
su - "$USER" -c "echo '. \$HOME/.asdf/asdf.sh' >> ~/.bashrc"
su - "$USER" -c "source \$HOME/.asdf/asdf.sh \
&& asdf plugin add crystal 2>&1 \
&& asdf install crystal 1.7.3 >/dev/null 2>&1 \
&& asdf global crystal 1.7.3"

View file

@ -0,0 +1,22 @@
#!/bin/sh
# install crystal
set -e
set -u
USER="$(test -d /vagrant && echo "vagrant" || echo "debian")"
HOSTNAME="$(hostname)"
export DEBIAN_FRONTEND=noninteractive
echo "Installing required system packages"
apt-get update --allow-releaseinfo-change
echo "Installing recording requirements"
apt-get install -y \
tmux \
mdp \
bat \
asciinema \
termtosvg