π
<-

Script qui refuse de s’exécuter sur la Numworks N0100

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby critor » 07 Sep 2019, 18:11

cent20 wrote:
critor wrote:Il faut réduire le nombre de lignes, utiliser des noms de fonctions/variables courts, éviter les commentaires, factoriser le code... et encore ça ne suffit pas toujours.


On a déjà épuisé le stock de possibilité ... Raccourcir tous les noms fut la première chose qu'on a fait, c'était tellement trivial que je ne l'ai pas précisé.


Il y a d'autres possibilités que le renommage pour raccourcir du code Python, notamment concernant la belle collection d'instructions conditionnelles ou de chaînes qui diffèrent à de petits détails près. Par contre elles nuisent plus ou moins à la lisibilité du code et donc à sa compréhension et maintenance.

Voici une version du même code très sauvagement compressée (toutes mes excuses) à seulement 2,5Kio :
Code: Select all
from math import sqrt
a,b,c=0,0,0
def dct():
    global a,b,c,d,e,nb,x,y,x1,x2
    while a==0:a=o(float(input('a=')))
    b,c=o(float(input('b='))),o(float(input('c='))),
    d,e,x,y=o(float(b**2-4*a*c)),o(float(a*(-b/2/a)**2-b*b/2/a+c)),o(-b/2/a),o((sqrt(abs(b**2-4*a*c)))/2/a)
    nb,x1,x2=2-(d==0),o(min(x+y,x-y)),o(max(x-y,x+y))
def h():
    o(9,br=1)
    print("Polynome (equation) de degre 2",a==0 and "\nP(x)=ax^2+bx+c(=0)" or "\nP(x)={}{}{}(=0)".format(o(a,ap="x^2",r=4),o(b,p=1,ap="x",r=4,naf=1),o(c,p=1,r=4,naf=1)))
def p():
    s=d<0 and "<0" or d>0 and ">0" or ""
    print("1)Changer les valeurs a,b,c","\n2)Discriminant={}{}".format(d,s))
    if d<0:print("3)Racines complexes conjuguees:2","\nz1={}+{}i".format(x, y),"\nz2={}-{}i".format(x, y))
    elif d>0:print("3)Racines reelles distinctes:2","\nx1={}".format(x1),"\nx2={}".format(x2))
    elif d==0:print("3)Racine reelle double:1","\nx1=x2={}".format(x))
    s=a<0 and "-" or "+"
    print("4)Signe:"+(d<0 and s or d>0 and s+"-+"[a<0]+s or s+"0"+s),"\n, extremum:"+"mM"[a<0],"\n5)Factorisation dans les "+(d<0 and "complexes" or "reels"),"\n6)Quitter")
def r(i):
    global a,b,c,d,x,y
    if i==1:
        a,b,c=0,0,0
        h()
        dct()
    elif i==2 or i==3 or i==6:pass
    elif i==4:
        h()
        s=a<0 and "-" or "+"
        print(d>0 and "  x |    x1  -b/(2a)  x2",a>0 and "\nP(x)|  "+s+"  0  -  m  -  0  "+s or "\nP(x)|  "+s+"  0  "+"+-"[a<0]+"  M  "+"+-"[a<0]+"  0  "+s or "  x |        -b/(2a)\nP(x)|     "+s+"     m     "+s,"\nExtremum:","\n(",o(-b/2/a,r=4),";",o(e,r=4),")")
    elif i==5:
        if d==0:print("P(x)=a(x-(-b/2a))^2",x1 and o(-x1,"\nP(x)={}(x".format(a),")^2",p=1) or "\nP(x)={}x^2".format(a))
        elif d>0:print("P(x)=a(x-x1)(x-x2)",o(-x2,o(-x1,"\nP(x)={}(x".format(a),")(x",p=1,naf=2,r=4),")",p=1,naf=2,r=4))
        else:print("P(z)=a(z-z1)(z-z2)\nAvec:",o(-x,"\n(z-z1) = (z",o(y,ap="i",r=4,naf=1)+")",r=4,naf=2),o(-x,"\n(z-z2) = (z",o(-y,ap="i",r=4,naf=1)+")",r=4,naf=2))
    if (i-6)*(i-1):input()
def o(v,av="",ap="",p=0,r=8,naf=0,br=0):
    if br==0:
        if v==0:return naf==1 and "" or naf==2 and str(av)+str(ap) or str(av)
        v=v==int(v) and int(v) or round(v,r)
        if av=="" and ap=="" and p==0:return v
        if p==1 and v>0:v="+"+str(v)
    return str(av)+str(v)+str(ap)
def m(w=""):
    h()
    p()
    if w!="":print(w)
    s=0
    while s==0:
        try:s=int(input())
        except:
            s=0
            m(">>saisir un entier entre 1 et 6!")
    r(s)
    if s!=6:m()
