Merge branch 'develop' into 'master'

Develop

See merge request devfest-toulouse/site-devfest-2019!84
master
Igor Laborie 5 years ago
commit 2697706a2f
  1. 2
      .gitignore
  2. 10
      .gitlab-ci.yml
  3. 3
      content/schedule/_index.fr.md
  4. 5
      content/schedule/_index.md
  5. 1
      content/sessions/a_kotlin_multiplatform_evolution.md
  6. 10
      content/sessions/keynote_close_overflow.md
  7. 10
      content/sessions/keynote_open_overflow.md
  8. 2
      content/sessions/le_burn_out_agile.md
  9. 1
      content/sessions/le_design_de_l_erreur.md
  10. 1
      content/sessions/le_jaillissement_de_l_esprit.md
  11. 1
      content/sessions/modern_forms_in_react.md
  12. 2
      content/sessions/rust__webassembly__and_the_future_of_serverless.md
  13. 1
      content/sessions/webgpu__next_generation_3d_graphics_on_the_web.md
  14. 24
      content/speakers/cedric_moulard.md
  15. 16
      content/speakers/estelle_landry_.md
  16. 10
      data/info.yml
  17. 8
      data/rooms.yml
  18. 102
      data/schedule.yml
  19. 10
      package.json
  20. 234
      static/api/site.json
  21. BIN
      static/images/speakers/cedric_moulard.jpg
  22. 1090
      static/schedule/schedule.ics
  23. BIN
      static/schedule/schedule.pdf
  24. 2
      themes/devfest-theme-hugo
  25. 31
      tools/minify.js
  26. 107
      tools/pdf.js
  27. 2668
      yarn.lock

2
.gitignore vendored

@ -5,3 +5,5 @@ node_modules/
.idea/
.vscode/
yarn-error.log
static/schedule/schedule*.pdf

@ -7,14 +7,14 @@ before_script:
- hugo version
- echo node `node --version`
- echo yarn `yarn --version`
- pushd themes/devfest-theme-hugo
- yarn
- popd
sandbox:
script:
- hugo --quiet
- node tools/pdf.js
- hugo -F
- node themes/devfest-theme-hugo/minify.js
- node tools/minify.js
- firebase use default
- firebase deploy --token "$FIREBASE_SANDBOX_TOKEN"
artifacts:
@ -27,8 +27,10 @@ prod:
variables:
HUGO_ENV: production
script:
- hugo --quiet
- node tools/pdf.js
- hugo --baseURL https://2019.devfesttoulouse.fr/
- node themes/devfest-theme-hugo/minify.js
- node tools/minify.js
- firebase use prod
- firebase deploy --token "$FIREBASE_PROD_TOKEN"
artifacts:

@ -5,7 +5,6 @@ menu:
weight: 10
horizontal: false
draft: true
---
@ -17,7 +16,7 @@ draft: true
</a>
<a class="btn primary btn-lg" href="/schedule/schedule.pdf">
<svg class="icon icon-pdf"><use xlink:href="#pdf"></use></svg> ICal
<svg class="icon icon-pdf"><use xlink:href="#pdf"></use></svg> PDF
</a>
<!-- TODO: filter and search -->

@ -5,7 +5,6 @@ menu:
weight: 10
horizontal: false
draft: true
---
@ -15,5 +14,9 @@ draft: true
<svg class="icon icon-calendar"><use xlink:href="#calendar"></use></svg> ICal
</a>
<a class="btn primary btn-lg" href="/schedule/schedule.pdf">
<svg class="icon icon-pdf"><use xlink:href="#pdf"></use></svg> PDF
</a>
<!-- TODO: filter and search -->
{{% /hero %}}

@ -1,6 +1,7 @@
---
key: a_kotlin_multiplatform_evolution
title: A Kotlin multiplatform evolution
language: English
format: conference
tags:
- languages

@ -0,0 +1,10 @@
---
key: keynote_close_overflow
title: Keynote de fermeture (overflow)
format: keynote
tags:
- keynote
speakers: []
draft: false
---
Surprise!

@ -0,0 +1,10 @@
---
key: keynote_open_overflow
title: Keynote d'ouverture (overflow)
format: keynote
tags:
- keynote
speakers: []
draft: false
---
Surprise!

@ -8,7 +8,7 @@ tags:
- method___tools
level: intermediate
speakers:
- kfnue96dm9g1zobctf4gvzdolrp2
- cedric_moulard
videoId: null
presentation: null
draft: false

@ -8,7 +8,6 @@ tags:
- method___tools
level: beginner
speakers:
- estelle_landry_
- francois_teychene
videoId: null
presentation: null

