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. 17
      tools/minify.js
  26. 103
      tools/pdf.js
  27. 2668
      yarn.lock

2
.gitignore vendored

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

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

@ -5,7 +5,6 @@ menu:
weight: 10 weight: 10
horizontal: false horizontal: false
draft: true draft: true
--- ---
@ -17,7 +16,7 @@ draft: true
</a> </a>
<a class="btn primary btn-lg" href="/schedule/schedule.pdf"> <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> </a>
<!-- TODO: filter and search --> <!-- TODO: filter and search -->

@ -5,7 +5,6 @@ menu:
weight: 10 weight: 10
horizontal: false horizontal: false
draft: true draft: true
--- ---
@ -15,5 +14,9 @@ draft: true
<svg class="icon icon-calendar"><use xlink:href="#calendar"></use></svg> ICal <svg class="icon icon-calendar"><use xlink:href="#calendar"></use></svg> ICal
</a> </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 --> <!-- TODO: filter and search -->
{{% /hero %}} {{% /hero %}}

@ -1,6 +1,7 @@
--- ---
key: a_kotlin_multiplatform_evolution key: a_kotlin_multiplatform_evolution
title: A Kotlin multiplatform evolution title: A Kotlin multiplatform evolution
language: English
format: conference format: conference
tags: tags:
- languages - 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 - method___tools
level: intermediate level: intermediate
speakers: speakers:
- kfnue96dm9g1zobctf4gvzdolrp2 - cedric_moulard
videoId: null videoId: null
presentation: null presentation: null
draft: false draft: false

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

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

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

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

@ -2,6 +2,7 @@
key: webgpu__next_generation_3d_graphics_on_the_web key: webgpu__next_generation_3d_graphics_on_the_web
title: 'WebGPU: Next-generation 3D Graphics on the Web' title: 'WebGPU: Next-generation 3D Graphics on the Web'
id: 5qTyscBWtXLRb04TXEdB id: 5qTyscBWtXLRb04TXEdB
language: English
format: conference format: conference
tags: tags:
- web - 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 id: HJRThubF4uYPkb7jSUxi
name: DevFest Toulouse 2019 name: DevFest Toulouse 2019
address: address:
latLng:
lng: 1.4345827
lat: 43.6115538
formattedAddress: '11 Espl. Compans Caffarelli, 31000 Toulouse, France' formattedAddress: '11 Espl. Compans Caffarelli, 31000 Toulouse, France'
locality: locality:
short_name: Toulouse short_name: Toulouse
long_name: Toulouse long_name: Toulouse
country: country:
long_name: France
short_name: FR short_name: FR
long_name: France
latLng:
lat: 43.6115538
lng: 1.4345827
dates: 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'

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

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

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

