First
This commit is contained in:
commit
e7339f67ea
176 changed files with 2751 additions and 0 deletions
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/static/** filter=lfs diff=lfs merge=lfs -text
|
||||
/assets/images/** filter=lfs diff=lfs merge=lfs -text
|
||||
/assets/videos/** filter=lfs diff=lfs merge=lfs -text
|
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Generated files by hugo
|
||||
/public/
|
||||
/resources/_gen/
|
||||
/assets/jsconfig.json
|
||||
hugo_stats.json
|
||||
|
||||
# Temporary lock file while building
|
||||
/.hugo_build.lock
|
5
archetypes/default.md
Normal file
5
archetypes/default.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
date = '{{ .Date }}'
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
tags = []
|
||||
+++
|
BIN
assets/images/posts/3dengine-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/3dengine-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/3dengine-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/3dengine-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/akadoc-1.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/akadoc-1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/akadoc-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/akadoc-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-3.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-3.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-4.jpg
(Stored with Git LFS)
Executable file
BIN
assets/images/posts/bornearcade-4.jpg
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
assets/images/posts/bornearcade-5.jpg
(Stored with Git LFS)
Executable file
BIN
assets/images/posts/bornearcade-5.jpg
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
assets/images/posts/bornearcade-6.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-6.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-7.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-7.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/bornearcade-8.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/bornearcade-8.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/burgerquizz-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/burgerquizz-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/burgerquizz-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/burgerquizz-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/clubelec-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/clubelec-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/clubelec-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/clubelec-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/drone-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/drone-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/drone-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/drone-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/drone-3.webm
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/drone-3.webm
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/fan-controller-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/fan-controller-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/fan-controller-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/fan-controller-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/fan-controller-3.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/fan-controller-3.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/fan-controller-4.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/fan-controller-4.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/genesys-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/genesys-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/gitcourse-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/gitcourse-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hardenyourcode-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hardenyourcode-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hardenyourcode-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hardenyourcode-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hardenyourcode-3.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hardenyourcode-3.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hedgeclog-1.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hedgeclog-1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hedgeclog-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hedgeclog-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hedgeclog-3.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hedgeclog-3.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hedgeclog-feedback-1.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hedgeclog-feedback-1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/hedgeclog-feedback-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/hedgeclog-feedback-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/lcda-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/lcda-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/lcda-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/lcda-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/lcda-3.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/lcda-3.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/lcdaaccounts-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/lcdaaccounts-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/lcdaaccounts-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/lcdaaccounts-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/ludum32-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/ludum32-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/ludum32-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/ludum32-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/matrixrun-wiidesktopvr.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/matrixrun-wiidesktopvr.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/metadata.yaml
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/metadata.yaml
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/microtransat-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/microtransat-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/microtransat-2.jpg
(Stored with Git LFS)
Executable file
BIN
assets/images/posts/microtransat-2.jpg
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
assets/images/posts/microtransat-3.jpg
(Stored with Git LFS)
Executable file
BIN
assets/images/posts/microtransat-3.jpg
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
assets/images/posts/microtransat-4.jpg
(Stored with Git LFS)
Executable file
BIN
assets/images/posts/microtransat-4.jpg
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
assets/images/posts/navalwars-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/navalwars-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/navalwars-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/navalwars-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwn2-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwn2-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwn2-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwn2-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwn2-3.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwn2-3.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwngui-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwngui-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwngui-2.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwngui-2.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwnlog-1.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwnlog-1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/nwnlog-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/nwnlog-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/rhumroll-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/rhumroll-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/served-1.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/served-1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/served-2.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/served-2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/served-3.png
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/served-3.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/stneverwinterscript-1.gif
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/stneverwinterscript-1.gif
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/images/posts/thales-1.jpg
(Stored with Git LFS)
Normal file
BIN
assets/images/posts/thales-1.jpg
(Stored with Git LFS)
Normal file
Binary file not shown.
70
assets/sass/fonts.scss
Normal file
70
assets/sass/fonts.scss
Normal file
|
@ -0,0 +1,70 @@
|
|||
|
||||
/* noto-serif-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Noto Serif';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('/fonts/noto-serif-v6-latin-regular.eot'); /* IE9 Compat Modes */
|
||||
src: local('Noto Serif'), local('NotoSerif'),
|
||||
url('/fonts/noto-serif-v6-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/noto-serif-v6-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-regular.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/noto-serif-v6-latin-regular.svg#NotoSerif') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
|
||||
/* noto-serif-italic - latin */
|
||||
@font-face {
|
||||
font-family: 'Noto Serif';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('/fonts/noto-serif-v6-latin-italic.eot'); /* IE9 Compat Modes */
|
||||
src: local('Noto Serif Italic'), local('NotoSerif-Italic'),
|
||||
url('/fonts/noto-serif-v6-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/noto-serif-v6-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-italic.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/noto-serif-v6-latin-italic.svg#NotoSerif') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
|
||||
/* noto-serif-700 - latin */
|
||||
@font-face {
|
||||
font-family: 'Noto Serif';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('/fonts/noto-serif-v6-latin-700.eot'); /* IE9 Compat Modes */
|
||||
src: local('Noto Serif Bold'), local('NotoSerif-Bold'),
|
||||
url('/fonts/noto-serif-v6-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/noto-serif-v6-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-700.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/noto-serif-v6-latin-700.svg#NotoSerif') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
|
||||
/* noto-serif-700italic - latin */
|
||||
@font-face {
|
||||
font-family: 'Noto Serif';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('/fonts/noto-serif-v6-latin-700italic.eot'); /* IE9 Compat Modes */
|
||||
src: local('Noto Serif Bold Italic'), local('NotoSerif-BoldItalic'),
|
||||
url('/fonts/noto-serif-v6-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/noto-serif-v6-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-700italic.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/noto-serif-v6-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/noto-serif-v6-latin-700italic.svg#NotoSerif') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
|
||||
/* croissant-one-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Croissant One';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('/fonts/croissant-one-v5-latin-regular.eot'); /* IE9 Compat Modes */
|
||||
src: local('Croissant One'), local('CroissantOne-Regular'),
|
||||
url('/fonts/croissant-one-v5-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/croissant-one-v5-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/croissant-one-v5-latin-regular.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/croissant-one-v5-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/croissant-one-v5-latin-regular.svg#CroissantOne') format('svg'); /* Legacy iOS */
|
||||
}
|
28
assets/sass/lightbox-ovr.scss
Normal file
28
assets/sass/lightbox-ovr.scss
Normal file
|
@ -0,0 +1,28 @@
|
|||
|
||||
|
||||
#lightbox{
|
||||
.lb-cancel {
|
||||
background-image: url(#{$ImgPath}/ui/loading.gif)
|
||||
}
|
||||
.lb-nav a.lb-prev{
|
||||
background-image: url(#{$ImgPath}/ui/prev.png);
|
||||
}
|
||||
.lb-nav a.lb-next {
|
||||
background-image: url(#{$ImgPath}/ui/next.png);
|
||||
}
|
||||
.lb-data .lb-close {
|
||||
background-image: url(#{$ImgPath}/ui/close.png);
|
||||
}
|
||||
|
||||
|
||||
.lb-outerContainer {
|
||||
background-image: url(#{$ImgPath}/ui/bgdark.png);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.lb-image {
|
||||
border: 4px solid $ClrBlack;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
}
|
92
assets/sass/main.scss
Normal file
92
assets/sass/main.scss
Normal file
|
@ -0,0 +1,92 @@
|
|||
$ClrWhite: #FAFAFA;
|
||||
$ClrTrueWhite: #FFFFFF;
|
||||
$ClrText: #3A4145;
|
||||
$ClrBlack: #202020;
|
||||
$ClrTrueBlack: #000000;
|
||||
|
||||
|
||||
$FontTitle: 'Croissant One',cursive;
|
||||
$FontText: 'Noto Serif',serif;
|
||||
|
||||
$ImgPath: /images;
|
||||
|
||||
@import "fonts.scss";
|
||||
@import "nav.scss";
|
||||
@import "section.scss";
|
||||
@import "monokai.scss";
|
||||
@import "lightbox-ovr.scss";
|
||||
|
||||
body{
|
||||
background-image: url(/images/ui/gnome3.jpg);
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
|
||||
font-family: $FontText;
|
||||
font-size: 1.8rem;
|
||||
color: #3A4145;
|
||||
}
|
||||
img.avatar {
|
||||
border: none;
|
||||
border-radius: 0 0 50% 50%;
|
||||
max-height: 200px;
|
||||
filter: drop-shadow(0px 0px 8px rgba(0, 0, 0, 0.4));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=====================================================================
|
||||
Spécifique aux pages
|
||||
*/
|
||||
|
||||
@media screen and (min-width: $ArticleMaxWidth + $NavLeft_Width) {
|
||||
div#content{
|
||||
left: $NavLeft_Width;
|
||||
}
|
||||
div#left {
|
||||
left: 0px;
|
||||
.arrow{
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: $ArticleMaxWidth + $NavLeft_Width) {
|
||||
div#content {
|
||||
main {
|
||||
article {
|
||||
max-width: 100%;
|
||||
border-radius: 0;
|
||||
h1:first-child {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
body[data-page=home] {
|
||||
div#content{
|
||||
left: $NavLeft_Width;
|
||||
}
|
||||
div#left{
|
||||
left: 0px;
|
||||
.arrow{
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
body.skills{
|
||||
main{
|
||||
article{
|
||||
.skillexcellent, .skillgood, .skillmed, .skillknown, .skillperso, .skillstudy{
|
||||
padding: 0 3px 0 3px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.skillexcellent {background: linear-gradient(#00C107, #00A806);}
|
||||
.skillgood {background: linear-gradient(#73C100, #64A800);}
|
||||
.skillmed {background: linear-gradient(#BAC100, #A2A800);}
|
||||
.skillknown {background: linear-gradient(#C18F00, #A87D00);}
|
||||
.skillperso {border-style: solid; border-width: 2px; border-color: #8000FF;}
|
||||
.skillstudy {border-style: solid; border-width: 2px; border-color: #9E9E9E;}
|
||||
}
|
||||
}
|
||||
} */
|
154
assets/sass/monokai.scss
Normal file
154
assets/sass/monokai.scss
Normal file
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
|
||||
Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
|
||||
|
||||
*/
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 0.5em;
|
||||
background: #23241f;
|
||||
-webkit-text-size-adjust: none;
|
||||
}
|
||||
|
||||
.hljs,
|
||||
.hljs-tag,
|
||||
.css .hljs-rule,
|
||||
.css .hljs-value,
|
||||
.aspectj .hljs-function,
|
||||
.css .hljs-function
|
||||
.hljs-preprocessor,
|
||||
.hljs-pragma {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.hljs-strongemphasis,
|
||||
.hljs-strong,
|
||||
.hljs-emphasis {
|
||||
color: #a8a8a2;
|
||||
}
|
||||
|
||||
.hljs-bullet,
|
||||
.hljs-blockquote,
|
||||
.hljs-horizontal_rule,
|
||||
.hljs-number,
|
||||
.hljs-regexp,
|
||||
.alias .hljs-keyword,
|
||||
.hljs-literal,
|
||||
.hljs-hexcolor {
|
||||
color: #ae81ff;
|
||||
}
|
||||
|
||||
.hljs-tag .hljs-value,
|
||||
.hljs-code,
|
||||
.hljs-title,
|
||||
.css .hljs-class,
|
||||
.hljs-class .hljs-title:last-child {
|
||||
color: #a6e22e;
|
||||
}
|
||||
|
||||
.hljs-link_url {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
.hljs-strong,
|
||||
.hljs-strongemphasis {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hljs-emphasis,
|
||||
.hljs-strongemphasis,
|
||||
.hljs-class .hljs-title:last-child,
|
||||
.hljs-typename {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.ruby .hljs-class .hljs-keyword:first-child,
|
||||
.ruby .hljs-function .hljs-keyword,
|
||||
.hljs-function,
|
||||
.hljs-change,
|
||||
.hljs-winutils,
|
||||
.hljs-flow,
|
||||
.nginx .hljs-title,
|
||||
.tex .hljs-special,
|
||||
.hljs-header,
|
||||
.hljs-attribute,
|
||||
.hljs-symbol,
|
||||
.hljs-symbol .hljs-string,
|
||||
.hljs-tag .hljs-title,
|
||||
.hljs-value,
|
||||
.alias .hljs-keyword:first-child,
|
||||
.css .hljs-tag,
|
||||
.css .unit,
|
||||
.css .hljs-important {
|
||||
color: #f92672;
|
||||
}
|
||||
|
||||
.hljs-function .hljs-keyword,
|
||||
.hljs-class .hljs-keyword:first-child,
|
||||
.hljs-aspect .hljs-keyword:first-child,
|
||||
.hljs-constant,
|
||||
.hljs-typename,
|
||||
.hljs-name,
|
||||
.css .hljs-attribute {
|
||||
color: #66d9ef;
|
||||
}
|
||||
|
||||
.hljs-variable,
|
||||
.hljs-params,
|
||||
.hljs-class .hljs-title,
|
||||
.hljs-aspect .hljs-title {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.css .hljs-id,
|
||||
.hljs-subst,
|
||||
.hljs-type,
|
||||
.ruby .hljs-class .hljs-parent,
|
||||
.hljs-built_in,
|
||||
.django .hljs-template_tag,
|
||||
.django .hljs-variable,
|
||||
.smalltalk .hljs-class,
|
||||
.django .hljs-filter .hljs-argument,
|
||||
.smalltalk .hljs-localvars,
|
||||
.smalltalk .hljs-array,
|
||||
.hljs-attr_selector,
|
||||
.hljs-pseudo,
|
||||
.hljs-addition,
|
||||
.hljs-stream,
|
||||
.hljs-envvar,
|
||||
.apache .hljs-tag,
|
||||
.apache .hljs-cbracket,
|
||||
.tex .hljs-command,
|
||||
.hljs-prompt,
|
||||
.hljs-link_label,
|
||||
.hljs-link_url {
|
||||
color: #e6db74;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-annotation,
|
||||
.hljs-decorator,
|
||||
.hljs-pi,
|
||||
.hljs-doctype,
|
||||
.hljs-deletion,
|
||||
.hljs-shebang,
|
||||
.apache .hljs-sqbracket,
|
||||
.tex .hljs-formula {
|
||||
color: #75715e;
|
||||
}
|
||||
|
||||
.coffeescript .javascript,
|
||||
.javascript .xml,
|
||||
.tex .hljs-formula,
|
||||
.xml .javascript,
|
||||
.xml .vbscript,
|
||||
.xml .css,
|
||||
.xml .hljs-cdata,
|
||||
.xml .php,
|
||||
.php .xml {
|
||||
opacity: 0.5;
|
||||
}
|
122
assets/sass/nav.scss
Normal file
122
assets/sass/nav.scss
Normal file
|
@ -0,0 +1,122 @@
|
|||
$NavLeft_Width: 200px;
|
||||
$NavLeft_HiddenWidth: 20px;
|
||||
|
||||
div#left {
|
||||
position: fixed;
|
||||
left: $NavLeft_HiddenWidth - $NavLeft_Width;
|
||||
width: $NavLeft_Width;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
z-index: 1;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 0 1px 0 0;
|
||||
border-color: $ClrTrueBlack;
|
||||
|
||||
background-image: url(#{$ImgPath}/ui/bggray.png);
|
||||
box-shadow: -4px 0px 10px $ClrBlack inset;
|
||||
|
||||
text-align: center;
|
||||
font-size: large;
|
||||
|
||||
transition-property: left;
|
||||
transition-duration: 0.2s;
|
||||
transition-delay: 0.1s;
|
||||
|
||||
.arrow {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
height: 35px;
|
||||
|
||||
transition-property: opacity;
|
||||
transition-duration: 0.2s;
|
||||
transition-delay: 0.1s;
|
||||
}
|
||||
|
||||
// profile pic =====================================
|
||||
header {
|
||||
margin: 20px 0 10px 0;
|
||||
|
||||
figcaption {
|
||||
color: $ClrWhite;
|
||||
font-family: $FontTitle;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
font-size: 1.2em;
|
||||
text-decoration: none;
|
||||
}
|
||||
img {
|
||||
max-width: 80%;
|
||||
}
|
||||
}
|
||||
|
||||
nav {
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
|
||||
// <a> =====================================
|
||||
a {
|
||||
outline: none !important;
|
||||
|
||||
display: block;
|
||||
padding: 5px;
|
||||
margin: 7px 20px 7px 20px;
|
||||
|
||||
background-color: #303030;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #000;
|
||||
border-radius: 3px;
|
||||
|
||||
color: $ClrWhite;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
font-size: 1.2em;
|
||||
|
||||
transition-property: border-color background-color;
|
||||
transition-duration: 0.1s;
|
||||
}
|
||||
a:hover {
|
||||
background-color: #383838;
|
||||
border-color: #202020;
|
||||
}
|
||||
a:active,
|
||||
a.active {
|
||||
background-color: #215d9c;
|
||||
}
|
||||
|
||||
a.external:after {
|
||||
content: "↳ ";
|
||||
}
|
||||
a.external:hover {
|
||||
border-color: #013d6c;
|
||||
}
|
||||
a.logo {
|
||||
display: inline-block;
|
||||
border-style: none;
|
||||
background: none;
|
||||
img {
|
||||
height: 48px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <footer> =====================================
|
||||
footer {
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
div#left:hover,
|
||||
div#left:active {
|
||||
left: 0px;
|
||||
.arrow {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
419
assets/sass/section.scss
Normal file
419
assets/sass/section.scss
Normal file
|
@ -0,0 +1,419 @@
|
|||
$ArticleMaxWidth: 800px;
|
||||
|
||||
@keyframes UnwrapHeader {
|
||||
from {
|
||||
margin-left: 40%;
|
||||
margin-right: 40%;
|
||||
}
|
||||
to {
|
||||
margin-left: 40px;
|
||||
margin-right: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
$ArticleBorderWidth: 4px;
|
||||
$ArticlePadding: 20px;
|
||||
$ArticleBorderRadius: 20px;
|
||||
$ArticleFinalMargins: #{$ArticleBorderWidth + $ArticleBorderRadius};
|
||||
|
||||
div#content {
|
||||
position: absolute;
|
||||
left: 20px;
|
||||
right: 0px;
|
||||
transition-property: left;
|
||||
transition-duration: 0.2s;
|
||||
transition-delay: 0.1s;
|
||||
|
||||
header {
|
||||
margin: 30px 30px 60px 30px;
|
||||
|
||||
color: $ClrWhite;
|
||||
|
||||
font-family: $FontText;
|
||||
font-style: italic;
|
||||
font-size: 1.3em;
|
||||
text-align: center;
|
||||
text-shadow: 0 0 10px $ClrTrueBlack;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 0 5px 0 5px;
|
||||
border-color: $ClrWhite;
|
||||
border-radius: 20px;
|
||||
|
||||
overflow: hidden;
|
||||
animation: UnwrapHeader 1.5s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
article {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: $ArticlePadding;
|
||||
padding-top: 0;
|
||||
margin-bottom: 3em;
|
||||
|
||||
color: $ClrBlack;
|
||||
|
||||
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.8);
|
||||
border-style: solid;
|
||||
border-width: $ArticleBorderWidth;
|
||||
border-color: #ffffff;
|
||||
border-radius: $ArticleBorderRadius;
|
||||
background-color: $ClrWhite;
|
||||
|
||||
max-width: $ArticleMaxWidth;
|
||||
|
||||
font-size: 0.6em;
|
||||
line-height: 1.3em;
|
||||
|
||||
transition-property: border-radius;
|
||||
transition-duration: 0.5s;
|
||||
|
||||
h1:first-child {
|
||||
margin: 0;
|
||||
margin-top: -$ArticleFinalMargins;
|
||||
margin-left: -$ArticleFinalMargins;
|
||||
width: 100%;
|
||||
padding: 0.6em $ArticleFinalMargins;
|
||||
|
||||
border-radius: $ArticleBorderRadius $ArticleBorderRadius 0 0;
|
||||
|
||||
background-color: #215d9c;
|
||||
background-image: url("#{$ImgPath}/ui/stripes.png");
|
||||
|
||||
color: $ClrWhite;
|
||||
font-family: $FontTitle;
|
||||
font-weight: bold;
|
||||
font-size: 1.7em;
|
||||
text-align: left;
|
||||
|
||||
letter-spacing: -0.03em;
|
||||
|
||||
transition-property: border-radius;
|
||||
transition-duration: 0.5s;
|
||||
|
||||
a {
|
||||
color: $ClrWhite;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
float: right;
|
||||
display: inline;
|
||||
margin: auto;
|
||||
height: 1em;
|
||||
|
||||
&.left {
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 0 (-$ArticleFinalMargins);
|
||||
padding: 0.4em $ArticleFinalMargins;
|
||||
border-top: 1px solid #d5d5d5;
|
||||
border-bottom: 1px solid #d5d5d5;
|
||||
|
||||
background-image: url("#{$ImgPath}/ui/stripes.png");
|
||||
|
||||
color: $ClrText;
|
||||
font-family: $FontTitle;
|
||||
// padding-left: 10px;
|
||||
font-size: x-large;
|
||||
|
||||
a,
|
||||
a:visited {
|
||||
color: $ClrText;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: $ClrText;
|
||||
font-family: $FontTitle;
|
||||
margin-bottom: 0.5em;
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
h4 {
|
||||
color: $ClrText;
|
||||
font-family: $FontTitle;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin-left: -$ArticleFinalMargins;
|
||||
width: calc(100% + #{$ArticleFinalMargins} * 2);
|
||||
|
||||
border-style: solid;
|
||||
border-width: 0.2em;
|
||||
border-color: rgba(0, 0, 0, 0.1);
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
position: relative;
|
||||
|
||||
padding: 0.5em 1em;
|
||||
margin: 10px;
|
||||
|
||||
background-color: #eee;
|
||||
border-radius: 0.5em;
|
||||
font-style: italic;
|
||||
|
||||
legend {
|
||||
position: relative;
|
||||
right: -0.5em;
|
||||
height: 0;
|
||||
bottom: 1em;
|
||||
color: #888;
|
||||
text-align: right;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
&:after {
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
||||
content: "";
|
||||
|
||||
width: 0;
|
||||
top: 20px;
|
||||
left: -20px;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 15px 20px 15px 0;
|
||||
border-color: transparent #eee;
|
||||
}
|
||||
}
|
||||
|
||||
img,
|
||||
video,
|
||||
iframe {
|
||||
&:not(.raw) &:not(.avatar) {
|
||||
max-height: 150px;
|
||||
width: auto;
|
||||
vertical-align: middle;
|
||||
|
||||
margin: 5px;
|
||||
|
||||
border: 3px solid black;
|
||||
border-radius: 2px;
|
||||
transition-property: border-color;
|
||||
transition-duration: 0.3s;
|
||||
}
|
||||
}
|
||||
video {
|
||||
width: 80%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #215d9c;
|
||||
img:hover,
|
||||
video:hover,
|
||||
iframe:hover {
|
||||
border-color: #808080;
|
||||
}
|
||||
&:hover {
|
||||
color: #2b7acc;
|
||||
}
|
||||
&.gototop {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 28px;
|
||||
background-image: url(#{$ImgPath}/ui/gototop.svg);
|
||||
background-position: center;
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
}
|
||||
|
||||
strong {
|
||||
color: #2f3a45;
|
||||
}
|
||||
|
||||
img.nostyle {
|
||||
height: auto;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
img.fill {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.cinema {
|
||||
margin: 0;
|
||||
margin-left: -$ArticleFinalMargins;
|
||||
width: 100%;
|
||||
padding: 10px $ArticleFinalMargins;
|
||||
|
||||
border-top: 1px solid #000;
|
||||
border-bottom: 1px solid #000;
|
||||
|
||||
color: $ClrWhite;
|
||||
|
||||
background-image: url("#{$ImgPath}/ui/bgdark.png");
|
||||
box-shadow: 0px 0px 10px #000 inset;
|
||||
|
||||
img,
|
||||
video,
|
||||
iframe {
|
||||
border-width: 1px;
|
||||
border-radius: 0;
|
||||
height: 150px;
|
||||
|
||||
margin: 5px -5px;
|
||||
border-left: 5px solid #000;
|
||||
border-right: 5px solid #000;
|
||||
}
|
||||
a {
|
||||
margin: 0.5em;
|
||||
img:hover,
|
||||
video:hover,
|
||||
iframe:hover {
|
||||
border-color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
margin-top: -$ArticleFinalMargins;
|
||||
padding-top: 20px;
|
||||
border-radius: 20px 20px 0 0;
|
||||
}
|
||||
&:last-child {
|
||||
margin-bottom: -$ArticleFinalMargins;
|
||||
padding-bottom: 20px;
|
||||
border-radius: 0 0 20px 20px;
|
||||
}
|
||||
|
||||
&.centered{
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.9em;
|
||||
padding: 0 0.3em;
|
||||
border-radius: 5px;
|
||||
|
||||
background-color: #ccc;
|
||||
border: 1px solid #888;
|
||||
}
|
||||
|
||||
// Code blocks
|
||||
pre {
|
||||
border-top: 1px solid #000;
|
||||
border-bottom: 1px solid #000;
|
||||
padding: 0.5em;
|
||||
border-radius: 10px;
|
||||
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin: 0;
|
||||
|
||||
color: $ClrWhite;
|
||||
|
||||
background-image: url("#{$ImgPath}/ui/bggray.png");
|
||||
box-shadow: 0px 0px 10px #000 inset;
|
||||
|
||||
code,
|
||||
pre {
|
||||
margin-bottom: 0px;
|
||||
|
||||
padding: 0;
|
||||
border-radius: 0;
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
> pre {
|
||||
display: block;
|
||||
margin-left: -$ArticleFinalMargins;
|
||||
width: 100%;
|
||||
padding: 10px $ArticleFinalMargins;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin-bottom: 15px;
|
||||
|
||||
figcaption {
|
||||
font-size: small;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
ul {
|
||||
margin-top: 5px;
|
||||
}
|
||||
li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.canvas-container {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-around;
|
||||
|
||||
> * {
|
||||
align-self: center;
|
||||
}
|
||||
}
|
||||
|
||||
div.tags {
|
||||
margin-right: -$ArticleBorderRadius / 2;
|
||||
margin-bottom: -$ArticleBorderRadius / 2;
|
||||
text-align: right;
|
||||
font-size: 0.9em;
|
||||
a {
|
||||
background-color: #bfd6ef;
|
||||
border-radius:0.25em;
|
||||
padding: 0.1em 0.3em;
|
||||
margin-left: 0.3em;
|
||||
&:before {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
left: -0.7em;
|
||||
margin-right: -0.5em;
|
||||
top: -0.12em;
|
||||
|
||||
content: "";
|
||||
vertical-align: middle;
|
||||
|
||||
border-style: solid;
|
||||
border-width: 0.5em 0.5em 0.5em 0;
|
||||
border-color: transparent #bfd6ef;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
body[data-width="small"] {
|
||||
div#content {
|
||||
main {
|
||||
article {
|
||||
max-width: 100%;
|
||||
border-radius: 0;
|
||||
h1 {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
.spacer {
|
||||
height: 60vh;
|
||||
}
|
BIN
assets/videos/3dprinter.mp4
(Stored with Git LFS)
Normal file
BIN
assets/videos/3dprinter.mp4
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/videos/3dprinter.webm
(Stored with Git LFS)
Normal file
BIN
assets/videos/3dprinter.webm
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/videos/drone.mp4
(Stored with Git LFS)
Normal file
BIN
assets/videos/drone.mp4
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/videos/matrixrun.mp4
(Stored with Git LFS)
Normal file
BIN
assets/videos/matrixrun.mp4
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/videos/matrixrun.webm
(Stored with Git LFS)
Normal file
BIN
assets/videos/matrixrun.webm
(Stored with Git LFS)
Normal file
Binary file not shown.
43
content/_index.md
Normal file
43
content/_index.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
+++
|
||||
title = 'Home'
|
||||
[params]
|
||||
page = 'home'
|
||||
+++
|
||||
|
||||
# Welcome
|
||||
|
||||
<p style="text-align: center">
|
||||
<img class="avatar" src="/images/avatar.png" alt="My usual profil picture, created by LoadingArtist"/>
|
||||
</p>
|
||||
|
||||
|
||||
I'm _Thibaut CHARLES_, AKA CromFr
|
||||
|
||||
I am a French engineer who __loves__ computer sciences, especially when it is related to __Linux__ and __low level__ or __performance constrained__ programming.
|
||||
|
||||
## Contact me
|
||||
|
||||
- Mail: thibaut.charles.fr@gmail.com
|
||||
- On [Matrix](https://matrix.org/blog/home/): [@CromFr:matrix.org](https://matrix.to/#/@CromFr:matrix.org)
|
||||
- [PGP key](http://keys.gnupg.net/pks/lookup?op=get&search=0x568E61BBFB6DA047): `8A4B D04D A8BB 3247 20C1 B842 568E 61BB FB6D A047`
|
||||
|
||||
## Accounts
|
||||
|
||||
[](https://toot.cat/@CromFr)
|
||||
[](https://bsky.app/profile/tcharles.fr)
|
||||
.
|
||||
[](https://gitlab.com/CromFr)
|
||||
[](https://github.com/CromFr)
|
||||
[](https://git.tcharles.fr)
|
||||
.
|
||||
[](https://keybase.io/crom)
|
||||
|
||||
## Resume
|
||||
|
||||
Send me an email at thibaut.charles.fr@gmail.com and I'll send you my resume as soon as possible!
|
||||
|
||||
## Legacy accounts (abandoned)
|
||||
|
||||
[](https://www.facebook.com/thibaut.charles29)
|
||||
[](https://www.linkedin.com/pub/thibaut-charles/8a/3b4/2a4)
|
||||
[](https://twitter.com/CromFR)
|
118
content/aboutme/_index.md
Normal file
118
content/aboutme/_index.md
Normal file
|
@ -0,0 +1,118 @@
|
|||
+++
|
||||
date = '2025-02-05T15:20:58+01:00'
|
||||
title = 'About me'
|
||||
weight = 20
|
||||
+++
|
||||
|
||||
|
||||
dzdqdqzd
|
||||
|
||||
|
||||
<article>
|
||||
# I am...
|
||||
|
||||
### [Passionate ♥](#what-i-love)
|
||||
### [Engineer](#education)
|
||||
### [{Programmer}](#programming)
|
||||
### [System Admin ⚙](#sysadmin)
|
||||
### [Project Manager](#projectmgr)
|
||||
### [Polyvalent ⚒](#other)
|
||||
|
||||
</article>
|
||||
|
||||
<article>
|
||||
# What I love
|
||||
|
||||
<div class="canvas-container">
|
||||
<canvas id="whatilove_" height="400px"></canvas>
|
||||
<canvas id="howilearnt" height="400px"></canvas>
|
||||
</div>
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
|
||||
</article>
|
||||
|
||||
|
||||
<article>
|
||||
|
||||
# Education
|
||||
|
||||
### 2015: [Engineer diploma](https://repertoire.iesf.fr/#profile/7ad768dca365416530f522697e78f623)
|
||||
|
||||
<div class="center">
|
||||
__✓ Engineer Degree__<br/>
|
||||
at ISEN Brest, France
|
||||
</div>
|
||||
|
||||
|
||||
### 2013-2015: ISEN Brest
|
||||
|
||||
[Robotics Major](https://isen-brest.fr/formation-ingenieur/domaines-professionnels/robotique-mobile/)<br/>
|
||||
_I wanted a major that was combining of electronics and computer sciences. The robotics major was the one that most meets my requirements_
|
||||
|
||||
|
||||
### 2011-2013: ISEN Brest
|
||||
[Computer science and Network cycle](https://isen-brest.fr/formation-ingenieur/ingenieur-informatique/) - 2nd & 3rd year<br/>
|
||||
_The standard program didn't suit me because there were not enough computer sciences courses. When I was offered to switch to the Computer science and Network cycle, I immediately accepted._
|
||||
|
||||
### 2010-2011: ISEN Brest
|
||||
[Intensive programs on Mathematics and Physics](https://isen-brest.fr/formation-ingenieur/ingenieur-generaliste/) - 1st year<br/>
|
||||
_Following my high school diploma, I wanted to attend an engineering school specialized in electronics and computer sciences._
|
||||
|
||||
|
||||
### More
|
||||
- [ISEN Brest website](https://isen-brest.fr/)
|
||||
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
</article>
|
||||
|
||||
|
||||
<article>
|
||||
<h1 id="programming">Programming</h1>
|
||||
|
||||
<div class="canvas-container">
|
||||
<canvas id="theory" width="600px" height="300px"></canvas>
|
||||
<canvas id="proglanguages" width="600px" height="300px"></canvas>
|
||||
</div>
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h1 id="sysadmin">System Admin</h1>
|
||||
|
||||
<div class="canvas-container">
|
||||
<canvas id="linux" width="600px" height="300px"></canvas>
|
||||
<canvas id="network" width="600px" height="300px"></canvas>
|
||||
</div>
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
</article>
|
||||
|
||||
|
||||
<article>
|
||||
<h1 id="projectmgr">Project Management</h1>
|
||||
|
||||
<div class="canvas-container">
|
||||
<canvas id="tools" width="600px" height="300px"></canvas>
|
||||
</div>
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
# Other
|
||||
|
||||
## Softwares
|
||||
- LibreOffice, Microsoft office
|
||||
- Drawing: Photoshop, Gimp, Krita, Inkscape
|
||||
- 3D Modeling: Solidworks, Blender
|
||||
- Electronics modeling: ISIS Proteus
|
||||
|
||||
## Languages
|
||||
- French: Native
|
||||
- English: First Certificate of English diploma, fluent
|
||||
- Spanish: Medium level
|
||||
|
||||
## Manual Work
|
||||
- DIY & Models
|
||||
- PC assembling & modding (see my [latest PC mod](https://forum.hardware.fr/hfr/OverclockingCoolingModding/Modding/workblog-shinobi-white-sujet_278883_1.htm))
|
||||
|
||||
<a class="gototop" href="#i-am-"></a>
|
||||
</article>
|
41
content/aboutme/posts/education.md
Normal file
41
content/aboutme/posts/education.md
Normal file
|
@ -0,0 +1,41 @@
|
|||
+++
|
||||
title = 'Education'
|
||||
weight = 10
|
||||
+++
|
||||
|
||||
### 2015: [Engineer diploma](https://repertoire.iesf.fr/#profile/7ad768dca365416530f522697e78f623)
|
||||
|
||||
<div class="center">
|
||||
<b>✓ Engineer Degree</b><br/>
|
||||
at ISEN Brest, France
|
||||
</div>
|
||||
|
||||
### 2013-2015: ISEN Brest
|
||||
|
||||
[Robotics Major](https://isen-brest.fr/formation-ingenieur/domaines-professionnels/robotique-mobile/)<br/>
|
||||
_I wanted a major that was combining of electronics and computer sciences. The robotics major was the one that most meets my requirements_
|
||||
|
||||
### 2011-2013: ISEN Brest
|
||||
[Computer science and Network cycle](https://isen-brest.fr/formation-ingenieur/ingenieur-informatique/) - 2nd & 3rd year<br/>
|
||||
_The standard program didn't suit me because there were not enough computer sciences courses. When I was offered to switch to the Computer science and Network cycle, I immediately accepted._
|
||||
|
||||
### 2010-2011: ISEN Brest
|
||||
[Intensive programs on Mathematics and Physics](https://isen-brest.fr/formation-ingenieur/ingenieur-generaliste/) - 1st year<br/>
|
||||
_Following my high school diploma, I wanted to attend an engineering school specialized in electronics and computer sciences._
|
||||
|
||||
<!--more-->
|
||||
|
||||
### 2008: Learnt NWScript, joined _La Colère d'Aurile_
|
||||
|
||||
In 2008 I started learning NWScript, a C-like language for programming events in the game _Neverwinter Nights 2_. Shortly after, I joined a community of developpers that was working on _La Colère d'Aurile_, a custom _Neverwinter Nights 2_ server. I am still working on the same server, now as the main server admin and developer.
|
||||
|
||||
|
||||
### 2007: First lines of code
|
||||
|
||||
I've written a handful of game on my Casio calculator at the age of 15.
|
||||
|
||||
I was already hacking computers and modding games before, but never actually wrote a complete program from scratch before.
|
||||
|
||||
|
||||
### More
|
||||
- [ISEN Brest website](https://isen-brest.fr/)
|
42
content/aboutme/posts/environment.md
Normal file
42
content/aboutme/posts/environment.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
+++
|
||||
title = 'Environment'
|
||||
weight = 30
|
||||
+++
|
||||
|
||||
## Desktop Linux software
|
||||
|
||||
All my machine run on Linux, and generally use these softwares:
|
||||
|
||||
- Archlinux
|
||||
- Sway window manager (i3 for wayland) with fully custom config
|
||||
- Systemd
|
||||
- Sublime Text and Zed editors
|
||||
|
||||
|
||||
## Main machine
|
||||
|
||||
This machine is a bit overkill as it has been designed to host two desktops in one machine (one native, and one in a VM)
|
||||
|
||||
- CPU: AMD 7900X, RAM: 32GB, GPU: RX 7800XT
|
||||
- Custom watercooling and Arduino-based fan speed controller
|
||||
- Qemu virtualisation for windows VMs, with a dedicated GPU (Geforce GTX 1070) using PCI passthrough.
|
||||
|
||||
|
||||
## This server (VPS)
|
||||
|
||||
Used for hosting some services and experiments
|
||||
|
||||
- Archlinux
|
||||
- Nextcloud, Collabora, Matrix server, Forgejo, and other services
|
||||
|
||||
|
||||
## LCDA server (dedicated)
|
||||
|
||||
More robust / stable server for hosting my Neverwinter Nights 2 server
|
||||
|
||||
- Ubuntu LTS
|
||||
- Ansible for setup / configuration
|
||||
- Qemu / KVM with virtio networking
|
||||
- Collectd, Graphite, influxdb and grafana for monitoring
|
||||
- A lot of bash script for common task automation
|
||||
- Off-site daily backups
|
27
content/aboutme/posts/hobbies.md
Normal file
27
content/aboutme/posts/hobbies.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
+++
|
||||
title = 'Hobbies'
|
||||
weight = 40
|
||||
+++
|
||||
|
||||
## DIY
|
||||
- Ceramics / pottery, mainly on the wheel
|
||||
- Small constructions, furnitures, contraptions, ...
|
||||
- Repairing stuff
|
||||
- PC modding <a href="https://forum.hardware.fr/hfr/OverclockingCoolingModding/Modding/mod-haf-922-sujet_272997_1.htm">Mod HAF922</a>, <a href="https://forum.hardware.fr/hfr/OverclockingCoolingModding/Modding/workblog-shinobi-white-sujet_278883_1.htm">Mod Shinobi XL</a>
|
||||
- Models
|
||||
- Electronics
|
||||
- Small hacks
|
||||
- ...
|
||||
|
||||
## Music
|
||||
- Celtic/lever harp player since 1999
|
||||
|
||||
## Cooking
|
||||
I love cooking world food: Mexican, Antillean, Thai, Japanese (a lot), Italian, ... actually, I'm not that much into _French cuisine_ :)
|
||||
|
||||
I'm into fermentation and brewing. I often make my own ginger beer (non alcoholic), fruit kefir, and occasionally some craft beer. I even make several fermented sauces like sriracha and kimchi.
|
||||
|
||||
## Game design
|
||||
|
||||
I'm very interested in game design.
|
||||
I had several occasions to practice game / level design with my many Neverwinter Nights 2 related projects, and a handful of game jams :)
|
32
content/aboutme/posts/programming.md
Normal file
32
content/aboutme/posts/programming.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
+++
|
||||
title = 'Programming'
|
||||
weight = 20
|
||||
+++
|
||||
|
||||
## Main languages
|
||||
- **Rust** - Modern language with safety
|
||||
- **D** - Modern language inspired by C++ and Java, that is garbage collected and has excellent metaprogramming capabilities
|
||||
- **C++** - C++23 takes a lot of pain out of this old and bloated language
|
||||
- **C** - Mainly for low level / embedded code, and for building of connecting interfaces between different libraries and programming languages
|
||||
- **Python** - When performance and safety/stability is not critical
|
||||
- **NWScript** - A C-like language that is not really relevant outside of Neverwinter Nights, but it's the first "serious" language that I learnt and used a lot
|
||||
|
||||
## Other languages
|
||||
- **Bash**, **Zsh** - _Obviously_, for Linux admin and automation
|
||||
- **HTML**, **CSS**, **JS** - For website frontends
|
||||
- **MySQL**, **PostgreSQL**, **SQLite** - There are a lot of alternative databases out there, but I always end up using one of these three
|
||||
- **Assembly** - clearly not my area of expertise, but it's always useful for understanding compiler behaviour and executable reverse engineering
|
||||
- **Go** - The language is a bit too basic for my taste, but is very easy to read and is great for web backends
|
||||
- **C#**, **Java**, **Lua**, **PHP** - Languages that I learnt but haven't touched in a while
|
||||
|
||||
## Dev tooling
|
||||
- **Git** - Learnt git in 2011. Now it's so ubiquitous it's barely worth mentioning
|
||||
- **GitlabCI**, **Github Actions** - for automated testing, code quality & coverage reports, and automated releases/deploys
|
||||
- **Codecov** - for a nice display of code coverage
|
||||
- **Docker** - it's quite essential now, for custom CI and build environments or service management
|
||||
|
||||
## Other
|
||||
- **Ansible** - For restoring a complex server in case of disk failure
|
||||
- **Hugo** - This site is served with Hugo and a custom template
|
||||
- **Qemu/KVM/Libvirt** - For server and desktop VMs, with as much virtio as possible (disk, network, video buffer, ...)
|
||||
- **Yocto** - Built a custom linux disk image in 2015
|
18
content/aboutme/posts/sports.md
Normal file
18
content/aboutme/posts/sports.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
+++
|
||||
title = 'Sports'
|
||||
weight = 40
|
||||
+++
|
||||
|
||||
## Rock climbing
|
||||
|
||||
- Club: [_Les Grimpeurs de l'Odet_](https://www.lesgdo.org)
|
||||
- Since 2002
|
||||
- 8 years of competition
|
||||
- Instructing courses
|
||||
- Initiator diploma
|
||||
- Member of the board of directors between 2012 and 2014
|
||||
- Former webmaster
|
||||
|
||||
## [Slackline](https://www.youtube.com/watch?v=HDTwQGEeGZc)
|
||||
- Sailing
|
||||
- Underwater fishing and freediving
|
4
content/blog/_index.md
Normal file
4
content/blog/_index.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
+++
|
||||
title = 'Blog'
|
||||
weight = 100
|
||||
+++
|
4
content/projects/_index.md
Normal file
4
content/projects/_index.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
+++
|
||||
title = 'Projects'
|
||||
weight = 10
|
||||
+++
|
17
content/projects/posts/3denginetoy.md
Normal file
17
content/projects/posts/3denginetoy.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
+++
|
||||
date = '2011-12-01'
|
||||
title = 'Toy 3D engine'
|
||||
tags = ["C++", "3d"]
|
||||
+++
|
||||
|
||||
In 2012, after working on MatrixRun with Irrlicht, I decided to study and write a sample 3D engine using OpenGL
|
||||
|
||||
It only handles basic forms, like cubes and height maps (defined in text files), and chain renders the scene, respecting relative positions.
|
||||
|
||||
{{< cinema path="/images/posts/3dengine-*.*" >}}
|
||||
|
||||
### Skills
|
||||
|
||||
- Source code study of Irrlicht
|
||||
- OpenGL 2 API
|
||||
- C++ Dev.
|
21
content/projects/posts/3dprint-old.md
Normal file
21
content/projects/posts/3dprint-old.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
date = '2012-09-01'
|
||||
title = '3D Printer: RepRapPro Mendel'
|
||||
tags = ["3dprint", "DIY"]
|
||||
+++
|
||||
|
||||
In 2012, I assembled a 3D printer kit, with the Electronics Club of ISEN Brest. This was a RepRapPro Mendel monocolour.
|
||||
|
||||
|
||||
Presentation video (fr):
|
||||
<div class="cinema center">
|
||||
<video controls>
|
||||
<source src="/media/3dprinter.mp4" type="video/mp4"/>
|
||||
<source src="/media/3dprinter.webm" type="video/webm"/>
|
||||
<a href="/media/3dprinter.mp4">Download video</a>
|
||||
</video>
|
||||
</div>
|
||||
|
||||
### Skills
|
||||
- DIY
|
||||
- Patience, rigor
|
18
content/projects/posts/akadoc.md
Normal file
18
content/projects/posts/akadoc.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
+++
|
||||
date = '2015-04-22'
|
||||
title = 'Akadoc'
|
||||
tags = ["C#", "unity", "gamedev"]
|
||||
+++
|
||||
|
||||
A game project started with friends, that was far too ambitious and got abandoned.
|
||||
|
||||
{{< cinema path="/images/posts/akadoc-*.*" >}}
|
||||
|
||||
### More
|
||||
- Repository: https://git.tcharles.fr/akadoc/akadoc
|
||||
- Game design documents: https://git.tcharles.fr/akadoc/specs/src/branch/master/archives (French)
|
||||
|
||||
### Skills
|
||||
- Game design
|
||||
- Unity engine
|
||||
- C# scripting
|
23
content/projects/posts/aoc2020.md
Normal file
23
content/projects/posts/aoc2020.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
+++
|
||||
date = '2020-12-30'
|
||||
title = 'Advent of Code 2020'
|
||||
tags = ["rust", "aoc", "algorithm"]
|
||||
+++
|
||||
|
||||
In December 2020 I decided to participate in the Advent of Code 2020, a yearly event where every day of December, you get an __algorithmic puzzle__ that you can solve using any language you want (the input data is randomly generated and you must provide the correct answer). I chose to solve the daily puzzles with __Rust__ code, since I am __very interested in this language__ and I haven't practised it very much.
|
||||
|
||||
My goal was not to earn a maximum of points by solving the puzzles as fast as possible once they are released (they were released at 6AM an France), but rather to __find the most interesting and/or efficient ways to solve__ them.
|
||||
|
||||
I also joined the Discord server or my former engineering school to __help students__ that were participating in the event. This led to a lot of interesting discussions about code instrumentation and optimisation, algorithmic complexity, regular expressions, language features, ...
|
||||
|
||||
<!--more-->
|
||||
|
||||
### Skills
|
||||
- Rust programming
|
||||
- Algorithms
|
||||
- Problem solving
|
||||
- Teaching
|
||||
|
||||
### More
|
||||
- AoC website: https://adventofcode.com/2020/
|
||||
- My solutions: https://gitlab.com/CromFr/advent-of-code-2020
|
21
content/projects/posts/arcadecabinet.md
Normal file
21
content/projects/posts/arcadecabinet.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
date = '2013-02-01'
|
||||
title = 'Arcade cabinet'
|
||||
tags = ["DIY", "hardware", "linux", "dlang"]
|
||||
+++
|
||||
|
||||
{{< cinema path="/images/posts/bornearcade-*.*" >}}
|
||||
|
||||
In 2014, I worked on an arcade gaming console with the Electronics Club of ISEN Brest, that is available to students in school.
|
||||
|
||||
I worked on the 3D Design, structure cutting/assembling, Archlinux configuration and development of the game selector.
|
||||
|
||||
### Skills
|
||||
|
||||
- DIY
|
||||
- Solidity-constrained design
|
||||
- ArchLinux configuration
|
||||
- Development of the game selector in D
|
||||
|
||||
### More
|
||||
- Game selection software (OpenAGS): https://github.com/Club-Elec/OpenAGS
|
22
content/projects/posts/burgerquizz.md
Normal file
22
content/projects/posts/burgerquizz.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
+++
|
||||
date = '2012-05-01'
|
||||
title = 'Burger Quizz game'
|
||||
tags = ["java", "web", "sql", "school project"]
|
||||
+++
|
||||
|
||||
{{< cinema path="/images/posts/burgerquizz-*.*" >}}
|
||||
|
||||
In 2012, I realized a web-site with another student, in order to play BurgerQuizz, a game from a French TV Show.
|
||||
|
||||
This project was realized after the courses on Apache/PHP/SQL in the second year at ISEN Brest.
|
||||
|
||||
|
||||
### Skills
|
||||
|
||||
- Development of a website (HTML5/CSS3, Javascript, PHP, MySQL)
|
||||
- Development of a user interface to edit the database in Java
|
||||
- 30-day project with a deadline
|
||||
- Version control with SVN
|
||||
|
||||
### More
|
||||
- [Demo (French)](/redirect-burgerquizz)
|
43
content/projects/posts/code4blind.md
Normal file
43
content/projects/posts/code4blind.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
+++
|
||||
date = '2019-09-13'
|
||||
title = 'Hackathon Code4Blind'
|
||||
tags = ["hackathon", "android", "java"]
|
||||
+++
|
||||
|
||||
Code4Blind was a **hackathon** organized by _[Les désordinateurs communicants](https://lesdesordinateurs.org)_ for working on solutions to **help visually impaired people to practice rock climbing**.
|
||||
|
||||
The **topics** were:
|
||||
- Image processing for detecting and classifying holds
|
||||
- Communicate the path and holds layout on the floor before climbing
|
||||
- Recording the movements executed by a climber in order to be able to give instructions to the next climber.
|
||||
- Communicate the holds around the climber while climbing
|
||||
|
||||
I worked on the last topic, and we decided to **experiment with binaural (positional) audio** to signal available holds around the climber.
|
||||
|
||||
- Hold direction is communicated with binaural audio position
|
||||
- Hold distance is communicated by volume
|
||||
- Sounds type (bell, drum, ...) indicate the shape of the hold
|
||||
- Multiple holds can be differentiated with sound pitch
|
||||
|
||||
In order to start working on a prototype, we assumed we were already provided with the head position of the climber in real time, and the holds position in the path.
|
||||
|
||||
<!--more-->
|
||||
|
||||
### Results
|
||||
|
||||
The results were not very promising. Current **binaural audio libraries gives very inaccurate results**, especially for locating up vs down and front vs behind directions. This could be either caused by:
|
||||
- The **missing head-related transfer function** (HRTF), which is different for every person and difficult to obtain without very specific equipment.
|
||||
- **Inaccurate software audio processing**. Even with the best conditions, libraries never yields results that are as good as a real-world recording.
|
||||
- **Lack of experience or ear training** with software-based binaural audio.
|
||||
|
||||
Nevertheless, the hackathon was very exciting and I really appreciated the experience, as I am both a software developer and an experienced rock climber.
|
||||
|
||||
|
||||
### Skills
|
||||
- Android dev.
|
||||
- Binaural / positional audio
|
||||
- Brainstorming and feedback gathering with users
|
||||
|
||||
### More
|
||||
- [Hackathon website (french)](https://lesdesordinateurs.org/index.php/code4climb/)
|
||||
- [PoC source code](https://framagit.org/lesdesordinateurs/audioxyz)
|
15
content/projects/posts/course-git.md
Normal file
15
content/projects/posts/course-git.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
+++
|
||||
date = '2013-04-01'
|
||||
title = 'Courses on Git'
|
||||
tags = ["course", "git"]
|
||||
+++
|
||||
|
||||
{{< cinema path="/images/posts/gitcourse-*.*" >}}
|
||||
|
||||
In 2013, I gave 3 courses of 2 hours on Git, a version control system (like Subversion, Mercurial, ...) at ISEN Brest, for voluntary students and teachers.
|
||||
|
||||
This course aims teaching the use of Git in collaborative projects, from the basis (add, commit, push, pull, ...) to more complex things (branch, merge, conflicts, stash, ...).
|
||||
|
||||
|
||||
### More:
|
||||
- [Material (fr)](https://tcharles.fr/coursgit/)
|
75
content/projects/posts/dlang.md
Normal file
75
content/projects/posts/dlang.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
+++
|
||||
date = '2015-04-01'
|
||||
title = 'D Language'
|
||||
tags = ["dlang", "linux", "web", "contributions"]
|
||||
+++
|
||||
|
||||
The [D language](https://dlang.org) is a recent language very similar to C++ in term of features, but with a cleaned syntax and better compile-time features.
|
||||
|
||||
I like the D language because it makes possible to write nice and robust applications within a very short time.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Here are some small projects I have done using D:
|
||||
|
||||
## Served
|
||||
|
||||
{{< cinema path="/images/posts/served-*.*" >}}
|
||||
|
||||
Served is a __lightweight file-sharing web service__ (a bit like _Google Drive_) written using the web server library [vibe.d](https://vibed.org).
|
||||
|
||||
It is designed to be __quickly deployed__ as a __web file server__ that can also be used to __upload files__ to a directory. Its default configuration serves the folder given by command line and uses UNIX users/passwords (via __PAM Authentification__) to upload/view files respecting file permissions.
|
||||
|
||||
By default, the file named `index.md` gets rendered atop of the file list.
|
||||
|
||||
### More
|
||||
|
||||
- Source code: https://github.com/CromFr/Served
|
||||
- Design:
|
||||
+ Bootstrap
|
||||
+ JQuery
|
||||
+ Markdown rendering with Showdown
|
||||
+ Interfacing D lang. with C library (PAM)
|
||||
|
||||
|
||||
## NWN2 Log web access
|
||||
|
||||
{{< cinema path="/images/posts/nwnlog-*.*" >}}
|
||||
|
||||
The goal was to provide a common __web interface__ to __browse and search log__ entries written by the Neverwinter Nights 2 server _La Colère d'Aurile_.
|
||||
These entries are written in different files/databases, use different syntaxes and timestamps relative to different time zones.
|
||||
|
||||
The log viewer has been written to be as easy as possible to extend and maintain:
|
||||
If you want to add a log page, you just have to write a class. The menus, interface, search parameters, the instantiation are __auto-generated at compile time__.
|
||||
|
||||
### More
|
||||
- Source code: https://github.com/CromFr/NWNLogViewer
|
||||
- Design
|
||||
+ REST API generating Json data
|
||||
+ Search & data-binding using AngularJS
|
||||
+ Much code generation using D meta-programming features
|
||||
|
||||
|
||||
## NWN2 GUI viewer
|
||||
|
||||
{{< cinema path="/images/posts/nwnlog-*.*" >}}
|
||||
|
||||
Neverwinter Nights 2 lacks of third applications. This one __renders NWN2 GUI__ without launching the whole game, and updates itself on file change.
|
||||
|
||||
It allows developers to write the XML GUI code with their favourite editor, while seeing the result in real time in another window, with extra debugging information that NWN2 doesn't provide.
|
||||
|
||||
Right now it has some quirks on text alignment and font handling, but the result is still close to the in-game rendering.
|
||||
|
||||
### More
|
||||
- Source code: https://github.com/CromFr/NWNGuiViewer
|
||||
- Design:
|
||||
+ GTK 3 with GTKD wrapper for D lang.
|
||||
+ Hand-made XML parser
|
||||
|
||||
|
||||
|
||||
## Phobos
|
||||
|
||||
Phobos is the standard library of the D language.
|
||||
|
||||
I have fixed a couple of bugs in the library, and I am looking to fix more of them in the future :).
|
10
content/projects/posts/draft-flipperzero.md
Normal file
10
content/projects/posts/draft-flipperzero.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
+++
|
||||
date = '2022-04-01'
|
||||
title = 'Flipper zero'
|
||||
tags = ["C", "hacking", "reverse-eng"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
|
||||
1 contribution to official
|
||||
worth?
|
15
content/projects/posts/draft-nwbash.md
Normal file
15
content/projects/posts/draft-nwbash.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
+++
|
||||
date = '2021-02-01'
|
||||
title = 'Tetrogue'
|
||||
tags = ["NWN2", "NWScript", "bash", "reverse-eng", "hacking"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
February 2021
|
||||
|
||||
### Skills
|
||||
- Understand bash command-line parsing
|
||||
- Reimplementing bash in a language that's really not designed for it (no arrays, no pointers, no char type, ...)
|
||||
|
||||
### More
|
||||
- Gitlab repository: https://gitlab.com/CromFr/nwbash
|
15
content/projects/posts/draft-nwn-lib-rs.md
Normal file
15
content/projects/posts/draft-nwn-lib-rs.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
+++
|
||||
date = '2022-06-01'
|
||||
title = 'nwn-lib-rs'
|
||||
tags = ["NWN2", "rust"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
June 2022
|
||||
|
||||
### Skills
|
||||
- Rust programming
|
||||
- Secure binary file parsing
|
||||
|
||||
### More
|
||||
- Gitlab repository: https://gitlab.com/CromFr/nwn-lib-rs
|
19
content/projects/posts/draft-nwnx4.md
Normal file
19
content/projects/posts/draft-nwnx4.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
+++
|
||||
date = '2021-03-01'
|
||||
title = 'NWNX4 resurrected'
|
||||
tags = ["NWN2", "C++", "reverse-eng", "hacking", "contributions"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
March 2021
|
||||
|
||||
### Skills
|
||||
- C++ programming, with Win32 ABI
|
||||
- DLL Injection and Reverse engineering
|
||||
- Upgrading a legacy code-base and tools (Visual Studio 2005 => MSVC 2019 + Meson)
|
||||
- Automated testing and release management with Github Actions
|
||||
- ABI design for writing independent plugins
|
||||
|
||||
### More
|
||||
- NWNX4 main repository: https://github.com/nwn2dev/nwnx4
|
||||
- NWNX4 related projects: https://github.com/orgs/nwn2dev/repositories
|
18
content/projects/posts/draft-rerollsoldier.md
Normal file
18
content/projects/posts/draft-rerollsoldier.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
+++
|
||||
date = '2022-07-15'
|
||||
title = 'Reroll Soldier !'
|
||||
tags = ["gamedev", "gamejam", "godot"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
July 15th 2022
|
||||
|
||||
### Skills
|
||||
- Game design
|
||||
- Godot 3 (python-ish scripting)
|
||||
- Sound design (Audacity)
|
||||
- Level design
|
||||
|
||||
### More
|
||||
- Game page (can be played in the browser): https://cromfr.itch.io/reroll-soldier
|
||||
- Source code: https://github.com/semi-confituriers/RerollSoldier
|
19
content/projects/posts/draft-tetrogue.md
Normal file
19
content/projects/posts/draft-tetrogue.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
+++
|
||||
date = '2021-07-11'
|
||||
title = 'Tetrogue'
|
||||
tags = ["gamedev", "gamejam", "godot"]
|
||||
draft = true
|
||||
+++
|
||||
|
||||
June 11th 2021
|
||||
|
||||
### Skills
|
||||
- Game design
|
||||
- Godot 3 (python-ish scripting)
|
||||
- 2D sprite creation (Krita)
|
||||
- Sound design (Audacity)
|
||||
- Level design
|
||||
|
||||
### More
|
||||
- Game page (can be played in the browser): https://cromfr.itch.io/reroll-soldier
|
||||
- Source code: https://github.com/semi-confituriers/RerollSoldier
|
33
content/projects/posts/fan-controller.md
Normal file
33
content/projects/posts/fan-controller.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
+++
|
||||
date = '2018-01-11'
|
||||
title = 'PC fan controller'
|
||||
tags = ["arduino", "C++", "hardware"]
|
||||
+++
|
||||
|
||||
{{< cinema path="/images/posts/fan-controller-*.*" >}}
|
||||
|
||||
I came up with this because my PC has a home-made watercooling system and its motherboard does not have any external sensor pins for the water temperature sensor.
|
||||
|
||||
<!--more-->
|
||||
|
||||
So I had 3 choices for controlling the fan speeds:
|
||||
1. Always keep fans at around 70% so the water never gets too hot. Effective but too noisy for my taste...
|
||||
2. Control fan speed using the SSD temperature sensor (the SSD does not heat up very much, and is placed next to a watercooling radiator, so we can deduce very approximately the water temperature with it). It would require to write a custom multi-platform tool that would somehow find a way to control fan speed (and would require some reverse engineering on the motherboard).
|
||||
3. Find or build an external fan controller, which uses the water temperature sensor.
|
||||
|
||||
I went for solution 3. and designed a small board around an __Arduino nano__, that can take __multiple temperature inputs__ from external sensors (Water and Air), and __adjust fan speed__ accordingly using a simple __temperature/speed curve__. I also put a small __OLED screen__ (_SSD1306_) to display all this information, a button to force high / low / auto fan speeds, and an __alarm__ if the temperature reaches critical values (or the sensor is disconnected / short circuited).
|
||||
|
||||
Since then I can barely hear my PC, even during intensive tasks :)
|
||||
|
||||
|
||||
### Skills
|
||||
- PCB design
|
||||
- Basic electronics
|
||||
- C++ programming on Arduino
|
||||
|
||||
### More
|
||||
- Source code and PCB design: https://github.com/CromFr/fan-controller
|
||||
|
||||
<div style="display: none">
|
||||
DIY soldering embedded systems
|
||||
</div>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue