Advertisement · 728 × 90
#
Hashtag
#RWX
Advertisement · 728 × 90
File: rsync.sh

# rsync

# synchronize
#| rsync
#= rs
rwx_rsync() {
	rsync \
		--archive \
		--no-inc-recursive \
		--partial \
		--progress \
		--verbose \
		"${@}"
}

# synchronize and delete after
#= rsda
rwx_rsync_delete_after() {
	rwx_rsync \
		--delete-after \
		"${@}"
}

# synchronize and delete before
#= rsdb
rwx_rsync_delete_before() {
	rwx_rsync \
		--delete-before \

File: rsync.sh # rsync # synchronize #| rsync #= rs rwx_rsync() { rsync \ --archive \ --no-inc-recursive \ --partial \ --progress \ --verbose \ "${@}" } # synchronize and delete after #= rsda rwx_rsync_delete_after() { rwx_rsync \ --delete-after \ "${@}" } # synchronize and delete before #= rsdb rwx_rsync_delete_before() { rwx_rsync \ --delete-before \

Shell system aliases, set from annotations,
here for #rsync functions to sync & delete.

#rwx

0 0 0 0
750 commits, 2 branches
0 tags, 4.9 MiB
Shell 75.5%, Python 15.2%, Awk 9.3%

750 commits, 2 branches 0 tags, 4.9 MiB Shell 75.5%, Python 15.2%, Awk 9.3%

The #awk proportion more than doubled.

#rwx

0 0 0 0
gnome-terminal window running tmux with title:
projects - rwx - rwx - 3: bash  |  114 × 25 - 3: 56 × 12

Window left pane: main / find
# path to the entrypoint main file of the project
rwx_main_path="${rwx_main_root}/${rwx_main_file}"
# FIXME sparate in two functions
# find root directory shell modules
#| find
#| sort
rwx_main_find() {
	local root="${1}"
	[ -d "${root}" ] &&
		find \
			"${root}" \
			-name "*.${RWX_MAIN_EXTENSION}" \
			-type "f" \
			-printf "%P\n" |
		sort
}

Window top right pane: posix shell modules…
core, crypt.sh, de, dev, ffmpeg.sh, fs, fs.sh, gpg.sh,
gui, id.sh, io, lint, list.sh, log, main.sh, os,
pm, ps, pw, rescue, self.sh, shell, tui, util.sh

Window bottom right pane: trailing project root files…
pyproject.toml, readme.md, render.py, rwx, sh, tmp

Bottom status bar with four lines
and square brackets [] for panes synchronized (blue), zoomed (red), both (magenta):
1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 19:28:24
2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-08-13
3) left: servers projects, default; right: panes batcat, bash, bash
4) current directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx

gnome-terminal window running tmux with title: projects - rwx - rwx - 3: bash | 114 × 25 - 3: 56 × 12 Window left pane: main / find # path to the entrypoint main file of the project rwx_main_path="${rwx_main_root}/${rwx_main_file}" # FIXME sparate in two functions # find root directory shell modules #| find #| sort rwx_main_find() { local root="${1}" [ -d "${root}" ] && find \ "${root}" \ -name "*.${RWX_MAIN_EXTENSION}" \ -type "f" \ -printf "%P\n" | sort } Window top right pane: posix shell modules… core, crypt.sh, de, dev, ffmpeg.sh, fs, fs.sh, gpg.sh, gui, id.sh, io, lint, list.sh, log, main.sh, os, pm, ps, pw, rescue, self.sh, shell, tui, util.sh Window bottom right pane: trailing project root files… pyproject.toml, readme.md, render.py, rwx, sh, tmp Bottom status bar with four lines and square brackets [] for panes synchronized (blue), zoomed (red), both (magenta): 1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 19:28:24 2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-08-13 3) left: servers projects, default; right: panes batcat, bash, bash 4) current directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx

2025-08-13

Ready to use #tmux configuration.

#rwx

0 0 0 0
359 commits, 4 branches
0 tags, 3.7 MiB
Shell 66.1%, Python 29.8%, Awk 4.1%

359 commits, 4 branches 0 tags, 3.7 MiB Shell 66.1%, Python 29.8%, Awk 4.1%

2025-07-08

The #awk code base is growing…

