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é.
# Merci. Cette version était indispensable.
Posté par fabricius . Évalué à 3.
Et en plus je vois que la page qui liste les versions est mise à jour! Bravo.
Oh, je ne découvre que maintenant la version en BASIC Amstrad CPC!
Par contre je ne trouve pas de TapTempo en uxntal. Il faudra que je m'y penche.
[^] # Re: Merci. Cette version était indispensable.
Posté par Colin Pitrat (site web personnel) . Évalué à 5.
Ah mince, le locomotive basic (basic de l'amstrad cpc) est déjà fait? Je vais devoir me coller à une version en asm z80 alors!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.