diff --git a/.forgejo/workflows/main.yaml b/.forgejo/workflows/main.yaml index e816e02..0d10297 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 0f8b689..e2e7327 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -__pycache__ /out diff --git a/build.py b/build.py index 033a761..3f13417 100755 --- a/build.py +++ b/build.py @@ -1,916 +1,36 @@ #! /usr/bin/env python3 +"""Build resume.""" -import datetime -import os -import shutil -import subprocess +from os import sep +from pathlib import Path +from rwx import fs +from rwx.ps import run -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() +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")), + ) diff --git a/cc.html b/cc.html deleted file mode 100644 index eda505c..0000000 --- a/cc.html +++ /dev/null @@ -1,35 +0,0 @@ - diff --git a/cc/ada b/cc/ada deleted file mode 100644 index 3d6b49f..0000000 --- a/cc/ada +++ /dev/null @@ -1 +0,0 @@ -addr1q8xzhlhssfx0fwd57ha4khf7wtwdmr8rc4lkwnge6xjnskxv90l0pqjv7jumfa0mtdwnuukumkxw83tlvax3n5d98pvqgu558s diff --git a/cc/algo b/cc/algo deleted file mode 100644 index aaecf7b..0000000 --- a/cc/algo +++ /dev/null @@ -1 +0,0 @@ -7GHLYCLQKIET5XT2OWMAXU6NQKIRFJOWMKUOFON4RABVAA2PUZ2DLCDRLQ diff --git a/cc/ark b/cc/ark deleted file mode 100644 index 0779f71..0000000 --- a/cc/ark +++ /dev/null @@ -1 +0,0 @@ -AHHRwwELYb2KUjhcnZ4dknHuerdpRLfD4N diff --git a/cc/atom b/cc/atom deleted file mode 100644 index 068d885..0000000 --- a/cc/atom +++ /dev/null @@ -1 +0,0 @@ -cosmos132qm6ymwft9ck0xaaa9qamyaqq5ckwku98sak2 diff --git a/cc/bch b/cc/bch deleted file mode 100644 index c76470c..0000000 --- a/cc/bch +++ /dev/null @@ -1 +0,0 @@ -qrqs9yxvnknvma6n8yy79xvlpd4l6kktmv28j35rwj diff --git a/cc/bnb b/cc/bnb deleted file mode 100644 index 15141c7..0000000 --- a/cc/bnb +++ /dev/null @@ -1 +0,0 @@ -bnb1dezkkkg23fesfaz7jrt6xguuqsan20wz9jgt3d diff --git a/cc/btc b/cc/btc deleted file mode 100644 index 1ff9f73..0000000 --- a/cc/btc +++ /dev/null @@ -1 +0,0 @@ -bc1qu2qa6m3lkf3cvr5220k4npa77g6endlaf45c3j diff --git a/cc/dash b/cc/dash deleted file mode 100644 index bd9bc15..0000000 --- a/cc/dash +++ /dev/null @@ -1 +0,0 @@ -Xx6DuquvMtZHZAuEjPSt175Kmmx3r36Pg3 diff --git a/cc/dgb b/cc/dgb deleted file mode 100644 index 4428add..0000000 --- a/cc/dgb +++ /dev/null @@ -1 +0,0 @@ -DBHEv2ChbeQc7RJGaobMpwejK9tpgmi9FA diff --git a/cc/dot b/cc/dot deleted file mode 100644 index b574f33..0000000 --- a/cc/dot +++ /dev/null @@ -1 +0,0 @@ -13Mfiye1NW43JZKmr1MM2GxgJfbVvQFu9Rh3L83UMxYFUmRY diff --git a/cc/egld b/cc/egld deleted file mode 100644 index 165a8e9..0000000 --- a/cc/egld +++ /dev/null @@ -1 +0,0 @@ -erd1lz5tmvdvspyemykl05u34qqjj3tvkvze5n3hyac38dk37v2ymwasc6gyyg diff --git a/cc/eth b/cc/eth deleted file mode 100644 index fbe78a9..0000000 --- a/cc/eth +++ /dev/null @@ -1 +0,0 @@ -0xF9ef31EEea5956Cd193147E7D19b04f45cd9a38D diff --git a/cc/fil b/cc/fil deleted file mode 100644 index 08a2da0..0000000 --- a/cc/fil +++ /dev/null @@ -1 +0,0 @@ -f1unsj2vjm35jxvrctbvi2wxp2shsbvnvcaurszyq diff --git a/cc/hbar b/cc/hbar deleted file mode 100644 index 1d2d877..0000000 --- a/cc/hbar +++ /dev/null @@ -1 +0,0 @@ -0.0.892596 diff --git a/cc/icx b/cc/icx deleted file mode 100644 index dfc5515..0000000 --- a/cc/icx +++ /dev/null @@ -1 +0,0 @@ -hx02b19ad56ff68d3a0a725b04ef27dbf8996684a8 diff --git a/cc/ltc b/cc/ltc deleted file mode 100644 index ec662f1..0000000 --- a/cc/ltc +++ /dev/null @@ -1 +0,0 @@ -LVZGzfx6uPqJeTXPDUrCviBiyxveqvK2WK diff --git a/cc/luna b/cc/luna deleted file mode 100644 index 7872a9e..0000000 --- a/cc/luna +++ /dev/null @@ -1 +0,0 @@ -terra1rw6d6qkwqtlf38ncllt38axgwyu24ezlgx54wr diff --git a/cc/ont b/cc/ont deleted file mode 100644 index 597d656..0000000 --- a/cc/ont +++ /dev/null @@ -1 +0,0 @@ -AWEjJtRPkwL3VPwvp6G3wd96Z2oqAJ8s6s diff --git a/cc/qtum b/cc/qtum deleted file mode 100644 index a026b66..0000000 --- a/cc/qtum +++ /dev/null @@ -1 +0,0 @@ -QWDBhWadR1Xe2frRAZJ58LjzbMMff7udfH diff --git a/cc/sol b/cc/sol deleted file mode 100644 index 88bb5fb..0000000 --- a/cc/sol +++ /dev/null @@ -1 +0,0 @@ -FbDhn6rkT4x1uW6p9XufYwBrHeS53y56Q8vdo2eKb2Zc diff --git a/cc/theta b/cc/theta deleted file mode 100644 index 93a44fd..0000000 --- a/cc/theta +++ /dev/null @@ -1 +0,0 @@ -0x27d77039F7E852c72b15F824842E44A1295cC53A diff --git a/cc/trx b/cc/trx deleted file mode 100644 index a7fa108..0000000 --- a/cc/trx +++ /dev/null @@ -1 +0,0 @@ -TAFW2JVYXPfskGaoz4vu1oMwo6B72J2fEE diff --git a/cc/vet b/cc/vet deleted file mode 100644 index 6012dd5..0000000 --- a/cc/vet +++ /dev/null @@ -1 +0,0 @@ -0x877996962b331c032955fdb80B2AA7D6E78cb0d7 diff --git a/cc/xlm b/cc/xlm deleted file mode 100644 index 9ede2c8..0000000 --- a/cc/xlm +++ /dev/null @@ -1 +0,0 @@ -GAYZAZU7BZ3PLSBLHMBIARS2NXC77R5TZBHLWX7PZV474FWYOTIXCYTK diff --git a/cc/xmr b/cc/xmr deleted file mode 100644 index 8a8a416..0000000 --- a/cc/xmr +++ /dev/null @@ -1 +0,0 @@ -43NTvQEtdgTHfvm9vtj3tQDYJL9R3aja1QR98YkY2DgDi8gcWnfCYBJe9qgBerGiu6eE9JM65o8rhHxbNHySUcLf4yxyYpr diff --git a/cc/xno b/cc/xno deleted file mode 100644 index b0bc9fd..0000000 --- a/cc/xno +++ /dev/null @@ -1 +0,0 @@ -nano_1ade4pu7t6t46xj7ufw99itgxzu873r6exhazz5mddbiz3hje8j614qipw3f diff --git a/cc/xrp b/cc/xrp deleted file mode 100644 index 1e949f6..0000000 --- a/cc/xrp +++ /dev/null @@ -1 +0,0 @@ -rKyjesfPonKVordBMoiFj3UztMWxCLQ6CV diff --git a/cc/xtz b/cc/xtz deleted file mode 100644 index c2bc73a..0000000 --- a/cc/xtz +++ /dev/null @@ -1 +0,0 @@ -tz1iLTaChtfT3ZH45DoxrWxyjhRLnFzuLRwu diff --git a/cc/zec b/cc/zec deleted file mode 100644 index 0da982b..0000000 --- a/cc/zec +++ /dev/null @@ -1 +0,0 @@ -t1ceshuxTbpEf6XqCXPbaL1LSazyJUvgVFE diff --git a/cc/zil b/cc/zil deleted file mode 100644 index 9eba3bb..0000000 --- a/cc/zil +++ /dev/null @@ -1 +0,0 @@ -zil13yagsjncsd0xxk8jte43gu9ll8s2ezwes258fl diff --git a/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx b/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx deleted file mode 120000 index 41aa63b..0000000 --- a/in/.well-known/openpgpkey/hu/bs9ff8np9mc3c3uanz311ysm8ei3j1kx +++ /dev/null @@ -1 +0,0 @@ -social \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod b/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod deleted file mode 120000 index 0899c29..0000000 --- a/in/.well-known/openpgpkey/hu/e5a4bxki1ktx1jncwco5nkcofedmkxod +++ /dev/null @@ -1 +0,0 @@ -git \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/git b/in/.well-known/openpgpkey/hu/git deleted file mode 120000 index 687d959..0000000 --- a/in/.well-known/openpgpkey/hu/git +++ /dev/null @@ -1 +0,0 @@ -marc \ No newline at end of file diff --git a/in/.well-known/openpgpkey/hu/marc b/in/.well-known/openpgpkey/hu/marc deleted file mode 100644 index 312f125..0000000 Binary files a/in/.well-known/openpgpkey/hu/marc and /dev/null differ diff --git a/in/.well-known/openpgpkey/hu/social b/in/.well-known/openpgpkey/hu/social deleted file mode 120000 index 687d959..0000000 --- a/in/.well-known/openpgpkey/hu/social +++ /dev/null @@ -1 +0,0 @@ -marc \ No newline at end of file diff --git a/in/.well-known/openpgpkey/policy b/in/.well-known/openpgpkey/policy deleted file mode 100644 index e69de29..0000000 diff --git a/in/en/index.html b/in/en/index.html new file mode 100644 index 0000000..67570f9 --- /dev/null +++ b/in/en/index.html @@ -0,0 +1,551 @@ + + + + + + + +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 new file mode 100644 index 0000000..2ad41f6 --- /dev/null +++ b/in/fonts/forkawesome-webfont.css @@ -0,0 +1,2733 @@ +/*! +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 new file mode 100644 index 0000000..7a03153 Binary files /dev/null and b/in/fonts/forkawesome-webfont.woff2 differ diff --git a/in/fr/index.html b/in/fr/index.html new file mode 100644 index 0000000..76b0fd2 --- /dev/null +++ b/in/fr/index.html @@ -0,0 +1,551 @@ + + + + + + + +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 deleted file mode 100644 index 804b05e..0000000 --- a/in/img/ForgeJo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/in/img/InstaGram.png b/in/img/InstaGram.png deleted file mode 100644 index e388cb4..0000000 Binary files a/in/img/InstaGram.png and /dev/null differ diff --git a/in/img/KeyOxide.png b/in/img/KeyOxide.png deleted file mode 100644 index 249f088..0000000 Binary files a/in/img/KeyOxide.png and /dev/null differ diff --git a/in/img/LinkedIn.png b/in/img/LinkedIn.png deleted file mode 100644 index 40fb929..0000000 Binary files a/in/img/LinkedIn.png and /dev/null differ diff --git a/in/img/PeerTube.png b/in/img/PeerTube.png deleted file mode 100644 index 932a7ae..0000000 Binary files a/in/img/PeerTube.png and /dev/null differ diff --git a/in/img/PixelFed.svg b/in/img/PixelFed.svg deleted file mode 100644 index dfaf03f..0000000 --- a/in/img/PixelFed.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - 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 deleted file mode 100644 index 69f69ab..0000000 Binary files a/in/img/YouTube.png and /dev/null differ diff --git a/in/img/aae.png b/in/img/aae.png new file mode 100644 index 0000000..889a310 Binary files /dev/null and b/in/img/aae.png differ diff --git a/in/img/bluesky.svg b/in/img/bluesky.svg new file mode 100644 index 0000000..c71e201 --- /dev/null +++ b/in/img/bluesky.svg @@ -0,0 +1,4 @@ + + + + diff --git a/in/img/cdad-bdx.png b/in/img/cdad-bdx.png new file mode 100644 index 0000000..6bf098d Binary files /dev/null and b/in/img/cdad-bdx.png differ diff --git a/in/img/ceam.png b/in/img/ceam.png new file mode 100644 index 0000000..b81368d Binary files /dev/null and b/in/img/ceam.png differ diff --git a/in/img/cnam.png b/in/img/cnam.png new file mode 100644 index 0000000..06d62c6 Binary files /dev/null and b/in/img/cnam.png differ diff --git a/in/img/debian.jpeg b/in/img/debian.jpeg deleted file mode 100644 index ab060b0..0000000 Binary files a/in/img/debian.jpeg and /dev/null differ diff --git a/in/img/dirisi.png b/in/img/dirisi.png new file mode 100644 index 0000000..247bb95 Binary files /dev/null and b/in/img/dirisi.png differ diff --git a/in/img/en.png b/in/img/en.png new file mode 100644 index 0000000..32b6133 Binary files /dev/null and b/in/img/en.png differ diff --git a/in/img/en.svg b/in/img/en.svg deleted file mode 100644 index fcec86c..0000000 --- a/in/img/en.svg +++ /dev/null @@ -1,1119 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/in/img/forgejo.svg b/in/img/forgejo.svg new file mode 100644 index 0000000..9c46d82 --- /dev/null +++ b/in/img/forgejo.svg @@ -0,0 +1,40 @@ + + + + + Forgejo logo + Caesar Schinas + + + + + + + + + + + + + diff --git a/in/img/fr.png b/in/img/fr.png new file mode 100644 index 0000000..59cca8f Binary files /dev/null and b/in/img/fr.png differ diff --git a/in/img/fr.svg b/in/img/fr.svg deleted file mode 100644 index b50bd7e..0000000 --- a/in/img/fr.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/in/img/gaio.png b/in/img/gaio.png new file mode 100644 index 0000000..193fe53 Binary files /dev/null and b/in/img/gaio.png differ diff --git a/in/img/keyoxide.svg b/in/img/keyoxide.svg new file mode 100644 index 0000000..bc37abe --- /dev/null +++ b/in/img/keyoxide.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/in/img/link.svg b/in/img/link.svg new file mode 100644 index 0000000..0ef3a14 --- /dev/null +++ b/in/img/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/in/img/linkedin.svg b/in/img/linkedin.svg new file mode 100644 index 0000000..a5c4e76 --- /dev/null +++ b/in/img/linkedin.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/in/img/location.svg b/in/img/location.svg new file mode 100644 index 0000000..f443b44 --- /dev/null +++ b/in/img/location.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/in/img/mail.svg b/in/img/mail.svg new file mode 100644 index 0000000..dd0cc8c --- /dev/null +++ b/in/img/mail.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/in/img/marc.jpeg b/in/img/marc.jpeg deleted file mode 100644 index b8fabcc..0000000 Binary files a/in/img/marc.jpeg and /dev/null differ diff --git a/in/img/peertube.svg b/in/img/peertube.svg new file mode 100644 index 0000000..0e6e228 --- /dev/null +++ b/in/img/peertube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/in/img/rwx.svg b/in/img/rwx.svg new file mode 100644 index 0000000..7a2a9ee --- /dev/null +++ b/in/img/rwx.svg @@ -0,0 +1,54 @@ + + + + + + +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 new file mode 100644 index 0000000..42cb379 --- /dev/null +++ b/in/img/tel.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/in/img/theme.svg b/in/img/theme.svg new file mode 100644 index 0000000..64d26fd --- /dev/null +++ b/in/img/theme.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/in/img/web.svg b/in/img/web.svg new file mode 100644 index 0000000..0099d72 --- /dev/null +++ b/in/img/web.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/in/index.html b/in/index.html new file mode 120000 index 0000000..d7a7d75 --- /dev/null +++ b/in/index.html @@ -0,0 +1 @@ +en/index.html \ No newline at end of file diff --git a/in/marc.beninca.asc b/in/marc.beninca.asc deleted file mode 100644 index daf987b..0000000 --- a/in/marc.beninca.asc +++ /dev/null @@ -1,75 +0,0 @@ ------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 deleted file mode 100644 index 312f125..0000000 Binary files a/in/marc.beninca.pgp and /dev/null differ diff --git a/in/marc.beninca.vcf b/in/marc.beninca.vcf new file mode 100644 index 0000000..f84c741 --- /dev/null +++ b/in/marc.beninca.vcf @@ -0,0 +1,8 @@ +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 deleted file mode 100644 index 179b30f..0000000 Binary files a/in/pdf/cv.en.pdf and /dev/null differ diff --git a/in/pdf/cv.fr.pdf b/in/pdf/cv.fr.pdf deleted file mode 100644 index 0ad5cd8..0000000 Binary files a/in/pdf/cv.fr.pdf and /dev/null differ diff --git a/in/script/main.js b/in/script/main.js new file mode 100644 index 0000000..7b6582a --- /dev/null +++ b/in/script/main.js @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..9be33b8 --- /dev/null +++ b/in/style/debug.css @@ -0,0 +1,5 @@ +* { + border-color: lightgray; + border-style: dashed; + border-width: 1px; +} diff --git a/in/style/main.css b/in/style/main.css new file mode 100644 index 0000000..e0f4fc0 --- /dev/null +++ b/in/style/main.css @@ -0,0 +1,265 @@ +/* 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 new file mode 100644 index 0000000..25ddd3a --- /dev/null +++ b/in/style/reset.css @@ -0,0 +1,43 @@ +*::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 deleted file mode 100644 index 0c40c49..0000000 --- a/link.gv +++ /dev/null @@ -1,71 +0,0 @@ -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 deleted file mode 100644 index 30d5b30..0000000 --- a/pubnix.py +++ /dev/null @@ -1,61 +0,0 @@ -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 97ed378..c183e9e 100644 --- a/readme.md +++ b/readme.md @@ -1,13 +1,23 @@ -# Marc Beninca +# CV -## ToDo +## Tasks -## Nope - -### Email - - * biolink.me - -### GAFAM - - * about.me +* 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 diff --git a/sync.py b/sync.py deleted file mode 100755 index 2a63d5d..0000000 --- a/sync.py +++ /dev/null @@ -1,79 +0,0 @@ -#! /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 deleted file mode 100644 index fcb78a1..0000000 --- a/test.css +++ /dev/null @@ -1,40 +0,0 @@ -.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 deleted file mode 100644 index 982a6e6..0000000 --- a/test.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - -
- - -

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 deleted file mode 100644 index b482e7c..0000000 --- a/test.js +++ /dev/null @@ -1,29 +0,0 @@ -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') -}