#rwx

0 0 0 0
BEGIN {
	RE_ANY = "(.*)"
	RE_CONST = "([_A-Z][_0-9A-Z]*)"
	RE_SET = "=.*"
	RE_SPACE = "[[:space:]]"
	RE_SPACES = RE_SPACE "*"
	RE_VAR = "([_a-z][_0-9a-z]*)"

	RE_BEGIN = "^"
	RE_END = RE_SPACES "$"
	RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{"

	RE_ALIAS = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END
	RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END
	RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END
	RE_DOC = RE_BEGIN RE_SPACES "#" RE_SPACE RE_ANY RE_END
	RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END
	RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END
	RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END
	RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END

BEGIN { RE_ANY = "(.*)" RE_CONST = "([_A-Z][_0-9A-Z]*)" RE_SET = "=.*" RE_SPACE = "[[:space:]]" RE_SPACES = RE_SPACE "*" RE_VAR = "([_a-z][_0-9a-z]*)" RE_BEGIN = "^" RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" RE_ALIAS = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END RE_DOC = RE_BEGIN RE_SPACES "#" RE_SPACE RE_ANY RE_END RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END

2025-07-06

Learning #awk but, for now,
mostly doing regex matching…

#rwx

0 0 1 0
gnome-terminal window running tmux with title:
p1 → rwx → rwx (5∕10) → bash (2∕3)

Window top left pane: python package files…
arg, cmd, deb, err, fs, grub, log, os, prj, ps, sw, txt, web

Window bottom left pane: posix shell modules…
alias, cryptsetup.sh, debian.sh, ffmpeg.sh, file.sh, fs.sh,
gnome.sh, gpg.sh, lint, live.sh, log, main.sh, python.sh,
rescue, self.sh, shell.sh, tmux.sh, util.sh

Window right pane: subsection of markdown readme file…
## 2 [How](#toc) {#how}
### 2.1 [Shell](#how) {#how-shell}
* [X] functions to
  * [X] alias
  * [X] lint
    * [X] Git
    * [X] Python
    * [X] Shell
  * [X] log
  * [X] rescue
    * [X] Hetzner
    * [X] OVH
* [X] profiles
  * [X] ffmpeg
  * [X] tmux
### 2.2 [Python](#how) {#how-python}

Bottom status bar with five lines:
1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 02:33:32
2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-06-30
3) servers p1, p2 & directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx
4) left: window panes process names bash, bash, batcat; right: hostname bookworm
5) left: window panes sizes & total 52×11, 52×12, 61×24 & 114×24; right: user user

gnome-terminal window running tmux with title: p1 → rwx → rwx (5∕10) → bash (2∕3) Window top left pane: python package files… arg, cmd, deb, err, fs, grub, log, os, prj, ps, sw, txt, web Window bottom left pane: posix shell modules… alias, cryptsetup.sh, debian.sh, ffmpeg.sh, file.sh, fs.sh, gnome.sh, gpg.sh, lint, live.sh, log, main.sh, python.sh, rescue, self.sh, shell.sh, tmux.sh, util.sh Window right pane: subsection of markdown readme file… ## 2 [How](#toc) {#how} ### 2.1 [Shell](#how) {#how-shell} * [X] functions to * [X] alias * [X] lint * [X] Git * [X] Python * [X] Shell * [X] log * [X] rescue * [X] Hetzner * [X] OVH * [X] profiles * [X] ffmpeg * [X] tmux ### 2.2 [Python](#how) {#how-python} Bottom status bar with five lines: 1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 02:33:32 2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-06-30 3) servers p1, p2 & directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx 4) left: window panes process names bash, bash, batcat; right: hostname bookworm 5) left: window panes sizes & total 52×11, 52×12, 61×24 & 114×24; right: user user

2025-06-30

Further into #tmux configuration, with
multiple servers, sessions, windows, panes…

#rwx

0 0 0 0
JS:

const chapters = document.getElementById("chapters");
const video = document.getElementById("video");
const cues = [];

