Moved to Nuxt
pipeline / build-and-push-images (push) Successful in 3m12s

NuxtJS, Vue, real web app

Nuxt content: blog

Better mobile/responsive design and practices

Better practices overall
This commit is contained in:
2025-11-18 20:59:23 +01:00
parent 93a4e124ff
commit 99a943eb36
57 changed files with 19126 additions and 718 deletions
+24
View File
@@ -0,0 +1,24 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.example
+24
View File
@@ -0,0 +1,24 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.example
-3
View File
@@ -1,3 +0,0 @@
{
"liveServer.settings.root": "/src/"
}
+12 -1
View File
@@ -1,2 +1,13 @@
FROM node:22-alpine AS base
WORKDIR /app
RUN corepack enable
FROM base AS build
COPY package*.json ./
RUN npm install
COPY . .
RUN npx nuxi generate
FROM nginx:latest
COPY ./src /usr/share/nginx/html
RUN rm /usr/share/nginx/html/*
COPY --from=build --chown=1000:1000 /app/.output/public /usr/share/nginx/html/
+4
View File
@@ -0,0 +1,4 @@
# vhaudiquet.fr
Personal website and blog, deployed:
https://vhaudiquet.fr
+8
View File
@@ -0,0 +1,8 @@
<template>
<div>
<NuxtRouteAnnouncer />
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</div>
</template>
+39
View File
@@ -0,0 +1,39 @@
h1, h2, h3, h4, h5, h6, p, a, input[type=text], ul, li, strong {
font-family: 'Inter', sans-serif;
font-style: normal;
}
h1 {
font-weight: 600;
}
h2 {
font-weight: 500;
}
h3 {
font-weight: 400;
}
h4 {
font-weight: 300;
}
p {
font-weight: normal;
}
strong {
font-weight: 600;
}
a:link {
text-decoration: none;
color: grey;
}
a:visited {
text-decoration: none;
color: grey;
}
a:hover {
text-decoration: none;
color: #536878;
}
a:active {
text-decoration: none;
color: grey;
}
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1113.48 400">
<defs>
<style>
.cls-1 {
fill: none;
}
.cls-2 {
fill: #e95420;
}
.cls-3 {
fill: #fff;
}
</style>
</defs>
<g>
<path d="m381.86,354.01c-11.69,0-21.64-1.78-29.85-5.33-8.22-3.56-14.86-8.47-19.94-14.74-5.08-6.26-8.77-13.59-11.05-21.98-2.29-8.38-3.43-17.4-3.43-27.06v-110.77h17.28v108.49c0,9.65,1.14,18,3.43,25.03,2.29,7.03,5.46,12.83,9.53,17.4,4.06,4.57,8.98,7.96,14.74,10.16,5.76,2.21,12.2,3.3,19.31,3.3s13.55-1.1,19.31-3.3c5.76-2.2,10.67-5.59,14.74-10.16,4.07-4.57,7.24-10.37,9.53-17.4,2.29-7.03,3.43-15.37,3.43-25.03v-108.49h17.28v110.77c0,9.66-1.14,18.67-3.43,27.06-2.29,8.38-5.97,15.71-11.05,21.98-5.08,6.27-11.73,11.18-19.94,14.74-8.22,3.56-18.17,5.33-29.85,5.33Z"/>
<path d="m500.61,226.73c2.88-2.2,7.49-4.53,13.85-6.99,6.35-2.45,13.85-3.68,22.48-3.68,9.48,0,17.91,1.69,25.28,5.08,7.37,3.39,13.59,8.13,18.67,14.23,5.08,6.1,8.93,13.34,11.56,21.72,2.62,8.38,3.94,17.57,3.94,27.56,0,10.67-1.57,20.24-4.7,28.71-3.14,8.47-7.54,15.67-13.21,21.59-5.68,5.93-12.45,10.46-20.33,13.59-7.88,3.13-16.64,4.7-26.3,4.7-11.69,0-21.34-.76-28.96-2.29-7.62-1.52-13.89-3.13-18.8-4.83v-190.04l16.51-3.05v73.68Zm0,107.98c2.54.85,6.31,1.65,11.31,2.41,4.99.76,11.56,1.14,19.69,1.14,14.23,0,25.66-4.61,34.3-13.85,8.64-9.23,12.96-22.48,12.96-39.76,0-7.28-.76-14.18-2.29-20.71-1.52-6.52-3.98-12.2-7.37-17.02-3.39-4.83-7.84-8.68-13.34-11.56-5.51-2.88-12.32-4.32-20.45-4.32-3.9,0-7.62.38-11.18,1.14-3.56.76-6.86,1.74-9.91,2.92-3.05,1.19-5.72,2.46-8,3.81-2.29,1.36-4.19,2.63-5.72,3.81v91.97Z"/>
<path d="m726.96,345.63c-4.91,1.36-11.52,2.88-19.82,4.57-8.3,1.69-18.46,2.54-30.49,2.54-9.83,0-18.04-1.44-24.64-4.32-6.61-2.88-11.94-6.94-16.01-12.2-4.06-5.25-6.99-11.6-8.76-19.05-1.78-7.45-2.67-15.67-2.67-24.64v-73.68h16.51v68.34c0,9.32.68,17.19,2.03,23.63,1.35,6.44,3.56,11.65,6.61,15.62,3.05,3.98,6.99,6.86,11.81,8.64,4.83,1.78,10.71,2.67,17.66,2.67,7.79,0,14.56-.42,20.33-1.27,5.76-.85,9.4-1.61,10.92-2.29v-115.35h16.51v126.78Z"/>
<path d="m763.38,223.43c4.91-1.35,11.52-2.88,19.82-4.57,8.3-1.69,18.46-2.54,30.49-2.54,9.99,0,18.33,1.44,25.03,4.32,6.69,2.88,12.02,6.99,16.01,12.32,3.98,5.34,6.82,11.73,8.51,19.18,1.69,7.46,2.54,15.67,2.54,24.64v73.42h-16.51v-68.09c0-9.31-.64-17.19-1.91-23.63-1.27-6.44-3.39-11.69-6.35-15.75-2.96-4.06-6.86-6.99-11.69-8.77-4.83-1.78-10.88-2.67-18.17-2.67-7.79,0-14.53.43-20.2,1.27-5.68.85-9.36,1.61-11.05,2.29v115.34h-16.51v-126.78Z"/>
<path d="m916.61,218.85h52.34v13.97h-52.34v69.87c0,7.46.63,13.51,1.91,18.17,1.27,4.66,3.09,8.26,5.46,10.8,2.37,2.54,5.25,4.24,8.64,5.08,3.39.85,7.11,1.27,11.18,1.27,6.94,0,12.53-.8,16.77-2.41,4.23-1.61,7.53-3.09,9.91-4.45l4.07,13.72c-2.37,1.52-6.52,3.26-12.45,5.21-5.93,1.95-12.37,2.92-19.31,2.92-8.13,0-14.95-1.06-20.45-3.18-5.51-2.12-9.91-5.34-13.21-9.65s-5.63-9.69-6.99-16.13c-1.36-6.44-2.03-14.06-2.03-22.87v-120.94l16.51-3.05v41.67Z"/>
<path d="m1094.4,345.63c-4.91,1.36-11.52,2.88-19.82,4.57-8.3,1.69-18.46,2.54-30.49,2.54-9.83,0-18.04-1.44-24.64-4.32-6.61-2.88-11.94-6.94-16.01-12.2-4.06-5.25-6.99-11.6-8.76-19.05-1.78-7.45-2.67-15.67-2.67-24.64v-73.68h16.51v68.34c0,9.32.68,17.19,2.03,23.63,1.35,6.44,3.56,11.65,6.61,15.62,3.05,3.98,6.99,6.86,11.81,8.64,4.83,1.78,10.71,2.67,17.66,2.67,7.79,0,14.56-.42,20.33-1.27,5.76-.85,9.4-1.61,10.92-2.29v-115.35h16.51v126.78Z"/>
</g>
<g>
<path d="m346.66,131.23c-4.32,0-8.34-.78-12.05-2.32-3.71-1.55-6.94-3.81-9.68-6.78-2.74-2.97-4.9-6.63-6.48-10.98-1.58-4.36-2.37-9.34-2.37-14.95s.85-10.6,2.56-14.95c1.71-4.36,3.98-8.02,6.82-10.99,2.84-2.97,6.13-5.21,9.87-6.73,3.74-1.52,7.65-2.27,11.71-2.27,2.52,0,4.81.16,6.87.48,2.06.32,3.87.73,5.42,1.21,1.55.48,2.87.97,3.97,1.45,1.1.48,1.94.92,2.52,1.31l-2.13,5.71c-1.61-.97-3.66-1.92-6.15-2.86-2.48-.94-5.56-1.4-9.24-1.4-4.19,0-7.86.71-10.98,2.13-3.13,1.42-5.76,3.42-7.89,6-2.13,2.58-3.73,5.65-4.79,9.2-1.06,3.55-1.6,7.48-1.6,11.81s.53,8.47,1.6,12.05c1.06,3.58,2.63,6.63,4.69,9.15,2.06,2.52,4.6,4.45,7.6,5.81,3,1.36,6.44,2.03,10.31,2.03,4.26,0,7.82-.4,10.69-1.21,2.87-.8,5.05-1.63,6.53-2.47l1.84,5.61c-.45.32-1.23.69-2.32,1.11-1.1.42-2.48.86-4.16,1.31-1.68.45-3.61.82-5.81,1.11-2.19.29-4.65.44-7.36.44Z"/>
<path d="m391.44,78.58c3.29,0,6.08.47,8.37,1.4,2.29.94,4.15,2.23,5.57,3.87,1.42,1.64,2.45,3.6,3.1,5.86.64,2.26.97,4.71.97,7.36v31.55c-.65.19-1.58.4-2.81.63-1.23.23-2.65.47-4.26.72-1.61.26-3.4.47-5.37.63-1.97.16-3.98.24-6.05.24-2.65,0-5.08-.29-7.31-.87-2.23-.58-4.16-1.5-5.81-2.76-1.65-1.26-2.94-2.87-3.87-4.84-.94-1.97-1.4-4.37-1.4-7.21s.52-5.03,1.55-6.97c1.03-1.94,2.48-3.53,4.36-4.79,1.87-1.26,4.1-2.18,6.68-2.76,2.58-.58,5.39-.87,8.42-.87.9,0,1.85.05,2.85.15,1,.1,1.97.23,2.9.39.93.16,1.74.32,2.42.48.68.16,1.15.31,1.4.44v-3.1c0-1.74-.13-3.44-.39-5.08-.26-1.64-.82-3.13-1.69-4.45s-2.1-2.39-3.68-3.2c-1.58-.8-3.66-1.21-6.24-1.21-3.68,0-6.42.26-8.23.77-1.81.52-3.13.94-3.97,1.26l-.87-5.52c1.1-.52,2.79-1,5.08-1.45,2.29-.45,5.05-.68,8.28-.68Zm.58,46.65c2.45,0,4.6-.08,6.44-.24,1.84-.16,3.4-.37,4.69-.63v-17.62c-.71-.32-1.84-.66-3.39-1.02-1.55-.35-3.68-.53-6.39-.53-1.55,0-3.16.11-4.84.34-1.68.23-3.23.71-4.65,1.45-1.42.74-2.58,1.76-3.48,3.05-.9,1.29-1.35,3-1.35,5.13,0,1.87.31,3.45.92,4.74.61,1.29,1.48,2.32,2.61,3.1,1.13.78,2.48,1.34,4.06,1.7,1.58.36,3.37.53,5.37.53Z"/>
<path d="m423.03,81.48c1.87-.52,4.39-1.1,7.55-1.74,3.16-.64,7.03-.97,11.61-.97,3.81,0,6.98.55,9.53,1.64,2.55,1.1,4.58,2.66,6.1,4.7,1.52,2.03,2.6,4.47,3.24,7.31.64,2.84.97,5.97.97,9.39v27.97h-6.29v-25.94c0-3.55-.24-6.55-.73-9-.48-2.45-1.29-4.45-2.42-6-1.13-1.55-2.61-2.66-4.45-3.34-1.84-.68-4.15-1.02-6.92-1.02-2.97,0-5.53.16-7.69.48-2.16.32-3.57.62-4.21.87v43.94h-6.29v-48.3Z"/>
<path d="m518.5,104.81c0,3.94-.57,7.52-1.69,10.74-1.13,3.23-2.71,5.97-4.74,8.23-2.03,2.26-4.44,4.02-7.21,5.28-2.77,1.26-5.84,1.89-9.19,1.89s-6.42-.63-9.19-1.89c-2.77-1.26-5.18-3.02-7.21-5.28-2.03-2.26-3.61-5-4.74-8.23-1.13-3.23-1.69-6.81-1.69-10.74s.56-7.52,1.69-10.74c1.13-3.23,2.71-5.98,4.74-8.28,2.03-2.29,4.44-4.07,7.21-5.32,2.77-1.26,5.84-1.89,9.19-1.89s6.42.63,9.19,1.89c2.77,1.26,5.18,3.03,7.21,5.32,2.03,2.29,3.61,5.05,4.74,8.28,1.13,3.23,1.69,6.81,1.69,10.74Zm-6.68,0c0-6.26-1.45-11.24-4.36-14.95-2.9-3.71-6.84-5.56-11.81-5.56s-8.9,1.86-11.81,5.56c-2.9,3.71-4.36,8.7-4.36,14.95s1.45,11.23,4.36,14.91c2.9,3.68,6.84,5.52,11.81,5.52s8.9-1.84,11.81-5.52c2.9-3.68,4.36-8.65,4.36-14.91Z"/>
<path d="m529.83,81.48c1.87-.52,4.39-1.1,7.55-1.74,3.16-.64,7.03-.97,11.61-.97,3.81,0,6.98.55,9.53,1.64,2.55,1.1,4.58,2.66,6.1,4.7,1.52,2.03,2.6,4.47,3.24,7.31.64,2.84.97,5.97.97,9.39v27.97h-6.29v-25.94c0-3.55-.24-6.55-.73-9-.48-2.45-1.29-4.45-2.42-6-1.13-1.55-2.61-2.66-4.45-3.34-1.84-.68-4.15-1.02-6.92-1.02-2.97,0-5.53.16-7.69.48-2.16.32-3.57.62-4.21.87v43.94h-6.29v-48.3Z"/>
<path d="m589.91,64.64c0,1.48-.45,2.66-1.35,3.53-.9.87-2,1.31-3.29,1.31s-2.39-.44-3.29-1.31c-.9-.87-1.35-2.05-1.35-3.53s.45-2.66,1.35-3.53c.9-.87,2-1.31,3.29-1.31s2.39.44,3.29,1.31c.9.87,1.35,2.05,1.35,3.53Zm-1.45,65.14h-6.29v-50.04h6.29v50.04Z"/>
<path d="m623.21,130.85c-3.87,0-7.29-.61-10.26-1.84-2.97-1.22-5.44-2.98-7.4-5.28-1.97-2.29-3.47-5.03-4.5-8.23-1.03-3.19-1.55-6.73-1.55-10.6s.53-7.52,1.6-10.74c1.07-3.22,2.6-6,4.6-8.32,2-2.32,4.42-4.11,7.26-5.37,2.84-1.26,6.03-1.89,9.58-1.89,2.71,0,5.24.23,7.6.68,2.35.45,4.18,1.03,5.47,1.74l-1.65,5.42c-1.29-.64-2.74-1.16-4.36-1.55-1.61-.39-3.77-.58-6.48-.58-5.55,0-9.76,1.79-12.63,5.37-2.87,3.58-4.31,8.66-4.31,15.24,0,2.97.32,5.7.97,8.18.64,2.48,1.69,4.61,3.15,6.39,1.45,1.78,3.32,3.16,5.61,4.16,2.29,1,5.08,1.5,8.37,1.5,2.71,0,4.98-.31,6.82-.92s3.18-1.14,4.02-1.6l1.36,5.42c-1.16.65-2.99,1.28-5.47,1.89-2.48.61-5.08.92-7.79.92Z"/>
<path d="m661.08,78.58c3.29,0,6.08.47,8.37,1.4,2.29.94,4.14,2.23,5.56,3.87,1.42,1.64,2.45,3.6,3.1,5.86.64,2.26.97,4.71.97,7.36v31.55c-.65.19-1.58.4-2.81.63-1.23.23-2.65.47-4.26.72-1.61.26-3.4.47-5.37.63-1.97.16-3.98.24-6.05.24-2.65,0-5.08-.29-7.31-.87-2.23-.58-4.16-1.5-5.81-2.76s-2.94-2.87-3.87-4.84c-.94-1.97-1.4-4.37-1.4-7.21s.52-5.03,1.55-6.97c1.03-1.94,2.48-3.53,4.36-4.79,1.87-1.26,4.1-2.18,6.68-2.76,2.58-.58,5.39-.87,8.42-.87.9,0,1.85.05,2.86.15,1,.1,1.97.23,2.9.39.93.16,1.74.32,2.42.48.68.16,1.14.31,1.4.44v-3.1c0-1.74-.13-3.44-.39-5.08-.26-1.64-.82-3.13-1.69-4.45s-2.1-2.39-3.68-3.2c-1.58-.8-3.66-1.21-6.24-1.21-3.68,0-6.42.26-8.23.77-1.81.52-3.13.94-3.97,1.26l-.87-5.52c1.1-.52,2.79-1,5.08-1.45,2.29-.45,5.05-.68,8.28-.68Zm.58,46.65c2.45,0,4.6-.08,6.44-.24,1.84-.16,3.4-.37,4.69-.63v-17.62c-.71-.32-1.84-.66-3.39-1.02-1.55-.35-3.68-.53-6.39-.53-1.55,0-3.16.11-4.84.34-1.68.23-3.23.71-4.65,1.45-1.42.74-2.58,1.76-3.48,3.05-.9,1.29-1.35,3-1.35,5.13,0,1.87.3,3.45.92,4.74.61,1.29,1.48,2.32,2.61,3.1,1.13.78,2.48,1.34,4.07,1.7,1.58.36,3.37.53,5.37.53Z"/>
<path d="m705.23,130.65c-2.13-.06-3.99-.34-5.57-.82-1.58-.48-2.9-1.22-3.97-2.23-1.06-1-1.87-2.29-2.42-3.87-.55-1.58-.82-3.56-.82-5.95v-61.94l6.29-1.16v62.91c0,1.55.15,2.79.44,3.73.29.94.73,1.68,1.31,2.23.58.55,1.34.95,2.27,1.21.93.26,2.05.48,3.34.68l-.87,5.23Z"/>
</g>
<g>
<rect class="cls-2" width="254.06" height="400"/>
<rect class="cls-1" x="30.25" y="169.38" width="193.57" height="193.57"/>
<circle class="cls-3" cx="58.09" cy="255.92" r="26.3"/>
<circle class="cls-3" cx="167.63" cy="198.25" r="26.3"/>
<path class="cls-3" d="m117.41,323.62c-18.95-4.06-34.78-16.16-43.68-33.32-7.01,3.19-14.9,4.16-22.49,2.76,10.77,26.45,33.61,45.66,61.65,51.67,6.15,1.32,12.42,1.96,18.68,1.92-4.83-6.35-7.52-14.01-7.7-21.99-2.17-.24-4.33-.59-6.45-1.05Z"/>
<circle class="cls-3" cx="161.71" cy="323.76" r="26.3"/>
<path class="cls-3" d="m198.31,314.1c8.18-10.31,13.94-22.5,16.71-35.45,4.84-22.59.32-46.29-12.4-65.51-3.03,7.14-8.17,13.17-14.79,17.32,7.1,13.38,9.26,28.82,6.08,43.67-1.56,7.27-4.31,14.12-8.18,20.38,6.19,5.08,10.56,11.91,12.59,19.6Z"/>
<path class="cls-3" d="m56.06,218.2c.67-.04,1.34-.05,2-.05,2.66,0,5.31.28,7.94.85,4.29.92,8.32,2.54,12.01,4.84,11.84-17.03,30.95-27.25,51.65-27.63.11-1.99.38-3.97.79-5.92,1.21-5.63,3.67-10.9,7.19-15.41-33.08-2.62-65.22,14.45-81.59,43.33Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 494 B

Before

Width:  |  Height:  |  Size: 650 B

After

Width:  |  Height:  |  Size: 650 B

Before

Width:  |  Height:  |  Size: 7.0 MiB

After

Width:  |  Height:  |  Size: 7.0 MiB

Before

Width:  |  Height:  |  Size: 372 KiB

After

Width:  |  Height:  |  Size: 372 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 5V19H5V5H19M21 3H3V21H21V3M17 17H7V16H17V17M17 15H7V14H17V15M17 12H7V7H17V12Z" /></svg>

After

Width:  |  Height:  |  Size: 160 B

+17
View File
@@ -0,0 +1,17 @@
<template>
<div class="sm:mt-12 mt-7 m-auto w-fit sm:flex-row flex-col flex">
<img class="sm:w-[400px] sm:h-[400px] xl:self-auto self-center w-[80%] h-auto rounded-full"
src="~/assets/img/photo_web.JPG"/>
<div class="xl:ml-[90px] ml-0 flex flex-col xl:items-end items-center">
<h1 class="sm:text-8xl text-5xl mt-2 mb-2 xl:text-right text-center">
Valentin Haudiquet
</h1>
<h4 class="sm:text-4xl text-3xl mt-2 mb-2 xl:text-right text-center">
Software Engineer at Canonical - Ubuntu
</h4>
<p class="sm:text-4xl text-2xl sm:mr-[-3px] sm:ml-0 mr-1 ml-1 max-w-[770px] font-extralight xl:text-right text-center" id="header-paragraph">
Working on Ubuntu support for RISC-V architecture
</p>
</div>
</div>
</template>
+30
View File
@@ -0,0 +1,30 @@
<script setup lang="ts">
defineProps<{
title: string,
previousLink?: string
}>()
</script>
<template>
<div class="flex sm:flex-row flex-col xl:w-[1270px] lg:w-[924px] sm:mt-12 mt-4 m-auto">
<Icon
@click="previousLink == undefined ? $router.back() : $router.replace(previousLink)"
name="material-symbols:arrow-back"
class="w-8 h-8 mt-auto mb-auto ml-2 mr-10 hover:cursor-pointer sm:order-none order-1 sm:visible collapse" />
<h1 class="lg:max-w-3xl text-3xl text-left sg:ml-0 sg:mt-0 ml-2 mt-4 m-auto pr-5 sm:order-none order-3">
{{ title }}
</h1>
<div @click="$router.replace('/')"
class="flex hover:cursor-pointer w-fit sm:m-0 m-auto sm:order-none order-2">
<img class="rounded-full sm:w-14 sm:h-14 w-10 h-10 ml-5 mr-0 mt-auto mb-auto" src="~/assets/img/photo_web.JPG"/>
<div class="ml-5 mr-5 m-auto flex flex-col">
<h1 class="sm:text-xl text-base text-left">Valentin Haudiquet</h1>
<h4 class="sm:text-base text-sm text-left">Software Engineer</h4>
</div>
</div>
</div>
</template>
+17
View File
@@ -0,0 +1,17 @@
<script setup lang="ts">
const props = defineProps<{
title: string,
description: string
}>()
</script>
<template>
<div class="h-full w-full flex flex-row">
<img class="rounded-full h-[450px] w-[450px] m-10" src="/photo_web.JPG" />
<div class="mt-8 flex flex-col">
<h1 class="text-6xl w-[640px]">{{ title }}</h1>
<h3 class="text-4xl font-normal w-[640px] h-[200px] overflow-hidden text-ellipsis">{{ description }}</h3>
<h3 class="text-3xl font-light italic text-gray-500 mt-2 ml-[420px]">Read more...</h3>
</div>
</div>
</template>
+17
View File
@@ -0,0 +1,17 @@
<script setup lang="ts">
const props = defineProps<{
title: string
}>()
</script>
<template>
<div class="h-full w-full flex flex-row">
<img class="rounded-full h-[450px] w-[450px] m-10" src="/photo_web.JPG" />
<div class="mt-8 flex flex-col">
<h1 class="text-8xl w-[640px]">{{ title }}</h1>
<h2 class="text-6xl font-normal w-[640px]">Valentin Haudiquet</h2>
<h3 class="text-4xl font-normal w-[640px]">Software engineer at Canonical</h3>
<h4 class="text-3xl font-normal w-[640px]">Working on Ubuntu support for RISC-V architecture</h4>
</div>
</div>
</template>
+12
View File
@@ -0,0 +1,12 @@
<script setup lang="ts">
const props = defineProps<{
image: string
}>()
</script>
<template>
<img class="object-contain sm:max-w-[85%] max-w-[95%] m-auto" :src="props.image" />
<div class="ml-auto mr-auto w-fit">
<slot />
</div>
</template>
+18
View File
@@ -0,0 +1,18 @@
<script setup lang="ts">
const props = defineProps<{
image: string,
imageRight?: boolean | string
}>()
let imagePosition = "sm:flex-row";
if(props.imageRight == true || props.imageRight == "true") imagePosition = "sm:flex-row-reverse"
</script>
<template>
<div :class="imagePosition" class="flex mt-5 mb-4 flex-col">
<img class="object-contain sm:max-w-[40%] sm:max-h-[350px] max-h-[300px] max-w-[80%] m-auto" :src="props.image" />
<p class="self-center ml-5 sm:mt-2 mt-4">
<slot />
</p>
</div>
</template>
+14
View File
@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { TocLink } from '@nuxt/content';
const props = defineProps<{
link: TocLink
}>()
</script>
<template>
<li class="mt-1 mb-1"><a :href="`#${link.id}`">{{ link.text }}</a></li>
<ul class="ml-2 mt-1 mb-1">
<BlogTocLink v-for="child in link.children" :link="child" />
</ul>
</template>
+97
View File
@@ -0,0 +1,97 @@
<script setup lang="ts">
const route = useRoute()
const slug = route.params.slug
const { data } = await useAsyncData(() => queryCollection('blog').path("/blog/" + slug).first())
const title = (data.value == undefined ? 'Blog' : data.value!.title);
useSeoMeta({
title: data.value?.title,
description: data.value?.description
})
defineOgImageComponent('BlogPost', {
title: title,
description: data.value?.description
})
</script>
<template>
<HeaderCompact :title="title" previous-link="/blog" />
<div class="flex xl:flex-row flex-col-reverse xl:mt-20 sm:mt-10 mt-5 xl:mb-20 mb-5 m-auto">
<ContentRenderer v-if="data" :value="data" class="max-w-4xl w-[90%] xl:mr-10 m-auto content" />
<div v-if="data?.body.toc != undefined" class="xl:visible collapse xl:mt-0 mt-5 xl:ml-10 ml-5 mb-10 m-auto max-w-60 xl:sticky xl:top-16">
<ul>
<BlogTocLink v-for="link of data.body.toc.links" :link="link" />
</ul>
</div>
</div>
</template>
<style>
.content h2 {
font-size: 30px;
margin-top: 10px;
margin-bottom: 10px;
}
.content h3 {
font-size: 26px;
margin-top: 10px;
margin-bottom: 10px;
}
.content h4 {
font-size: 23px;
margin-top: 10px;
margin-bottom: 10px;
}
.content h5 {
font-size: 21px;
margin-top: 10px;
margin-bottom: 10px;
}
.content p {
font-size: 20px;
margin-bottom: 20px;
}
.content ul {
list-style-type: disc;
list-style-position: inside;
font-size: 20px;
margin-bottom: 20px;
}
.content li {
list-style-type: disc;
list-style-position: inside;
}
.content a {
color: initial;
}
.content a:link {
color: initial;
}
.content a:visited {
color: initial;
}
.content a:hover {
color: initial;
}
.content a:active {
color: initial;
}
.content p a {
text-decoration: underline;
}
ul {
list-style: none;
}
li {
list-style: none;
}
</style>
+40
View File
@@ -0,0 +1,40 @@
<script setup lang="ts">
defineOgImageComponent('Site', {
title: 'Blog'
})
const content = await queryCollection('blog').order('date', 'DESC').all()
function formatDateString(dateString: string) : string {
let date = new Date(Date.parse(dateString))
return new Intl.DateTimeFormat("en-US", {
dateStyle: "long",
timeZone: "Europe/Paris",
}).format(date)
}
</script>
<template>
<HeaderCompact title="Blog" previous-link="/" class="mb-20" />
<div class="m-auto lg:w-[56rem] w-[90%]" v-for="article in content">
<h1 class="text-2xl" v-if="article">{{ article.title }}</h1>
<h3 class="text-xl" v-if="article">
{{ formatDateString(article.date) }}
</h3>
<div class="flex">
<h4 v-for="tag in article.tags"
class="p-1 bg-slate-100 mr-3 hover:cursor-pointer">
{{ tag }}
</h4>
</div>
<h4 class="text-xl mt-2" v-if="article">{{ article.description }}</h4>
<a :href="article.path">
<h2 class="text-xl text-right">[ Read more ]</h2>
</a>
</div>
</template>
+223
View File
@@ -0,0 +1,223 @@
<script setup lang="ts">
defineOgImageComponent('Site', {
title: 'CV'
})
</script>
<template>
<HeaderBig />
<!-- CV -->
<div class="sm:mt-[100px] sm:mb-[200px] flex flex-col w-fit m-auto">
<!-- Professional experience -->
<div class="sm:mt-[50px] mt-8">
<h2 style="margin-bottom: 20px;">Professional experience</h2>
<div class="grid-flow-col section">
<p class="date">2025 - Now</p>
<p style="max-width: 1015px;"><strong>Sofware engineer</strong>, Canonical, Ubuntu engineering</p>
<p class="subtext" style="max-width: 1015px;">Working on Ubuntu support for RISC-V architecture</p>
<div class="entry-sep" />
<p class="date">2025</p>
<p style="max-width: 1015px;"><strong>Master's internship</strong>, ONERA, “Probabilistic analysis of execution time on multi/manycore heterogeneous boards for optimal task mapping”</p>
<p class="subtext" style="max-width: 1015px;">Real-time multicore optimal task mapping using a solver that automatically measures a pWCET for a solution on target platform</p>
<div class="entry-sep" />
<p class="date">Summer 2023</p>
<p style="max-width: 1015px;"><strong>Master's internship</strong>, Huawei Research Zurich, Improving performances of virtualized servers by removing the guest kernel/user isolation layer</p>
<p class="subtext">Working on a Linux kernel patch to allow programs to run in kernel mode</p>
<div class="entry-sep" />
<p class="date">2022 - 2023</p>
<p style="max-width: 1015px;"><strong>Master's research project</strong>, IRISA (Rennes), “Transparent use of node-local storage for asynchronous I/O on supercomputers”</p>
<p class="subtext">Library replacing MPI-IO calls, caching data locally, with neighbour communication</p>
<div class="entry-sep" />
<p class="date">Summer 2022</p>
<p style="max-width: 1015px;"><strong>Bachelor's internship</strong>, IRIT (Toulouse), Reducing traffic in data centers by avoiding the transition of data through intermediate servers</p>
<p class="subtext">Library replacing read/write, using memory protection to provide data on-demand</p>
<div class="entry-sep" />
</div>
</div>
<!-- Education -->
<div>
<h2 style="margin-bottom: 20px;">Education</h2>
<div class="section">
<p class="date">2024 - 2025</p>
<p><strong>M2 SIF</strong>, ENS Rennes, Second year of CS Master's Degree (Research)</p>
<div class="entry-sep" />
<p class="date">2023 - 2024</p>
<p><strong>Agrégation</strong>, ENS Rennes, Preparation for national competitive exam</p>
<p class="subtext">'Agrégé' in computer science, rank 14/22</p>
<div class="entry-sep" />
<p class="date">2022 - 2023</p>
<p><strong>M1 SIF</strong>, ENS Rennes, First year of CS Master's Degree (Research)</p>
<div class="entry-sep" />
<p class="date">2021 - 2022</p>
<p><strong>L3 SIF</strong>, ENS Rennes, Last year of CS Bachelor's Degree</p>
<div class="entry-sep" />
<p class="date">2018 - 2021</p>
<p style="max-width: 1015px;"><strong>Prépa</strong>, Lycée Bellevue Toulouse, two-year intensive program preparing
for the national competitive exams for entry to engineering schools.</p>
<p class="subtext">Prépa MPSI/MP, entry to ENS Rennes</p>
<div class="entry-sep" />
</div>
</div>
<!-- Personal projects -->
<div class="sm:mt-12 mt-5">
<h2 style="margin-bottom: 20px;">Personal projects</h2>
<div class="section">
<p class="date">2023 - 2024</p>
<p style="max-width: 1015px;"><a href="https://git.vhaudiquet.fr/vhaudiquet/vriscv/" target="_blank" rel="noopener noreferrer"><strong>RISC-V simulator</strong></a></p>
<p class="subtext">Basic RISC-V processor simulator, capable of running BBL and booting Linux</p>
<div class="entry-sep" />
<p class="date">2022 - 2023</p>
<p style="max-width: 1015px;"><strong>Java Virtual Machine implementation</strong>, school project</p>
<p class="subtext">Basic C JVM for GNU/Linux, Java 8 specs, using OpenJRE runtime</p>
<div class="entry-sep" />
<p class="date">2018 - Now?</p>
<p style="max-width: 1015px;"><a href="https://github.com/vhaudiquet/BladePlayer/" target="_blank" rel="noopener noreferrer"><strong>Blade Player</strong></a>, Android multi-source music player</p>
<p class="subtext">Maintaining for 100+ users this Android application that plays music from Spotify or Deezer</p>
<div class="entry-sep" />
<p class="date">2018 - 2020</p>
<p style="max-width: 1015px;"><a href="https://github.com/vhaudiquet/vk/" target="_blank" rel="noopener noreferrer"><strong>Operating system kernel development</strong></a>,x86 architecture</p>
<p class="subtext">Basic operating system kernel, with drivers, filesystem, Newlib ported, dash shell</p>
<div class="entry-sep" />
</div>
</div>
<!-- Skills -->
<div class="sm:mt-12 mt-5">
<h2 style="margin-bottom: 20px;">Skills</h2>
<div class="section">
<p style="margin-left: 10px; font-weight: 500; grid-column: 1;">Programming languages</p>
<p class="sm:col-start-2 col-start-1" style="max-width: 900px;">C, Assembly (x86, RISC-V, ARM), Java, TypeScript/JavaScript, Kotlin, Python, OCaml</p>
<p style="margin-left: 10px; font-weight: 500;">DevOps / Workflow</p>
<p>Linux, Bash, Git, CI/CD, Docker, Kubernetes, virtual machines</p>
<p style="margin-left: 10px; font-weight: 500;">Presentation tools</p>
<p>LaTeX, Figma, HTML/CSS, Inkscape, Gimp</p>
<p style="margin-left: 10px; font-weight: 500;">Spoken languages</p>
<p>French (native), English (fluent), Spanish (basic)</p>
</div>
</div>
<!-- Contact -->
<div class="sm:mt-12 mt-5 sm:mb-0 mb-8">
<h2 style="margin-bottom: 20px;">Contact</h2>
<div class="section">
<p style="margin-left: 10px; font-weight: 500; grid-column: 1;">E-Mail</p>
<a href="mailto:valentin.haudiquet@ens-rennes.fr" style="grid-column: 2;"><p style="grid-column: 2;">valentin.haudiquet@ens-rennes.fr</p></a>
<p style="margin-left: 10px; font-weight: 500;">Website</p>
<a href="https://vhaudiquet.fr" target="_blank" rel="noopener noreferrer"><p>https://vhaudiquet.fr</p></a>
<p style="margin-left: 10px; font-weight: 500;">Phone number</p>
<p>+33 7 87 18 09 65</p>
<p style="margin-left: 10px; font-weight: 500;">Street address</p>
<p>30 rue Achille Viadieu, 31400 Toulouse, France</p>
<p style="margin-left: 10px; font-weight: 500;">GitHub</p>
<a href="https://github.com/vhaudiquet/" target="_blank" rel="noopener noreferrer"><p>vhaudiquet</p></a>
</div>
</div>
</div>
</template>
<style lang="css" scoped>
.section {
display: grid;
grid-auto-flow: row;
column-gap: 50px;
width: fit-content;
}
.date {
margin-left: 10px;
font-style: italic;
}
.subtext {
font-weight: 200;
font-size: 26px;
grid-column: 2;
}
h2 {
font-size: 40px;
margin-top: 5px;
margin-bottom: 5px;
}
p {
font-size: 30px;
margin-top: 5px;
margin-bottom: 5px;
}
.entry-sep {
grid-column: 2;
}
@media only screen and (max-width: 450px) {
h2 {
font-size: 30px;
margin-top: 2px;
margin-bottom: 2px;
margin-left: 5px;
}
p {
font-size: 20px;
margin-left: 10px;
margin-top: 0px;
margin-bottom: 0px;
}
.subtext {
grid-column: 1;
font-size: 18px;
margin-left: 10px;
}
.entry-sep {
grid-column: 1;
margin-top: 20px;
margin-top: 20px;
}
}
</style>
+113
View File
@@ -0,0 +1,113 @@
<script setup lang="ts">
defineOgImageComponent('Site', {
title: 'vhaudiquet.fr'
})
</script>
<template>
<HeaderBig />
<div class="content-holder">
<!-- Links -->
<div id="links-div" style="grid-column: 1;">
<a href="/blog/" style="grid-column: 1;">
<img src="~/assets/img/post-outline.svg"
class="sm:w-[150px] w-[70px] h-auto m-auto" />
<p class="text-center sm:text-3xl text-xl">Blog</p>
</a>
<a href="/projects">
<img src="~/assets/img/material-symbols--list-alt-outline.svg"
class="sm:w-[150px] w-[70px] h-auto m-auto" />
<p class="text-center sm:text-3xl text-xl">Projects</p>
</a>
<a href="/cv/">
<img src="~/assets/img/icon-park-solid_people.svg"
class="sm:w-[150px] w-[70px] h-auto pb-4 p-3 m-auto" />
<p class="text-center sm:text-3xl text-xl">CV</p>
</a>
</div>
<div class="lg:w-[350px] w-0 col-2" />
<div id="contact-div" class="mt-12 mb-12">
<h4 class="sm:text-4xl text-3xl text-left pb-4">Find me on...</h4>
<a href="https://github.com/vhaudiquet" class="flex">
<img src="~/assets/img/github-mark.png" class="contact-image"/>
<p class="contact-text sm:text-3xl text-xl mt-1 mb-1">GitHub</p>
</a>
<a href="https://git.vhaudiquet.fr/vhaudiquet/" class="flex">
<img src="~/assets/img/logo_black.svg" class="contact-image"/>
<p class="contact-text sm:text-3xl text-xl mt-1 mb-1">Gitea (personal)</p>
</a>
<a href="https://launchpad.net/~vhaudiquet" class="flex">
<img src="~/assets/img/launchpad-white-black.png" class="contact-image"/>
<p class="contact-text sm:text-3xl text-xl mt-1 mb-1">Launchpad</p>
</a>
<a href="mailto:valentin.haudiquet@ens-rennes.fr" class="flex">
<img src="~/assets/img/arobase.svg" class="contact-image"/>
<p class="contact-text sm:text-3xl text-xl mt-1 mb-1">Mail</p>
</a>
</div>
</div>
</template>
<style lang="css" scoped>
.content-holder {
display: grid;
width: fit-content;
margin: auto;
grid-auto-flow: column;
}
.contact-image {
width: 48px;
height: 48px;
}
.contact-text {
text-align: right;
padding-left: 10px;
font-size: 28px;
}
#links-div {
display: grid;
column-gap: 40px;
grid-auto-flow: column;
width: fit-content;
margin: auto;
margin-top: 100px;
}
@media only screen and (max-width: 1000px) {
#links-div {
display: grid;
column-gap: 40px;
row-gap: 40px;
width: fit-content;
margin: auto;
margin-top: 100px;
}
.content-holder {
grid-auto-flow: row;
}
}
@media only screen and (max-width: 450px) {
#header-div {
margin-top: 30px;
}
#links-div {
margin-top: 40px;
}
}
</style>
+148
View File
@@ -0,0 +1,148 @@
<script setup lang="ts">
defineOgImageComponent('Site', {
title: 'Projects'
})
</script>
<template>
<HeaderBig />
<!-- Projects -->
<div id="projects-div">
<!-- BuildPath -->
<a href="https://buildpath.win">
<div class="project-div">
<h2 class="project-title">BuildPath</h2>
<img class="project-img" src="https://buildpath.win/favicon.svg"/>
<h3 class="project-link">https://buildpath.win</h3>
<p class="project-desc">a tool for League of Legends champions runes and build paths</p>
</div>
</a>
<!-- homeprod -->
<a href="https://github.com/vhaudiquet/homeprod">
<div class="project-div">
<h2 class="project-title">homeprod</h2>
<img class="project-img" src="https://vhaudiquet.fr/public/github_assets/homeprod/p330_sff.png"/>
<h3 class="project-link" style="display: flex;">
<img src="~/assets/img/github-mark.png" width="16px" style="margin: auto; display: block; margin-right: 4px;"/>
vhaudiquet/homeprod
</h3>
<p class="project-desc">personal home production environment</p>
</div>
</a>
<!-- BladePlayer -->
<a href="https://github.com/vhaudiquet/BladePlayer">
<div class="project-div">
<h2 class="project-title">Blade Player</h2>
<img class="project-img" src="~/assets/img/blade-icon.png"/>
<h3 class="project-link" style="display: flex;">
<img src="~/assets/img/github-mark.png" width="16px" style="margin: auto; display: block; margin-right: 4px;"/>
vhaudiquet/BladePlayer
</h3>
<p class="project-desc">android music player that plays from multiple sources</p>
</div>
</a>
<!-- vhaudiquet.fr -->
<a href="https://vhaudiquet.fr">
<div class="project-div">
<h2 class="project-title">vhaudiquet.fr</h2>
<img class="project-img" src="~/assets/img/favicon.ico_256x256.png"/>
<h3 class="project-link" style="display: flex;">
https://vhaudiquet.fr
</h3>
<p class="project-desc">this website: my personal website with information, CV, projects</p>
</div>
</a>
</div>
</template>
<style lang="css" scoped>
#projects-div {
display: grid;
grid-auto-flow: column;
width: fit-content;
margin: auto;
margin-top: 100px;
column-gap: 40px;
}
.project-div {
max-width: 280px;
width: 280px;
height: 350px;
background-color: #FEFEFE;
border-radius: 12px;
border: 1px solid #E0E0E0;
box-shadow: 5px 2px 2px #E0E0E0;
padding: 10px;
}
.project-div:hover {
background-color: #EEEEEE;
}
.project-title {
width: fit-content;
margin: auto;
font-weight: 400;
font-size: 30px;
color: black;
}
.project-img {
max-width: 140px;
max-height: 140px;
/* width: fit-content; */
margin: auto;
display: block;
margin-top: 10px;
}
.project-link {
font-size: 12px;
width: fit-content;
font-weight: 400;
margin: auto;
margin-top: 8px;
color: black;
}
.project-desc {
font-size: 16px;
margin-left: 5px;
margin-top: 30px;
font-weight: 300;
color: black;
text-align: center;
}
@media only screen and (max-width: 1000px) {
#projects-div {
grid-auto-flow: row;
row-gap: 40px;
grid-template-columns: repeat(2, 270px);
}
}
@media only screen and (max-width: 650px) {
#projects-div {
margin-top: 50px;
grid-template-columns: repeat(1, 270px);
}
}
</style>
+15
View File
@@ -0,0 +1,15 @@
import { defineContentConfig, defineCollection } from '@nuxt/content'
import { z } from 'zod'
export default defineContentConfig({
collections: {
blog: defineCollection({
type: 'page',
source: 'blog/*.md',
schema: z.object({
date: z.string(),
tags: z.array(z.string())
})
})
}
})
+225
View File
@@ -0,0 +1,225 @@
---
date: '2025-11-18'
title: 'Joining Canonical to work on RISC-V support for Ubuntu'
tags:
- riscv
- ubuntu
---
Two months ago, on September 1st 2025, I started a new job at Canonical, the company behind Ubuntu.
My role involves working on RISC-V architecture support for the operating system.
It allowed me to learn a lot about Debian and Ubuntu, packaging for and maintaining an operating system,
as well as how the RISC-V architecture and ecosystem work and evolve.
<!-- more -->
## Joining Canonical
### The interview process
As you may have heard, the interview process at Canonical is tough.
It takes a **long** time, includes some unique steps that might seem unusual, and their overall approach is
very distinctive, which can be confusing.
However, I didn't find the experience *unpleasant*. Of course, any intensive process is challenging, but
given that I was still in university (completing my master's internship) and then on vacation, I wasn't overwhelmed.
After submitting my resume, I went through a **written interview**, followed by a **technical assignment** completed at home, and then a series of **technical interviews**. Later stages included an HR interview and meetings with potential future managers and colleagues.
After many rounds and nearly six months, I received an offer and happily (but nervously) accepted.
Overall, **yes**, their process is unique and demanding, but I believe it makes sense for their situation:
- They hire globally for fully remote positions
- They are a world-famous company (thanks to Ubuntu) but remain relatively small
- They have a very opinionated, data-driven approach to talent acquisition
### Onboarding
The onboarding process started even before my first day.
Since much of Ubuntu's development happens on [Launchpad](https://launchpad.net), I had to create a [Launchpad account](https://launchpad.net/~vhaudiquet) and register it through Canonical's internal systems. There was also the standard paperwork for any new job.
During my first week, I discovered the company. After conversations with my colleagues, I worked through
various administrative tasks. On the technical side, my team explained the context of
Ubuntu and RISC-V. Basically, RISC-V had a new ratified CPU profile, RVA23, which mandates RISC-V extensions
like vector (SIMD), hypervisor, and others. On Ubuntu, starting from 25.10 Questing Quokka, RVA23 will become the
baseline, and older hardware will no longer be compatible (only supported by 24.04 Noble Numbat and below). The twist
is that RVA23 hardware is not yet available, so we do all our work in virtual machines. Supporting RVA23 early is crucial for bridging the gap between RISC-V and other architectures. Our main task is to rebuild the packages in the archive using the RVA23 compiler profile, and fix the issues that might arise from those rebuilds.
## Initial work: fixing bugs
During my first week, I was (also) tasked with dealing with **FTBFS bugs**.
An FTBFS, for **f**ailed **t**o **b**uild **f**rom **s**ource, is when a source package fails to build on the archive.
Ubuntu builds its *main* archive of packages from source code, and we need these packages to always be *buildable*.
This ensures we can patch and rebuild packages to fix issues.
To ensure that, scheduled tests rebuilds of the archive are run regularly.
When a package fails to build, it is treated as a **bug**, and a report is filed on Launchpad.
If a package FTBFS's only on the `riscv64` architecture, it becomes my (team's) responsibility to fix it.
Here is what I worked on in my second week:
- Fixed [LP: #2121938](https://bugs.launchpad.net/ubuntu/+source/mozc/+bug/2121938) on the **mozc** package.
That bug was caused by a library expecting `-std=c++20`, but the actual compile flag was `-std=c++17`.
This was a straightforward fix that helped me learn how to patch a Debian package and forward the change.
- Fixed [LP: #2121937](https://launchpad.net/bugs/2121937) on **libcupsfilters** package.
That was a `dpkg-gensymbols` error. The compilation process for this library performs strict checks on exposed symbols, to
ensure compatibility. However, the expected symbol file contained
earlier bugs, causing the build to fail when newer RISC-V vector symbols were added.
- Fixed [LP: #2122479](https://launchpad.net/bugs/2122479) on **protobuf**.
protobuf required a recursive function to be optimized with a tail-call, but GCC was not able to do that on
`riscv64`. The bug was already patched upstream, making the tail-call requirement architecture-specific.
I simply backported that patch to the Debian package.
Later, I also worked on **autopkgtest** bugs. After a package is built, it is made available on the
`proposed` pocket, which is a specific repository of the archive that users typically don't have enabled on their systems
(unlike `release`, `updates`, or even `backports`). To migrate from `proposed` to `release`, a package must pass all automatic tests (*autopkgtests*), along with tests for its reverse dependencies.
Again, if these tests fail only on `riscv64`, it's our job to fix them.
Here is what I did in my third week:
- Fixed [LP: #2122492](https://bugs.launchpad.net/ubuntu/+source/pam/+bug/2122492) on **pam**.
That test was failing for `arm64` and not `riscv64`, but it was triggered by a rebuild that my colleague had done for `riscv64`, so I was involved in the fixing process. The solution was to rebuild all the dependencies of that package, as well as the package itself, to enable a new ARM security feature (GCS) that made the linker complain.
- Fixed [LP: #2122271](https://bugs.launchpad.net/ubuntu/+source/inetutils/+bug/2122271) on **inetutils**.
Again, that test was failing for all architectures, but was triggered due to a `riscv64`-needed rebuild.
The issue was a faulty test, which needed to be removed.
I worked on more *FTBFS* and *autopkgtest* bugs after that. While the process always starts with checking a log file and ends
with sending a patch, the steps in between can vary wildly, which is really stimulating.
While I've described my personal work, it's important to note that every bug fix was a collaborative effort.
I consistently received help from different colleagues, which also gave me the chance to connect with many people on the way.
However, fixing bugs all day can become monotonous after a couple of weeks, so I began looking into new features that were needed for Ubuntu on `riscv64`.
## Beyond the bugs: features!
After that initial bug-solving phase, I was tasked with investigating feature support.
The RISC-V community had introduced new extensions, `Zicfiss` and `Zicfilp`, to provide RISC-V with *control flow integrity* (CFI)
features.
### Control Flow Integrity?
Control Flow Integrity is the collection of techniques preventing malware attacks from redirecting the flow of execution
(control flow) of a program. In this section, I will try to give you an overview of what CFI is, and why it is important.
#### Backward-edge CFI
##### The `return` mechanism
::BlogImageText{image="/img/joining-canonical-riscv/callret.png"}
*The following section assumes some architectural knowledge, e.g. how function calls work at assembly level.*
On most architectures, the `return` mechanism uses the **stack** to store return addresses during function calls (at least for non-leaf functions, where a register used to do that would need to be *spilled*, saved on the stack).
::
##### Stack smashing
::BlogImageText{image="/img/joining-canonical-riscv/smashed.png" imageRight=true }
A basic attack called **stack smashing** exploiting this mechanism involves using a memory corruption vulnerability in the target to overwrite the return address on the stack, as well as copying a **payload** on it.
This can be easily avoided by disabling execution on the stack memory.
::
##### Return-oriented programming
::BlogImageText{image="/img/joining-canonical-riscv/rop.png"}
A more advanced attack, **return-oriented programming** (ROP), only overwrites multiple return addresses on the stack to
direct control flow to specific execution sequences, called **gadgets**, to fulfill the same role as a **payload**.
::
##### A solution: shadow stack
::BlogImageText{image="/img/joining-canonical-riscv/shadow_stack.png"}
To prevent this kind of attack, one solution is to use a **shadow stack**: a second stack that only stores return addresses.
It's immune to buffer overflows since it holds no buffer, and each `return` operation compares the address from the regular stack with the one on the shadow stack.
This can be implemented in several ways:
- Compiler support, modifying function prologues/epilogues
- Dynamic binary rewriting
- **Hardware support** (the best)
::
##### RISC-V Hardware support: Zicfiss
`Zicfiss` is a RISC-V ISA extension that provides hardware support for a shadow stack.
The shadow stack is implemented using a dedicated `ssp` (shadow stack pointer) register.
It is possible to push an address to the shadow stack using `SSPUSH ra`,
and to pop (while checking that the address matches the one in `ra`) using `SSPOPCHK ra`.
To set up the stack, `SSRDP rd` reads `ssp` into register `rd`, and `SSAMOSWAP.D rs1 rs2` allows switching stacks (`ssp`).
To protect that stack, the MMU contains a new page type, `SS` page, which allows only the previous instructions to access it.
These instructions are designed so that an RVA23 RISC-V processor without CFI support can execute them as NOOPs. This means we can enable the feature broadly; processors with hardware support will benefit, while others remain unaffected.
Implementing this requires support from the compiler (`gcc`), linker (`binutils`), kernel (`linux`) and dynamic linker (`glibc`). Dynamic linker support is crucial because it allows dynamically turning on/off the feature depending on whether or not every dependency of the running program supports it (if a library expects a shadow stack populated, but another library calls it without shadow stack support, everything will go wrong).
#### Forward-edge CFI
A similar attack is possible for forward-edge flow (i.e. indirect jumps). I won't go into details here,
but you can research "jump-oriented programming". The corresponding RISC-V extension is called `Zicfilp`,
and implements a solution called "landing pads".
### RISC-V CFI support on Ubuntu
That was a lot of information!
The important thing: there are security hardware extensions (`Zicfiss` and `Zicfilp`) that we want to support on Ubuntu. However, they need software support from the entire toolchain, before trying to rebuild
packages with that extension enabled. For context, other major architectures (amd64 / x86_64, arm64) have CFI hardware support, with enabled software support in Ubuntu ; so investigating CFI support on RISC-V is another step towards bridging the gap.
First, I needed to check the status of upstream projects (`binutils`, `gcc`, `glibc`, `linux`) support.
At that time, `gcc` and `binutils` had upstream support (`binutils` was missing one patch), but `glibc` and `linux` support
was not merged (though patches were available on the mailing list).
The next step was to try and build those packages with the necessary patches, which was not easy. In fact, some of those packages are still not built at the time I write this article. This is the role of the operating system: to unify all
of those patches and make them work together (and it can sometimes be challenging).
The good thing is that with those patches, it is possible to build C programs with CFI features enabled. Once the latest versions of all patches are built and working together, it *should* be possible to test such an example program that executes a CFI-illegal instruction (easy to write in assembly) and verifies that it is killed by
the kernel. Afterwards, we'll need extensive testing before enabling CFI for the packages in the archive, but we're not there yet.
This investigation is still ongoing at the time of writing, though it's not the highest priority.
While I was investigating, time flew by, and suddenly it was release week!
## The Questing Quokka
::BlogImageText{image="/img/joining-canonical-riscv/questing-quokka-bg.svg"}
Ubuntu 25.10 Questing Quokka was released on October 09, 2025. This was my first release week.
Even though we had been testing daily images before, I expected it to be more complicated.
As it turned out, everything went smoothly, the testing and bugfixing we had done previously prepared us perfectly for the release.
For riscv64, the image took a long time to build, but that wasn't a major issue, I just tested one image a bit later than the others.
::
<!-- The main thing that -->
## RISC-V Summit North America 2025
On October 21-23, the RISC-V Summit North America 2025 took place in Santa Clara, California, USA.
Of course, given that it is the most important event for the RISC-V community, Canonical had to be there;
and given that I'm on the RISC-V team, I was there as well. I was even tasked to prepare some demos
beforehand, which was really fun. One of the demos I enjoyed preparing was getting **Minecraft** to run, which was easy
thanks to the [HMCL launcher](https://github.com/HMCL-dev/HMCL). It ships with native libraries already patched and
built for RISC-V. It was almost plug and play, with the only adjustments made being the use of performance
mods (Sodium, Lithium).
::BlogImage{image="/img/joining-canonical-riscv/minecraft_riscv.png"}
*Minecraft running on RISC-V hardware (SiFive HiFive Premier P550) on Ubuntu 24.04*
::
## Induction and engineering sprints in Gothenburg
After the summit, there was no time to rest, as it was already time for the induction and engineering sprints
in Gothenburg, Sweden. The first week was **induction**, filled with presentations of different
areas of Canonical. We learned about various Canonical products like Ubuntu, but also [juju](https://github.com/juju/juju), [MAAS](https://canonical.com/maas), [microcloud](https://canonical.com/microcloud), and more. It was interesting
to meet all the new joiners, and I also got to meet some of my colleagues.
The following week was the **engineering sprint**. I finally got to meet my team in person. It is fascinating to see in
real life the people I'd been working with for two months, and get to know them personally. It was also refreshing
and motivating to be able to talk with each other directly, which is what we did mostly (with a little bit of direct
work in the middle). Meeting other teams allowed us to brainstorm solutions for some of our shared
problems and plan our work for the following release (26.04 LTS Resolute Raccoon).
All of that was really motivating, first the summit discovering the future of RISC-V and then the sprints where we could
plan the future of Ubuntu for RISC-V. It made me eager to come back home and start implementing all of what we talked about.
## Towards the future
I am now back home and have been working again for one week.
With all that motivation during the sprint, my TODO list became enormous.
Fortunately, there is plenty of time before the end of the cycle, so let's get started!
If you want to follow my work, I try to publish weekly updates on [Ubuntu Discourse](https://discourse.ubuntu.com/c/project/foundations/25); look for "Foundations Team Updates" topics.
For now, it's been mainly continuing the CFI investigation, fixing bugs again, and keeping up the effort towards supporting an Ubuntu RISC-V desktop image. That 'desktop' work went a bit far, as I'm currently trying to add RISC-V support to Flutter.
We will see how that goes, and I hope that we will be able to bridge the gap between RISC-V and other architectures!
+4
View File
@@ -0,0 +1,4 @@
// @ts-check
import withNuxt from './.nuxt/eslint.config.mjs'
export default withNuxt()
+50
View File
@@ -0,0 +1,50 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2025-07-15',
devtools: { enabled: true },
// Static Site Generation
// Pre-render all routes
ssr: true,
app: {
head: {
title: 'Valentin Haudiquet',
htmlAttrs: {
lang: 'en'
},
link: [
{ rel: 'icon', type: 'image/png', sizes: '256x256', href: '/favicon.ico_256x256.png' },
],
charset: 'utf-8',
viewport: 'width=device-width, initial-scale=1'
}
},
site: {
url: 'https://vhaudiquet.fr',
name: 'Valentin Haudiquet'
},
modules: [
'@nuxt/content',
'@nuxt/eslint',
'@nuxt/fonts',
'@nuxt/icon',
'@nuxt/image',
'@nuxtjs/tailwindcss',
'@nuxtjs/seo',
],
css: ['~/assets/css/main.css'],
tailwindcss: {
exposeConfig: true,
viewer: true,
},
fonts: {
defaults: {
weights: [200, 300, 400, 500, 600]
}
}
})
+17777
View File
File diff suppressed because it is too large Load Diff
+29
View File
@@ -0,0 +1,29 @@
{
"name": "vhaudiquet-fr",
"type": "module",
"private": true,
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@nuxt/content": "^3.8.0",
"@nuxt/eslint": "^1.10.0",
"@nuxt/fonts": "^0.12.1",
"@nuxt/icon": "^2.1.0",
"@nuxt/image": "^2.0.0",
"@nuxtjs/seo": "^3.2.2",
"@nuxtjs/tailwindcss": "^6.14.0",
"better-sqlite3": "^12.4.1",
"eslint": "^9.39.1",
"nuxt": "^4.2.1",
"vue": "^3.5.22",
"vue-router": "^4.6.3"
},
"devDependencies": {
"@iconify-json/material-symbols": "^1.2.44"
}
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="artwork" viewBox="0 0 1000 1000" version="1.1" sodipodi:docname="quokka.svg" inkscape:version="1.4.2 (2aeb623e1d, 2025-05-12)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview id="namedview40" pagecolor="#ffffff" bordercolor="#000000" borderopacity="0.25" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="0.4015" inkscape:cx="1140.7223" inkscape:cy="504.35865" inkscape:window-width="1920" inkscape:window-height="1043" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="artwork"/>
<defs id="defs1">
<style id="style1">
.cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6 {
fill: none;
}
.cls-7 {
fill: #f15d22;
}
.cls-2 {
stroke-width: 3.5px;
}
.cls-2, .cls-3, .cls-4 {
stroke: #3d3d3d;
}
.cls-2, .cls-3, .cls-4, .cls-5 {
stroke-miterlimit: 10;
}
.cls-3 {
stroke-width: 1.75px;
}
.cls-4 {
stroke-width: 1.5px;
}
.cls-5 {
stroke-dasharray: 12 8 0 0 0 0;
}
.cls-5, .cls-6 {
stroke: #f15d22;
stroke-linecap: round;
stroke-width: 2.5px;
}
.cls-8 {
fill: #171717;
}
.cls-6 {
stroke-linejoin: round;
}
</style>
</defs>
<g id="g28">
<path class="cls-3" d="M888.25269,269.47078c-4.12783,7.69639-24.86524,38.5125-36.37637,49.72496-15.35956,14.96104-32.00256,23.27951-44.66802,29.49464-16.4606,8.07746-25.45829,10.11427-43.15385,21.38361-11.12783,7.08671-16.86588,12.2015-18.92713,19.90888-2.94697,11.01927,3.24727,21.25924,3.78542,22.12098,4.20555,6.73429,7.88712,6.18878,13.62753,13.27259,5.45663,6.73362,7.09668,13.3555,9.08503,21.38361,3.02595,12.21751,5.61989,22.69079,0,32.4441-1.0324,1.79174-5.86819,10.18423-14.38462,11.79785-9.04502,1.71378-14.14496-5.75304-19.68422-2.94946-4.48772,2.27136-2.51692,7.86911-7.57085,18.43415-2.50299,5.23239-7.41647,15.50383-14.38462,16.22205-8.62191.88867-11.75134-13.73891-21.95547-14.00996-8.34421-.22164-15.94573,9.30204-18.92712,16.95942-3.42005,8.78401.14712,12.78112,0,23.59571-.30684,22.55521-16.10905,26.15961-15.89879,46.45404.14331,13.83186,7.6092,24.26056,11.35628,29.49464,8.38531,11.71299,21.08805,26.88565,33.04501,33.1648,24.12782,12.67063,45.70004,19.90122,50.65862,21.36622,12.16003,3.59265,19.67008,6.53513,27.91393,8.48945,4.51444,1.07021,11.96154,2.29177,16.51518,10.56563,4.31873,7.84705-.78491,13.54645,2.13217,19.03999,6.33611,11.93241,26.22079,4.9343,43.1076,4.7062,8.99371-.12148,57.42941,3.69443,59.80326,21.66789" id="path1"/>
<path class="cls-3" d="M927.90973,311.85051c-20.12124-22.38205-54.93776,8.36501-66.67294,20.73156-9.4893,9.99983-18.46076,16.20322-32.31751,23.85419-14.80998,8.1773-31.38773,14.86543-33.49271,15.70885-4.62356,1.85256-14.12037,5.53115-25.26642,12.79981-10.13822,6.61143-11.98175,9.89405-12.33942,12.79981-.54513,4.42879,2.47643,7.04781,9.40146,16.87247,4.3992,6.24122,8.70521,12.35025,11.75183,18.6179,6.09547,12.53991,6.38964,24.15138,6.46349,29.09047.10639,7.11512.23879,15.97104-4.70073,25.59962-2.92995,5.71131-6.02837,11.75105-12.33942,13.96342-8.15764,2.8597-14.90561-3.0512-20.56569,1.16363-1.77635,1.32278-2.09465,2.63692-4.11313,7.56352-5.51188,13.45314-8.26783,20.1797-12.92702,23.85419-4.43114,3.49465-11.01648,5.62746-17.04015,4.65447-5.01235-.80963-5.99276-3.18127-15.27737-6.9817-7.22713-2.95824-11.36846-4.6534-13.5146-2.90905-2.77134,2.25249.73144,7.84494,1.17518,18.6179.39859,9.67676-1.934,17.14778-2.93795,20.36333-4.19143,13.42465-9.69415,13.66821-11.16424,23.27238-1.65078,10.78473,3.84516,19.90312,5.87592,23.27238,5.27648,8.75428,11.20948,19.56299,22.41411,26.34167,7.02623,4.25079,12.71457,6.71259,24.09124,11.63618,10.21433,4.42054,12.88131,7.687,20.47589,9.78332,11.95075,3.29874,18.3593-1.86036,25.88963-.31279,3.84619.79044,11.64382,2.24197,19.94665,10.73255,9.43688,9.65028,12.94272,20.8001,13.5146,22.69058,2.56563,8.48136,1.16517,11.73257,4.70073,15.12705,3.97964,3.82085,9.63621,3.42888,20.56569,2.90905,6.64937-.31627,67.28534-1.22241,93.51386-16.94158" id="path2"/>
<path class="cls-2" d="M389.81428,678.00607c-.98827,9.59217-8.27693,10.36176-13.09405,22.05315-5.91034,14.34468.71899,23.72667-4.82412,27.56642-7.65238,5.30086-25.34744-9.07413-26.87727-10.33741-3.80488-3.14199-22.01452-18.17903-17.91818-32.39057,1.84952-6.41661,7.8949-9.79103,19.98566-16.53986,15.09631-8.42647,26.1512-14.5971,34.45804-9.64823,6.19347,3.6898,8.97643,12.43921,8.26993,19.29649Z" id="path3"/>
<path class="cls-3" d="M360.18037,673.8711c-10.15911-2.26769-21.30602,10.60923-19.51115,16.26652.98569,3.10682-1.59865,7.61628,3.07322,12.3182,6.09047,6.12967,10.94256,7.66646,13.81236,8.3521,4.58708,1.0959,17.45835-15.3237,12.27382-27.97774-.27787-.6782-3.20053-7.51983-9.64825-8.95908Z" id="path4"/>
<path class="cls-4" d="M274.0387,798.10764c-11.71524,2.96641-17.87562,14.91829-13.99586,24.47449,3.02564,7.45244,11.63013,12.14918,19.99406,11.78401,11.52334-.5031,22.16367-10.59597,19.99406-21.7551-2.03048-10.44348-14.4272-17.43178-25.99226-14.5034Z" id="path5"/>
<path class="cls-3" d="M179.75307,546.55046c-7.56297,1.38032-11.42122,10.45183-13.37613,15.04817-6.13421,14.42266-4.23932,28.6977-2.7867,35.66973.3739,1.79452,4.3415,11.43866,12.26146,30.65368,15.60999,37.87223,8.46679,19.10652,9.47476,21.73625,4.36899,11.39851,5.11715,15.7819,9.47476,17.83486,5.24511,2.47106,13.23123.39339,16.72019-4.45871,3.4582-4.80935,1.29553-10.67195-3.34403-26.7523-4.95639-17.17848-7.43461-25.76773-8.91743-33.44038-4.41497-22.84425-5.5734-36.78435-5.5734-36.7844-.54333-6.53844-1.00818-15.10884-6.68806-18.39221-3.05172-1.76411-6.3551-1.27717-7.24543-1.11468Z" id="path6"/>
<path class="cls-2" d="M897.82604,391.24671c-26.25997-3.16352-47.17644,26.06614-49.62325,29.58308-7.57993,10.89512-10.56407,22.99842-16.22299,46.76036-8.89482,37.34956-4.43875,41.3338-12.40581,54.39478-13.34867,21.88338-38.17645,30.89323-47.71465,34.35457-29.25699,10.61718-46.62901,3.22402-51.53183,13.36007-4.87376,10.07598,6.23375,29.90833,21.94875,37.21739,19.78349,9.20124,32.61618-8.07355,52.48611.95428,14.67074,6.66558,10.57431,17.40014,32.44598,32.44602,8.22805,5.66016,18.89103,12.784,33.40025,12.4058,1.52984-.03987,15.15999-.57214,26.72023-9.54297,10.72898-8.32575,14.7299-20.08275,20.99444-64.89192,6.83155-48.86488,10.24733-73.29731,7.63434-86.84069-4.81816-24.97311-14.30688-36.70214-7.63434-55.34895,5.07943-14.19473,15.42298-20.93718,12.4058-30.53736-2.77995-8.84526-14.77067-13.33477-22.90302-14.31446Z" id="path7"/>
<path class="cls-3" d="M860.60859,509.57914c-6.71983,2.17458-10.66755,8.01071-22.90303,44.85171-10.53805,31.73012-10.73749,36.81878-7.63434,40.08033,5.86017,6.15925,21.18196,3.36745,30.53737-3.81721,3.81067-2.92652,7.32777-7.11661,15.26871-35.30884,9.20528-32.681,7.51802-37.83951,4.77146-41.0346-4.48345-5.21572-13.29718-6.95351-20.04016-4.77138Z" id="path8"/>
<path class="cls-3" d="M380.95416,418.18445c-.45683-5.32566-3.85671-8.13766-18.5734-20.43075-28.7993-24.05668-29.28776-24.57215-37.14685-30.64613-16.2658-12.57124-23.852-17.84352-35.28949-21.3594-9.16939-2.8187-13.58357-2.28601-15.78739-1.8573-11.65088,2.26623-13.14258,11.66534-24.14546,17.64469-8.44627,4.58999-10.58448,3.03676-34.71017,2.87886-6.15915-.0403-18.69263,5.50024-34.59044,7.46068-25.66465,3.16479-31.89516,1.88922-56.99862,5.44784-27.63987,3.91811-33.48376-1.68527-41.79021,5.57201-4.96984,4.34214-6.32113,9.35637-13.00138,46.43362-3.53438,19.61683-5.30157,29.42519-5.57201,31.57478-1.77644,14.11988-3.32311,35.58518,0,69.65033,6.78046,69.50679,27.11855,122.62088,33.43214,138.3719,4.64528,11.5889,15.31456,36.92106,36.21814,64.07832,15.38133,19.98291,24.20357,25.2336,29.71748,27.86017,15.95581,7.6005,26.70696,3.94321,55.7203,3.7146,28.12753-.22158,47.12538-.37129,66.86427,6.50077,3.35033,1.1664,54.01148,19.4433,57.5776,52.00553,3.00227,27.4135-29.89552,41.93263-23.21676,63.14967,3.37792,10.73106,16.53752,15.96761,42.71886,26.00277,38.95577,14.93147,39.56215,6.17797,97.5104,20.43075,13.016,3.20137,26.31398,6.92129,38.07555,0,9.23388-5.4339,13.09798-14.82397,15.78739-21.3594,1.43455-3.48611,12.2848-29.85294,0-47.36228-6.97201-9.93701-14.16475-6.71534-38.07544-20.43075-17.67563-10.13893-27.06262-15.52338-30.64623-26.00277-6.47802-18.94304,9.90211-41.49056,13.93009-44.57622,32.50627-24.90165,55.45045-26.72174,49.8828-34.92094-2.15524-3.17392-12.21385-6.22207-29.90064-8.43407-49.69007-6.21454-71.12661-1.99547-85.91778,3.42216-14.51818,5.31758-12.6445,10.81665-24.14546,13.00144-21.77647,4.13683-46.14452-12.22472-58.50625-31.57489-9.41937-14.74444-21.77027-45.59485-7.42937-58.5062,43.65282-39.30134,91.83231,5.33187,120.01169-3.12332,5.1862-1.55611,11.62832-.63717-3.47733-25.67735-14.00683-23.2187-13.88672-39.94145-13.03138-54.18701,1.38952-23.14196,17.91785-44.31221,10.56833-53.26337-4.24129-5.16553-9.57664.84345-14.99706,7.20656-2.12968,2.50006-7.45918,10.34543-10.55704,19.48468-2.95028,8.70385-11.64426,7.62845-15.70192,7.48352-17.24029-.61576-24.97788-3.68811-32.94324-7.48352-14.46863-6.89407-17.65709-27.30419-17.58394-41.81354.06986-13.85694,7.39667-24.01511,14.85874-34.36084,5.54761-7.69141,7.04006-7.38912,21.35946-23.21681,18.7986-20.77865,19.80513-25.25519,19.50205-28.78883Z" id="path9"/>
<path class="cls-3" d="M108.18929,403.24299c19.71539-6.37828,33.71959-3.69568,51.58172-3.533,37.0066.33695,32.924-10.66769,66.42031-9.18582,12.90835.57108,27.51834,2.82476,37.44972-6.35936,4.48494-4.14746,5.46654-8.27025,10.599-9.89246,6.60949-2.08909,12.10463,2.49664,25.43754,10.599,24.73717,15.03279,29.77824,13.80601,36.03659,23.31782,2.12035,3.22263,8.18242,12.4361,5.65277,21.90454-2.22131,8.31427-9.35552,10.41782-16.95836,17.665-11.58847,11.04642-14.69904,24.92398-17.665,38.15636-3.3406,14.90393-8.16642,36.43388,4.23959,55.11472,1.71775,2.58649,12.78884,18.70529,31.09036,21.90454,14.74827,2.57819,25.45338-4.76107,31.09036,1.41318,2.66969,2.92407.54848,4.87685,2.11982,16.95836,1.62647,12.50511,5.71795,24.3982,7.066,28.264,3.16006,9.06206,4.77808,10.98273,3.53295,12.71882-3.21498,4.48281-16.72402-4.52694-35.32995-6.35946-3.87144-.38129-29.46761-2.51801-51.58172,14.132-4.50891,3.39478-20.64835,15.92646-25.43754,38.15636-5.52496,25.64509,7.91597,46.27892,14.13195,55.82136,3.30748,5.07749,21.45864,30.05632,52.81221,35.69649,16.34401,2.94013,22.2574.38555,60.24364-4.60613,24.04142-3.15926,39.30888-8.9687,42.39595-3.533,1.3514,2.37947-.51717,5.14692-4.94618,14.13189-4.96425,10.07099-11.23579,22.79385-13.42536,31.797-3.01721,12.40612-.61137,27.32015,6.35936,38.15636,6.71098,10.43239,16.95719,15.9052,37.44972,26.85072,13.55082,7.23782,18.54836,8.19369,22.61118,14.83864,5.93469,9.70629,5.9903,25.19745-1.41318,31.09036-6.94383,5.52714-14.73327-1.93907-40.27618-5.65282-21.98194-3.19605-25.10463,1.04061-48.04872-3.533-2.46501-.49133-13.8933-2.84337-27.55736-9.18582-11.52-5.34724-19.03225-8.95499-20.49136-15.54518-1.44327-6.51874,4.49397-9.37104,10.599-21.90454,1.76065-3.61466,10.4595-21.47307,6.35936-38.8629-1.40499-5.95893-3.58706-15.43302-15.54513-24.02446-26.76766-19.23163-60.62341-30.19818-79.13913-32.50354-56.47659-7.03187-69.44518,10.6024-98.92384-4.23954-19.55138-9.84377-29.68999-25.57757-40.98272-43.10254-12.18666-18.9122-14.76911-31.06356-33.91677-98.9239-15.62258-55.36745-15.33726-52.35981-16.95836-60.76754-2.01249-10.4377-1.80122-11.6965-2.82641-101.75025-.11233-9.86631-.29963-26.08102,10.599-36.74307,3.76176-3.68005,8.25265-6.11991,15.54518-8.47918Z" id="path10"/>
<path class="cls-4" d="M279.58084,790.73767c14.48098,2.85481,29.51118,13.56354,28.45721,26.94623-1.05397,13.38269-26.87625,54.25415-50.76626,32.00995-23.89-22.2442-53.05306-52.46858-26.00115-56.08552,27.05192-3.61694,31.79799-6.12591,48.3102-2.87066Z" id="path11"/>
<path class="cls-3" d="M323.02994,761.36861c12.26311,5.72076,16.8397,7.00135,18.75963,7.50385,7.66073,2.0051,13.63711,2.25273,20.63559,2.50132,11.47459.40755,13.78272-.82998,28.13944-.93801,19.72586-.14843,22.14191,2.13683,23.13691,3.43922,3.2615,4.26888.00813,9.4326-1.87596,22.19895,0,0-2.06847,14.01547,0,30.32811,1.88729,14.88394,3.61158,28.4825,13.44439,35.64324,10.34733,7.53543,22.75259,2.90121,25.95077,10.31787,1.55374,3.60307.14811,8.22676-2.18861,10.94307-5.36563,6.23698-16.88914,3.86771-33.14197.3127-19.92485-4.3582-29.88728-6.53724-32.51672-13.4445-2.83231-7.44016,5.48552-10.89001,8.75451-29.07739.63142-3.5128,2.49707-15.49032-1.25066-29.7027-1.67639-6.35734-3.45496-13.10213-9.06716-19.38504-5.15128-5.76691-10.70921-7.98423-21.26089-12.19368-12.46093-4.97117-15.92875-4.012-28.53545-9.59773-5.9659-2.64337-5.0322-2.78851-12.98171-6.6492-2.56639-1.24635-14.5262-6.99221-32.13778-12.66502-5.23092-1.68495-10.65264-3.26431-28.58192-7.61751-38.77369-9.41432-35.84898-7.4744-41.74369-9.82208-14.52227-5.78382-24.00533-14.90563-42.97144-33.14936-9.5494-9.18572-19.41199-18.67265-29.87537-33.55861-10.58114-15.05353-15.93465-27.31696-24.55508-47.06403-6.30013-14.43195-12.41292-28.43465-18.0071-48.29167-8.02921-28.50026-9.91766-51.05562-11.04982-65.48033-1.27107-16.19494-.84737-26.75747,0-47.88242.77655-19.35845,2.02897-26.78437,7.22177-33.8745,7.8123-10.66684,19.803-14.1018,24.92723-15.49531,17.7684-4.83188,23.35073,2.97096,49.85445,4.71598,27.48213,1.80946,51.65179-4.5935,54.57043-5.38966,8.08583-2.20563,15.76767-5.02954,29.64321-7.41082,9.72176-1.66847,16.82561-2.83784,26.27464-2.02115,8.47046.73205,20.62926,1.78287,30.31689,10.77933,3.43906,3.19371,10.35493,9.61612,9.43191,16.84278-1.24545,9.75073-15.36028,9.99007-26.94832,22.23234-9.98172,10.54531-11.67263,23.21819-14.1479,41.76995-1.64151,12.30277-3.97335,31.55064,4.71593,53.22307,4.56213,11.37869,9.42341,23.50347,21.55871,30.99052,14.67453,9.05366,30.29903,5.34958,33.01172,13.47427,1.4404,4.31407-1.5059,9.72798-4.71593,12.80048-11.51521,11.02186-29.74985-4.9028-50.52819.67368-24.65423,6.61677-43.21476,40.90786-39.74886,69.39196,1.19383,9.81155,5.28733,17.09584,13.47421,31.66441,5.30003,9.43143,19.20168,34.16935,43.31354,48.47966,6.53416,3.87803,16.06878,8.32596,20.69465,10.48396Z" id="path12"/>
<path class="cls-2" d="M84.71453,357.02891c-4.27728-5.82337.9294-15.89457,21.24792-49.03372,31.95771-52.12238,47.93649-78.18363,62.92654-95.61556,10.52526-12.23982,31.14661-34.86908,61.2921-58.84038,9.64983-7.67344,38.4856-29.96469,80.90552-51.48539,22.05132-11.1872,51.56428-25.93371,93.16395-35.95802,48.37923-11.65801,87.00502-10.63967,111.96016-9.80671,53.5127,1.78612,92.95337,12.20149,102.15344,14.71009,11.01367,3.00312,56.75511,15.96123,109.50854,47.39922,36.39113,21.68705,59.94968,42.53205,65.37815,47.39922,28.19298,25.27762,17.50998,23.17864,47.39928,50.66806,10.6763,9.8191,20.62214,17.98058,22.88231,31.87185.35555,2.18553,1.87729,12.84918-5.72055,27.78575-15.57506,30.61891-51.42712,43.71859-73.55047,51.48539-35.03431,12.29937-64.49223.43193-76.04678,15.38593-9.36009,12.11393-6.74513,41.02714-3.00533,56.34989,4.9886,20.43936,30.00089,19.70947,30.01839,35.32095.03488,31.121-22.34591,45.09289-37.53171,50.95869-17.15644,6.62698-19.48571,3.98681-28.22396-10.21897-6.13166-9.96823-7.83974-25.55176-18.81772-44.32393-4.23946-7.24941-4.24056-16.65054-40.70626-56.43131-29.08138-31.72514-47.99994-37.28377-51.65936-39.23314-31.56026-16.81214-65.00757-12.86788-81.01555-19.3273-11.5691-4.66828-19.47859-9.61271-21.68968-21.11034-11.86927-61.7202-26.86535-61.88138-37.13386-69.01132-9.75519-6.77352-23.11935-17.22371-32.65229-14.6362-3.11194.84467-9.89544,2.21658-11.78416,10.85472-6.68636,30.57999-11.17938,35.14457-13.07565,36.77518-5.66632,4.8725-12.73828,4.69355-17.97903,4.90333-20.79013.83221-49.49672,5.82868-63.74376,21.24797-11.89283,12.87129-3.49111,23.15663-15.52732,33.5063-11.78889,10.13701-29.31051,8.40581-48.21639,6.53788-30.16298-2.98021-37.37885-12.38581-50.66811-6.53788-12.93881,5.69376-10.19805,16.41386-25.33408,28.60297-18.55181,14.93987-47.893,19.14825-54.75427,9.80677Z" id="path13"/>
<path class="cls-3" d="M723.07847,145.60851c17.60269,9.8763,25.6773,16.46256,30.05325,20.28594,17.61928,15.39409,16.3808,21.90794,36.06397,39.82057,11.45716,10.42654,16.55315,12.47534,27.79925,24.79395,10.53159,11.53595,15.79696,17.45373,15.77803,24.79395-.04094,15.82662-22.27551,27.43094-33.05867,33.05867-17.99419,9.39124-34.44962,11.77124-47.33389,13.52392-31.93374,4.34384-38.78187-2.14279-54.8472,6.01061-3.67314,1.86421-21.46445,11.41431-27.04795,30.05336-3.8692,12.91627-.25093,24.77162,5.25931,42.82588,5.34682,17.51891,10.83175,24.35886,10.51862,39.82057-.05391,2.66251-.3648,18.01088-6.01061,19.53464-3.91429,1.05646-8.67907-4.99477-16.52933-15.77793-14.46778-19.87318-21.59747-31.34448-27.04795-39.06927-8.99486-12.74817-17.51699-20.77057-34.56126-36.81527-17.74241-16.7019-26.61361-25.05285-38.31787-31.55596-15.50212-8.61326-30.91943-13.95028-53.3446-18.78323-23.40042-5.04314-30.79552-6.16595-35.31256-13.52403-6.13065-9.98667-7.25957-17.59409-10.06013-38.79836-4.74771-35.94693-26.62108-17.97346-39.16859-31.87747-5.13313-5.68806-13.52855-14.65833-24.40182-21.73794-11.036-7.18562-25.89283-1.95225-29.30196-.75141-2.11647.74556-15.66501,5.7348-22.53994,18.78334-4.5205,8.57987-1.85023,12.47257-7.51331,21.03724-.87012,1.316-5.61524,8.30512-14.27533,12.77273-9.40565,4.85219-14.95768,2.35959-26.2966,3.7566-2.04263.25167-29.05166,3.92449-42.82593,22.53994-7.24659,9.79347-4.29791,14.89468-12.77262,22.53994-8.86642,7.99869-11.7854,10.62886-15.65209,12.15385-14.25332,5.62136-22.42054-6.70368-38.44381-9.14844-6.65941-1.01605-34.63432,18.65962-43.21753,27.95999-13.13111,14.22825-17.81767-.8566-16.88898-6.17145.36838-2.1082,3.71051-13.48554,13.52398-30.05325,16.62843-28.07315,33.05962-47.11315,34.56126-48.83649,40.57889-46.56866,86.90582-78.67868,89.40847-80.39255,19.09232-13.07533,51.6361-35.03085,99.92714-51.8419,14.92966-5.19732,53.15821-17.48972,104.43509-21.03729,16.04193-1.10988,64.65577-3.52896,125.47243,10.51862,0,0,60.49205,13.97262,123.96973,49.58794Z" id="path14"/>
<path class="cls-2" d="M719.84812,183.00039c10.10724,9.81155,19.95388,19.89508,30.24804,29.51025,20.67009,19.30667,26.01648,22.10369,25.82148,28.77245-.39691,13.57485-23.16035,22.84786-25.08379,23.6083-21.44106,8.47641-30.48632-3.14714-51.64296,4.42646-18.85957,6.75128-30.10684,22.58726-33.19902,27.29697-12.05822,18.36601-7.71884,31.44921-16.23056,34.67461-9.23484,3.4994-16.89148-10.93542-44.26543-27.29697-8.03335-4.80158-25.10846-14.84726-47.95419-20.65723-26.9681-6.85835-38.17156-1.76012-46.4786-11.8041-5.16138-6.24059-4.98669-16.04938-4.42656-35.4123,1.00244-34.6543,7.73203-36.68502,4.42656-53.11845-4.4641-22.19374-18.44065-26.95311-15.49287-42.78983,2.40478-12.91925,13.76741-20.82687,16.96835-22.87046,9.72341-6.20763,19.95654-6.71135,70.08691,2.95102,45.61172,8.79146,60.29088,13.67065,69.349,16.96835,26.47528,9.63866,37.49703,17.6229,40.57666,19.91943,4.44687,3.3161,5.1819,4.35341,27.29697,25.82148Z" id="path15"/>
<path class="cls-3" d="M559.75499,135.78399c-9.26929,2.16746-19.15016,4.47781-22.13271,11.8041-3.17776,7.8056,5.07398,12.46449,8.85313,29.51025,3.61264,16.2952.39362,31.53214-.7378,36.88778-3.12248,14.78006-7.50353,17.9036-5.16425,24.34599,3.01859,8.31331,13.3421,11.45344,27.29697,15.49287,27.79234,8.04484,36.13627,1.40616,53.85624,11.06641,9.60485,5.23624,11.08225,9.32851,16.96835,8.85302,12.37422-.99968,12.1521-19.59556,28.03476-27.29697,14.56687-7.06334,23.32569,4.42252,41.31435-3.68877,2.29898-1.03668,17.24299-8.02719,17.70615-18.44394.26018-5.85271-4.2002-9.42941-18.44394-22.13271-26.10452-23.28146-22.05212-21.01533-36.14999-32.46122-13.83216-11.23015-20.74824-16.84523-28.03476-20.65723-13.74551-7.19115-25.34673-9.43218-37.62558-11.8041-14.91945-2.88207-28.84805-5.4255-45.74091-1.47549Z" id="path16"/>
<path class="cls-3" d="M633.19959,181.37583c-4.42242-2.21732-30.33013-15.20685-40.57655-5.90205-3.82253,3.47122-1.15598,6.13193-4.42656,25.82148-2.49132,14.99824-5.20455,20.47424-4.42656,32.46122.50494,7.7803.75747,11.67034,3.68877,14.75518,5.61189,5.90577,13.18889,1.21605,30.24804,4.42656,14.3992,2.70993,15.22822,7.22304,22.8704,5.90205,11.29288-1.95215,11.34307-12.12871,23.6082-17.70615,16.55932-7.53011,32.44495,3.75426,35.4123-1.47559,3.44326-6.06866-16.61801-23.60682-19.18163-25.82137-4.82869-4.17128-6.63453-4.99211-22.13271-15.49297-21.78226-14.75869-20.41353-14.62684-25.08368-16.96835Z" id="path17"/>
<path class="cls-3" d="M168.15078,268.695c16.21339-20.91914,30.81061-34.0004,36.74344-38.47822,76.11506-57.44762,70.28239-59.4004,104.02366-78.20213,13.18161-7.34521,2.94427-.84657,64.92255-30.24804,9.67418-4.58924,27.90605-13.2782,53.11839-16.96841,22.41852-3.28133,29.24465.47969,32.46133,4.42656,6.01178,7.37668,2.61137,19.32422,2.21328,20.65717-4.54374,15.21429-19.04873,16.77112-19.18163,26.55917-.14099,10.38061,16.10701,13.50308,15.49287,22.87051-.56278,8.58402-14.9858,17.84299-27.29697,16.23066-11.80293-1.54577-12.92291-11.93903-28.77256-19.18174-3.95373-1.80669-16.16942-6.77392-29.51025-4.42646-5.01051.88166-13.62296,3.40105-42.78983,33.19902-20.96185,21.41544-20.07913,23.75705-28.03476,27.29697-18.08286,8.04611-19.69235-.2474-35.12865,9.49515-6.80938,4.2977-27.35639-2.44914-29.05615,21.49059-1.4929,21.02614-7.75027,22.28504-11.256,22.28589-9.3115.00213-25.15518.3344-33.77705.94482-12.76332.90366-25.67651,9.56664-28.89575,8.06329-2.01684-.94184-2.50702-16.68495,4.72408-26.0148Z" id="path18"/>
<path class="cls-3" d="M404.82616,132.09522c-14.53343,9.36721-22.82894,5.94596-41.31435,11.0663-15.10967,4.18531-14.26608,7.77264-51.64291,30.98584-29.27484,18.18143-31.86611,17.26872-59.75829,35.4123-27.84221,18.11114-14.20739,11.83079-37.62558,27.29697-14.37703,9.49512-22.72915,13.98421-22.13266,19.91943.58575,5.82826,9.65185,11.57167,16.96841,10.32851,8.32182-1.41392,8.58338-10.88108,19.18163-22.13261,13.12924-13.93859,30.54204-18.32199,36.88784-19.91943,17.19695-4.32906,21.18046.82977,33.19902-5.16436,4.15373-2.07166,5.67138-3.68207,21.39492-19.91943,22.15143-22.87529,23.90315-24.59863,28.03476-27.29697,5.64644-3.6877,17.42306-11.37911,33.19902-11.8041,11.40554-.30728,20.04054,8.50268,33.84473,13.34573,11.42212,4.00732,25.82497,12.59755,22.96253,1.40945-.4805-1.87809-7.12522-5.69386-10.32861-15.49287-.45263-1.38447-3.23709-10.31894.7378-18.44394,5.39381-11.02531,18.84405-11.58698,18.44384-16.23066-.31334-3.6364-8.88364-7.02969-16.96835-6.63979-10.66046.51414-15.94178,7.38737-25.08374,13.27964Z" id="path19"/>
<path class="cls-3" d="M479.6728,105.87794c-5.54012,7.12432-.14886,13.1933-6.53873,26.15508-5.26558,10.68119-11.51117,11.80293-11.44291,18.79907.0823,8.43027,9.177,9.47705,10.62558,18.79897,1.66836,10.73616-9.61591,14.36262-8.99082,26.15502.49973,9.42793,7.81847,9.10767,13.07746,22.88571,5.65899,14.82588,1.01563,25.23328,7.35616,28.60722,3.35831,1.78702,8.04494.66805,10.62548-1.63476,4.99445-4.45687,2.77117-13.94763,1.63476-18.79897-3.27388-13.97581-9.77412-14.27458-12.26024-26.97246-.66369-3.38989-2.25262-11.50564.81733-20.43362,2.57766-7.49609,6.17318-8.97349,5.72151-13.89489-.66156-7.20826-8.76477-8.28545-10.62558-15.52966-.77086-3.00105-.66688-7.82517,8.17349-19.6163,14.95677-19.94904,28.32897-24.37263,26.97246-28.60717-1.72439-5.38275-26.25189-7.35053-35.14595,4.08675Z" id="path20"/>
<path class="cls-2" d="M234.36725,443.44644c-7.43267,1.31281-16.48308-.14949-34.58396-3.0742-28.70371-4.63794-33.03565-8.45228-43.80631-5.37967-12.32967,3.51726-19.85303,12.28129-23.82447,16.90764-13.13913,15.30584-15.17171,32.8307-16.13922,42.26926-2.06342,20.12911,2.95134,35.98072,13.06507,66.86236,8.32937,25.43328,16.26548,42.11998,27.66714,66.09373.93253,1.96076,9.91027,20.63203,25.36157,43.03779,15.12934,21.93888,20.68859,24.58066,24.59304,23.82447,1.94428-.37661,5.64676-2.01573,13.06502-23.82447,7.10529-20.8887,5.46872-24.5595,10.75945-39.19516,3.97638-10.99974,8.70135-24.0704,19.98184-36.12096,12.44046-13.28969,22.00661-13.75093,23.05599-22.28742,1.15725-9.41378-10.11437-11.79602-17.67627-26.89867-8.86998-17.71519-6.61975-40.9169.76852-56.87133,6.56212-14.17038,14.13142-16.04597,16.90775-30.74129.17475-.92504,3.83954-21.33367-4.6112-26.13014-7.23389-4.10578-14.86028,8.0442-34.58396,11.52808Z" id="path21"/>
<path class="cls-3" d="M859.32528,524.27426c-4.18012,5.79947-5.00143,8.84072-7.57981,15.54527-2.45635,6.38757-1.39794,10.07463-2.2375,14.16521-.7498,3.6532-1.55811,9.62045,1.47411,11.84013,3.63994,2.66466,11.64056-.7147,15.76195-6.00453,3.808-4.8876,1.32209-7.57883,4.50357-18.76424,2.88949-10.15846,6.20393-12.3827,5.25397-18.7643-.54779-3.68004-5.10982-4.98844-8.58867-4.75915-4.47575.29503-7.26821,4.91102-8.58763,6.74161Z" id="path22"/>
<path class="cls-3" d="M578.5331,719.02427c-1.01478,1.88638-2.34768,5.79543,2.35874,18.19573,3.83986,10.11724,5.49939,9.54956,7.7501,16.51094,2.0219,6.2537,4.94331,15.28984,1.01095,22.91312-2.80233,5.43267-7.39497,6.87079-8.424,13.47831-.09633.619-.48676,3.37208.33684,6.73915,1.36501,5.58065,4.85655,7.9072,7.41305,11.45657,3.35522,4.65817,3.58467,9.39534,4.04358,18.86965.7413,15.30549-3.99764,21.35994,0,25.94575,1.97235,2.26262,5.27207,3.25055,12.13052,3.03263,16.0044-.5085,27.18033-6.81382,48.18503-17.18486,22.38928-11.05458,19.31688-8.64313,28.64125-13.81528,3.97-2.20209,14.60643-8.79877,35.71767-21.90225,16.82885-10.44552,18.13815-11.29363,21.9023-12.46744,9.09023-2.83473,17.42768-2.86979,19.20651-7.75002.84423-2.31613.12717-5.24054-1.34779-7.07613-2.14842-2.67389-5.83942-2.94624-8.08694-3.0326-9.90724-.3807-14.86076-.57105-23.9242,2.69566-12.11074,4.36503-26.94343,2.6854-56.60881-.67392-14.61047-1.65449-23.51293-2.73226-34.70672-7.41307-8.6543-3.61883-15.46937-8.04957-21.2282-11.79352-6.99731-4.54908-10.54881-6.89604-13.14147-10.4457-3.27356-4.48183-4.89929-9.4552-8.08694-19.20659-2.59095-7.92589-3.17723-11.52467-5.72821-12.13047-2.60137-.61775-5.87855,2.20137-7.41326,5.05437Z" id="path23"/>
<path class="cls-3" d="M559.11303,698.07222c1.35432,6.09439,3.10842,8.16724,6.99732,22.34622,2.75747,10.05382,4.80458,9.79691,7.21844,16.9723,5.20738,15.47884,7.38319,16.40778,8.16304,24.48911.56373,5.84317,1.49676,15.51202-4.89783,22.04024-4.26996,4.35907-11.44241,1.46008-13.46903,5.7141-1.2396,2.60217.16673,5.62615.40815,6.12228,1.8091,3.71718,5.53446,3.82304,8.97935,6.12228,4.46896,2.98266,5.83644,8.65482,8.5712,19.99934,1.13621,4.71309,2.58915,10.92128,2.44891,19.18319-.11992,7.0675-.20537,12.09513-2.44891,18.36683-1.56826,4.3839-3.28195,6.83481-2.04076,8.97933,1.81328,3.1331,8.19711,2.61255,10.20381,2.44887,5.16536-.42121,7.63519-2.26239,13.46904-4.48956,4.82552-1.8424,7.07802-2.08772,13.46903-3.67341,11.69638-2.90204,24.79172-7.20085,31.83568-9.79568,13.63397-5.02233,22.77686-10.35757,39.99894-20.40752,12.19536-7.11656,10.49603-6.88265,26.5299-16.32614,16.28466-9.59129,24.42699-14.38683,28.16252-16.32594,1.93877-1.0065,7.88277-4.06632,15.10143-8.97933.6209-.42284,5.21853-3.57874,10.61197-8.57135,6.14062-5.68397,6.98879-7.89424,7.34674-9.38751.76093-3.17443.44521-7.858-2.4489-10.20366-2.36405-1.9161-5.47451-1.48288-9.79566-.81636-10.44564,1.61114-15.66835,2.4165-19.59111,3.26523-3.40007.73554-10.88428.63639-25.71359.40818-11.62908-.17915-18.6605-.28725-28.97884-.81636-3.27179-.16775-15.02873-.79722-29.79512-2.85705-9.05645-1.26342-12.30394-2.09668-15.91795-4.08159-5.70676-3.13433-6.37506-5.87106-12.65253-8.57115-5.23327-2.25079-6.44418-1.06941-12.65272-3.26523-4.53748-1.60483-9.79983-3.05523-13.06088-7.34668-5.51637-7.25957-1.43688-13.64263-8.5712-22.04015-2.35559-2.77273-4.77571-4.48286-9.79565-7.75501-9.62096-6.27089-13.15649-5.14102-16.73425-10.20366-2.67321-3.78273-2.43039-6.86311-6.12228-8.97933-2.43896-1.39819-5.80955-1.92506-6.53044-.81636-.69301,1.06574,1.40665,7.92152,1.70218,9.25151Z" id="path24"/>
<path class="cls-2" d="M840.0847,772.27969c.35075,10.88924-8.91529,18.53827-31.62988,35.97141-39.9656,30.67327-59.94843,46.00979-74.42326,54.57705-29.46033,17.43683-54.3158,28.27109-66.98095,33.49033-85.39676,35.19162-99.43162,38.48442-109.77431,31.62997-9.13362-6.05315-13.27118-16.5851-16.74523-25.42794-7.63617-19.43738-5.55641-39.26943-4.34136-50.85588,1.60753-15.32892,3.93824-15.09507,2.48077-21.08672-4.2919-17.64416-24.18395-18.36245-29.14911-35.97119-2.46308-8.73526,10.5729-16.40733,14.09145-26.61046,7.01396-20.33909,10.08243-18.66855,13.25398-34.52668,1.21737-6.08706,8.16697-8.92457.46224-25.16253-5.90525-12.44548-12.63417-56.68845-7.63516-55.79974,16.33519,2.90403,35.48157,1.03297,45.64568-4.92972,3.97479-2.33178,16.39754,28.83936,25.5588,39.97658,11.14101,13.54398,23.67791,21.61959,32.98107,26.32978,14.0319,7.10436,27.09095,16.47722,43.10797,16.7646,13.01806.23357,9.24701-.66643,43.81598,3.66059,47.54928,5.95177,46.24736-4.28906,61.52358-4.65549,27.99195-.67134,29.65456,6.01621,34.26388,8.28948,10.61041,5.23294,23.04459,20.38856,23.49387,34.33654Z" id="path25"/>
<path class="cls-3" d="M557.37253,672.21972c3.72177-.27949,6.59725,2.45081,11.9627,7.54547,2.25347,2.1397,1.75045,2.00462,7.15639,7.87207,3.48336,3.78072,5.86201,6.35171,9.06473,9.30326,2.46211,2.26901,3.81604,3.29281,7.39491,6.20224,8.85941,7.20219,9.50445,8.19747,13.35858,11.21166,5.41055,4.23147,10.12733,6.79676,19.56082,11.92728,9.25756,5.03484,16.78907,8.40475,20.51497,10.01893,6.27489,2.71851,13.34326,5.7541,22.90041,8.58769,2.48248.73605,9.95667,2.88862,20.99207,4.77089,12.24991,2.08938,31.97612,5.45402,55.94315,2.78822,5.58877-.62163,14.00748-1.86026,26.4124-1.98093,11.88153-.11557,16.39847.90171,20.4696,3.63169.958.64244,8.65099,5.97861,9.90467,15.51729,1.07129,8.1509-3.21544,14.37765-6.27293,18.81885-1.27868,1.85733-4.83158,6.68874-19.47916,16.50773-5.99083,4.01598-8.29961,5.15388-16.1776,9.90467-29.20426,17.61156-31.52353,22.50606-42.25988,23.44103-4.05989.35355-8.02002.02738-13.53636,2.31106-6.99013,2.89379-10.80345,7.6286-13.20623,10.2348-6.6286,7.18975-9.62502,5.88385-40.27889,20.79978-19.39016,9.43512-16.90409,9.33135-26.4124,13.20623-12.73,5.18784-21.19728,7.00849-34.66632,9.90462-19.96881,4.29374-24.17387,3.01832-26.74253.66031-3.00055-2.75453-3.43103-7.00877-4.29205-15.51729-.27748-2.74187-.57327-7.11841.66031-23.11085.45254-5.86668.98838-11.70848,1.32062-20.4696.31584-8.32792.12247-10.7175-.99044-13.53636-1.22266-3.09688-2.41761-3.8306-9.57449-11.88561-8.76427-9.86414-9.48701-11.59416-9.90467-12.87605-2.4338-7.46995.68221-14.4861,1.32062-15.84742,2.39647-5.11015,5.06413-5.5603,8.25387-9.90467,4.19115-5.70835,4.50824-11.63594,4.95231-22.78072.14545-3.64983.42603-14.81101-2.31106-30.04409-4.02571-22.40468-4.62213-24.76149-4.62218-24.76165-1.28036-5.05951-2.59772-9.39774-.66031-14.19667,1.40223-3.47336,4.80517-7.92048,9.24436-8.25387Z" id="path26"/>
<path class="cls-3" d="M837.81255,706.68556c-5.40456.5618-10.86874.22456-16.29066.58179-2.64192.17406-5.05866.37464-6.98172-1.16361-2.18354-1.74659-2.20992-4.51851-2.90904-8.72716-.00001-.00005-.74745-4.49961-3.49086-12.79979-2.33242-7.05672-6.55986-11.55006-10.47258-15.70887-2.82834-3.00621-9.54555-9.9923-20.36333-13.96342-7.21588-2.6489-8.0533-.94505-18.61791-3.49087-6.7158-1.61833-12.32603-4.00995-23.27237-8.72713-12.11736-5.2218-20.75453-9.65121-25.59962-12.218-17.51731-9.28017-20.42799-12.73489-22.10876-15.12704-1.39162-1.98063-6.14331-8.93859-5.81809-18.0361.15821-4.42554,1.39093-5.80839,4.65447-14.54524,4.11793-11.02414,6.6636-17.83916,7.56353-26.18142,1.24138-11.50757-1.42285-18.74587,1.16362-19.78153,2.22634-.89145,4.19209,4.47484,11.63619,8.14534,8.25171,4.06872,16.46018,2.71328,18.6179,2.32724,3.34187-.5979,7.72688-1.38244,11.63618-4.65447,5.54681-4.6426,4.14822-9.28146,10.47258-22.10876,3.37677-6.84888,5.12675-10.30058,8.14533-11.63619,6.79834-3.00802,12.26195,4.1433,19.78153,1.74543,3.70224-1.18058,6.20332-5.26366,11.05437-13.38162,10.16776-17.01519,15.26078-25.55922,15.70885-27.34504,3.25291-12.96475.05767-24.38908-1.74542-30.8359-2.73654-9.78431-8.07065-20.7311-9.30895-23.27238-5.44033-11.16478-8.63232-14.74171-6.98172-18.6179,1.94727-4.57292,8.54183-4.64818,18.61791-6.98171,14.26509-3.30368,24.40999-7.80629,35.49038-14.54524,21.2388-12.91716,22.0483-23.70481,47.23815-33.94273,0,0,16.77732-7.02955,27.35584,4.12598,9.32585,9.83454,15.04091,26.39493,18.73197,40.02639,1.41428,5.22308,2.52882,10.53828,3.87112,15.81686,7.01356,27.58076-2.90654,32.25853-1.35144,48.15416,1.65768,16.94416,8.71169,12.02049,9.7215,32.21659.67824,13.56488,1.10236,30.27708,1.02982,33.58519-1.02174,46.59814-9.11104,88.21851-23.349,128.64393-4.67149,13.26363-13.93266,29.8308-24.05575,40.11366-18.17689,18.46377-54.63161,21.77501-59.77402,22.30956Z" id="path27"/>
<path class="cls-3" d="M865.34426,528.26058c-.7573.29411-2.28982,1.05645-3.92856,3.70188-.68052,1.09862-1.58006,2.84586-2.71976,9.67028-.92703,5.55079-.66721,6.40246-.07552,6.95047,1.27531,1.1812,4.05136.9135,5.36394-.4533.95094-.99022.45781-1.85352,1.13328-4.98621.27281-1.26526.7868-3.64891,2.19088-6.04392,1.43874-2.45418,2.38686-2.48906,2.79533-4.30629.30774-1.36914.29008-3.66521-1.13323-4.60843-1.26808-.84037-2.99322-.17039-3.62636.07552Z" id="path28"/>
</g>
<g id="g40">
<path class="cls-5" d="M201.17133,345.19751c.63027.0478,10.08517.42995,10.76447.47379,10.42732.67297,17.04385.21299,19.6253,0,7.06261-.5827,12.29471-1.65719,13.73772-1.96254,6.19521-1.31095,11.56308-3.36467,20.27949-6.54177,6.18339-2.25382,7.79274-3.0222,11.121-3.27089,1.11416-.08324,5.65981-.35029,12.42934,1.96254,4.94954,1.69101,7.57215,3.55997,17.66277,10.46683,12.14738,8.31466,7.95748,5.33973,14.39191,9.81266,7.9869,5.55215,9.05813,6.39279,17.66277,12.42934q16.08673,11.28558,20.27946,14.39189c6.623,4.90685,5.0296,5.01813,15.04609,13.73772,12.8523,11.18818,15.04592,13.08344,15.04606,13.08354,8.95292,7.73504,10.97259,9.41554,11.121,12.42934.1241,2.52035-1.15735,4.00509-7.85012,12.42937-9.67919,12.18335-7.24631,9.38929-9.81266,12.42937-8.24275,9.76436-8.89646,9.63181-15.04606,17.00857-4.03177,4.83631-8.37927,10.09076-13.08354,17.6628-3.1397,5.05369-5.27975,8.49836-7.19594,13.73772-1.74942,4.78333-3.98721,10.90201-3.27089,18.97109.28845,3.24918,1.04059,10.60117,6.54177,17.6628,5.40613,6.9396,12.26406,9.57514,15.04606,10.4668,3.36725,1.07927,13.06105,4.18632,18.97114-.65417,2.06504-1.69134,5.06438-4.5476,7.14852-11.24716,3.90311-12.54668,4.41449-14.04395,6.41004-17.91217,3.70531-7.18246,12.96604-7.46674,14.31766-7.51548,2.77251-.09992,8.55247.9506,12.0414,4.52013,2.85266,2.91856,2.0993,6.28321,1.7373,14.37767-.54722,12.23567-2.7628,21.07607-3.05848,23.66461-1.25795,11.01318-2.06678,18.0941-1.30837,26.82126.68549,7.88815,2.85564,14.85339,7.19594,28.78377,3.5579,11.41926,5.33685,17.12892,8.50431,24.20457,7.32944,16.37293,13.85912,22.72915,11.121,26.82121-1.88582,2.81832-5.54813.64765-15.04606,3.27091-3.18118.87862-11.39411,3.24206-18.31697,9.81263-5.65057,5.36301-7.90559,11.1219-10.46683,17.6628-3.10332,7.92526-.42692,5.71884-4.57923,22.242-.63116,2.51161-1.27439,4.87597,0,6.54177,1.94812,2.54649,6.91412,1.54757,13.08354.65417,6.72132-.97327,13.55499-1.01152,20.27949-1.96252,6.63183-.9379,18.74778-2.65141,32.05463-2.61674,6.4869.0169,13.04698.66547,26.16709,1.96257,20.79598,2.05597,16.80188,2.22169,20.93366,2.61669,2.8919.27646,6.85713,2.16344,9.48268,2.99664,3.68492,1.16939,2.02125,6.73264.41263,14.25858-1.60906,7.52797-2.30034,8.65128-5.31605,15.45364-1.37995,3.11275-4.67662,9.7621-11.12103,16.3544-3.35279,3.42973-3.91938,3.12231-18.97109,14.39189-7.902,5.9164-10.32418,7.93162-11.7752,11.7752-2.07949,5.50825-.64292,10.7414,0,13.08354,2.17833,7.93542,7.59051,12.82492,13.08354,17.66275,5.6751,4.99822,6.70934,4.24467,15.04606,11.12103,4.76725,3.93215,7.40616,6.10879,10.4668,9.81263,2.14127,2.59126,6.61268,8.10771,9.15851,16.3544.51263,1.66064,1.26933,4.47537,1.96252,13.73772.568,7.58997.62336,13.22883.65417,21.58783.04222,11.45002-.01695,12.99987,0,28.1296.00609,5.44049.01853,9.52363,0,16.3544-.01445,5.31976-.04059,9.70326-.06123,12.65801" id="path29"/>
<path class="cls-5" d="M67.91583,372.36572c3.60309.65398,7.79212,1.2198,13.83878,1.43518,7.76664.27664,13.52855-.40288,20.93366-1.30837,6.43825-.78726,13.55433-1.65741,22.89619-3.92506,13.19866-3.20387,26.03626-12.34791,32.40533-16.70057" id="path30"/>
<g id="g36">
<path class="cls-7" d="M168.5237,341.59945c2.11066,0,3.8218,1.7488,3.8218,3.9059s-1.71114,3.9059-3.8218,3.9059-3.8218-1.7488-3.8218-3.9059,1.71114-3.9059,3.8218-3.9059" id="path31"/>
<path class="cls-7" d="M184.44131,333.03364c2.11066,0,3.8218,1.7488,3.8218,3.9059s-1.71114,3.9059-3.8218,3.9059-3.8218-1.7488-3.8218-3.9059,1.71114-3.9059,3.8218-3.9059" id="path32"/>
<path class="cls-7" d="M177.14346,355.55801c-2.75252-.60195-5.05412-2.40028-6.34666-4.94767-1.01934.47435-2.165.61846-3.26807.41131,1.56573,3.92841,4.88521,6.78203,8.95817,7.67369.89303.19514,1.80662.29122,2.71433.28521-.70208-.9427-1.09278-2.08054-1.11922-3.26492-.31432-.03603-.62864-.08857-.93709-.15612l-.00147-.0015Z" id="path33"/>
<path class="cls-7" d="M183.57986,351.67342c2.11066,0,3.8218,1.7488,3.8218,3.9059s-1.71114,3.9059-3.8218,3.9059-3.8218-1.7488-3.8218-3.9059,1.71114-3.9059,3.8218-3.9059" id="path34"/>
<path class="cls-7" d="M188.89748,354.14411c1.18825-1.53114,2.02547-3.33998,2.42938-5.26591.70355-3.35349.047-6.8736-1.80221-9.72872-.44064,1.05979-1.18679,1.95745-2.15031,2.57291,1.0311,1.98597,1.34688,4.27817.88422,6.48481-.2262,1.0793-.62571,2.09705-1.18972,3.02625.90037.75356,1.53489,1.76831,1.83012,2.91066h-.00147Z" id="path35"/>
<path class="cls-7" d="M168.22818,339.90304c.09694-.006.19388-.0075.29082-.0075.38629,0,.77259.04203,1.15447.12609.62277.1351,1.20882.37828,1.74493.71753,1.72143-2.52938,4.49598-4.0485,7.50553-4.10404.01469-.29422.05288-.58994.11457-.87815.17626-.83762.53464-1.6182,1.04431-2.28769-4.80589-.38879-9.47666,2.14509-11.85463,6.43377" id="path36"/>
</g>
<g id="g39">
<circle class="cls-6" cx="380.53859" cy="309.92882" r="4.80423" id="circle36"/>
<g id="g38">
<path class="cls-6" d="M786.30787,702.2251c-20.17895,9.3196-43.50762,14.64061-68.36227,14.64061-65.54381,0-120.45194-35.73748-135.82966-84.19466l-.15996-.07919c-10.60135,4.52287-22.00107,7.53054-33.92508,8.77698-4.08486.42706-8.22806.65823-12.42609.65823-8.01729,0-15.84652-.80229-23.41604-2.32306l13.34445,59.39506c-37.5856-6.89363-66.50803-8.85923-111.92789,0,1.40124-12.77979,9.75471-25.64409,22.00675-32.11908,5.38019-2.84327,11.50866-4.46023,18.01747-4.46023,7.82325,0,15.09814,2.33292,21.18107,6.33082,0,0-77.90295-130.03187-14.92269-199.41908,17.86412-18.83775,43.89268-28.96614,71.23816-23.40244" id="path37"/>
<path class="cls-6" d="M786.07708,701.72539c-175.45999-24.71867-135.59189-138.22391-135.59189-138.22391,32.60041-105.24443-57.87581-219.95483-171.28136-231.18023,0,0-20.24328-1.31034-35.50377-17.92732-11.45829-12.4768-14.85661-22.53321-16.1697-41.55279-1.57768-22.85213-18.62497-28.61447-20.14435-29.42112-.7918-.4204-1.77491-.11073-2.16754.69514-.7475,1.53446-20.27905,41.67406-20.27905,41.67406l-66.55734,24.50974c-3.38775,1.24754-5.49482,4.63698-5.11438,8.22684l1.76412,16.64509c.13678,1.2906.90359,2.42573,2.04491,3.04374,40.49223,21.92593,76.23487,51.49969,105.29299,86.78713l.3556.2914.0031.00256-.05607.0694-26.23272,32.47251-22.41698,27.74918c-4.34772,5.25258-6.8135,9.45353-7.85717,15.37216-1.8439,10.45657,3.37505,20.51928,12.22586,25.31181,1.62559.88025,3.37308,1.58214,5.2225,2.07599.89048.2378,1.7951-.34853,1.95517-1.2561l4.97895-28.23536,73.4583-33.46954" id="path38"/>
</g>
</g>
</g>
<circle class="cls-1" cx="500.00001" cy="500" r="449.99999" id="circle40"/>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 KiB

After

Width:  |  Height:  |  Size: 372 KiB

-38
View File
@@ -1,38 +0,0 @@
<!DOCTYPE html>
<head>
<title>Valentin Haudiquet</title>
<meta charset="utf-8">
<link rel="stylesheet" href="/stylesheets/style.css">
<link rel="icon" type="image/png" href="/assets/favicon.ico_256x256.png">
<!-- Inter font -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Header -->
<div id="header-div">
<img src="/assets/photo_web.JPG" id="header-img"/>
<div id="header-text-container">
<h1>Valentin Haudiquet</h1>
<h4>Software Engineer at Canonical - Ubuntu</h4>
<p id="header-paragraph">Working on Ubuntu support for RISC-V architecture</p>
</div>
</div>
<!--About -->
<div style="display: flex; flex-direction: column; width: fit-content; margin: auto; margin-top: 100px; margin-bottom: 100px;">
<h2>About</h2>
<p style="max-width: 1200px;">
Hello! I'm Valentin Haudiquet, and this is my personal website. I'm a French computer science student and developer.
You can find a link to my blog on the main page, but also my different Git repositories, contact information and my CV.
</p>
</div>
</body>
-164
View File
@@ -1,164 +0,0 @@
<!DOCTYPE html>
<head>
<title>Valentin HAUDIQUET</title>
<meta charset="utf-8">
<!-- <meta name="viewport" content="width=device-width, initial-scale=1" /> -->
<link rel="stylesheet" href="/stylesheets/style.css">
<link rel="icon" type="image/png" href="/assets/favicon.ico_256x256.png">
<!-- Inter font -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Header -->
<div id="header-div">
<img src="/assets/photo_web.JPG" id="header-img"/>
<div id="header-text-container">
<h1>Valentin Haudiquet</h1>
<h4>Software Engineer at Canonical - Ubuntu</h4>
<p id="header-paragraph">Working on Ubuntu support for RISC-V architecture</p>
</div>
</div>
<!-- CV -->
<div style="display: flex; flex-direction: column; width: fit-content; margin: auto; margin-top: 100px; margin-bottom: 200px;">
<!-- Professional experience -->
<div style="margin-top: 50px;">
<h2 style="margin-bottom: 20px;">Professional experience</h2>
<div class="cv-section">
<p class="date">2025 - Now</p>
<p style="max-width: 1015px;"><strong>Sofware engineer</strong>, Canonical, Ubuntu engineering</p>
<p class="subtext" style="grid-column: 2; max-width: 1015px;">Working on Ubuntu support for RISC-V architecture</p>
<p class="date">2025</p>
<p style="max-width: 1015px;"><strong>Master's internship</strong>, ONERA, “Probabilistic analysis of execution time on multi/manycore heterogeneous boards for optimal task mapping”</p>
<p class="subtext" style="grid-column: 2; max-width: 1015px;">Real-time multicore optimal task mapping using a solver that automatically measures a pWCET for a solution on target platform</p>
<p class="date">Summer 2023</p>
<p style="max-width: 1015px;"><strong>Master's internship</strong>, Huawei Research Zurich, “Improving performances of virtualized servers by removing the guest kernel/user isolation layer”</p>
<p class="subtext" style="grid-column: 2;">Working on a Linux kernel patch to allow programs to run in kernel mode</p>
<p class="date">2022 - 2023</p>
<p style="max-width: 1015px;"><strong>Master's research project</strong>, IRISA (Rennes), “Transparent use of node-local storage for asynchronous I/O on supercomputers”</p>
<p class="subtext" style="grid-column: 2;">Library replacing MPI-IO calls, caching data locally, with neighbour communication</p>
<p class="date">Summer 2022</p>
<p style="max-width: 1015px;"><strong>Bachelor's internship</strong>, IRIT (Toulouse), “Reducing traffic in data centers by avoiding the transition of data through intermediate servers”</p>
<p class="subtext" style="grid-column: 2;">Library replacing read/write, using memory protection to provide data on-demand</p>
</div>
</div>
<!-- Education -->
<div>
<h2 style="margin-bottom: 20px;">Education</h2>
<div class="cv-section">
<p class="date">2024 - 2025</p>
<p><strong>M2 SIF</strong>, ENS Rennes, Second year of CS Master's Degree (Research)</p>
<p class="date">2023 - 2024</p>
<p><strong>Agrégation</strong>, ENS Rennes, Preparation for national competitive exam</p>
<p class="subtext" style="grid-column: 2;">'Agrégé' in computer science, rank 14/22</p>
<p class="date">2022 - 2023</p>
<p><strong>M1 SIF</strong>, ENS Rennes, First year of CS Master's Degree (Research)</p>
<p class="date">2021 - 2022</p>
<p><strong>L3 SIF</strong>, ENS Rennes, Last year of CS Bachelor's Degree</p>
<p class="date">2018 - 2021</p>
<p style="max-width: 1015px;"><strong>Prépa</strong>, Lycée Bellevue Toulouse, two-year intensive program preparing
for the national competitive exams for entry to engineering schools.</p>
<p class="subtext" style="grid-column: 2;">Prépa MPSI/MP, entry to ENS Rennes</p>
</div>
</div>
<!-- Personal projects -->
<div style="margin-top: 50px;">
<h2 style="margin-bottom: 20px;">Personal projects</h2>
<div class="cv-section">
<p class="date">2023 - 2024</p>
<p style="max-width: 1015px;"><a href="https://git.vhaudiquet.fr/vhaudiquet/vriscv/" target="_blank" rel="noopener noreferrer"><strong>RISC-V simulator</strong></a></p>
<p class="subtext" style="grid-column: 2;">Basic RISC-V processor simulator, capable of running BBL and booting Linux</p>
<p class="date">2022 - 2023</p>
<p style="max-width: 1015px;"><strong>Java Virtual Machine implementation</strong>, school project</p>
<p class="subtext" style="grid-column: 2;">Basic C JVM for GNU/Linux, Java 8 specs, using OpenJRE runtime</p>
<p class="date">2018 - ?</p>
<p style="max-width: 1015px;"><a href="https://github.com/vhaudiquet/BladePlayer/" target="_blank" rel="noopener noreferrer"><strong>Blade Player</strong></a>, Android multi-source music player</p>
<p class="subtext" style="grid-column: 2;">Maintaining for 100+ users this Android application that plays music from Spotify or Deezer</p>
<p class="date">2018 - 2020</p>
<p style="max-width: 1015px;"><a href="https://github.com/vhaudiquet/vk/" target="_blank" rel="noopener noreferrer"><strong>Operating system kernel development</strong></a>,x86 architecture</p>
<p class="subtext" style="grid-column: 2;">Basic operating system kernel, with drivers, filesystem, Newlib ported, dash shell</p>
</div>
</div>
<!-- Skills -->
<div style="margin-top: 50px;">
<h2 style="margin-bottom: 20px;">Skills</h2>
<div class="cv-section">
<p style="margin-left: 10px; font-weight: 500; grid-column: 1;">Programming languages</p>
<p style="max-width: 900px; grid-column: 2;">C, Assembly (x86, RISC-V, ARM), Java, TypeScript/JavaScript, Kotlin, Python, OCaml</p>
<p style="margin-left: 10px; font-weight: 500;">DevOps / Workflow</p>
<p>Linux, Bash, Git, CI/CD, Docker, Kubernetes, virtual machines</p>
<p style="margin-left: 10px; font-weight: 500;">Presentation tools</p>
<p>LaTeX, Figma, HTML/CSS, Inkscape, Gimp</p>
<p style="margin-left: 10px; font-weight: 500;">Spoken languages</p>
<p>French (native), English (fluent), Spanish (basic)</p>
</div>
</div>
<!-- Contact -->
<div style="margin-top: 50px;">
<h2 style="margin-bottom: 20px;">Contact</h2>
<div class="cv-section">
<p style="margin-left: 10px; font-weight: 500; grid-column: 1;">E-Mail</p>
<a href="mailto:valentin.haudiquet@ens-rennes.fr" style="grid-column: 2;"><p style="grid-column: 2;">valentin.haudiquet@ens-rennes.fr</p></a>
<p style="margin-left: 10px; font-weight: 500;">Website</p>
<a href="https://vhaudiquet.fr" target="_blank" rel="noopener noreferrer"><p>https://vhaudiquet.fr</p></a>
<p style="margin-left: 10px; font-weight: 500;">Phone number</p>
<p>+33 7 87 18 09 65</p>
<p style="margin-left: 10px; font-weight: 500;">Street address</p>
<p>30 rue Achille Viadieu, 31400 Toulouse, France</p>
<p style="margin-left: 10px; font-weight: 500;">GitHub</p>
<a href="https://github.com/vhaudiquet/" target="_blank" rel="noopener noreferrer"><p>vhaudiquet</p></a>
</div>
</div>
</div>
</body>
-78
View File
@@ -1,78 +0,0 @@
<!DOCTYPE html>
<head>
<title>Valentin Haudiquet</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/stylesheets/style.css">
<link rel="icon" type="image/png" href="/assets/favicon.ico_256x256.png">
<!-- Inter font -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Header -->
<div id="header-div">
<img src="/assets/photo_web.JPG" id="header-img"/>
<div id="header-text-container">
<h1>Valentin Haudiquet</h1>
<h4>Software Engineer at Canonical - Ubuntu</h4>
<p id="header-paragraph">Working on Ubuntu support for RISC-V architecture</p>
</div>
</div>
<div class="content-holder">
<!-- Links -->
<div id="links-div" style="grid-column: 1;">
<a href="/projects" style="grid-column: 1;">
<img src="/assets/material-symbols--list-alt-outline.svg" class="link-image"/>
<p class="link-text">Projects</p>
</a>
<a href="/cv/">
<img src="/assets/icon-park-solid_people.svg" class="link-image"/>
<p class="link-text">CV</p>
</a>
<a href="/about/">
<img src="/assets/mdi_about.svg" class="link-image"/>
<p class="link-text">About</p>
</a>
</div>
<div class="content-separator"></div>
<div id="contact-div" style="margin-top: 50px;">
<h4 style="text-align: left; padding-bottom: 15px;">Find me on...</h4>
<a href="https://github.com/vhaudiquet" class="contact-link">
<img src="/assets/github-mark.png" class="contact-image"/>
<p class="contact-text">GitHub</p>
</a>
<a href="https://git.vhaudiquet.fr/vhaudiquet/" class="contact-link">
<img src="/assets/logo_black.svg" class="contact-image"/>
<p class="contact-text">Gitea (personal)</p>
</a>
<a href="https://launchpad.net/~vhaudiquet" class="contact-link">
<img src="/assets/launchpad-white-black.png" class="contact-image"/>
<p class="contact-text">Launchpad</p>
</a>
<a href="mailto:valentin.haudiquet@ens-rennes.fr" class="contact-link">
<img src="/assets/arobase.svg" class="contact-image"/>
<p class="contact-text">Mail</p>
</a>
</div>
</div>
</body>
-85
View File
@@ -1,85 +0,0 @@
<!DOCTYPE html>
<head>
<title>Valentin Haudiquet</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/stylesheets/style.css">
<link rel="icon" type="image/png" href="/assets/favicon.ico_256x256.png">
<!-- Inter font -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Header -->
<div id="header-div">
<img src="/assets/photo_web.JPG" id="header-img"/>
<div id="header-text-container">
<h1>Valentin Haudiquet</h1>
<h4>Software Engineer at Canonical - Ubuntu</h4>
<p id="header-paragraph">Working on Ubuntu support for RISC-V architecture</p>
</div>
</div>
<!-- Projects -->
<div id="projects-div">
<!-- BuildPath -->
<a href="https://buildpath.win">
<div class="project-div">
<h2 class="project-title">BuildPath</h2>
<img class="project-img" src="https://buildpath.win/favicon.svg"/>
<h3 class="project-link">https://buildpath.win</h3>
<p class="project-desc">a tool for League of Legends champions runes and build paths</p>
</div>
</a>
<!-- homeprod -->
<a href="https://github.com/vhaudiquet/homeprod">
<div class="project-div">
<h2 class="project-title">homeprod</h2>
<img class="project-img" src="https://vhaudiquet.fr/public/github_assets/homeprod/p330_sff.png"/>
<h3 class="project-link" style="display: flex;">
<img src="/assets/github-mark.png" width="16px" style="margin: auto; display: block; margin-right: 4px;"/>
vhaudiquet/homeprod
</h3>
<p class="project-desc">personal home production environment</p>
</div>
</a>
<!-- BladePlayer -->
<a href="https://github.com/vhaudiquet/BladePlayer">
<div class="project-div">
<h2 class="project-title">Blade Player</h2>
<img class="project-img" src="/assets/blade-icon.png"/>
<h3 class="project-link" style="display: flex;">
<img src="/assets/github-mark.png" width="16px" style="margin: auto; display: block; margin-right: 4px;"/>
vhaudiquet/BladePlayer
</h3>
<p class="project-desc">android music player that plays from multiple sources</p>
</div>
</a>
<!-- vhaudiquet.fr -->
<a href="https://vhaudiquet.fr">
<div class="project-div">
<h2 class="project-title">vhaudiquet.fr</h2>
<img class="project-img" src="/assets/favicon.ico_256x256.png"/>
<h3 class="project-link" style="display: flex;">
https://vhaudiquet.fr
</h3>
<p class="project-desc">this website: my personal website with information, CV, projects</p>
</div>
</a>
</div>
</div>
</body>
-4
View File
@@ -1,4 +0,0 @@
User-agent: *
Disallow:
Allow: /
Sitemap: https://vhaudiquet.fr/sitemap.xml
-32
View File
@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://vhaudiquet.fr/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/cv/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/about/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/apic-vs-pic/</loc>
<lastmod>2021-12-16</lastmod>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/categories/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/more/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/more/about/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/tags/</loc>
</url>
<url>
<loc>https://vhaudiquet.fr/blog/valou3433-pusku-com-historique/</loc>
<lastmod>2021-05-02</lastmod>
</url>
</urlset>
-313
View File
@@ -1,313 +0,0 @@
#header-img {
border-radius: 50%;
width: 400px;
height: 400px;
}
#header-div {
display: flex;
width: fit-content;
margin: auto;
margin-top: 50px;
}
#header-text-container {
margin-left: 90px;
display: flex;
flex-direction:column;
align-items:end;
}
h1 {
font-family: 'Inter', sans-serif;
font-style: normal;
font-weight: 600;
font-size: 96px;
margin-top: 5px;
margin-bottom: 5px;
text-align: right;
}
h2 {
font-family: 'Inter', sans-serif;
font-style: normal;
font-weight: 500;
font-size: 40px;
margin-top: 5px;
margin-bottom: 5px;
}
h4 {
font-family: 'Inter', sans-serif;
font-style: normal;
font-weight: 300;
font-size: 40px;
margin-top: 5px;
margin-bottom: 5px;
text-align: right;
}
#header-paragraph {
max-width: 770px;
margin-right: -3px;
text-align: right;
font-size: 36px;
font-weight: 200;
}
#links-div {
display: grid;
column-gap: 40px;
grid-auto-flow: column;
width: fit-content;
margin: auto;
margin-top: 100px;
}
p {
font-family: 'Inter', sans-serif;
font-style: normal;
font-weight: normal;
font-size: 30px;
margin-top: 5px;
margin-bottom: 5px;
}
a:link {
text-decoration: none;
color: grey;
}
a:visited {
text-decoration: none;
color: grey;
}
a:hover {
text-decoration: none;
color: #536878;
}
a:active {
text-decoration: none;
color: grey;
}
.content-holder {
display: grid;
width: fit-content;
margin: auto;
grid-auto-flow: column;
}
.content-separator {
width: 350px;
grid-column: 2;
}
.link-image {
width: 150px;
height: 150px;
}
.link-text {
text-align: center;
}
.contact-link {
display: flex;
}
.contact-image {
width: 48px;
height: 48px;
}
.contact-text {
text-align: right;
padding-left: 10px;
font-size: 28px;
}
strong {
font-family: 'Inter', sans-serif;
font-style: normal;
font-weight: 600;
font-size: 30px;
}
.cv-section {
display: grid;
grid-auto-flow: row;
column-gap: 50px;
width: fit-content;
}
.date {
margin-left: 10px;
font-style: italic;
}
.subtext {
font-weight: 200;
font-size: 26px;
}
#projects-div {
display: grid;
grid-auto-flow: column;
width: fit-content;
margin: auto;
margin-top: 100px;
column-gap: 40px;
}
.project-div {
max-width: 250px;
width: 250px;
height: 300px;
background-color: #FEFEFE;
border-radius: 12px;
border: 1px solid #E0E0E0;
box-shadow: 5px 2px 2px #E0E0E0;
padding: 10px;
}
.project-div:hover {
background-color: #EEEEEE;
}
.project-title {
width: fit-content;
margin: auto;
font-weight: 400;
font-size: 30px;
color: black;
}
.project-img {
max-width: 140px;
max-height: 140px;
/* width: fit-content; */
margin: auto;
display: block;
margin-top: 10px;
}
.project-link {
font-size: 12px;
width: fit-content;
font-weight: 400;
margin: auto;
margin-top: 8px;
color: black;
}
.project-desc {
font-size: 16px;
margin-left: 5px;
margin-top: 30px;
font-weight: 300;
color: black;
text-align: center;
}
@media only screen and (max-width: 1000px) {
/* Tablet, small screens version */
#header-img {
align-self: center;
}
#header-div {
flex-direction: column;
}
#header-text-container {
margin-left: 0px;
display: flex;
flex-direction:column;
align-items:center;
}
h1 {
text-align: center;
}
h4 {
text-align: center;
}
#header-paragraph {
text-align: center;
}
#links-div {
display: grid;
column-gap: 40px;
row-gap: 40px;
/* grid-auto-flow: row; */
width: fit-content;
margin: auto;
margin-top: 100px;
}
#projects-div {
grid-auto-flow: row;
row-gap: 40px;
grid-template-columns: repeat(2, 270px);
}
.content-holder {
grid-auto-flow: row;
}
.content-separator {
width: 0px;
}
}
@media only screen and (max-width: 650px) {
#projects-div {
margin-top: 50px;
grid-template-columns: repeat(1, 270px);
}
}
@media only screen and (max-width: 450px) {
/* Mobile version */
#header-img {
width: 80%;
height: auto;
}
#header-div {
margin-top: 30px;
}
h1 {
font-size: 50px;
}
h2 {
font-size: 30px;
}
h4 {
font-size: 30px;
}
p {
font-size: 20px;
}
#header-paragraph {
font-size: 26px;
}
#links-div {
margin-top: 40px;
}
.link-image {
width: 70px;
height: 70px;
}
}
+18
View File
@@ -0,0 +1,18 @@
{
// https://nuxt.com/docs/guide/concepts/typescript
"files": [],
"references": [
{
"path": "./.nuxt/tsconfig.app.json"
},
{
"path": "./.nuxt/tsconfig.server.json"
},
{
"path": "./.nuxt/tsconfig.shared.json"
},
{
"path": "./.nuxt/tsconfig.node.json"
}
]
}