@ -1,7 +1,6 @@
---
key: le_jaillissement_de_l_esprit
title: Le jaillissement de l'esprit
language: fr
format: conference
tags:
- method___tools

@ -2,6 +2,7 @@
key: modern_forms_in_react
title: Modern Forms in React
id: McfMVcKDdZv68NSo2JIJ
language: English
format: conference
tags:
- web

@ -2,7 +2,7 @@
key: rust__webassembly__and_the_future_of_serverless
title: 'Rust, WebAssembly, and the future of Serverless'
id: 2S9XtGGq3ouHnkivEDKC
language: United States
language: English
format: conference
tags:
- cloud___infra

@ -2,6 +2,7 @@
key: webgpu__next_generation_3d_graphics_on_the_web
title: 'WebGPU: Next-generation 3D Graphics on the Web'
id: 5qTyscBWtXLRb04TXEdB
language: English
format: conference
tags:
- web

@ -0,0 +1,24 @@
---
key: cedric_moulard
name: Cédric Moulard
id: KFNUe96DM9g1zobCtf4GVzdoLRp2
feature: false
photoURL: /images/speakers/cedric_moulard.jpg
socials:
- icon: twitter
link: 'https://twitter.com/cedric_moulard'
name: cedric_moulard
- icon: github
link: 'https://github.com/cedricmoulard'
name: cedricmoulard
---
Diplômé de Arts & Métiers ParisTech et pas vraiment destiné à faire de l'informatique.
Développeur autodidacte.
20 ans d'expérience, dont :
- Architecte Java
- Développeur Angular
- Chef de projet
- ScrumMaster
- Evaluateur CMMi
- Responsable Méthodes & Outils

@ -1,16 +0,0 @@
---
key: estelle_landry_
name: Estelle Landry ☀
id: JkWN4X6967cvBrV2x8vKf1QrHS93
feature: false
company: Elium
city: 'Montpellier, France'
photoURL: /images/speakers/estelle_landry_.jpg
socials:
- icon: twitter
link: 'https://twitter.com/estelandry'
name: estelandry
---
Passionée par mon métier de Product Owner, par l'UX (User eXpérience) et le GameStorming, j'aime participer à l'élaboration d'un produit en étant le lien entre les utilisateurs et les développeurs.
Speakeuse en conférence tech, membre des Duchess France, de SunnyTech et du MeetUp UX Flupa Montpellier, je continue à me perfectionner et à discuter de nouvelles méthodes ou technologies de l'IT.

@ -1,16 +1,16 @@
id: HJRThubF4uYPkb7jSUxi
name: DevFest Toulouse 2019
address:
latLng:
lng: 1.4345827
lat: 43.6115538
formattedAddress: '11 Espl. Compans Caffarelli, 31000 Toulouse, France'
locality:
short_name: Toulouse
long_name: Toulouse
country:
long_name: France
short_name: FR
long_name: France
latLng:
lat: 43.6115538
lng: 1.4345827
dates:
end: '2019-10-03T10:00:00.000Z'
start: '2019-10-03T10:00:00.000Z'
end: '2019-10-03T10:00:00.000Z'

@ -7,10 +7,10 @@
- key: office-hours
label: Office-hours
- key: room1
label: Grand amphi.
label: '#1'
- key: room2
label: Grande salle
label: '#2'
- key: room3
label: Salle du haut
label: '#3'
- key: room4
label: Petite salle
label: '#4'

