This commit is contained in:
Crom (Thibaut CHARLES) 2025-02-07 20:32:59 +01:00
commit e7339f67ea
Signed by: tcharles
GPG key ID: 45A3D5F880B9E6D0
176 changed files with 2751 additions and 0 deletions

3
.gitattributes vendored Normal file
View 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
View 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
View 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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

70
assets/sass/fonts.scss Normal file
View 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 */
}

View 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
View 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
View 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
View 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
View 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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

43
content/_index.md Normal file
View 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
[![Mastodon](/images/logos/mastodon.png)](https://toot.cat/@CromFr)
[![Bluesky](/images/logos/bluesky.png)](https://bsky.app/profile/tcharles.fr)
.
[![GitLab](/images/logos/gitlab.png)](https://gitlab.com/CromFr)
[![GitHub](/images/logos/github.png)](https://github.com/CromFr)
[![Self hosted Forgejo](/images/logos/forgejo.png)](https://git.tcharles.fr)
.
[![Keybase profile](/images/logos/keybase.png)](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)
[![Facebook](/images/logos/facebook.png)](https://www.facebook.com/thibaut.charles29)
[![LinkedIn](/images/logos/linkedin.png)](https://www.linkedin.com/pub/thibaut-charles/8a/3b4/2a4)
[![Twitter](/images/logos/twitter.png)](https://twitter.com/CromFR)

118
content/aboutme/_index.md Normal file
View 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 &amp; 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 &amp; Models
- PC assembling &amp; 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>

View 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/)

View 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

View 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 :)

View 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

View 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
View file

@ -0,0 +1,4 @@
+++
title = 'Blog'
weight = 100
+++

View file

@ -0,0 +1,4 @@
+++
title = 'Projects'
weight = 10
+++

View 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.

View 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

View 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

View 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

View 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

View 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)

View 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)

View 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/)

View 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 :).

View file

@ -0,0 +1,10 @@
+++
date = '2022-04-01'
title = 'Flipper zero'
tags = ["C", "hacking", "reverse-eng"]
draft = true
+++
1 contribution to official
worth?

View 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

View 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

View 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

View 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

View 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

View 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