o(9,br=1)
r(1)
m()


Et elle marche :
Image

Je dirais à la louche qu'il reste en prime un bon 1Kio de marge sur NumWorks pour compléter/embellir ce code sans erreur de mémoire à l'exécution, donc une belle marge pour obtenir un code fonctionnel qui fasse moins peur aux élèves. :)
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 48.1%
 
Posts: 41993
Images: 15900
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 07 Sep 2019, 21:17

Le manque de RAM disponible sur les machines NumWorks tournant l'epsilon habituel est dû à deux énormes éléments dans la section .bss:
*
Code: Select all
Poincare::Init::pool
, ici 0xD558 octets;
*
Code: Select all
AppsContainer::sharedAppsContainer()::appsContainerStorage
, ici 0x183C0 octets.
Rien de nouveau, au moins cette deuxième variable a déjà été pointée, avec plus de détails, par Jean-Baptiste Boric dans un des autres topics.

C'est dans cette deuxième qu'est stocké le tas Python passé à MicroPython::init(): Code::App:m_pythonHeap (dans apps/code/app.h).
Comme Jean-Baptiste l'avait écrit, l'application la plus gourmande en stockage n'est pas Code. Avec epsilon Git HEAD, on peut augmenter Code::App::k_pythonHeapSize de 16384 à 32768 sans changer la taille prise en RAM par appsContainerStorage. On ne peut pas aller significativement plus loin: k_pythonHeapSize = 40960 (+0x2000) fait passer la taille d'appsContainerStorage à 0x19db0, ce qui représente donc une augmentation assez proche de 0x2000.

Peut-être que ça permettra de tourner des programmes un peu plus complexes, mais ça ne changera rien au fait qu'il n'y ait pas plus de 16 KB de stockage pour les scripts. Ca doit être Ion::staticStorageArea (0x400C octets). Les machines n'ont pas assez de RAM pour utiliser ce style de programmation, on le sait, et je pense que c'est une grosse erreur de ne pas avoir remédié à ce point en concevant la N0110...

Comment est-ce qu'on fait un build pour N0100, déjà ? EDIT: `make MODEL=n0100`, on dirait. EDIT2: ou peut-être mieux, `make build/device/n0100/epsilon.bin` ?
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby parisse » 08 Sep 2019, 07:09

D'ailleurs, quelqu'un sait a quoi sert cette variable pool? Peut-on reduire sa taille de moitie par exemple?
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 86.1%
 
Posts: 3664
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 07:30

critor wrote:Il y a d'autres possibilités que le renommage pour raccourcir du code Python, notamment concernant la belle collection d'instructions conditionnelles ou de chaînes qui diffèrent à de petits détails près. Par contre elles nuisent plus ou moins à la lisibilité du code et donc à sa compréhension et maintenance.

Voici une version du même code très sauvagement compressée (toutes mes excuses) à seulement 2,5Kio :

(...)

Je dirais à la louche qu'il reste en prime un bon 1Kio de marge sur NumWorks pour compléter/embellir ce code sans erreur de mémoire à l'exécution, donc une belle marge pour obtenir un code fonctionnel qui fasse moins peur aux élèves. :)


C'est quand même assez impressionnant de diviser la taille d'un script ainsi en seulement 1h20 :~o .
Si je ne connaissais pas le script d'origine j'aurais quand même bien du mal à le lire celui là !

Merci beaucoup en tout cas , je vais étudier les différentes astuces utilisées et retenir la limite de 4ko pour les scripts suivants.

Code: Select all
print("...",a==0 and "..." or "..")


est très intéressant, tout comme :

Code: Select all
s=d<0 and "<0" or d>0 and ">0" or ""


C'est vraiment ultra flexible python, ces tests au sein d'une égalité ou d'un print n'étaient pas évident à comprendre et encore moins à deviner.

Bon du coup comme tu as aussi coupé il a quelques éléments du menu qui sont désactivés, c'est le prix à payer pour l'exécuter j'ai l'impression.

A voir si avec 1ko de marge on réussit à les réintégrer.

Pour ceux qui veulent le tester sur l'émulateur numworks : polynome_degre2_zip.py
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
User avatar
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 48.5%
 
Posts: 1050
Images: 67
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: nsi_xyz

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 08 Sep 2019, 07:47

@parisse: le pool est fait pour stocker les TreeNode utilisés un peu partout comme opérande et résultat d'opération d'epsilon.

En pièce jointe à ce post, un build d'epsilon pour N0100 avec k_pythonHeapSize = 32768, ainsi que -Wl,--gc-sections dans les flags de build ( https://github.com/numworks/epsilon/pull/1062 ). Il a été obtenu par `make build/device/n0100/epsilon.bin`, et critor l'a testé tôt ce matin: il a pu flasher la calculatrice avec succès - j'ignore quel outil il a utilisé, peut-être un WebDFU ? - et son script habituel d'obtention de la taille de la mémoire rend 32204 plutôt qu'une valeur inférieure à 16 KB.
@cent20: peut-être que ce changement ça permettra de tourner des scripts un peu moins pas complexes sans avoir à rendre le code source moche ?

