This repository has been archived on 2023-02-07. You can view files and clone it, but cannot push or open issues or pull requests.
hkis-au-campus-du-libre-2022/slides.md

4.2 KiB

HackInScience


Julien Palard

CPython core dev

Demo time !

Parce que vous êtes là pour ça.

::: notes

Qui à dit « C'est moche ! » ? Je ne suis pas dev front !

Ne pas oublier la démo C et Rust !

Ceux pour qui la démo suffit, vous pouvez sortir ♥

Enseigner le Python

J'ai l'habitude.

Mais à des groupes de ~6 pendant ~3 jours.

C'est green

Ruby Rhod

Enseigner le Python

Un jour on nous a proposé un groupe de 50 pendant 7 jours.

::: notes

En fait il sont arrivés à 80.

C'est pas green

Ruby Rhod étranglé

Mais on est devs

Alors on a automatisé tout ce qui pouvait l'être.

::: notes

Pour passer du temps avec ceux qui en ont besoin.

HackInScience.org

C'est un petit Django, avec un peu de celery.

::: notes

Pour répartir les corrections sur des machines qui ne font que ça.

181 lignes de Python

Ça devrait loger dans quelques slides ;)

::: notes

Aujourd'hui c'est 2700 lignes de code…

Django models

class Exercise(models.Model):
    title = models.CharField(max_length=255)
    wording = models.TextField()
    check = models.TextField()

Django view

class ExerciseListView(LoginRequiredMixin, ListView):
    model = Exercise
    template_name = "hkis/exercises.html"

class ExerciseView(LoginRequiredMixin, DetailView):
    model = Exercise
    template_name = "hkis/exercise.html"

::: notes

Vous saviez que la MRO de Python garanti un héritage de gauche à droite ?

Ici il est garanti que les méthodes surchargées par LoginRequiredMixin sont exécutées avant celles de ListView.

Une petite API

class ExerciseSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = Exercise
        fields = '__all__'

class ExerciseViewSet(viewsets.ModelViewSet):
    queryset = Exercise.objects.all()
    serializer_class = ExerciseSerializer

router = routers.DefaultRouter()
router.register('exercises', ExerciseViewSet)

::: notes

Pourquoi un "Router" ? Parce que derrière cette ViewSet il y a plein de vues !

Démo time !

Une interface d'admin

from django.contrib import admin
from website.models import Answer, Exercise

admin.site.register(Answer)
admin.site.register(Exercise)

::: notes

Comme ça on a pu se concentrer sur les exercices et les moulinettes de correction.

C'est utilisé ?

Je n'ai pas de « pisteur », mais j'ai une DB.

En octobre 2022 : 730 personnes ont résolu 10_780 exercices

La moulinette a corrigé près de 50k rendus.

::: notes

Google Analytics c'est illégal. Mais je sais écrire du SQL.

Aucun tracker, aucune pub, aucun asset externe.

10k c'est peu ou beaucoup, je ne sais pas.

Ça tient la charge ?

Les exercices sont corrigés en environ 200ms.

Deux serveurs se répartissent le travail.

Les boucles infinies sont interrompues après 20s.

::: notes

Il est très facile d'ajouter un serveur de correction au besoin.

C'est rentable ?

Ren…quoi ? Pardon ?

J'ai pas de « business model », et non mon projet ne va pas « mourir demain » pour autant #sry.

::: notes

Afficher la page des sponsors, remercier les sponsors et Gandi.

En fait c'était rentable jusqu'à ce que j'achète des billets de train pour venir ici :D

Côté sécu

Les rendus sont exécutés côté serveur.

C'est un challenge niveau sécurité.

::: notes

Python est réputé pour ne pas être sandboxable, du moins pas depuis l'intérieur de l'interpréteur.

seccomp

+ Linux namespaces

+ rlimit

::: notes

Pourquoi pas Docker ? Pas besoin d'un filesystem complet, juste d'un processus.

Vu d'un enseignant

::: notes

Vous êtes libres de quitter la salle.

L'interface d'admin

Un repo git

Juste pour les exos.

L'hébergement d'instances locales

Possible, évidement, j'ignore s'il y en a.

Mot de la fin

Si vous aimez Python, n'oubliez pas la PyConFr !

Du 16 au 19 février 2023 !

Questions