for (let track of video.textTracks) {
    if (track.kind === "chapters") {
        track.mode = "hidden";
        let id, text, tr;
        setTimeout(() => {
            for (let cue of track.cues) {
                id = document.createElement("td");
                text = document.createElement("td");
                tr = document.createElement("tr");
                id.textContent = cue.id;
                text.textContent = cue.text;
                tr.onclick = () => {
                    video.currentTime = cue.startTime;
                    video.play();
                };
                tr.appendChild(id);
                tr.appendChild(text);
                chapters.appendChild(tr);
                cues.push({ cue, tr });
            }
        }, 250);
        break;
    }
}

video.addEventListener("timeupdate", () => {
    const time = video.currentTime;
    for (const { cue, tr } of cues) {
        if (time >= cue.startTime && time < cue.endTime) {
            tr.classList.add("active");
        } else {
            tr.classList.remove("active");
        }
    }
});


CSS:

body {
background-color: #262626;
color: #ccc;
font-family: sans;
margin: auto;
}

.columns {
display: grid;
gap: 1em;
grid-template-columns: 1fr 3fr;
}
.list {
max-block-size: 100vh;
overflow: auto;
}

tr {
cursor: pointer;
}
tr.active {
color: #0f0;
}
tr:hover {
color: #f00;
}
tr:nth-of-type(even) {
background-color: #333;
}

video {
max-inline-size: 100%;
}

JS: const chapters = document.getElementById("chapters"); const video = document.getElementById("video"); const cues = []; for (let track of video.textTracks) { if (track.kind === "chapters") { track.mode = "hidden"; let id, text, tr; setTimeout(() => { for (let cue of track.cues) { id = document.createElement("td"); text = document.createElement("td"); tr = document.createElement("tr"); id.textContent = cue.id; text.textContent = cue.text; tr.onclick = () => { video.currentTime = cue.startTime; video.play(); }; tr.appendChild(id); tr.appendChild(text); chapters.appendChild(tr); cues.push({ cue, tr }); } }, 250); break; } } video.addEventListener("timeupdate", () => { const time = video.currentTime; for (const { cue, tr } of cues) { if (time >= cue.startTime && time < cue.endTime) { tr.classList.add("active"); } else { tr.classList.remove("active"); } } }); CSS: body { background-color: #262626; color: #ccc; font-family: sans; margin: auto; } .columns { display: grid; gap: 1em; grid-template-columns: 1fr 3fr; } .list { max-block-size: 100vh; overflow: auto; } tr { cursor: pointer; } tr.active { color: #0f0; } tr:hover { color: #f00; } tr:nth-of-type(even) { background-color: #333; } video { max-inline-size: 100%; }

2025-06-17

A bit of #js & #css code to have
two-ways interaction between the
#html video & list of #vtt chapters.

#rwx

1 0 0 0
File: rwx > sh > ffmpeg.sh

rwx_ffmpeg_input_hdmi() {
	local device="${1}"
	[ -n "${device}"] || device="/dev/video0"
	set -- \
		-f "v4l2" \
		-video_size "1920x1080" \
		-framerate "120" \
		-input_format "yuv420p" \
		-i "${device}"
	local argument
	for argument in "${@}"; do echo "${argument}"; done
}

rwx_ffmpeg_output_audio_fast() {
	set -- \
		-codec:a "flac" \
		-compression_level "0"
	local argument
	for argument in "${@}"; do echo "${argument}"; done
}

File: rwx > sh > ffmpeg.sh rwx_ffmpeg_input_hdmi() { local device="${1}" [ -n "${device}"] || device="/dev/video0" set -- \ -f "v4l2" \ -video_size "1920x1080" \ -framerate "120" \ -input_format "yuv420p" \ -i "${device}" local argument for argument in "${@}"; do echo "${argument}"; done } rwx_ffmpeg_output_audio_fast() { set -- \ -codec:a "flac" \ -compression_level "0" local argument for argument in "${@}"; do echo "${argument}"; done }

2025-05-17

Writing functions to screencast with #ffmpeg

#rwx #vscodium

0 0 0 0
File: rsync.sh

# synchronize
rs() { a__r_sync "${@}"; }
a__r_sync() {
	rsync \
		--archive \
		--no-inc-recursive \
		--partial \
		--progress \
		--verbose \
		"${@}"
}

# synchronize and delete after
rsda() { a__r_sync_delete_after "${@}"; }
a__r_sync_delete_after() {
	a__r_sync \
		--delete-after \
		"${@}"
}

# synchronize and delete before
rsdb() { a__r_sync_delete_before "${@}"; }
a__r_sync_delete_before() {
	a__r_sync \
		--delete-before \
		"${@}"
}

File: rsync.sh # synchronize rs() { a__r_sync "${@}"; } a__r_sync() { rsync \ --archive \ --no-inc-recursive \ --partial \ --progress \ --verbose \ "${@}" } # synchronize and delete after rsda() { a__r_sync_delete_after "${@}"; } a__r_sync_delete_after() { a__r_sync \ --delete-after \ "${@}" } # synchronize and delete before rsdb() { a__r_sync_delete_before "${@}"; } a__r_sync_delete_before() { a__r_sync \ --delete-before \ "${@}" }

2025-05-16

First system aliases a__ prefix approach,
here with #rsync functions to sync & delete.

#rwx

0 0 0 0
gnome-terminal window running tmux with title: bash @ /home/user

Top status bar with three lines:
1) left: windows 0, 1 nano, 2 bash, 3 sleep; right: time 2025-01-18 18:09:32
2) center: window panes 1[57x26], 2[56x13], 3[56x12]
3) left: current directory /home/user ; right: current pane 56×13 2∕3