Si ça augmente la complexité des scripts qu'on peut traiter sous Epsilon, je fais une pull request pour ce one-liner, en linkant ce topic.
You do not have the required permissions to view the files attached to this post.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 07:57

Lionel, tu comptes en hexadécimal ? :#roll#:

Lionel Debroux wrote:Le manque de RAM disponible sur les machines NumWorks tournant l'epsilon habituel est dû à deux énormes éléments dans la section .bss:
*
Code: Select all
Poincare::Init::pool
, ici 0xD558 octets;


54616 octets donc 54 ko de réservé. OK

Lionel Debroux wrote:*
Code: Select all
AppsContainer::sharedAppsContainer()::appsContainerStorage
, ici 0x183C0 octets.


99264 octets donc 99 ko de réservé. OK

Lionel Debroux wrote:Rien de nouveau, au moins cette deuxième variable a déjà été pointée, avec plus de détails, par Jean-Baptiste Boric dans un des autres topics.


C'est bien de lui dont je parlais quand je disais que peu réussissais à compiler la ROM de la calculatrice.

Lionel Debroux wrote: Comme Jean-Baptiste l'avait écrit, l'application la plus gourmande en stockage n'est pas Code. Avec epsilon Git HEAD, on peut augmenter Code::App::k_pythonHeapSize de 16384 à 32768 sans changer la taille prise en RAM par appsContainerStorage.


C'est exactement ce que je voulais faire en compilant la ROM sauf que je n'ai jamais réussi à arriver au terme... :?

Lionel Debroux wrote:
On ne peut pas aller significativement plus loin: k_pythonHeapSize = 40960 (+0x2000) fait passer la taille d'appsContainerStorage à 0x19db0, ce qui représente donc une augmentation assez proche de 0x2000.


Ce qui m'inquiète dans cette histoire, c'est que je ne suis pas sur qu'en passant de 16ko à 32ko de mémoire pour pythonHeapSize l'on puisse exécuter des script de 8ko (c'est à dire 2x plus gros que les 4ko recommandé par critor)

Le script test_memory_size.py que j'ai trouvé sur ce forum montre (si j'ai bien compris) que la mémoire est fragmenté et que le plus gros bloc fait 4ko. Or si le script est chargé entièrement en mémoire cette taille du premier bloc est vraiment bloquante.

D'ailleurs en créant des scripts bidons effacés depuis, en dépassant 5 ko environ ils plantaient dès le lancement. Si la taille maximale d'un script est de 4ko cela doit être marqué en clair dans la documentation !

Lionel Debroux wrote:
Peut-être que ça permettra de tourner des programmes un peu plus complexes, mais ça ne changera rien au fait qu'il n'y ait pas plus de 16 KB de stockage pour les scripts. Ca doit être Ion::staticStorageArea (0x400C octets). Les machines n'ont pas assez de RAM pour utiliser ce style de programmation, on le sait, et je pense que c'est une grosse erreur de ne pas avoir remédié à ce point en concevant la N0110...


Ma question sera naïve, mais est-on obligé d'éxécuter le script depuis la RAM ?

Le modèle N0110 ayant 8 mo de mémoire, ne serait'il pas souhaitable (possible, envisageable) de permettre à l'utilisateur de choisir ou exécuter le script ?

Encore mieux, si le script dépasse 4ko il pourrait être exécuté dans / depuis la mémoire ROM de manière automatique.

Et s'il ne peuvent pas (ou ne veulent pas pour ne pas dégrader les performance) ne suffirait-il pas qu'ils décident de vider un peu la RAM lorsque l'on rentre dans le menu python ?

Lionel Debroux wrote:
Comment est-ce qu'on fait un build pour N0100, déjà ? EDIT: `make MODEL=n0100`, on dirait. EDIT2: ou peut-être mieux, `make build/device/n0100/epsilon.bin` ?


Excellente question ! j'ai déjà vu passer make MODEL=n0100 mais jamais dans la documentation officielle qui mériterait un bon refresh.
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
User avatar
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 48.5%
 
Posts: 1050
Images: 67
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: nsi_xyz

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 08 Sep 2019, 08:12

Lionel, tu comptes en hexadécimal ? :#roll#:

En général, non, c'est juste que je ne me suis pas amusé à convertir en décimal la sortie d'arm-none-eabi-objdump ^^

C'est exactement ce que je voulais faire en compilant la ROM sauf que je n'ai jamais réussi à arriver au terme... :?

C'était plus simple quand Epsilon ne gérait que la N0100; maintenant, c'est la N0110 qui est ciblée par défaut.