@ -10,141 +10,145 @@
- slot: pause-1
talk: __pause
- slot: slot-1
talk: >-
_numerique_et_environnement__ou__on_aurait_pu_sauver_les_abeilles__on_a_prefere_sortir_un_nouvel_iphone_
talk: the_rise_of_the_web
- slot: pause-2
talk: __pause
- slot: slot-2
talk: _votre_api_web_passe_t_elle_le_controle_technique__
talk: l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus
- slot: pause-3
talk: __pause
- slot: slot-3
talk: a_la_decouverte_de_la_realite_augmentee_avec_arcore
talk: webgpu__next_generation_3d_graphics_on_the_web
- slot: slot-lt-1
talk: 3_techniques_faciles_de_manipulation
- slot: lunch
talk: __lunch
- slot: slot-lt-2
talk: 10_est_une_puissance_de_2
talk: _47_ans___ils_nont_toujours_pas_remarque__
- slot: slot-4
talk: >-
allo_paris__ici_san_francisco__et_si_on_codait_ensemble_avec_vs_code_
talk: rust__webassembly__and_the_future_of_serverless
- slot: pause-4
talk: __pause
- slot: slot-5
talk: authentication_authorization_starters_battle
talk: le_design_de_l_erreur
- slot: pause-5
talk: __pause
- slot: slot-6
talk: brace_yourself__vanilla_is_coming__back__
talk: monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques
- slot: pause-6
talk: __pause
- slot: slot-7
talk: >-
comprendre_le_role_du_noyau_d_un_systeme_d_exploitation_en_creant_un_from_scratch
talk: _votre_api_web_passe_t_elle_le_controle_technique__
- slot: keynote-close
talk: keynote_close
- slot: party
talk: __party
- room: room2
slots:
- slot: keynote-open
talk: keynote_open_overflow
- slot: slot-1
talk: de_java_a_un_executable_natif___graalvm_et_quarkus_changent_la_donne
talk: a_kotlin_multiplatform_evolution
- slot: pause-2
talk: __pause
- slot: slot-2
talk: devops_at_scale
talk: le_burn_out_agile
- slot: pause-3
talk: __pause
- slot: slot-3
talk: four_diseases
- slot: pause-4
talk: __pause
- slot: slot-4
talk: introduction_a_la_programmation_par_contraintes
talk: >-
_numerique_et_environnement__ou__on_aurait_pu_sauver_les_abeilles__on_a_prefere_sortir_un_nouvel_iphone_
- slot: slot-lt-1
talk: _47_ans___ils_nont_toujours_pas_remarque__
talk: machine_learning_avec_des_allumettes_et_des_cotillons
- slot: lunch
talk: __lunch
- slot: slot-lt-2
talk: un_distributeur_automatique_d_argent_de_poche_pour_les_enfants
talk: applications_de_brainfuck__langage_minimaliste_mais_turing_complet
- slot: slot-4
talk: >-
live_coding_musical___vous_savez_coder___devenez_compositeur_avec_webaudio_et_webmidi__
- slot: pause-4
talk: __pause
- slot: slot-5
talk: l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus
talk: the_freedom_of_static_typing
- slot: pause-5
talk: __pause
- slot: slot-6
talk: le_burn_out_agile
talk: authentication_authorization_starters_battle
- slot: pause-6
talk: __pause
- slot: slot-7
talk: le_design_de_l_erreur
talk: >-
mon_p____de_voyant_moteur_est_encore_allume___comment_debugger_mon_moteur___plongeon_dans_les_entrailles_des_calculateurs_moteur
- slot: keynote-close
talk: keynote_close_overflow
- room: room3
slots:
- slot: slot-1
talk: >-
live_coding_musical___vous_savez_coder___devenez_compositeur_avec_webaudio_et_webmidi__
talk: quand_les_rates_des_ias_nous_renvoient_a_nos_propres_biais_societaux
- slot: pause-2
talk: __pause
- slot: slot-2
talk: modern_forms_in_react
talk: rust_as_a_high_level_langage
- slot: pause-3
talk: __pause
- slot: slot-3
talk: >-
mon_p____de_voyant_moteur_est_encore_allume___comment_debugger_mon_moteur___plongeon_dans_les_entrailles_des_calculateurs_moteur
- slot: pause-4
talk: __pause
- slot: slot-4
talk: monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques
allo_paris__ici_san_francisco__et_si_on_codait_ensemble_avec_vs_code_
- slot: slot-lt-1
talk: applications_de_brainfuck__langage_minimaliste_mais_turing_complet
talk: >-
le_troll_dans_ta_machine_____une_courte_introduction_a_la_pensee_de_jean_yves_girard
- slot: lunch
talk: __lunch
- slot: slot-lt-2
talk: developpeurs_en_reconversion__developpeurs_quand_meme__
talk: un_distributeur_automatique_d_argent_de_poche_pour_les_enfants
- slot: slot-4
talk: le_jaillissement_de_l_esprit
- slot: pause-4
talk: __pause
- slot: slot-5
talk: premiers_pas_avec_un_microcontroleur_et_google_cloud_iot_core
talk: >-
comprendre_le_role_du_noyau_d_un_systeme_d_exploitation_en_creant_un_from_scratch
- slot: pause-5
talk: __pause
- slot: slot-6
talk: quand_les_rates_des_ias_nous_renvoient_a_nos_propres_biais_societaux
talk: devops_at_scale
- slot: pause-6
talk: __pause
- slot: slot-7
talk: rockin_in_the_angular_world
talk: modern_forms_in_react
- room: room4
slots:
- slot: slot-1
talk: rust__webassembly__and_the_future_of_serverless
talk: a_la_decouverte_de_la_realite_augmentee_avec_arcore
- slot: pause-2
talk: __pause
- slot: slot-2
talk: rust_as_a_high_level_langage
talk: rockin_in_the_angular_world
- slot: pause-3
talk: __pause
- slot: slot-3
talk: the_freedom_of_static_typing
- slot: pause-4
talk: __pause
- slot: slot-4
talk: the_rise_of_the_web
talk: premiers_pas_avec_un_microcontroleur_et_google_cloud_iot_core
- slot: slot-lt-1
talk: >-
le_troll_dans_ta_machine_____une_courte_introduction_a_la_pensee_de_jean_yves_girard
talk: developpeurs_en_reconversion__developpeurs_quand_meme__
- slot: lunch
talk: __lunch
- slot: slot-lt-2
talk: machine_learning_avec_des_allumettes_et_des_cotillons
talk: 10_est_une_puissance_de_2
- slot: slot-4
talk: de_java_a_un_executable_natif___graalvm_et_quarkus_changent_la_donne
- slot: pause-4
talk: __pause
- slot: slot-5
talk: a_kotlin_multiplatform_evolution
talk: brace_yourself__vanilla_is_coming__back__
- slot: pause-5
talk: __pause
- slot: slot-6
talk: webgpu__next_generation_3d_graphics_on_the_web
talk: four_diseases
- slot: pause-6
talk: __pause
- slot: slot-7
talk: le_jaillissement_de_l_esprit
talk: introduction_a_la_programmation_par_contraintes
- room: office-hours
slots:
- slot: office-hours-1

