1064 lines
44 KiB
Python
Executable file
1064 lines
44 KiB
Python
Executable file
#! /usr/bin/env python3
|
|
|
|
import datetime
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
|
|
import rwx.file
|
|
|
|
|
|
def run(*args):
|
|
subprocess.call(args)
|
|
|
|
|
|
def main():
|
|
time = datetime.datetime.now()
|
|
time_id = time.strftime('%Y%m%d%H%M%S')
|
|
style = 'css'
|
|
script = 'js'
|
|
root = os.path.dirname(os.path.realpath(__file__))
|
|
input_directory = os.path.join(root, 'in')
|
|
out = os.path.join(root, 'out')
|
|
web = os.path.join(out, 'web')
|
|
if os.path.exists(web):
|
|
shutil.rmtree(web)
|
|
gen = os.path.join(web, time_id)
|
|
css = os.path.join(gen, style)
|
|
js = os.path.join(gen, script)
|
|
#
|
|
run('rsync', '--archive', f'{input_directory}/', f'{web}/')
|
|
for directory in [css, js]:
|
|
os.makedirs(directory, exist_ok=True)
|
|
#
|
|
link_gv = os.path.join(root, 'link.gv')
|
|
link_svg = os.path.join(gen, 'link.svg')
|
|
run('dot', link_gv, '-Tsvg', '-o', link_svg)
|
|
with open(link_svg, 'br') as f:
|
|
link_text = f.read().decode('u8')
|
|
page_file = os.path.join(web, 'index.html')
|
|
page_text = f'''\
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="flattr:id" content="z3d26l" />
|
|
<meta name="viewport" content="initial-scale=1,width=device-width" />
|
|
<link rel="stylesheet" href="{time_id}/{style}/index.css" />
|
|
<script src="{time_id}/{script}/index.js"></script>
|
|
<title>Marc Beninca</title>
|
|
</head>
|
|
|
|
<body onload="main()">
|
|
|
|
<main>
|
|
|
|
<div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/my" />
|
|
<label for="tab/my">My/</label>
|
|
<div><div class="tabs">
|
|
<!--
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/about" />
|
|
<label for="tab/my/about">About</label>
|
|
<div>{tabs['about']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/bio" />
|
|
<label for="tab/my/bio">Bio</label>
|
|
<div>{tabs['bio']}</div>
|
|
-->
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/cv" />
|
|
<label for="tab/my/cv">CV</label>
|
|
<div>{tabs['cv']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/profiles" />
|
|
<label for="tab/my/profiles">Profiles</label>
|
|
<div>{tabs['profiles']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/projects" />
|
|
<label for="tab/my/projects">Projects</label>
|
|
<div><div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/projects" id="tab/my/projects/lsgm" />
|
|
<label for="tab/my/projects/lsgm">LSGM</label>
|
|
<div>{tabs['lsgm']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/projects" id="tab/my/projects/ofsp" />
|
|
<label for="tab/my/projects/ofsp">OFSP</label>
|
|
<div>{tabs['ofsp']}</div>
|
|
</div></div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/tasks" />
|
|
<label for="tab/my/tasks">Tasks</label>
|
|
<div>{tabs['tasks']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/trips" />
|
|
<label for="tab/my/trips">Trips</label>
|
|
<div>{tabs['trips']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my" id="tab/my/sub" />
|
|
<label for="tab/my/sub">…/</label>
|
|
<div><div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/sub" id="tab/my/sub/id" />
|
|
<label for="tab/my/sub/id">Identity</label>
|
|
<div>{tabs['id']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/sub" id="tab/my/sub/links" />
|
|
<label for="tab/my/sub/links">Links</label>
|
|
<div>{tabs['links']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/sub" id="tab/my/sub/repos" />
|
|
<label for="tab/my/sub/repos">Repos</label>
|
|
<div>{tabs['repos']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/my/sub" id="tab/my/sub/others" />
|
|
<label for="tab/my/sub/others">…</label>
|
|
<div>{tabs['others']}</div>
|
|
</div></div>
|
|
</div></div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/learn" />
|
|
<label for="tab/learn">Learn</label>
|
|
<div>{tabs['learn']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/music" />
|
|
<label for="tab/music">Music</label>
|
|
<div>{tabs['music']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/sites" />
|
|
<label for="tab/sites">Sites/</label>
|
|
<div><div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sites" id="tab/sites/books" />
|
|
<label for="tab/sites/books">Books</label>
|
|
<div>{tabs['books']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sites" id="tab/sites/buy" />
|
|
<label for="tab/sites/buy">Buy</label>
|
|
<div>{tabs['buy']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sites" id="tab/sites/pubnix" />
|
|
<label for="tab/sites/pubnix">Pubnix</label>
|
|
<div>{tabs['pubnix']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sites" id="tab/sites/social" />
|
|
<label for="tab/sites/social">Social</label>
|
|
<div>{tabs['social']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sites" id="tab/sites/software" />
|
|
<label for="tab/sites/software">Software</label>
|
|
<div>{tabs['software']}</div>
|
|
</div></div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/tbm" />
|
|
<label for="tab/tbm">TBM</label>
|
|
<div>{tabs['tbm']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/videos" />
|
|
<label for="tab/videos">Videos/</label>
|
|
<div><div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/videos" id="tab/videos/comments" />
|
|
<label for="tab/videos/comments">Comments</label>
|
|
<div>{tabs['comments']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/videos" id="tab/videos/health" />
|
|
<label for="tab/videos/health">Health</label>
|
|
<div>{tabs['health']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/videos" id="tab/videos/vegan" />
|
|
<label for="tab/videos/vegan">Vegan</label>
|
|
<div>{tabs['vegan']}</div>
|
|
</div></div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab" id="tab/sub" />
|
|
<label for="tab/sub">…/</label>
|
|
<div><div class="tabs">
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sub" id="tab/sub/mirrors" />
|
|
<label for="tab/sub/mirrors">Mirrors</label>
|
|
<div>{tabs['mirrors']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sub" id="tab/sub/style" />
|
|
<label for="tab/sub/style">Style</label>
|
|
<div>{tabs['style']}</div>
|
|
<input type="radio" onclick="update(id)"
|
|
name="tab/sub" id="tab/sub/unsorted" />
|
|
<label for="tab/sub/unsorted">…</label>
|
|
<div>{tabs['unsorted']}</div>
|
|
</div></div>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer>
|
|
<hr />
|
|
Last update: {time.strftime('%Y/%m/%d %H:%M:%S')}
|
|
</footer>
|
|
|
|
</body>
|
|
|
|
</html>
|
|
'''
|
|
css_file = os.path.join(css, 'index.css')
|
|
css_text = f'''\
|
|
@media screen and (max-aspect-ratio: 10/16) {{
|
|
|
|
body {{
|
|
font-size: 2em;
|
|
}}
|
|
|
|
}}
|
|
|
|
body {{
|
|
background: rgb(255,255,255);
|
|
color: rgb(0,0,0);
|
|
font-family: sans;
|
|
margin: .5em;
|
|
}}
|
|
body.dark {{
|
|
background: rgb(0,0,0);
|
|
color: rgb(160,160,160);
|
|
}}
|
|
|
|
header {{
|
|
background-image: url("../img/debian.jpeg");
|
|
background-position: center;
|
|
background-size: cover;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
}}
|
|
|
|
.tabs {{
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
}}
|
|
.tabs .tabs {{
|
|
padding: .5em 0 0 0;
|
|
}}
|
|
.tabs > input {{
|
|
display: none;
|
|
}}
|
|
.tabs > input:checked + label + div {{
|
|
display: block;
|
|
}}
|
|
.tabs > label {{
|
|
order: 1;
|
|
}}
|
|
.tabs > div {{
|
|
display: none;
|
|
flex-basis: 100%;
|
|
order: 2;
|
|
}}
|
|
|
|
.tabs {{
|
|
margin: 0;
|
|
}}
|
|
.tabs > input:checked + label {{
|
|
background: linear-gradient(rgba(128,128,128,1), rgba(128,128,128,0));
|
|
}}
|
|
.tabs > label {{
|
|
background: linear-gradient(rgba(64,64,64,1), rgba(64,64,64,0));
|
|
border-color: rgb(128,128,128);
|
|
border-radius: .5em;
|
|
border-style: solid;
|
|
border-width: 1px 1px 0 1px;
|
|
font-weight: bold;
|
|
margin: 0;
|
|
padding: .5em 1.5em;
|
|
}}
|
|
.tabs > label:hover {{
|
|
background: linear-gradient(rgba(64,64,64,0), rgba(64,64,64,1));
|
|
color: rgb(192,0,0);
|
|
}}
|
|
.tabs > div {{
|
|
margin: 0;
|
|
}}
|
|
|
|
a {{
|
|
color: rgb(0,192,192);
|
|
text-decoration: none;
|
|
}}
|
|
a:hover {{
|
|
color: rgb(192,0,0);
|
|
}}
|
|
a:visited {{
|
|
color: rgb(0,160,160);
|
|
}}
|
|
|
|
img {{
|
|
border: 1px solid;
|
|
border-color: rgb(192,192,192);
|
|
border-radius: 1em;
|
|
height: 8em;
|
|
}}
|
|
|
|
table {{
|
|
empty-cells: hide;
|
|
}}
|
|
th,td {{
|
|
border-radius: .2em;
|
|
}}
|
|
th:hover,td:hover {{
|
|
background: rgb(48,0,0);
|
|
}}
|
|
th {{
|
|
background: rgb(64,64,64);
|
|
color: rgb(128,128,0);
|
|
}}
|
|
td {{
|
|
background: rgb(48,48,48);
|
|
border: 1px solid;
|
|
border-color: rgb(192,192,192);
|
|
text-align: center;
|
|
}}
|
|
|
|
.cards {{
|
|
display: flex;
|
|
}}
|
|
.card {{
|
|
list-style: none;
|
|
margin: 0 1em;
|
|
text-align: center;
|
|
}}
|
|
.card img {{
|
|
border: none;
|
|
height: 3em;
|
|
}}
|
|
|
|
.debug {{
|
|
border-color: rgb(255,0,255);
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
}}
|
|
'''
|
|
js_file = os.path.join(js, 'index.js')
|
|
js_text = f'''\
|
|
function check(tab) {{
|
|
const tabs = tab.split('/')
|
|
let id = 'tab'
|
|
let element
|
|
for (tab of tabs) {{
|
|
id = `${{id}}/${{tab}}`
|
|
element = document.getElementById(id)
|
|
if (element) {{
|
|
element.checked = true
|
|
}}
|
|
}}
|
|
}}
|
|
|
|
function debug() {{
|
|
for (element of document.getElementsByTagName('*')) {{
|
|
element.classList.toggle('debug')
|
|
}}
|
|
}}
|
|
|
|
function push(tab) {{
|
|
window.history.pushState(null, null, `?tab=${{tab}}`)
|
|
}}
|
|
|
|
function update(id) {{
|
|
const tab = id.split('/').slice(1).join('/')
|
|
push(tab)
|
|
}}
|
|
|
|
function main() {{
|
|
let tab = (new URL(document.location)).searchParams.get('tab')
|
|
if (tab) {{
|
|
check(tab)
|
|
}} else {{
|
|
tab = 'my/profiles'
|
|
check(tab)
|
|
push(tab)
|
|
}}
|
|
const dark = document.getElementById('dark')
|
|
if (dark) {{
|
|
dark.click()
|
|
}}
|
|
}}
|
|
|
|
function swap() {{
|
|
document.body.classList.toggle('dark')
|
|
}}
|
|
'''
|
|
# {link_text}
|
|
with open(page_file, 'bw') as f:
|
|
f.write(page_text.encode('u8'))
|
|
with open(css_file, 'bw') as f:
|
|
f.write(css_text.encode('u8'))
|
|
with open(js_file, 'bw') as f:
|
|
f.write(js_text.encode('u8'))
|
|
|
|
|
|
tabs = {
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'about': f'''\
|
|
About…
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'bio': f'''\
|
|
<h1>Marc Beninca</h1>
|
|
Welcome to a recap attempt of my IT life!
|
|
|
|
<h2>The early days</h2>
|
|
In my primary school days I started to interact with computers at home,
|
|
mainly Amstrad CPC 464 & 6128 machines.<br />
|
|
It was the occasion for me to:
|
|
<ul>
|
|
<li>discover computer architectures</li>
|
|
<li>learn how to program in BASIC</li>
|
|
<li>suffer the noise and speed of tape recorders</li>
|
|
<li>experience the revolution of floppy disks transfer rates</li>
|
|
</ul>
|
|
|
|
<h2>Diving in</h2>
|
|
Right before beginning high school, I was introduced to the PC platform.<br />
|
|
The “system programming PC bible” was my reference for a long time.<br />
|
|
I had the occasion to develop projects in:
|
|
<ul>
|
|
<li>Pascal (for example my own hexadecimal file editor)</li>
|
|
<li>Assembly (mainly for critical subroutines performance)</li>
|
|
<li>AutoLISP (automation in LISP of AutoCAD elements processing)</li>
|
|
</ul>
|
|
|
|
To be continued…
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'books': f'''\
|
|
<ul>
|
|
<li><a href="https://www.tradepub.com">TradePub</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'buy': f'''\
|
|
<ul>
|
|
<li><a href="https://www.i-comparateur.com">i-comparateur</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.amazon.fr">Amazon</a><ul>
|
|
<li><a href="https://www.amazon.fr/SanDisk-Extreme-externe-000-Mo-mousqueton/dp/B08RX3343D">SanDisk Extreme Pro</a></li>
|
|
</ul></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.gl-inet.com/products">GL-iNet</a></li>
|
|
<li>OVH<ul>
|
|
<li><a href="https://checkservers.ovh">check servers</a></li>
|
|
<li><a href="https://eco.ovhcloud.com/fr/#filterValue=kimsufi,so">eco</a></li>
|
|
</ul></li>
|
|
<li><a href="https://www.thinkpenguin.com">ThinkPenguin</a></li>
|
|
<li><a href="https://www.tuxedocomputers.com">Tuxedo Computers</a></li>
|
|
<li><a href="https://vollebak.com/collections">Vollebak</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.leboncoin.fr">Le bon coin</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'comments': f'''\
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@LogicallyAnswered/videos">Logically Answered</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'cv': f'''\
|
|
<ul class="cards">
|
|
<li class="card"><a href="pdf/cv.en.pdf">
|
|
<img src="img/en.svg" /><br />English</a></li>
|
|
<li class="card"><a href="pdf/cv.fr.pdf">
|
|
<img src="img/fr.svg" /><br />Français</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'repos': f'''\
|
|
<ul>
|
|
<li><a href="https://git.42l.fr/marc.beninca">42l</a></li>
|
|
<li><a href="https://git.afpy.org/marc.beninca">AFPy</a></li>
|
|
<li><a href="https://forge.chapril.org/marc.beninca">Chapril</a></li>
|
|
<li><a href="https://codeberg.org/marc.beninca">CodeBerg</a></li>
|
|
<li><a href="https://git.disroot.org/marc.beninca">DisRoot</a></li>
|
|
<li><a href="https://git.envs.net/marc.beninca">Envs</a></li>
|
|
<li><a href="https://git.froggi.es/marc.beninca">Froggies</a></li>
|
|
<li><a href="https://git.fsfe.org/marc.beninca">FSFE</a></li>
|
|
<li><a href="https://gitdab.com/marc.beninca">GitDab</a></li>
|
|
<li><a href="https://gitea.com/marc.beninca">Gitea</a></li>
|
|
<li><a href="https://gitnet.fr/marc.beninca">GitNet</a></li>
|
|
<li><a href="https://git.projectsegfau.lt/marc.beninca">ProjectSegfault</a></li>
|
|
<!--<li><a href="https://silica.codes/marc.beninca">SilicaCodes</a></li>-->
|
|
<li><a href="https://tildegit.org/marc.beninca">TildeGit</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li><a href="https://gitee.com/marc_beninca">Gitee</a></li>
|
|
<li><a href="https://notabug.org/marc.beninca">NotABug</a></li>
|
|
<li><a href="https://pagure.io/user/marc-beninca">Pagure</a></li>
|
|
<li><a href="https://rocketgit.com/marc.beninca">RocketGit</a></li>
|
|
<li><a href="https://sr.ht/~marc_beninca/rwx.work/sources">SourceHut</a></li>
|
|
<li><a href="https://git.tilde.institute/mspe">TildeInstitute</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li>Gforge</li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'health': f'''\
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@chubbyemu/videos">Chubby Emu</a></li>
|
|
<li><a href="https://www.youtube.com/@DrEricBergDC/videos">Eric Berg</a></li>
|
|
<li><a href="https://www.youtube.com/@drekberg/videos">Sten Ekberg</a></li>
|
|
<li><a href="https://www.youtube.com/@drjasonfung/videos">Jason Fung</a></li>
|
|
</ul>
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@KianaDocherty/videos">Kiana Docherty</a></li>
|
|
<li><a href="https://www.youtube.com/@ThomasDeLauerOfficial/videos">Thomas DeLauer</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@ivredevie/videos">Ivre de vie</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'id': f'''\
|
|
<table>
|
|
|
|
<tr><th colspan="2">OpenPGP</th><td colspan="3" rowspan="4"><img src="img/marc.jpeg" /></td></tr>
|
|
<tr><td colspan="2"><a href="https://marc.beninca.link/pgp.asc">marc.beninca.link</a></td></tr>
|
|
<tr><td colspan="2"><a href="https://meta.sr.ht/~marc_beninca.pgp">meta.sr.ht</a></td></tr>
|
|
<tr><td colspan="2"><a href="https://keys.openpgp.org/search?q=marc@beninca.link">keys.openpgp.org</a></td></tr>
|
|
|
|
<tr>
|
|
<th><a href="https://keybase.io/marc_beninca">Key<br>Base</a></th>
|
|
<th><a href="https://keyoxide.org/08EDA7006234A0EB29A3A8471DBD5EC4BADA5579">Key<br>Oxide</a></th>
|
|
<th><a href="https://liberapay.com/marc.beninca">Libera<br>Pay</a></th>
|
|
<th><a href="https://patreon.com/marc_beninca">Patreon</a></th>
|
|
<th><a href="https://tipeee.com/marc-beninca">Tip<br>eee</a></th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="https://keybase.io/marc_beninca/sigchain#27f9b7d24922016cc0eec421bc438be43625bc3a279e937b0e8d0c02c84f2aee0f">CC / BTC</a></td>
|
|
<td colspan="2"><a href="https://mastodon.cloud/@marc_beninca">Mastodon</a></td>
|
|
<td colspan="2"><a href="https://discord.gg/v6p7CtZ4Zh">Discord</a></td>
|
|
</tr><tr>
|
|
<td><a href="https://keybase.io/marc_beninca/sigchain#db059a1ab2a2916feb763535ae0aec75e5401f1eac8452d09b7bc3ad24512c670f">CC / ZEC</a></td>
|
|
<td colspan="2"><a href="https://gitlab.com/marc.beninca">GitLab</a></td>
|
|
<td><a href="https://youtube.com/@marc.beninca">YouTube</a></td>
|
|
</tr><tr>
|
|
<td><a href="https://dmoj.ca/user/marc_beninca">DMOJ</a></td>
|
|
<td colspan="2"><a href="https://devs.live/users/marc_beninca">Pleroma</a></td>
|
|
<td><a href="https://facebook.com/marc.beninca.page">FaceBook</a></td>
|
|
</tr><tr>
|
|
<td><a href="https://galactictalk.org/u/marc_beninca">GalacticTalk</a></td>
|
|
<td><a href="https://pixelfed.social/marc.beninca">PixelFed</a></td>
|
|
<td><a href="https://openstreetmap.org/user/Marc Beninca">OpenStreetMap</a></td>
|
|
<td><a href="https://instagram.com/marc.beninca">Instagram</a></td>
|
|
</tr><tr>
|
|
<td colspan="2"><a href="https://reddit.com/user/marc_beninca">Reddit</a></td>
|
|
<td><a href="https://twitch.tv/marc_beninca">Twitch</a></td>
|
|
<td><a href="https://vimeo.com/marcbeninca">Vimeo</a></td>
|
|
</tr><tr>
|
|
<td colspan="4"><a href="https://twitter.com/marc_beninca">Twitter</a></td>
|
|
</tr><tr>
|
|
<td colspan="2"><a href="https://news.ycombinator.com/user?id=marc_beninca">HackerNews</a></td>
|
|
<td><a href="https://bitbucket.org/marc_beninca">BitBucket</a></td>
|
|
</tr><tr>
|
|
<td /><td><a href="https://lobste.rs/u/marc_beninca">Lobsters</a></td>
|
|
<td><a href="https://linuxfr.org/users/marc-beninca">LinuxFR</a></td>
|
|
</tr><tr>
|
|
<td colspan="3"><a href="https://github.com/marc-beninca">GitHub</a></td>
|
|
</tr>
|
|
|
|
<tr><th colspan="2">DNS</th></tr>
|
|
|
|
<tr><td colspan="2"><a href="https://beninca.link">beninca.link</a></td></tr>
|
|
<tr><td colspan="2">computing.land</td></tr>
|
|
<tr><td colspan="2">marc-beninca.fr</td></tr>
|
|
<tr><td colspan="2"><a href="https://rwx.work">rwx.work</a></td></tr>
|
|
<tr><td colspan="2"><a href="https://tilde.link">tilde.link</a></td></tr>
|
|
|
|
<tr><th /><th>GitLab</th></tr>
|
|
|
|
<tr><td /><td><a href="https://salsa.debian.org/marc.beninca">Debian</a></td></tr>
|
|
<tr><td /><td><a href="https://framagit.org/marc.beninca">FramaGit</a></td></tr>
|
|
<tr><td /><td><a href="https://lab.frogg.it/marc.beninca">FrogGit</a></td></tr>
|
|
<tr><td /><td><a href="https://gitgud.io/marc.beninca">GitGud</a></td></tr>
|
|
<tr><td /><td><a href="https://git.insomnia247.nl/marc.beninca">Insomnia</a></td></tr>
|
|
|
|
<tr><th /><th>Gitea</th></tr>
|
|
|
|
<tr><td /><td><a href="https://git.42l.fr/marc.beninca">42l</a></td></tr>
|
|
<tr><td /><td><a href="https://git.afpy.org/marc.beninca">AFPy</a></td></tr>
|
|
<tr><td /><td><a href="https://forge.chapril.org/marc.beninca">Chapril</a></td></tr>
|
|
<tr><td /><td><a href="https://codeberg.org/marc.beninca">CodeBerg</a></td></tr>
|
|
<tr><td /><td><a href="https://git.disroot.org/marc.beninca">DisRoot</a></td></tr>
|
|
<tr><td /><td><a href="https://git.envs.net/marc.beninca">Envs</a></td></tr>
|
|
<tr><td /><td><a href="https://git.froggi.es/marc.beninca">Froggies</a></td></tr>
|
|
<tr><td /><td><a href="https://git.fsfe.org/marc.beninca">FSFE</a></td></tr>
|
|
<tr><td /><td><a href="https://gitdab.com/marc.beninca">GitDab</a></td></tr>
|
|
<tr><td /><td><a href="https://gitea.com/marc.beninca">Gitea</a></td></tr>
|
|
<tr><td /><td><a href="https://gitnet.fr/marc.beninca">GitNet</a></td></tr>
|
|
<tr><td /><td><a href="https://git.projectsegfau.lt/marc.beninca">ProjectSegfault</a></td></tr>
|
|
<!--<tr><td /><td><a href="https://silica.codes/marc.beninca">SilicaCodes</a></td></tr>-->
|
|
<tr><td /><td><a href="https://tildegit.org/marc.beninca">TildeGit</a></td></tr>
|
|
|
|
<tr><th /><th><a href="https://stackexchange.com/users/27893631">StackExchange</a></th></tr>
|
|
|
|
<tr><td /><td><a href="https://meta.stackexchange.com/users/1332957">Meta</a></td></tr>
|
|
<tr><td /><td><a href="https://serverfault.com/users/1007137">ServerFault</a></td></tr>
|
|
<tr><td /><td><a href="https://stackoverflow.com/users/21299988">StackOverflow</a></td></tr>
|
|
<tr><td /><td><a href="https://tex.stackexchange.com/users/291075">TeX</a></td></tr>
|
|
<tr><td /><td><a href="https://unix.stackexchange.com/users/562508">Unix</a></td></tr>
|
|
|
|
</table>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'learn': f'''\
|
|
<ul>
|
|
<li><a href="https://roadmap.sh">Roadmap</a></li>
|
|
<li><a href="https://teachyourselfcs.com">Teach Yourself Computer Science</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@ExternCode/videos">Extern Code</a></li>
|
|
<li><a href="https://www.youtube.com/@freecodecamp/videos">FreeCodeCamp</a></li>
|
|
<li><a href="https://debian-facile.org/projets/lescahiersdudebutant">Les cahiers du débutant sur Debian</a></li>
|
|
<li><a href="https://www.youtube.com/@SimplicodeOfficial/videos">SimpliCode</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://overthewire.org">Over The Wire</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'links': f'''\
|
|
<ul>
|
|
<li><a href="https://marc-beninca.8b.io">8bio</a></li>
|
|
<li><a href="https://allmylinks.com/marc-beninca">AllMyLinks</a></li>
|
|
<li><a href="https://beacons.ai/marc.beninca">Beacons</a></li>
|
|
<li><a href="https://biglink.to/marc_beninca">BigLinkTo</a></li>
|
|
<li><a href="https://bioin.link/marc.beninca">BioInLink</a></li>
|
|
<li><a href="https://marc_beninca.bio.link">Bio.Link</a></li>
|
|
<li><a href="https://biolinky.co/marcbeninca">BioLinky</a></li>
|
|
<li><a href="https://marc_beninca.c8ke.com">C8ke</a></li>
|
|
<li><a href="https://campsite.bio/marc.beninca">CampSite</a></li>
|
|
<li><a href="https://marc-beninca.carrd.co">Carrd</a></li>
|
|
<li><a href="https://direct.me/marc_beninca">DirectMe</a></li>
|
|
<li><a href="https://everlink.tools/marc.beninca">EverLink</a></li>
|
|
<li><a href="https://feedlink.io/marcbeninca">FeedLink</a></li>
|
|
<li><a href="https://flow.page/marc.beninca">FlowPage</a></li>
|
|
<li><a href="https://heylink.me/marc.beninca">HeyLinkMe</a></li>
|
|
<li><a href="https://hy.page/marcbeninca">HyPage</a></li>
|
|
<li><a href="https://ichi.gg/marc.beninca">Ichi.GG</a></li>
|
|
<li><a href="https://linkfly.to/marc-beninca">LinkFly</a></li>
|
|
<li><a href="https://instabio.cc/marc-beninca">LinkInBio</a></li>
|
|
<li><a href="https://linkpluto.com/marc-beninca">LinkPluto</a></li>
|
|
<li><a href="https://linkpop.com/marc-beninca">LinkPop</a></li>
|
|
<li><a href="https://linkr.bio/marc.beninca">Linkr.Bio</a></li>
|
|
<li><a href="https://linksight.me/marc_beninca">LinkSight</a></li>
|
|
<li><a href="https://link.space/@marc_beninca">LinkSpace</a></li>
|
|
<li><a href="https://linktr.ee/marc.beninca">LinkTree</a></li>
|
|
<li><a href="https://lnk.bio/marc.beninca">Lnk.Bio</a></li>
|
|
<li><a href="https://lu.ma/marc.beninca">Luma</a></li>
|
|
<li><a href="https://nano.site/marc.beninca">NanoSite</a></li>
|
|
<li><a href="https://marcbeninca.podia.com">Podia</a></li>
|
|
<li><a href="https://solo.to/marc.beninca">SoloTo</a></li>
|
|
<li><a href="https://marc-beninca.start.page">StartPage</a></li>
|
|
<li><a href="https://tap.bio/marc.beninca">Tap.Bio</a></li>
|
|
<li><a href="https://marc-beninca.taplink.ws">TapLink</a></li>
|
|
<li><a href="https://url.bio/marc_beninca">URL.Bio</a></li>
|
|
<li><a href="https://vu.fr/marc-beninca">Vu.Fr</a></li>
|
|
<li><a href="https://withkoji.com/@marc.beninca">WithKoji</a></li>
|
|
<li><a href="https://zaap.bio/marc.beninca">Zaap</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'mirrors': f'''\
|
|
<ul>
|
|
<li><a href="https://marc.beninca.link">marc.beninca.link</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<!--<li><a href="https://aussies.space/~mspe">aussies.space</a></li>-->
|
|
<li><a href="https://mspe.u.blinkenshell.org">blinkenshell.org</a></li>
|
|
<li><a href="https://ctrl-c.club/~mspe">ctrl-c.club</a></li>
|
|
<li><a href="https://mspe.dimension.sh">dimension.sh</a></li>
|
|
<li><a href="https://mspe.envs.net">envs.net</a></li>
|
|
<li><a href="https://freeshell.de/~mspe">freeshell.de</a></li>
|
|
<li><a href="https://heathens.club/~mspe">heathens.club</a></li>
|
|
<li><a href="https://mspe.insomnia247.nl">insomnia247.nl</a></li>
|
|
<li><a href="https://mspe.p.projectsegfau.lt">projectsegfau.lt</a></li>
|
|
<li><a href="https://sites.pubnix.pink/~mspe">pubnix.pink</a></li>
|
|
<li><a href="https://rawtext.club/~mspe">rawtext.club</a></li>
|
|
<li><a href="https://mspe.remotes.club">remotes.club</a></li>
|
|
<li><a href="https://rw.rs/~mspe">rw.rs</a></li>
|
|
<li><a href="https://squiggle.city/~mspe">squiggle.city</a></li>
|
|
<li><a href="https://thunix.net/~mspe">thunix.net</a></li>
|
|
<li><a href="https://tilde.32bit.cafe/~mspe">tilde.32bit.cafe</a></li>
|
|
<li><a href="https://mspe.tilde.cafe">tilde.cafe</a></li>
|
|
<li><a href="https://tilde.club/~mspe">tilde.club</a></li>
|
|
<li><a href="https://tilde.fun/~mspe">tilde.fun</a></li>
|
|
<li><a href="https://tilde.green/~mspe">tilde.green</a></li>
|
|
<li><a href="https://tilde.guru/~mspe">tilde.guru</a></li>
|
|
<li><a href="https://mspe.tilde.institute">tilde.institute</a></li>
|
|
<li><a href="https://tilde.pink/~mspe">tilde.pink</a></li>
|
|
<li><a href="https://mspe.tilde.team">tilde.team</a></li>
|
|
<li><a href="https://tilde.town/~mspe">tilde.town</a></li>
|
|
<li><a href="https://trash.town/~mspe">trash.town</a></li>
|
|
<li><a href="https://mspe.vern.cc">vern.cc</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://mspe.fr.tild3.org">fr.tild3.org</a></li>
|
|
<li><a href="https://mspe.hextilde.xyz">hextilde.xyz</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'music': f'''\
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/watch?v=_ITiwPMUzho">3 AM Coding Session</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@Daniellabjarnhof/videos">Daniella Bjarnhof</a></li>
|
|
<li><a href="https://www.youtube.com/@DJGroove/videos">DJ Groove</a></li>
|
|
<li><a href="https://www.youtube.com/@flavourtrip/videos">Flavour Trip</a></li>
|
|
<li><a href="https://www.youtube.com/@garsimusic/videos">Garsi</a></li>
|
|
<li><a href="https://www.youtube.com/@jabig/videos">Ja Big</a></li>
|
|
<li><a href="https://www.youtube.com/@johnny_m/videos">Johnny M (GR)</a></li>
|
|
<li><a href="https://www.youtube.com/@johnnymgrchannelc3145/videos">Johnny M (GR) (Channel C')</a></li>
|
|
<li><a href="https://www.youtube.com/@djmissmonique/videos">Miss Monique</a></li>
|
|
<li><a href="https://www.youtube.com/@DJRaphaelPPRV/videos">Raphael</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/watch?v=lP26UCnoH9s">Coffee Shop Radio</a></li>
|
|
<li><a href="https://www.youtube.com/watch?v=8wHjuR2gagI">Sad songs for sad people</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="http://radio.garden/visit/pessac">Radio Garden</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'profiles': f'''\
|
|
<ul class="cards">
|
|
<li class="card"><a href="https://keyoxide.org/08EDA7006234A0EB29A3A8471DBD5EC4BADA5579">
|
|
<img src="img/KeyOxide.png" /><br />KeyOxide</a></li>
|
|
<li class="card"><a href="https://peertube.iriseden.eu/c/marc.beninca">
|
|
<img src="img/PeerTube.png" /><br />PeerTube</a></li>
|
|
<li class="card"><a href="https://pixelfed.social/marc.beninca">
|
|
<img src="img/PixelFed.svg" /><br />PixelFed</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul class="cards">
|
|
<li class="card"><a href="https://linkedin.com/in/marc-beninca">
|
|
<img src="img/LinkedIn.png" /><br />LinkedIn</a></li>
|
|
<li class="card"><a href="https://youtube.com/@marc.beninca">
|
|
<img src="img/YouTube.png" /><br />YouTube</a></li>
|
|
<li class="card"><a href="https://instagram.com/marc.beninca">
|
|
<img src="img/InstaGram.png" /><br />InstaGram</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'lsgm': f'''\
|
|
<h1>Live Scan Grub Menu</h1>
|
|
Setup a whole EFI System Partition:
|
|
<ul>
|
|
<li>generate customized GRUB EFI & BIOS images</li>
|
|
<li>scan data partition(s) for SquashFS image files</li>
|
|
<li>display generated boot menu</li>
|
|
<li>live boot selected kernel, initial ramdisk and file system image</li>
|
|
</ul>
|
|
BASH experimenting:
|
|
<ul>
|
|
<li><a href="https://youtu.be/mx2lhm7qClc">2023/05/04: 1st boot into QCOW storage with encrypted data partition</a></li>
|
|
</ul>
|
|
''',
|
|
'ofsp': f'''\
|
|
<h1>Operating File System Profile</h1>
|
|
Build from mirror a full operating system bootable file image:
|
|
<ul>
|
|
<li>bootstrap base file system</li>
|
|
<li>configure common core basics</li>
|
|
<li>install TUI packages</li>
|
|
<li>install GUI packages</li>
|
|
<li>copy kernel and initial ramdisk for bootloader</li>
|
|
<li>archive final file system as SquashFS file</li>
|
|
</ul>
|
|
BASH experimenting:
|
|
<ul>
|
|
<li><a href="https://youtu.be/phArr81weUw">2023/07/27: 3rd party repos, repoless .deb, tarball archives</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://youtu.be/5Isf02MKFgM">2023/07/20: both TUI and GUI images</a></li>
|
|
<li><a href="https://youtu.be/YhoY2gisXg4">2023/06/20: Graphical User Interface too</a></li>
|
|
<li><a href="https://youtu.be/PSHswxc9oU8">2023/06/13: Textual User Interface only</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'pubnix': f'''\
|
|
<ul>
|
|
<li><a href="https://blinkenshell.org">blinkenshell.org</a></li>
|
|
<li><a href="https://ctrl-c.club">ctrl-c.club</a></li>
|
|
<li><a href="https://dimension.sh">dimension.sh</a></li>
|
|
<li><a href="https://envs.net">envs.net</a></li>
|
|
<li><a href="https://freeshell.de">freeshell.de</a></li>
|
|
<li><a href="https://heathens.club">heathens.club</a></li>
|
|
<li><a href="https://insomnia247.nl">insomnia247.nl</a></li>
|
|
<li><a href="https://projectsegfau.lt">projectsegfau.lt</a></li>
|
|
<li><a href="https://pubnix.pink">pubnix.pink</a></li>
|
|
<li><a href="https://rawtext.club">rawtext.club</a></li>
|
|
<li><a href="https://remotes.club">remotes.club</a></li>
|
|
<li><a href="https://rw.rs">rw.rs</a></li>
|
|
<li><a href="https://squiggle.city">squiggle.city</a></li>
|
|
<li><a href="https://thunix.net">thunix.net</a></li>
|
|
<li><a href="https://tilde.32bit.cafe">tilde.32bit.cafe</a></li>
|
|
<li><a href="https://tilde.cafe">tilde.cafe</a></li>
|
|
<li><a href="https://tilde.club">tilde.club</a></li>
|
|
<li><a href="https://tilde.fun">tilde.fun</a></li>
|
|
<li><a href="https://tilde.green">tilde.green</a></li>
|
|
<li><a href="https://tilde.guru">tilde.guru</a></li>
|
|
<li><a href="https://tilde.institute">tilde.institute</a></li>
|
|
<li><a href="https://tilde.pink">tilde.pink</a></li>
|
|
<li><a href="https://tilde.team">tilde.team</a></li>
|
|
<li><a href="https://tilde.town">tilde.town</a></li>
|
|
<li><a href="https://trash.town">trash.town</a></li>
|
|
<li><a href="https://vern.cc">vern.cc</a></li>
|
|
</ul><ul>
|
|
<li><a href="https://sdf.org">sdf.org</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li><a href="https://tilde.fans">tilde.fans</a></li>
|
|
</ul>
|
|
<ul>
|
|
<li><a href="http://hackers.cool">hackers.cool</a></li>
|
|
<li><a href="http://pebble.ink">pebble.ink</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li><a href="https://bonn.cafe">bonn.cafe</a></li>
|
|
<li><a href="https://cosmic.voyage">cosmic.voyage</a></li>
|
|
<li><a href="https://fromhell.ee">fromhell.ee</a></li>
|
|
<li><a href="https://piepi.art">piepi.art</a></li>
|
|
<li><a href="https://skylab.org">skylab.org</a></li>
|
|
<li><a href="https://tar.black">tar.black</a></li>
|
|
<li><a href="https://texto-plano.xyz">texto-plano.xyz</a></li>
|
|
<li><a href="https://tilde.pt">tilde.pt</a></li>
|
|
<li><a href="https://xinu.me">xinu.me</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li><a href="https://aussies.space">aussies.space</a></li>
|
|
<li><a href="https://palvelin.club">palvelin.club</a></li>
|
|
<li><a href="https://protocol.club">protocol.club</a></li>
|
|
<li><a href="https://theasylum.team">theasylum.team</a></li>
|
|
<li><a href="https://tilde.red">tilde.red</a></li>
|
|
<li><a href="https://ttylde.karx.xyz">ttylde.karx.xyz</a></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<ul>
|
|
<li><a href="https://fr.tild3.org">fr.tild3.org</a></li>
|
|
<li><a href="https://hextilde.xyz">hextilde.xyz</a></li>
|
|
<li><a href="https://tilde.one">tilde.one</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'social': f'''\
|
|
<ul>
|
|
<li><a href="https://calckey.org">Calckey</a></li>
|
|
<li><a href="https://joinmastodon.org">Mastodon</a></li>
|
|
<li><a href="https://pixelfed.org">Pixelfed</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://bsky.app">Bluesky</a></li>
|
|
<li><a href="https://revolt.chat">Revolt</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://discord.com">Discord</a></li>
|
|
<li><a href="https://www.facebook.com">FaceBook</a></li>
|
|
<li><a href="https://www.instagram.com">InstaGram</a></li>
|
|
<li><a href="https://www.linkedin.com">LinkedIn</a></li>
|
|
<li><a href="https://www.reddit.com">Reddit</a></li>
|
|
<li><a href="https://www.tiktok.com">TikTok</a></li>
|
|
<li><a href="https://www.twitch.tv">Twitch</a></li>
|
|
<li><a href="https://twitter.com">Twitter</a></li>
|
|
<li><a href="https://www.youtube.com">YouTube</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://nextdoor.com">NextDoor</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'software': f'''\
|
|
<ul>
|
|
<li><a href="https://developer.puri.sm/Librem5">Librem 5</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://docs.zfsbootmenu.org">ZFS Boot Menu</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://carbon.sh">CarbonOS</a></li>
|
|
<li><a href="https://fedoraproject.org/silverblue">Fedora Silverblue</a></li>
|
|
<li><a href="https://www.flatcar.org">Flatcar Container Linux</a></li>
|
|
<li><a href="https://nixos.org">NixOS</a></li>
|
|
<li><a href="https://guix.gnu.org">Guix</a></li>
|
|
<li><a href="https://microos.opensuse.org">OpenSUSE MicroOS</a></li>
|
|
<li><a href="https://vanillaos.org">Vanilla OS</a></li>
|
|
<li><a href="https://github.com/bottlerocket-os/bottlerocket">Bottlerocket OS</a></li>
|
|
<li><a href="https://blendos.co">BlendOS</a></li>
|
|
<li><a href="https://www.talos.dev">Talos Linux</a></li>
|
|
<li><a href="https://www.endlessos.org/os">Endless OS</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'style': f'''\
|
|
<ul>
|
|
<li><input type="checkbox" id="dark" onclick="swap()">Dark</input></li>
|
|
<li><input type="checkbox" id="debug" onclick="debug()">Debug</input></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'tasks': f'''\
|
|
<ul>
|
|
<li>categorize music</li>
|
|
</ul>
|
|
<ul>
|
|
<li>fix dark switch</li>
|
|
<li>style list items</li>
|
|
<li>switch fonts</li>
|
|
<li>use CSS variables</li>
|
|
</ul>
|
|
<ul>
|
|
<li>implement search</li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'tbm': f'''\
|
|
<ul class="cards">
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/1224">Bertin → B</a></li>
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7">Bertin → V</a></li>
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/624">Caserne Nansouty → V</a></li>
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7981">Caserne Nansouty → B</a></li>
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7802">Médiathèque → V</a></li>
|
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/371">Peixotto → V</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'trips': f'''\
|
|
<ul>
|
|
<li>Estonia</li>
|
|
<li>Germany</li>
|
|
<li>Japan</li>
|
|
<li>Netherlands</li>
|
|
<li>Switzerland</li>
|
|
<li>United States of America<ul>
|
|
<li>California<ul>
|
|
<li>Los Angeles</li>
|
|
<li>San Francisco</li>
|
|
</ul></li>
|
|
<li>Georgia</li>
|
|
<li>Hawaii</li>
|
|
<li>Indiana</li>
|
|
<li>Kentucky</li>
|
|
<li>New York</li>
|
|
<li>Ohio</li>
|
|
<li>Tennessee</li>
|
|
</ul></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'vegan': f'''\
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@CheapLazyVegan/videos">Cheap Lazy Vegan</a></li>
|
|
<li><a href="https://www.youtube.com/@gazoakleychef/videos">Gaz Oakley</a></li>
|
|
<li><a href="https://www.youtube.com/@MerleONeal/videos">Merle O'Neal</a></li>
|
|
<li><a href="https://www.youtube.com/@peacefulcuisine/videos">Peaceful Cuisine</a></li>
|
|
<li><a href="https://www.youtube.com/@PickUpLimes/videos">Pick Up Limes</a></li>
|
|
<li><a href="https://www.youtube.com/@RainbowPlantLife/videos">Rainbow Plant Life</a></li>
|
|
<li><a href="https://www.youtube.com/@TheKoreanVegan/videos">The Korean Vegan</a></li>
|
|
<li><a href="https://www.youtube.com/@Thevietvegan/videos">The Viet Vegan</a></li>
|
|
<li><a href="https://www.youtube.com/@YEUNGMANCOOKING/videos">Yeung Man Cooking</a></li>
|
|
</ul>
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@SauceStache/videos">Sauce Stache</a></li>
|
|
<li><a href="https://www.youtube.com/@TheeBurgerDude/videos">Thee Burger Dude</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://www.youtube.com/@doucefrugalite/videos">Douce frugalité</a></li>
|
|
<li><a href="https://www.youtube.com/@Evalespetitsplats/videos">Eva les petits plats</a></li>
|
|
<li><a href="https://www.youtube.com/@LapetiteOkara/videos">La petite Okara</a></li>
|
|
<li><a href="https://www.youtube.com/@MarieSweetandSour/videos">Marie Sweet and Sour</a></li>
|
|
<li><a href="https://www.youtube.com/@SebastienKardinal/videos">Sébastien Kardinal</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'others': f'''\
|
|
<ul>
|
|
<li><a href="https://bsky.app/profile/marc-beninca.bsky.social">Blue Sky</a></li>
|
|
<li><a href="https://buymeacoffee.com/marc.beninca">Buy Me A Coffee</a></li>
|
|
<li><a href="https://cohost.org/marc-beninca">CoHost</a></li>
|
|
<li><a href="https://dev.to/marc_beninca">Dev</a></li>
|
|
<li><a href="https://diaspora-fr.org/people/00f4f8e04b11013b46b20025900e4586">Diaspora</a></li>
|
|
<li><a href="https://flattr.com/@marc.beninca">Flattr</a></li>
|
|
<li><a href="https://giftapp.com/marc_beninca">GiftApp</a></li>
|
|
<li><a href="https://hashnode.com/@marc-beninca">HashNode</a></li>
|
|
<li><a href="https://medium.com/@marc-beninca">Medium</a></li>
|
|
<li><a href="https://marc-beninca.micro.blog/about">MicroBlog</a></li>
|
|
<li><a href="https://minds.com/marc_beninca">Minds</a></li>
|
|
<li><a href="https://odysee.com/@marc.beninca">Odysee</a></li>
|
|
<li><a href="https://paypal.me/MarcBeninca">PayPal</a></li>
|
|
<li><a href="https://peertube.iriseden.eu/a/marc_beninca">PeerTube</a></li>
|
|
<li><a href="https://pinterest.com/marc_beninca">Pinterest</a></li>
|
|
<li><a href="https://marcbeninca.podia.com">Podia</a></li>
|
|
<li><a href="https://app.revolt.chat/invite/01FREKCG3P2P0YMAHQSCPSW4GD">Revolt</a></li>
|
|
<li><a href="https://tiktok.com/@marc.beninca">TikTok</a></li>
|
|
<li><a href="https://twtxt.net/user/marc_beninca">YarnSocial</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="https://dlive.tv/marc.beninca">Dlive</a></li>
|
|
<li><a href="https://kick.com/marc_beninca">Kick</a></li>
|
|
</ul>
|
|
<hr />
|
|
<ul>
|
|
<li><a href="">KissBank</a></li>
|
|
</ul>
|
|
''',
|
|
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
|
'unsorted': f'''\
|
|
<ul>
|
|
<li><a href="https://foss.events">FOSS Events</a></li>
|
|
</ul>
|
|
''',
|
|
}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|