Le modèle N0110 ayant 8 mo de mémoire, ne serait'il pas souhaitable (possible, envisageable) de permettre à l'utilisateur de choisir ou exécuter le script ?

Encore mieux, si le script dépasse 4ko il pourrait être exécuté dans / depuis la mémoire ROM de manière automatique.

Je suis à peu près sûr que MicroPython a besoin de RAM pour stocker des infos sur le script et permettre une exécution moins lente.

Si la taille maximale d'un script est de 4ko cela doit être marqué en clair dans la documentation !

En effet...

j'ai déjà vu passer make MODEL=n0100 mais jamais dans la documentation officielle qui mériterait un bon refresh.

Comme je l'ai appris hier soir, make MODEL=n0100 ne suffit pas pour obtenir un binaire directement flashable, il faut suivre par quelque chose comme `make build/device/n0100/epsilon.bin`, que j'ai dû fouiller dans les Makefile pour trouver.

A la suite du post auquel tu as répondu, j'ai fait un autre post qui contient le binaire produit par le build, qui peut t'intéresser. Tu l'as peut-être déjà vu le temps que je réponde à ton post. Je ne peux pas tester moi-même, j'ai fait tout mes développements sur epsilon sans avoir de N0100/N0110.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6865
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 08:16

Un testeur de la CASIO Graph 35+E II sur le forum https://www.planet-casio.com (consulter le topic) précisait il y a quelques mois :

Cela n'est pas surprenant, car l'ancien tas faisait 48 ko et c'est assez peu pour un interpréteur Python. Casio a certainement commencé à exploiter la deuxième moitié de RAM à sa disposition pour satisfaire les besoins de Python. Les scripts de Critor révèlent que le nouveau tas fait environ 90 ko, quasiment deux fois plus que l'ancien.


Le reste de la page est très intéressant.

Pourquoi CASIO passerait-il de 48 ko à 90ko de mémoire dédiée pour l'éxécution des script python si cela n'était pas nécessaire ?

Code: Select all
Calculatrice : Rom (disponible utilisateur) / Ram (disponible utilisateur) en ko
TI 83 Prenium CE edition Python : 4096 (  3072 ) / 256 (150)
Casio 35+E II                   : 8192 (  3072 ) / 512 (090)     
NumWorks                        : 1024 (  0016 ) / 256 (016)


Mais si tous les utilisateurs se contentent silencieusement de 16ko de mémoire et d'une taille maxi de 4ko pour un script, cela ne les incitera pas beaucoup à bouger.

J'ai l'impression que les 16ko ont été décidé d'après cette page :

Yet it is compact enough to fit and run within just 256k of code space and 16k of RAM


Pour faire tourner windows 10 32 bits, il suffit d'avoir un PC avec un processeur 1ghz, 1go de mémoire, 16 go de DD dur

Je suis curieux de voir qui arrive à utiliser windows 10 cette configuration... :troll:
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
User avatar
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 48.5%
 
Posts: 1050
Images: 67
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: nsi_xyz

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 08:19

Lionel Debroux wrote:En pièce jointe à ce post, un build d'epsilon pour N0100 avec k_pythonHeapSize = 32768, ainsi que -Wl,--gc-sections dans les flags de build ( https://github.com/numworks/epsilon/pull/1062 ). Il a été obtenu par `make build/device/n0100/epsilon.bin`, et critor l'a testé tôt ce matin: il a pu flasher la calculatrice avec succès - j'ignore quel outil il a utilisé, peut-être un WebDFU ? - et son script habituel d'obtention de la taille de la mémoire rend 32204 plutôt qu'une valeur inférieure à 16 KB.
@cent20: peut-être que ce changement ça permettra de tourner des scripts un peu moins pas complexes sans avoir à rendre le code source moche ?

Si ça augmente la complexité des scripts qu'on peut traiter sous Epsilon, je fais une pull request pour ce one-liner, en linkant ce topic.


Je vais essayer ceci dans la matinée.
Je crois que la page qui permet de flash est https://ti-planet.github.io/webdfu_numworks/.
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
User avatar
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 48.5%
 
Posts: 1050
Images: 67
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: nsi_xyz

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby parisse » 08 Sep 2019, 08:34

Lionel Debroux wrote:@parisse: le pool est fait pour stocker les TreeNode utilisés un peu partout comme opérande et résultat d'opération d'epsilon.

Ok, quelle consequence si on le divise par 2? Parce que ca permettrait de recuperer un peu de place pour le tas, ca ne serait pas du luxe pour KhiCAS.
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 86.1%
 
Posts: 3664
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

PreviousNext

Return to Programmation Python

Who is online

Users browsing this forum: ClaudeBot [spider] and 0 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1053 utilisateurs:
>997 invités
>49 membres
>7 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)