...
| Info | ||
|---|---|---|
| ||
Lors des JRES 2021 (2022) à Marseille et en présentant un badge/périphérique RFID (en privlégiant privilégiant la carte multi-services de votre établissement si vous en disposez) au stand Esup-Portail, en fonction du numéro de série de ce badge, vous gagnerez peut-être gagnez un des goodies ESUP-Portail. Ce jeu s'appuie sur esup-sgc / esup-nfc-tag ; la description de cette mise en place est décrite dans cette page et fait ainsi office également de documentation illustrative technique du projet. Aucune donnée personnelle n'est récupérée, utilisée et conservée. |
...
On souhaite ainsi implémenter une loterie par badgeage de cartes pour distribuer ces lots à environ 800 personnes (environ 2000 personnes sont attendues aux JRES pendant 3 jours).
Les chances de gagner doivent donc être fonction de ce nombre de joueurs potentiels et sont fonction du stock de chaque lot.
- 1 chance sur 59 51 de gagner un parapluie
- puis 1 chance sur 31 de 3 chances sur 51 de gagner un couteau "suisse"
- puis 1 chance sur 5 de 7 chances sur 51 de gagner un porte-cartes (multiple)
- puis 1 chance sur 3 de gagner un porte-carte simple
- 17 chances sur 51 de gagner le goodies "spécial 20 ans" ESUP
- 23 chances sur 51 de puis encore 1 chance sur 3 de gagner le goodies "spécial 20 ans" ESUP
Le badgeage peut être fait sur toute carte/dispositif RFID par les membres ESUP tenant le stand (après authentification Shibboleth via la fédération ESR) via un téléphone NFC disposant de ESUP-NFC-TAG-DROID disponible sur le Google Play ESUP-Portail.
...
Via le numéro de série de la carte, on fait une opération de modulo pour attribuer un lot (les modulos ont été choisis arbitrairement) :
- si (csn % 5951) == 16 0 -> parapluie
- si (csn % 31)==2 51) de 1 à 3 -> couteau
- si (csn % 5)==2 51) de 4 à 10 -> porte-cartes multiple
- si (csn % 51) de 11 à 27 -> goodies 20 ans
- si 3)==0 -> porte-carte simple (csn % 3)==1 -> goodies 20 ans51) de 29 à 50 -> porte-carte simple
A chaque badgeage, on garde en mémoire le csn dans un fichier pour indiquer si la carte a déjà été utilisée lors du jeu.
...
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cgi
import re
args = cgi.parse()
print "Content-type: application/json"
print
if 'locations' in args.keys():
if args['eppn'][0] in ('bonamvin@univ-rouen.fr', 'lemaida3@univ-rouen.fr', 'esupdem@univ-rouen.fr'):
print '["Esup Goodies"]'
else:
print '[]'
elif 'isTagable' in args.keys():
print 'OK'
elif 'validateTag' in args.keys():
print 'OK'
elif 'tagIdCheck' in args.keys():
csn = args['csn'][0]
alreadyChecked = False
suffix = ''
file = open('/var/www/log/goodies.txt',"r")
for line in file:
if re.search(csn, line):
alreadyChecked = True
suffix = '[RE]'
file.close()
csnAsInt = int(csn, 16)
ifmodCsn csnAsInt%59==16= csnAsInt%51
if modCsn in range(0,1):
print('{"csn":"-", "eppn":"parapluie", "firstname":"%s", "lastname":"Parapluie !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')suffix))
elif csnAsInt%31==2 modCsn in range(1,4):
print('{"csn":"-", "eppn":"couteau", "firstname":"%s", "lastname":"Couteau !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
elif csnAsInt%5==2suffix))
elif modCsn in range(4,11):
print('{"csn":"-", "eppn":"porte-cartes", "firstname":"%s", "lastname":" Porte cartes !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else ''suffix)))
elif csnAsInt%3==0modCsn in range(11,28):
print('{"csn":"-", "eppn":"porte-carte-simple"mystere", "firstname":"%s", "lastname":"PorteGoodies 20 carteans simple!", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else ''suffix)))
elif csnAsInt%3==1modCsn in range(28,51):
print('{"csn":"-", "eppn":"mystereporte-carte-simple", "firstname":"%s", "lastname":"GoodiesPorte 20carte ans !simple", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
else:suffix))
else:
# impossible - ne devrait pas arriver ;-)
print('{"csn":"-", "eppn":"perdu", "firstname":"%s", "lastname":":''-( ??? ", "locations":"esup-goodies"}' % ('Perdu' + ('[RE]' if alreadyChecked else ''suffix)))
if not alreadyChecked:
file = open('/var/www/log/goodies.txt',"a")
file.write(csn + "\n")
file.close()
else:
print '[]'
|
On déclare ces 2 implémentations de WS dans la configuration d'esup-nfc-tag-server ( src/main/resources/META-INF/spring/applicationContext-custom.xml ) :
...
Les utilisateurs 'login@univ-ville1.fr', 'autrelogin@univ-ville1.fr', 'login@univ-ville2.fr' peuvent ainsi badger des cartes et voir apparaitre sur leur téléphone et simultanément sur un ou des écrans si le badgeage est gagnant et pour quel lot gagné.
Statistiques - vérification des % de gain en fonction d'un échantillon de CSN
...
L'université de rouen ne dispose par exemple que de cartes avec des CSN pairs (peutPeut-être lié à la technologie Mifare Desfire ?).
...
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
#!/usr/bin/python # -*- coding: utf-8 -*- nbParapluie = 0 nbCouteau = 0 nbGoodiesMyst = 0 nbPorteCartes = 0 nbPorteCarte = 0 nbPerdu = 0 total = 0 file = open('/tmp/csn.txt',"r") for csn in file: csnAsInt = int(csn, 16), 16) modCsn = csnAsInt%51 if csnAsInt%59==16 modCsn in range(0,1): nbParapluie+=1 elif csnAsInt%31==2 modCsn in range(1,4): nbCouteau+=1 elif csnAsInt%5==2 modCsn in range(4,11): nbPorteCartes+=1 elif csnAsInt%3==0 modCsn in range(11,28): nbPorteCartenbGoodiesMyst+=1 elif csnAsInt%3==1modCsn in range(28,51): nbGoodiesMystnbPorteCarte+=1 else: nbPerdu+=1 total+=1 file.close() print "Total : " + str(total) + "\n" print "parapluies : " + str(round(nbParapluie*100.0/total,2)) + "%\n" print "couteaux : " + str(round(nbCouteau*100.0/total,2)) + "%\n" print "porte-cartes : " + str(round(nbPorteCartes*100.0/total,2)) + "%\n" print "porte-cartegoodies 20ans : " + str(round(nbPorteCartenbGoodiesMyst*100.0/total,2)) + "%\n" print "goodiesporte-carte 20ans : " + str(round(nbGoodiesMystnbPorteCarte*100.0/total,2)) + "%\n" print "perdu (censé être à 0) : " + str(round(nbPerdu*100.0/total,2)) + "%\n" |
Sur l'échantillon rouennais (récupérés en base de esup-sgc à univ-rouen), on a le résultat suivant :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
Total : 147153 parapluies : 1.75%97% couteaux : 35.18%87% porte-cartes : 18.98%13.82% goodies 20ans : 33.51% porte-carte : 2544.27% goodies 20ans : 25.44% perdu84% perdu (censé être à 0) : 250.38%0% |