From 897b4a69b1038af5322a1d3130d720b7a90490a8 Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Fri, 10 Jul 2026 08:36:27 +0200 Subject: [PATCH 1/7] fix(markdown): force normal font weight on image description --- src/pages/Newsletters.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index a9e95db..e322877 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -80,16 +80,15 @@ const Newsletters: React.FC = () => {

); }, - img({src, title, alt, ...props}) { + img({src, title, alt}) { const newSrc = src?.startsWith('http') ? src : `/newsletters/${id}/${src}`; const w = title?.split('=')[1].split('x')[0]; - // const h = title?.split('=')[1].split('x')[1]; return ( <> -
- {alt} + {alt} ); }, From 86d26537ba0ee6b60459dab4871a17405df70263 Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:40:29 +0200 Subject: [PATCH 2/7] fix(markdown): better error handling --- src/pages/Newsletters.tsx | 50 +++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index e322877..06dbaf8 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -17,23 +17,45 @@ const Newsletters: React.FC = () => { const {id} = useParams(); const [data, setData] = useState>({}); const [md, setMd] = useState(''); + const [loadError, setLoadError] = useState(null); useEffect(() => { fetch('/newsletters/index.json') - .then(res => res.json()) - .then(setData); + .then(res => { + if (!res.ok) throw new Error(`Failed to load newsletter index (${res.status})`); + return res.json() + }) + .then(setData) + .catch(err => { + console.error(err); + setLoadError("Impossible de charger la liste des newsletters."); + }); }, []); useEffect(() => { if (id && data[id]) { fetch(`/newsletters/${id}/${data[id].markdown}`) - .then(res => res.text()) + .then(res => { + if (!res.ok) throw new Error(`Failed to load newsletter (${res.status})`); + return res.text() + }) .then(text => text.replace(/\\n/g, "\n")) - .then(setMd); + .then(setMd) + .catch(err => { + console.error(err); + setLoadError("Impossible de charger cette newsletter."); + }); } }, [id, data]); return useMemo(() => { + if (loadError) { + return ( +
+

{loadError}

+
+ ); + } if (!id) { return <>
@@ -82,10 +104,10 @@ const Newsletters: React.FC = () => { }, img({src, title, alt}) { const newSrc = src?.startsWith('http') ? src : `/newsletters/${id}/${src}`; - const w = title?.split('=')[1].split('x')[0]; + const w = title?.split('=')[1]?.split('x')[0]; return ( <> - {alt
{alt} @@ -94,17 +116,25 @@ const Newsletters: React.FC = () => { }, a({href, children}) { const newSrc = href?.startsWith('http') || href?.startsWith('/newsletters') ? href : `/newsletters/${id}/${href}`; + const SIZE_TOKEN = /^\d+x\d+$/; if (newSrc.endsWith('mp4') && !href?.startsWith("/newsletters") && children) { const words = children.toString().split(" "); - const size = words[words.length - 1]; - const alt = children.toString().replace(` ${size}`, ''); + const lastWord = words[words.length - 1]; + const hasSize = SIZE_TOKEN.test(lastWord); + const size = hasSize ? lastWord : undefined; + const alt = hasSize + ? children.toString().replace(` ${size}`, '') + : children.toString(); const w = size?.split('x')[0]; const h = size?.split('x')[1]; return ( <> @@ -130,7 +160,7 @@ const Newsletters: React.FC = () => {
) } - }, [id, data, md]) + }, [id, data, md, loadError]) } export default Newsletters \ No newline at end of file From 2fe2d8e4a09b25560456039c9f0a1af38730bc23 Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:40:59 +0200 Subject: [PATCH 3/7] fix(markdown): add emoji and note/tip/warning/info bubble support --- package-lock.json | 439 +++++++++++++++++++++++++++++++++++++ package.json | 3 + src/pages/Newsletters.scss | 49 +++++ src/pages/Newsletters.tsx | 11 +- 4 files changed, 501 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 23d4a0a..284cbc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,9 @@ "react-icons": "^5.5.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.11.0", + "remark-admonition": "^2.0.0", + "remark-directive": "^4.0.0", + "remark-emoji": "^5.0.2", "remark-gfm": "^4.0.1" }, "devDependencies": { @@ -1073,6 +1076,186 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", @@ -1115,6 +1298,69 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -1441,6 +1687,18 @@ "win32" ] }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2105,6 +2363,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -2336,6 +2603,22 @@ "dev": true, "license": "ISC" }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -3189,6 +3472,27 @@ "deprecated": "`mdast` was renamed to `remark`", "license": "MIT" }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -3540,6 +3844,25 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -4116,6 +4439,21 @@ "license": "MIT", "optional": true }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -4477,6 +4815,61 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/remark-admonition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-admonition/-/remark-admonition-2.0.0.tgz", + "integrity": "sha512-WzfYp3WhFGt/INOEu3B3037m6w9mUJ3N/ha0vAqczKHOQKwf5LDbVPiFI/uC05FXxOKA1cx5U/bkD1QXtb7Iwg==", + "license": "Apache-2.0 AND MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-hast": "^13.2.0", + "remark-stringify": "^11.0.0", + "strip-markdown": "^6.0.0", + "type-fest": "^4.41.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">= 22" + }, + "funding": { + "url": "https://github.com/sponsors/TomerAberbach" + } + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", + "integrity": "sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.4", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.3", + "unified": "^11.0.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -5037,6 +5430,18 @@ "node": ">=8" } }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5084,6 +5489,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-markdown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-markdown/-/strip-markdown-6.0.0.tgz", + "integrity": "sha512-mSa8FtUoX3ExJYDkjPUTC14xaBAn4Ik5GPQD45G5E2egAmeV3kHgVSTfIoSDggbF6Pk9stahVgqsLCNExv6jHw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/style-to-js": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", @@ -5228,6 +5646,18 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -5273,6 +5703,15 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", diff --git a/package.json b/package.json index 59023dc..3025228 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,9 @@ "react-icons": "^5.5.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.11.0", + "remark-admonition": "^2.0.0", + "remark-directive": "^4.0.0", + "remark-emoji": "^5.0.2", "remark-gfm": "^4.0.1" }, "devDependencies": { diff --git a/src/pages/Newsletters.scss b/src/pages/Newsletters.scss index 72d68b4..c0544e5 100644 --- a/src/pages/Newsletters.scss +++ b/src/pages/Newsletters.scss @@ -4,4 +4,53 @@ .md-highlight { background-color: rgba(217, 219, 150, 0.29); +} + +// info, note, tip, warning bubble +[data-admonition-name] { + margin: 1rem 0; + padding: 0.75rem 1rem; + border-left: 4px solid var(--adm-color, #888); + background: var(--adm-bg, #f5f5f5); + border-radius: 0 4px 4px 0; + + > p:first-child { margin-top: 0; } + > p:last-child { margin-bottom: 0; } + + &::before { + content: attr(data-admonition-label); + display: block; + font-weight: 700; + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.03em; + color: var(--adm-color, #888); + margin-bottom: 0.35rem; + } + + &[data-admonition-name="tip"] { + --adm-color: #1a7f37; + --adm-bg: #e6f7ec; + } + + &[data-admonition-name="note"] { + --adm-color: #0969da; + --adm-bg: #e8f1fd; + } + + &[data-admonition-name="info"] { + --adm-color: #0969da; + --adm-bg: #e8f1fd; + } + + &[data-admonition-name="warning"] { + --adm-color: #9a6700; + --adm-bg: #fff8e5; + } + + &[data-admonition-name="danger"], + &[data-admonition-name="caution"] { + --adm-color: #cf222e; + --adm-bg: #ffebe9; + } } \ No newline at end of file diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index 06dbaf8..2e2d9b6 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -3,6 +3,9 @@ import {useEffect, useMemo, useState} from "react"; import ReactMarkdown from 'react-markdown'; import "./Newsletters.scss" import {remarkHighlight} from "../md-flavor.ts" +import remarkDirective from "remark-directive"; +import {DEFAULT_ADMONITION_TYPES, remarkAdmonition} from "remark-admonition"; +import remarkEmoji from "remark-emoji"; import {useParams} from "react-router-dom"; import NewsletterLi from "../components/NewsletterLi.tsx"; import remarkGfm from "remark-gfm"; @@ -90,7 +93,13 @@ const Newsletters: React.FC = () => {
Date: Sat, 11 Jul 2026 14:46:31 +0200 Subject: [PATCH 4/7] feat(markdown): deal with image only tables --- src/md-flavor.ts | 41 ++++++++++++++++++++++++++++++++++++-- src/pages/Newsletters.scss | 35 ++++++++++++++++++++++++++++++++ src/pages/Newsletters.tsx | 8 +++++--- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/md-flavor.ts b/src/md-flavor.ts index fb22b9e..938dbd5 100644 --- a/src/md-flavor.ts +++ b/src/md-flavor.ts @@ -2,6 +2,7 @@ import type {Plugin} from 'unified'; import type {Visitor} from 'unist-util-visit'; import {visit} from 'unist-util-visit'; import type {Text} from 'mdast'; +import type {Element, ElementContent} from "hast"; export const remarkHighlight: Plugin = () => { @@ -16,10 +17,10 @@ export const remarkHighlight: Plugin = () => { if (part.startsWith('==') && part.endsWith('==')) { return { type: 'emphasis', - children: [{ type: 'text', value: part.slice(2, -2) }], + children: [{type: 'text', value: part.slice(2, -2)}], data: { hName: 'span', - hProperties: { className: 'md-highlight' }, + hProperties: {className: 'md-highlight'}, }, }; } @@ -32,3 +33,39 @@ export const remarkHighlight: Plugin = () => { visit(tree, 'text', visitor); }; }; + +// === deal with image only table + +function getMeaningfulChildren(node: Element): ElementContent[] { + return (node.children ?? []).filter( + (c): c is ElementContent => !(c.type === 'text' && !c.value?.trim()) + ); +} + +function isImageOnlyCell(cell: Element): boolean { + const kids = getMeaningfulChildren(cell); + return kids.length > 0 && kids.every(k => k.type === 'element' && k.tagName === 'img'); +} + +function getTableRows(tableNode: Element): Element[] { + const rows: Element[] = []; + for (const section of tableNode.children ?? []) { + if (section.type === 'element' && (section.tagName === 'thead' || section.tagName === 'tbody')) { + for (const tr of section.children ?? []) { + if (tr.type === 'element' && tr.tagName === 'tr') rows.push(tr); + } + } + } + return rows; +} + +export function isImageGalleryTable(tableNode: Element): boolean { + const rows = getTableRows(tableNode); + if (rows.length === 0) return false; + return rows.every(tr => { + const cells = (tr.children ?? []).filter( + (c): c is Element => c.type === 'element' && (c.tagName === 'td' || c.tagName === 'th') + ); + return cells.length > 0 && cells.every(isImageOnlyCell); + }); +} diff --git a/src/pages/Newsletters.scss b/src/pages/Newsletters.scss index c0544e5..7e8fdd2 100644 --- a/src/pages/Newsletters.scss +++ b/src/pages/Newsletters.scss @@ -53,4 +53,39 @@ --adm-color: #cf222e; --adm-bg: #ffebe9; } +} + +// Renders "image-only" markdown tables +.md-image-gallery-table { + width: 100%; + border-collapse: collapse; + + thead, tbody { + display: block; + } + + tr { + display: flex; + justify-content: center; + align-items: stretch; + gap: 1rem; + background: none !important; // kill the zebra striping + border: none; + } + + th, td { + display: flex; + flex: 1 1 0; + flex-direction: column; + justify-content: center; + align-items: center; + border: none; + background: none !important; + padding: 0.5rem; + + img { + max-width: 100%; + height: auto; + } + } } \ No newline at end of file diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index 2e2d9b6..f80e525 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import {useEffect, useMemo, useState} from "react"; import ReactMarkdown from 'react-markdown'; import "./Newsletters.scss" -import {remarkHighlight} from "../md-flavor.ts" +import {isImageGalleryTable, remarkHighlight} from "../md-flavor.ts" import remarkDirective from "remark-directive"; import {DEFAULT_ADMONITION_TYPES, remarkAdmonition} from "remark-admonition"; import remarkEmoji from "remark-emoji"; @@ -155,9 +155,11 @@ const Newsletters: React.FC = () => { ) } }, - table({children}) { + table({node, children}) { + const gallery = node ? isImageGalleryTable(node) : false; return ( - +
{children}
); From a4b7dc233dea254eaa7df77dd9adab725b0d2550 Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Sat, 11 Jul 2026 15:05:55 +0200 Subject: [PATCH 5/7] feat(markdown): zoom on hover --- src/pages/Newsletters.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index f80e525..5fa5857 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -116,8 +116,24 @@ const Newsletters: React.FC = () => { const w = title?.split('=')[1]?.split('x')[0]; return ( <> - {alt + {alt { + e.currentTarget.style.transform = "scale(1.5)"; + e.currentTarget.style.zIndex = "1000"; + }} + onMouseLeave={e => { + e.currentTarget.style.transform = "scale(1)"; + e.currentTarget.style.zIndex = "1"; + }}/>
{alt} From 3431145c6e07f12d6b1452ca3cb711476aafb6ca Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:39:16 +0200 Subject: [PATCH 6/7] feat(markdown): add cdfr25 newsletters and reorganize files --- .../00f22b5d-70e9-442c-96cb-9eec07f952e7.png | 3 + .../1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png | 3 + .../274c35c3-2434-4756-b311-e76a19df66b2.png | 3 + .../33155cc1-0736-45fb-8da5-ea2f966dd7a1.png | 3 + .../3c79c881-83ec-4a35-a390-0987424d5075.png | 3 + .../537ac060-92c9-4a1d-9027-45a517ac186e.png | 3 + .../6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png | 3 + .../713119d0-90c1-4947-b24c-4e6bd1c62ed8.png | 3 + .../71ab6f68-04b4-4d74-a5eb-a869f71301a1.png | 3 + .../884deb27-5571-4e48-9b1e-d295cd0758a1.png | 3 + .../92d44062-ed48-474e-a511-02007a66efe1.png | 3 + .../a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif | 3 + .../a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png | 3 + .../d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png | 3 + .../d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png | 3 + .../daf4bfd8-9d61-4100-8480-2e537e2b84ea.png | 3 + .../de9b1b12-7366-47b0-83dc-5e96feb03d4d.png | 3 + .../f19056bc-a739-471c-81bb-a394bdfda197.png | 3 + .../25-20241105/newsletter-051124.md | 97 +++++++++++++++ .../223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png | 3 + .../25364bf6-fefd-4326-9120-03c9e2b46183.png | 3 + .../27d247cf-31d4-410e-93e1-ba389ae342c5.png | 3 + .../3587c61f-687d-460b-a6b8-453b98449819.png | 3 + .../3ddf656c-820a-435e-89b5-efac0b7350f5.png | 3 + .../97c36253-610d-435e-b783-4fee4687f567.png | 3 + .../cb04eeda-a9d6-4f85-8523-663ba832a900.png | 3 + .../e62d0c29-7205-4264-82fd-6ed31e7fa008.png | 3 + .../f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png | 3 + .../25-20241217/newsletter-171224.md | 84 +++++++++++++ .../0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4 | 3 + .../1c3e36bb-253d-4832-9688-fbda10827a4f.png | 3 + .../2cf6223b-644c-4a60-aec9-faba9715415a.png | 3 + .../3a7b76e7-04ab-44fc-9d4b-7e085659da45.png | 3 + .../57b88372-9bfa-4e26-8abe-dd2df4574714.png | 3 + .../6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png | 3 + .../92d44062-ed48-474e-a511-02007a66efe1.png | 3 + .../937cc1ee-f0cf-4310-84a6-2a88e437717c.png | 3 + .../a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png | 3 + .../c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png | 3 + .../ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png | 3 + .../25-20250131/newsletter-310125.md | 84 +++++++++++++ .../19b95a70-cb86-477f-8c19-79c508007018.jpg | 3 + .../36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png | 3 + .../3b984c2e-2be0-494f-8d00-f255eb979f0f.png | 3 + .../50ec0ef3-db46-4581-bd91-3b58ad2b343d.png | 3 + .../815ebe5c-b97a-4731-863c-94f337a85a3e.jpg | 3 + .../8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png | 3 + .../955cd0cf-6d8f-467b-b813-a38d097c6d61.gif | 3 + .../a710ed13-4799-4491-80cd-3e06502ffe32.gif | 3 + .../c3750741-dd0b-4a19-958f-6fe4b3c719ce.png | 3 + .../cbf87de6-bd8d-4c37-b167-b2e649fc3693.png | 3 + .../d91f1070-6096-417e-8610-c73f360e7c6c.jpg | 3 + .../25-20250308/newsletter-080325.md | 112 ++++++++++++++++++ .../47377c33-011f-4bcb-9321-7777bfb063b4.mp4 | 3 + .../634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4 | 3 + .../6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png | 3 + .../6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png | 3 + .../98c8cee3-ed20-4cca-9fef-780db5973baf.png | 3 + .../d8cacaee-7fe2-470b-b703-3343718413c5.mp4 | 3 + .../df4641fe-19f7-4d6c-888a-1a50728d004b.mp4 | 3 + .../faef2ecf-ef45-4851-ad35-aee0865eef83.mp4 | 3 + .../25-20250518/newsletter-180525.md | 80 +++++++++++++ .../1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif | 3 + .../32034515-59f5-4357-a5c9-f49b1898636d.gif | 3 + .../3d99d404-1256-4a21-a546-17f68d53bd1f.png | 3 + .../5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg | 3 + .../84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png | 3 + .../91acd38d-a946-4859-b4d0-8675b6d601bb.png | 3 + .../ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif | 3 + .../dc4b5322-0761-4218-9da8-30e82d8b6d46.png | 3 + .../ec660e39-38d0-4f39-a97d-66143f3292a9.gif | 3 + .../25-20250615/newsletter-150625.md | 103 ++++++++++++++++ .../2a92d6eb-f05b-4344-b7ba-354325d62938.jpg | 3 + .../3ca55032-5f23-4738-8d3e-e380cb03d3b9.png | 0 .../4be89b77-448f-4954-913f-b98b904b4e12.png | 0 .../e0439810-b100-4580-8906-6052359aa179.png | 0 .../e63d3f2d-d3bf-4ed2-b486-fb2854401849.png | 0 .../{2702206 => 26-20260227}/draft-022026.md | 2 +- .../{052026 => 26-20260513}/052026.md | 0 .../cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 | 0 .../feab6b42-6335-4072-a8aa-e9813869e078.mp4 | 0 .../{062026 => 26-20260608}/062026.md | 14 ++- .../70f948a3-0d6a-4c60-9812-902e083954de.mp4 | 0 .../92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif | 0 .../93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 | 0 .../fa8173fa-0b3e-4167-8087-f753ae3282d7.gif | 0 .../attachments/s1-1.mp4 | 0 .../attachments/s1-2.mp4 | 0 .../attachments/s2-1.mp4 | 0 .../attachments/s3-1.mp4 | 0 .../attachments/s4-1.mp4 | 0 .../attachments/s5-1.mp4 | 0 .../2a92d6eb-f05b-4344-b7ba-354325d62938.jpg | 3 - public/newsletters/index.json | 51 ++++++-- public/restricted-assets/LICENSE | 4 + src/pages/Newsletters.tsx | 99 ++++++++++------ 96 files changed, 876 insertions(+), 58 deletions(-) create mode 100644 public/newsletters/25-20241105/attachments/00f22b5d-70e9-442c-96cb-9eec07f952e7.png create mode 100644 public/newsletters/25-20241105/attachments/1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png create mode 100644 public/newsletters/25-20241105/attachments/274c35c3-2434-4756-b311-e76a19df66b2.png create mode 100644 public/newsletters/25-20241105/attachments/33155cc1-0736-45fb-8da5-ea2f966dd7a1.png create mode 100644 public/newsletters/25-20241105/attachments/3c79c881-83ec-4a35-a390-0987424d5075.png create mode 100644 public/newsletters/25-20241105/attachments/537ac060-92c9-4a1d-9027-45a517ac186e.png create mode 100644 public/newsletters/25-20241105/attachments/6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png create mode 100644 public/newsletters/25-20241105/attachments/713119d0-90c1-4947-b24c-4e6bd1c62ed8.png create mode 100644 public/newsletters/25-20241105/attachments/71ab6f68-04b4-4d74-a5eb-a869f71301a1.png create mode 100644 public/newsletters/25-20241105/attachments/884deb27-5571-4e48-9b1e-d295cd0758a1.png create mode 100644 public/newsletters/25-20241105/attachments/92d44062-ed48-474e-a511-02007a66efe1.png create mode 100644 public/newsletters/25-20241105/attachments/a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif create mode 100644 public/newsletters/25-20241105/attachments/a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png create mode 100644 public/newsletters/25-20241105/attachments/d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png create mode 100644 public/newsletters/25-20241105/attachments/d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png create mode 100644 public/newsletters/25-20241105/attachments/daf4bfd8-9d61-4100-8480-2e537e2b84ea.png create mode 100644 public/newsletters/25-20241105/attachments/de9b1b12-7366-47b0-83dc-5e96feb03d4d.png create mode 100644 public/newsletters/25-20241105/attachments/f19056bc-a739-471c-81bb-a394bdfda197.png create mode 100644 public/newsletters/25-20241105/newsletter-051124.md create mode 100644 public/newsletters/25-20241217/attachments/223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png create mode 100644 public/newsletters/25-20241217/attachments/25364bf6-fefd-4326-9120-03c9e2b46183.png create mode 100644 public/newsletters/25-20241217/attachments/27d247cf-31d4-410e-93e1-ba389ae342c5.png create mode 100644 public/newsletters/25-20241217/attachments/3587c61f-687d-460b-a6b8-453b98449819.png create mode 100644 public/newsletters/25-20241217/attachments/3ddf656c-820a-435e-89b5-efac0b7350f5.png create mode 100644 public/newsletters/25-20241217/attachments/97c36253-610d-435e-b783-4fee4687f567.png create mode 100644 public/newsletters/25-20241217/attachments/cb04eeda-a9d6-4f85-8523-663ba832a900.png create mode 100644 public/newsletters/25-20241217/attachments/e62d0c29-7205-4264-82fd-6ed31e7fa008.png create mode 100644 public/newsletters/25-20241217/attachments/f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png create mode 100644 public/newsletters/25-20241217/newsletter-171224.md create mode 100644 public/newsletters/25-20250131/attachments/0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4 create mode 100644 public/newsletters/25-20250131/attachments/1c3e36bb-253d-4832-9688-fbda10827a4f.png create mode 100644 public/newsletters/25-20250131/attachments/2cf6223b-644c-4a60-aec9-faba9715415a.png create mode 100644 public/newsletters/25-20250131/attachments/3a7b76e7-04ab-44fc-9d4b-7e085659da45.png create mode 100644 public/newsletters/25-20250131/attachments/57b88372-9bfa-4e26-8abe-dd2df4574714.png create mode 100644 public/newsletters/25-20250131/attachments/6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png create mode 100644 public/newsletters/25-20250131/attachments/92d44062-ed48-474e-a511-02007a66efe1.png create mode 100644 public/newsletters/25-20250131/attachments/937cc1ee-f0cf-4310-84a6-2a88e437717c.png create mode 100644 public/newsletters/25-20250131/attachments/a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png create mode 100644 public/newsletters/25-20250131/attachments/c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png create mode 100644 public/newsletters/25-20250131/attachments/ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png create mode 100644 public/newsletters/25-20250131/newsletter-310125.md create mode 100644 public/newsletters/25-20250308/attachments/19b95a70-cb86-477f-8c19-79c508007018.jpg create mode 100644 public/newsletters/25-20250308/attachments/36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png create mode 100644 public/newsletters/25-20250308/attachments/3b984c2e-2be0-494f-8d00-f255eb979f0f.png create mode 100644 public/newsletters/25-20250308/attachments/50ec0ef3-db46-4581-bd91-3b58ad2b343d.png create mode 100644 public/newsletters/25-20250308/attachments/815ebe5c-b97a-4731-863c-94f337a85a3e.jpg create mode 100644 public/newsletters/25-20250308/attachments/8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png create mode 100644 public/newsletters/25-20250308/attachments/955cd0cf-6d8f-467b-b813-a38d097c6d61.gif create mode 100644 public/newsletters/25-20250308/attachments/a710ed13-4799-4491-80cd-3e06502ffe32.gif create mode 100644 public/newsletters/25-20250308/attachments/c3750741-dd0b-4a19-958f-6fe4b3c719ce.png create mode 100644 public/newsletters/25-20250308/attachments/cbf87de6-bd8d-4c37-b167-b2e649fc3693.png create mode 100644 public/newsletters/25-20250308/attachments/d91f1070-6096-417e-8610-c73f360e7c6c.jpg create mode 100644 public/newsletters/25-20250308/newsletter-080325.md create mode 100644 public/newsletters/25-20250518/attachments/47377c33-011f-4bcb-9321-7777bfb063b4.mp4 create mode 100644 public/newsletters/25-20250518/attachments/634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4 create mode 100644 public/newsletters/25-20250518/attachments/6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png create mode 100644 public/newsletters/25-20250518/attachments/6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png create mode 100644 public/newsletters/25-20250518/attachments/98c8cee3-ed20-4cca-9fef-780db5973baf.png create mode 100644 public/newsletters/25-20250518/attachments/d8cacaee-7fe2-470b-b703-3343718413c5.mp4 create mode 100644 public/newsletters/25-20250518/attachments/df4641fe-19f7-4d6c-888a-1a50728d004b.mp4 create mode 100644 public/newsletters/25-20250518/attachments/faef2ecf-ef45-4851-ad35-aee0865eef83.mp4 create mode 100644 public/newsletters/25-20250518/newsletter-180525.md create mode 100644 public/newsletters/25-20250615/attachments/1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif create mode 100644 public/newsletters/25-20250615/attachments/32034515-59f5-4357-a5c9-f49b1898636d.gif create mode 100644 public/newsletters/25-20250615/attachments/3d99d404-1256-4a21-a546-17f68d53bd1f.png create mode 100644 public/newsletters/25-20250615/attachments/5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg create mode 100644 public/newsletters/25-20250615/attachments/84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png create mode 100644 public/newsletters/25-20250615/attachments/91acd38d-a946-4859-b4d0-8675b6d601bb.png create mode 100644 public/newsletters/25-20250615/attachments/ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif create mode 100644 public/newsletters/25-20250615/attachments/dc4b5322-0761-4218-9da8-30e82d8b6d46.png create mode 100644 public/newsletters/25-20250615/attachments/ec660e39-38d0-4f39-a97d-66143f3292a9.gif create mode 100644 public/newsletters/25-20250615/newsletter-150625.md create mode 100644 public/newsletters/26-20260227/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg rename public/newsletters/{2702206 => 26-20260227}/attachments/3ca55032-5f23-4738-8d3e-e380cb03d3b9.png (100%) rename public/newsletters/{2702206 => 26-20260227}/attachments/4be89b77-448f-4954-913f-b98b904b4e12.png (100%) rename public/newsletters/{2702206 => 26-20260227}/attachments/e0439810-b100-4580-8906-6052359aa179.png (100%) rename public/newsletters/{2702206 => 26-20260227}/attachments/e63d3f2d-d3bf-4ed2-b486-fb2854401849.png (100%) rename public/newsletters/{2702206 => 26-20260227}/draft-022026.md (99%) rename public/newsletters/{052026 => 26-20260513}/052026.md (100%) rename public/newsletters/{052026 => 26-20260513}/attachments/cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 (100%) rename public/newsletters/{052026 => 26-20260513}/attachments/feab6b42-6335-4072-a8aa-e9813869e078.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/062026.md (82%) rename public/newsletters/{062026 => 26-20260608}/attachments/70f948a3-0d6a-4c60-9812-902e083954de.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/fa8173fa-0b3e-4167-8087-f753ae3282d7.gif (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s1-1.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s1-2.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s2-1.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s3-1.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s4-1.mp4 (100%) rename public/newsletters/{062026 => 26-20260608}/attachments/s5-1.mp4 (100%) delete mode 100644 public/newsletters/2702206/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg create mode 100644 public/restricted-assets/LICENSE diff --git a/public/newsletters/25-20241105/attachments/00f22b5d-70e9-442c-96cb-9eec07f952e7.png b/public/newsletters/25-20241105/attachments/00f22b5d-70e9-442c-96cb-9eec07f952e7.png new file mode 100644 index 0000000..e78e50c --- /dev/null +++ b/public/newsletters/25-20241105/attachments/00f22b5d-70e9-442c-96cb-9eec07f952e7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a86c90b077286405e7f767301069e922b7f07193200c90ce869dec5d32bf91f3 +size 182727 diff --git a/public/newsletters/25-20241105/attachments/1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png b/public/newsletters/25-20241105/attachments/1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png new file mode 100644 index 0000000..64d5f9d --- /dev/null +++ b/public/newsletters/25-20241105/attachments/1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d4129df5590261b31b3990d4c271096c000c9882fed9c0a63afdba1c82562ff +size 132918 diff --git a/public/newsletters/25-20241105/attachments/274c35c3-2434-4756-b311-e76a19df66b2.png b/public/newsletters/25-20241105/attachments/274c35c3-2434-4756-b311-e76a19df66b2.png new file mode 100644 index 0000000..7fd39ba --- /dev/null +++ b/public/newsletters/25-20241105/attachments/274c35c3-2434-4756-b311-e76a19df66b2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec423750455008a72c15ea09140beb735201fb5e533b5dc3e232a44c35dd08c +size 447673 diff --git a/public/newsletters/25-20241105/attachments/33155cc1-0736-45fb-8da5-ea2f966dd7a1.png b/public/newsletters/25-20241105/attachments/33155cc1-0736-45fb-8da5-ea2f966dd7a1.png new file mode 100644 index 0000000..86f1000 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/33155cc1-0736-45fb-8da5-ea2f966dd7a1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54bb317112d891a38d2e38a55ff50950fdfc35f2b2110fb26e226e0e48200d4e +size 198877 diff --git a/public/newsletters/25-20241105/attachments/3c79c881-83ec-4a35-a390-0987424d5075.png b/public/newsletters/25-20241105/attachments/3c79c881-83ec-4a35-a390-0987424d5075.png new file mode 100644 index 0000000..8d3f047 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/3c79c881-83ec-4a35-a390-0987424d5075.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:573eef3ad6f1e7d3ffc57f932161813e50736fb439136141a5cc7f9a1473cf2e +size 33846 diff --git a/public/newsletters/25-20241105/attachments/537ac060-92c9-4a1d-9027-45a517ac186e.png b/public/newsletters/25-20241105/attachments/537ac060-92c9-4a1d-9027-45a517ac186e.png new file mode 100644 index 0000000..091a96e --- /dev/null +++ b/public/newsletters/25-20241105/attachments/537ac060-92c9-4a1d-9027-45a517ac186e.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c86408d05b4467d30efa84e8971bba0bb0e2259901ec9c998d15c236bfced88b +size 118757 diff --git a/public/newsletters/25-20241105/attachments/6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png b/public/newsletters/25-20241105/attachments/6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png new file mode 100644 index 0000000..4b245a6 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05b4dd54467413986d4c57b4baedf3df13755b96bed9c1497dc585c2cec3dd74 +size 127626 diff --git a/public/newsletters/25-20241105/attachments/713119d0-90c1-4947-b24c-4e6bd1c62ed8.png b/public/newsletters/25-20241105/attachments/713119d0-90c1-4947-b24c-4e6bd1c62ed8.png new file mode 100644 index 0000000..c064953 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/713119d0-90c1-4947-b24c-4e6bd1c62ed8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44a8acc693f5d6d1f13285d5b60740cc376a875134551fd0e3bb5795da79d44d +size 215172 diff --git a/public/newsletters/25-20241105/attachments/71ab6f68-04b4-4d74-a5eb-a869f71301a1.png b/public/newsletters/25-20241105/attachments/71ab6f68-04b4-4d74-a5eb-a869f71301a1.png new file mode 100644 index 0000000..1a5a46f --- /dev/null +++ b/public/newsletters/25-20241105/attachments/71ab6f68-04b4-4d74-a5eb-a869f71301a1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed5920e45f419a22b1564dc55748a24bc688ab4f809c49666e02340457ee48df +size 237398 diff --git a/public/newsletters/25-20241105/attachments/884deb27-5571-4e48-9b1e-d295cd0758a1.png b/public/newsletters/25-20241105/attachments/884deb27-5571-4e48-9b1e-d295cd0758a1.png new file mode 100644 index 0000000..5ddb300 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/884deb27-5571-4e48-9b1e-d295cd0758a1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c490aa28e81fe08213f2c78c58fae4931aea42502f90eab844a75e95f0d570f +size 374606 diff --git a/public/newsletters/25-20241105/attachments/92d44062-ed48-474e-a511-02007a66efe1.png b/public/newsletters/25-20241105/attachments/92d44062-ed48-474e-a511-02007a66efe1.png new file mode 100644 index 0000000..7d07798 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/92d44062-ed48-474e-a511-02007a66efe1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:740957ee7c722491d3894ee6eb8c744afa3037f6d911c6bebe0ba022885837f6 +size 172817 diff --git a/public/newsletters/25-20241105/attachments/a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif b/public/newsletters/25-20241105/attachments/a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif new file mode 100644 index 0000000..e83ddbf --- /dev/null +++ b/public/newsletters/25-20241105/attachments/a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eef40d2ef9e7f6348162753c8778f6e7253f615deafa4193590f7aab6282bc88 +size 2119112 diff --git a/public/newsletters/25-20241105/attachments/a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png b/public/newsletters/25-20241105/attachments/a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png new file mode 100644 index 0000000..97df06b --- /dev/null +++ b/public/newsletters/25-20241105/attachments/a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce894b890d7e6a4be1d9d697579a5c1b95a3b0f5fe700021d54d238a0eca3028 +size 202539 diff --git a/public/newsletters/25-20241105/attachments/d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png b/public/newsletters/25-20241105/attachments/d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png new file mode 100644 index 0000000..f8c286a --- /dev/null +++ b/public/newsletters/25-20241105/attachments/d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e2f8ec9225a04c81548c0c80308e9986d0aa84043f62f138e9cbdb662439914 +size 331605 diff --git a/public/newsletters/25-20241105/attachments/d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png b/public/newsletters/25-20241105/attachments/d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png new file mode 100644 index 0000000..a0cfd7b --- /dev/null +++ b/public/newsletters/25-20241105/attachments/d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46f2479ccf17fe7eaec1e400368fb2bd023e7a73a46ac99e251db63b323756c2 +size 218571 diff --git a/public/newsletters/25-20241105/attachments/daf4bfd8-9d61-4100-8480-2e537e2b84ea.png b/public/newsletters/25-20241105/attachments/daf4bfd8-9d61-4100-8480-2e537e2b84ea.png new file mode 100644 index 0000000..c881ac4 --- /dev/null +++ b/public/newsletters/25-20241105/attachments/daf4bfd8-9d61-4100-8480-2e537e2b84ea.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea85f0f62226e22bdbc46d7851d09cf7803d8bd152c4ddce5e039be4ad36b0a9 +size 862421 diff --git a/public/newsletters/25-20241105/attachments/de9b1b12-7366-47b0-83dc-5e96feb03d4d.png b/public/newsletters/25-20241105/attachments/de9b1b12-7366-47b0-83dc-5e96feb03d4d.png new file mode 100644 index 0000000..02afc0d --- /dev/null +++ b/public/newsletters/25-20241105/attachments/de9b1b12-7366-47b0-83dc-5e96feb03d4d.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a90c29ea285df266d3b084b154edd46cb70c102b6210d60be975ec0fd36c2880 +size 317666 diff --git a/public/newsletters/25-20241105/attachments/f19056bc-a739-471c-81bb-a394bdfda197.png b/public/newsletters/25-20241105/attachments/f19056bc-a739-471c-81bb-a394bdfda197.png new file mode 100644 index 0000000..2fa654b --- /dev/null +++ b/public/newsletters/25-20241105/attachments/f19056bc-a739-471c-81bb-a394bdfda197.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94a8a13a81c595942c71d95e7a4091e3a5af9720be3f233f109fa6417660d5c1 +size 955074 diff --git a/public/newsletters/25-20241105/newsletter-051124.md b/public/newsletters/25-20241105/newsletter-051124.md new file mode 100644 index 0000000..9a9a421 --- /dev/null +++ b/public/newsletters/25-20241105/newsletter-051124.md @@ -0,0 +1,97 @@ +# Novembre 2024 + +Bonjour à tous, + +Nous vous présentons aujourd'hui la première édition *(et avec un peu de chance pas la dernière)* des newsletters ! En +effet, l'année a commencé il y a un peu plus d'un mois pour nous, et il est temps de faire le point sur les objectifs de +l'année et les avancements de chacun. + +![Logo "The Show Must Go On" de l'édition 2025](attachments/6d56f2ec-141a-4f24-9732-9f99f7f4cca4.png "right-50 =121x171") + +[Le règlement](https://www.eurobot.org/wp-content/uploads/2024/10/Eurobot2025_Rules.pdf) de la Coupe de France de +Robotique édition 2025 est paru en septembre. Le thème de l'année est "The Show Must Go On", les actions sont donc en +rapport avec l'organisation d'un concert. À partir du règlement, nous avons pu déterminer les actions à effectuer en +priorité, en fonction de leur complexité à nos yeux et du nombre de points rapportés. + +Ci-dessous, vous trouverez les visuels de la table de jeu de cette année : + +| ![](attachments/1bc291d7-25e9-481e-ab24-fcf179f0ddfc.png " =253x109") | ![](attachments/a6aa7bb4-b5a8-44c0-8b61-0b0d4a27d814.png " =211x135") | ![](attachments/3c79c881-83ec-4a35-a390-0987424d5075.png " =253x78") | +|-----------------------------------------------------------------------|-----------------------------------------------------------------------|----------------------------------------------------------------------| + +Les actions listées ci-dessous sont nos priorités, pour leur rapport complexité-apport de points. + +### Banderole + +La banderole (dimensions : 50 cm de long, 25 cm de haut, minimum) est déployée au début du match sur le devant de la +table appartenant à notre équipe. Elle fait donc partie du périmètre non-déployé du robot. + +Les premières idées reprenaient le concept des tentes dépliables Decathlon, comme expliqué ci-dessous. + +![](attachments/713119d0-90c1-4947-b24c-4e6bd1c62ed8.png " =338x215") + +Ce design a été abandonné après avoir remarqué que les arceaux ne seraient pas assez flexibles, d'autres pistes de +réflexion ont été creusées, notamment avec plusieurs parties métalliques reliées par des élastiques, suivant ce +principe : les bras de la banderole seront repliés dans le périmètre de départ du robot, puis relâchés lorsque le robot +arrive au bord de la table, pour former la banderole entière, le tissu enroulé jusqu'alors se déroulera et notre +banderole sera prête. + +| ![Idée des bras replié et déplié avec des elastiques.](attachments/71ab6f68-04b4-4d74-a5eb-a869f71301a1.png " =191x291") | ![L'idée appliquée sur un prototype en carton (avec un peu de chance seulement au sens propre et pas au sens figuré).](attachments/a4d622e1-ce03-4fe1-8747-615d3ff921e0.gif " =169x301") | +|--------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + +### Groupies + +Les groupies sont des petits robots qui, après la 85ᵉ seconde, doivent, en 15s, se déplacer de la zone 4 de l'équipe +jusqu'au-devant de la scène. Une fois arrivés devant la scène, ils doivent activer un actionneur visible depuis le +public. + +![Haut de la table avec les zones 4 des deux équipes (départ des groupies) et les trois zones (a, b et c) devant la scène (arrivé des groupies)](attachments/d1ac5f01-ce37-433f-b7c8-3288275a1cc7.png " =802x219") + +Initialement, réaliser cette action n'était pas prévu *(surtout pour des raisons budgétaires)* mais après réflexion, +elle paraît faisable en utilisant les pièces que l'on a déjà en stock *(et rapporte beaucoup de points)*. + +On a donc décidé de partir sur un petit robot (pour laisser le plus de place possible à la superstar) utilisant des +petits moteurs, un petit servomoteur, un capteur ultrason et des Arduinos. + +| ![Des petits moteurs (un peu nuls mais qui feront largement l'affaire).](attachments/33155cc1-0736-45fb-8da5-ea2f966dd7a1.png " =191x191") | ![Petit servomoteur pour faire bouger un actionneur après la 100ᵉ seconde.](attachments/274c35c3-2434-4756-b311-e76a19df66b2.png " =191x191") | ![Capteur ultrason qui permet de calculer la distance à l'obstacle le plus proche devant le robot (pour éviter de rentrer dans un autre robot).](attachments/884deb27-5571-4e48-9b1e-d295cd0758a1.png " =169x169") | ![La carte Arduino programmable qui contrôlera le robot](attachments/00f22b5d-70e9-442c-96cb-9eec07f952e7.png " =191x191") | +|--------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------| + +Tous ces composants mis ensemble donnent une première version du modèle 3D pour le robot: + +![Le servomoteur et le bouton d'arrêt d'urgence n'ont pas encore été ajoutés.](attachments/d07af23f-a4d8-4cc7-b9c3-c1dec43dc385.png " =573x457") + +### Superstar + +La superstar est aussi un robot qui, après la 85ᵉ seconde, en 15s, part depuis la zone 4 de l'équipe, mais elle doit +cette fois-ci rejoindre la scène (une plateforme surélevée de 5,5 cm). Pour marquer un maximum de points, elle doit être +au plus proche du bord de la scène. + +![L'accès à la scène de l'équipe jaune](attachments/daf4bfd8-9d61-4100-8480-2e537e2b84ea.png " =255x286") + +L'idée pour ce robot est d'utiliser, à l'arrière, deux capteurs de distance infrarouge _(même principe de fonctionnement +que les ultrasons, mais avec de la lumière)_. Pour pouvoir mesurer une distance, un mur serait ajouté dans la partie de +calcul déporté pour avoir un obstacle à détecter. + +![La scène et, en jaune et bleu, derrière la scène, la zone de calcul déporté des deux équipes.](attachments/537ac060-92c9-4a1d-9027-45a517ac186e.png " =573x214") + +### Le robot principal + +Son rôle principal est de déposer la banderole en début de match, et idéalement pousser des conserves surmontées d'une +planche en bois dans des zones de construction pour former des estrades, ainsi que de finir en zone d'arrivée (zone n°2) +avant la fin du match, c'est-à-dire avant la 100ᵉ seconde écoulée. + +La conception du PCB du robot principal _(qui sera aussi utilisé par la superstar)_ est quasiment terminé ! + +| ![](attachments/de9b1b12-7366-47b0-83dc-5e96feb03d4d.png " =319x301") | ![](attachments/92d44062-ed48-474e-a511-02007a66efe1.png " =446x285") | +|-----------------------------------------------------------------------|-----------------------------------------------------------------------| + +Concernant le modèle 3D, il a été décidé de se concentrer sur les robots secondaires (groupies et superstar) le temps de +prototyper la banderole. Enfin, le début des tests du code du robot principal vont très bientôt commencer. + +![Le branchement des composants en préparation des tests.](attachments/f19056bc-a739-471c-81bb-a394bdfda197.png " =295x235") + +Et c'est sur ceci que la newsletter se termine ! On espère qu'elle aura été intéressante à lire et on vous remercie de +nous avoir lu ! + +*À bientôt,* + +Les CDROMS 📀 diff --git a/public/newsletters/25-20241217/attachments/223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png b/public/newsletters/25-20241217/attachments/223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png new file mode 100644 index 0000000..d714aa9 --- /dev/null +++ b/public/newsletters/25-20241217/attachments/223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea8739c8421874bc785f048f4fbe138ce3878d14e8b112819467d1b2f769241d +size 76954 diff --git a/public/newsletters/25-20241217/attachments/25364bf6-fefd-4326-9120-03c9e2b46183.png b/public/newsletters/25-20241217/attachments/25364bf6-fefd-4326-9120-03c9e2b46183.png new file mode 100644 index 0000000..890d0a6 --- /dev/null +++ b/public/newsletters/25-20241217/attachments/25364bf6-fefd-4326-9120-03c9e2b46183.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d430386948e0e18ee9c7e55841109b7e4f6ff8352f07d11f647b461edd1c898 +size 146903 diff --git a/public/newsletters/25-20241217/attachments/27d247cf-31d4-410e-93e1-ba389ae342c5.png b/public/newsletters/25-20241217/attachments/27d247cf-31d4-410e-93e1-ba389ae342c5.png new file mode 100644 index 0000000..95ee9ab --- /dev/null +++ b/public/newsletters/25-20241217/attachments/27d247cf-31d4-410e-93e1-ba389ae342c5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0961cc8fcc6a0f74d24d031e7bd2a0db99f7b1dab1e9e0e155fd6651adaf82f +size 527296 diff --git a/public/newsletters/25-20241217/attachments/3587c61f-687d-460b-a6b8-453b98449819.png b/public/newsletters/25-20241217/attachments/3587c61f-687d-460b-a6b8-453b98449819.png new file mode 100644 index 0000000..cc78523 --- /dev/null +++ b/public/newsletters/25-20241217/attachments/3587c61f-687d-460b-a6b8-453b98449819.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe92d2e532699a49ed8e2488f2d2f8b04f7ff8c8c525c9fbaa3f3eb472cb23af +size 191108 diff --git a/public/newsletters/25-20241217/attachments/3ddf656c-820a-435e-89b5-efac0b7350f5.png b/public/newsletters/25-20241217/attachments/3ddf656c-820a-435e-89b5-efac0b7350f5.png new file mode 100644 index 0000000..407249b --- /dev/null +++ b/public/newsletters/25-20241217/attachments/3ddf656c-820a-435e-89b5-efac0b7350f5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94205def3eabe5c2bdb5cef718128989a1e78ace36f34c100360985ccd9b33b6 +size 10352 diff --git a/public/newsletters/25-20241217/attachments/97c36253-610d-435e-b783-4fee4687f567.png b/public/newsletters/25-20241217/attachments/97c36253-610d-435e-b783-4fee4687f567.png new file mode 100644 index 0000000..2fd349a --- /dev/null +++ b/public/newsletters/25-20241217/attachments/97c36253-610d-435e-b783-4fee4687f567.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5018b713fec406518c409d38273d29aed0b7ed290601265e8c483a3c582d8b3a +size 2819576 diff --git a/public/newsletters/25-20241217/attachments/cb04eeda-a9d6-4f85-8523-663ba832a900.png b/public/newsletters/25-20241217/attachments/cb04eeda-a9d6-4f85-8523-663ba832a900.png new file mode 100644 index 0000000..16c5cd4 --- /dev/null +++ b/public/newsletters/25-20241217/attachments/cb04eeda-a9d6-4f85-8523-663ba832a900.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95b3382e2500abcf9500b6cc2bf9f15c3364f95706253410ce4a6adff22ed496 +size 57397 diff --git a/public/newsletters/25-20241217/attachments/e62d0c29-7205-4264-82fd-6ed31e7fa008.png b/public/newsletters/25-20241217/attachments/e62d0c29-7205-4264-82fd-6ed31e7fa008.png new file mode 100644 index 0000000..35ff7de --- /dev/null +++ b/public/newsletters/25-20241217/attachments/e62d0c29-7205-4264-82fd-6ed31e7fa008.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f0db5fe6b347ecf72d1f4b33d609f3572ddd83df5e2c466baad81a67465964f +size 10832 diff --git a/public/newsletters/25-20241217/attachments/f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png b/public/newsletters/25-20241217/attachments/f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png new file mode 100644 index 0000000..c407fb9 --- /dev/null +++ b/public/newsletters/25-20241217/attachments/f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ca94eb99fea9ed2aab28470d28f93118f7bfafefd6d8093d3672157dab8e821 +size 167253 diff --git a/public/newsletters/25-20241217/newsletter-171224.md b/public/newsletters/25-20241217/newsletter-171224.md new file mode 100644 index 0000000..4d488ec --- /dev/null +++ b/public/newsletters/25-20241217/newsletter-171224.md @@ -0,0 +1,84 @@ +# Décembre 2024 + +Bonjour à tous ! + +Nous vous souhaitons la bienvenue dans cette nouvelle newsletter des CDROMS. Quelques semaines se sont écoulées +depuis la dernière édition, et nous avons utilisé ce temps à bon escient : le projet avance de tous les côtés ! + +### Identité visuelle + +On a choisi pour nom d'équipe CDROMS, et avec ce p'tit nom, voici le tout nouveau logo de l'équipe : + +![Le nouveau logo CDROMS](attachments/97c36253-610d-435e-b783-4fee4687f567.png " =418x418") + +Un subtil mélange entre un disque et un engrenage, le tout orné d'un mignon visage souriant. Peut-être que cette petite +bouille pourrait même avoir un nom prochainement ? En attendant, il reste très content d'avoir pu trouver sa place au +sein du PCB principal : + +![Le logo sur le PCB](attachments/223fb9e3-fb36-4319-b0f7-ccded3fc8caa.png) + +### Banderole + +Du côté de la banderole, quelques avancées sont à souligner : le design décrit lors de la première newsletter a été +modifié pour mieux correspondre à nos contraintes, et des tests d'impression 3D ont été effectués, afin de modifier à +nouveau le design pour mieux coller à nos besoins. Il ne restera donc que des tests de déploiement pour s'assurer que la +banderole s'ouvre correctement et qu'elle est assez solide. Les différentes étapes (modélisation et tests d'impression +3D) sont décrites ci-dessous : + +| ![Le design : 2 bras reliés par un pivot, avec des attaches à une extrémité pour accrocher l'élastique afin de déployer la banderole](attachments/cb04eeda-a9d6-4f85-8523-663ba832a900.png " =228x433") | ![Les impressions 3D : tests sur la partie pivot, impression de tronçons de 5cm pour vérifier le modèle](attachments/25364bf6-fefd-4326-9120-03c9e2b46183.png " =342x437") | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ![](attachments/3ddf656c-820a-435e-89b5-efac0b7350f5.png " =304x215") ![Améliorations pour la partie pivotante (haut) et la partie pivot (bas)](attachments/e62d0c29-7205-4264-82fd-6ed31e7fa008.png " =304x181") | ![Les impressions 3D : ajout d'une partie bloquante afin d'arrêter la rotation de la banderole, déplacement du sillon sur le pivot pour garder l'élastique autour des bras](attachments/f3a687e2-d9f4-46b3-9a56-d34a691c3c0c.png " =380x376") | + +### PAMI ROS + +Pour le PAMI ROS (celui qui sera notre superstar), la modélisation a bien avancé ! Il ne manque plus qu'à mettre à jour +le modèle des roues, ajouter deux-trois boutons et un actionneur qui tournera à la fin du match (pour valider l'action) +et le tour est joué. En parallèle, les impressions 3D des pièces vont pouvoir commencer, ce qui permettra ensuite de +faire des tests plus poussés de navigation et du code. + +![Le magnifique PAMI ROS](attachments/3587c61f-687d-460b-a6b8-453b98449819.png " =385x279") + +### PAMI Arduino + +Quant aux PAMIs Arduino (ceux qui feront les groupies), les tests du code ont commencé. Il y a encore des améliorations +à y apporter, mais ça avance petit à petit. Malheureusement, il n'y a pas grand-chose de visuel à montrer… + +![Je recommande le shampooing de Rémi. Ah et, en jaune, les moteurs ; au milieu entouré de fils, le contrôleur des moteurs ; à droite, la carte Arduino. ](attachments/27d247cf-31d4-410e-93e1-ba389ae342c5.png " =453x330") + +### Mékèquecé *ROS* + +:::info +Comme il n'est pas toujours très facile de trouver des choses visuelles et parlantes pour le code du robot, *Mékèquecé* +*(mais +qu'est-ce que c'est)* une section qui tente de vulgariser des sujets en lien avec le développement du code du +robot. +::: + +ROS a déjà été mentionné plusieurs fois, voici donc une courte explication de ce que c'est et à quoi ça sert. ROS +(*Robot Operating System*) est, formellement, un *middleware*. Comprendre un logiciel, entre le système d'exploitation +(par exemple Windows, Linux ou MacOS) et d'autres logiciels, qui simplifie la communication de ces logiciels entre eux. +Et… c'est à peu près tout ! Utiliser ROS2 (la "2ᵉ" version de ROS) n'ajoute qu'un formalisme pour "découper" les +différentes tâches que le robot doit effectuer et des protocoles pour faire communiquer ces différentes tâches. + +Par exemple, l'une des tâches que le robot doit effectuer est de contrôler les moteurs des roues. Il y a donc une tâche, +que ROS appelle *node*, qui écoute sur un canal de communication les commandes de direction du robot. Quand cette node +reçoit un message disant "Tout droit avec une vitesse de 10 cm/s", elle calcule la vitesse de rotation adéquate pour la +roue gauche et la roue droite puis envoie ces valeurs aux moteurs. Et pouf ! Le robot se met à rouler ! Bien sûr, pour +que ça marche, il faut une autre node qui décide la vitesse du robot en fonction de l'action à faire. Cette node +utilisera, alors, le canal de communication pour indiquer la vitesse nécessaire pour aller là où il faut. + +Bon, je dois avouer que j'ai un peu menti… Bien que gérer la communication entre les différentes tâches soit encore plus +utile que vous ne l'imaginez (si si, encore en plus que ça), ROS a (beaucoup) d'autres avantages. Déjà, c'est un +logiciel énormément utilisé : du très connu [Turtlebot 3](https://www.turtlebot.com/turtlebot3/), +à [Pepper](https://aldebaran.com/en/pepper), en passant par le +terrifiant [Warthog](https://clearpathrobotics.com/warthog-unmanned-ground-vehicle-robot/), +une [longue liste de robots](https://robots.ros.org/) utilisent ou sont compatibles avec ROS. Encore plus intéressant, +la communauté de chercheurs en robotique et de passionnés partagent leurs codes. Il est donc possible d'utiliser toutes +ces ressources pour apprendre, s'en inspirer, ou les réutiliser ! + +C'est ainsi que cette deuxième newsletter se termine, on espère que sa lecture aura été intéressante et on vous remercie +encore de nous avoir lus ! + +*À bientôt,* + +Les CDROMS 📀 \ No newline at end of file diff --git a/public/newsletters/25-20250131/attachments/0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4 b/public/newsletters/25-20250131/attachments/0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4 new file mode 100644 index 0000000..b89129f --- /dev/null +++ b/public/newsletters/25-20250131/attachments/0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb029e1e543cfe61cdda7d14d6cd8eee1c4dff1afbec67db3f461037c9541301 +size 1234480 diff --git a/public/newsletters/25-20250131/attachments/1c3e36bb-253d-4832-9688-fbda10827a4f.png b/public/newsletters/25-20250131/attachments/1c3e36bb-253d-4832-9688-fbda10827a4f.png new file mode 100644 index 0000000..c0fbcc1 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/1c3e36bb-253d-4832-9688-fbda10827a4f.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc6eea7c99c12925e2c3238a63c0a66f7379d0a5ba0e1e94b6f9c062ea9e0352 +size 469507 diff --git a/public/newsletters/25-20250131/attachments/2cf6223b-644c-4a60-aec9-faba9715415a.png b/public/newsletters/25-20250131/attachments/2cf6223b-644c-4a60-aec9-faba9715415a.png new file mode 100644 index 0000000..cd2a159 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/2cf6223b-644c-4a60-aec9-faba9715415a.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1342ddb5cae7553f76482c95597e2fd14ad4c60bac8c691619653611420b0bf +size 941493 diff --git a/public/newsletters/25-20250131/attachments/3a7b76e7-04ab-44fc-9d4b-7e085659da45.png b/public/newsletters/25-20250131/attachments/3a7b76e7-04ab-44fc-9d4b-7e085659da45.png new file mode 100644 index 0000000..2960580 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/3a7b76e7-04ab-44fc-9d4b-7e085659da45.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16b1f5b4d9505e09d190753e6ca5ad57b1cd97102b2d0ca9b0323598fa3f631e +size 1286222 diff --git a/public/newsletters/25-20250131/attachments/57b88372-9bfa-4e26-8abe-dd2df4574714.png b/public/newsletters/25-20250131/attachments/57b88372-9bfa-4e26-8abe-dd2df4574714.png new file mode 100644 index 0000000..54e729c --- /dev/null +++ b/public/newsletters/25-20250131/attachments/57b88372-9bfa-4e26-8abe-dd2df4574714.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ffda86cb4c2aa3f1ede59c00f4ffb05432e1947952858a3b8886cbd41147e5 +size 352005 diff --git a/public/newsletters/25-20250131/attachments/6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png b/public/newsletters/25-20250131/attachments/6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png new file mode 100644 index 0000000..8ed2185 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:057a49b00b0da0ff6cfbb4f91fceba71f4caa6303bdf9f31db0483787d9ff4a2 +size 1399999 diff --git a/public/newsletters/25-20250131/attachments/92d44062-ed48-474e-a511-02007a66efe1.png b/public/newsletters/25-20250131/attachments/92d44062-ed48-474e-a511-02007a66efe1.png new file mode 100644 index 0000000..7d07798 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/92d44062-ed48-474e-a511-02007a66efe1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:740957ee7c722491d3894ee6eb8c744afa3037f6d911c6bebe0ba022885837f6 +size 172817 diff --git a/public/newsletters/25-20250131/attachments/937cc1ee-f0cf-4310-84a6-2a88e437717c.png b/public/newsletters/25-20250131/attachments/937cc1ee-f0cf-4310-84a6-2a88e437717c.png new file mode 100644 index 0000000..bc092b3 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/937cc1ee-f0cf-4310-84a6-2a88e437717c.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1ba8e5175292ae96382d11233c3d68102d829a1815618e3662b00ddd2d1fb0b +size 735739 diff --git a/public/newsletters/25-20250131/attachments/a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png b/public/newsletters/25-20250131/attachments/a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png new file mode 100644 index 0000000..772249c --- /dev/null +++ b/public/newsletters/25-20250131/attachments/a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17fa4fcc456045f3e1b44a228fde6b9eb81ca7f6bb297ee09cb610628f902128 +size 303340 diff --git a/public/newsletters/25-20250131/attachments/c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png b/public/newsletters/25-20250131/attachments/c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png new file mode 100644 index 0000000..cfd8a85 --- /dev/null +++ b/public/newsletters/25-20250131/attachments/c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49e66bd0a5ea398feac90a695db847529cdbdc593c2f8dd5f7fb93f533ccab19 +size 54867 diff --git a/public/newsletters/25-20250131/attachments/ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png b/public/newsletters/25-20250131/attachments/ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png new file mode 100644 index 0000000..636f1ea --- /dev/null +++ b/public/newsletters/25-20250131/attachments/ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2c73c5b83178c64260360b5fe88190f7eefcfcba48bdabd348745f42485238c +size 92331 diff --git a/public/newsletters/25-20250131/newsletter-310125.md b/public/newsletters/25-20250131/newsletter-310125.md new file mode 100644 index 0000000..076e4d2 --- /dev/null +++ b/public/newsletters/25-20250131/newsletter-310125.md @@ -0,0 +1,84 @@ +# Janvier 2025 + +Bonjour à tous et à toutes, + +Tous nos vœux pour cette nouvelle année ! Après des fins d'études, départs en stage, retours en France et autres +aventures d'étudiants ingénieurs, il est temps de lancer la troisième édition de la newsletter des CDROMS ! Les vacances +de Noël nous ont permis de nous reposer, mais aussi de bien avancer sur des sujets divers : mécanique, administratif, +électronique, commandes de composants… + +### Commandes, livraison et début des soudures pour les [PCB](https://fr.wikipedia.org/wiki/Circuit_imprim%C3%A9)s + +Nos magnifiques PCBs ont pu être commandés et sont arrivés ! + +![Charlie, Rémi et Sébastien se sont retrouvés pour faire la commande des PCBs et avancer un peu sur la Méca.](attachments/2cf6223b-644c-4a60-aec9-faba9715415a.png " =451x235") + +| ![Le PCB du robot principal (ce à quoi ça devrait ressembler à la fin)](attachments/92d44062-ed48-474e-a511-02007a66efe1.png " =417x267") | ![En vert à droite, les PCBs du robot principal ; en rouge à gauche, les PCBs pour les PAMIs Arduino.](attachments/6ff62c9a-4115-43f3-8e5f-29dae09d0ddc.png " =266x258") | +|-------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + +Rémi a aussi pu commencer à souder les composants montés en surface (SMD - Surface Mount Device). C'est une tâche pas si +facile qui demande beaucoup de patience et de sérénité *(vous allez très vite comprendre pourquoi).* Tout d'abord, il +faut commencer par fixer le PCB et appliquer de la pâte à souder (c'est un peu comme de l'étain, mais sous forme de +pâte). Puis, sans trembler, déposer chacun des ~~petits~~ minuscules composants au bon emplacement. + +*Il est possible de zoomer sur les images en passant le curseur dessus.* + +| ![On fixe le PCB.](attachments/a3d32195-b7e5-40e8-8c9c-a168e4fc428b.png " =171x142") | ![On utilise un pochoir en aluminium pour appliquer la pâte à souder.](attachments/ed43a0f2-2ea0-41db-a0b8-000d57cbefcb.png " =171x177") | ![On obtient alors une carte avec de la pâte à souder au bon endroit (par exemple au bout de la flèche).](attachments/3a7b76e7-04ab-44fc-9d4b-7e085659da45.png " =214x278") | ![Il faut alors placer tous les composants. Ici à gauche une résistance et à droite un emplacement de condensateur. Cette résistance ne fait que 1 mm par 0.5 mm !!](attachments/937cc1ee-f0cf-4310-84a6-2a88e437717c.png " =214x208") | +|--------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + +Enfin, on fait passer le PCB dans un four spécial qui fait fondre la pâte à souder ! + +[Le PCB passe dans le four. 408x496](attachments/0a9a6069-c509-43ac-a6d4-a0ee60ab976b.mp4) + +Il n'y a plus qu'à recommencer cinq fois pour faire tous les PCBs. + +### Les modèles 3Ds PAMI ROS et Arduino terminés ! + +Coté mécanique, cela avance aussi ! Les dernières modifications pour respecter les contraintes réglementaires ont été +faites sur les modèles ! + +| ![Modèle 3D des PAMIs Arduino (groupies)](attachments/57b88372-9bfa-4e26-8abe-dd2df4574714.png " =214x242") | ![Modèle 3D du PAMI ROS (Superstar)](attachments/1c3e36bb-253d-4832-9688-fbda10827a4f.png " =214x245") | +|-------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------| + +Certaines pièces 3D ont pu être imprimées. Il ne reste "plus qu'à" vérifier que ces deux modèles théoriques +résistent à la réalité *(pas toujours très gentille)*. À suivre… + +### Mékèquecé *git* + +:::info +Comme il n'est pas toujours très facile de trouver des choses visuelles et parlantes pour le code du robot, *Mékèquecé* +*(mais qu'est-ce que c'est)* est une section qui tente de vulgariser des sujets en lien avec le développement du code du +robot. +::: + +En général, quand on développe un logiciel, on fait des bêtises *(sauf nous, bien sûr* :innocent:*)*. Et quand on fait +des bêtises, il faut ensuite les corriger… On se retrouve alors avec deux versions, l'ancienne version et la version +corrigée. Puis un nouveau bug… "Crotte !"… Une troisième version… Et maintenant, voilà qu'il faut aussi ajouter une +nouvelle fonctionnalité parce qu'on aimerait que le robot sache reculer *(si si, une équipe s'est déjà présentée au +trophée avec un robot qui ne pouvait pas reculer)* ! + +Vous l'aurez compris, il nous faut un système de gestion de versions. Ça tombe bien, *git*, créé initialement par Linus +Torvalds *(il a aussi créé Linux)*, va régler une grande partie de nos problèmes. + +Dans git, à chaque fois que l'on veut créer une version, on crée un *commit*. Sous le tapis, git ne stocke que les +différences entre l'ancienne et la nouvelle version. Par exemple, ci-dessous voici une partie d'un (très petit) commit +qui ajoute les scores de l'année prochaine _(les newsletters de 2025 ont été légèrement modifiées lors de leur +publication sur le site en juillet 2026)_. + +![En rouge les suppressions, en vert les ajouts. Git ne stocke que ces lignes (et quelques-unes avant et après pour optimiser la détection de modification).](attachments/c5af607c-cacc-4ee0-a298-5a9c1ceeea3c.png) + +En plus, à chaque *commit*, il est possible d'ajouter un commentaire pour décrire ce qui a été modifié et pourquoi. + +Un deuxième concept important de git est le système de branches. Elles permettent de travailler en parallèle sur +plusieurs versions. Par exemple, une branch cherche à corriger un bug pendant qu'une autre est pour ajouter une nouvelle +fonctionnalité. Ensuite, une fois que tout prêt, ces branches peuvent être fusionnées. En plus, comme git n'enregistre +que la partie modifiée des fichiers, lorsqu'une fusion est effectuée, il n'a besoin d'aide que s'il y a eu deux +modifications au même endroit du même fichier (pour choisir quelle version garder). + +Enfin, pour encore plus faciliter le travail en équipe, git permet de stocker les *commits* sur un serveur auquel les +membres de l'équipe ont accès. Dans notre cas, nous utilisons un serveur "GitLab" qui permet notamment de stocker des +"dossiers" partagé git. + +À très bientôt pour la 4ᵉ édition (déjà !!!), + +Les CDROMS 📀 diff --git a/public/newsletters/25-20250308/attachments/19b95a70-cb86-477f-8c19-79c508007018.jpg b/public/newsletters/25-20250308/attachments/19b95a70-cb86-477f-8c19-79c508007018.jpg new file mode 100644 index 0000000..405f89b --- /dev/null +++ b/public/newsletters/25-20250308/attachments/19b95a70-cb86-477f-8c19-79c508007018.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ac428f0a1e829451d00ebc4707d9d9c5a51e9b26af0a3807bd504daf2713127 +size 147363 diff --git a/public/newsletters/25-20250308/attachments/36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png b/public/newsletters/25-20250308/attachments/36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png new file mode 100644 index 0000000..60159a0 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b74c342f3a941ec988d3cb7d642f47d612312d3a79ee28a1efa7ac079f233f5a +size 960873 diff --git a/public/newsletters/25-20250308/attachments/3b984c2e-2be0-494f-8d00-f255eb979f0f.png b/public/newsletters/25-20250308/attachments/3b984c2e-2be0-494f-8d00-f255eb979f0f.png new file mode 100644 index 0000000..3dabec9 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/3b984c2e-2be0-494f-8d00-f255eb979f0f.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b209bb086496acb515a49a3bfed64ec04dba3598cf597b463cb5c033a2cff6c +size 37401 diff --git a/public/newsletters/25-20250308/attachments/50ec0ef3-db46-4581-bd91-3b58ad2b343d.png b/public/newsletters/25-20250308/attachments/50ec0ef3-db46-4581-bd91-3b58ad2b343d.png new file mode 100644 index 0000000..4181305 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/50ec0ef3-db46-4581-bd91-3b58ad2b343d.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c96c1a314ec10b36c3797ee1e21786ce7c769ff609718fdc1281eb74326c9b3 +size 70647 diff --git a/public/newsletters/25-20250308/attachments/815ebe5c-b97a-4731-863c-94f337a85a3e.jpg b/public/newsletters/25-20250308/attachments/815ebe5c-b97a-4731-863c-94f337a85a3e.jpg new file mode 100644 index 0000000..75f6447 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/815ebe5c-b97a-4731-863c-94f337a85a3e.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ac5eee269870bc71bf45e5d590a08c42d2803f7f0d72730d9063de92fef69f8 +size 495521 diff --git a/public/newsletters/25-20250308/attachments/8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png b/public/newsletters/25-20250308/attachments/8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png new file mode 100644 index 0000000..b1fd27d --- /dev/null +++ b/public/newsletters/25-20250308/attachments/8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2407a5970e5b845122861b26ac235b3e761855cfeacfbde3d01ce21c3a8492ff +size 34590 diff --git a/public/newsletters/25-20250308/attachments/955cd0cf-6d8f-467b-b813-a38d097c6d61.gif b/public/newsletters/25-20250308/attachments/955cd0cf-6d8f-467b-b813-a38d097c6d61.gif new file mode 100644 index 0000000..d0edf70 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/955cd0cf-6d8f-467b-b813-a38d097c6d61.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:441b91fb7cf7405770546c135153837d8f420e5063e172e4a4098e27ac168dae +size 2448362 diff --git a/public/newsletters/25-20250308/attachments/a710ed13-4799-4491-80cd-3e06502ffe32.gif b/public/newsletters/25-20250308/attachments/a710ed13-4799-4491-80cd-3e06502ffe32.gif new file mode 100644 index 0000000..c58ebbe --- /dev/null +++ b/public/newsletters/25-20250308/attachments/a710ed13-4799-4491-80cd-3e06502ffe32.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2195df2cb39c77a58908f49c66d2e508b1af9c733ef86e131b195661c975d51c +size 1020884 diff --git a/public/newsletters/25-20250308/attachments/c3750741-dd0b-4a19-958f-6fe4b3c719ce.png b/public/newsletters/25-20250308/attachments/c3750741-dd0b-4a19-958f-6fe4b3c719ce.png new file mode 100644 index 0000000..dadfa5c --- /dev/null +++ b/public/newsletters/25-20250308/attachments/c3750741-dd0b-4a19-958f-6fe4b3c719ce.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca23f801e764dea23d878eb81d4f97c4799e31356a4b24aa1fda53c76a3af22b +size 166820 diff --git a/public/newsletters/25-20250308/attachments/cbf87de6-bd8d-4c37-b167-b2e649fc3693.png b/public/newsletters/25-20250308/attachments/cbf87de6-bd8d-4c37-b167-b2e649fc3693.png new file mode 100644 index 0000000..cb60b90 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/cbf87de6-bd8d-4c37-b167-b2e649fc3693.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb372b782563a3598d67d6c75437fab70597222096812b972f32faf85ea7c358 +size 786603 diff --git a/public/newsletters/25-20250308/attachments/d91f1070-6096-417e-8610-c73f360e7c6c.jpg b/public/newsletters/25-20250308/attachments/d91f1070-6096-417e-8610-c73f360e7c6c.jpg new file mode 100644 index 0000000..95dbb92 --- /dev/null +++ b/public/newsletters/25-20250308/attachments/d91f1070-6096-417e-8610-c73f360e7c6c.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e7e493c3fbe52e2bfbfab1f9d27da58f05f48cd8c4763df47548fddfe78f966 +size 550603 diff --git a/public/newsletters/25-20250308/newsletter-080325.md b/public/newsletters/25-20250308/newsletter-080325.md new file mode 100644 index 0000000..2e7e0ef --- /dev/null +++ b/public/newsletters/25-20250308/newsletter-080325.md @@ -0,0 +1,112 @@ +# Mars 2025 + +Bonjour tout le monde ! + +On espère que tout va pour le mieux : de notre côté, les robots commencent à prendre forme (*heureusement, c'est dans +trois mois*) ! + +Voilà quelques semaines que nos rythmes de vie à chacun sont établis, ce qui nous permet de caler des créneaux de +travail en groupe plus réguliers, avec de belles avancées, et des phases de tests plus courtes que celles auxquelles +nous sommes habitués depuis octobre, ce qui re-motive les troupes et apporte une belle satisfaction à nos longues +journées de labeur d'ingénieurs. Place au récit de nos récentes aventures et avancées ! + +![Ousmane et Martin en appel, Sébastien et Charlie au QG ](attachments/19b95a70-cb86-477f-8c19-79c508007018.jpg "right-50 =190x253") + +## Le retour à l'ESCAL + +Fin janvier, avant le début des stages, de chacun, nous avons contacté le club de robotique de l'ESCAL afin de +rencontrer les jeunes qui ont pris la relève pour le Trophée : une équipe plutôt intéressée par nos divers parcours, +avec pas mal d'idées. Rémi et Sébastien ont mis la main à la pâte avec des explications et de l'aide sur leurs systèmes. +Et une super photo devant l'ESCAL pour les souvenirs ! + +| ![](attachments/815ebe5c-b97a-4731-863c-94f337a85a3e.jpg "right-50 =190x338") | ![](attachments/d91f1070-6096-417e-8610-c73f360e7c6c.jpg "left-50 =190x338") | ![](attachments/cbf87de6-bd8d-4c37-b167-b2e649fc3693.png "left-50 =190x338") | +|-------------------------------------------------------------------------------|------------------------------------------------------------------------------|------------------------------------------------------------------------------| + +## Calibration et tests des capteurs de distance du PAMI ROS + +Enfin un peu d'informatique facilement explicable ! + +Vous l'avez peut-être remarqué, le PAMI ROS utilise deux capteurs de distance pour faciliter la détection d'un petit mur +derrière lui (et donc éviter de tomber de la scène - *ça ferait un moins bon concert*). + +![Capteurs de distance à l'arrière du robot pour détecter le mur.](attachments/c3750741-dd0b-4a19-958f-6fe4b3c719ce.png " =257x185") + +L'utilisation de deux capteurs de chaque côté du robot permet de s'assurer que le robot avance bien tout droit et ne +risque pas de tomber sur un côté. + +Mais… pour que cela fonctionne, il faut que le capteur donne une mesure juste (proche de la vraie valeur) et ait une +bonne fidélité (que la valeur ne change pas lorsqu'on mesure la même chose). Lorsqu'on combine ces deux +caractéristiques, on parle d'exactitude. + +Seulement voilà… Lorsque le capteur est calibré à 35 cm, on obtient le graphe ci-dessous. En abscisse, la distance +réelle entre le capteur et l'obstacle et en ordonnée, la distance que le capteur mesure. + +![L'écart entre les courbes orange et bleue est l'erreur de mesure.](attachments/8b52fb51-46c2-4bd5-8e0c-78aad47db6e3.png " =342x257") + +Ce qui est encore plus ~~drôle~~ triste, c'est que si la calibration est faite à une autre distance (la procédure de +calibration prend en compte la distance au moment de la calibration, elle ne devrait doc pas être impactée +significativement par cette distance), la courbe des erreurs "se déplace" et donne désormais le graphe ci-dessous. + +![Désormais le pic d'erreur est de 6 cm à 35 cm de distance au lieu de 11 cm à 10 cm de distance.](attachments/3b984c2e-2be0-494f-8d00-f255eb979f0f.png " =385x289") + +Heureusement, il y a plusieurs possibilités d'amélioration : pour la première, le capteur utilisé avait été précédemment +modifié électroniquement, ce qui pourrait affecter la mesure, peut-être que les capteurs tout neufs seront plus justes +dans leur mesure. Pour la seconde, il est possible avec des petites fonctions mathématiques de perdre en fidélité, mais +gagner en justesse puis, en utilisant plusieurs mesures, de regagner en fidélité (magie magie !!). + +*Suite au prochain épisode* + +## La banderole avance à grands pas + +La banderole, élément essentiel de la promotion de notre spectacle, connait de grandes avancées : plusieurs impressions +et re-designs ont eu lieu ces dernières semaines : le design montré ci-dessous n'est donc pas la version finale mais +explique bien le concept. Notre robot principal tiendra notre banderole pliée, avant de la lâcher au-dessus du rebord de +la table, pour qu'elle se déplie par la force de l'élastique qui la retient fermée à l'arrière. Le nouveau design +contient 2 bras qui se déplient symétriquement pour assurer qu'elle ne bascule pas lors de sa chute. + +![première impression fonctionnelle avec accroche du tissu](attachments/955cd0cf-6d8f-467b-b813-a38d097c6d61.gif " =380x257") + +Pour le contenu affiché sur la banderole, c'est en cours de réflexion et de conception, mais tous les membres de +l'équipe ont pu participer à la conception en apportant une petite idée personnelle qui y figurera. + +## Validation du fonctionnement de la communication avec le servomoteur + +Après quelques péripéties (beaucoup de débrouillardise), il a été possible de valider que la carte de contrôle (la +Raspberry Pi) peut contrôler les AX12 (l'un de nos types de servomoteurs) ! + +Pour cela, on a dû inverser la connexion de deux connecteurs pour qu'un petit "mixeur" de signal soit correctement +connecté. Ce petit "mixeur" est nécessaire puisque le AX12 n'a qu'un seul canal de communication à la fois pour recevoir +des instructions et y répondre tandis que la Raspberry Pi a un canal pour envoyer et un pour recevoir. + +![Les signaux bleu et rouge se combinent pour former le signal violet en fonction du signal jaune.](attachments/36ec5713-ef5e-4bfe-98b6-f78b9c74f9a8.png " =342x424") + +Ensuite, il faut faire attention à bien synchroniser les envois d'instructions. En particulier parce que la carte de +contrôle doit envoyer un 3eme signal au "mixeur" : ce signal indique lequel, entre l'envoi et la réception, doit être +utilisé. La synchronisation de ce 3eme signal est crucial : si sa valeur est changée trop tôt, l'instruction envoyée par +la Raspberry ne sera pas encore terminée (et sera coupée, donc incompréhensible pour l'AX12), tandis que si elle est +changée trop tard, ce sera le même problème mais pour la réponse du AX12 (qui sera cette fois-ci incompréhensible pour +la Raspberry). + +En choisissant bien les paramètres de communication (notamment le délai de réponse du AX12), on peut obtenir la +communication sur l'image ci-dessous. + +![Le signal jaune décide si c'est la Raspberry pi ou l'AX12 qui envoie (l'autre écoute). S'il est en haut alors c'est la Raspberry Pi qui envoie l'instruction. Le signal violet est le signal pour envoyer et recevoir les instructions.](attachments/50ec0ef3-db46-4581-bd91-3b58ad2b343d.png " =428x181") + +Ainsi, la première instruction est celle envoyée par la Raspberry Pi. Une fois décodée, on lit FFFF040201F8. +Chaque groupe de 2 "chiffres" a une signification particulière, par exemple 04 est l'identifiant du moteur et 01 est l' +action à réaliser. Dans le cas présent, ce message peut se traduire par "moteur n°4 tu es là ?". Le moteur répond alors +FFFF040200F9, voulant dire "moi, moteur n°4, je vais bien". Toute cette communication va très vite, ici l'envoi et la +réponse prennent 0,00011 seconde, et le délai entre la fin de l'envoi et la réponse est de 0,00039 seconde. + +Avec toutes ces vérifications, on est parés pour faire tourner le moteur (voir ci-dessous) ! Cela permet aussi de +vérifier que la carte électronique envoie bien les bonnes tensions (en Volts) et intensité (en Ampères). + +![](attachments/a710ed13-4799-4491-80cd-3e06502ffe32.gif " =200x200") + +Cette fois-ci, pas de Mékèquecé : on a déjà raconté plein de choses ! + +Merci pour votre lecture attentive :) + +A très vite, + +Les CDROMS 📀 \ No newline at end of file diff --git a/public/newsletters/25-20250518/attachments/47377c33-011f-4bcb-9321-7777bfb063b4.mp4 b/public/newsletters/25-20250518/attachments/47377c33-011f-4bcb-9321-7777bfb063b4.mp4 new file mode 100644 index 0000000..dc5e5b4 --- /dev/null +++ b/public/newsletters/25-20250518/attachments/47377c33-011f-4bcb-9321-7777bfb063b4.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18b919ce93adc9eba9f239fec1ac40a2c01c777f468381226eea8fc1dc7a2cb4 +size 4955613 diff --git a/public/newsletters/25-20250518/attachments/634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4 b/public/newsletters/25-20250518/attachments/634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4 new file mode 100644 index 0000000..4427d5c --- /dev/null +++ b/public/newsletters/25-20250518/attachments/634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73357df9a0ddd73ff4fa5ac31ba27469b8d14ba352311c9f8928b28730398108 +size 2493787 diff --git a/public/newsletters/25-20250518/attachments/6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png b/public/newsletters/25-20250518/attachments/6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png new file mode 100644 index 0000000..d2c3c80 --- /dev/null +++ b/public/newsletters/25-20250518/attachments/6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3be24984f3c4729052099017f52df81afe01a704e7454af5a2d2814eb5070789 +size 870644 diff --git a/public/newsletters/25-20250518/attachments/6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png b/public/newsletters/25-20250518/attachments/6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png new file mode 100644 index 0000000..f81e70e --- /dev/null +++ b/public/newsletters/25-20250518/attachments/6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a2d4b00aa8d632b5b0f307c4f5259299a33b28f48e61c0b8f83d0e843242620 +size 1026324 diff --git a/public/newsletters/25-20250518/attachments/98c8cee3-ed20-4cca-9fef-780db5973baf.png b/public/newsletters/25-20250518/attachments/98c8cee3-ed20-4cca-9fef-780db5973baf.png new file mode 100644 index 0000000..05f83d6 --- /dev/null +++ b/public/newsletters/25-20250518/attachments/98c8cee3-ed20-4cca-9fef-780db5973baf.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05639669ec73039f0e6292933c4de0405564d1a2ec1a0d65146a4e38424c26a7 +size 1062255 diff --git a/public/newsletters/25-20250518/attachments/d8cacaee-7fe2-470b-b703-3343718413c5.mp4 b/public/newsletters/25-20250518/attachments/d8cacaee-7fe2-470b-b703-3343718413c5.mp4 new file mode 100644 index 0000000..e101b51 --- /dev/null +++ b/public/newsletters/25-20250518/attachments/d8cacaee-7fe2-470b-b703-3343718413c5.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d03c9363f8dd898cf69bbee1b05f36dd4ca5542cbf2aebb182286c5417a4739 +size 2978666 diff --git a/public/newsletters/25-20250518/attachments/df4641fe-19f7-4d6c-888a-1a50728d004b.mp4 b/public/newsletters/25-20250518/attachments/df4641fe-19f7-4d6c-888a-1a50728d004b.mp4 new file mode 100644 index 0000000..cb6d538 --- /dev/null +++ b/public/newsletters/25-20250518/attachments/df4641fe-19f7-4d6c-888a-1a50728d004b.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd2ed3a07514930e5d579fcd224cfd0028723fc19802c1299c30829233378901 +size 1012850 diff --git a/public/newsletters/25-20250518/attachments/faef2ecf-ef45-4851-ad35-aee0865eef83.mp4 b/public/newsletters/25-20250518/attachments/faef2ecf-ef45-4851-ad35-aee0865eef83.mp4 new file mode 100644 index 0000000..88c2bbe --- /dev/null +++ b/public/newsletters/25-20250518/attachments/faef2ecf-ef45-4851-ad35-aee0865eef83.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b19114904e5989abe67c4ec4d949bb97e4dc43c09c0ce860ea2ce129c7023109 +size 601052 diff --git a/public/newsletters/25-20250518/newsletter-180525.md b/public/newsletters/25-20250518/newsletter-180525.md new file mode 100644 index 0000000..1a52731 --- /dev/null +++ b/public/newsletters/25-20250518/newsletter-180525.md @@ -0,0 +1,80 @@ +# Mai 2025 + +Bonjour à tous, + +Comme vous le savez probablement, la coupe est dans maintenant moins de deux semaines. Et on s'est dit qu'entre deux +petites corrections de bug, on allait écrire une dernière newsletter avant la coupe ! Les robots commencent +(heureusement) à ressembler à quelque chose ! + +## PAMI Arduino (Groupies) + +Le plus petit (et mignon) de nos robots est terminé d'un point de vue mécanique depuis quelques semaines : + +| ![Le robot](attachments/6f07ede0-9ceb-4fbe-be96-47f764b3aea2.png " =214x255") | ![Le robot avec sa décoration : un porte-bonheur](attachments/98c8cee3-ed20-4cca-9fef-780db5973baf.png " =256x331") | +|-------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| + +Et après une enquête approfondie sur les signaux de la carte, le code est également opérationnel : le PAMI est +totalement prêt à être utilisé ! Il ne reste plus qu'à définir ses stratégies de mouvement pour rapporter un maximum de +points pendant la coupe. + +[Le PAMI avance, recule, et fait même un tour sur lui-même ! 257x457](attachments/47377c33-011f-4bcb-9321-7777bfb063b4.mp4) + +## PAMI ROS (Superstar) + +La superstar, après quelques complications (liées au poids maximal), est elle aussi homologable ! + +Concernant le code, il est quasiment terminé (et déjà homologable) et elle sait déjà aller faire la fête au bord de la +scène : + +[La superstar s'approche du bord de la scène (pas encore au bout du bout, mais c'est un bon départ) 257x450](attachments/d8cacaee-7fe2-470b-b703-3343718413c5.mp4) + +## Robot principal + +Le robot principal a été usiné et assemblé. Les plaques en bois ont été découpées à la découpe laser. La plupart des +autres pièces ont été faites en impression 3D. + +[Découpe laser 257x457](attachments/634be1d8-3332-4d89-969e-2dd7bc4f118b.mp4) + +Après quelques itérations et beaucoup d'heures d'impression, cela donne un magnifique robot : + +![Le robot principal](attachments/6e5c1fd3-ec3c-4f5e-a74d-43941ece44bb.png " =257x377") + +Ensuite, il faut s'assurer que le robot est capable de se déplacer et de connaître sa position précisément. + +[Le robot tourne en rond pendant que pleins d'indicateurs sont enregistrés pour permettre de quantifier la précision de divers systèmes. 640x360](attachments/df4641fe-19f7-4d6c-888a-1a50728d004b.mp4) + +Une fois tout cela validé, on peut maintenant générer des trajectoires en fonction d'une position à rejoindre et des +obstacles détectés par le LiDAR. + +## Banderole + +Une très (très) bonne nouvelle est que la banderole fonctionne aussi bien que ce qu'on aurait pu espérer ! Sur la vidéo, +le robot s'avance et lâche la banderole qui tombe sur le bord de la table (ici matérialisé par la pièce blanche scotchée +sur le bureau) : + +[Test de la banderole 642x362](attachments/faef2ecf-ef45-4851-ad35-aee0865eef83.mp4) + +Même si ça ne se voit pas très bien _(cadrer à une main tout en vérifiant que tout se passe bien, c'est pas si facile en +fait)_, la banderole tombe exactement là où on veut et s'ouvre sans se déséquilibrer. + +L'image finale de la banderole reste une surprise jusqu'à la Coupe ! + +## Informations coupe de France + +Ce qui fait une transition évidente, comment voir cette magnifique banderole à la Coupe ? + +La coupe se déroule du 28 mai au 31 mai à +l'[Expo park les Oudairies à la Roche-sur-Yon](https://www.google.com/maps/place/The+Expo+Park+Oudairies/@46.6712064,-1.4066902,17z/data=!3m1!4b1!4m6!3m5!1s0x48042f7770ab5d6d:0xf37306cd60b950a!8m2!3d46.6712027!4d-1.4041153!16s%2Fg%2F1w0p4_gm?entry=ttu&g_ep=EgoyMDI1MDIyNi4xIKXMDSoJLDEwMjExNDU1SAFQAw%3D%3D). +Le 28 mai aprèm et soir, ce ne sont que les homologations (on y sera, mais ce n'est pas très intéressant et probablement +pas encore ouvert au public). Ensuite, il y a 5 séries (29 matin/aprèm, 30 matin/aprèm et 31 matin) et, si on se +qualifie, les phases finales (31 aprèm). Les finales européennes sont le 31 en soirée. Après, ça, il y a vraiment peu de +chance qu'on y aille cette année. + +Pour celles et ceux qui voudraient suivre la coupe sans se déplacer, c'est tout à fait possible, en regardant les lives +sur la chaîne Youtube de la coupe : . + +Rendez-vous sur le live ou à la coupe, + +À très vite, + +Les CDROMS 📀 \ No newline at end of file diff --git a/public/newsletters/25-20250615/attachments/1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif b/public/newsletters/25-20250615/attachments/1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif new file mode 100644 index 0000000..b802c42 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cc1c45b56fc2bdebdb65fcc3696a1df51ad8549ef0b900196b934a6cf756fec +size 3290739 diff --git a/public/newsletters/25-20250615/attachments/32034515-59f5-4357-a5c9-f49b1898636d.gif b/public/newsletters/25-20250615/attachments/32034515-59f5-4357-a5c9-f49b1898636d.gif new file mode 100644 index 0000000..9e8e2a5 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/32034515-59f5-4357-a5c9-f49b1898636d.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:754bc01c94a3cccf9424071aca6d288bb77c977ae6cce5cf32a0a6cad2cf44a7 +size 220848 diff --git a/public/newsletters/25-20250615/attachments/3d99d404-1256-4a21-a546-17f68d53bd1f.png b/public/newsletters/25-20250615/attachments/3d99d404-1256-4a21-a546-17f68d53bd1f.png new file mode 100644 index 0000000..1149a19 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/3d99d404-1256-4a21-a546-17f68d53bd1f.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7ba19386c63ff2264566fb0ab878fe5ea2d29bbca6276134715cdba8c7cc232 +size 156868 diff --git a/public/newsletters/25-20250615/attachments/5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg b/public/newsletters/25-20250615/attachments/5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg new file mode 100644 index 0000000..7e6de00 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eabcb409a5bb5614063e11b5e5bedc75608e5e9a9c021f8717f33f82ab812e73 +size 3521846 diff --git a/public/newsletters/25-20250615/attachments/84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png b/public/newsletters/25-20250615/attachments/84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png new file mode 100644 index 0000000..ad4c7f7 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4f63fea7ce5af8cccc1a83989f30ff70144666ec59b55b0a4a879e7d5d2878d +size 636441 diff --git a/public/newsletters/25-20250615/attachments/91acd38d-a946-4859-b4d0-8675b6d601bb.png b/public/newsletters/25-20250615/attachments/91acd38d-a946-4859-b4d0-8675b6d601bb.png new file mode 100644 index 0000000..a52322b --- /dev/null +++ b/public/newsletters/25-20250615/attachments/91acd38d-a946-4859-b4d0-8675b6d601bb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f30b45863d4b53b97a9fd9c7f3ddc50e6da1716f8de3037a8dc2f0a56835bf1a +size 240100 diff --git a/public/newsletters/25-20250615/attachments/ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif b/public/newsletters/25-20250615/attachments/ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif new file mode 100644 index 0000000..3da66b1 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e8bb84dfb2ebad401659d7887b4e5b4407b2702ef9688e112167d3c3a2b4859 +size 1644107 diff --git a/public/newsletters/25-20250615/attachments/dc4b5322-0761-4218-9da8-30e82d8b6d46.png b/public/newsletters/25-20250615/attachments/dc4b5322-0761-4218-9da8-30e82d8b6d46.png new file mode 100644 index 0000000..8831e7a --- /dev/null +++ b/public/newsletters/25-20250615/attachments/dc4b5322-0761-4218-9da8-30e82d8b6d46.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae136cd10585c591e4addef376041be4edc20d3862faca19a9a1e67934891323 +size 222753 diff --git a/public/newsletters/25-20250615/attachments/ec660e39-38d0-4f39-a97d-66143f3292a9.gif b/public/newsletters/25-20250615/attachments/ec660e39-38d0-4f39-a97d-66143f3292a9.gif new file mode 100644 index 0000000..02b2ce1 --- /dev/null +++ b/public/newsletters/25-20250615/attachments/ec660e39-38d0-4f39-a97d-66143f3292a9.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca6adc9db5c325b73337cbf3c3707acd88b6c3df34e23701fec4a4917914447e +size 3303124 diff --git a/public/newsletters/25-20250615/newsletter-150625.md b/public/newsletters/25-20250615/newsletter-150625.md new file mode 100644 index 0000000..d067cec --- /dev/null +++ b/public/newsletters/25-20250615/newsletter-150625.md @@ -0,0 +1,103 @@ +# Juin 2025 + +Bonjour tout le monde ! + +Il y a deux semaines s'est déroulée la Coupe de France. Maintenant qu'on a un peu récupéré, on vous raconte comment ça +s'est passé ! + +La Coupe a commencé le mercredi par l'homologation, dans l'après midi, du premier groupie. + +![Le premier de nos robots à être homologué](attachments/3d99d404-1256-4a21-a546-17f68d53bd1f.png) + +Dans la soirée, avec l'arrivée du reste de l'équipe, la superstar et le robot principal partent en homologation. La +superstar s'homologue +sans aucun problème ; pour le robot principal, il doit repasser pour l'homologation dynamique. Elle consiste à vérifier +que le robot peut marquer au moins 1 point et ne pas entrer en collision avec d'autres robots. Malgré plusieurs +tentatives, le robot principal n'est pas homologué le mercredi soir… Mais ce n'est que partie remise au lendemain +matin ! Après une petite nuit de sommeil et quelques lignes de code, les robots sont homologués. + +| ![](attachments/dc4b5322-0761-4218-9da8-30e82d8b6d46.png " =304x285") | ![](attachments/84ecbbba-57c4-472a-962c-1bf7d6a39f1c.png " =380x261") | +|-----------------------------------------------------------------------|-----------------------------------------------------------------------| + +Et c'est parti pour notre premier match ! 3… 2… 1… Départ ! Le robot recule et place la banderole qui se déplie et +révèle +notre magnifique design. + +![Série 2 : le robot principal déploie la banderole](attachments/ceb2453c-be73-4e72-b2e7-0b9f853b5521.gif " =471x265") + +![Le design de la banderole](attachments/91acd38d-a946-4859-b4d0-8675b6d601bb.png " =556x313") + +Pas de temps à perdre, le robot repart vers sa zone de fin. Malheureusement, sur le chemin, il rencontre le robot +adverse (qui avait démarré sur la droite). Comme prévu, le système anticollision s'active et ralentit le robot. +Seulement, le robot adverse a une petite pièce qui dépasse et qui vient se prendre dans le carénage du robot. Pour +éviter la casse, les arbitres déclenchent notre bouton d'arrêt d'urgence. + +Heureusement notre match n'est pas encore terminé ! La superstar va s'élancer sur la scène. *Les groupies sont quant à +elles restées à la maison pour être encore plus prêtes pour le prochain show (suite à un petit problème technique de +dernière minute).* + +![Série 2 : La superstar s'élance sur la scène](attachments/1ea3aa42-07c3-4ef7-add0-7a1aed7a995f.gif " =428x241") + +La superstar arrive sur la scène, mais est à court de temps pour avancer plus proche de la fosse. Elle se met tout de +même +à faire la fête ! + +100 secondes viennent de s'écouler, notre premier match se termine avec un honorable score de 56 points. + +Il est maintenant temps d'améliorer encore les robots : on augmente les vitesses, change les angles et on teste *(teste +teste teste).* + +Vendredi matin, c'est l'heure de la 3ᵉ série ! Tout se passe bien du côté de la banderole, alors que côté superstar… +elle voulait tellement faire la fête qu'elle fait un faux départ *(j'ai oublié de remettre le délai d'attente après des +tests, oupsi…).* Heureusement, les deux groupies ne sont pas là pour rigoler, et viennent se placer devant la scène +parfaitement pour faire le show. Le robot principal lui vient se ranger dans l'arrière scène pour laisser place au +show ! 71 points pour une série 3 rondement menée. + +![Série 3 : La superstar et les groupies font la fête](attachments/ec660e39-38d0-4f39-a97d-66143f3292a9.gif " =428x241") + +Avant le match de l'après-midi, on a tout juste le temps de continuer à améliorer la superstar et les groupies que c'est +déjà reparti ! + +Pour cette 4ᵉ série, la banderole se déploie encore à merveille — *Qu'est-ce qu'elle est bien cette banderole !* Le +robot principal se dirige vers la zone de fin, puis la superstar s'élance sur la scène, suivi de près par le groupie qui +tente de rejoindre la fosse. Et au moment où le robot principal va se déplacer dans sa zone d'arrivée, le robot adverse +surgit de nulle part et entre en collision à l'arrière. Cela déclenche le système anticollision qui, par précaution, +décide de rendre le robot immobile. De son côté, la superstar arrive quasiment au bord de la scène et marque 9 points ! +Au total, cela en fait 60 pour la série 4. + +Cette fois-ci, on a un peu temps avant le dernier match alors, on travaille pour essayer de faire notre meilleur dernier +match. Après une (très) courte nuit de sommeil, les robots sont prêts : la superstar a fait six fois d'affilée le +maximum de points, les deux groupies fonctionnent comme voulu pendant nos tests. + +Et c'est parti, le dernier match ! Comme depuis le début, la banderole se déploie magistralement sur le devant de la +table. Le robot se dirige vers la zone de fin, quand la superstar et les groupies se pressent pour aller faire la fête. +Mais cette fois-ci, il y a plus de monde devant la scène, les groupies n'arrivent pas à atteindre leur zone et la +superstar n'ose pas à aller jusqu'au bout de la scène… Le robot principal arrive tout de même à rentrer dans la zone de +fin ! + +Et…. 75 points pour notre dernier match, notre meilleur score ! Ce qui au total fait 262 points et une belle 45ᵉ place +(sur 117 équipes homologuées). + +Si jamais vous vouliez revoir l'intégralité de nos matchs, voici le tableau des vidéos : + +| Série | Lien live coupe de Planète Sciences | +|-------|-----------------------------------------------| +| 2 | | +| 3 | | +| 4 | | +| 5 | | + +Avant de conclure, voici une photo de l'équipe avec les robots ! + +![](attachments/5bcff064-8f4a-45f9-b555-5cb72d1c09ac.jpg " =385x289") + +Merci à celles et ceux qui sont passés à la Coupe ou qui nous ont suivi sur les lives !! + +Et c'est ainsi que se termine la dernière newsletter de cette année de robotique. On espère qu'elles vont auront plus +autant qu'on a pris de plaisir à les écrire ! + +![CDROMS out!](attachments/32034515-59f5-4357-a5c9-f49b1898636d.gif " =257x201") + +Un très bon été à tou.te.s, + +Les CDROMS 📀 diff --git a/public/newsletters/26-20260227/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg b/public/newsletters/26-20260227/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg new file mode 100644 index 0000000..fcf8d89 --- /dev/null +++ b/public/newsletters/26-20260227/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba2af0ca1a7efb081725afc4c0344f839c3230f596c074b103d2046e4b0d9f8b +size 283601 diff --git a/public/newsletters/2702206/attachments/3ca55032-5f23-4738-8d3e-e380cb03d3b9.png b/public/newsletters/26-20260227/attachments/3ca55032-5f23-4738-8d3e-e380cb03d3b9.png similarity index 100% rename from public/newsletters/2702206/attachments/3ca55032-5f23-4738-8d3e-e380cb03d3b9.png rename to public/newsletters/26-20260227/attachments/3ca55032-5f23-4738-8d3e-e380cb03d3b9.png diff --git a/public/newsletters/2702206/attachments/4be89b77-448f-4954-913f-b98b904b4e12.png b/public/newsletters/26-20260227/attachments/4be89b77-448f-4954-913f-b98b904b4e12.png similarity index 100% rename from public/newsletters/2702206/attachments/4be89b77-448f-4954-913f-b98b904b4e12.png rename to public/newsletters/26-20260227/attachments/4be89b77-448f-4954-913f-b98b904b4e12.png diff --git a/public/newsletters/2702206/attachments/e0439810-b100-4580-8906-6052359aa179.png b/public/newsletters/26-20260227/attachments/e0439810-b100-4580-8906-6052359aa179.png similarity index 100% rename from public/newsletters/2702206/attachments/e0439810-b100-4580-8906-6052359aa179.png rename to public/newsletters/26-20260227/attachments/e0439810-b100-4580-8906-6052359aa179.png diff --git a/public/newsletters/2702206/attachments/e63d3f2d-d3bf-4ed2-b486-fb2854401849.png b/public/newsletters/26-20260227/attachments/e63d3f2d-d3bf-4ed2-b486-fb2854401849.png similarity index 100% rename from public/newsletters/2702206/attachments/e63d3f2d-d3bf-4ed2-b486-fb2854401849.png rename to public/newsletters/26-20260227/attachments/e63d3f2d-d3bf-4ed2-b486-fb2854401849.png diff --git a/public/newsletters/2702206/draft-022026.md b/public/newsletters/26-20260227/draft-022026.md similarity index 99% rename from public/newsletters/2702206/draft-022026.md rename to public/newsletters/26-20260227/draft-022026.md index f058ba2..46ba807 100644 --- a/public/newsletters/2702206/draft-022026.md +++ b/public/newsletters/26-20260227/draft-022026.md @@ -2,7 +2,7 @@ Cher.e.s lecteur.trice.s, -Bienvenue dans cette nouvelle Newsletter de CDROMS ! +Bienvenue dans cette nouvelle Newsletter des CDROMS ! Qui dit nouvelle année, dit nouveau thème pour la Coupe de France de Robotique. Nous passons du monde des concerts à celui de l'hiver. "Winter is coming", l'édition 2026, nous propose de transformer nos robots en petits écureuils affamés, prêts à tout pour récupérer les caisses de noisettes que les humains ont ramassées avant eux. diff --git a/public/newsletters/052026/052026.md b/public/newsletters/26-20260513/052026.md similarity index 100% rename from public/newsletters/052026/052026.md rename to public/newsletters/26-20260513/052026.md diff --git a/public/newsletters/052026/attachments/cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 b/public/newsletters/26-20260513/attachments/cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 similarity index 100% rename from public/newsletters/052026/attachments/cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 rename to public/newsletters/26-20260513/attachments/cce43c8b-e2a4-4f60-ba88-efaec83c48c8.mp4 diff --git a/public/newsletters/052026/attachments/feab6b42-6335-4072-a8aa-e9813869e078.mp4 b/public/newsletters/26-20260513/attachments/feab6b42-6335-4072-a8aa-e9813869e078.mp4 similarity index 100% rename from public/newsletters/052026/attachments/feab6b42-6335-4072-a8aa-e9813869e078.mp4 rename to public/newsletters/26-20260513/attachments/feab6b42-6335-4072-a8aa-e9813869e078.mp4 diff --git a/public/newsletters/062026/062026.md b/public/newsletters/26-20260608/062026.md similarity index 82% rename from public/newsletters/062026/062026.md rename to public/newsletters/26-20260608/062026.md index 3a21a5a..fcfff57 100644 --- a/public/newsletters/062026/062026.md +++ b/public/newsletters/26-20260608/062026.md @@ -1,10 +1,12 @@ +# Juin 2026 + Hello à tous.tes, La Coupe s'est achevée il y a un peu plus de trois semaines maintenant : on vous raconte tout ! ## Mercredi (départ et homologations) -Après un rapide trajet mercredi matin, nous sommes partis faire homologuer le robot principal et le PAMI Ninja (appelés respectivement Blu-Ray et DVD cette année) : réussite au premier coup ! Nous avons pu profiter du reste de l'après-midi pour corriger les trajectoires des robots afin qu'ils puissent réaliser toutes leurs actions le moment venu.\n\nEn parallèle, un PAMI écureuil *(vous savez, celui qui a rencontré des soucis dans la* [*précédente newsletter*](https://cdroms.fr/#/newsletters/052026)*)* a été monté et homologué. Seulement... Comme un souci n'arrive jamais seul, on découvre que la mécanique du PAMI le fait trop déraper sur la table pour réaliser une trajectoire viable. On choisit alors de le garder de côté pour les premiers matchs. +Après un rapide trajet mercredi matin, nous sommes partis faire homologuer le robot principal et le PAMI Ninja (appelés respectivement Blu-Ray et DVD cette année) : réussite au premier coup ! Nous avons pu profiter du reste de l'après-midi pour corriger les trajectoires des robots afin qu'ils puissent réaliser toutes leurs actions le moment venu.\n\nEn parallèle, un PAMI écureuil *(vous savez, celui qui a rencontré des soucis dans la* [*précédente newsletter*](https://cdroms.fr/#/newsletters/26-20260513)*)* a été monté et homologué. Seulement... Comme un souci n'arrive jamais seul, on découvre que la mécanique du PAMI le fait trop déraper sur la table pour réaliser une trajectoire viable. On choisit alors de le garder de côté pour les premiers matchs. ## Jeudi (séries 1 & 2) @@ -38,11 +40,11 @@ Voici un récapitulatif des matchs avec les liens vers les vidéos pour les revo | Série | Replay vidéos | Points marqués | Classement à l'issue de la série | |-------|--------------------------------------------------------------------------------------------------------------------------------------------------------|----------------|----------------------------------| -| 1 | [Live](https://youtu.be/HS5AkY2gTb8?t=5677s), [Vidéo 1](/newsletters/062026/attachments/s1-1.mp4), [Vidéo 2](/newsletters/062026/attachments/s1-2.mp4) | 47 | 26ᵉ | -| 2 | [Live](https://youtu.be/pXuNJs7dAxo?t=6449s), [Vidéo 1](/newsletters/062026/attachments/s2-1.mp4) | 57 | 26ᵉ | -| 3 | [Live](https://youtu.be/ISvunlsdgDo?t=4558), [Vidéo 1](/newsletters/062026/attachments/s3-1.mp4) | 71 | 26ᵉ | -| 4 | [Live](https://youtu.be/jrfmvH_gVxM?t=2371), [Vidéo 1](/newsletters/062026/attachments/s4-1.mp4) | 70 | 29ᵉ | -| 5 | [Live](https://youtu.be/k5Suqyi1aqE?t=5286s), [Vidéo 1](/newsletters/062026/attachments/s5-1.mp4) | 61 | 31ᵉ (18ᵉ hors Legends !) | +| 1 | [Live](https://youtu.be/HS5AkY2gTb8?t=5677s), [Vidéo 1](/newsletters/26-20260608/attachments/s1-1.mp4), [Vidéo 2](/newsletters/26-20260608/attachments/s1-2.mp4) | 47 | 26ᵉ | +| 2 | [Live](https://youtu.be/pXuNJs7dAxo?t=6449s), [Vidéo 1](/newsletters/26-20260608/attachments/s2-1.mp4) | 57 | 26ᵉ | +| 3 | [Live](https://youtu.be/ISvunlsdgDo?t=4558), [Vidéo 1](/newsletters/26-20260608/attachments/s3-1.mp4) | 71 | 26ᵉ | +| 4 | [Live](https://youtu.be/jrfmvH_gVxM?t=2371), [Vidéo 1](/newsletters/26-20260608/attachments/s4-1.mp4) | 70 | 29ᵉ | +| 5 | [Live](https://youtu.be/k5Suqyi1aqE?t=5286s), [Vidéo 1](/newsletters/26-20260608/attachments/s5-1.mp4) | 61 | 31ᵉ (18ᵉ hors Legends !) | Merci à celles et ceux qui sont passés à la Coupe ou qui nous ont suivi sur les lives !! diff --git a/public/newsletters/062026/attachments/70f948a3-0d6a-4c60-9812-902e083954de.mp4 b/public/newsletters/26-20260608/attachments/70f948a3-0d6a-4c60-9812-902e083954de.mp4 similarity index 100% rename from public/newsletters/062026/attachments/70f948a3-0d6a-4c60-9812-902e083954de.mp4 rename to public/newsletters/26-20260608/attachments/70f948a3-0d6a-4c60-9812-902e083954de.mp4 diff --git a/public/newsletters/062026/attachments/92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif b/public/newsletters/26-20260608/attachments/92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif similarity index 100% rename from public/newsletters/062026/attachments/92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif rename to public/newsletters/26-20260608/attachments/92b038f2-3a1e-479c-a2b6-64bb148ff78e.gif diff --git a/public/newsletters/062026/attachments/93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 b/public/newsletters/26-20260608/attachments/93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 similarity index 100% rename from public/newsletters/062026/attachments/93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 rename to public/newsletters/26-20260608/attachments/93b3d8f2-3cf1-465c-b483-ff4ae1bd6a07.mp4 diff --git a/public/newsletters/062026/attachments/fa8173fa-0b3e-4167-8087-f753ae3282d7.gif b/public/newsletters/26-20260608/attachments/fa8173fa-0b3e-4167-8087-f753ae3282d7.gif similarity index 100% rename from public/newsletters/062026/attachments/fa8173fa-0b3e-4167-8087-f753ae3282d7.gif rename to public/newsletters/26-20260608/attachments/fa8173fa-0b3e-4167-8087-f753ae3282d7.gif diff --git a/public/newsletters/062026/attachments/s1-1.mp4 b/public/newsletters/26-20260608/attachments/s1-1.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s1-1.mp4 rename to public/newsletters/26-20260608/attachments/s1-1.mp4 diff --git a/public/newsletters/062026/attachments/s1-2.mp4 b/public/newsletters/26-20260608/attachments/s1-2.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s1-2.mp4 rename to public/newsletters/26-20260608/attachments/s1-2.mp4 diff --git a/public/newsletters/062026/attachments/s2-1.mp4 b/public/newsletters/26-20260608/attachments/s2-1.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s2-1.mp4 rename to public/newsletters/26-20260608/attachments/s2-1.mp4 diff --git a/public/newsletters/062026/attachments/s3-1.mp4 b/public/newsletters/26-20260608/attachments/s3-1.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s3-1.mp4 rename to public/newsletters/26-20260608/attachments/s3-1.mp4 diff --git a/public/newsletters/062026/attachments/s4-1.mp4 b/public/newsletters/26-20260608/attachments/s4-1.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s4-1.mp4 rename to public/newsletters/26-20260608/attachments/s4-1.mp4 diff --git a/public/newsletters/062026/attachments/s5-1.mp4 b/public/newsletters/26-20260608/attachments/s5-1.mp4 similarity index 100% rename from public/newsletters/062026/attachments/s5-1.mp4 rename to public/newsletters/26-20260608/attachments/s5-1.mp4 diff --git a/public/newsletters/2702206/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg b/public/newsletters/2702206/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg deleted file mode 100644 index b19e8fe..0000000 --- a/public/newsletters/2702206/attachments/2a92d6eb-f05b-4344-b7ba-354325d62938.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f64504eade913f979514478b510c8e56bfd439f123dfe5a4d4b903edbc220706 -size 1745620 diff --git a/public/newsletters/index.json b/public/newsletters/index.json index 14ec6aa..3b4c130 100644 --- a/public/newsletters/index.json +++ b/public/newsletters/index.json @@ -1,17 +1,42 @@ { - "2702206": { - "date": "2026-02-27", - "title": "Février 2026", - "markdown": "draft-022026.md" + "2025": { + "2024-11-05": { + "title": "Novembre 2024", + "markdown": "newsletter-051124.md" + }, + "2024-12-17": { + "title": "Décembre 2024", + "markdown": "newsletter-171224.md" + }, + "2025-01-31": { + "title": "Janvier 2025", + "markdown": "newsletter-310125.md" + }, + "2025-03-08": { + "title": "Mars 2025", + "markdown": "newsletter-080325.md" + }, + "2025-05-18": { + "title": "Mai 2025", + "markdown": "newsletter-180525.md" + }, + "2025-06-15": { + "title": "Juin 2025", + "markdown": "newsletter-150625.md" + } }, - "052026": { - "date": "2026-05-13", - "title": "Mai 2026", - "markdown": "052026.md" - }, - "062026": { - "date": "2026-06-08", - "title": "Juin 2026", - "markdown": "062026.md" + "2026": { + "2026-02-27": { + "title": "Février 2026", + "markdown": "draft-022026.md" + }, + "2026-05-13": { + "title": "Mai 2026", + "markdown": "052026.md" + }, + "2026-06-08": { + "title": "Juin 2026", + "markdown": "062026.md" + } } } \ No newline at end of file diff --git a/public/restricted-assets/LICENSE b/public/restricted-assets/LICENSE new file mode 100644 index 0000000..039732a --- /dev/null +++ b/public/restricted-assets/LICENSE @@ -0,0 +1,4 @@ +Except as stated elsewhere in this repository, the material in this directory (and its subdirectories) is **not** +licensed under the GPL or CC licenses of this repository. + +Some assets are owned by third parties, others by the project author. \ No newline at end of file diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index 5fa5857..3b9e1f7 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -11,17 +11,30 @@ import NewsletterLi from "../components/NewsletterLi.tsx"; import remarkGfm from "remark-gfm"; interface NewsletterData { - date: string; title: string; markdown: string; } const Newsletters: React.FC = () => { + const currentCDFRYear = useMemo(() => { + const y = new Date().getFullYear(); + return new Date().getMonth() > 7 ? y + 1 : y; + }, []) const {id} = useParams(); - const [data, setData] = useState>({}); + const folder = useMemo(() => { + if (id) { + const year = parseInt(id.split("-")[0]) + const date = id.split("-").slice(1).join("-"); + return `${year - 2000}-${date.replaceAll("-", "")}` + } else { + return undefined + } + }, [id]) + const [data, setData] = useState>>({}); const [md, setMd] = useState(''); const [loadError, setLoadError] = useState(null); + useEffect(() => { fetch('/newsletters/index.json') .then(res => { @@ -36,20 +49,25 @@ const Newsletters: React.FC = () => { }, []); useEffect(() => { - if (id && data[id]) { - fetch(`/newsletters/${id}/${data[id].markdown}`) - .then(res => { - if (!res.ok) throw new Error(`Failed to load newsletter (${res.status})`); - return res.text() - }) - .then(text => text.replace(/\\n/g, "\n")) - .then(setMd) - .catch(err => { - console.error(err); - setLoadError("Impossible de charger cette newsletter."); - }); + if (id && folder) { + const year = parseInt(id.split("-")[0]) + const date = id.split("-").slice(1).join("-"); + const folder = `${year - 2000}-${date.replaceAll("-", "")}` + if (data[year] && data[year][date]) { + fetch(`/newsletters/${folder}/${data[year][date].markdown}`) + .then(res => { + if (!res.ok) throw new Error(`Failed to load newsletter (${res.status})`); + return res.text() + }) + .then(text => text.replace(/\\n/g, "\n")) + .then(setMd) + .catch(err => { + console.error(err); + setLoadError("Impossible de charger cette newsletter."); + }); + } } - }, [id, data]); + }, [id, folder, data]); return useMemo(() => { if (loadError) { @@ -68,28 +86,39 @@ const Newsletters: React.FC = () => { à réaliser durant la Coupe, la conception de pièces mécaniques ou encore les tests de code des robots, une de nos newsletters abordera (probablement) le sujet !
-
-

- Les newsletters de cette année : -

-
    - {Object.entries(data) - .filter(([_, d]) => new Date(d.date) <= new Date()) - .map(([folder, data]) => ( - - ))} -
+
+ { + Object.entries(data) + .sort(([a,], [b,]) => parseInt(b) - parseInt(a)) + .map(([cdfrYear, data]) => ( + <> +

+ {cdfrYear == `${currentCDFRYear}` ? + "Les newsletters de cette année :" : + `Coupe de France de Robotique ${cdfrYear}`} +

+
    + {Object.entries(data) + .filter(([date, _]) => new Date(date) <= new Date()) + .sort(([a,], [b,]) => new Date(b).getTime() - new Date(a).getTime()) + .map(([date, data]) => ( + + ))} +
+ + )) + }
; } else { return (
- Retour à la liste + setMd('')}>Retour à la liste
{ ); }, img({src, title, alt}) { - const newSrc = src?.startsWith('http') ? src : `/newsletters/${id}/${src}`; + const newSrc = src?.startsWith('http') ? src : `/newsletters/${folder}/${src}`; const w = title?.split('=')[1]?.split('x')[0]; return ( <> @@ -140,7 +169,7 @@ const Newsletters: React.FC = () => { ); }, a({href, children}) { - const newSrc = href?.startsWith('http') || href?.startsWith('/newsletters') ? href : `/newsletters/${id}/${href}`; + const newSrc = href?.startsWith('http') || href?.startsWith('/newsletters') ? href : `/newsletters/${folder}/${href}`; const SIZE_TOKEN = /^\d+x\d+$/; if (newSrc.endsWith('mp4') && !href?.startsWith("/newsletters") && children) { const words = children.toString().split(" "); @@ -187,7 +216,7 @@ const Newsletters: React.FC = () => {
) } - }, [id, data, md, loadError]) + }, [id, data, md, loadError, folder, currentCDFRYear]) } export default Newsletters \ No newline at end of file From 50b9ecc4d596b44c25a632a66e74157ca9d68e56 Mon Sep 17 00:00:00 2001 From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com> Date: Sat, 11 Jul 2026 16:33:10 +0200 Subject: [PATCH 7/7] feat(markdown): add shortcut at the bottom of the newsletters --- src/pages/Newsletters.tsx | 46 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx index 3b9e1f7..a199edd 100644 --- a/src/pages/Newsletters.tsx +++ b/src/pages/Newsletters.tsx @@ -69,6 +69,31 @@ const Newsletters: React.FC = () => { } }, [id, folder, data]); + useEffect(() => { + window.scrollTo({top: 0, left: 0, behavior: "instant" as ScrollBehavior}); + }, [id]); + + const navigation = useMemo(() => { + if (!id) return undefined; + const year = parseInt(id.split("-")[0]); + const date = id.split("-").slice(1).join("-"); + const yearData = data[year]; + if (!yearData) return undefined; + + const sorted = Object.entries(yearData) + .filter(([d]) => new Date(d) <= new Date()) + .sort(([a], [b]) => new Date(a).getTime() - new Date(b).getTime()); + const index = sorted.findIndex(([d]) => d === date); + if (index === -1) return undefined; + + const prev = index > 0 ? sorted[index - 1] : undefined; + const next = index < sorted.length - 1 ? sorted[index + 1] : undefined; + return { + prev: prev ? {folder: `${year}-${prev[0]}`, title: prev[1].title} : undefined, + next: next ? {folder: `${year}-${next[0]}`, title: next[1].title} : undefined, + }; + }, [id, data]); + return useMemo(() => { if (loadError) { return ( @@ -213,10 +238,29 @@ const Newsletters: React.FC = () => { {md}
+
+
+ {navigation?.prev && ( + + « {navigation.prev.title} + + )} +
+
+ setMd('')}>Retour à la liste +
+
+ {navigation?.next && ( + + {navigation.next.title} » + + )} +
+
) } - }, [id, data, md, loadError, folder, currentCDFRYear]) + }, [id, data, md, loadError, folder, currentCDFRYear, navigation]) } export default Newsletters \ No newline at end of file