diff --git a/.forgejo/workflows/main.yaml b/.forgejo/workflows/main.yaml new file mode 100644 index 0000000..0d10297 --- /dev/null +++ b/.forgejo/workflows/main.yaml @@ -0,0 +1,20 @@ +on: [push] +jobs: + job: + container: + image: ${{vars.DOCKER}}debian:bookworm + steps: + - name: spcd + env: + SPCD: ${{vars.SPCD}} + SPCD_GIT_RWX: ${{vars.SPCD_GIT_RWX}} + SPCD_GIT_SPCD: ${{vars.SPCD_GIT_SPCD}} + SPCD_SSH_HOSTS: ${{vars.SPCD_SSH_HOSTS}} + SPCD_SSH_KEY: ${{secrets.SPCD_SSH_KEY}} + SPCD_TXT_LOCALE: ${{vars.SPCD_TXT_LOCALE}} + run: ${{vars.SPCD}} + + - run: spcd-check-project + - run: spcd-build-project + - run: spcd-browse-workspace + - run: spcd-synchronize diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2e7327 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/out diff --git a/build.py b/build.py new file mode 100755 index 0000000..3f13417 --- /dev/null +++ b/build.py @@ -0,0 +1,36 @@ +#! /usr/bin/env python3 +"""Build resume.""" + +from os import sep +from pathlib import Path + +from rwx import fs +from rwx.ps import run + +if __name__ == "__main__": + root = Path(__file__).resolve().parent + root_input = root / "in" + root_output = root / "out" + web = root_output / "web" + fs.wipe(root_output) + fs.make_directory(web) + run( + "rsync", + "--archive", + "--partial", + "--progress", + "--verbose", + f"{root_input}{sep}", + f"{web}{sep}", + ) + run( + "qrencode", + ("--background", "00000000"), + ("--foreground", "000000FF"), + ("--level", "L"), + ("--margin", "1"), + ("--read-from", str(root_input / "marc.beninca.vcf")), + ("--size", "4"), + ("-t", "SVG"), + ("--output", str(web / "img" / "marc.beninca.svg")), + ) 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/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/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/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/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/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.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/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/readme.md b/readme.md new file mode 100644 index 0000000..c183e9e --- /dev/null +++ b/readme.md @@ -0,0 +1,23 @@ +# CV + +## Tasks + +* 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