@ -5,16 +5,18 @@
"author": "Igor Laborie <ilaborie@gmail.com>",
"license": "Apache-2.0",
"scripts": {
"generate:pdf": "node tools/pdf.js",
"prebuild": "hugo",
"build:minify": "node tools/minify.js",
"build": "run-p build:*"
"build:pdf": "node tools/pdf.js",
"build": "run-s build:*"
},
"devDependencies": {
"firebase-tools": "^7.2.4",
"glob": "^7.1.4",
"html-minifier": "^4.0.0",
"npm-run-all": "^4.1.5",
"plop-logger": "^2.3.0",
"puppeteer": "^1.19.0"
"plop-logger": "^2.6.0",
"puppeteer": "^1.19.0",
"serve-handler": "^6.1.1"
}
}

@ -3,23 +3,23 @@
"id": "HJRThubF4uYPkb7jSUxi",
"name": "DevFest Toulouse 2019",
"address": {
"latLng": {
"lng": 1.4345827,
"lat": 43.6115538
},
"formattedAddress": "11 Espl. Compans Caffarelli, 31000 Toulouse, France",
"locality": {
"short_name": "Toulouse",
"long_name": "Toulouse"
},
"country": {
"long_name": "France",
"short_name": "FR"
"short_name": "FR",
"long_name": "France"
},
"latLng": {
"lat": 43.6115538,
"lng": 1.4345827
}
},
"dates": {
"end": "2019-10-03T10:00:00.000Z",
"start": "2019-10-03T10:00:00.000Z"
"start": "2019-10-03T10:00:00.000Z",
"end": "2019-10-03T10:00:00.000Z"
}
},
"sessions": [
@ -157,6 +157,7 @@
{
"key": "a_kotlin_multiplatform_evolution",
"title": "A Kotlin multiplatform evolution",
"language": "English",
"format": "conference",
"tags": [
"languages"
@ -376,6 +377,17 @@
"draft": false,
"description": "Surprise!"
},
{
"key": "keynote_close_overflow",
"title": "Keynote de fermeture (overflow)",
"format": "keynote",
"tags": [
"keynote"
],
"speakers": [],
"draft": false,
"description": "Surprise!"
},
{
"key": "keynote_open",
"title": "Keynote d'ouverture",
@ -387,6 +399,17 @@
"draft": false,
"description": "Surprise!"
},
{
"key": "keynote_open_overflow",
"title": "Keynote d'ouverture (overflow)",
"format": "keynote",
"tags": [
"keynote"
],
"speakers": [],
"draft": false,
"description": "Surprise!"
},
{
"key": "l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus",
"title": "L'histoire de la découverte d'une backdoor signé Oneplus",
@ -415,7 +438,7 @@
],
"level": "intermediate",
"speakers": [
"kfnue96dm9g1zobctf4gvzdolrp2"
"cedric_moulard"
],
"videoId": null,
"presentation": null,
@ -433,7 +456,6 @@
],
"level": "beginner",
"speakers": [
"estelle_landry_",
"francois_teychene"
],
"videoId": null,
@ -444,7 +466,6 @@
{
"key": "le_jaillissement_de_l_esprit",
"title": "Le jaillissement de l'esprit",
"language": "fr",
"format": "conference",
"tags": [
"method___tools"
@ -515,6 +536,7 @@
"key": "modern_forms_in_react",
"title": "Modern Forms in React",
"id": "McfMVcKDdZv68NSo2JIJ",
"language": "English",
"format": "conference",
"tags": [
"web"
@ -708,7 +730,7 @@
"key": "rust__webassembly__and_the_future_of_serverless",
"title": "Rust, WebAssembly, and the future of Serverless",
"id": "2S9XtGGq3ouHnkivEDKC",
"language": "United States",
"language": "English",
"format": "conference",
"tags": [
"cloud___infra"
@ -797,6 +819,7 @@
"key": "webgpu__next_generation_3d_graphics_on_the_web",
"title": "WebGPU: Next-generation 3D Graphics on the Web",
"id": "5qTyscBWtXLRb04TXEdB",
"language": "English",
"format": "conference",
"tags": [
"web"
@ -894,6 +917,26 @@
],
"description": "Professional Rails developer with an excessive amount of Vimscript in his Github profile. Teaches a Rust course in Sofia University."
},
{
"key": "cedric_moulard",
"name": "Cédric Moulard",
"id": "KFNUe96DM9g1zobCtf4GVzdoLRp2",
"feature": false,
"photoURL": "/images/speakers/cedric_moulard.jpg",
"socials": [
{
"icon": "twitter",
"link": "https://twitter.com/cedric_moulard",
"name": "cedric_moulard"
},
{
"icon": "github",
"link": "https://github.com/cedricmoulard",
"name": "cedricmoulard"
}
],
"description": "Diplômé de Arts & Métiers ParisTech et pas vraiment destiné à faire de l'informatique. \nDéveloppeur autodidacte. \n\n20 ans d'expérience, dont :\n- Architecte Java\n- Développeur Angular\n- Chef de projet\n- ScrumMaster\n- Evaluateur CMMi\n- Responsable Méthodes & Outils"
},
{
"key": "christophe_jollivet",
"name": "Christophe Jollivet",
@ -1003,23 +1046,6 @@
],
"description": "American expat living in Spain, making awesome Javascript open source."
},
{
"key": "estelle_landry_",
"name": "Estelle Landry ☀",
"id": "JkWN4X6967cvBrV2x8vKf1QrHS93",
"feature": false,
"company": "Elium",
"city": "Montpellier, France",
"photoURL": "/images/speakers/estelle_landry_.jpg",
"socials": [
{
"icon": "twitter",
"link": "https://twitter.com/estelandry",
"name": "estelandry"
}
],
"description": "Passionée par mon métier de Product Owner, par l'UX (User eXpérience) et le GameStorming, j'aime participer à l'élaboration d'un produit en étant le lien entre les utilisateurs et les développeurs.\n\nSpeakeuse en conférence tech, membre des Duchess France, de SunnyTech et du MeetUp UX Flupa Montpellier, je continue à me perfectionner et à discuter de nouvelles méthodes ou technologies de l'IT."
},
{
"key": "francois_guillaume_ribreau",
"name": "Francois-Guillaume Ribreau",
@ -1234,28 +1260,6 @@
],
"description": "Développeuse Web depuis presque 3 ans, je pratique Vue.js et Koa.js au quotidien chez SchoolMouv à Toulouse. \nCela fait maintenant trois conférences que je coprésente aux DevFest de Toulouse, de Brest puis à MiXiT 2019. Et je m'épanouis totalement dans cette nouvelle activité !"
},
{
"key": "kfnue96dm9g1zobctf4gvzdolrp2",
"name": "Cédric Moulard",
"id": "KFNUe96DM9g1zobCtf4GVzdoLRp2",
"feature": false,
"company": "Open",
"city": "Aix-en-Provence, France",
"photoURL": "/images/speakers/kfnue96dm9g1zobctf4gvzdolrp2.jpg",
"socials": [
{
"icon": "twitter",
"link": "https://twitter.com/cedric_moulard",
"name": "cedric_moulard"
},
{
"icon": "github",
"link": "https://github.com/cedricmoulard",
"name": "cedricmoulard"
}
],
"description": "Diplômé de Arts & Métiers ParisTech et pas vraiment destiné à faire de l'informatique. \nDéveloppeur autodidacte. \n\n20 ans d'expérience, dont :\n- Architecte Java\n- Développeur Angular\n- Chef de projet\n- ScrumMaster\n- Evaluateur CMMi\n- Responsable Méthodes & Outils"
},
{
"key": "liliia_abdulina",
"name": "Liliia Abdulina",
@ -1788,19 +1792,19 @@
},
{
"key": "room1",
"label": "Grand amphi."
"label": "#1"
},
{
"key": "room2",
"label": "Grande salle"
"label": "#2"
},
{
"key": "room3",
"label": "Salle du haut"
"label": "#3"
},
{
"key": "room4",
"label": "Petite salle"
"label": "#4"
}
],
"slots": [
@ -2088,7 +2092,7 @@
},
{
"slot": "slot-1",
"talk": "_numerique_et_environnement__ou__on_aurait_pu_sauver_les_abeilles__on_a_prefere_sortir_un_nouvel_iphone_"
"talk": "the_rise_of_the_web"
},
{
"slot": "pause-2",
@ -2096,7 +2100,7 @@
},
{
"slot": "slot-2",
"talk": "_votre_api_web_passe_t_elle_le_controle_technique__"
"talk": "l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus"
},
{
"slot": "pause-3",
@ -2104,7 +2108,7 @@
},
{
"slot": "slot-3",
"talk": "a_la_decouverte_de_la_realite_augmentee_avec_arcore"
"talk": "webgpu__next_generation_3d_graphics_on_the_web"
},
{
"slot": "slot-lt-1",
@ -2116,11 +2120,11 @@
},
{
"slot": "slot-lt-2",
"talk": "10_est_une_puissance_de_2"
"talk": "_47_ans___ils_nont_toujours_pas_remarque__"
},
{
"slot": "slot-4",
"talk": "allo_paris__ici_san_francisco__et_si_on_codait_ensemble_avec_vs_code_"
"talk": "rust__webassembly__and_the_future_of_serverless"
},
{
"slot": "pause-4",
@ -2128,7 +2132,7 @@
},
{
"slot": "slot-5",
"talk": "authentication_authorization_starters_battle"
"talk": "le_design_de_l_erreur"
},
{
"slot": "pause-5",
@ -2136,7 +2140,7 @@
},
{
"slot": "slot-6",
"talk": "brace_yourself__vanilla_is_coming__back__"
"talk": "monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques"
},
{
"slot": "pause-6",
@ -2144,7 +2148,7 @@
},
{
"slot": "slot-7",
"talk": "comprendre_le_role_du_noyau_d_un_systeme_d_exploitation_en_creant_un_from_scratch"
"talk": "_votre_api_web_passe_t_elle_le_controle_technique__"
},
{
"slot": "keynote-close",
@ -2159,9 +2163,13 @@
{
"room": "room2",
"slots": [
{
"slot": "keynote-open",
"talk": "keynote_open_overflow"
},
{
"slot": "slot-1",
"talk": "de_java_a_un_executable_natif___graalvm_et_quarkus_changent_la_donne"
"talk": "a_kotlin_multiplatform_evolution"
},
{
"slot": "pause-2",
@ -2169,7 +2177,7 @@
},
{
"slot": "slot-2",
"talk": "devops_at_scale"
"talk": "le_burn_out_agile"
},
{
"slot": "pause-3",
@ -2177,19 +2185,11 @@
},
{
"slot": "slot-3",
"talk": "four_diseases"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "introduction_a_la_programmation_par_contraintes"
"talk": "_numerique_et_environnement__ou__on_aurait_pu_sauver_les_abeilles__on_a_prefere_sortir_un_nouvel_iphone_"
},
{
"slot": "slot-lt-1",
"talk": "_47_ans___ils_nont_toujours_pas_remarque__"
"talk": "machine_learning_avec_des_allumettes_et_des_cotillons"
},
{
"slot": "lunch",
@ -2197,11 +2197,19 @@
},
{
"slot": "slot-lt-2",
"talk": "un_distributeur_automatique_d_argent_de_poche_pour_les_enfants"
"talk": "applications_de_brainfuck__langage_minimaliste_mais_turing_complet"
},
{
"slot": "slot-4",
"talk": "live_coding_musical___vous_savez_coder___devenez_compositeur_avec_webaudio_et_webmidi__"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-5",
"talk": "l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus"
"talk": "the_freedom_of_static_typing"
},
{
"slot": "pause-5",
@ -2209,7 +2217,7 @@
},
{
"slot": "slot-6",
"talk": "le_burn_out_agile"
"talk": "authentication_authorization_starters_battle"
},
{
"slot": "pause-6",
@ -2217,7 +2225,11 @@
},
{
"slot": "slot-7",
"talk": "le_design_de_l_erreur"
"talk": "mon_p____de_voyant_moteur_est_encore_allume___comment_debugger_mon_moteur___plongeon_dans_les_entrailles_des_calculateurs_moteur"
},
{
"slot": "keynote-close",
"talk": "keynote_close_overflow"
}
]
},
@ -2226,7 +2238,7 @@
"slots": [
{
"slot": "slot-1",
"talk": "live_coding_musical___vous_savez_coder___devenez_compositeur_avec_webaudio_et_webmidi__"
"talk": "quand_les_rates_des_ias_nous_renvoient_a_nos_propres_biais_societaux"
},
{
"slot": "pause-2",
@ -2234,7 +2246,7 @@
},
{
"slot": "slot-2",
"talk": "modern_forms_in_react"
"talk": "rust_as_a_high_level_langage"
},
{
"slot": "pause-3",
@ -2242,19 +2254,11 @@
},
{
"slot": "slot-3",
"talk": "mon_p____de_voyant_moteur_est_encore_allume___comment_debugger_mon_moteur___plongeon_dans_les_entrailles_des_calculateurs_moteur"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques"
"talk": "allo_paris__ici_san_francisco__et_si_on_codait_ensemble_avec_vs_code_"
},
{
"slot": "slot-lt-1",
"talk": "applications_de_brainfuck__langage_minimaliste_mais_turing_complet"
"talk": "le_troll_dans_ta_machine_____une_courte_introduction_a_la_pensee_de_jean_yves_girard"
},
{
"slot": "lunch",
@ -2262,11 +2266,19 @@
},
{
"slot": "slot-lt-2",
"talk": "developpeurs_en_reconversion__developpeurs_quand_meme__"
"talk": "un_distributeur_automatique_d_argent_de_poche_pour_les_enfants"
},
{
"slot": "slot-4",
"talk": "le_jaillissement_de_l_esprit"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-5",
"talk": "premiers_pas_avec_un_microcontroleur_et_google_cloud_iot_core"
"talk": "comprendre_le_role_du_noyau_d_un_systeme_d_exploitation_en_creant_un_from_scratch"
},
{
"slot": "pause-5",
@ -2274,7 +2286,7 @@
},
{
"slot": "slot-6",
"talk": "quand_les_rates_des_ias_nous_renvoient_a_nos_propres_biais_societaux"
"talk": "devops_at_scale"
},
{
"slot": "pause-6",
@ -2282,7 +2294,7 @@
},
{
"slot": "slot-7",
"talk": "rockin_in_the_angular_world"
"talk": "modern_forms_in_react"
}
]
},
@ -2291,7 +2303,7 @@
"slots": [
{
"slot": "slot-1",
"talk": "rust__webassembly__and_the_future_of_serverless"
"talk": "a_la_decouverte_de_la_realite_augmentee_avec_arcore"
},
{
"slot": "pause-2",
@ -2299,7 +2311,7 @@
},
{
"slot": "slot-2",
"talk": "rust_as_a_high_level_langage"
"talk": "rockin_in_the_angular_world"
},
{
"slot": "pause-3",
@ -2307,19 +2319,11 @@
},
{
"slot": "slot-3",
"talk": "the_freedom_of_static_typing"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "the_rise_of_the_web"
"talk": "premiers_pas_avec_un_microcontroleur_et_google_cloud_iot_core"
},
{
"slot": "slot-lt-1",
"talk": "le_troll_dans_ta_machine_____une_courte_introduction_a_la_pensee_de_jean_yves_girard"
"talk": "developpeurs_en_reconversion__developpeurs_quand_meme__"
},
{
"slot": "lunch",
@ -2327,11 +2331,19 @@
},
{
"slot": "slot-lt-2",
"talk": "machine_learning_avec_des_allumettes_et_des_cotillons"
"talk": "10_est_une_puissance_de_2"
},
{
"slot": "slot-4",
"talk": "de_java_a_un_executable_natif___graalvm_et_quarkus_changent_la_donne"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-5",
"talk": "a_kotlin_multiplatform_evolution"
"talk": "brace_yourself__vanilla_is_coming__back__"
},
{
"slot": "pause-5",
@ -2339,7 +2351,7 @@
},
{
"slot": "slot-6",
"talk": "webgpu__next_generation_3d_graphics_on_the_web"
"talk": "four_diseases"
},
{
"slot": "pause-6",
@ -2347,7 +2359,7 @@
},
{
"slot": "slot-7",
"talk": "le_jaillissement_de_l_esprit"
"talk": "introduction_a_la_programmation_par_contraintes"
}
]
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -1 +1 @@
Subproject commit 1c1c7bac824e50d7fa3fd3de2e5f9ce09a285c36
Subproject commit 6a8d7c8af563c5fa71e36e31fe6425ce85702f36

@ -1,20 +1,27 @@
const {readFileSync, writeFileSync} = require('fs');
const {sync: glob} = require('glob');
const {minify} = require('html-minifier');
const {Logger} = require('plop-logger');
const {Logger, LogLevel} = require('plop-logger');
const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig');
Logger.config = colorEmojiConfig;
const logger = Logger.getLogger('minifier');
logger.level = LogLevel.All;
glob(`public/**/*.html`)
.forEach(file => {
const html = readFileSync(file, 'utf8');
const minified = minify(html, {});
const gain = html.length - minified.length;
if (gain > 0) {
const percent = (gain / html.length) * 100;
logger.info(file, () => ['gain', percent.toFixed(2), '%'].join(" "));
writeFileSync(file, minified, {flag: 'w'});
}
});
const htmlFiles = `public/**/*.html`;
logger.info('Compress HTML files', htmlFiles);
const totalGain = glob(htmlFiles)
.map(file => {
const html = readFileSync(file, 'utf8');
const minified = minify(html, {});
const gain = html.length - minified.length;
if (gain > 0) {
const percent = (gain / html.length) * 100;
logger.debug(file, () => ['gain', percent.toFixed(2), '%'].join(" "));
writeFileSync(file, minified, {flag: 'w'});
}
return gain;
}).reduce((acc, elt) => acc + elt, 0);
logger.info('Total gain', '' + totalGain);

@ -1,50 +1,104 @@
const puppeteer = require('puppeteer');
const {Logger, LogLevel} = require('plop-logger');
const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig');
const handler = require('serve-handler');
const http = require('http');
Logger.config = colorEmojiConfig;
Logger.config.defaultLevel = LogLevel.Debug;
const logger = Logger.getLogger('pdf');
// Configuration
const output = 'static/schedule/schedule.pdf';
const serverConf = {
port: 8765,
options: {
"public": "./public"
}
};
const browserConf = {
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
defaultViewport: {width: 1280, height: 1700},
margin: {
top: "0cm",
right: "0cm",
bottom: "0cm",
left: "0cm"
},
devtools: false
};
async function startServer({port, options}) {
return new Promise((resolve, reject) => {
const server = http.createServer((request, response) =>
handler(request, response, options));
server.listen(port, err => {
if (err) {
logger.error('Fail to start server', err);
reject(err);
} else {
logger.info('Server started', () => `http://localhost:${port}`);
resolve(server);
}
});
});
}
async function stopServer(server) {
return new Promise((resolve, reject) => {
logger.info('Stopping server...');
server.close(err => {
if (err) {
logger.error('Fail to stop server', err);
reject(err);
} else {
logger.info('Server stopped');
resolve();
}
});
});
}
async function cleanupBeforePrint(page) {
const toHide = [
'body > header',
'body > footer',
'main .hero',
];
await page.$$eval(toHide.join(','), elts =>
elts.forEach(elt =>
elt.parentNode.removeChild(elt)));
await page.addStyleTag({
content: '@page { size: auto; }',
});
}
(async () => {
const server = await startServer(serverConf);
logger.info("launch puppeteer browser");
const defaultViewport = {width: 1280, height: 1700};
const devtools = false;
const browser = await puppeteer.launch({devtools, defaultViewport});
const browser = await puppeteer.launch(browserConf);
try {
logger.info("open new page");
const page = await browser.newPage();
logger.debug("opened new page");
const file = 'schedule/index.html';
const url = `http://localhost:1313/${file}`;
const file = 'fr/schedule/index.html';
const url = `http://localhost:${serverConf.port}/${file}`;
logger.info("go to", url);
const pageResponse = await page.goto(url, {waitUntil: 'networkidle2'});
logger.debug("gone", pageResponse.statusText());
const toHide = [
'body>header',
'body>footer',
'main .hero',
];
await page.$$eval(toHide.join(','), function (elts) {
// debugger;
elts.forEach(elt => {
elt.parentNode.removeChild(elt);
// elt.style.display = 'none';
});
});
await page.addStyleTag({
content: '@page { size: auto; }',
});
logger.debug("done", pageResponse.statusText());
logger.info('export pdf');
const path = 'static/schedule/schedule.pdf';
await cleanupBeforePrint(page);
logger.info('export pdf', output);
const format = 'A3';
const scale = .4;
const printBackground = true;
await page.pdf({path, format, scale, printBackground});
await page.pdf({path:output, format, scale, printBackground});
logger.debug("pdf done");
} catch (e) {
@ -53,5 +107,6 @@ const logger = Logger.getLogger('pdf');
} finally {
logger.info('close puppeteer browser');
await browser.close();
await stopServer(server);
}
})();

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save