Journal TapTempo.sql

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
72
8
juil.
2023

Ce journal fait suite à la dépêche publiée mardi à propos de SQLPage. Si vous ne l'avez pas encore lu, c'est le moment !

Pour résumer: SQLPage est un petit serveur web qui permet de réaliser des applications web complètes en SQL.

Pas de bras, pas de chocolat

Il se trouve que SQL est l'un des rares langages de programmation populaires pour lequel il n'y a pas d'implémentation de TapTempo. La raison semble assez évidente: le principe de taptempo, c'est de demander à l'utilisateur de taper à intervalle régulier, et d'afficher en temps réel le fréquence de tapotement en battements par minute. SQL étant un langage de requête pour base de données, il ne permet pas ni de collecter des entrées de la part de l'utilisateur, ni de lui afficher quelque chose directement. Dans ces conditions, difficile de faire une taptempo en SQL… Pas de bras, pas de chocolat !

Où l'on fait pousser des bras à SQL

SQLPage vient changer la donne, puisqu'il permet d'accéder directement aux requêtes web faites par un utilisateur en SQL, et d'afficher les résultats sous forme de page web.

L'idée

L'idée pour relever le défi de faire un taptempo en sql devient alors plutôt simple: on enregistre dans une base de données l'instant précis auquel chaque utilisateur charge une page. Lorsqu'il recharge une page, on fait la différence entre l'instant présent et le dernier instant où il a chargé la page. C'est suffisant pour calculer la fréquence (le tempo) auquel il recharge la page. Mettons juste un gros bouton sur la page qui permet de la recharger, et si l'utilisateur commence à cliquer dessus régulièrement, nous pourrons afficher son tempo.

L'implémentation

schéma de base de données
CREATE TABLE tap(
    tapping_session INTEGER,
    day REAL NOT NULL, -- fractional julian day, easy to manipulate in SQLite
    PRIMARY KEY (tapping_session, day)
);

CREATE VIEW tap_bpm AS
SELECT *, CAST(1 / ((24 * 60) * (day - previous)) AS INTEGER) AS bpm
FROM (SELECT *, lag(day) OVER (ORDER BY day) AS previous FROM tap);
taptempo.sql
INSERT INTO tap(tapping_session, day) VALUES ($session, julianday('now'));

SELECT 'big_button' as component,
         COALESCE(
            (SELECT bpm || ' bpm' FROM tap_bpm WHERE tapping_session = $session ORDER BY day DESC LIMIT 1),
            'Tap'
          ) AS text,
         'taptempo.sql?session=' || $session as link;

Ici pour donner à l'application un côté plus sympathique, j'ai décidé de créer un composant plutôt que d'utiliser l'un des composants fournis par défaut. Ça me permet de créer un composant contenant un bouton avec un style personnalisé.

Le résultat

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.