From f2bdc836f3bc68fb4bdd10e092f145bad166337e Mon Sep 17 00:00:00 2001 From: Lucas Nouguier Date: Sat, 9 Nov 2024 13:38:57 +0100 Subject: [PATCH 1/4] fix: moved PPs to single folder to avoid duplication --- .../armored-type-safety-with-iron.md | 4 ++-- .../chasing-arrows-functors-monads.md | 4 ++-- .../contravariance-intuition-building.md | 2 +- .../nantes-2024/data-pipelines-simple.md | 2 +- .../dependent-types-from-theory-to-practice.md | 2 +- .../hands-on-besom-iac-with-scala.md | 2 +- .../conferences/nantes-2024/intro-to-gadts.md | 2 +- .../introduction-to-smithy-smithy4s.md | 2 +- .../nantes-2024/kapoeira-with-kafka-streams.md | 4 ++-- ...meta-programming-for-functional-languages.md | 2 +- .../nantes-2024/migrating-gallia-to-scala-3.md | 2 +- .../nantes-2024/my-first-year-in-scala.md | 2 +- .../nantes-2024/nails-are-tree-need-chainsaw.md | 2 +- .../nantes-2024/rex-migration-scala-2-to-3.md | 4 ++-- .../scala-3-compiler-academy-journey.md | 2 +- .../songwriting-in-scala-dsl-and-adt.md | 2 +- .../nantes-2024/ukraine-scala-community.md | 2 +- .../unleashing-scalafix-potential.md | 2 +- public/conferences/nantes-2024/unwrapping-io.md | 2 +- .../nantes-2024/use-ai-in-your-programs.md | 4 ++-- .../conferences/paris-2024/anatomy-scaladex.md | 2 +- .../paris-2024/better-builds-with-mill.md | 2 +- .../conferences/paris-2024/beyond-basics-lsp.md | 2 +- ...ilding-robust-applications-with-kyo-intro.md | 2 +- .../building-robust-applications-with-kyo.md | 2 +- .../paris-2024/calculating-funnier.md | 2 +- .../paris-2024/computer-algebra-scala.md | 2 +- .../paris-2024/contextual-abstraction-scala3.md | 2 +- public/conferences/paris-2024/decision4s.md | 2 +- .../paris-2024/escaping-false-dichotomy.md | 2 +- .../paris-2024/fast-scala-web-workshop.md | 2 +- public/conferences/paris-2024/fast-scala-web.md | 2 +- .../conferences/paris-2024/full-stack-scala.md | 2 +- .../how-functional-is-direct-style.md | 2 +- .../conferences/paris-2024/keynote-nicolas.md | 2 +- .../conferences/paris-2024/keynote-valentin.md | 2 +- .../paris-2024/metaprogramming-in-scala3.md | 2 +- .../paris-2024/mill-builds-scala3.md | 2 +- .../paris-2024/optimize-kafka-to-bq.md | 2 +- .../conferences/paris-2024/plowing-postgres.md | 2 +- public/conferences/paris-2024/profunctor.md | 2 +- .../conferences/paris-2024/publish-to-maven.md | 2 +- .../regular-pattern-heterogeneous-sequences.md | 2 +- public/conferences/paris-2024/scala-2-7-7.md | 2 +- .../scala-pattern-matching-for-dsl.md | 2 +- .../paris-2024/tools-scala-startup.md | 2 +- .../paris-2024/tools-scala-workshop.md | 2 +- .../paris-2024/web-dev-with-scala.md | 2 +- .../paris-2024/when-to-betray-fp-principles.md | 2 +- .../paris-2024/zero-to-prod-with-pillars.md | 2 +- .../paris-2024/zk-voting-scala-rust.md | 2 +- .../images/{ => profiles}/orgas/jWinandy.webp | Bin .../images/{ => profiles}/orgas/jbKaiser.webp | Bin .../images/{ => profiles}/orgas/lNouguier.webp | Bin .../images/{ => profiles}/orgas/mKarassev.webp | Bin public/images/{ => profiles}/orgas/qAdam.webp | Bin public/images/{ => profiles}/orgas/wRadji.webp | Bin public/images/profiles/paris-2024/aWarski.webp | Bin 12430 -> 0 bytes public/images/profiles/paris-2024/jim.webp | Bin 7848 -> 0 bytes public/images/profiles/paris-2024/oMazhara.webp | Bin 17548 -> 0 bytes .../images/profiles/paris-2024/rLemaitre.webp | Bin 10894 -> 0 bytes .../images/profiles/paris-2024/vBergeron.webp | Bin 27036 -> 0 bytes .../{nantes-2024 => speakers}/aBlondeau.webp | Bin .../{nantes-2024 => speakers}/aCros.webp | Bin .../{paris-2024 => speakers}/aHearn.jpg | Bin .../{paris-2024 => speakers}/aHernandez.webp | Bin .../{paris-2024 => speakers}/aRainko.webp | Bin .../{nantes-2024 => speakers}/aWarski.webp | Bin .../{nantes-2024 => speakers}/bJaglin.webp | Bin .../{paris-2024 => speakers}/cCalves.webp | Bin .../{paris-2024 => speakers}/dAmorosi.webp | Bin .../{paris-2024 => speakers}/dAntunes.webp | Bin .../{paris-2024 => speakers}/dCiocirlan.webp | Bin .../{nantes-2024 => speakers}/dPlaindoux.webp | Bin .../{nantes-2024 => speakers}/eCrance.webp | Bin .../{nantes-2024 => speakers}/fLaroche.webp | Bin .../{nantes-2024 => speakers}/fSarradin.webp | Bin .../{paris-2024 => speakers}/gRenoux.webp | Bin .../{paris-2024 => speakers}/jThompson.webp | Bin .../{nantes-2024 => speakers}/jVauchel.webp | Bin .../{nantes-2024 => speakers}/jbKaiser.webp | Bin .../profiles/{nantes-2024 => speakers}/jim.webp | Bin .../{paris-2024 => speakers}/kKalra.webp | Bin .../{nantes-2024 => speakers}/lBialy.webp | Bin .../{paris-2024 => speakers}/lHaoyi.webp | Bin .../{nantes-2024 => speakers}/mBaechler.webp | Bin .../{paris-2024 => speakers}/mKubuszok.webp | Bin .../{nantes-2024 => speakers}/mMcGuigan.webp | Bin .../{nantes-2024 => speakers}/mRebiai.webp | Bin .../{paris-2024 => speakers}/mStozek.webp | Bin .../{paris-2024 => speakers}/nRinaudo.jpeg | Bin .../{nantes-2024 => speakers}/oMazhara.webp | Bin .../{nantes-2024 => speakers}/oMelois.webp | Bin .../{paris-2024 => speakers}/oNouguier.webp | Bin .../{nantes-2024 => speakers}/pMatthews.webp | Bin .../{nantes-2024 => speakers}/rClaude.webp | Bin .../{paris-2024 => speakers}/rJolly.webp | Bin .../{paris-2024 => speakers}/rKuckaertz.webp | Bin .../{nantes-2024 => speakers}/rLemaitre.webp | Bin .../{paris-2024 => speakers}/rTyley.webp | Bin .../{nantes-2024 => speakers}/sBernard.webp | Bin .../{nantes-2024 => speakers}/sCollard.webp | Bin .../{paris-2024 => speakers}/tMikula.webp | Bin .../{nantes-2024 => speakers}/toli.webp | Bin .../profiles/{nantes-2024 => speakers}/uli.webp | Bin .../{nantes-2024 => speakers}/vBergeron.webp | Bin .../{paris-2024 => speakers}/vKasas.jpeg | Bin .../{paris-2024 => speakers}/vPitula.webp | Bin .../xVanDeWoestyne.webp | Bin .../{nantes-2024 => speakers}/xVdW.webp | Bin src/main/scala/io/scala/app/faq/FAQView.scala | 15 +-------------- src/main/scala/io/scala/models/Organizer.scala | 2 +- src/main/scala/io/scala/views/IndexView.scala | 2 +- 113 files changed, 59 insertions(+), 72 deletions(-) rename public/images/{ => profiles}/orgas/jWinandy.webp (100%) rename public/images/{ => profiles}/orgas/jbKaiser.webp (100%) rename public/images/{ => profiles}/orgas/lNouguier.webp (100%) rename public/images/{ => profiles}/orgas/mKarassev.webp (100%) rename public/images/{ => profiles}/orgas/qAdam.webp (100%) rename public/images/{ => profiles}/orgas/wRadji.webp (100%) delete mode 100644 public/images/profiles/paris-2024/aWarski.webp delete mode 100644 public/images/profiles/paris-2024/jim.webp delete mode 100644 public/images/profiles/paris-2024/oMazhara.webp delete mode 100644 public/images/profiles/paris-2024/rLemaitre.webp delete mode 100644 public/images/profiles/paris-2024/vBergeron.webp rename public/images/profiles/{nantes-2024 => speakers}/aBlondeau.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/aCros.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/aHearn.jpg (100%) rename public/images/profiles/{paris-2024 => speakers}/aHernandez.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/aRainko.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/aWarski.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/bJaglin.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/cCalves.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/dAmorosi.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/dAntunes.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/dCiocirlan.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/dPlaindoux.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/eCrance.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/fLaroche.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/fSarradin.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/gRenoux.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/jThompson.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/jVauchel.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/jbKaiser.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/jim.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/kKalra.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/lBialy.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/lHaoyi.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/mBaechler.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/mKubuszok.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/mMcGuigan.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/mRebiai.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/mStozek.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/nRinaudo.jpeg (100%) rename public/images/profiles/{nantes-2024 => speakers}/oMazhara.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/oMelois.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/oNouguier.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/pMatthews.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/rClaude.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/rJolly.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/rKuckaertz.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/rLemaitre.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/rTyley.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/sBernard.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/sCollard.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/tMikula.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/toli.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/uli.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/vBergeron.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/vKasas.jpeg (100%) rename public/images/profiles/{paris-2024 => speakers}/vPitula.webp (100%) rename public/images/profiles/{paris-2024 => speakers}/xVanDeWoestyne.webp (100%) rename public/images/profiles/{nantes-2024 => speakers}/xVdW.webp (100%) diff --git a/public/conferences/nantes-2024/armored-type-safety-with-iron.md b/public/conferences/nantes-2024/armored-type-safety-with-iron.md index b149aa3a..a48e349a 100644 --- a/public/conferences/nantes-2024/armored-type-safety-with-iron.md +++ b/public/conferences/nantes-2024/armored-type-safety-with-iron.md @@ -23,7 +23,7 @@ In this talk, we’ll show first the different technique we can use to apply con ### Raphaël Lemaitre -- photoRelPath: /images/profiles/nantes-2024/rLemaitre.webp +- photoRelPath: /images/profiles/speakers/rLemaitre.webp - job: Senior Staff Engineer @ Ledger #### Links @@ -47,7 +47,7 @@ My interests span from software development to history and technology, where I e ### Valentin Bergeron -- photoRelPath: /images/profiles/nantes-2024/vBergeron.webp +- photoRelPath: /images/profiles/speakers/vBergeron.webp - job: Engineering team lead @ Ledger #### Links diff --git a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md b/public/conferences/nantes-2024/chasing-arrows-functors-monads.md index 30a86a20..61c29160 100644 --- a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md +++ b/public/conferences/nantes-2024/chasing-arrows-functors-monads.md @@ -26,7 +26,7 @@ This ScalaIO talk will be a overview of the EPITA CT4P course, with emphasis on ### Jim Newton -- photoRelPath: /images/profiles/nantes-2024/jim.webp +- photoRelPath: /images/profiles/speakers/jim.webp - job: Researcher @ EPITA Le Kremlin-Bicêtre #### Links @@ -46,7 +46,7 @@ Jim has been programming off and on in Scala for about 5 years. ### Uli Fahrenberg -- photoRelPath: /images/profiles/nantes-2024/uli.webp +- photoRelPath: /images/profiles/speakers/uli.webp - job: @ EPITA Rennes #### Links diff --git a/public/conferences/nantes-2024/contravariance-intuition-building.md b/public/conferences/nantes-2024/contravariance-intuition-building.md index 86372fba..324a1c35 100644 --- a/public/conferences/nantes-2024/contravariance-intuition-building.md +++ b/public/conferences/nantes-2024/contravariance-intuition-building.md @@ -31,7 +31,7 @@ We’ll begin by working with an Animal type hierarchy and some PetRescue and Pe ### Sophie Collard -- photoRelPath: /images/profiles/nantes-2024/sCollard.webp +- photoRelPath: /images/profiles/speakers/sCollard.webp - job: Lead Software Engineer @ JPMorgan #### Links diff --git a/public/conferences/nantes-2024/data-pipelines-simple.md b/public/conferences/nantes-2024/data-pipelines-simple.md index a728cade..8e278411 100644 --- a/public/conferences/nantes-2024/data-pipelines-simple.md +++ b/public/conferences/nantes-2024/data-pipelines-simple.md @@ -17,7 +17,7 @@ Most organizations have data pipelines and those are growing by the minute. But ### Raphael Claude -- photoRelPath: /images/profiles/nantes-2024/rClaude.webp +- photoRelPath: /images/profiles/speakers/rClaude.webp - job: Staff Dev Lead @ Criteo #### Links diff --git a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md b/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md index 3059a3c1..705442e4 100644 --- a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md +++ b/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md @@ -23,7 +23,7 @@ Nous aborderons: le type fonctionnel dépendant, la paire dépendante, le type s ### Didier Plaindoux -- photoRelPath: /images/profiles/nantes-2024/dPlaindoux.webp +- photoRelPath: /images/profiles/speakers/dPlaindoux.webp - job: Senior Software Engineer @ Fungus (Freelance) #### Links diff --git a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md b/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md index d78d909a..c9487ad5 100644 --- a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md +++ b/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md @@ -17,7 +17,7 @@ In my talk I will briefly introduce Besom, a Pulumi SDK for Scala and then swift ### Łukasz Biały -- photoRelPath: /images/profiles/nantes-2024/lBialy.webp +- photoRelPath: /images/profiles/speakers/lBialy.webp - job: Software Engineer @ VirtusLab #### Links diff --git a/public/conferences/nantes-2024/intro-to-gadts.md b/public/conferences/nantes-2024/intro-to-gadts.md index da53063b..718e50d4 100644 --- a/public/conferences/nantes-2024/intro-to-gadts.md +++ b/public/conferences/nantes-2024/intro-to-gadts.md @@ -17,7 +17,7 @@ Les GADTs et Scala, c’est une très longue histoire de “je t’aime, moi non ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/nantes-2024/xVdW.webp +- photoRelPath: /images/profiles/speakers/xVdW.webp - job: Software Engineer @ The Funkyworkers #### Links diff --git a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md b/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md index 932cba6f..c58cb731 100644 --- a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md +++ b/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md @@ -23,7 +23,7 @@ This talk will serve as an introduction to the Smithy IDL, and a demo of what is ### Olivier Mélois -- photoRelPath: /images/profiles/nantes-2024/oMelois.webp +- photoRelPath: /images/profiles/speakers/oMelois.webp - job: Principal Engineer @ Disney Streaming Services #### Links diff --git a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md b/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md index 0db262a2..2d6fceb8 100644 --- a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md +++ b/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md @@ -27,7 +27,7 @@ Si vous êtes intéressés, nous serons ravis de récolter vos retours et vos co ### Johanna Vauchel -- photoRelPath: /images/profiles/nantes-2024/jVauchel.webp +- photoRelPath: /images/profiles/speakers/jVauchel.webp - job: Data Engineer @ Lectra #### Links @@ -44,7 +44,7 @@ Diplômée de l'INSA de Rouen spécialité Génie Mathématique, j'ai commencé ### Mehdi Rebiai -- photoRelPath: /images/profiles/nantes-2024/mRebiai.webp +- photoRelPath: /images/profiles/speakers/mRebiai.webp - job: Data Engineer, Tech Lead @ Lectra - confirmed: true diff --git a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md b/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md index fe1d3d41..595b52d0 100644 --- a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md +++ b/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md @@ -17,7 +17,7 @@ Since the beginning of the 21st century, the functional programming paradigm, wh ### Enzo Crance -- photoRelPath: /images/profiles/nantes-2024/eCrance.webp +- photoRelPath: /images/profiles/speakers/eCrance.webp - job: PhD Student @ INRIA #### Links diff --git a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md b/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md index 08e7704c..025213b8 100644 --- a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md +++ b/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md @@ -21,7 +21,7 @@ I will briefly introduce how certain features [worked before](https://github.com ### Anthony Cros -- photoRelPath: /images/profiles/nantes-2024/aCros.webp +- photoRelPath: /images/profiles/speakers/aCros.webp - job: Software Architect @ Self-employed #### Links diff --git a/public/conferences/nantes-2024/my-first-year-in-scala.md b/public/conferences/nantes-2024/my-first-year-in-scala.md index 136721cb..27ff70b5 100644 --- a/public/conferences/nantes-2024/my-first-year-in-scala.md +++ b/public/conferences/nantes-2024/my-first-year-in-scala.md @@ -27,7 +27,7 @@ By the end of this talk, I hope that newcomers will feel less alone and more opt ### Monica McGuigan -- photoRelPath: /images/profiles/nantes-2024/mMcGuigan.webp +- photoRelPath: /images/profiles/speakers/mMcGuigan.webp - job: Software Engineer @ JP Morgan #### Links diff --git a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md b/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md index 3e4db610..96c1b870 100644 --- a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md +++ b/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md @@ -24,7 +24,7 @@ the process and how it helped me solved my problems with less pain. ### Matthieu Baechler -- photoRelPath: /images/profiles/nantes-2024/mBaechler.webp +- photoRelPath: /images/profiles/speakers/mBaechler.webp - job: Developer @ Freelancer #### Links diff --git a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md b/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md index 93a2d0fd..f044683a 100644 --- a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md +++ b/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md @@ -26,7 +26,7 @@ tout ça dans le but d'accéder au trésor : Scala 3. ### Antoine Blondeau -- photoRelPath: /images/profiles/nantes-2024/aBlondeau.webp +- photoRelPath: /images/profiles/speakers/aBlondeau.webp - job: Developer @ Clever Cloud #### Links @@ -42,7 +42,7 @@ I'm a backend developer specialized in platform orchestration. I have experience ### Jean-Baptiste Kaiser -- photoRelPath: /images/profiles/nantes-2024/jbKaiser.webp +- photoRelPath: /images/profiles/speakers/jbKaiser.webp - job: Scala Developer @ Clever Cloud - confirmed: true diff --git a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md b/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md index e16542c7..d8b17b9d 100644 --- a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md +++ b/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md @@ -19,7 +19,7 @@ Now, two years later, with the format fleshed out and the lessons learnt, I’d ### Anatolii Kmetiuk -- photoRelPath: /images/profiles/nantes-2024/toli.webp +- photoRelPath: /images/profiles/speakers/toli.webp - job: Compiler engineer and community manager @ Scala Center, EPFL #### Links diff --git a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md b/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md index 9816785c..461e5747 100644 --- a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md +++ b/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md @@ -23,7 +23,7 @@ Topics covered: ### Paul Matthews -- photoRelPath: /images/profiles/nantes-2024/pMatthews.webp +- photoRelPath: /images/profiles/speakers/pMatthews.webp - job: Backend Scala Developer @ ClearScore #### Links diff --git a/public/conferences/nantes-2024/ukraine-scala-community.md b/public/conferences/nantes-2024/ukraine-scala-community.md index f9963434..9bf40f29 100644 --- a/public/conferences/nantes-2024/ukraine-scala-community.md +++ b/public/conferences/nantes-2024/ukraine-scala-community.md @@ -21,7 +21,7 @@ Discover our presence at conferences, active engagement in programs such as Goog ### Olya Mazhara -- photoRelPath: /images/profiles/nantes-2024/oMazhara.webp +- photoRelPath: /images/profiles/speakers/oMazhara.webp - job: Software Engineer @ Intellias #### Links diff --git a/public/conferences/nantes-2024/unleashing-scalafix-potential.md b/public/conferences/nantes-2024/unleashing-scalafix-potential.md index 6ab4699a..a2adb133 100644 --- a/public/conferences/nantes-2024/unleashing-scalafix-potential.md +++ b/public/conferences/nantes-2024/unleashing-scalafix-potential.md @@ -21,7 +21,7 @@ In this talk, we will [demystify AST traversal and semantic information lookup]( ### Brice Jaglin -- photoRelPath: /images/profiles/nantes-2024/bJaglin.webp +- photoRelPath: /images/profiles/speakers/bJaglin.webp - job: Staff Engineer @ Swile #### Links diff --git a/public/conferences/nantes-2024/unwrapping-io.md b/public/conferences/nantes-2024/unwrapping-io.md index b367d2da..a502c939 100644 --- a/public/conferences/nantes-2024/unwrapping-io.md +++ b/public/conferences/nantes-2024/unwrapping-io.md @@ -23,7 +23,7 @@ We will compare both the low-level aspects, as well as take a look at structured ### Adam Warski -- photoRelPath: /images/profiles/nantes-2024/aWarski.webp +- photoRelPath: /images/profiles/speakers/aWarski.webp - job: Co-founder @ SoftwareMill #### Links diff --git a/public/conferences/nantes-2024/use-ai-in-your-programs.md b/public/conferences/nantes-2024/use-ai-in-your-programs.md index fed6411f..b755ed02 100644 --- a/public/conferences/nantes-2024/use-ai-in-your-programs.md +++ b/public/conferences/nantes-2024/use-ai-in-your-programs.md @@ -19,7 +19,7 @@ Une fois ceci fait, je souhaite montrer comment utiliser un modèle en utilisant ### François Laroche -- photoRelPath: /images/profiles/nantes-2024/fLaroche.webp +- photoRelPath: /images/profiles/speakers/fLaroche.webp - job: Tech Lead @ NuMind #### Links @@ -37,7 +37,7 @@ Je suis actuellement développeur chez NuMind où nous aidons nos clients à ent ### Samuel Bernard -- photoRelPath: /images/profiles/nantes-2024/sBernard.webp +- photoRelPath: /images/profiles/speakers/sBernard.webp - job: Co-Founder & CTO @ NuMind #### Links diff --git a/public/conferences/paris-2024/anatomy-scaladex.md b/public/conferences/paris-2024/anatomy-scaladex.md index c8f08894..9cd1ce14 100644 --- a/public/conferences/paris-2024/anatomy-scaladex.md +++ b/public/conferences/paris-2024/anatomy-scaladex.md @@ -19,7 +19,7 @@ In this talk, I will introduce you to Scaladex, an exciting project I began expl ### Kannupriya Kalra -- photoRelPath: /images/profiles/paris-2024/kKalra.webp +- photoRelPath: /images/profiles/speakers/kKalra.webp - job: Scala Developer @ Sky #### Links diff --git a/public/conferences/paris-2024/better-builds-with-mill.md b/public/conferences/paris-2024/better-builds-with-mill.md index 2517f483..dcd59690 100644 --- a/public/conferences/paris-2024/better-builds-with-mill.md +++ b/public/conferences/paris-2024/better-builds-with-mill.md @@ -15,7 +15,7 @@ Mill is a Scala build tool that improves upon the SBT toolchain: more performant ### Li Haoyi -- photoRelPath: /images/profiles/paris-2024/lHaoyi.webp +- photoRelPath: /images/profiles/speakers/lHaoyi.webp - job: N/A #### Links diff --git a/public/conferences/paris-2024/beyond-basics-lsp.md b/public/conferences/paris-2024/beyond-basics-lsp.md index 2e87db01..f0697344 100644 --- a/public/conferences/paris-2024/beyond-basics-lsp.md +++ b/public/conferences/paris-2024/beyond-basics-lsp.md @@ -15,7 +15,7 @@ LSP has greatly standardised the behaviour of IDEs, in a good direction: we can ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp +- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp - job: OCaml Software Engineering at Tarides #### Links diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md b/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md index c4e09e18..46dc1871 100644 --- a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md +++ b/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md @@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d ### Adam Hearn -- photoRelPath: /images/profiles/paris-2024/aHearn.jpg +- photoRelPath: /images/profiles/speakers/aHearn.jpg - job: Sofware Engineer @ Amazon #### Links diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo.md b/public/conferences/paris-2024/building-robust-applications-with-kyo.md index cf29bd78..db3aade6 100644 --- a/public/conferences/paris-2024/building-robust-applications-with-kyo.md +++ b/public/conferences/paris-2024/building-robust-applications-with-kyo.md @@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d ### Adam Hearn -- photoRelPath: /images/profiles/paris-2024/aHearn.jpg +- photoRelPath: /images/profiles/speakers/aHearn.jpg - job: Sofware Engineer @ Amazon #### Links diff --git a/public/conferences/paris-2024/calculating-funnier.md b/public/conferences/paris-2024/calculating-funnier.md index a2aaffbb..29712158 100644 --- a/public/conferences/paris-2024/calculating-funnier.md +++ b/public/conferences/paris-2024/calculating-funnier.md @@ -19,7 +19,7 @@ Expr is very simple though, in real life we seldom face such simplistic cases. T ### Regis Kuckaertz -- photoRelPath: /images/profiles/paris-2024/rKuckaertz.webp +- photoRelPath: /images/profiles/speakers/rKuckaertz.webp - job: Principal Engineer @ Pirum #### Links diff --git a/public/conferences/paris-2024/computer-algebra-scala.md b/public/conferences/paris-2024/computer-algebra-scala.md index 6462b6f2..0df9d7fc 100644 --- a/public/conferences/paris-2024/computer-algebra-scala.md +++ b/public/conferences/paris-2024/computer-algebra-scala.md @@ -15,7 +15,7 @@ The Scala Algebra System (ScAS) is a research project devised to explore how one ### Raphaël Jolly -- photoRelPath: /images/profiles/paris-2024/rJolly.webp +- photoRelPath: /images/profiles/speakers/rJolly.webp - job: Software Engineer #### Links diff --git a/public/conferences/paris-2024/contextual-abstraction-scala3.md b/public/conferences/paris-2024/contextual-abstraction-scala3.md index 1632ff92..f6719253 100644 --- a/public/conferences/paris-2024/contextual-abstraction-scala3.md +++ b/public/conferences/paris-2024/contextual-abstraction-scala3.md @@ -15,7 +15,7 @@ Have you ever been confused by implicits in Scala? I most certainly have. I stru ### Magda Stożek -- photoRelPath: /images/profiles/paris-2024/mStozek.webp +- photoRelPath: /images/profiles/speakers/mStozek.webp - job: Senior Scala engineer @ SoftwareMill #### Links diff --git a/public/conferences/paris-2024/decision4s.md b/public/conferences/paris-2024/decision4s.md index 8a501dfb..c52b04e3 100644 --- a/public/conferences/paris-2024/decision4s.md +++ b/public/conferences/paris-2024/decision4s.md @@ -15,7 +15,7 @@ Higher-kinded data is a specialised application of higher-kinded types. It allow ### Wojciech Pituła -- photoRelPath: /images/profiles/paris-2024/vPitula.webp +- photoRelPath: /images/profiles/speakers/vPitula.webp - job: Staff Engineer @ SwissBorg #### Links diff --git a/public/conferences/paris-2024/escaping-false-dichotomy.md b/public/conferences/paris-2024/escaping-false-dichotomy.md index f544c0c4..29bf8407 100644 --- a/public/conferences/paris-2024/escaping-false-dichotomy.md +++ b/public/conferences/paris-2024/escaping-false-dichotomy.md @@ -15,7 +15,7 @@ Are you using one of many type-class based libraries in Scala? Have you ever bee ### Mateusz Kubuszok -- photoRelPath: /images/profiles/paris-2024/mKubuszok.webp +- photoRelPath: /images/profiles/speakers/mKubuszok.webp - job: Senior Scala Developer @ Self-Employed #### Links diff --git a/public/conferences/paris-2024/fast-scala-web-workshop.md b/public/conferences/paris-2024/fast-scala-web-workshop.md index 7db50d58..7a268eef 100644 --- a/public/conferences/paris-2024/fast-scala-web-workshop.md +++ b/public/conferences/paris-2024/fast-scala-web-workshop.md @@ -19,7 +19,7 @@ In this workshop we will introduce you to the FastScala framework, it's installa ### David Miguel Antunes -- photoRelPath: /images/profiles/paris-2024/dAntunes.webp +- photoRelPath: /images/profiles/speakers/dAntunes.webp - job: Scala Developer & founder @ Scala Academy #### Links diff --git a/public/conferences/paris-2024/fast-scala-web.md b/public/conferences/paris-2024/fast-scala-web.md index de922884..24fcf6f8 100644 --- a/public/conferences/paris-2024/fast-scala-web.md +++ b/public/conferences/paris-2024/fast-scala-web.md @@ -15,7 +15,7 @@ The FastScala web framework is based on anonymous and secure callbacks from the ### David Miguel Antunes -- photoRelPath: /images/profiles/paris-2024/dAntunes.webp +- photoRelPath: /images/profiles/speakers/dAntunes.webp - job: Scala Developer & founder @ Scala Academy #### Links diff --git a/public/conferences/paris-2024/full-stack-scala.md b/public/conferences/paris-2024/full-stack-scala.md index c84c1b3f..b6226a3a 100644 --- a/public/conferences/paris-2024/full-stack-scala.md +++ b/public/conferences/paris-2024/full-stack-scala.md @@ -17,7 +17,7 @@ All set up in 10 seconds. ### Olivier Nouguier -- photoRelPath: /images/profiles/paris-2024/oNouguier.webp +- photoRelPath: /images/profiles/speakers/oNouguier.webp - job: Software Engineer @ Ledger #### Links diff --git a/public/conferences/paris-2024/how-functional-is-direct-style.md b/public/conferences/paris-2024/how-functional-is-direct-style.md index edddd4fb..eca30df5 100644 --- a/public/conferences/paris-2024/how-functional-is-direct-style.md +++ b/public/conferences/paris-2024/how-functional-is-direct-style.md @@ -19,7 +19,7 @@ We’ll investigate what functional programming is at its core, how it relates t ### Adam Warski -- photoRelPath: /images/profiles/paris-2024/aWarski.webp +- photoRelPath: /images/profiles/speakers/aWarski.webp - job: Co-founder @ SoftwareMill #### Links diff --git a/public/conferences/paris-2024/keynote-nicolas.md b/public/conferences/paris-2024/keynote-nicolas.md index 4577da37..48b347fb 100644 --- a/public/conferences/paris-2024/keynote-nicolas.md +++ b/public/conferences/paris-2024/keynote-nicolas.md @@ -17,7 +17,7 @@ In this talk, I will show you how to create a programming language from scratch ### Nicolas Rinaudo -- photoRelPath: /images/profiles/paris-2024/nRinaudo.jpeg +- photoRelPath: /images/profiles/speakers/nRinaudo.jpeg - job: VP of Engineering @ J.P. Morgan #### Links diff --git a/public/conferences/paris-2024/keynote-valentin.md b/public/conferences/paris-2024/keynote-valentin.md index d8966744..de59472b 100644 --- a/public/conferences/paris-2024/keynote-valentin.md +++ b/public/conferences/paris-2024/keynote-valentin.md @@ -19,7 +19,7 @@ Bring your heart, and maybe a notebook. ### Valentin Kasas -- photoRelPath: /images/profiles/paris-2024/vKasas.jpeg +- photoRelPath: /images/profiles/speakers/vKasas.jpeg - job: Scala Lover #### Links diff --git a/public/conferences/paris-2024/metaprogramming-in-scala3.md b/public/conferences/paris-2024/metaprogramming-in-scala3.md index 425f7644..c575e93b 100644 --- a/public/conferences/paris-2024/metaprogramming-in-scala3.md +++ b/public/conferences/paris-2024/metaprogramming-in-scala3.md @@ -29,7 +29,7 @@ In short, we’ll be exploring the compile-time arsenal that Scala 3 gives us wi ### Aleksander Rainko -- photoRelPath: /images/profiles/paris-2024/aRainko.webp +- photoRelPath: /images/profiles/speakers/aRainko.webp - job: Scala Developer @ Scalac #### Links diff --git a/public/conferences/paris-2024/mill-builds-scala3.md b/public/conferences/paris-2024/mill-builds-scala3.md index 0b056591..d555cd9b 100644 --- a/public/conferences/paris-2024/mill-builds-scala3.md +++ b/public/conferences/paris-2024/mill-builds-scala3.md @@ -15,7 +15,7 @@ Mill is a popular build tool used in Scala projects, where build definitions are ### Jamie Thompson -- photoRelPath: /images/profiles/paris-2024/jThompson.webp +- photoRelPath: /images/profiles/speakers/jThompson.webp - job: Scala 3 compiler contributor #### Links diff --git a/public/conferences/paris-2024/optimize-kafka-to-bq.md b/public/conferences/paris-2024/optimize-kafka-to-bq.md index 0ac8a327..83312698 100644 --- a/public/conferences/paris-2024/optimize-kafka-to-bq.md +++ b/public/conferences/paris-2024/optimize-kafka-to-bq.md @@ -15,7 +15,7 @@ I will explore how our team developed a custom solution to address the escalatin ### Dario Amorosi -- photoRelPath: /images/profiles/paris-2024/dAmorosi.webp +- photoRelPath: /images/profiles/speakers/dAmorosi.webp - job: Big Data Engineer @ Adevinta #### Links diff --git a/public/conferences/paris-2024/plowing-postgres.md b/public/conferences/paris-2024/plowing-postgres.md index 4fae787a..a77c0fe6 100644 --- a/public/conferences/paris-2024/plowing-postgres.md +++ b/public/conferences/paris-2024/plowing-postgres.md @@ -21,7 +21,7 @@ Join to learn more about applying functional principle to schema modeling and ha ### Valentin Bergeron -- photoRelPath: /images/profiles/paris-2024/vBergeron.webp +- photoRelPath: /images/profiles/speakers/vBergeron.webp - job: Engineering team lead @ Ledger - confirmed: true diff --git a/public/conferences/paris-2024/profunctor.md b/public/conferences/paris-2024/profunctor.md index 27f17e35..9c1f9f08 100644 --- a/public/conferences/paris-2024/profunctor.md +++ b/public/conferences/paris-2024/profunctor.md @@ -15,7 +15,7 @@ Surprise 👀 ### Xavier Van de Woestyne -- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp +- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp - job: OCaml Software Engineering at Tarides #### Links diff --git a/public/conferences/paris-2024/publish-to-maven.md b/public/conferences/paris-2024/publish-to-maven.md index ef9e475b..0c0b610d 100644 --- a/public/conferences/paris-2024/publish-to-maven.md +++ b/public/conferences/paris-2024/publish-to-maven.md @@ -21,7 +21,7 @@ This talk will show how the Guardian’s new GitHub Action release workflow make ### Roberto Tyley -- photoRelPath: /images/profiles/paris-2024/rTyley.webp +- photoRelPath: /images/profiles/speakers/rTyley.webp - job: Principal Engineer @ The Guardian #### Links diff --git a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md b/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md index ecf23471..5a66cc93 100644 --- a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md +++ b/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md @@ -43,7 +43,7 @@ The project is available [here](https://github.com/jimka2001/scala-rte) ### Jim Newton -- photoRelPath: /images/profiles/paris-2024/jim.webp +- photoRelPath: /images/profiles/speakers/jim.webp - job: Teacher & Researcher @ EPITA #### Links diff --git a/public/conferences/paris-2024/scala-2-7-7.md b/public/conferences/paris-2024/scala-2-7-7.md index 7fd1d1f1..ecd7b396 100644 --- a/public/conferences/paris-2024/scala-2-7-7.md +++ b/public/conferences/paris-2024/scala-2-7-7.md @@ -19,7 +19,7 @@ It is expected that many people from the audience get surprised about the sbt pr ### Alexis Hernandez -- photoRelPath: /images/profiles/paris-2024/aHernandez.webp +- photoRelPath: /images/profiles/speakers/aHernandez.webp - job: Principal Scala Consultant @ wiringbits #### Links diff --git a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md b/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md index f50650ea..ee9efd74 100644 --- a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md +++ b/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md @@ -21,7 +21,7 @@ The technique is used in the Libretto project for pattern matching on domain-lev ### Tomas Mikula -- photoRelPath: /images/profiles/paris-2024/tMikula.webp +- photoRelPath: /images/profiles/speakers/tMikula.webp - job: Lead Scala developer #### Links diff --git a/public/conferences/paris-2024/tools-scala-startup.md b/public/conferences/paris-2024/tools-scala-startup.md index 830725a2..6ab90a90 100644 --- a/public/conferences/paris-2024/tools-scala-startup.md +++ b/public/conferences/paris-2024/tools-scala-startup.md @@ -26,7 +26,7 @@ I will share ### Daniel Ciocîrlan -- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp +- photoRelPath: /images/profiles/speakers/dCiocirlan.webp - job: Software Engineer & instructor @ Rock the JVM #### Links diff --git a/public/conferences/paris-2024/tools-scala-workshop.md b/public/conferences/paris-2024/tools-scala-workshop.md index dd972cf6..fa059c6a 100644 --- a/public/conferences/paris-2024/tools-scala-workshop.md +++ b/public/conferences/paris-2024/tools-scala-workshop.md @@ -19,7 +19,7 @@ This hands-on workshop will teach you the essential skills and toolkit to launch ### Daniel Ciocîrlan -- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp +- photoRelPath: /images/profiles/speakers/dCiocirlan.webp - job: Software Engineer & instructor @ Rock the JVM #### Links diff --git a/public/conferences/paris-2024/web-dev-with-scala.md b/public/conferences/paris-2024/web-dev-with-scala.md index 710a632b..ffeb4727 100644 --- a/public/conferences/paris-2024/web-dev-with-scala.md +++ b/public/conferences/paris-2024/web-dev-with-scala.md @@ -19,7 +19,7 @@ A case study on creating a library management system for the Franco-Ukrainian To ### Olya Mazhara -- photoRelPath: /images/profiles/paris-2024/oMazhara.webp +- photoRelPath: /images/profiles/speakers/oMazhara.webp - job: Software Engineer @ Intellias #### Links diff --git a/public/conferences/paris-2024/when-to-betray-fp-principles.md b/public/conferences/paris-2024/when-to-betray-fp-principles.md index 7ad9af76..7d3f8e04 100644 --- a/public/conferences/paris-2024/when-to-betray-fp-principles.md +++ b/public/conferences/paris-2024/when-to-betray-fp-principles.md @@ -17,7 +17,7 @@ Of course, I’ll bring a few benchmarks to show the differences. And while we ### Gaël Renoux -- photoRelPath: /images/profiles/paris-2024/gRenoux.webp +- photoRelPath: /images/profiles/speakers/gRenoux.webp - job: Staff Engineer @ DataDome #### Links diff --git a/public/conferences/paris-2024/zero-to-prod-with-pillars.md b/public/conferences/paris-2024/zero-to-prod-with-pillars.md index c0038d26..713a76ae 100644 --- a/public/conferences/paris-2024/zero-to-prod-with-pillars.md +++ b/public/conferences/paris-2024/zero-to-prod-with-pillars.md @@ -25,7 +25,7 @@ Whether you’re a seasoned Scala developer or just getting started, this sessio ### Raphaël Lemaitre -- photoRelPath: /images/profiles/paris-2024/rLemaitre.webp +- photoRelPath: /images/profiles/speakers/rLemaitre.webp - job: Senior Staff Engineer @ Ledger #### Links diff --git a/public/conferences/paris-2024/zk-voting-scala-rust.md b/public/conferences/paris-2024/zk-voting-scala-rust.md index b7feca5a..b398a562 100644 --- a/public/conferences/paris-2024/zk-voting-scala-rust.md +++ b/public/conferences/paris-2024/zk-voting-scala-rust.md @@ -17,7 +17,7 @@ I’ll start by presenting the challenges of anonymous electronic voting and the ### Christophe Calvès -- photoRelPath: /images/profiles/paris-2024/cCalves.webp +- photoRelPath: /images/profiles/speakers/cCalves.webp - job: Data Architect @ Ledger #### Links diff --git a/public/images/orgas/jWinandy.webp b/public/images/profiles/orgas/jWinandy.webp similarity index 100% rename from public/images/orgas/jWinandy.webp rename to public/images/profiles/orgas/jWinandy.webp diff --git a/public/images/orgas/jbKaiser.webp b/public/images/profiles/orgas/jbKaiser.webp similarity index 100% rename from public/images/orgas/jbKaiser.webp rename to public/images/profiles/orgas/jbKaiser.webp diff --git a/public/images/orgas/lNouguier.webp b/public/images/profiles/orgas/lNouguier.webp similarity index 100% rename from public/images/orgas/lNouguier.webp rename to public/images/profiles/orgas/lNouguier.webp diff --git a/public/images/orgas/mKarassev.webp b/public/images/profiles/orgas/mKarassev.webp similarity index 100% rename from public/images/orgas/mKarassev.webp rename to public/images/profiles/orgas/mKarassev.webp diff --git a/public/images/orgas/qAdam.webp b/public/images/profiles/orgas/qAdam.webp similarity index 100% rename from public/images/orgas/qAdam.webp rename to public/images/profiles/orgas/qAdam.webp diff --git a/public/images/orgas/wRadji.webp b/public/images/profiles/orgas/wRadji.webp similarity index 100% rename from public/images/orgas/wRadji.webp rename to public/images/profiles/orgas/wRadji.webp diff --git a/public/images/profiles/paris-2024/aWarski.webp b/public/images/profiles/paris-2024/aWarski.webp deleted file mode 100644 index c8f48eaa9dd16dffbae8fc42bcce3e0ad2395e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12430 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 diff --git a/public/images/profiles/paris-2024/jim.webp b/public/images/profiles/paris-2024/jim.webp deleted file mode 100644 index 059ff65d8d1d8a6b86a2f863269531d7ad4893ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7848 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 G0000%GG~hb diff --git a/public/images/profiles/paris-2024/oMazhara.webp b/public/images/profiles/paris-2024/oMazhara.webp deleted file mode 100644 index 2d03baa07c85421dd2933497ddab5c0c1ee7a98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17548 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

