diff --git a/.forgejo/workflows/main.yaml b/.forgejo/workflows/main.yaml index 0d10297..e816e02 100644 --- a/.forgejo/workflows/main.yaml +++ b/.forgejo/workflows/main.yaml @@ -14,7 +14,7 @@ jobs: SPCD_TXT_LOCALE: ${{vars.SPCD_TXT_LOCALE}} run: ${{vars.SPCD}} - - run: spcd-check-project + #- run: spcd-check-project - run: spcd-build-project - run: spcd-browse-workspace - run: spcd-synchronize diff --git a/.gitignore b/.gitignore index e2e7327..0f8b689 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +__pycache__ /out diff --git a/build.py b/build.py index 3f13417..033a761 100755 --- a/build.py +++ b/build.py @@ -1,36 +1,916 @@ #! /usr/bin/env python3 -"""Build resume.""" -from os import sep -from pathlib import Path +import datetime +import os +import shutil +import subprocess -from rwx import fs -from rwx.ps import run -if __name__ == "__main__": - root = Path(__file__).resolve().parent - root_input = root / "in" - root_output = root / "out" - web = root_output / "web" - fs.wipe(root_output) - fs.make_directory(web) - run( - "rsync", - "--archive", - "--partial", - "--progress", - "--verbose", - f"{root_input}{sep}", - f"{web}{sep}", - ) - run( - "qrencode", - ("--background", "00000000"), - ("--foreground", "000000FF"), - ("--level", "L"), - ("--margin", "1"), - ("--read-from", str(root_input / "marc.beninca.vcf")), - ("--size", "4"), - ("-t", "SVG"), - ("--output", str(web / "img" / "marc.beninca.svg")), - ) +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) + os.makedirs(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) + # + 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'''\ + + + + + + + + + + +Marc Beninca + + + + +
+ +
+ + +
+ + + +
{tabs['cv']}
+ + +
{tabs['profiles']}
+ + +
+ + +
{tabs['lsgm']}
+ + +
{tabs['ofsp']}
+
+ + +
{tabs['tasks']}
+ + +
{tabs['trips']}
+ + +
+ + +
{tabs['id']}
+ + +
{tabs['links']}
+ + +
{tabs['repos']}
+ + +
{tabs['others']}
+
+
+ + +
{tabs['learn']}
+ + +
{tabs['music']}
+ + +
+ + +
{tabs['books']}
+ + +
{tabs['buy']}
+ + +
{tabs['social']}
+ + +
{tabs['software']}
+
+ + +
+ + +
{tabs['comments']}
+ + +
{tabs['health']}
+ + +
{tabs['vegan']}
+
+ + +
+ + +
{tabs['style']}
+ + +
{tabs['unsorted']}
+
+
+ +
+ + + + + + +''' + 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'''\ +

Marc Beninca

+Welcome to a recap attempt of my IT life! + +

The early days

+In my primary school days I started to interact with computers at home, +mainly Amstrad CPC 464 & 6128 machines.
+It was the occasion for me to: + + +

Diving in

+Right before beginning high school, I was introduced to the PC platform.
+The “system programming PC bible” was my reference for a long time.
+I had the occasion to develop projects in: + + +To be continued… +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'books': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'buy': f'''\ + +
+ +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'comments': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'cv': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'repos': f'''\ +

+ +
+ + + +
+ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'health': f'''\ + + +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'id': f'''\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpenPGP
marc.beninca.link
binary | textual
meta.sr.ht
keys.openpgp.org
KeyOxide
PGP
KeyOxide
ASP
Libera
Pay
PatreonTip
eee
MastodonDiscord
PleromaVimeo
PeerTubeOpenStreetMapYouTube
PixelFedLinuxFRInstagram
WriteFreely
Lemmy
Lobsters
HackerNews
DNS
beninca.link
computing.land
marc-beninca.fr
rwx.work
tilde.link
Git / Forgejo
forge.rwx.work
+''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'learn': f'''\ + +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'links': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'music': f'''\ + +
+ +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'profiles': f'''\ + +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'lsgm': f'''\ +

Live Scan Grub Menu

+Setup a whole EFI System Partition: + +BASH experimenting: + +''', + 'ofsp': f'''\ +

Operating File System Profile