@ -3,23 +3,23 @@
"id": "HJRThubF4uYPkb7jSUxi", "id": "HJRThubF4uYPkb7jSUxi",
"name": "DevFest Toulouse 2019", "name": "DevFest Toulouse 2019",
"address": { "address": {
"latLng": {
"lng": 1.4345827,
"lat": 43.6115538
},
"formattedAddress": "11 Espl. Compans Caffarelli, 31000 Toulouse, France", "formattedAddress": "11 Espl. Compans Caffarelli, 31000 Toulouse, France",
"locality": { "locality": {
"short_name": "Toulouse", "short_name": "Toulouse",
"long_name": "Toulouse" "long_name": "Toulouse"
}, },
"country": { "country": {
"long_name": "France", "short_name": "FR",
"short_name": "FR" "long_name": "France"
},
"latLng": {
"lat": 43.6115538,
"lng": 1.4345827
} }
}, },
"dates": { "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": [ "sessions": [
@ -157,6 +157,7 @@
{ {
"key": "a_kotlin_multiplatform_evolution", "key": "a_kotlin_multiplatform_evolution",
"title": "A Kotlin multiplatform evolution", "title": "A Kotlin multiplatform evolution",
"language": "English",
"format": "conference", "format": "conference",
"tags": [ "tags": [
"languages" "languages"
@ -376,6 +377,17 @@
"draft": false, "draft": false,
"description": "Surprise!" "description": "Surprise!"
}, },
{
"key": "keynote_close_overflow",
"title": "Keynote de fermeture (overflow)",
"format": "keynote",
"tags": [
"keynote"
],
"speakers": [],
"draft": false,
"description": "Surprise!"
},
{ {
"key": "keynote_open", "key": "keynote_open",
"title": "Keynote d'ouverture", "title": "Keynote d'ouverture",
@ -387,6 +399,17 @@
"draft": false, "draft": false,
"description": "Surprise!" "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", "key": "l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus",
"title": "L'histoire de la découverte d'une backdoor signé Oneplus", "title": "L'histoire de la découverte d'une backdoor signé Oneplus",
@ -415,7 +438,7 @@
], ],
"level": "intermediate", "level": "intermediate",
"speakers": [ "speakers": [
"kfnue96dm9g1zobctf4gvzdolrp2" "cedric_moulard"
], ],
"videoId": null, "videoId": null,
"presentation": null, "presentation": null,
@ -433,7 +456,6 @@
], ],
"level": "beginner", "level": "beginner",
"speakers": [ "speakers": [
"estelle_landry_",
"francois_teychene" "francois_teychene"
], ],
"videoId": null, "videoId": null,
@ -444,7 +466,6 @@
{ {
"key": "le_jaillissement_de_l_esprit", "key": "le_jaillissement_de_l_esprit",
"title": "Le jaillissement de l'esprit", "title": "Le jaillissement de l'esprit",
"language": "fr",
"format": "conference", "format": "conference",
"tags": [ "tags": [
"method___tools" "method___tools"
@ -515,6 +536,7 @@
"key": "modern_forms_in_react", "key": "modern_forms_in_react",
"title": "Modern Forms in React", "title": "Modern Forms in React",
"id": "McfMVcKDdZv68NSo2JIJ", "id": "McfMVcKDdZv68NSo2JIJ",
"language": "English",
"format": "conference", "format": "conference",
"tags": [ "tags": [
"web" "web"
@ -708,7 +730,7 @@
"key": "rust__webassembly__and_the_future_of_serverless", "key": "rust__webassembly__and_the_future_of_serverless",
"title": "Rust, WebAssembly, and the future of Serverless", "title": "Rust, WebAssembly, and the future of Serverless",
"id": "2S9XtGGq3ouHnkivEDKC", "id": "2S9XtGGq3ouHnkivEDKC",
"language": "United States", "language": "English",
"format": "conference", "format": "conference",
"tags": [ "tags": [
"cloud___infra" "cloud___infra"
@ -797,6 +819,7 @@
"key": "webgpu__next_generation_3d_graphics_on_the_web", "key": "webgpu__next_generation_3d_graphics_on_the_web",
"title": "WebGPU: Next-generation 3D Graphics on the Web", "title": "WebGPU: Next-generation 3D Graphics on the Web",
"id": "5qTyscBWtXLRb04TXEdB", "id": "5qTyscBWtXLRb04TXEdB",
"language": "English",
"format": "conference", "format": "conference",
"tags": [ "tags": [
"web" "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." "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", "key": "christophe_jollivet",
"name": "Christophe Jollivet", "name": "Christophe Jollivet",
@ -1003,23 +1046,6 @@
], ],
"description": "American expat living in Spain, making awesome Javascript open source." "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", "key": "francois_guillaume_ribreau",
"name": "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é !" "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", "key": "liliia_abdulina",
"name": "Liliia Abdulina", "name": "Liliia Abdulina",
@ -1788,19 +1792,19 @@
}, },
{ {
"key": "room1", "key": "room1",
"label": "Grand amphi." "label": "#1"
}, },
{ {
"key": "room2", "key": "room2",
"label": "Grande salle" "label": "#2"
}, },
{ {
"key": "room3", "key": "room3",
"label": "Salle du haut" "label": "#3"
}, },
{ {
"key": "room4", "key": "room4",
"label": "Petite salle" "label": "#4"
} }
], ],
"slots": [ "slots": [
@ -2088,7 +2092,7 @@
}, },
{ {
"slot": "slot-1", "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", "slot": "pause-2",
@ -2096,7 +2100,7 @@
}, },
{ {
"slot": "slot-2", "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", "slot": "pause-3",
@ -2104,7 +2108,7 @@
}, },
{ {
"slot": "slot-3", "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", "slot": "slot-lt-1",
@ -2116,11 +2120,11 @@
}, },
{ {
"slot": "slot-lt-2", "slot": "slot-lt-2",
"talk": "10_est_une_puissance_de_2" "talk": "_47_ans___ils_nont_toujours_pas_remarque__"
}, },
{ {
"slot": "slot-4", "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", "slot": "pause-4",
@ -2128,7 +2132,7 @@
}, },
{ {
"slot": "slot-5", "slot": "slot-5",
"talk": "authentication_authorization_starters_battle" "talk": "le_design_de_l_erreur"
}, },
{ {
"slot": "pause-5", "slot": "pause-5",
@ -2136,7 +2140,7 @@
}, },
{ {
"slot": "slot-6", "slot": "slot-6",
"talk": "brace_yourself__vanilla_is_coming__back__" "talk": "monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques"
}, },
{ {
"slot": "pause-6", "slot": "pause-6",
@ -2144,7 +2148,7 @@
}, },
{ {
"slot": "slot-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", "slot": "keynote-close",
@ -2159,9 +2163,13 @@
{ {
"room": "room2", "room": "room2",
"slots": [ "slots": [
{
"slot": "keynote-open",
"talk": "keynote_open_overflow"
},
{ {
"slot": "slot-1", "slot": "slot-1",
"talk": "de_java_a_un_executable_natif___graalvm_et_quarkus_changent_la_donne" "talk": "a_kotlin_multiplatform_evolution"
}, },
{ {
"slot": "pause-2", "slot": "pause-2",
@ -2169,7 +2177,7 @@
}, },
{ {
"slot": "slot-2", "slot": "slot-2",
"talk": "devops_at_scale" "talk": "le_burn_out_agile"
}, },
{ {
"slot": "pause-3", "slot": "pause-3",
@ -2177,19 +2185,11 @@
}, },
{ {
"slot": "slot-3", "slot": "slot-3",
"talk": "four_diseases" "talk": "_numerique_et_environnement__ou__on_aurait_pu_sauver_les_abeilles__on_a_prefere_sortir_un_nouvel_iphone_"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "introduction_a_la_programmation_par_contraintes"
}, },
{ {
"slot": "slot-lt-1", "slot": "slot-lt-1",
"talk": "_47_ans___ils_nont_toujours_pas_remarque__" "talk": "machine_learning_avec_des_allumettes_et_des_cotillons"
}, },
{ {
"slot": "lunch", "slot": "lunch",
@ -2197,11 +2197,19 @@
}, },
{ {
"slot": "slot-lt-2", "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", "slot": "slot-5",
"talk": "l_histoire_de_la_decouverte_d_une_backdoor_signe_oneplus" "talk": "the_freedom_of_static_typing"
}, },
{ {
"slot": "pause-5", "slot": "pause-5",
@ -2209,7 +2217,7 @@
}, },
{ {
"slot": "slot-6", "slot": "slot-6",
"talk": "le_burn_out_agile" "talk": "authentication_authorization_starters_battle"
}, },
{ {
"slot": "pause-6", "slot": "pause-6",
@ -2217,7 +2225,11 @@
}, },
{ {
"slot": "slot-7", "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": [ "slots": [
{ {
"slot": "slot-1", "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", "slot": "pause-2",
@ -2234,7 +2246,7 @@
}, },
{ {
"slot": "slot-2", "slot": "slot-2",
"talk": "modern_forms_in_react" "talk": "rust_as_a_high_level_langage"
}, },
{ {
"slot": "pause-3", "slot": "pause-3",
@ -2242,19 +2254,11 @@
}, },
{ {
"slot": "slot-3", "slot": "slot-3",
"talk": "mon_p____de_voyant_moteur_est_encore_allume___comment_debugger_mon_moteur___plongeon_dans_les_entrailles_des_calculateurs_moteur" "talk": "allo_paris__ici_san_francisco__et_si_on_codait_ensemble_avec_vs_code_"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "monitoring_ovh__300k_serveurs__27_dcs_une_plateforme_de_metriques"
}, },
{ {
"slot": "slot-lt-1", "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", "slot": "lunch",
@ -2262,11 +2266,19 @@
}, },
{ {
"slot": "slot-lt-2", "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", "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", "slot": "pause-5",
@ -2274,7 +2286,7 @@
}, },
{ {
"slot": "slot-6", "slot": "slot-6",
"talk": "quand_les_rates_des_ias_nous_renvoient_a_nos_propres_biais_societaux" "talk": "devops_at_scale"
}, },
{ {
"slot": "pause-6", "slot": "pause-6",
@ -2282,7 +2294,7 @@
}, },
{ {
"slot": "slot-7", "slot": "slot-7",
"talk": "rockin_in_the_angular_world" "talk": "modern_forms_in_react"
} }
] ]
}, },
@ -2291,7 +2303,7 @@
"slots": [ "slots": [
{ {
"slot": "slot-1", "slot": "slot-1",
"talk": "rust__webassembly__and_the_future_of_serverless" "talk": "a_la_decouverte_de_la_realite_augmentee_avec_arcore"
}, },
{ {
"slot": "pause-2", "slot": "pause-2",
@ -2299,7 +2311,7 @@
}, },
{ {
"slot": "slot-2", "slot": "slot-2",
"talk": "rust_as_a_high_level_langage" "talk": "rockin_in_the_angular_world"
}, },
{ {
"slot": "pause-3", "slot": "pause-3",
@ -2307,19 +2319,11 @@
}, },
{ {
"slot": "slot-3", "slot": "slot-3",
"talk": "the_freedom_of_static_typing" "talk": "premiers_pas_avec_un_microcontroleur_et_google_cloud_iot_core"
},
{
"slot": "pause-4",
"talk": "__pause"
},
{
"slot": "slot-4",
"talk": "the_rise_of_the_web"
}, },
{ {
"slot": "slot-lt-1", "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", "slot": "lunch",
@ -2327,11 +2331,19 @@
}, },
{ {
"slot": "slot-lt-2", "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", "slot": "slot-5",
"talk": "a_kotlin_multiplatform_evolution" "talk": "brace_yourself__vanilla_is_coming__back__"
}, },
{ {
"slot": "pause-5", "slot": "pause-5",
@ -2339,7 +2351,7 @@
}, },
{ {
"slot": "slot-6", "slot": "slot-6",
"talk": "webgpu__next_generation_3d_graphics_on_the_web" "talk": "four_diseases"
}, },
{ {
"slot": "pause-6", "slot": "pause-6",
@ -2347,7 +2359,7 @@
}, },
{ {
"slot": "slot-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 {readFileSync, writeFileSync} = require('fs');
const {sync: glob} = require('glob'); const {sync: glob} = require('glob');
const {minify} = require('html-minifier'); const {minify} = require('html-minifier');
const {Logger} = require('plop-logger'); const {Logger, LogLevel} = require('plop-logger');
const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig'); const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig');
Logger.config = colorEmojiConfig; Logger.config = colorEmojiConfig;
const logger = Logger.getLogger('minifier'); const logger = Logger.getLogger('minifier');
logger.level = LogLevel.All;
glob(`public/**/*.html`) const htmlFiles = `public/**/*.html`;
.forEach(file => { logger.info('Compress HTML files', htmlFiles);
const totalGain = glob(htmlFiles)
.map(file => {
const html = readFileSync(file, 'utf8'); const html = readFileSync(file, 'utf8');
const minified = minify(html, {}); const minified = minify(html, {});
const gain = html.length - minified.length; const gain = html.length - minified.length;
if (gain > 0) { if (gain > 0) {
const percent = (gain / html.length) * 100; const percent = (gain / html.length) * 100;
logger.info(file, () => ['gain', percent.toFixed(2), '%'].join(" ")); logger.debug(file, () => ['gain', percent.toFixed(2), '%'].join(" "));
writeFileSync(file, minified, {flag: 'w'}); 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 puppeteer = require('puppeteer');
const {Logger, LogLevel} = require('plop-logger'); const {Logger, LogLevel} = require('plop-logger');
const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig'); const {colorEmojiConfig} = require('plop-logger/lib/extra/colorEmojiConfig');
const handler = require('serve-handler');
const http = require('http');
Logger.config = colorEmojiConfig; Logger.config = colorEmojiConfig;
Logger.config.defaultLevel = LogLevel.Debug; Logger.config.defaultLevel = LogLevel.Debug;
const logger = Logger.getLogger('pdf'); const logger = Logger.getLogger('pdf');
(async () => { // Configuration
logger.info("launch puppeteer browser"); const output = 'static/schedule/schedule.pdf';
const defaultViewport = {width: 1280, height: 1700}; const serverConf = {
const devtools = false; port: 8765,
const browser = await puppeteer.launch({devtools, defaultViewport}); options: {
try { "public": "./public"
logger.info("open new page"); }
const page = await browser.newPage(); };
logger.debug("opened new page"); 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
};
const file = 'schedule/index.html'; async function startServer({port, options}) {
const url = `http://localhost:1313/${file}`; return new Promise((resolve, reject) => {
logger.info("go to", url); const server = http.createServer((request, response) =>
const pageResponse = await page.goto(url, {waitUntil: 'networkidle2'}); handler(request, response, options));
logger.debug("gone", pageResponse.statusText());
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 = [ const toHide = [
'body > header', 'body > header',
'body > footer', 'body > footer',
'main .hero', 'main .hero',
]; ];
await page.$$eval(toHide.join(','), function (elts) {
// debugger; await page.$$eval(toHide.join(','), elts =>
elts.forEach(elt => { elts.forEach(elt =>
elt.parentNode.removeChild(elt); elt.parentNode.removeChild(elt)));
// elt.style.display = 'none';
});
});
await page.addStyleTag({ await page.addStyleTag({
content: '@page { size: auto; }', content: '@page { size: auto; }',
}); });
}
(async () => {
const server = await startServer(serverConf);
logger.info("launch puppeteer browser");
const browser = await puppeteer.launch(browserConf);
try {
logger.info("open new page");
const page = await browser.newPage();
logger.debug("opened new page");
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("done", pageResponse.statusText());
logger.info('export pdf'); await cleanupBeforePrint(page);
const path = 'static/schedule/schedule.pdf'; logger.info('export pdf', output);
const format = 'A3'; const format = 'A3';
const scale = .4; const scale = .4;
const printBackground = true; const printBackground = true;
await page.pdf({path, format, scale, printBackground}); await page.pdf({path:output, format, scale, printBackground});
logger.debug("pdf done"); logger.debug("pdf done");
} catch (e) { } catch (e) {
@ -53,5 +107,6 @@ const logger = Logger.getLogger('pdf');
} finally { } finally {
logger.info('close puppeteer browser'); logger.info('close puppeteer browser');
await browser.close(); await browser.close();
await stopServer(server);
} }
})(); })();

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