$EzzVy)6-BbBW;XYe%1c&g5VlhNhlVkSX!GC3- zf8j5-r{I{i!u%pPt)$+C<769AW8P?CY9mz|hvoo#V}*zLBGskv{=yuKrx;GVC8YUn zs&Al&x4*jYY51Hu`z2lc>tJ*QWr|R!|4s~Y4s?_PCAy+=rtwE`*byH*iWw~u-UJhV zcK7}0Q$@itt?j6JZLWK2lHgyHG47MK$Va$j$>!Xqi7hoZieAC=D+v-S66 zVSM2xt(*|WEkgUmap1>_2D4c@^VuCN&#{YR+!dK^8Req#TT?R5UMhCZ$I2Qftby>W z3g^UCANE~5m5)=AgXU@}s04T*Plh`pZq%~<_q{1WL-@O>JD)5~7oCc$%DAilDKg(y zHKnxtBypQHL~q|;tK?+*>~qyd_do{?Hp#Jk_K*%y(;_2M&ib%=9BCGX2e_I&S_Emx$N_ zuSsvJfY$=q${$oHVM@n74!=r-`ITMrFL-0F(>noq1cv+5ZF^%MN|HGIF0zH<9O{8h zMUH6PPu~H(5E9s?4!#>=%7_ASv2Xs3({6o2w*>Oe-G^ZKN`;pJRAOOHBSr3i+abj_ zLp~fU418}UvZSUiDk8&Db0Qs*>Y_?h$ZS6?>oBr&DfoEH#OX5WPb+gE=F>@WmTQh& zH@+VUaSWtqykk@Tera%KUW%tcGrM+B1F-BJ#KUr&SRQ)Uz;WjYZbtg2I974QqpT09>%10cjNR~c>Kd~uD;_HSZP zEmOU+p#k}1Wg(nnkOg3_aS%CoK}oKhL=Le5UEJDbF-wY>+ULrIe2nn5Q7DyU;ZjH- zY4m(%oQC$=;a}6cSDEFx%f-3~0-pFA7nl%VQy_dVRe}x2F?9A18Wq`{eVTXCUErE} zGSHYjDVux zyakq**36#<0l!-EJ8l70h^le#^Ir&w;cUq+i@Zi_;LIULbN4(ziCs*(wzCu9ne7ZO z1!v>_T(y&ZPIb5zPkKB{e9`dQh9MooVOpDxs$F$dCn8hQ9KfWg#}N?<@oW2MF~dAx z2D-;RIXQB+(=83Jy+l<76DE=8%DPvZil`|6vU(@+?p3v&1zeZqFmy7w01lc0Aur893A;zY z;Ala@_VK+rE!e$e$%qWB8CH3x>9-aW90_|}RvnbtAe}YbB?3lp8E64|>(Fc?z@xwY zFkd)XNbVscC`I1UtjyH)Yq3_O#@gCqM67rO-fR n$24w$C8EaI$~V<&O%=Z$RjNVO!s1SYQtLQ%6l8dQbr1jmRbnd4 diff --git a/public/images/profiles/paris-2024/rLemaitre.webp b/public/images/profiles/paris-2024/rLemaitre.webp deleted file mode 100644 index 683623c3e62616a2ff7b834f3e294ef586a1d364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10894 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 z 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 s"/images/orgas/$path") + def photoPath = photo.fold(io.scala.profilePlaceholder)(path => s"/images/profiles/orgas/$path") diff --git a/src/main/scala/io/scala/views/IndexView.scala b/src/main/scala/io/scala/views/IndexView.scala index 6e275fa0..eff8812a 100644 --- a/src/main/scala/io/scala/views/IndexView.scala +++ b/src/main/scala/io/scala/views/IndexView.scala @@ -44,7 +44,7 @@ case object IndexView extends ReactiveView[IndexPage] { .flatMap: talk => talk.speakers.map((_, talk)) .groupMap(_._1)(_._2) - .mapValues(_.distinctBy(_.info.kind).sortBy(_.info.kind)) + .mapValues(_.sortBy(_.info.kind)) .toSeq .sortBy(_._1) From 20bf01eb84515b925c1758ba3da4c35830069f84 Mon Sep 17 00:00:00 2001 From: Lucas Nouguier Date: Sat, 9 Nov 2024 14:23:17 +0100 Subject: [PATCH 2/4] fix: data generation --- build.sbt | 32 ++++++++---------- index.html | 4 +-- public/.git-blame-ignore-revs | 0 .../armored-type-safety-with-iron.md | 0 .../chasing-arrows-functors-monads.md | 2 +- .../contravariance-intuition-building.md | 2 +- .../{ => sessions}/data-pipelines-simple.md | 2 +- ...dependent-types-from-theory-to-practice.md | 0 .../hands-on-besom-iac-with-scala.md | 2 +- .../{ => sessions}/intro-to-gadts.md | 2 +- .../introduction-to-smithy-smithy4s.md | 0 .../kapoeira-with-kafka-streams.md | 0 ...ta-programming-for-functional-languages.md | 0 .../migrating-gallia-to-scala-3.md | 2 +- .../{ => sessions}/my-first-year-in-scala.md | 2 +- .../nails-are-tree-need-chainsaw.md | 2 +- .../rex-migration-scala-2-to-3.md | 0 .../scala-3-compiler-academy-journey.md | 0 .../songwriting-in-scala-dsl-and-adt.md | 0 .../{ => sessions}/ukraine-scala-community.md | 2 +- .../unleashing-scalafix-potential.md | 2 +- .../{ => sessions}/unwrapping-io.md | 0 .../{ => sessions}/use-ai-in-your-programs.md | 0 .../nantes-2024}/slides/2024/Chainsaw.pdf | Bin .../slides/2024/Contravariance.pdf | Bin .../slides/2024/GADTs-xavier-vw-woestyne.pdf | Bin .../nantes-2024}/slides/2024/besom.pdf | Bin .../slides/2024/chasing-arrows.pdf | Bin .../slides/2024/data-pipeline.pptx | Bin .../slides/2024/first-year-scala.pdf | Bin .../slides/2024/gallia-migration.pdf | Bin .../scala-community-building-lessons.pptx | Bin .../nantes-2024}/slides/2024/scalafix.pdf | Bin .../nantes-2024/sponsors.md} | 0 .../{ => sessions}/anatomy-scaladex.md | 0 .../{ => sessions}/better-builds-with-mill.md | 0 .../{ => sessions}/beyond-basics-lsp.md | 0 ...ding-robust-applications-with-kyo-intro.md | 0 .../building-robust-applications-with-kyo.md | 0 .../{ => sessions}/calculating-funnier.md | 0 .../{ => sessions}/computer-algebra-scala.md | 0 .../contextual-abstraction-scala3.md | 0 .../paris-2024/{ => sessions}/decision4s.md | 0 .../escaping-false-dichotomy.md | 0 .../{ => sessions}/fast-scala-web-workshop.md | 0 .../{ => sessions}/fast-scala-web.md | 0 .../{ => sessions}/full-stack-scala.md | 0 .../how-functional-is-direct-style.md | 0 .../{ => sessions}/keynote-nicolas.md | 0 .../{ => sessions}/keynote-valentin.md | 0 .../metaprogramming-in-scala3.md | 0 .../{ => sessions}/mill-builds-scala3.md | 0 .../{ => sessions}/optimize-kafka-to-bq.md | 0 .../{ => sessions}/plowing-postgres.md | 0 .../paris-2024/{ => sessions}/profunctor.md | 0 .../{ => sessions}/publish-to-maven.md | 0 ...regular-pattern-heterogeneous-sequences.md | 0 .../paris-2024/{ => sessions}/scala-2-7-7.md | 0 .../scala-pattern-matching-for-dsl.md | 0 .../{ => sessions}/tools-scala-startup.md | 0 .../{ => sessions}/tools-scala-workshop.md | 0 .../{ => sessions}/web-dev-with-scala.md | 0 .../when-to-betray-fp-principles.md | 0 .../zero-to-prod-with-pillars.md | 0 .../{ => sessions}/zk-voting-scala-rust.md | 0 .../paris-2024/sponsors.md} | 0 public/{ => logos}/favicon.ico | Bin public/{ => logos}/scalaio-opengraph.webp | Bin public/{ => logos}/scalaio.svg | 0 public/{ => logos}/scalaio_black.svg | 0 70 files changed, 27 insertions(+), 29 deletions(-) delete mode 100644 public/.git-blame-ignore-revs rename public/conferences/nantes-2024/{ => sessions}/armored-type-safety-with-iron.md (100%) rename public/conferences/nantes-2024/{ => sessions}/chasing-arrows-functors-monads.md (97%) rename public/conferences/nantes-2024/{ => sessions}/contravariance-intuition-building.md (96%) rename public/conferences/nantes-2024/{ => sessions}/data-pipelines-simple.md (93%) rename public/conferences/nantes-2024/{ => sessions}/dependent-types-from-theory-to-practice.md (100%) rename public/conferences/nantes-2024/{ => sessions}/hands-on-besom-iac-with-scala.md (94%) rename public/conferences/nantes-2024/{ => sessions}/intro-to-gadts.md (92%) rename public/conferences/nantes-2024/{ => sessions}/introduction-to-smithy-smithy4s.md (100%) rename public/conferences/nantes-2024/{ => sessions}/kapoeira-with-kafka-streams.md (100%) rename public/conferences/nantes-2024/{ => sessions}/logic-meta-programming-for-functional-languages.md (100%) rename public/conferences/nantes-2024/{ => sessions}/migrating-gallia-to-scala-3.md (97%) rename public/conferences/nantes-2024/{ => sessions}/my-first-year-in-scala.md (96%) rename public/conferences/nantes-2024/{ => sessions}/nails-are-tree-need-chainsaw.md (94%) rename public/conferences/nantes-2024/{ => sessions}/rex-migration-scala-2-to-3.md (100%) rename public/conferences/nantes-2024/{ => sessions}/scala-3-compiler-academy-journey.md (100%) rename public/conferences/nantes-2024/{ => sessions}/songwriting-in-scala-dsl-and-adt.md (100%) rename public/conferences/nantes-2024/{ => sessions}/ukraine-scala-community.md (95%) rename public/conferences/nantes-2024/{ => sessions}/unleashing-scalafix-potential.md (96%) rename public/conferences/nantes-2024/{ => sessions}/unwrapping-io.md (100%) rename public/conferences/nantes-2024/{ => sessions}/use-ai-in-your-programs.md (100%) rename public/{ => conferences/nantes-2024}/slides/2024/Chainsaw.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/Contravariance.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/GADTs-xavier-vw-woestyne.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/besom.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/chasing-arrows.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/data-pipeline.pptx (100%) rename public/{ => conferences/nantes-2024}/slides/2024/first-year-scala.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/gallia-migration.pdf (100%) rename public/{ => conferences/nantes-2024}/slides/2024/scala-community-building-lessons.pptx (100%) rename public/{ => conferences/nantes-2024}/slides/2024/scalafix.pdf (100%) rename public/{sponsors/nantes-2024.md => conferences/nantes-2024/sponsors.md} (100%) rename public/conferences/paris-2024/{ => sessions}/anatomy-scaladex.md (100%) rename public/conferences/paris-2024/{ => sessions}/better-builds-with-mill.md (100%) rename public/conferences/paris-2024/{ => sessions}/beyond-basics-lsp.md (100%) rename public/conferences/paris-2024/{ => sessions}/building-robust-applications-with-kyo-intro.md (100%) rename public/conferences/paris-2024/{ => sessions}/building-robust-applications-with-kyo.md (100%) rename public/conferences/paris-2024/{ => sessions}/calculating-funnier.md (100%) rename public/conferences/paris-2024/{ => sessions}/computer-algebra-scala.md (100%) rename public/conferences/paris-2024/{ => sessions}/contextual-abstraction-scala3.md (100%) rename public/conferences/paris-2024/{ => sessions}/decision4s.md (100%) rename public/conferences/paris-2024/{ => sessions}/escaping-false-dichotomy.md (100%) rename public/conferences/paris-2024/{ => sessions}/fast-scala-web-workshop.md (100%) rename public/conferences/paris-2024/{ => sessions}/fast-scala-web.md (100%) rename public/conferences/paris-2024/{ => sessions}/full-stack-scala.md (100%) rename public/conferences/paris-2024/{ => sessions}/how-functional-is-direct-style.md (100%) rename public/conferences/paris-2024/{ => sessions}/keynote-nicolas.md (100%) rename public/conferences/paris-2024/{ => sessions}/keynote-valentin.md (100%) rename public/conferences/paris-2024/{ => sessions}/metaprogramming-in-scala3.md (100%) rename public/conferences/paris-2024/{ => sessions}/mill-builds-scala3.md (100%) rename public/conferences/paris-2024/{ => sessions}/optimize-kafka-to-bq.md (100%) rename public/conferences/paris-2024/{ => sessions}/plowing-postgres.md (100%) rename public/conferences/paris-2024/{ => sessions}/profunctor.md (100%) rename public/conferences/paris-2024/{ => sessions}/publish-to-maven.md (100%) rename public/conferences/paris-2024/{ => sessions}/regular-pattern-heterogeneous-sequences.md (100%) rename public/conferences/paris-2024/{ => sessions}/scala-2-7-7.md (100%) rename public/conferences/paris-2024/{ => sessions}/scala-pattern-matching-for-dsl.md (100%) rename public/conferences/paris-2024/{ => sessions}/tools-scala-startup.md (100%) rename public/conferences/paris-2024/{ => sessions}/tools-scala-workshop.md (100%) rename public/conferences/paris-2024/{ => sessions}/web-dev-with-scala.md (100%) rename public/conferences/paris-2024/{ => sessions}/when-to-betray-fp-principles.md (100%) rename public/conferences/paris-2024/{ => sessions}/zero-to-prod-with-pillars.md (100%) rename public/conferences/paris-2024/{ => sessions}/zk-voting-scala-rust.md (100%) rename public/{sponsors/paris-2024.md => conferences/paris-2024/sponsors.md} (100%) rename public/{ => logos}/favicon.ico (100%) rename public/{ => logos}/scalaio-opengraph.webp (100%) rename public/{ => logos}/scalaio.svg (100%) rename public/{ => logos}/scalaio_black.svg (100%) diff --git a/build.sbt b/build.sbt index 80c696d3..50536227 100644 --- a/build.sbt +++ b/build.sbt @@ -48,14 +48,12 @@ lazy val root = project ) ) -def lines(lines: String*) = lines.mkString("\n") def slugify(name: String): String = name.toLowerCase().replace("-", "_") -def listMarkdowns(file: File): Seq[File] = file.listFiles().filter(_.getName.endsWith(".md")).toList -def listFolders(file: File): Seq[File] = file.listFiles().filter(_.isDirectory()).toList +val allConferences = new File("./public/conferences") def eventListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "EventsData.scala" - val events = listMarkdowns(new File("./public/scalafr-meetups")) + val events = allConferences.listFiles(_.name.endsWith(".md")) val content = s"""|package io.scala.data | @@ -71,10 +69,9 @@ def eventListing() = Def.task { def confListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "ConfsData.scala" - val conferences = listFolders(new File("./public/conferences")).map { folder => - val conference = listMarkdowns(folder).find(_.getName == "conference.md").get - val folderSlug = slugify(folder.getName) - folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(conference) + "\"" * 3}""" + val conferences = allConferences.globRecursive(_.name == "conference.md").get().map { file => + val folderSlug = slugify(file.getParentFile().name) + folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(file) + "\"" * 3}""" } val content = @@ -93,12 +90,12 @@ def confListing() = Def.task { def sessionsListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SessionsData.scala" - val sessionsByConf = listFolders(new File("./public/conferences")).map { folder => - val sessions = listMarkdowns(folder).filter(_.getName != "conference.md") - s"""| def ${slugify( - folder - .getName() - )}: List[String] = List(${sessions.map(file => "\"" * 3 + IO.read(file) + "\"" * 3).mkString(",")})""" + val sessionsByConf = allConferences.listFiles(_.isDirectory()).map { folder => + val sessions = (folder / "sessions").listFiles() + val slug = slugify(folder.getName) + s"""| def $slug: List[String] = List(${sessions + .map(file => "\"" * 3 + IO.read(file) + "\"" * 3) + .mkString(",")})""" } val content = @@ -116,9 +113,10 @@ def sessionsListing() = Def.task { def sponsorListing() = Def.task { val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SponsorsData.scala" - val sponsors = listMarkdowns(new File("./public/sponsors")).map { md => - s"""| def ${slugify(md.base)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}""" - } + val sponsors = + allConferences.globRecursive(_.name == "sponsors.md").get().map { md => + s"""| def ${slugify(md.getParentFile.name)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}""" + } val content = s"""|package io.scala.data diff --git a/index.html b/index.html index 90dc4ac7..a894b1c0 100644 --- a/index.html +++ b/index.html @@ -13,13 +13,13 @@ - + ScalaIO diff --git a/public/.git-blame-ignore-revs b/public/.git-blame-ignore-revs deleted file mode 100644 index e69de29b..00000000 diff --git a/public/conferences/nantes-2024/armored-type-safety-with-iron.md b/public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md similarity index 100% rename from public/conferences/nantes-2024/armored-type-safety-with-iron.md rename to public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md diff --git a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md similarity index 97% rename from public/conferences/nantes-2024/chasing-arrows-functors-monads.md rename to public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md index 61c29160..6b1abec3 100644 --- a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md +++ b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md @@ -4,7 +4,7 @@ - Slug: chasing-arrows-functors-monads - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/chasing-arrows.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/chasing-arrows.pdf - Replay: https://www.youtube.com/watch?v=KFhhR6tSy_0&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=12&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/contravariance-intuition-building.md b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md similarity index 96% rename from public/conferences/nantes-2024/contravariance-intuition-building.md rename to public/conferences/nantes-2024/sessions/contravariance-intuition-building.md index 324a1c35..4d01a8a2 100644 --- a/public/conferences/nantes-2024/contravariance-intuition-building.md +++ b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md @@ -4,7 +4,7 @@ - Slug: contravariance-intuition-building - Category: Modeling - confirmed: true -- Slides: https://scala.io/slides/2024/Contravariance.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/Contravariance.pdf - Replay: https://www.youtube.com/watch?v=A7t3b0kymFM&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=13&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/data-pipelines-simple.md b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md similarity index 93% rename from public/conferences/nantes-2024/data-pipelines-simple.md rename to public/conferences/nantes-2024/sessions/data-pipelines-simple.md index 8e278411..6781910d 100644 --- a/public/conferences/nantes-2024/data-pipelines-simple.md +++ b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md @@ -4,7 +4,7 @@ - Slug: data-pipelines-simple - Category: DataEng - confirmed: true -- Slides: https://scala.io/slides/2024/data-pipeline.pptx +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/data-pipeline.pptx - Replay: https://www.youtube.com/watch?v=gS6zOfqUHVs&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=8&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md b/public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md similarity index 100% rename from public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md rename to public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md diff --git a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md similarity index 94% rename from public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md rename to public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md index c9487ad5..b96bdf38 100644 --- a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md +++ b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md @@ -4,7 +4,7 @@ - Slug: hands-on-besom-iac-with-scala - Category: Cloud - confirmed: true -- Slides: https://scala.io/slides/2024/besom.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/besom.pdf - Replay: https://www.youtube.com/watch?v=J0vXLHN8YpA&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=7&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/intro-to-gadts.md b/public/conferences/nantes-2024/sessions/intro-to-gadts.md similarity index 92% rename from public/conferences/nantes-2024/intro-to-gadts.md rename to public/conferences/nantes-2024/sessions/intro-to-gadts.md index 718e50d4..74081f94 100644 --- a/public/conferences/nantes-2024/intro-to-gadts.md +++ b/public/conferences/nantes-2024/sessions/intro-to-gadts.md @@ -4,7 +4,7 @@ - Slug: intro-to-gadts - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/GADTs-xavier-vw-woestyne.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf - Replay: https://www.youtube.com/watch?v=r4c7xuVB9xA&ab_channel=ScalaIOFR ## Abstract diff --git a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md b/public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md similarity index 100% rename from public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md rename to public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md diff --git a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md b/public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md similarity index 100% rename from public/conferences/nantes-2024/kapoeira-with-kafka-streams.md rename to public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md diff --git a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md b/public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md similarity index 100% rename from public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md rename to public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md diff --git a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md similarity index 97% rename from public/conferences/nantes-2024/migrating-gallia-to-scala-3.md rename to public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md index 025213b8..8e7413e5 100644 --- a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md +++ b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md @@ -4,7 +4,7 @@ - Slug: migrating-gallia-to-scala-3 - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala.io/slides/2024/gallia-migration.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/gallia-migration.pdf - Replay: https://www.youtube.com/watch?v=DzjvFx5YYik&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=14&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/my-first-year-in-scala.md b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md similarity index 96% rename from public/conferences/nantes-2024/my-first-year-in-scala.md rename to public/conferences/nantes-2024/sessions/my-first-year-in-scala.md index 27ff70b5..fb74002d 100644 --- a/public/conferences/nantes-2024/my-first-year-in-scala.md +++ b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md @@ -4,7 +4,7 @@ - Slug: my-first-year-in-scala - Category: Community - confirmed: true -- Slides: https://scala.io/slides/2024/first-year-scala.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/first-year-scala.pdf - Replay: https://www.youtube.com/watch?v=Jyn2l1nhwZE&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=3&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md similarity index 94% rename from public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md rename to public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md index 96c1b870..c12b3d68 100644 --- a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md +++ b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md @@ -4,7 +4,7 @@ - Slug: nails-are-tree-need-chainsaw - Category: Algebra - confirmed: true -- Slides: https://scala.io/slides/2024/Chainsaw.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/Chainsaw.pdf - Replay: https://www.youtube.com/watch?v=0unlHZmNYkw&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=5&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md b/public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md similarity index 100% rename from public/conferences/nantes-2024/rex-migration-scala-2-to-3.md rename to public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md diff --git a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md b/public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md similarity index 100% rename from public/conferences/nantes-2024/scala-3-compiler-academy-journey.md rename to public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md diff --git a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md b/public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md similarity index 100% rename from public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md rename to public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md diff --git a/public/conferences/nantes-2024/ukraine-scala-community.md b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md similarity index 95% rename from public/conferences/nantes-2024/ukraine-scala-community.md rename to public/conferences/nantes-2024/sessions/ukraine-scala-community.md index 9bf40f29..e4466d66 100644 --- a/public/conferences/nantes-2024/ukraine-scala-community.md +++ b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md @@ -4,7 +4,7 @@ - Slug: ukraine-scala-community - Category: Community - confirmed: true -- Slides: https://scala.io/slides/2024/scala-community-building-lessons.pptx +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx - Replay: https://www.youtube.com/watch?v=6skPn0evEE8&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=11&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/unleashing-scalafix-potential.md b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md similarity index 96% rename from public/conferences/nantes-2024/unleashing-scalafix-potential.md rename to public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md index a2adb133..88e274a5 100644 --- a/public/conferences/nantes-2024/unleashing-scalafix-potential.md +++ b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md @@ -4,7 +4,7 @@ - Slug: unleashing-scalafix-potential - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala.io/slides/2024/scalafix.pdf +- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/scalafix.pdf - Replay: https://www.youtube.com/watch?v=qexJYvo2EwY&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=15&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/unwrapping-io.md b/public/conferences/nantes-2024/sessions/unwrapping-io.md similarity index 100% rename from public/conferences/nantes-2024/unwrapping-io.md rename to public/conferences/nantes-2024/sessions/unwrapping-io.md diff --git a/public/conferences/nantes-2024/use-ai-in-your-programs.md b/public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md similarity index 100% rename from public/conferences/nantes-2024/use-ai-in-your-programs.md rename to public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md diff --git a/public/slides/2024/Chainsaw.pdf b/public/conferences/nantes-2024/slides/2024/Chainsaw.pdf similarity index 100% rename from public/slides/2024/Chainsaw.pdf rename to public/conferences/nantes-2024/slides/2024/Chainsaw.pdf diff --git a/public/slides/2024/Contravariance.pdf b/public/conferences/nantes-2024/slides/2024/Contravariance.pdf similarity index 100% rename from public/slides/2024/Contravariance.pdf rename to public/conferences/nantes-2024/slides/2024/Contravariance.pdf diff --git a/public/slides/2024/GADTs-xavier-vw-woestyne.pdf b/public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf similarity index 100% rename from public/slides/2024/GADTs-xavier-vw-woestyne.pdf rename to public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf diff --git a/public/slides/2024/besom.pdf b/public/conferences/nantes-2024/slides/2024/besom.pdf similarity index 100% rename from public/slides/2024/besom.pdf rename to public/conferences/nantes-2024/slides/2024/besom.pdf diff --git a/public/slides/2024/chasing-arrows.pdf b/public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf similarity index 100% rename from public/slides/2024/chasing-arrows.pdf rename to public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf diff --git a/public/slides/2024/data-pipeline.pptx b/public/conferences/nantes-2024/slides/2024/data-pipeline.pptx similarity index 100% rename from public/slides/2024/data-pipeline.pptx rename to public/conferences/nantes-2024/slides/2024/data-pipeline.pptx diff --git a/public/slides/2024/first-year-scala.pdf b/public/conferences/nantes-2024/slides/2024/first-year-scala.pdf similarity index 100% rename from public/slides/2024/first-year-scala.pdf rename to public/conferences/nantes-2024/slides/2024/first-year-scala.pdf diff --git a/public/slides/2024/gallia-migration.pdf b/public/conferences/nantes-2024/slides/2024/gallia-migration.pdf similarity index 100% rename from public/slides/2024/gallia-migration.pdf rename to public/conferences/nantes-2024/slides/2024/gallia-migration.pdf diff --git a/public/slides/2024/scala-community-building-lessons.pptx b/public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx similarity index 100% rename from public/slides/2024/scala-community-building-lessons.pptx rename to public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx diff --git a/public/slides/2024/scalafix.pdf b/public/conferences/nantes-2024/slides/2024/scalafix.pdf similarity index 100% rename from public/slides/2024/scalafix.pdf rename to public/conferences/nantes-2024/slides/2024/scalafix.pdf diff --git a/public/sponsors/nantes-2024.md b/public/conferences/nantes-2024/sponsors.md similarity index 100% rename from public/sponsors/nantes-2024.md rename to public/conferences/nantes-2024/sponsors.md diff --git a/public/conferences/paris-2024/anatomy-scaladex.md b/public/conferences/paris-2024/sessions/anatomy-scaladex.md similarity index 100% rename from public/conferences/paris-2024/anatomy-scaladex.md rename to public/conferences/paris-2024/sessions/anatomy-scaladex.md diff --git a/public/conferences/paris-2024/better-builds-with-mill.md b/public/conferences/paris-2024/sessions/better-builds-with-mill.md similarity index 100% rename from public/conferences/paris-2024/better-builds-with-mill.md rename to public/conferences/paris-2024/sessions/better-builds-with-mill.md diff --git a/public/conferences/paris-2024/beyond-basics-lsp.md b/public/conferences/paris-2024/sessions/beyond-basics-lsp.md similarity index 100% rename from public/conferences/paris-2024/beyond-basics-lsp.md rename to public/conferences/paris-2024/sessions/beyond-basics-lsp.md diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md similarity index 100% rename from public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md similarity index 100% rename from public/conferences/paris-2024/building-robust-applications-with-kyo.md rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md diff --git a/public/conferences/paris-2024/calculating-funnier.md b/public/conferences/paris-2024/sessions/calculating-funnier.md similarity index 100% rename from public/conferences/paris-2024/calculating-funnier.md rename to public/conferences/paris-2024/sessions/calculating-funnier.md diff --git a/public/conferences/paris-2024/computer-algebra-scala.md b/public/conferences/paris-2024/sessions/computer-algebra-scala.md similarity index 100% rename from public/conferences/paris-2024/computer-algebra-scala.md rename to public/conferences/paris-2024/sessions/computer-algebra-scala.md diff --git a/public/conferences/paris-2024/contextual-abstraction-scala3.md b/public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md similarity index 100% rename from public/conferences/paris-2024/contextual-abstraction-scala3.md rename to public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md diff --git a/public/conferences/paris-2024/decision4s.md b/public/conferences/paris-2024/sessions/decision4s.md similarity index 100% rename from public/conferences/paris-2024/decision4s.md rename to public/conferences/paris-2024/sessions/decision4s.md diff --git a/public/conferences/paris-2024/escaping-false-dichotomy.md b/public/conferences/paris-2024/sessions/escaping-false-dichotomy.md similarity index 100% rename from public/conferences/paris-2024/escaping-false-dichotomy.md rename to public/conferences/paris-2024/sessions/escaping-false-dichotomy.md diff --git a/public/conferences/paris-2024/fast-scala-web-workshop.md b/public/conferences/paris-2024/sessions/fast-scala-web-workshop.md similarity index 100% rename from public/conferences/paris-2024/fast-scala-web-workshop.md rename to public/conferences/paris-2024/sessions/fast-scala-web-workshop.md diff --git a/public/conferences/paris-2024/fast-scala-web.md b/public/conferences/paris-2024/sessions/fast-scala-web.md similarity index 100% rename from public/conferences/paris-2024/fast-scala-web.md rename to public/conferences/paris-2024/sessions/fast-scala-web.md diff --git a/public/conferences/paris-2024/full-stack-scala.md b/public/conferences/paris-2024/sessions/full-stack-scala.md similarity index 100% rename from public/conferences/paris-2024/full-stack-scala.md rename to public/conferences/paris-2024/sessions/full-stack-scala.md diff --git a/public/conferences/paris-2024/how-functional-is-direct-style.md b/public/conferences/paris-2024/sessions/how-functional-is-direct-style.md similarity index 100% rename from public/conferences/paris-2024/how-functional-is-direct-style.md rename to public/conferences/paris-2024/sessions/how-functional-is-direct-style.md diff --git a/public/conferences/paris-2024/keynote-nicolas.md b/public/conferences/paris-2024/sessions/keynote-nicolas.md similarity index 100% rename from public/conferences/paris-2024/keynote-nicolas.md rename to public/conferences/paris-2024/sessions/keynote-nicolas.md diff --git a/public/conferences/paris-2024/keynote-valentin.md b/public/conferences/paris-2024/sessions/keynote-valentin.md similarity index 100% rename from public/conferences/paris-2024/keynote-valentin.md rename to public/conferences/paris-2024/sessions/keynote-valentin.md diff --git a/public/conferences/paris-2024/metaprogramming-in-scala3.md b/public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md similarity index 100% rename from public/conferences/paris-2024/metaprogramming-in-scala3.md rename to public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md diff --git a/public/conferences/paris-2024/mill-builds-scala3.md b/public/conferences/paris-2024/sessions/mill-builds-scala3.md similarity index 100% rename from public/conferences/paris-2024/mill-builds-scala3.md rename to public/conferences/paris-2024/sessions/mill-builds-scala3.md diff --git a/public/conferences/paris-2024/optimize-kafka-to-bq.md b/public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md similarity index 100% rename from public/conferences/paris-2024/optimize-kafka-to-bq.md rename to public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md diff --git a/public/conferences/paris-2024/plowing-postgres.md b/public/conferences/paris-2024/sessions/plowing-postgres.md similarity index 100% rename from public/conferences/paris-2024/plowing-postgres.md rename to public/conferences/paris-2024/sessions/plowing-postgres.md diff --git a/public/conferences/paris-2024/profunctor.md b/public/conferences/paris-2024/sessions/profunctor.md similarity index 100% rename from public/conferences/paris-2024/profunctor.md rename to public/conferences/paris-2024/sessions/profunctor.md diff --git a/public/conferences/paris-2024/publish-to-maven.md b/public/conferences/paris-2024/sessions/publish-to-maven.md similarity index 100% rename from public/conferences/paris-2024/publish-to-maven.md rename to public/conferences/paris-2024/sessions/publish-to-maven.md diff --git a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md b/public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md similarity index 100% rename from public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md rename to public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md diff --git a/public/conferences/paris-2024/scala-2-7-7.md b/public/conferences/paris-2024/sessions/scala-2-7-7.md similarity index 100% rename from public/conferences/paris-2024/scala-2-7-7.md rename to public/conferences/paris-2024/sessions/scala-2-7-7.md diff --git a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md b/public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md similarity index 100% rename from public/conferences/paris-2024/scala-pattern-matching-for-dsl.md rename to public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md diff --git a/public/conferences/paris-2024/tools-scala-startup.md b/public/conferences/paris-2024/sessions/tools-scala-startup.md similarity index 100% rename from public/conferences/paris-2024/tools-scala-startup.md rename to public/conferences/paris-2024/sessions/tools-scala-startup.md diff --git a/public/conferences/paris-2024/tools-scala-workshop.md b/public/conferences/paris-2024/sessions/tools-scala-workshop.md similarity index 100% rename from public/conferences/paris-2024/tools-scala-workshop.md rename to public/conferences/paris-2024/sessions/tools-scala-workshop.md diff --git a/public/conferences/paris-2024/web-dev-with-scala.md b/public/conferences/paris-2024/sessions/web-dev-with-scala.md similarity index 100% rename from public/conferences/paris-2024/web-dev-with-scala.md rename to public/conferences/paris-2024/sessions/web-dev-with-scala.md diff --git a/public/conferences/paris-2024/when-to-betray-fp-principles.md b/public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md similarity index 100% rename from public/conferences/paris-2024/when-to-betray-fp-principles.md rename to public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md diff --git a/public/conferences/paris-2024/zero-to-prod-with-pillars.md b/public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md similarity index 100% rename from public/conferences/paris-2024/zero-to-prod-with-pillars.md rename to public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md diff --git a/public/conferences/paris-2024/zk-voting-scala-rust.md b/public/conferences/paris-2024/sessions/zk-voting-scala-rust.md similarity index 100% rename from public/conferences/paris-2024/zk-voting-scala-rust.md rename to public/conferences/paris-2024/sessions/zk-voting-scala-rust.md diff --git a/public/sponsors/paris-2024.md b/public/conferences/paris-2024/sponsors.md similarity index 100% rename from public/sponsors/paris-2024.md rename to public/conferences/paris-2024/sponsors.md diff --git a/public/favicon.ico b/public/logos/favicon.ico similarity index 100% rename from public/favicon.ico rename to public/logos/favicon.ico diff --git a/public/scalaio-opengraph.webp b/public/logos/scalaio-opengraph.webp similarity index 100% rename from public/scalaio-opengraph.webp rename to public/logos/scalaio-opengraph.webp diff --git a/public/scalaio.svg b/public/logos/scalaio.svg similarity index 100% rename from public/scalaio.svg rename to public/logos/scalaio.svg diff --git a/public/scalaio_black.svg b/public/logos/scalaio_black.svg similarity index 100% rename from public/scalaio_black.svg rename to public/logos/scalaio_black.svg From 488077d6e001a64b9858c9765dfe714256528023 Mon Sep 17 00:00:00 2001 From: Lucas Nouguier Date: Sun, 17 Nov 2024 12:46:52 +0100 Subject: [PATCH 3/4] propagated usage of Event enum --- src/main/scala/io/scala/Page.scala | 31 +++++++------- .../io/scala/app/sessions/SessionList.scala | 12 +++--- .../io/scala/app/sessions/SessionView.scala | 5 +-- src/main/scala/io/scala/data/History.scala | 41 +++++++++---------- .../scala/io/scala/data/ScheduleInfo.scala | 9 ++-- src/main/scala/io/scala/models/Session.scala | 2 +- .../scala/io/scala/modules/SessionCard.scala | 3 +- .../scala/io/scala/modules/SpeakerCard.scala | 14 ++++--- .../io/scala/modules/layout/Footer.scala | 3 +- src/main/scala/io/scala/views/IndexView.scala | 9 ++-- .../scala/io/scala/views/SponsorsList.scala | 7 ++-- 11 files changed, 71 insertions(+), 65 deletions(-) diff --git a/src/main/scala/io/scala/Page.scala b/src/main/scala/io/scala/Page.scala index f4cb7af9..6dd30207 100644 --- a/src/main/scala/io/scala/Page.scala +++ b/src/main/scala/io/scala/Page.scala @@ -13,13 +13,14 @@ import urldsl.errors.DummyError import urldsl.vocabulary.FromString import urldsl.vocabulary.Printer +import io.scala.data.Event import io.scala.views.* import io.scala.views.IndexView sealed trait Draftable: def withDraft: Option[Boolean] sealed trait Routeable: - def conference: Option[String] + def conference: Option[Event] object Routeable: def fallback: String = "paris-2024" @@ -28,19 +29,19 @@ sealed trait Slugify: sealed trait Page: def title: String -case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[String] = None) +case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None) extends Page with Draftable with Routeable: def title: String = "Home" -case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[String] = None) +case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None) extends Page with Draftable with Routeable: def title: String = "Sessions" -case class SessionPage(conference: String, slug: String) extends Page with Slugify: +case class SessionPage(conference: Event, slug: String) extends Page with Slugify: def title: String = s"Session - $slug" -case class SponsorsPage(conference: Option[String] = None) extends Page with Routeable: +case class SponsorsPage(conference: Option[Event] = None) extends Page with Routeable: def title: String = "Sponsors" case object VenuePage extends Page: def title: String = "Venue" @@ -67,7 +68,7 @@ object Page { given pageArgBasicCodec: ReadWriter[Page] = macroRW val draftParam = param[Boolean]("withDraft").? - val conferenceParam = param[String]("conference").? + val conferenceParam = param[Event]("conference").? given FromString[Page, DummyError] = { case "sessions" => Right(SessionsPage()) @@ -92,12 +93,12 @@ object Page { case _: IndexPage => "" } - val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[String])]( + val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[Event])]( encode = x => (x.withDraft, x.conference), decode = IndexPage(_, _), (root / endOfSegments) ? draftParam & conferenceParam ) - val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[String])]( + val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[Event])]( encode = x => (x.withDraft, x.conference), decode = SessionsPage(_, _), (root / "sessions" / endOfSegments) ? draftParam & conferenceParam @@ -108,27 +109,27 @@ object Page { decode = SessionsPage(_, _), (root / "talks" / endOfSegments) ? draftParam & conferenceParam ) - val sessionRoute = Route[SessionPage, (String, String)]( + val sessionRoute = Route[SessionPage, (Event, String)]( encode = x => (x.conference, x.slug), decode = SessionPage(_, _), - (root / "sessions" / segment[String] / segment[String] / endOfSegments) + (root / "sessions" / segment[Event] / segment[String] / endOfSegments) ) // maintain old /talks// links - private val legacyTalkRoute = Route( + private val legacyTalkRoute = Route[SessionPage, (Event, String)]( encode = (x: SessionPage) => (x.conference, x.slug), decode = SessionPage(_, _), - root / "talks" / segment[String] / segment[String] / endOfSegments + root / "talks" / segment[Event] / segment[String] / endOfSegments ) // maintain links of Nantes 2024 edition: scala.io/talks/ private val legacyNantesTalkRoute = Route[SessionPage, String]( encode = x => x.slug, - decode = SessionPage("nantes-2024", _), + decode = SessionPage(Event.`nantes-2024`, _), root / "talks" / segment[String] / endOfSegments ) - val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[String]]( + val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[Event]]( encode = x => x.conference, decode = args => SponsorsPage(args), - (root / "sponsors" / endOfSegments) ? param[String]("conference").? + (root / "sponsors" / endOfSegments) ? conferenceParam ) val venueRoute = Route.static( VenuePage, diff --git a/src/main/scala/io/scala/app/sessions/SessionList.scala b/src/main/scala/io/scala/app/sessions/SessionList.scala index 88650b60..e23036e1 100644 --- a/src/main/scala/io/scala/app/sessions/SessionList.scala +++ b/src/main/scala/io/scala/app/sessions/SessionList.scala @@ -4,8 +4,8 @@ import com.raquo.laminar.api.L.* import scala.collection.immutable.Queue import io.scala.SessionsPage +import io.scala.data.Event import io.scala.data.SessionsHistory -import io.scala.data.SessionsHistory.getConfName import io.scala.models.Session import io.scala.modules.SessionCard import io.scala.modules.elements.* @@ -17,7 +17,7 @@ case object SessionList extends ReactiveView[SessionsPage] { given Ordering[(String, List[Session])] = case ((cat1, talks1), (cat2, talks2)) => val sizeComparison = talks1.size.compareTo(talks2.size) - + if sizeComparison != 0 then -sizeComparison else cat1.compareTo(cat2) @@ -35,7 +35,7 @@ case object SessionList extends ReactiveView[SessionsPage] { acc .enqueue(Titles.medium(category, idAttr := category)) .enqueue( - Containers.gridCards(talks.sorted.map(SessionCard(_, getConfName(sessionArg.conference)))) + Containers.gridCards(talks.sorted.map(SessionCard(_, sessionArg.conference.getOrElse(Event.Current)))) ) } .toSeq @@ -52,10 +52,12 @@ case object SessionList extends ReactiveView[SessionsPage] { SessionsHistory.sessionsForConf(arg).partition(_.isWorkshop) val tabs = Seq( Session.Kind.Keynote -> - Containers.gridCards(talksByCategory.filter(_.isKeynote).map(SessionCard(_, getConfName(arg.conference)))), + Containers.gridCards( + talksByCategory.filter(_.isKeynote).map(SessionCard(_, arg.conference.getOrElse(Event.Current))) + ), Session.Kind.Talk -> tabWithTOC(sortedCategories(talksByCategory.filter(!_.isKeynote)), arg), Session.Kind.Workshop -> - Containers.gridCards(workshopsByCategory.map(SessionCard(_, getConfName(arg.conference)))) + Containers.gridCards(workshopsByCategory.map(SessionCard(_, arg.conference.getOrElse(Event.Current)))) ) Tabs(tabs, h => h.toPlural, Session.Kind.Talk).render } diff --git a/src/main/scala/io/scala/app/sessions/SessionView.scala b/src/main/scala/io/scala/app/sessions/SessionView.scala index d3ac33c8..e0a24b57 100644 --- a/src/main/scala/io/scala/app/sessions/SessionView.scala +++ b/src/main/scala/io/scala/app/sessions/SessionView.scala @@ -4,7 +4,6 @@ import com.raquo.laminar.api.L.* import io.scala.extensions.grayOutIf import io.scala.SessionPage -import io.scala.data.SessionsHistory import io.scala.models.Session import io.scala.modules.elements.Containers import io.scala.modules.elements.Paragraphs @@ -16,9 +15,7 @@ object SessionView extends ReactiveView[SessionPage]: def body(signal: Signal[SessionPage]): HtmlElement = val sessionSignal = signal.map: sessionPage => - SessionsHistory - .sessionsForConf(sessionPage.conference) - .getOrElse(List.empty) + sessionPage.conference.sessions .find(_.info.slug == sessionPage.slug) .getOrElse(notFoundTalk) sectionTag( diff --git a/src/main/scala/io/scala/data/History.scala b/src/main/scala/io/scala/data/History.scala index e5e4dcda..6cebaae8 100644 --- a/src/main/scala/io/scala/data/History.scala +++ b/src/main/scala/io/scala/data/History.scala @@ -1,5 +1,10 @@ package io.scala.data +import upickle.default.* +import urldsl.errors.DummyError +import urldsl.vocabulary.FromString +import urldsl.vocabulary.Printer + import io.scala.Draftable import io.scala.Routeable import io.scala.data.parsers.Parsers @@ -22,32 +27,24 @@ enum Event(val sessions: List[Session], val sponsors: List[Sponsor]): object Event: val Current: Event = Event.`paris-2024` - // makes me want to use enumeratum again... - def withName(name: String): Option[Event] = - Event.values.find(_.toString == name) - def withNameOrCurrent(name: String): Event = - withName(name).getOrElse(Current) - def withNameOrCurrent(maybeName: Option[String]): Event = - maybeName.flatMap(Event.withName).getOrElse(Current) + + given ReadWriter[Event] = macroRW + given FromString[Event, DummyError] = { + case "paris-2024" => Right(Event.`paris-2024`) + case "nantes-2024" => Right(Event.`nantes-2024`) + case _ => Left(DummyError.dummyError) + } + + given Printer[Event] = { + case Event.`paris-2024` => "paris-2024" + case Event.`nantes-2024` => "nantes-2024" + } object SessionsHistory: def sessionsForConf(args: Routeable & Draftable): List[Session] = - Event - .withNameOrCurrent(args.conference) + args.conference + .getOrElse(Event.Current) .sessions .filterWhen(args.withDraft.fold(true)(!_))(_.info.confirmed) - def sessionsForSchedule: List[Session] = - Event.Current.sessions - - def sessionsForConf(confName: String): Option[List[Session]] = - Event.withName(confName).map(_.sessions) - - inline def getConfName(confName: Option[String]): String = - confName.getOrElse(Event.Current.toString) - -object SponsorsHistory: - - def sponsorsForConf(confName: Option[String]): List[Sponsor] = - confName.flatMap(Event.withName).getOrElse(Event.Current).sponsors diff --git a/src/main/scala/io/scala/data/ScheduleInfo.scala b/src/main/scala/io/scala/data/ScheduleInfo.scala index abe0e46d..e9c706db 100644 --- a/src/main/scala/io/scala/data/ScheduleInfo.scala +++ b/src/main/scala/io/scala/data/ScheduleInfo.scala @@ -22,9 +22,7 @@ object ScheduleInfo { extension (d: HtmlElement) def gridArea(area: String) = d.amend(styleAttr := s"grid-area: $area") - lazy val session: String => Session = - val schedulables = SessionsHistory.sessionsForSchedule - (slug) => schedulables.find(_.info.slug == slug).getOrElse(Session.empty) + def session(slug: String) = Event.Current.sessions.find(_.info.slug == slug).getOrElse(Session.empty) val day1 = List( time(9, 30).render(), @@ -104,5 +102,8 @@ object ScheduleInfo { Special(Special.Kind.End).render ).zipWithIndex.map { case (x, i) => x.gridArea(s"a${i + 1}") } - val allDays = Seq((DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")), (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2"))) + val allDays = Seq( + (DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")), + (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2")) + ) } diff --git a/src/main/scala/io/scala/models/Session.scala b/src/main/scala/io/scala/models/Session.scala index 9b15380c..42db0091 100644 --- a/src/main/scala/io/scala/models/Session.scala +++ b/src/main/scala/io/scala/models/Session.scala @@ -34,7 +34,7 @@ case class Session( Parsers.Description.parseTalk(description).map(Paragraphs.description(_)) def duration: Int = info.kind.duration - def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current.toString, room) + def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current, room) def isKeynote: Boolean = info.kind == Session.Kind.Keynote def isWorkshop: Boolean = info.kind == Session.Kind.Workshop def isBreak: Boolean = false diff --git a/src/main/scala/io/scala/modules/SessionCard.scala b/src/main/scala/io/scala/modules/SessionCard.scala index 69bd02d3..b98cb567 100644 --- a/src/main/scala/io/scala/modules/SessionCard.scala +++ b/src/main/scala/io/scala/modules/SessionCard.scala @@ -10,6 +10,7 @@ import io.scala.modules.elements.Buttons import io.scala.modules.elements.Buttons.important import io.scala.modules.elements.Image import io.scala.svgs.Icons +import io.scala.data.Event object SessionKindTag: def apply(kind: Session.Kind): Span = @@ -22,7 +23,7 @@ object SessionCard: case _ => name // Remove the dependency on `conference` by having it injected in Session.Basic info for better reusability - def apply(session: Session, conference: String, room: Session.Room | Null = null): Div = + def apply(session: Session, conference: Event, room: Session.Room | Null = null): Div = def realDuration = session.info.title match case s if session.duration == 150 && (s.startsWith("Building") || s.startsWith("Quick")) => 90 case _ => session.info.kind.duration diff --git a/src/main/scala/io/scala/modules/SpeakerCard.scala b/src/main/scala/io/scala/modules/SpeakerCard.scala index bc132182..2a849ac1 100644 --- a/src/main/scala/io/scala/modules/SpeakerCard.scala +++ b/src/main/scala/io/scala/modules/SpeakerCard.scala @@ -3,23 +3,25 @@ package modules import com.raquo.laminar.api.L.* import com.raquo.laminar.nodes.ReactiveHtmlElement +import org.scalajs.dom.HTMLDivElement + +import io.scala.data.Event import io.scala.extensions.grayOutIf import io.scala.models.Session import io.scala.models.Session.Speaker import io.scala.models.Social import io.scala.modules.elements.Buttons import io.scala.modules.elements.Buttons.* -import org.scalajs.dom.HTMLDivElement import io.scala.modules.elements.Image object SpeakerCard { - def apply(speaker: Speaker, talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] = + def apply(speaker: Speaker, talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] = div( className := "speaker-card", Image.photo( - src := speaker.photoRelPath, - className := "photo", - alt := s"${speaker.name}'s profile", + src := speaker.photoRelPath, + className := "photo", + alt := s"${speaker.name}'s profile", loadingAttr := "lazy" ), div( @@ -43,7 +45,7 @@ object SpeakerCard { linksToTalks(talks, conference) ).grayOutIf(talks.forall(_.cancelledReason.isDefined)) - def linksToTalks(talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] = + def linksToTalks(talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] = def linkButton(info: Session.BasicInfo) = val text = if info.kind == Session.Kind.Workshop then "Workshop" else "Talk" Buttons diff --git a/src/main/scala/io/scala/modules/layout/Footer.scala b/src/main/scala/io/scala/modules/layout/Footer.scala index 3c69fa3c..62f1c7ff 100644 --- a/src/main/scala/io/scala/modules/layout/Footer.scala +++ b/src/main/scala/io/scala/modules/layout/Footer.scala @@ -17,6 +17,7 @@ import io.scala.modules.elements.Links import io.scala.modules.elements.Lists import io.scala.modules.elements.Titles import io.scala.svgs.Icons +import io.scala.data.Event object Footer { private lazy val summary: Div = @@ -56,7 +57,7 @@ object Footer { Lists.pipes( ConfsData.all .map { key => - val linkKey = key.replace("_", "-") + val linkKey = Event.valueOf(key.replace("_", "-")) li( Links .highlighted( diff --git a/src/main/scala/io/scala/views/IndexView.scala b/src/main/scala/io/scala/views/IndexView.scala index eff8812a..880271dc 100644 --- a/src/main/scala/io/scala/views/IndexView.scala +++ b/src/main/scala/io/scala/views/IndexView.scala @@ -6,11 +6,12 @@ import org.scalajs.dom.document import io.scala.IndexPage import io.scala.Page import io.scala.VenuePage +import io.scala.data.Event import io.scala.data.SessionsHistory import io.scala.extensions.withBinder +import io.scala.extensions.withLink import io.scala.modules.SpeakerCard import io.scala.modules.elements.* -import io.scala.extensions.withLink case object IndexView extends ReactiveView[IndexPage] { @@ -54,7 +55,7 @@ case object IndexView extends ReactiveView[IndexPage] { div( className := "card-container", children <-- args.map: page => - speakers(page).map(SpeakerCard(_, _, SessionsHistory.getConfName(page.conference))) + speakers(page).map(SpeakerCard(_, _, page.conference.getOrElse(Event.Current))) ) ) @@ -80,7 +81,9 @@ case object IndexView extends ReactiveView[IndexPage] { idAttr("tickets"), className := "container", Titles("Tickets"), - p("We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)"), + p( + "We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)" + ), div( Buttons.shiny("On-site tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita"), Buttons.shiny("Streaming tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita") diff --git a/src/main/scala/io/scala/views/SponsorsList.scala b/src/main/scala/io/scala/views/SponsorsList.scala index b1921167..ba4d2197 100644 --- a/src/main/scala/io/scala/views/SponsorsList.scala +++ b/src/main/scala/io/scala/views/SponsorsList.scala @@ -5,7 +5,7 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement import io.scala.Lexicon import io.scala.SponsorsPage -import io.scala.data.SponsorsHistory +import io.scala.data.Event import io.scala.modules.elements.* case object SponsorsList extends ReactiveView[SponsorsPage] { @@ -30,8 +30,9 @@ case object SponsorsList extends ReactiveView[SponsorsPage] { div( className := "container", children <-- args.map(arg => - SponsorsHistory - .sponsorsForConf(arg.conference) + arg.conference + .getOrElse(Event.Current) + .sponsors .groupBy(_.rank) .toSeq .sortBy(_._1) From f656f07485d5b939fc716fd2528162692d11a0d5 Mon Sep 17 00:00:00 2001 From: Lucas Nouguier Date: Sun, 17 Nov 2024 12:51:27 +0100 Subject: [PATCH 4/4] fix: local slides path --- .../nantes-2024/sessions/chasing-arrows-functors-monads.md | 2 +- .../nantes-2024/sessions/contravariance-intuition-building.md | 2 +- .../conferences/nantes-2024/sessions/data-pipelines-simple.md | 2 +- .../nantes-2024/sessions/hands-on-besom-iac-with-scala.md | 2 +- public/conferences/nantes-2024/sessions/intro-to-gadts.md | 2 +- .../nantes-2024/sessions/migrating-gallia-to-scala-3.md | 2 +- .../conferences/nantes-2024/sessions/my-first-year-in-scala.md | 2 +- .../nantes-2024/sessions/nails-are-tree-need-chainsaw.md | 2 +- .../conferences/nantes-2024/sessions/ukraine-scala-community.md | 2 +- .../nantes-2024/sessions/unleashing-scalafix-potential.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md index 6b1abec3..1c4c86ab 100644 --- a/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md +++ b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md @@ -4,7 +4,7 @@ - Slug: chasing-arrows-functors-monads - Category: Algebra - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/chasing-arrows.pdf +- Slides: /conferences/nantes-2024/slides/2024/chasing-arrows.pdf - Replay: https://www.youtube.com/watch?v=KFhhR6tSy_0&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=12&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md index 4d01a8a2..e72bca66 100644 --- a/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md +++ b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md @@ -4,7 +4,7 @@ - Slug: contravariance-intuition-building - Category: Modeling - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/Contravariance.pdf +- Slides: /conferences/nantes-2024/slides/2024/Contravariance.pdf - Replay: https://www.youtube.com/watch?v=A7t3b0kymFM&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=13&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/data-pipelines-simple.md b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md index 6781910d..7bf2cfc6 100644 --- a/public/conferences/nantes-2024/sessions/data-pipelines-simple.md +++ b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md @@ -4,7 +4,7 @@ - Slug: data-pipelines-simple - Category: DataEng - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/data-pipeline.pptx +- Slides: /conferences/nantes-2024/slides/2024/data-pipeline.pptx - Replay: https://www.youtube.com/watch?v=gS6zOfqUHVs&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=8&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md index b96bdf38..96324b00 100644 --- a/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md +++ b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md @@ -4,7 +4,7 @@ - Slug: hands-on-besom-iac-with-scala - Category: Cloud - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/besom.pdf +- Slides: /conferences/nantes-2024/slides/2024/besom.pdf - Replay: https://www.youtube.com/watch?v=J0vXLHN8YpA&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=7&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/intro-to-gadts.md b/public/conferences/nantes-2024/sessions/intro-to-gadts.md index 74081f94..bd6aaa4a 100644 --- a/public/conferences/nantes-2024/sessions/intro-to-gadts.md +++ b/public/conferences/nantes-2024/sessions/intro-to-gadts.md @@ -4,7 +4,7 @@ - Slug: intro-to-gadts - Category: Algebra - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf +- Slides: /conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf - Replay: https://www.youtube.com/watch?v=r4c7xuVB9xA&ab_channel=ScalaIOFR ## Abstract diff --git a/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md index 8e7413e5..47e74c12 100644 --- a/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md +++ b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md @@ -4,7 +4,7 @@ - Slug: migrating-gallia-to-scala-3 - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/gallia-migration.pdf +- Slides: /conferences/nantes-2024/slides/2024/gallia-migration.pdf - Replay: https://www.youtube.com/watch?v=DzjvFx5YYik&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=14&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md index fb74002d..5f9f6c51 100644 --- a/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md +++ b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md @@ -4,7 +4,7 @@ - Slug: my-first-year-in-scala - Category: Community - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/first-year-scala.pdf +- Slides: /conferences/nantes-2024/slides/2024/first-year-scala.pdf - Replay: https://www.youtube.com/watch?v=Jyn2l1nhwZE&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=3&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md index c12b3d68..6b93cd01 100644 --- a/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md +++ b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md @@ -4,7 +4,7 @@ - Slug: nails-are-tree-need-chainsaw - Category: Algebra - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/Chainsaw.pdf +- Slides: /conferences/nantes-2024/slides/2024/Chainsaw.pdf - Replay: https://www.youtube.com/watch?v=0unlHZmNYkw&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=5&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/ukraine-scala-community.md b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md index e4466d66..749648f0 100644 --- a/public/conferences/nantes-2024/sessions/ukraine-scala-community.md +++ b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md @@ -4,7 +4,7 @@ - Slug: ukraine-scala-community - Category: Community - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx +- Slides: /conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx - Replay: https://www.youtube.com/watch?v=6skPn0evEE8&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=11&pp=iAQB ## Abstract diff --git a/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md index 88e274a5..113f0ca5 100644 --- a/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md +++ b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md @@ -4,7 +4,7 @@ - Slug: unleashing-scalafix-potential - Category: ToolsEcosystem - confirmed: true -- Slides: https://scala\.io/conferences/nantes-2024/slides/2024/scalafix.pdf +- Slides: /conferences/nantes-2024/slides/2024/scalafix.pdf - Replay: https://www.youtube.com/watch?v=qexJYvo2EwY&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=15&pp=iAQB ## Abstract