+Build from mirror a full operating system bootable file image: + +BASH experimenting: + +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'social': f'''\ + +
+ +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'software': f'''\ + +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'style': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'tasks': f'''\ + + + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'trips': f'''\ + +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'vegan': f'''\ + + +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'others': f'''\ + +
+ +
+ +''', +#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ + 'unsorted': f'''\ + +''', +} + + +if __name__ == '__main__': + main() diff --git a/cc.html b/cc.html new file mode 100644 index 0000000..eda505c --- /dev/null +++ b/cc.html @@ -0,0 +1,35 @@ + diff --git a/cc/ada b/cc/ada new file mode 100644 index 0000000..3d6b49f --- /dev/null +++ b/cc/ada @@ -0,0 +1 @@ +addr1q8xzhlhssfx0fwd57ha4khf7wtwdmr8rc4lkwnge6xjnskxv90l0pqjv7jumfa0mtdwnuukumkxw83tlvax3n5d98pvqgu558s diff --git a/cc/algo b/cc/algo new file mode 100644 index 0000000..aaecf7b --- /dev/null +++ b/cc/algo @@ -0,0 +1 @@ +7GHLYCLQKIET5XT2OWMAXU6NQKIRFJOWMKUOFON4RABVAA2PUZ2DLCDRLQ diff --git a/cc/ark b/cc/ark new file mode 100644 index 0000000..0779f71 --- /dev/null +++ b/cc/ark @@ -0,0 +1 @@ +AHHRwwELYb2KUjhcnZ4dknHuerdpRLfD4N diff --git a/cc/atom b/cc/atom new file mode 100644 index 0000000..068d885 --- /dev/null +++ b/cc/atom @@ -0,0 +1 @@ +cosmos132qm6ymwft9ck0xaaa9qamyaqq5ckwku98sak2 diff --git a/cc/bch b/cc/bch new file mode 100644 index 0000000..c76470c --- /dev/null +++ b/cc/bch @@ -0,0 +1 @@ +qrqs9yxvnknvma6n8yy79xvlpd4l6kktmv28j35rwj diff --git a/cc/bnb b/cc/bnb new file mode 100644 index 0000000..15141c7 --- /dev/null +++ b/cc/bnb @@ -0,0 +1 @@ +bnb1dezkkkg23fesfaz7jrt6xguuqsan20wz9jgt3d diff --git a/cc/btc b/cc/btc new file mode 100644 index 0000000..1ff9f73 --- /dev/null +++ b/cc/btc @@ -0,0 +1 @@ +bc1qu2qa6m3lkf3cvr5220k4npa77g6endlaf45c3j diff --git a/cc/dash b/cc/dash new file mode 100644 index 0000000..bd9bc15 --- /dev/null +++ b/cc/dash @@ -0,0 +1 @@ +Xx6DuquvMtZHZAuEjPSt175Kmmx3r36Pg3 diff --git a/cc/dgb b/cc/dgb new file mode 100644 index 0000000..4428add --- /dev/null +++ b/cc/dgb @@ -0,0 +1 @@ +DBHEv2ChbeQc7RJGaobMpwejK9tpgmi9FA diff --git a/cc/dot b/cc/dot new file mode 100644 index 0000000..b574f33 --- /dev/null +++ b/cc/dot @@ -0,0 +1 @@ +13Mfiye1NW43JZKmr1MM2GxgJfbVvQFu9Rh3L83UMxYFUmRY diff --git a/cc/egld b/cc/egld new file mode 100644 index 0000000..165a8e9 --- /dev/null +++ b/cc/egld @@ -0,0 +1 @@ +erd1lz5tmvdvspyemykl05u34qqjj3tvkvze5n3hyac38dk37v2ymwasc6gyyg diff --git a/cc/eth b/cc/eth new file mode 100644 index 0000000..fbe78a9 --- /dev/null +++ b/cc/eth @@ -0,0 +1 @@ +0xF9ef31EEea5956Cd193147E7D19b04f45cd9a38D diff --git a/cc/fil b/cc/fil new file mode 100644 index 0000000..08a2da0 --- /dev/null +++ b/cc/fil @@ -0,0 +1 @@ +f1unsj2vjm35jxvrctbvi2wxp2shsbvnvcaurszyq diff --git a/cc/hbar b/cc/hbar new file mode 100644 index 0000000..1d2d877 --- /dev/null +++ b/cc/hbar @@ -0,0 +1 @@ +0.0.892596 diff --git a/cc/icx b/cc/icx new file mode 100644 index 0000000..dfc5515 --- /dev/null +++ b/cc/icx @@ -0,0 +1 @@ +hx02b19ad56ff68d3a0a725b04ef27dbf8996684a8 diff --git a/cc/ltc b/cc/ltc new file mode 100644 index 0000000..ec662f1 --- /dev/null +++ b/cc/ltc @@ -0,0 +1 @@ +LVZGzfx6uPqJeTXPDUrCviBiyxveqvK2WK diff --git a/cc/luna b/cc/luna new file mode 100644 index 0000000..7872a9e --- /dev/null +++ b/cc/luna @@ -0,0 +1 @@ +terra1rw6d6qkwqtlf38ncllt38axgwyu24ezlgx54wr diff --git a/cc/ont b/cc/ont new file mode 100644 index 0000000..597d656 --- /dev/null +++ b/cc/ont @@ -0,0 +1 @@ +AWEjJtRPkwL3VPwvp6G3wd96Z2oqAJ8s6s diff --git a/cc/qtum b/cc/qtum new file mode 100644 index 0000000..a026b66 --- /dev/null +++ b/cc/qtum @@ -0,0 +1 @@ +QWDBhWadR1Xe2frRAZJ58LjzbMMff7udfH diff --git a/cc/sol b/cc/sol new file mode 100644 index 0000000..88bb5fb --- /dev/null +++ b/cc/sol @@ -0,0 +1 @@ +FbDhn6rkT4x1uW6p9XufYwBrHeS53y56Q8vdo2eKb2Zc diff --git a/cc/theta b/cc/theta new file mode 100644 index 0000000..93a44fd --- /dev/null +++ b/cc/theta @@ -0,0 +1 @@ +0x27d77039F7E852c72b15F824842E44A1295cC53A diff --git a/cc/trx b/cc/trx new file mode 100644 index 0000000..a7fa108 --- /dev/null +++ b/cc/trx @@ -0,0 +1 @@ +TAFW2JVYXPfskGaoz4vu1oMwo6B72J2fEE diff --git a/cc/vet b/cc/vet new file mode 100644 index 0000000..6012dd5 --- /dev/null +++ b/cc/vet @@ -0,0 +1 @@ +0x877996962b331c032955fdb80B2AA7D6E78cb0d7 diff --git a/cc/xlm b/cc/xlm new file mode 100644 index 0000000..9ede2c8 --- /dev/null +++ b/cc/xlm @@ -0,0 +1 @@ +GAYZAZU7BZ3PLSBLHMBIARS2NXC77R5TZBHLWX7PZV474FWYOTIXCYTK diff --git a/cc/xmr b/cc/xmr new file mode 100644 index 0000000..8a8a416 --- /dev/null +++ b/cc/xmr @@ -0,0 +1 @@ +43NTvQEtdgTHfvm9vtj3tQDYJL9R3aja1QR98YkY2DgDi8gcWnfCYBJe9qgBerGiu6eE9JM65o8rhHxbNHySUcLf4yxyYpr diff --git a/cc/xno b/cc/xno new file mode 100644 index 0000000..b0bc9fd --- /dev/null +++ b/cc/xno @@ -0,0 +1 @@ +nano_1ade4pu7t6t46xj7ufw99itgxzu873r6exhazz5mddbiz3hje8j614qipw3f diff --git a/cc/xrp b/cc/xrp new file mode 100644 index 0000000..1e949f6 --- /dev/null +++ b/cc/xrp @@ -0,0 +1 @@ +rKyjesfPonKVordBMoiFj3UztMWxCLQ6CV diff --git a/cc/xtz b/cc/xtz new file mode 100644 index 0000000..c2bc73a --- /dev/null +++ b/cc/xtz @@ -0,0 +1 @@ +tz1iLTaChtfT3ZH45DoxrWxyjhRLnFzuLRwu diff --git a/cc/zec b/cc/zec new file mode 100644 index 0000000..0da982b --- /dev/null +++ b/cc/zec @@ -0,0 +1 @@ +t1ceshuxTbpEf6XqCXPbaL1LSazyJUvgVFE diff --git a/cc/zil b/cc/zil new file mode 100644 index 0000000..9eba3bb --- /dev/null +++ b/cc/zil @@ -0,0 +1 @@ +zil13yagsjncsd0xxk8jte43gu9ll8s2ezwes258fl diff --git a/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx b/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx new file mode 120000 index 0000000..41aa63b --- /dev/null +++ b/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx @@ -0,0 +1 @@ +social \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod b/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod new file mode 120000 index 0000000..0899c29 --- /dev/null +++ b/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod @@ -0,0 +1 @@ +git \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/git b/in/.well-known/openpgpkey/hu/git new file mode 120000 index 0000000..687d959 --- /dev/null +++ b/in/.well-known/openpgpkey/hu/git @@ -0,0 +1 @@ +marc \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/marc b/in/.well-known/openpgpkey/hu/marc new file mode 100644 index 0000000..312f125 Binary files /dev/null and b/in/.well-known/openpgpkey/hu/marc differ diff --git a/in/.well-known/openpgpkey/hu/social b/in/.well-known/openpgpkey/hu/social new file mode 120000 index 0000000..687d959 --- /dev/null +++ b/in/.well-known/openpgpkey/hu/social @@ -0,0 +1 @@ +marc \ No newline at end of file diff --git a/in/.well-known/openpgpkey/policy b/in/.well-known/openpgpkey/policy new file mode 100644 index 0000000..e69de29 diff --git a/in/en/index.html b/in/en/index.html deleted file mode 100644 index 67570f9..0000000 --- a/in/en/index.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - - - -Curriculum Vitæ - - - - - - - - - - - -
- - - -
- -
-
-

DevOps

-

Exploring & automating Information Technologies

-
- -
-
    -
  • booting, building, configuring, securing, maintaining systems
  • -
  • modeling, implementing, integrating, deploying, documenting software
  • -
-
- -
-

Experience

- -
- -
-

-

- ← 

-
- -
-
CDAD-BDX logo -
-

Defense Applications Development Center

-

DevOps @ Quality Assurance, CDAD

-
-
-

-

- ← 

-
-
    -
  • administered CI / CD tools: Gitea, GitLab, Jenkins, Nexus, SonarQube
  • -
  • wrote Python scripts to maintain offline mirrors:
    Alma, Alpine, CentOS, Debian, Docker, Maven, MSys2, NPM, NVD, PyPI
  • -
  • wrote & maintained BASH scripts for easier offline usage & packaging of MSys2
  • -
  • wrote Ansible playbooks & roles for configurations & deployments
  • -
  • built Ubuntu LTS Live system images with kiosk graphical interface
  • -
-
- -
-
CDAD-BDX logo -
-

Defense Applications Development Center

-

System Administrator @ Infrastructure & Security, CDAD

-
-
-

-

- ← 

-
-
    -
  • maintained Proxmox & vSphere infrastructures, with VM & LXC containers
  • -
  • designed a SSO architecture: HAproxy, KeyCloak / WildFly, MariaDB Galera
  • -
  • wrote Python scripts for: APT mirrors, Git repos, OpenSSH keypairs, Sphinx docs
  • -
-
- -
-
CDAD-BDX logo -
-

Defense Applications Development Center

-

Software Developer @ Digital Factory, CDAD

-
-
-

-

- ← 

-
-
    -
  • installed a Debian based development network: LXC server, laptops, workstations
  • -
  • wrote BASH & Python scripts for: CloneZilla, Debian, DebMirror, GRUB, PanDoc
  • -
  • wrote Python script to transform all existing code repositories from SVN to Git
  • -
-
- -
- -
- -
-

-

- ← 

-
- -
-
GAIO logo -
-

Operational IT Air Group

-

Java Developer @ Production, GAIO

-
-
-

-

- ← 

-
-
MELISSA NG (MELISSA New Generation)
-Complete reimplementation in Java and PostgreSQL database:
    -
  • designed & implemented a cartographic engine with PNG images & XML metadata
  • -
  • wrote device drivers, emulators & graphical user interfaces for:
      -
    • ADL (Airborne Data Loader) equipment, handling
      -DTM (Data Transfer Module) contactless cards for Alpha Jet onboard computers
    • -
    • simultaneous programming of EEPROM modules for Mirage onboard computers
    • -
    -
  • wrote import of KML / KMZ files to display layers of tactical situations (SITAC)
  • -
-
- -
-
CEAM logo -
-

Military Air Expertise Center

-

Visual Basic Developer @ Production, CEAM

-
-
-

-

- ← 

-
- -
MELISSA (Logical Elaboration Module for Simplified Overflight Info)
-Preparation, programming, unloading & replaying of missions for aircrafts
-Alpha Jet, Transall, Mirage 2000, Mirage F1, Mirage IV, Jaguar:
    -
  • wrote device drivers & graphical user interfaces for:
      -
    • sequential programming of EEPROM modules for Mirage onboard computers
    • -
    • programming & unloading routes for various Garmin GPS devices
    • -
    -
  • wrote import of NavData global database (international standard ARINC 424)
  • -
  • wrote NavData export adapted to Transall onboard computers (FMS) constraints
  • -
- -
- -
EVA (Aircraft Display Screen)
-Onboard display of navigation & video recorders for Mirage F1CR aircrafts:
    -
  • optimized cartographic engine for embedded computers (PC/104)
  • -
  • designed & built a dedicated system with Windows XP Embedded Studio
  • -
- -
- -
- -
- -
-

Personal Projects

- -
- -
-

-

- ← 

-
-

Python & POSIX Shell parent project

- -
-
-

Shell to Python Continuous Deployment

-

SPCD: code @ forge.rwx.work

-
-
-

-

- ← 

-
-POSIX Shell & Python program handling CI / CD workflows in a unified way:
    -
  • whether the network infrastructure is online or offline with custom CA & DNS
  • -
  • whatever the forge: Forgejo, Gitea, GitHub, GitLab
  • -
  • whatever the Docker container’s Linux system base:
    -Alma, Alpine, Arch, Debian, Fedora, OpenSUSE, Rocky, Ubuntu
  • -
-
- -
-
-

Live Scan Grub Menu

-

LSGM: code @ forge.rwx.work

-
-
-

-

- ← 

-
-BASH & GRUB Shell program building ESP File Systems with:
    -
  • Secure Boot or custom ARM, EFI & BIOS standalone GRUB images
  • -
  • on-the-fly OpenPGP signature checking of selected images
  • -
  • dynamic menu scanning available Live bootable SquashFS images
  • -
-
- -
- -
- -
- - -
- - - diff --git a/in/fonts/forkawesome-webfont.css b/in/fonts/forkawesome-webfont.css deleted file mode 100644 index 2ad41f6..0000000 --- a/in/fonts/forkawesome-webfont.css +++ /dev/null @@ -1,2733 +0,0 @@ -/*! -Fork Awesome 1.2.0 -License - https://forkaweso.me/Fork-Awesome/license - -Copyright 2018 Dave Gandy & Fork Awesome - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'ForkAwesome'; - src: url('../fonts/forkawesome-webfont.eot?v=1.2.0'); - src: url('../fonts/forkawesome-webfont.eot?#iefix&v=1.2.0') format('embedded-opentype'), url('../fonts/forkawesome-webfont.woff2?v=1.2.0') format('woff2'), url('../fonts/forkawesome-webfont.woff?v=1.2.0') format('woff'), url('../fonts/forkawesome-webfont.ttf?v=1.2.0') format('truetype'), url('../fonts/forkawesome-webfont.svg?v=1.2.0#forkawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 ForkAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eee; - border-radius: .1em; -} -.fa-pull-left { - float: left; -} -.fa-pull-right { - float: right; -} -.fa.fa-pull-left { - margin-right: .3em; -} -.fa.fa-pull-right { - margin-left: .3em; -} -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #fff; -} -/* Fork Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-sync:before, -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video:before, -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-feed:before, -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell-o:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-globe-e:before { - content: "\f304"; -} -.fa-globe-w:before { - content: "\f305"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-community:before, -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus-g:before, -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-utensils:before, -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-pound:before, -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-down:before, -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-up:before, -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-down:before, -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-up:before, -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-down:before, -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-up:before, -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-utensil-spoon:before, -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-resistance:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-y-combinator-square:before, -.fa-yc-square:before, -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-heading:before, -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-closed-captioning:before, -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-gem:before, -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-intersex:before, -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-genderless:before { - content: "\f22d"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} -.fa-medium-square:before { - content: "\f2f8"; -} -.fa-yc:before, -.fa-y-combinator:before { - content: "\f23b"; -} -.fa-optin-monster:before { - content: "\f23c"; -} -.fa-opencart:before { - content: "\f23d"; -} -.fa-expeditedssl:before { - content: "\f23e"; -} -.fa-battery-4:before, -.fa-battery:before, -.fa-battery-full:before { - content: "\f240"; -} -.fa-battery-3:before, -.fa-battery-three-quarters:before { - content: "\f241"; -} -.fa-battery-2:before, -.fa-battery-half:before { - content: "\f242"; -} -.fa-battery-1:before, -.fa-battery-quarter:before { - content: "\f243"; -} -.fa-battery-0:before, -.fa-battery-empty:before { - content: "\f244"; -} -.fa-mouse-pointer:before { - content: "\f245"; -} -.fa-i-cursor:before { - content: "\f246"; -} -.fa-object-group:before { - content: "\f247"; -} -.fa-object-ungroup:before { - content: "\f248"; -} -.fa-sticky-note:before { - content: "\f249"; -} -.fa-sticky-note-o:before { - content: "\f24a"; -} -.fa-cc-jcb:before { - content: "\f24b"; -} -.fa-cc-diners-club:before { - content: "\f24c"; -} -.fa-clone:before { - content: "\f24d"; -} -.fa-balance-scale:before { - content: "\f24e"; -} -.fa-hourglass-o:before { - content: "\f250"; -} -.fa-hourglass-1:before, -.fa-hourglass-start:before { - content: "\f251"; -} -.fa-hourglass-2:before, -.fa-hourglass-half:before { - content: "\f252"; -} -.fa-hourglass-3:before, -.fa-hourglass-end:before { - content: "\f253"; -} -.fa-hourglass:before { - content: "\f254"; -} -.fa-hand-grab-o:before, -.fa-hand-rock-o:before { - content: "\f255"; -} -.fa-hand-stop-o:before, -.fa-hand-paper-o:before { - content: "\f256"; -} -.fa-hand-scissors-o:before { - content: "\f257"; -} -.fa-hand-lizard-o:before { - content: "\f258"; -} -.fa-hand-spock-o:before { - content: "\f259"; -} -.fa-hand-pointer-o:before { - content: "\f25a"; -} -.fa-hand-peace-o:before { - content: "\f25b"; -} -.fa-trademark:before { - content: "\f25c"; -} -.fa-registered:before { - content: "\f25d"; -} -.fa-creative-commons:before { - content: "\f25e"; -} -.fa-gg:before { - content: "\f260"; -} -.fa-gg-circle:before { - content: "\f261"; -} -.fa-tripadvisor:before { - content: "\f262"; -} -.fa-odnoklassniki:before { - content: "\f263"; -} -.fa-odnoklassniki-square:before { - content: "\f264"; -} -.fa-get-pocket:before { - content: "\f265"; -} -.fa-wikipedia-w:before { - content: "\f266"; -} -.fa-safari:before { - content: "\f267"; -} -.fa-chrome:before { - content: "\f268"; -} -.fa-firefox:before { - content: "\f269"; -} -.fa-opera:before { - content: "\f26a"; -} -.fa-internet-explorer:before { - content: "\f26b"; -} -.fa-tv:before, -.fa-television:before { - content: "\f26c"; -} -.fa-contao:before { - content: "\f26d"; -} -.fa-500px:before { - content: "\f26e"; -} -.fa-amazon:before { - content: "\f270"; -} -.fa-calendar-plus-o:before { - content: "\f271"; -} -.fa-calendar-minus-o:before { - content: "\f272"; -} -.fa-calendar-times-o:before { - content: "\f273"; -} -.fa-calendar-check-o:before { - content: "\f274"; -} -.fa-industry:before { - content: "\f275"; -} -.fa-map-pin:before { - content: "\f276"; -} -.fa-map-signs:before { - content: "\f277"; -} -.fa-map-o:before { - content: "\f278"; -} -.fa-map:before { - content: "\f279"; -} -.fa-commenting:before { - content: "\f27a"; -} -.fa-commenting-o:before { - content: "\f27b"; -} -.fa-houzz:before { - content: "\f27c"; -} -.fa-vimeo-v:before, -.fa-vimeo:before { - content: "\f27d"; -} -.fa-black-tie:before { - content: "\f27e"; -} -.fa-fonticons:before { - content: "\f280"; -} -.fa-reddit-alien:before { - content: "\f281"; -} -.fa-edge:before { - content: "\f282"; -} -.fa-credit-card-alt:before { - content: "\f283"; -} -.fa-codiepie:before { - content: "\f284"; -} -.fa-modx:before { - content: "\f285"; -} -.fa-fort-awesome:before { - content: "\f286"; -} -.fa-usb:before { - content: "\f287"; -} -.fa-product-hunt:before { - content: "\f288"; -} -.fa-mixcloud:before { - content: "\f289"; -} -.fa-scribd:before { - content: "\f28a"; -} -.fa-pause-circle:before { - content: "\f28b"; -} -.fa-pause-circle-o:before { - content: "\f28c"; -} -.fa-stop-circle:before { - content: "\f28d"; -} -.fa-stop-circle-o:before { - content: "\f28e"; -} -.fa-shopping-bag:before { - content: "\f290"; -} -.fa-shopping-basket:before { - content: "\f291"; -} -.fa-hashtag:before { - content: "\f292"; -} -.fa-bluetooth:before { - content: "\f293"; -} -.fa-bluetooth-b:before { - content: "\f294"; -} -.fa-percent:before { - content: "\f295"; -} -.fa-gitlab:before { - content: "\f296"; -} -.fa-wpbeginner:before { - content: "\f297"; -} -.fa-wpforms:before { - content: "\f298"; -} -.fa-envira:before { - content: "\f299"; -} -.fa-universal-access:before { - content: "\f29a"; -} -.fa-wheelchair-alt:before { - content: "\f29b"; -} -.fa-question-circle-o:before { - content: "\f29c"; -} -.fa-blind:before { - content: "\f29d"; -} -.fa-audio-description:before { - content: "\f29e"; -} -.fa-phone-volume:before, -.fa-volume-control-phone:before { - content: "\f2a0"; -} -.fa-braille:before { - content: "\f2a1"; -} -.fa-assistive-listening-systems:before { - content: "\f2a2"; -} -.fa-asl-interpreting:before, -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; -} -.fa-deafness:before, -.fa-hard-of-hearing:before, -.fa-deaf:before { - content: "\f2a4"; -} -.fa-glide:before { - content: "\f2a5"; -} -.fa-glide-g:before { - content: "\f2a6"; -} -.fa-signing:before, -.fa-sign-language:before { - content: "\f2a7"; -} -.fa-low-vision:before { - content: "\f2a8"; -} -.fa-viadeo:before { - content: "\f2a9"; -} -.fa-viadeo-square:before { - content: "\f2aa"; -} -.fa-snapchat:before { - content: "\f2ab"; -} -.fa-snapchat-ghost:before { - content: "\f2ac"; -} -.fa-snapchat-square:before { - content: "\f2ad"; -} -.fa-first-order:before { - content: "\f2b0"; -} -.fa-yoast:before { - content: "\f2b1"; -} -.fa-themeisle:before { - content: "\f2b2"; -} -.fa-google-plus-circle:before, -.fa-google-plus-official:before { - content: "\f2b3"; -} -.fa-fa:before, -.fa-font-awesome:before { - content: "\f2b4"; -} -.fa-handshake-o:before { - content: "\f2b5"; -} -.fa-envelope-open:before { - content: "\f2b6"; -} -.fa-envelope-open-o:before { - content: "\f2b7"; -} -.fa-linode:before { - content: "\f2b8"; -} -.fa-address-book:before { - content: "\f2b9"; -} -.fa-address-book-o:before { - content: "\f2ba"; -} -.fa-vcard:before, -.fa-address-card:before { - content: "\f2bb"; -} -.fa-vcard-o:before, -.fa-address-card-o:before { - content: "\f2bc"; -} -.fa-user-circle:before { - content: "\f2bd"; -} -.fa-user-circle-o:before { - content: "\f2be"; -} -.fa-user-o:before { - content: "\f2c0"; -} -.fa-id-badge:before { - content: "\f2c1"; -} -.fa-drivers-license:before, -.fa-id-card:before { - content: "\f2c2"; -} -.fa-drivers-license-o:before, -.fa-id-card-o:before { - content: "\f2c3"; -} -.fa-quora:before { - content: "\f2c4"; -} -.fa-free-code-camp:before { - content: "\f2c5"; -} -.fa-telegram:before { - content: "\f2c6"; -} -.fa-thermometer-4:before, -.fa-thermometer:before, -.fa-thermometer-full:before { - content: "\f2c7"; -} -.fa-thermometer-3:before, -.fa-thermometer-three-quarters:before { - content: "\f2c8"; -} -.fa-thermometer-2:before, -.fa-thermometer-half:before { - content: "\f2c9"; -} -.fa-thermometer-1:before, -.fa-thermometer-quarter:before { - content: "\f2ca"; -} -.fa-thermometer-0:before, -.fa-thermometer-empty:before { - content: "\f2cb"; -} -.fa-shower:before { - content: "\f2cc"; -} -.fa-bathtub:before, -.fa-s15:before, -.fa-bath:before { - content: "\f2cd"; -} -.fa-podcast:before { - content: "\f2ce"; -} -.fa-window-maximize:before { - content: "\f2d0"; -} -.fa-window-minimize:before { - content: "\f2d1"; -} -.fa-window-restore:before { - content: "\f2d2"; -} -.fa-times-rectangle:before, -.fa-window-close:before { - content: "\f2d3"; -} -.fa-times-rectangle-o:before, -.fa-window-close-o:before { - content: "\f2d4"; -} -.fa-bandcamp:before { - content: "\f2d5"; -} -.fa-grav:before { - content: "\f2d6"; -} -.fa-etsy:before { - content: "\f2d7"; -} -.fa-imdb:before { - content: "\f2d8"; -} -.fa-ravelry:before { - content: "\f2d9"; -} -.fa-eercast:before { - content: "\f2da"; -} -.fa-microchip:before { - content: "\f2db"; -} -.fa-snowflake-o:before { - content: "\f2dc"; -} -.fa-superpowers:before { - content: "\f2dd"; -} -.fa-wpexplorer:before { - content: "\f2de"; -} -.fa-meetup:before { - content: "\f2e0"; -} -.fa-mastodon:before { - content: "\f2e1"; -} -.fa-mastodon-alt:before { - content: "\f2e2"; -} -.fa-fork-circle:before, -.fa-fork-awesome:before { - content: "\f2e3"; -} -.fa-peertube:before { - content: "\f2e4"; -} -.fa-diaspora:before { - content: "\f2e5"; -} -.fa-friendica:before { - content: "\f2e6"; -} -.fa-gnu-social:before { - content: "\f2e7"; -} -.fa-liberapay-square:before { - content: "\f2e8"; -} -.fa-liberapay:before { - content: "\f2e9"; -} -.fa-ssb:before, -.fa-scuttlebutt:before { - content: "\f2ea"; -} -.fa-hubzilla:before { - content: "\f2eb"; -} -.fa-social-home:before { - content: "\f2ec"; -} -.fa-artstation:before { - content: "\f2ed"; -} -.fa-discord:before { - content: "\f2ee"; -} -.fa-discord-alt:before { - content: "\f2ef"; -} -.fa-patreon:before { - content: "\f2f0"; -} -.fa-snowdrift:before { - content: "\f2f1"; -} -.fa-activitypub:before { - content: "\f2f2"; -} -.fa-ethereum:before { - content: "\f2f3"; -} -.fa-keybase:before { - content: "\f2f4"; -} -.fa-shaarli:before { - content: "\f2f5"; -} -.fa-shaarli-o:before { - content: "\f2f6"; -} -.fa-cut-key:before, -.fa-key-modern:before { - content: "\f2f7"; -} -.fa-xmpp:before { - content: "\f2f9"; -} -.fa-archive-org:before { - content: "\f2fc"; -} -.fa-freedombox:before { - content: "\f2fd"; -} -.fa-facebook-messenger:before { - content: "\f2fe"; -} -.fa-debian:before { - content: "\f2ff"; -} -.fa-mastodon-square:before { - content: "\f300"; -} -.fa-tipeee:before { - content: "\f301"; -} -.fa-react:before { - content: "\f302"; -} -.fa-dogmazic:before { - content: "\f303"; -} -.fa-zotero:before { - content: "\f309"; -} -.fa-nodejs:before { - content: "\f308"; -} -.fa-nextcloud:before { - content: "\f306"; -} -.fa-nextcloud-square:before { - content: "\f307"; -} -.fa-hackaday:before { - content: "\f30a"; -} -.fa-laravel:before { - content: "\f30b"; -} -.fa-signalapp:before { - content: "\f30c"; -} -.fa-gnupg:before { - content: "\f30d"; -} -.fa-php:before { - content: "\f30e"; -} -.fa-ffmpeg:before { - content: "\f30f"; -} -.fa-joplin:before { - content: "\f310"; -} -.fa-syncthing:before { - content: "\f311"; -} -.fa-inkscape:before { - content: "\f312"; -} -.fa-matrix-org:before { - content: "\f313"; -} -.fa-pixelfed:before { - content: "\f314"; -} -.fa-bootstrap:before { - content: "\f315"; -} -.fa-dev-to:before { - content: "\f316"; -} -.fa-hashnode:before { - content: "\f317"; -} -.fa-jirafeau:before { - content: "\f318"; -} -.fa-emby:before { - content: "\f319"; -} -.fa-wikidata:before { - content: "\f31a"; -} -.fa-gimp:before { - content: "\f31b"; -} -.fa-c:before { - content: "\f31c"; -} -.fa-digitalocean:before { - content: "\f31d"; -} -.fa-att:before { - content: "\f31e"; -} -.fa-gitea:before { - content: "\f31f"; -} -.fa-file-epub:before { - content: "\f321"; -} -.fa-python:before { - content: "\f322"; -} -.fa-archlinux:before { - content: "\f323"; -} -.fa-pleroma:before { - content: "\f324"; -} -.fa-unsplash:before { - content: "\f325"; -} -.fa-hackster:before { - content: "\f326"; -} -.fa-spell-check:before { - content: "\f327"; -} -.fa-moon:before { - content: "\f328"; -} -.fa-sun:before { - content: "\f329"; -} -.fa-f-droid:before { - content: "\f32a"; -} -.fa-biometric:before { - content: "\f32b"; -} -.fa-wire:before { - content: "\f32c"; -} -.fa-tor-onion:before { - content: "\f32e"; -} -.fa-volume-mute:before { - content: "\f32f"; -} -.fa-bell-ringing:before { - content: "\f32d"; -} -.fa-bell-ringing-o:before { - content: "\f330"; -} -.fa-hal:before { - content: "\f333"; -} -.fa-jupyter:before { - content: "\f335"; -} -.fa-julia:before { - content: "\f334"; -} -.fa-classicpress:before { - content: "\f331"; -} -.fa-classicpress-circle:before { - content: "\f332"; -} -.fa-open-collective:before { - content: "\f336"; -} -.fa-orcid:before { - content: "\f337"; -} -.fa-researchgate:before { - content: "\f338"; -} -.fa-funkwhale:before { - content: "\f339"; -} -.fa-askfm:before { - content: "\f33a"; -} -.fa-blockstack:before { - content: "\f33b"; -} -.fa-boardgamegeek:before { - content: "\f33c"; -} -.fa-bunny:before { - content: "\f35f"; -} -.fa-buymeacoffee:before { - content: "\f33d"; -} -.fa-cc-by:before { - content: "\f33e"; -} -.fa-creative-commons-alt:before, -.fa-cc-cc:before { - content: "\f33f"; -} -.fa-cc-nc-eu:before { - content: "\f341"; -} -.fa-cc-nc-jp:before { - content: "\f342"; -} -.fa-cc-nc:before { - content: "\f340"; -} -.fa-cc-nd:before { - content: "\f343"; -} -.fa-cc-pd:before { - content: "\f344"; -} -.fa-cc-remix:before { - content: "\f345"; -} -.fa-cc-sa:before { - content: "\f346"; -} -.fa-cc-share:before { - content: "\f347"; -} -.fa-cc-zero:before { - content: "\f348"; -} -.fa-conway-hacker:before, -.fa-conway-glider:before { - content: "\f349"; -} -.fa-csharp:before { - content: "\f34a"; -} -.fa-email-bulk:before { - content: "\f34b"; -} -.fa-email-bulk-o:before { - content: "\f34c"; -} -.fa-gnu:before { - content: "\f34d"; -} -.fa-google-play:before { - content: "\f34e"; -} -.fa-heroku:before { - content: "\f34f"; -} -.fa-hassio:before, -.fa-home-assistant:before { - content: "\f350"; -} -.fa-java:before { - content: "\f351"; -} -.fa-mariadb:before { - content: "\f352"; -} -.fa-markdown:before { - content: "\f353"; -} -.fa-mysql:before { - content: "\f354"; -} -.fa-nordcast:before { - content: "\f355"; -} -.fa-plume:before { - content: "\f356"; -} -.fa-postgresql:before { - content: "\f357"; -} -.fa-sass-alt:before { - content: "\f359"; -} -.fa-sass:before { - content: "\f358"; -} -.fa-skate:before { - content: "\f35a"; -} -.fa-sketchfab:before { - content: "\f35b"; -} -.fa-tex:before { - content: "\f35c"; -} -.fa-textpattern:before { - content: "\f35d"; -} -.fa-unity:before { - content: "\f35e"; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} diff --git a/in/fonts/forkawesome-webfont.woff2 b/in/fonts/forkawesome-webfont.woff2 deleted file mode 100644 index 7a03153..0000000 Binary files a/in/fonts/forkawesome-webfont.woff2 and /dev/null differ diff --git a/in/fr/index.html b/in/fr/index.html deleted file mode 100644 index 76b0fd2..0000000 --- a/in/fr/index.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - - - -Curriculum Vitæ - - - - - - - - - - - -
- - - -
- -
-
-

DevOps

-

Explorant et automatisant des technologies informatiques

-
- -
-
    -
  • amorçage, construction, configuration, sécurisation, maintien de systèmes
  • -
  • modélisation, implémentation, intégration, déploiement, documentation de logiciels
  • -
-
- -
-

Expérience

- -
- -
-

-

- ← 

-
- -
-
Logo circulaire du CDAD-BDX -
-

Centre de Développement des Applications de la Défense

-

DevOps @ Assurance qualité, CDAD

-
-
-

-

- ← 

-
-
    -
  • administration d’outils CI / CD : Gitea, GitLab, Jenkins, Nexus, SonarQube
  • -
  • écriture de scripts Python pour maintenir des miroirs hors ligne :
    Alma, Alpine, CentOS, Debian, Docker, Maven, MSys2, NPM, NVD, PyPI
  • -
  • écriture et maintien de scripts BASH simplifiant usage et empaquetage pour MSys2
  • -
  • écriture de playbooks et rôles Ansible pour configurations et déploiements
  • -
  • construction d’images systèmes Ubuntu LTS Live avec interface graphique kiosque
  • -
-
- -
-
Logo circulaire du CDAD-BDX -
-

Centre de Développement des Applications de la Défense

-

Administrateur système @ Infrastructure / Sécurité, CDAD

-
-
-

-

- ← 

-
-
    -
  • administration d’infrastructures Proxmox et vSphere, avec VM et conteneurs LXC
  • -
  • conception d’une architecture SSO : HAproxy, KeyCloak / WildFly, MariaDB Galera
  • -
  • scripts Python pour : miroirs APT, dépôts Git, biclés OpenSSH, docs Sphinx
  • -
-
- -
-
Logo circulaire du CDAD-BDX -
-

Centre de Développement des Applications de la Défense

-

Développeur logiciel @ Fabrique numérique, CDAD

-
-
-

-

- ← 

-
-
    -
  • installation d’un réseau de développement : stations et serveur LXC sous Debian
  • -
  • scripts BASH et Python pour : CloneZilla, Debian, DebMirror, GRUB, PanDoc
  • -
  • écriture d’un programme Python pour migrer tous les dépôts SVN vers Git
  • -
-
- -
- -
- -
-

-

- ← 

-
- -
-
Logo circulaire du GAIO -
-
-

-

- ← 

-
-
MELISSA NG (MELISSA Nouvelle Génération)
-Réécriture complète en Java et base de données PostgreSQL :
    -
  • écriture d’un moteur cartographique basé sur images PNG et métadonnées XML
  • -
  • écriture de pilotes, émulateurs et interfaces graphiques pour :
      -
    • prise en charge de l’équipement ADL (Airborne Data Loader), programmant les
      -cartes sans contact DTM (Data Transfer Module) pour centrales avion Alpha Jet
    • -
    • programmation simultanée de modules EEPROM pour centrales avion Mirage
    • -
    -
  • import de fichiers KML / KMZ pour matérialiser des situations tactiques (SITAC)
  • -
-
- -
-
Logo triangulaire du CEAM -
-
-

-

- ← 

-
- -
MELISSA (Module d’Élaboration Logique des Informations Simplifiées de Survol Aérien)
-Préparation, programmation, déchargement et rejeu de missions pour avions
-Alpha Jet, Transall, Mirage 2000, Mirage F1, Mirage IV, Jaguar :
    -
  • écriture de pilotes et interfaces graphiques pour :
      -
    • programmation séquentielle de modules EEPROM pour centrales avion Mirage
    • -
    • programmation et déchargement de routes pour divers appareils GPS Garmin
    • -
    -
  • import de base de données mondiale NavData (standard international ARINC 424)
  • -
  • exports NavData adaptés aux contraintes des centrales avion Transall (FMS)
  • -
- -
- -
EVA (Écran de Visualisation Aéronef)
-Restitution embarquée de navigation et enregistreurs vidéo pour Mirage F1CR :
    -
  • optimisation de moteur cartographique pour ordinateurs embarqués (PC/104)
  • -
  • conception et réalisation d’un système dédié avec Windows XP Embedded Studio
  • -
- -
- -
- -
- -
-

Projets personnels

- -
- -
-

-

- ← 

-
-

Projet parent, en Python et POSIX Shell

- -
-
-

Shell to Python Continuous Deployment

-

SPCD : code @ forge.rwx.work

-
-
-

-

- ← 

-
-Programme, en POSIX Shell et Python, gérant des pipelines CI / CD de façon unifiée :
    -
  • que l’infrastrucure réseau soit en ligne ou hors ligne avec CA et DNS locaux
  • -
  • quelle que soit la forge: Forgejo, Gitea, GitHub, GitLab
  • -
  • quelle que soit la base de système Linux du conteneur Docker :
    -Alma, Alpine, Arch, Debian, Fedora, OpenSUSE, Rocky, Ubuntu
  • -
-
- -
-
-

Live Scan Grub Menu

-

LSGM : code @ forge.rwx.work

-
-
-

-

- ← 

-
-Programme, en BASH et GRUB Shell, créant des systèmes de fichiers ESP avec :
    -
  • images GRUB autonomes, Secure Boot ou construites, pour ARM, EFI et BIOS
  • -
  • vérification à la volée des signatures OpenPGP des images sélectionnées
  • -
  • menu dynamique recherchant les images SquashFS amorçables Live disponibles
  • -
-
- -
- -
- -
- - -
- - - diff --git a/in/img/ForgeJo.svg b/in/img/ForgeJo.svg new file mode 100644 index 0000000..804b05e --- /dev/null +++ b/in/img/ForgeJo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/in/img/InstaGram.png b/in/img/InstaGram.png new file mode 100644 index 0000000..e388cb4 Binary files /dev/null and b/in/img/InstaGram.png differ diff --git a/in/img/KeyOxide.png b/in/img/KeyOxide.png new file mode 100644 index 0000000..249f088 Binary files /dev/null and b/in/img/KeyOxide.png differ diff --git a/in/img/LinkedIn.png b/in/img/LinkedIn.png new file mode 100644 index 0000000..40fb929 Binary files /dev/null and b/in/img/LinkedIn.png differ diff --git a/in/img/PeerTube.png b/in/img/PeerTube.png new file mode 100644 index 0000000..932a7ae Binary files /dev/null and b/in/img/PeerTube.png differ diff --git a/in/img/PixelFed.svg b/in/img/PixelFed.svg new file mode 100644 index 0000000..dfaf03f --- /dev/null +++ b/in/img/PixelFed.svg @@ -0,0 +1,101 @@ + + + + icon/color/svg/pixelfed-icon-color + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/in/img/YouTube.png b/in/img/YouTube.png new file mode 100644 index 0000000..69f69ab Binary files /dev/null and b/in/img/YouTube.png differ diff --git a/in/img/aae.png b/in/img/aae.png deleted file mode 100644 index 889a310..0000000 Binary files a/in/img/aae.png and /dev/null differ diff --git a/in/img/bluesky.svg b/in/img/bluesky.svg deleted file mode 100644 index c71e201..0000000 --- a/in/img/bluesky.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/in/img/cdad-bdx.png b/in/img/cdad-bdx.png deleted file mode 100644 index 6bf098d..0000000 Binary files a/in/img/cdad-bdx.png and /dev/null differ diff --git a/in/img/ceam.png b/in/img/ceam.png deleted file mode 100644 index b81368d..0000000 Binary files a/in/img/ceam.png and /dev/null differ diff --git a/in/img/cnam.png b/in/img/cnam.png deleted file mode 100644 index 06d62c6..0000000 Binary files a/in/img/cnam.png and /dev/null differ diff --git a/in/img/debian.jpeg b/in/img/debian.jpeg new file mode 100644 index 0000000..ab060b0 Binary files /dev/null and b/in/img/debian.jpeg differ diff --git a/in/img/dirisi.png b/in/img/dirisi.png deleted file mode 100644 index 247bb95..0000000 Binary files a/in/img/dirisi.png and /dev/null differ diff --git a/in/img/en.png b/in/img/en.png deleted file mode 100644 index 32b6133..0000000 Binary files a/in/img/en.png and /dev/null differ diff --git a/in/img/en.svg b/in/img/en.svg new file mode 100644 index 0000000..fcec86c --- /dev/null +++ b/in/img/en.svg @@ -0,0 +1,1119 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/in/img/forgejo.svg b/in/img/forgejo.svg deleted file mode 100644 index 9c46d82..0000000 --- a/in/img/forgejo.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Forgejo logo - Caesar Schinas - - - - - - - - - - - - - diff --git a/in/img/fr.png b/in/img/fr.png deleted file mode 100644 index 59cca8f..0000000 Binary files a/in/img/fr.png and /dev/null differ diff --git a/in/img/fr.svg b/in/img/fr.svg new file mode 100644 index 0000000..b50bd7e --- /dev/null +++ b/in/img/fr.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/in/img/gaio.png b/in/img/gaio.png deleted file mode 100644 index 193fe53..0000000 Binary files a/in/img/gaio.png and /dev/null differ diff --git a/in/img/keyoxide.svg b/in/img/keyoxide.svg deleted file mode 100644 index bc37abe..0000000 --- a/in/img/keyoxide.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/in/img/link.svg b/in/img/link.svg deleted file mode 100644 index 0ef3a14..0000000 --- a/in/img/link.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/in/img/linkedin.svg b/in/img/linkedin.svg deleted file mode 100644 index a5c4e76..0000000 --- a/in/img/linkedin.svg +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/in/img/location.svg b/in/img/location.svg deleted file mode 100644 index f443b44..0000000 --- a/in/img/location.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/in/img/mail.svg b/in/img/mail.svg deleted file mode 100644 index dd0cc8c..0000000 --- a/in/img/mail.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/in/img/marc.jpeg b/in/img/marc.jpeg new file mode 100644 index 0000000..b8fabcc Binary files /dev/null and b/in/img/marc.jpeg differ diff --git a/in/img/peertube.svg b/in/img/peertube.svg deleted file mode 100644 index 0e6e228..0000000 --- a/in/img/peertube.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/in/img/rwx.svg b/in/img/rwx.svg deleted file mode 100644 index 7a2a9ee..0000000 --- a/in/img/rwx.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - -index - - -x - -X - - - -r - -R - - - -x->r - - - - - -w - -W - - - -r->w - - - - - -w->x - - - - - -w->r - - - - - diff --git a/in/img/tel.svg b/in/img/tel.svg deleted file mode 100644 index 42cb379..0000000 --- a/in/img/tel.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/in/img/theme.svg b/in/img/theme.svg deleted file mode 100644 index 64d26fd..0000000 --- a/in/img/theme.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/in/img/web.svg b/in/img/web.svg deleted file mode 100644 index 0099d72..0000000 --- a/in/img/web.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/in/index.html b/in/index.html deleted file mode 120000 index d7a7d75..0000000 --- a/in/index.html +++ /dev/null @@ -1 +0,0 @@ -en/index.html \ No newline at end of file diff --git a/in/marc.beninca.asc b/in/marc.beninca.asc new file mode 100644 index 0000000..daf987b --- /dev/null +++ b/in/marc.beninca.asc @@ -0,0 +1,75 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXTefmxYJKwYBBAHaRw8BAQdA+H8/RzqjvpB7+mnypomWrxRe2zoUO0htbwP7 +xC/Mxei0IE1hcmMgQmVuaW5jYSA8bWFyY0BiZW5pbmNhLmxpbms+iQGOBBMWCgE2 +AhsBAgsJAhUKAhYDAh4BAheAAhkBMBSAAAAAABAAF3Byb29mQGFyaWFkbmUuaWRk +bnM6dGlsZGUubGluaz90eXBlPVRYVDUUgAAAAAAQABxwcm9vZkBhcmlhZG5lLmlk +ZG5zOm1hcmMtYmVuaW5jYS5mcj90eXBlPVRYVDIUgAAAAAAQABlwcm9vZkBhcmlh +ZG5lLmlkZG5zOmJlbmluY2EubGluaz90eXBlPVRYVDQUgAAAAAAQABtwcm9vZkBh +cmlhZG5lLmlkZG5zOmNvbXB1dGluZy5sYW5kP3R5cGU9VFhULhSAAAAAABAAFXBy +b29mQGFyaWFkbmUuaWRkbnM6cnd4Lndvcms/dHlwZT1UWFQWIQQI7acAYjSg6ymj +qEcdvV7EutpVeQUCZld4FwUJCwEL/AAKCRAdvV7EutpVeStiAQC5mlCjnqk4FU26 +bdDJyx69ghq+bxnTsvs6GkOfwByxNwEAn1ekf7ZvnN2i/xLKbjw3tw1XlZzBiqzg +CgECjNiu4gG0JE1hcmMgQmVuaW5jYSA8Z2l0QG1hcmMuYmVuaW5jYS5saW5rPojT +BBMWCgB7AhsBAgsJAhUKAhYDAh4BAheARRSAAAAAABAALHByb29mQGFyaWFkbmUu +aWRodHRwczovL2ZvcmdlLnJ3eC53b3JrL21hcmMuYmVuaW5jYS8ucHJvZmlsZRYh +BAjtpwBiNKDrKaOoRx29XsS62lV5BQJmV3gXBQkLAQv8AAoJEB29XsS62lV5ceoB +ANCsDlwxQO75SVnvt11RNShnSqZl4S8wNDfJpOJyybTZAP4wTHDw8g82BYHgRPl/ +SpXBMSyK3bfii4qVqyGmHXWIC7QnTWFyYyBCZW5pbmNhIDxzb2NpYWxAbWFyYy5i +ZW5pbmNhLmxpbms+iQLSBBMWCgJ6AhsBAgsJAhUKAhYDAh4BAheAShSAAAAAABAA +MXByb29mQGFyaWFkbmUuaWRodHRwczovL25ld3MueWNvbWJpbmF0b3IuY29tL3Vz +ZXI/aWQ9bWFyY19iZW5pbmNhPxSAAAAAABAAJnByb29mQGFyaWFkbmUuaWRodHRw +czovL3Byb2dyYW1taW5nLmRldi91L21hcmNfYmVuaW5jYUMUgAAAAAAQACpwcm9v +ZkBhcmlhZG5lLmlkaHR0cHM6Ly9waXhlbGZlZC5zb2NpYWwvdXNlcnMvbWFyYy5i +ZW5pbmNhOxSAAAAAABAAInByb29mQGFyaWFkbmUuaWRodHRwczovL2xpYmVyYXBh +eS5jb20vbWFyYy5iZW5pbmNhPRSAAAAAABAAJHByb29mQGFyaWFkbmUuaWRodHRw +czovL21hc3RvZG9uLmNsb3VkL0BtYXJjX2JlbmluY2E9FIAAAAAAEAAkcHJvb2ZA +YXJpYWRuZS5pZGh0dHBzOi8vZGV2cy5saXZlL3VzZXJzL21hcmNfYmVuaW5jYUQU +gAAAAAAQACtwcm9vZkBhcmlhZG5lLmlkaHR0cHM6Ly9wZWVydHViZS5pcmlzZWRl +bi5ldS9hL21hcmNfYmVuaW5jYT4UgAAAAAAQACVwcm9vZkBhcmlhZG5lLmlkaHR0 +cHM6Ly9yYW50LmxpL21hcmMtYmVuaW5jYS9rZXlveGlkZTkUgAAAAAAQACBwcm9v +ZkBhcmlhZG5lLmlkaHR0cHM6Ly9sb2JzdGUucnMvdS9tYXJjX2JlbmluY2EWIQQI +7acAYjSg6ymjqEcdvV7EutpVeQUCZld4GAUJCwEL/AAKCRAdvV7EutpVeYD4AP4v +2JGU1fRKrjJef93q0+SRq+cPDDvQsPZewaokig3m8AD/UHc6qnBD8uJvZIkkgNQ0 +ej7DQhKeMxq0OLqfvMTXaQ+4MwRkBLE2FgkrBgEEAdpHDwEBB0AsYIYac0mKd7Ui +WhnkXlDo2hidqKEDneaCGfRV9UhR4Yh+BBgWCgAmAhsgFiEECO2nAGI0oOspo6hH +Hb1exLraVXkFAmZXeBkFCQQz+mMACgkQHb1exLraVXmcewD/S0zIWpVmEJikiijA +Kd97fjcYGuAWdcYnkhARFU7cihgBAIarS+OWe5ZkvOVZAJDCCTxLrdpN8tQXgf4K +xP9RxVMKuDMEZASx7RYJKwYBBAHaRw8BAQdAwJl98sJxO1aJ/6ucVHDMxjpjNuI+ +l7/M5I6Z8GdNHzCI9QQYFgoAJgIbAhYhBAjtpwBiNKDrKaOoRx29XsS62lV5BQJm +V3gZBQkEM/msAIF2IAQZFgoAHRYhBEZFD76ABdKwQwlIa70nrOrleYioBQJkBLHt +AAoJEL0nrOrleYio6MwA/Rrcqz5tol3l3fuADm0PWk3MzeaClfYC9ICaxS994mDQ +AP9etGedvYD4evXdJ1aQ41a0cLi+vbctUaeKmVmjUZNXBgkQHb1exLraVXlzrQEA +1myZeH/H1cF+61cKsi6fEsAgXJXuF7IykX8/Rp3b1+YBAO70LDuaIAw4JozIAWVX +aUt2q9cu8ihSBAzI5mM7hc0AuDgEZASzfBIKKwYBBAGXVQEFAQEHQOL7FEfVtSrh +I36LfH8Suxvcb6t9z40yTvDgNaDbCtFMAwEIB4h+BBgWCgAmAhsMFiEECO2nAGI0 +oOspo6hHHb1exLraVXkFAmZXeBkFCQQz+B0ACgkQHb1exLraVXkF6gEAry1FxYoP +0Bw7a8TR7bo3/MlOYfOYvcW7J7B35P3l6HMBAMjd2Qo5QklwLlSCLZ2S74mptlj0 +GdQ1w1trFHvZoiEHuQINBGVJ9IYBEACmuAQeyc3N/xXxX5PR8KeXLR7yeEhzzSCH +Eppc2GId+TTK6kHU65Cc20deXjjHjqSeghGZ585soCV1l38e3dYJ13puPjRqnQ2g +bu6kRPHR1vEFYnDHCAGV+Tv8orKJ505Xo5sRxtETtEeK6KpwmgwO7kWJprmD8oDa +MkDMSGNwF3ogEtrkYc1g5S8gtiHS5jcg7GUHp3jMtyrPoyWj1YPzxWe7/EG8tYEo +wy6FPwrLNEFFIF2oRlq6/bXyr0bb3tuyYYWTeHMhQ3YZJ8AUhXfVeiJQ28JxMjFX ++wmNwE9IvDMWRdb/PYNPE/hfni1eCSlNgIYGXMa8xZL00k7W2DNbSXReB98bw6YH +2CaXutE+zy7R9+GPhWCy+nQiYRCZMIO40H0nTED9ZgztrIByDxjxJD6Q6KhFnwAl +z8HQ8oPyq8HFwGX7zElRVC+fka9znhqqSYm4WrX7OuXbTsFT03/wKnLLaS9lgb0X +MIz0fvOjzl1HZBeFV+1+oRT94f+cp7iJgIN3G2ALcpBI97yE10dWPuO/WOgFbPh7 +3y+olH8ujxPI5xMNg5pS40sjqCW1vwM4zBzPs5RPioX+9EtEQCAAyoq6TBYHMJxv +tzwAogoCOo5sAQcIR8Sg7EpwhSjJrbVt4rjqq82EKzhqZj4nrS9ycrrlTHGqs7NA +ZsCuoCj7bQARAQABiQK0BBgWCgAmAhsCFiEECO2nAGI0oOspo6hHHb1exLraVXkF +AmZXeBkFCQLutxMCQMF0IAQZAQoAHRYhBDEqzfm7A8ga3pW5wJx2E0UMgMJPBQJl +SfSGAAoJEJx2E0UMgMJP+2kP/0f/azRfWgHd4ce1COKv/u9XLqNOmEpBYMgi86GU +Z8natRGk4TPFvfjo3qY6LSDrA3PgzYR/T3NSw4+rDuSpRr1U9nWFQ34CIj5phC5t +IPwQeLUk4699wi0BsLBdYeiOEBJ3km6O1FdsNdOrB6Xuvom20ymx3eDAEf1xwFo6 +PJLITQVK6cz/iC7VCN68cBd/NE/8mTT7caWRxhFjZ7/7vcuu0DpwJG9wShCnEcqs +IfKQGssztC9sH4usYfcQHSba+wAeRLVBbLqN7SmG7EFhdRCf5Kxw/nfXa3NEWIEg ++OEmsBHaerMMJ/sQ8++LTbL//xFtJCyVj21qlybAmzavjEj21c3JHvMX+qpX3Afp +nHsT/7suUhYiuZWpZa+ornEBXfJKTj+9Mn9apjwGQMEulJ+b+y8DcjgIBpEjZAyt +h0mFr0cLm43OY/ujZY+W755PivJJTBUaQVL0XQEM5KkDWfxUzCrfipGIQla+h5Al +JQti13UY/Nd3PGoBao35B/7AiWHhxtFx4TSNDA08pLuhHVqimcgtdRMkmgDdAws2 +EnNGz0Bv/Q5OY7La1Uo/9uIIvIyOXZ0O069NyrhnV9RUSfC/ACvAI0q07wABPQWo +YzFxBs9RL/Anm2q+QVWVq1Rn1HyvUjRPLDNWgVMcDQQ/nanSMRLvLbGw5fzOaY2f +opOeCRAdvV7EutpVeSA8AQDvn67nBs1ci9OlaqMHjRYObQkQUJOIdjqXlgMEHjBX +4QEAom3cNIGGbP8AupzSa+8PeRgvYD6VW6mJfbqjQz8q1A4= +=jG40 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/in/marc.beninca.pgp b/in/marc.beninca.pgp new file mode 100644 index 0000000..312f125 Binary files /dev/null and b/in/marc.beninca.pgp differ diff --git a/in/marc.beninca.vcf b/in/marc.beninca.vcf deleted file mode 100644 index f84c741..0000000 --- a/in/marc.beninca.vcf +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN:VCARD -VERSION:4.0 -N:Beninca;Marc -FN:Marc Beninca -TEL:+33607478434 -EMAIL:cv@marc.beninca.link -URL:marc.beninca.link -END:VCARD diff --git a/in/pdf/cv.en.pdf b/in/pdf/cv.en.pdf new file mode 100644 index 0000000..179b30f Binary files /dev/null and b/in/pdf/cv.en.pdf differ diff --git a/in/pdf/cv.fr.pdf b/in/pdf/cv.fr.pdf new file mode 100644 index 0000000..0ad5cd8 Binary files /dev/null and b/in/pdf/cv.fr.pdf differ diff --git a/in/script/main.js b/in/script/main.js deleted file mode 100644 index 7b6582a..0000000 --- a/in/script/main.js +++ /dev/null @@ -1,37 +0,0 @@ -const buttons = ["item", "link", "swap"]; - -for (let button of buttons) { - document.getElementById(button).addEventListener("click", () => { - document.body.classList.toggle(button); - }); -} - -let theme - -function theme_get() { - theme = localStorage.getItem("theme"); - if (! theme) { - if (window.matchMedia("(prefers-color-scheme: dark)").matches) { - theme = "dark"; - } else { - theme = "light"; - } - } - theme_set() -} - -function theme_set() { - document.documentElement.setAttribute("data-theme", theme); - localStorage.setItem("theme", theme); -} - -function theme_swap() { - theme = theme === "light" ? "dark" : "light"; - theme_set(); -} - -document.getElementById("theme").addEventListener("click", () => { - theme_swap(); -}); - -theme_get() diff --git a/in/style/debug.css b/in/style/debug.css deleted file mode 100644 index 9be33b8..0000000 --- a/in/style/debug.css +++ /dev/null @@ -1,5 +0,0 @@ -* { - border-color: lightgray; - border-style: dashed; - border-width: 1px; -} diff --git a/in/style/main.css b/in/style/main.css deleted file mode 100644 index e0f4fc0..0000000 --- a/in/style/main.css +++ /dev/null @@ -1,265 +0,0 @@ -/* variables */ - -:root { - --alpha: rgba(0, 0, 0, 0); - /* border */ - --border-off: var(--border-width) none var(--alpha); - --border-on: var(--border-width) solid var(--border-color); - --border-width: .1rem; - /* margin */ - --margin: .4rem; - /* theme */ - color-scheme: light dark; - /* theme / gradients */ - --anchor-gradient: linear-gradient(to top, var(--alpha), var(--anchor-background), var(--alpha)); - --banner-gradient: linear-gradient(to top, var(--alpha), var(--banner-background)); - --body-gradient: linear-gradient(to top, var(--alpha), var(--body-background)); - --header-gradient: linear-gradient(to top, var(--alpha), var(--header-background)); - --item-even-gradient: linear-gradient(to top, var(--alpha), var(--item-even)); - --item-odd-gradient: linear-gradient(to top, var(--alpha), var(--item-odd)); - --org-gradient: linear-gradient(to top, var(--alpha), var(--org-background)); - /* theme / light */ - --anchor-background: #fcc; - --anchor-text: #f00; - --banner-background: #ccf; - --body-background: #fff; - --body-text: #000; - --border-color: #888; - --button-background: #bbb; - --header-background: #ccc; - --item-even: #ddd; - --item-odd: #eee; - --org-background: #afa; - --qrcode-background: ; - --ruler-border: #888; -} -@media screen { -[data-theme="dark"] { - /* theme / dark */ - --anchor-background: #622; - --anchor-text: #f88; - --banner-background: #558; - --body-background: #000; - --body-text: #aaa; - --border-color: #888; - --button-background: #444; - --header-background: #444; - --item-even: #222; - --item-odd: #111; - --org-background: #030; - --qrcode-background: #aaa; - --ruler-border: #444; -} -} - -/* main */ - -#item, #link, #swap, #theme { - background-color: var(--button-background); -} -#swap::after { content: "◂"; } -body.swap #swap::after { content: "▸"; } -#vcard { - background-color: var(--qrcode-background); -} - -@font-face { - font-display: swap; - font-family: "fa"; - src: url("font/fa.woff2"); -} - -html { - font-family: "DejaVu Sans", sans-serif; - text-align: start; -} - -body { - background-color: var(--body-background); - color: var(--body-text); - margin-inline: auto; - max-inline-size: 108ch; - padding-inline: .25rem; -} - -article, h2, h3, table { - margin-block-start: var(--margin); -} - -h2, h3, header { - border-bottom: var(--border-off); - border-left: var(--border-on); - border-right: var(--border-on); - border-top: var(--border-on); -} - -.link a:not(:has(img)), -.link button.link { - background: var(--anchor-gradient); -} -a:not(:has(img)) { - color: inherit; - padding: 0 .2em; - text-decoration: none; - text-decoration-skip-ink: auto; - text-underline-offset: .2em; -} -a:hover { - color: var(--anchor-text); -} - -body.item button.item { - background: var(--item-odd-gradient); -} - -article.org, header { - border-radius: .25em; - padding-block: .25em; -} -header { - padding-inline: .5em; - background: var(--header-gradient); -} -header.org { - background: var(--org-gradient); -} - -article header { - display: flex; - justify-content: space-between; -} - -div.org { - display: flex; -} - -section.banner { - align-items: center; - display: flex; - justify-content: space-evenly; -} -.banner { - margin-block-start: .5em; -} - -button { - block-size: 2em; - border-radius: .25em; - color: var(--body-text); - margin-block: 0 auto; - margin-inline: .25em; - padding-inline: .5em; -} - -h1, h2, h3 { - border-radius: .25em; - font-weight: bold; -} -h1 { - font-size: 1.15rem; -} -h2 { - background: var(--banner-gradient); - font-size: 1.10rem; - padding-block: .25em; - text-align: center; -} -h3 { - background: var(--header-gradient); - font-size: 1.05rem; - padding: .125em .25em; -} - -hr { - border: .1em dashed; - border-color: var(--ruler-border); - margin-block: var(--margin); -} - -img.big { - block-size: 5em; -} -img.inline { - block-size: 1.5em; - vertical-align: middle; -} -a.logo { - block-size: 2em; - margin-block: 0 auto; -} -img.logo { - block-size: 100%; - margin-inline: auto; -} -img.org { - block-size: 2em; - margin-inline-end: .5em; -} - -body.item li:nth-of-type(even) { - background: var(--item-even-gradient); -} -body.item li:nth-of-type(odd) { - background: var(--item-odd-gradient); -} - -strong, th { - text-shadow: .05em .05em .05em; -} - -.banner table { - margin-block-start: 0; - margin-inline: 0; -} -table { - border-collapse: separate; - border-spacing: .5em .125em; - margin-inline: auto; -} -table h3 { - text-align: center; -} -th.logo, td.logo { - block-size: 1.5em; -} -th { - text-align: end; -} - -ul { - list-style-type: disc; - padding-inline-start: 1.25em; -} - -.columns { - display: grid; - gap: 1em; - grid-template-columns: 1fr; -} -.level { - text-align: center; -} -.title, .duration.org { - font-weight: bold; -} -.sub, .period { - font-size: .75em; -} -.time { - text-align: end; -} - -@media (width > 66ch), print { - .columns { grid-template-columns: 1fr 2fr; } - body.swap .columns { grid-template-columns: 2fr 1fr; } - body.swap aside { order: 2; } - body.swap main { order: 1; } -} - -@media print { - @page { size: A4; } - html { font-size: 3mm; } - button { display: none; } - /* way too blurry as PDF output above .041em */ - strong, th { text-shadow: .05em .05em .041em; } -} diff --git a/in/style/reset.css b/in/style/reset.css deleted file mode 100644 index 25ddd3a..0000000 --- a/in/style/reset.css +++ /dev/null @@ -1,43 +0,0 @@ -*::after, -*::before, -* { - box-sizing: border-box; -} - -* { - font: inherit; - margin: 0; - padding: 0; -} - -html { - color-scheme: dark light; -} - -body { - /* LATER */ - hanging-punctuation: first last; - @media screen { - min-block-size: 100svh; - } -} - -h1, h2, h3, h4, h5, h6 { - text-wrap: balance; -} - -figcaption, -li, -p { - max-inline-size: 79ch; - /* LATER */ - text-wrap: pretty; -} - -img, -picture, -svg, -video { - display: block; - max-inline-size: 100%; -} diff --git a/link.gv b/link.gv new file mode 100644 index 0000000..0c40c49 --- /dev/null +++ b/link.gv @@ -0,0 +1,71 @@ +digraph { + +graph [ +rankdir="LR" +] +node [ +#shape="record" +] + +subgraph cluster_git { +"bitbucket" [label="Bit\nBucket",href="https://bitbucket.org/marc_beninca"] +"github" [label="Git\nHub",href="https://github.com/marc-beninca"] +"gitlab" [label="Git\nLab",href="https://gitlab.com/marc.beninca"] +} + +"facebook" [label="Face\nBook",href="https://facebook.com/marc.beninca.page"] +"hackernews" [label="Hacker\nNews",href="https://news.ycombinator.com/user?id=marc_beninca"] +"instagram" [label="Insta\nGram",href="https://instagram.com/marc.beninca"] +"linuxfr" [label="Linux\nFR",href="https://linuxfr.org/users/marc-beninca"] +"lobsters" [label="Lobsters",href="https://lobste.rs/u/marc_beninca"] +"mastodon" [label="Mastodon",href="https://social.tchncs.de/@marc_beninca"] +"omglol" [label="OMG\nLOL",href="https://omg.lol/marc-beninca"] +"openstreetmap" [label="Open\nStreet\nMap",href="https://openstreetmap.org/user/Marc Beninca"] +"pleroma" [label="Pleroma",href="https://poa.st/@marc_beninca"] +"reddit" [label="Reddit",href="https://reddit.com/user/marc_beninca"] +"twitch" [label="Twitch",href="https://twitch.tv/marc_beninca"] +"twitter" [label="Twitter",href="https://twitter.com/marc_beninca"] +"youtube" [label="You\nTube",href="https://youtube.com/channel/UC4uk_6OKRke2soVah-Tf2Lw"] + +"keybase" [label="Key\nBase",href="https://keybase.io/marc_beninca"] +"liberapay" [label="Libera\nPay",href="https://liberapay.com/marc.beninca"] +"patreon" [label="Patreon",href="https://patreon.com/marc_beninca"] +"utip" [label="U\ntip",href="https://utip.io/marc_beninca"] + + +"instagram" -> "facebook" + +"keybase" -> { +"github" +"hackernews" +"lobsters" +"omglol" +"reddit" +"twitter" +} +"liberapay" -> { +"bitbucket" +"github" +"gitlab" +"linuxfr" +"mastodon" +"openstreetmap" +"pleroma" +"twitch" +"twitter" +} +"patreon" -> { +"facebook" +"instagram" +"twitter" +"youtube" +} +"utip" -> { +"facebook" +"instagram" +"twitch" +"twitter" +"youtube" +} + +} diff --git a/pubnix.py b/pubnix.py new file mode 100644 index 0000000..30d5b30 --- /dev/null +++ b/pubnix.py @@ -0,0 +1,61 @@ +import os +import subprocess + +PORT = 22 +USER = 'mspe' +ROOT = 'public_html' +PROTOCOL = 'https' +DIR = False + + +class PubNix: + + def __init__(self, dn, + ssh=None, port=PORT, user=USER, + root=ROOT, dir=DIR, web=None, sub=None): + self.dn = dn + self.ssh = f'{ssh}.{self.dn}' if ssh else self.dn + self.port = port + self.user = user + self.root = root + self.web = f'{web}.{self.dn}' if web else self.dn + if sub: + self.fqdn = f'{self.user}.{self.web}' + self.context = None + else: + self.fqdn = self.web + self.context = f'~{self.user}' + self.path = os.path.join(self.root, self.fqdn) if dir else self.root + self.target = f'{self.user}@{self.ssh}:{self.path}' + self.url = [f'{PROTOCOL}:', str(), self.fqdn] + if self.context: + self.url.append(self.context) + self.url = '/'.join(self.url) + + def capturun(self, *args): + return self.run(*args, capture_output=True) + + def run(self, *args, **kwargs): + return subprocess.run(['ssh', + '-o', 'LogLevel Error', + '-p', str(self.port), + f'{self.user}@{self.ssh}', + '--', + *args, + ], **kwargs) + + def disk_free(self): + process = self.capturun('df', '-h', os.curdir) + return process.stdout.decode('UTF-8').strip() + + def os(self): + ps = self.capturun('cat', '/etc/os-release') + if ps.returncode == 0: + for line in ps.stdout.decode('UTF-8').strip().split(os.linesep): + if 'PRETTY_NAME' in line: + return line.split('=')[1].split('"')[1] + else: + return self.capturun('uname', '-sr').stdout.decode('UTF-8').strip() + + def __str__(self): + return os.linesep.join([self.target, self.url]) diff --git a/readme.md b/readme.md index c183e9e..97ed378 100644 --- a/readme.md +++ b/readme.md @@ -1,23 +1,13 @@ -# CV +# Marc Beninca -## Tasks +## ToDo -* french link for - * ARINC 424 - * ESP - * Galera - * KeyCloak - * LVM - * MSys2 - * Mirage - * Nexus - * PDFtk - * uWSGI -* lsgm - * radicle - * tangled -* spcd - * radicle - * tangled -* lists items highlighting - * vertical middle +## Nope + +### Email + + * biolink.me + +### GAFAM + + * about.me diff --git a/sync.py b/sync.py new file mode 100755 index 0000000..2a63d5d --- /dev/null +++ b/sync.py @@ -0,0 +1,79 @@ +#! /usr/bin/env python3 + +import os +import subprocess + +import pubnix + +ARGS = [ + {'dn':'blinkenshell.org', + 'ssh': 'ssh', 'port': 2222, 'web': 'u', 'sub': True}, + {'dn':'ctrl-c.club', 'sub': False}, + {'dn':'dimension.sh', 'sub': True}, + {'dn':'envs.net', 'sub': True}, + {'dn':'freeshell.de', 'sub': False}, + # {'dn':'hextilde.xyz', 'sub': True}, + {'dn':'insomnia247.nl', 'dir': True, 'sub': True}, + {'dn':'p.projectsegfau.lt', 'sub': True}, + # {'dn':'pubnix.pink', 'web': 'sites', 'sub': False}, + {'dn':'rawtext.club', 'sub': False}, + {'dn':'rw.rs', 'sub': False}, + {'dn':'thunix.net', 'sub': False}, + {'dn':'tilde.32bit.cafe', 'root': 'www', 'sub': False}, + {'dn':'tilde.cafe', 'sub': True}, + {'dn':'tilde.club', 'sub': False}, + {'dn':'tilde.fun', 'root': 'html', 'sub': False}, + {'dn':'tilde.green', 'sub': False}, + {'dn':'tilde.guru', 'sub': False}, + {'dn':'tilde.institute', 'sub': True}, + {'dn':'tilde.pink', 'sub': False}, + {'dn':'tilde.team', 'sub': True}, + {'dn':'tilde.town', 'sub': False}, + # {'dn':'trash.town', 'sub': False}, + # permissions + # {'dn':'sdf.org', 'root': 'html', 'sub': True}, + # old + {'dn':'fr.tild3.org', 'sub': True}, + {'dn':'remotes.club', 'port': 9022, 'root': 'web', 'sub': True}, + {'dn':'squiggle.city', 'sub': False}, + # down + # {'dn':'aussies.space', 'sub': False}, + # {'dn':'heathens.club', 'root': 'www', 'sub': False}, + # {'dn':'vern.cc', 'sub': True}, +] +PUBNIXES = [pubnix.PubNix(**args) for args in ARGS] + + +def sync(root, pubnix, exclude=None): + args = [ + 'rsync', + '--archive', + '--checksum', + '--delete-before', + '--rsh', f"ssh -o 'LogLevel Error' -p {pubnix.port}", + '--partial', + '--progress', + '--verbose', + os.path.join(root, str()), + ] + for item in exclude: + args.extend(['--exclude', os.path.join(str(), item)]) + args.append(os.path.join(pubnix.target, str())) + subprocess.call(args, stdout=subprocess.DEVNULL) + + +def main(): + root = os.path.dirname(os.path.realpath(__file__)) + root = os.path.join(root, 'out', 'web') + dns_length = max([len(pubnix.dn) for pubnix in PUBNIXES]) + for pubnix in PUBNIXES: + print() + print(pubnix) + # print(f'{pubnix.dn.rjust(dns_length)} → ', end=str(), flush=True) + sync(root, pubnix, exclude=['__pycache__', 'pgp.asc']) + # print(pubnix.disk_free()) + # print(pubnix.os()) + + +if __name__ == '__main__': + main() diff --git a/test.css b/test.css new file mode 100644 index 0000000..fcb78a1 --- /dev/null +++ b/test.css @@ -0,0 +1,40 @@ +.tabs { +display: flex; +flex-wrap: wrap; +} +.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 { +border: 1px solid; +} +.tabs > input:checked + label { +background-color: gray; +} +.tabs > label { +padding: 10px; +} +.tabs > div { +padding: 10px; +} + +body { +background-color: white; +color: black; +} +body.dark { +background-color: black; +color: white; +} diff --git a/test.html b/test.html new file mode 100644 index 0000000..982a6e6 --- /dev/null +++ b/test.html @@ -0,0 +1,59 @@ + + + + + + + + + + +
+ + +

Tabs

+Dark + + + +
+ + +
+ + +
+
+ + +
Tab: One / One
+ + +
Tab: One / Two
+ + +
Tab: One / Three
+
+
+ + +
+
+ + +
Tab: Two / One
+ + +
Tab: Two / Two
+ + +
Tab: Two / Three
+
+
+
+ + +
diff --git a/test.js b/test.js new file mode 100644 index 0000000..b482e7c --- /dev/null +++ b/test.js @@ -0,0 +1,29 @@ +function check(tab) { + const tabs = tab.split('/') + let path = 'tab' + for (tab of tabs) { + path = `${path}/${tab}` + document.getElementById(path).checked = true + } +} +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 = '1/1' + check(tab) + push(tab) + } +} + +function swap() { + document.body.classList.toggle('dark') +}