Current window with three panes: 1 left, 2 top right, 3 bottom right.

In left pane can be seen imported system & user modules:
40 lint/shfmt
41 live
42 log/log
43 log/step
44 rescue/common
45 rescue/hetzner
46 rescue/ovh
47 self
48 shell
49 tmux
50 util
. /home/user/rwx
01 cryptsetup
02 fix
03 newsboat
04 self
05 srv

In all three panes can be seen rwx shell commands prefixes:
rwx_… = functions
 a__… = aliases
 u__… = user

gnome-terminal window running tmux with title: bash @ /home/user Top status bar with three lines: 1) left: windows 0, 1 nano, 2 bash, 3 sleep; right: time 2025-01-18 18:09:32 2) center: window panes 1[57x26], 2[56x13], 3[56x12] 3) left: current directory /home/user ; right: current pane 56×13 2∕3 Current window with three panes: 1 left, 2 top right, 3 bottom right. In left pane can be seen imported system & user modules: 40 lint/shfmt 41 live 42 log/log 43 log/step 44 rescue/common 45 rescue/hetzner 46 rescue/ovh 47 self 48 shell 49 tmux 50 util . /home/user/rwx 01 cryptsetup 02 fix 03 newsboat 04 self 05 srv In all three panes can be seen rwx shell commands prefixes: rwx_… = functions a__… = aliases u__… = user

2025-01-18

After a long time using #byobu,
writing #tmux config from scratch…

#rwx

0 0 0 0
Video

2024-12-13

RWX work: 2023 → 2024

