From d69074f561dec5967667fa283b73baf4cc52c3da Mon Sep 17 00:00:00 2001 From: Lena Fuhrimann <6780471+cloudlena@users.noreply.github.com> Date: Wed, 4 Oct 2023 09:26:31 +0200 Subject: [PATCH] Add reference story about Comet --- package-lock.json | 151 ++++++++++++++------------ src/lib/customers/comet-de.json | 44 -------- src/lib/customers/comet-en.json | 44 -------- src/lib/customers/comet-group-de.json | 46 ++++++++ src/lib/customers/comet-group-en.json | 46 ++++++++ src/lib/images/comet-group.webp | Bin 0 -> 63476 bytes src/routes/+layout.ts | 1 - src/routes/Customers.svelte | 2 + src/routes/customers/[slug]/+page.ts | 11 ++ svelte.config.js | 7 +- 10 files changed, 190 insertions(+), 162 deletions(-) delete mode 100644 src/lib/customers/comet-de.json delete mode 100644 src/lib/customers/comet-en.json create mode 100644 src/lib/customers/comet-group-de.json create mode 100644 src/lib/customers/comet-group-en.json create mode 100644 src/lib/images/comet-group.webp delete mode 100644 src/routes/+layout.ts diff --git a/package-lock.json b/package-lock.json index 4f3cb39d..40456c13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -432,9 +432,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -455,9 +455,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -695,9 +695,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.2.tgz", - "integrity": "sha512-2w2VbPpK8DI3QCSVa2UNAv5sKNks1LT8GsEdpk41ffOyO2znGx2ZwcRWacsqlvh3d9lncZuDdANvCbTbuKvy3Q==", + "version": "1.27.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.3.tgz", + "integrity": "sha512-pd7qwX6ww5noA0/FLk45B0aKUeOXWR+pfZsGTrv3dRmj3lTmnki9UTmTdWzHJGrje+BBkGUZHfgGrsSOQQBQpQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -796,16 +796,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -831,15 +831,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -859,13 +859,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -876,13 +876,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -903,9 +903,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -916,13 +916,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -943,17 +943,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" }, "engines": { @@ -968,12 +968,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1519,15 +1519,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1573,6 +1573,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-prettier": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", @@ -1586,16 +1598,17 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.34.0.tgz", - "integrity": "sha512-4RYUgNai7wr0v+T/kljMiYSjC/oqwgq5i+cPppawryAayj4C7WK1ixFlWCGmNmBppnoKCl4iA4ZPzPtlHcb4CA==", + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz", + "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "debug": "^4.3.1", + "eslint-compat-utils": "^0.1.2", "esutils": "^2.0.3", - "known-css-properties": "^0.28.0", + "known-css-properties": "^0.29.0", "postcss": "^8.4.5", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^6.0.0", @@ -1753,9 +1766,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2164,9 +2177,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", - "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, "node_modules/levn": { @@ -2380,9 +2393,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { diff --git a/src/lib/customers/comet-de.json b/src/lib/customers/comet-de.json deleted file mode 100644 index 0229a375..00000000 --- a/src/lib/customers/comet-de.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Comet", - "title": "bespinian unterstützt CI Tech Sensors beim Aufbau eines zentralen Notendaten-Managements", - "customer": "CI Tech Sensors AG entwickelt und produziert Banknoten-Sensoren, welche weltweit in Bankomaten, Einzahlungsautomaten und Zählmaschinen zum Einsatz kommen. CI Tech Sensors ist ein Tochterunternehmen von Diebold-Nixdorf und ein langjähriger Entwicklungspartner von Giesecke+Devirent. CI Tech Sensors beschäftigt rund 100 Mitarbeiter an ihrem Standort in Burgdorf in der Schweiz.", - "background": "Zur Entwicklung von Banknoten-Sensoren sind grosse Mengen an Banknoten-Daten erforderlich. Eine zentrale Rolle spielen dabei Bilddaten, etwa zum Adaptieren von Erkennungs-Algorithmen und zum anschliessenden Validieren der von den Kunden geforderten Erkennungsraten. Neben Bilddaten werden auch verschiedene Metadaten zu Banknoten benötigt, zum Beispiel Serien- und Emissions-Nummern, Qualitäts-Bewertungen sowie technische Hintergrundinformationen zum Ort und zum Gerät, mit dem die Notendaten aufgenommen wurden.", - "goal": "Ziel des Projektes war es, alle Banknoten-Daten in eine zentrale Verwaltung zu überführen und diese allen Prozessen und Tools von CI Tech Sensors zentral zur Verfügung zu stellen. Neue Banknoten-Daten sollten bei der Aufnahme in die Verwaltung auf Gültigkeit überprüft und anschliessend redundanzfrei abgelegt werden. Jeder Banknoten-Datensatz sollte in der Verwaltung eindeutig adressierbar sein. Zudem sollten alle Banknoten-Daten unveränderbar abgelegt werden, um eine strenge Reproduzierbarkeit aller Prozessschritte bei der Entwicklung und bei der Validierung von Banknoten-Sensoren zu garantieren.", - "contribution": { - "intro": "bespinian hatte eine Schlüsselrolle in den folgenden Themen.", - "topics": [ - { - "title": "Microservice-Architektur", - "body": "In regelmässigen Architektur-Workshops hat bespinian zusammen mit CI Tech Sensors eine Microservice-Architektur entworfen. Mit der schrittweisen Einführung von klar abgegrenzten und wohldefinierten Services in die Prozesslandschaft konnte das zentrale Notendaten-Management eingeführt werden, ohne das Kerngeschäft von CI Tech Sensors zu beeinträchtigen. Neben der Architekturarbeit hat bespinian auch bei der hands-on Implementation der Microservices Verantwortung übernommen." - }, - { - "title": "Kubernetes-Infrastruktur", - "body": "Alle Microservices des Notendaten-Managements von CI Tech Sensors werden auf Kubernetes-Infrastruktur betrieben. Hierbei hat bespinian den Lead für die Konfiguration der Kubernetes-Umgebungen und für das automatisierte Deployment der Services übernommen. In einer Mischung aus Schulung, Code-Reviews und Pair-Engineering hat bespinian sichergestellt, dass das Team von CI Tech Sensors das nötige Kubernetes Know-how aufbauen konnte, um die Services betreiben und weiterentwickeln zu können." - }, - { - "title": "Monitoring und Alerting", - "body": "Die Microservices des zentralen Notendaten-Managements nehmen naturgemäss eine kritische Rolle im Kerngeschäft von CI Tech Sensors ein. Neben der operativen Überwachung der Services spielten auch fachliche Kenngrössen eine wichtige Rolle (z. B. Anzahl defekter Noten-Daten). bespinian erarbeitete zusammen mit CI Tech Sensors ein Konzept für Monitoring und Alerting basierend auf Prometheus und Grafana und übernahm den Lead bei der Implementation der Monitoring-Infrastruktur und Dashboards. Zudem hat bespinian sichergestellt, dass das Team von CI Tech Sensors sein Know-how der eingesetzten Technologien aufbauen konnte, sodass das Monitoring und Alerting zusammen mit den Microservices wachsen konnte." - }, - { - "title": "Übergang zum DevOps-Ansatz", - "body": "Der Einsatz von Kubernetes und die Entwicklung einer zentralisierten, hochverfügbaren Microservice-Architektur machten den Schritt zu einem DevOps-Ansatz im Entwicklungsteam von CI Tech Sensors unumgänglich. bespinian unterstützte CI Tech Sensors bei diesem Schritt durch Coaching und Beratung der im Prozess involvierten Teams und durch das Etablieren der nötigen Tools und Abläufe." - } - ] - }, - "technologies": [ - "Python / Flask", - "PostgreSQL", - "Redis", - "MongoDB", - "Kubernetes", - "Prometheus / Grafana / Alertmanager", - "Elasticsearch / Kibana" - ], - "quote": { - "body": "Mit ihrer überzeugenden Mischung aus hands-on Engineering, Coaching und Beratung ist bespinian der ideale Partner und Begleiter auf unserer Reise in die Welt von Container, Microservices und DevOps.", - "stakeholder": { - "name": "Lukas Burger", - "role": "Leiter Software-Entwicklung" - } - } -} diff --git a/src/lib/customers/comet-en.json b/src/lib/customers/comet-en.json deleted file mode 100644 index 3c71dd50..00000000 --- a/src/lib/customers/comet-en.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "Comet", - "title": "bespinian and Comet create the revolutionary IoT device health monitor BLOX", - "customer": "Comet Group develops and produces x-ray and CT systems that enable non destructive testing of materials and industry products. These devices are used in electronics, the aerospace and the automotive industries worldwide. Comet is a Swiss company based in Flamatt employing more than 1700 people around the globe. They are a leading tech company driving innovation in the x-ray and radio frequency areas.", - "background": "The x-ray and CT machines Comet has deployed with their customers worldwide require regular maintenance. Knowing what exactly is going on within these devices and how they are being used is crucial for efficiently working with them. With targeted data visualization and preventive alerts, one can recognize usage patterns, detect incorrect usage and prevent outages. That is why Comet wanted to innovate in this space and create a tool for ", - "goal": "Ziel des Projektes war es, alle Banknoten-Daten in eine zentrale Verwaltung zu überführen und diese allen Prozessen und Tools von CI Tech Sensors zentral zur Verfügung zu stellen. Neue Banknoten-Daten sollten bei der Aufnahme in die Verwaltung auf Gültigkeit überprüft und anschliessend redundanzfrei abgelegt werden. Jeder Banknoten-Datensatz sollte in der Verwaltung eindeutig adressierbar sein. Zudem sollten alle Banknoten-Daten unveränderbar abgelegt werden, um eine strenge Reproduzierbarkeit aller Prozessschritte bei der Entwicklung und bei der Validierung von Banknoten-Sensoren zu garantieren.", - "contribution": { - "intro": "bespinian played a key role in the following areas:", - "topics": [ - { - "title": "Microservice-Architektur", - "body": "In regelmässigen Architektur-Workshops hat bespinian zusammen mit CI Tech Sensors eine Microservice-Architektur entworfen. Mit der schrittweisen Einführung von klar abgegrenzten und wohldefinierten Services in die Prozesslandschaft konnte das zentrale Notendaten-Management eingeführt werden, ohne das Kerngeschäft von CI Tech Sensors zu beeinträchtigen. Neben der Architekturarbeit hat bespinian auch bei der hands-on Implementation der Microservices Verantwortung übernommen." - }, - { - "title": "Kubernetes-Infrastruktur", - "body": "Alle Microservices des Notendaten-Managements von CI Tech Sensors werden auf Kubernetes-Infrastruktur betrieben. Hierbei hat bespinian den Lead für die Konfiguration der Kubernetes-Umgebungen und für das automatisierte Deployment der Services übernommen. In einer Mischung aus Schulung, Code-Reviews und Pair-Engineering hat bespinian sichergestellt, dass das Team von CI Tech Sensors das nötige Kubernetes Know-how aufbauen konnte, um die Services betreiben und weiterentwickeln zu können." - }, - { - "title": "Monitoring und Alerting", - "body": "Die Microservices des zentralen Notendaten-Managements nehmen naturgemäss eine kritische Rolle im Kerngeschäft von CI Tech Sensors ein. Neben der operativen Überwachung der Services spielten auch fachliche Kenngrössen eine wichtige Rolle (z. B. Anzahl defekter Noten-Daten). bespinian erarbeitete zusammen mit CI Tech Sensors ein Konzept für Monitoring und Alerting basierend auf Prometheus und Grafana und übernahm den Lead bei der Implementation der Monitoring-Infrastruktur und Dashboards. Zudem hat bespinian sichergestellt, dass das Team von CI Tech Sensors sein Know-how der eingesetzten Technologien aufbauen konnte, sodass das Monitoring und Alerting zusammen mit den Microservices wachsen konnte." - }, - { - "title": "Übergang zum DevOps-Ansatz", - "body": "Der Einsatz von Kubernetes und die Entwicklung einer zentralisierten, hochverfügbaren Microservice-Architektur machten den Schritt zu einem DevOps-Ansatz im Entwicklungsteam von CI Tech Sensors unumgänglich. bespinian unterstützte CI Tech Sensors bei diesem Schritt durch Coaching und Beratung der im Prozess involvierten Teams und durch das Etablieren der nötigen Tools und Abläufe." - } - ] - }, - "technologies": [ - "Python / Flask", - "Svelte", - "Terraform", - "AWS Lambda", - "Amazon DynamoDB", - "Amazon S3", - "Amazon CloudFront" - ], - "quote": { - "body": "Merp derp.", - "stakeholder": { - "name": "Pascal Corbat", - "role": "Leiter Software-Entwicklung" - } - } -} diff --git a/src/lib/customers/comet-group-de.json b/src/lib/customers/comet-group-de.json new file mode 100644 index 00000000..ea932490 --- /dev/null +++ b/src/lib/customers/comet-group-de.json @@ -0,0 +1,46 @@ +{ + "name": "Comet", + "title": "bespinian und Comet entwickeln den IoT-Healthmonitor BLOX", + "customer": "Die Comet Group ist ein Schweizer Unternehmen mit Sitz in Flamatt, das weltweit mehr als 1700 Mitarbeitende beschäftigt. Sie ist ein führendes Technologieunternehmen, das Innovationen in der Röntgen- und Hochfrequenzbranche vorantreibt. Der Geschäftsbereich Comet X-ray entwickelt und produziert Röntgenmodule, die eine zerstörungsfreie Prüfung von Materialien und Industriekomponenten ermöglichen. Die geprüften Teile stammen aus der Luft- und Raumfahrt, der Automobilindustrie, der Batterieindustrie, der Halbleiterindustrie und anderen Märkten.", + "background": "Die Röntgenmodule, die Comet bei seinen Kunden weltweit einsetzt, müssen regelmässig gewartet werden. Zu wissen, was genau in diesen Geräten vor sich geht und wie sie genutzt werden, ist entscheidend für eine effiziente Arbeit mit ihnen. Mit gezielter Datenvisualisierung und präventiven Alerts lassen sich Muster, Abweichungen und Lücken erkennen, falsche Nutzung aufdecken und Ausfälle verhindern. Aus diesem Grund wollte Comet in diesem Bereich innovativ sein und ein solches Tool namens BLOX für sich und seine Kunden entwickeln.", + "goal": "Das Ziel von BLOX ist es, Comet und seinen Kunden das Gesamtbild zu vermitteln. Durch die transparente und übersichtliche Darstellung der Metriken und Daten jedes Geräts in einer leicht verständlichen Art und Weise, die zeigt, wie das Gerät verwendet wurde. Die Benutzer können dann mögliche Probleme des Geräts untersuchen, indem sie in verschiedene Diagramme mit einer Vielzahl von Metriken eintauchen. Sie erhalten auch Warnungen und Hinweise, wenn das System ungewöhnliche Muster und unerwartete Systemzustände feststellt. bespinian und Comet entwickeln BLOX in enger Zusammenarbeit und sind sehr zufrieden damit, dass das Tool bereits einen grossen Nutzen bringt.", + "contribution": { + "intro": "bespinian hatte eine Schlüsselrolle in den folgenden Themen.", + "topics": [ + { + "title": "Infrastruktursetup", + "body": "bespinian richtete die Infrastruktur von BLOX ein, indem wir mehrere separate Umgebungen in AWS mit Terraform bereitstellten. Diese Infrastruktur musste belastbar, einfach zu warten und kosteneffizient sein. Durch die Wahl von hochgradigen Serverless-Technologien wie AWS Lambda, Amazon DynamoDB oder Amazon S3 für verschiedene Teile der Anwendung konnte ein Grossteil des Infrastruktursetups und der -wartung an den Cloud-Anbieter delegiert werden. Durch die Verwendung von Infrastruktur als Code können wir problemlos mehrere Umgebungen verwalten und sicherstellen, dass sie gleichwertig sind." + }, + { + "title": "Backend-Entwicklung", + "body": "Das Backend von BLOX ist das Herzstück der Anwendung, in dem sich die gesamte Logik befindet. Es ist in Python geschrieben, weil diese Sprache Comet gut bekannt ist, von AWS Lambda vollumfänglich unterstützt ist und uns die Flexibilität bietet, kleine iterative Änderungen durchzuführen. Das ist wichtig, denn die Business-Logik, wie die Logs und Metriken von Geräten interpretiert werden, ist mit sehr komplex. Durch die Verwendung von sauber strukturiertem und getesteten Code ist diese Komplexität jedoch gut dokumentiert und im BLOX-Backend-Code automatisiert." + }, + { + "title": "Frontend-Entwicklung", + "body": "Für das Frontend, das in den Webbrowsern der Nutzer:innen dargestellt wird, haben wir uns für Svelte und Svelte Kit entschieden. Beides sind relativ neue, aber mächtige Technologien, die es uns ermöglichen, eine sichere und leistungsfähige Browseranwendung zu erstellen, die einfach zu bedienen und leicht zugänglich ist. Für das Hosting dieser Anwendung wurde eine Kombination aus S3 und CloudFront gewählt. Auf diese Weise wird BLOX auf sehr kosteneffiziente Weise bereitgestellt und ist für Comet und seine Kunden rund um den Globus zugänglich." + }, + { + "title": "Monitoring und Alerting", + "body": "Da die gesamte Infrastruktur bei einem grossen Cloud-Anbieter gehostet wird, ist es ein einfacher Ansatz, die von diesem bereitgestellten Überwachungs-, Alarmierungs- und Loggingtools zu nutzen. In diesem Fall haben wir uns für Amazon CloudWatch entschieden, das die Logs des BLOX-Backends sammelt und Alerts auslöst, wenn etwas schiefläuft. Durch die Verwendung dieser Tools können wir sicherstellen, dass die Überwachungs- und Alarmierungsinfrastruktur selbst immer verfügbar ist und einen umfassenden Funktionssatz bietet." + } + ] + }, + "technologies": [ + "Python / Flask", + "Svelte / SvelteKit", + "uPlot", + "Terraform", + "AWS Lambda", + "Amazon DynamoDB", + "Amazon S3", + "Amazon CloudFront", + "Amazon CloudWatch" + ], + "quote": { + "body": "Die Expertise von bespinian im Bereich Cloud-Native hat unsere Reise von Unterbrüchen zu Durchbrüchen bei Röntgenmodulen ermöglicht. Die sehr flexible Implementierung des BLOX-Healthmonitorings war der Schlüssel dazu, dass unsere Kunden von der reaktiven zur präventiven Maintenance übergehen konnten.", + "stakeholder": { + "name": "Pascal Corbat", + "role": "Product manager software" + } + } +} diff --git a/src/lib/customers/comet-group-en.json b/src/lib/customers/comet-group-en.json new file mode 100644 index 00000000..cc2e7568 --- /dev/null +++ b/src/lib/customers/comet-group-en.json @@ -0,0 +1,46 @@ +{ + "name": "Comet", + "title": "bespinian and Comet create the IoT health monitor BLOX", + "customer": "Comet Group is a Swiss company based in Flamatt employing more than 1700 people around the globe. They are a leading tech company driving innovation in the X-ray and radio frequency business. The division Comet X-ray develops and produces X-ray modules that enable non-destructive testing of materials and industry components. The inspected parts come from the aerospace, automotive, battery, semiconductors and other markets.", + "background": "The X-ray modules, Comet has deployed with their customers worldwide, require regular maintenance. Knowing what exactly is going on within these devices and how they are being used is crucial for efficiently working with them. With targeted data visualization and preventive alerts, one can recognize patterns, drifts, gaps and detect incorrect usage and prevent outages. That is why Comet wanted to innovate in this space and create such a tool called BLOX for them and their customers.", + "goal": "The goal of BLOX is to give Comet and their customers the big picture. Bringing in the transparancy and overview of displaying the metrics and data of each device in a way that is easy to understand and shows how the device has been used. Users can then investigate potential issues of the device by diving into different charts of a variety of metrics. They also receive warnings and alerts when the system detects unusual patterns and unexpected system states. bespinian and Comet are building BLOX in a tight collaboration and are very happy with how the tool already brings great value.", + "contribution": { + "intro": "bespinian played a key role in the following areas:", + "topics": [ + { + "title": "Infrastructure Setup", + "body": "bespinian set up the infrastructure of BLOX by provisioning multiple separate environments into AWS using Terraform. Said infrastructure needed to be resilient, easy to maintain and cost-efficient. By choosing highly managed serverless technologies like AWS Lambda, Amazon DynamoDB or Amazon S3 for different parts of the application, much of the infrastructure setup and maintenance work could have been delegated to the cloud provider. Using infrastructure as code allows us to easily maintain multiple environments and make sure that we have parity among them." + }, + { + "title": "Backend Development", + "body": "The backend of BLOX is the heart of the application and where all the business logic lies. It is written in Python because that's a well-known language to Comet, a first-class citizen on AWS Lambda, and provides us with the flexibility of performing small iterative changes. This is important because the business logic of how the logs and metrics from devices is interpreted is rather involved and complex at times. However, by using neatly structured and tested code, this complexity is well documented and automated in the BLOX backend code." + }, + { + "title": "Frontend Development", + "body": "For the frontend rendered in users' web browsers, we decided to go for Svelte and Svelte Kit. Both are rather new but powerful technologies, which allow us to build a secure and performant browser application which is easy to use and easily accessible. For the hosting of this application, a combination of S3 and CloudFront was chosen. By doing so, BLOX is served in a very cost-efficient way and accessible to Comet and their customers around the globe." + }, + { + "title": "Monitoring and Alerting", + "body": "Since the whole infrastructure is hosted on a large-scale cloud provider, it is a simple approach to use the monitoring, alerting, and logging tools they provide. In this case, we decided to go for Amazon CloudWatch, which collects the logs of the BLOX backend and triggers alerts if something goes wrong. By using these provided tools, we can make sure, the monitoring and alerting infrastructure itself is always available and provides a comprehensive feature set." + } + ] + }, + "technologies": [ + "Python / Flask", + "Svelte / SvelteKit", + "uPlot", + "Terraform", + "AWS Lambda", + "Amazon DynamoDB", + "Amazon S3", + "Amazon CloudFront", + "Amazon CloudWatch" + ], + "quote": { + "body": "bespinian’s expertise in cloud-native empowered our journey from breakdowns to breakthroughs in X-ray modules. The very agile implementation of the BLOX health monitoring was key to enable our customers to move from reactive to preventive maintenance.", + "stakeholder": { + "name": "Pascal Corbat", + "role": "Product manager software" + } + } +} diff --git a/src/lib/images/comet-group.webp b/src/lib/images/comet-group.webp new file mode 100644 index 0000000000000000000000000000000000000000..e533a1bca5ed6a82427b817081eb5a1ae97bf88a GIT binary patch literal 63476 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%0AGvlw80FBAM4&ldM)%Dc2c?Ypk%36Q# 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 literal 0 HcmV?d00001 diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts deleted file mode 100644 index 189f71e2..00000000 --- a/src/routes/+layout.ts +++ /dev/null @@ -1 +0,0 @@ -export const prerender = true; diff --git a/src/routes/Customers.svelte b/src/routes/Customers.svelte index a4a7fa86..72f4c12c 100644 --- a/src/routes/Customers.svelte +++ b/src/routes/Customers.svelte @@ -5,6 +5,7 @@ import swisscom from '$lib/images/swisscom.webp'; import txGroup from '$lib/images/tx-group.webp'; import ciTechSensors from '$lib/images/citechsensors.webp'; + import cometGroup from '$lib/images/comet-group.webp'; import swissSignGroup from '$lib/images/swisssigngroup.svg'; import emmi from '$lib/images/emmi.webp'; import legalI from '$lib/images/legal-i.webp'; @@ -25,6 +26,7 @@ { name: 'Xovis', logo: xovis, link: '/customers/xovis' }, { name: 'TX Group', logo: txGroup, link: 'https://tx.group' }, { name: 'CI Tech Sensors', logo: ciTechSensors, link: '/customers/citech-sensors' }, + { name: 'Comet Group', logo: cometGroup, link: '/customers/comet-group' }, { name: 'SwissSign Group', logo: swissSignGroup, link: '/customers/swisssign-group' }, { name: 'Emmi', logo: emmi, link: 'https://group.emmi.com' }, { name: 'legal-i', logo: legalI, link: 'https://legal-i.ch' }, diff --git a/src/routes/customers/[slug]/+page.ts b/src/routes/customers/[slug]/+page.ts index 6e52e216..c92f0468 100644 --- a/src/routes/customers/[slug]/+page.ts +++ b/src/routes/customers/[slug]/+page.ts @@ -8,6 +8,9 @@ import swisssignLogo from '$lib/images/swisssigngroup.svg'; import xovisEn from '$lib/customers/xovis-en.json'; import xovisDe from '$lib/customers/xovis-de.json'; import xovisLogo from '$lib/images/xovis.svg'; +import cometGroupEn from '$lib/customers/comet-group-en.json'; +import cometGroupDe from '$lib/customers/comet-group-de.json'; +import cometGroupLogo from '$lib/images/comet-group.webp'; import type { PageLoad } from './$types'; export const load: PageLoad = ({ params }) => { @@ -36,6 +39,14 @@ export const load: PageLoad = ({ params }) => { logo: xovisLogo } }; + case 'comet-group': + return { + customer: { + en: cometGroupEn, + de: cometGroupDe, + logo: cometGroupLogo + } + }; } throw error(404, 'Not found'); diff --git a/svelte.config.js b/svelte.config.js index 0a445902..03ea688a 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -8,10 +8,9 @@ const config = { preprocess: vitePreprocess(), kit: { - adapter: adapter(), - prerender: { - entries: ['*', '/customers/citech-sensors', '/customers/swisssign-group', '/customers/xovis'] - }, + adapter: adapter({ + fallback: 'index.html' + }), csp: { directives: { 'default-src': ['self'],