I’ve been writing code in #python
& shells ( #bash , #grub , #posix ):

#lsgm Live Scan Grub Menu
#rwx Read Write eXecute
#spcd Shell to Python Continuous Deployment
#srmp Software Repositories Mirror Profile

#ffmpeg #git #gource

0 0 0 0
bash completion for prefixes.


a__apt_cache_list
a__apt_cache_policy
a__apt_cache_search
a__apt_get_auto_purge
a__apt_get_auto_remove
a__apt_get_clean
a__apt_get_full_upgrade
a__apt_get_install
a__apt_get_purge
a__apt_get_remove
a__apt_get_up_date
a__apt_get_up_grade
a__bat
a__btrfs_filesystem_d_f
a__btrfs_filesystem_d_u
a__btrfs_filesystem_usage
a__btrfs_property_get
a__btrfs_subvolume_create
a__btrfs_subvolume_delete
a__btrfs_subvolume_list
a__btrfs_subvolume_snapshot
a__btrfs_subvolume_snapshot_r
a__byo_bu
a__byo_bu_attach
a__byo_bu_ls
a__byo_bu_new_detach
a__change_mode_directory
a__change_mode_file

a__change_owner_root
a__change_owner_user
a__clear
a__co_py_interactive
a__e_macs
a__e_vince
a__git_add
a__git_add_all
a__git_add_all_patch
a__git_add_patch
a__git_branch
a__git_branch_delete
a__git_branch_delete_force
a__git_branch_list
a__git_branch_set_upstream
a__git_checkout
a__git_checkout_orphan
a__git_cherry_pick
a__git_cherry_pick_abort
a__git_cherry_pick_continue
a__git_clean_force
a__git_commit_amend_message
a__git_commit_empty_message
a__git_commit_message
a__git_config_user_email
a__git_config_user_name
a__git_diff
a__git_diff_cached

a__git_diff_cached_word
a__git_diff_tool
a__git_diff_word
a__git_fetch
a__git_fetch_prune
a__git_garbage_collect
a__git_init
a__git_init_bare
a__git_log
a__git_log_all
a__git_log_all_patch
a__git_log_patch
a__git_merge
a__git_merge_abort
a__git_merge_commit
a__git_merge_squash
a__git_merge_tool
a__git_push
a__git_push_delete
a__git_push_force
a__git_re_base
a__git_re_base_abort
a__git_re_base_continue
a__git_re_base_force
a__git_re_base_interactive
a__git_re_mote_add
a__git_re_mote_list
a__git_re_mote_set_upstream

a__git_re_mote_show
a__git_re_move
a__git_re_set
a__git_re_set_hard
a__git_show_commit
a__git_status
a__git_tag
a__git_tag_delete
a__gpg_agent_kill
a__gpg_agent_update
a__grep
a__kill
a__kill_all
a__kill_all_force
a__kill_force
a__list_block
a__list_block_no_empty
a__list_block_output
a__ls
a__ls_time

…

bash completion for prefixes. a__apt_cache_list a__apt_cache_policy a__apt_cache_search a__apt_get_auto_purge a__apt_get_auto_remove a__apt_get_clean a__apt_get_full_upgrade a__apt_get_install a__apt_get_purge a__apt_get_remove a__apt_get_up_date a__apt_get_up_grade a__bat a__btrfs_filesystem_d_f a__btrfs_filesystem_d_u a__btrfs_filesystem_usage a__btrfs_property_get a__btrfs_subvolume_create a__btrfs_subvolume_delete a__btrfs_subvolume_list a__btrfs_subvolume_snapshot a__btrfs_subvolume_snapshot_r a__byo_bu a__byo_bu_attach a__byo_bu_ls a__byo_bu_new_detach a__change_mode_directory a__change_mode_file a__change_owner_root a__change_owner_user a__clear a__co_py_interactive a__e_macs a__e_vince a__git_add a__git_add_all a__git_add_all_patch a__git_add_patch a__git_branch a__git_branch_delete a__git_branch_delete_force a__git_branch_list a__git_branch_set_upstream a__git_checkout a__git_checkout_orphan a__git_cherry_pick a__git_cherry_pick_abort a__git_cherry_pick_continue a__git_clean_force a__git_commit_amend_message a__git_commit_empty_message a__git_commit_message a__git_config_user_email a__git_config_user_name a__git_diff a__git_diff_cached a__git_diff_cached_word a__git_diff_tool a__git_diff_word a__git_fetch a__git_fetch_prune a__git_garbage_collect a__git_init a__git_init_bare a__git_log a__git_log_all a__git_log_all_patch a__git_log_patch a__git_merge a__git_merge_abort a__git_merge_commit a__git_merge_squash a__git_merge_tool a__git_push a__git_push_delete a__git_push_force a__git_re_base a__git_re_base_abort a__git_re_base_continue a__git_re_base_force a__git_re_base_interactive a__git_re_mote_add a__git_re_mote_list a__git_re_mote_set_upstream a__git_re_mote_show a__git_re_move a__git_re_set a__git_re_set_hard a__git_show_commit a__git_status a__git_tag a__git_tag_delete a__gpg_agent_kill a__gpg_agent_update a__grep a__kill a__kill_all a__kill_all_force a__kill_force a__list_block a__list_block_no_empty a__list_block_output a__ls a__ls_time …

2024-11-26

First functions naming approach:
– prefix a__ for system Aliases
– prefix sh_ for regular functions
– prefix u__ for User aliases

#rwx

0 0 0 0
Comparing locale behaviors
of debian glibc & alpine musl.

Both have:
LANG
LC_CTYPE
LC_NUMERIC
LC_TIME
LC_COLLATE
LC_MONETARY
LC_MESSAGES
LC_ALL

musl has no:
LC_PAPER
LC_NAME
LC_ADDRESS
LC_TELEPHONE
LC_MEASUREMENT
LC_IDENTIFICATION

Then comparing LC_MONETARY for both.

musl has only: crncystr

glibc has:
int_curr_symbol
currency_symbol
mon_decimal_point
mon_thousands_sep
mon_grouping

Comparing locale behaviors of debian glibc & alpine musl. Both have: LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_ALL musl has no: LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION Then comparing LC_MONETARY for both. musl has only: crncystr glibc has: int_curr_symbol currency_symbol mon_decimal_point mon_thousands_sep mon_grouping

2024-09-06

Realizing that #musl
is really quite different.

#posix #rwx #spcd

0 0 0 0
Two browser windows displaying parallel executions,
for both a project’s main and dev git branches,
of ci/cd workflows with custom bash actions:

cd-bootstrap
cd-list-environment
cd-clone-branch
cd-install-packages 'pandoc'
cd-build-project
cd-browse-workspace
cd-synchronize 'out'

Two browser windows displaying parallel executions, for both a project’s main and dev git branches, of ci/cd workflows with custom bash actions: cd-bootstrap cd-list-environment cd-clone-branch cd-install-packages 'pandoc' cd-build-project cd-browse-workspace cd-synchronize 'out'

2024-03-24

Finally setting up a personal software forge:
– #forgejo instead of github | gitlab | gitea
– forgejo-runner instances using #docker
– custom #bash actions for workflows

#rwx #spcd

2 0 0 0
Showcasing box drawing characters and prompt colors,
changing along user switching and error codes raising:

users: green for regular ones and red for root
return codes: green for ok and red for errors

Showcasing box drawing characters and prompt colors, changing along user switching and error codes raising: users: green for regular ones and red for root return codes: green for ok and red for errors

2023-08-23

Tinkering with prompt render…

#rwx

0 0 0 0
Graphic titled “Wow That’s Fascinating — Unix Permissions Were Designed in the 1970s.” Design mimics a vintage monochrome terminal with green text on a black screen inside a rounded gray frame. Main text reads: “The simple rwx permission model (read, write, execute) reflects early Unix's multi-user roots. It’s elegant—but not without quirks. Newer systems like ACLs try to expand on it, but rwx still rules.” Bottom left shows a small globe icon with the text “vintage.computer.” Bottom right shows a small pixel-style chip icon.

Graphic titled “Wow That’s Fascinating — Unix Permissions Were Designed in the 1970s.” Design mimics a vintage monochrome terminal with green text on a black screen inside a rounded gray frame. Main text reads: “The simple rwx permission model (read, write, execute) reflects early Unix's multi-user roots. It’s elegant—but not without quirks. Newer systems like ACLs try to expand on it, but rwx still rules.” Bottom left shows a small globe icon with the text “vintage.computer.” Bottom right shows a small pixel-style chip icon.

Unix permissions may look simple (just rwx for user, group, and world), but that simplicity is what’s kept them alive for over 50 years. Designed in the 70s, the model is still powering servers, desktops, and embedded systems. #Unix #VintageComputing #rwx #VintageComputer

1 0 0 0

Seeing Vancouver (Likely BC Place) on the list is huge.
Canadian exposure to live matches at the 2031 (and 2033) #RWX would be a much needed boost for the game.
North American rugby would be better off for including a Canadian host city.

2 0 0 0

(VIDEO)

Fascists and their ilk marching through Amsterdam.

'Defend' is one of several #rwx militant-oriented groups that strive for an overthrow of the democratic order.
A large police presence in Amsterdam has sofar kept them from rioting.

0 0 0 0

lesen
lesen und schreiben

schreiben
schreiben und ausführen

lesen
lesen und ausführen

lesen und schreiben und ausführen und
root acces zu einem apache

#gomringer #gomringador #konkretePoesie #nerdgedicht #rwx

0 1 1 0

Today's internet is a far cry from its early promise of a decentralized,democratic and self-sovereigh network of free connection.

#ReadWriteOwn #RWX #RWO #Web3 #Blockchain #NextGenerationInternet

2 0 0 0