|
Tout scripteur a, aura, a eu besoin de lire une notecard servant de fichier de configuration pour un projet.
En lisant çà et là les scripts à ce sujet j'ai été surpris de la façon dont a été traité ce sujet ...et le mot est faible. Je propose donc un p'tit sujet dessus... Un fichier de configuration c'est quoi?: Généralement un fichier texte ou binaire contenant les données / paramètres nécessaire à un programme. Ils sont souvent en lecture/écriture afin de lire ou écrire (stocker) les informations. Pour SL ils sont de type Notecard ... et ne peuvent être malheureusement QUE être lus pour notre plus grand malheur! Existe il une norme, une règle ? Non, chacun à sa sauce...mais il est communément admis que: un signe # est un commentaire une ligne blanche est ignorée c'est peu certes mais ... mieux que rien Exemples: Code:
1 rouge 50 Citation :
Citation :
![]() Pour lire une notecard il existe principalement 4 instructions LSLet quelques dizaines et plus d'exemples plus ou moins bien faits et plus ou moins complexes 2 exemples peuvent être donnés ici: http://wiki.secondlife.com/wiki/LlGetNotecardLine Pour un débutant la lecture du second exemple sera ![]() ![]() ![]() le premier sera d'une lecture...plus simple et rapidement copié... ![]() Je fais une parenthèse sur Dataserver car elle rebute certains, contrarie les autres, et tourne en bourrique la plupart d'entre nous quand nous avons à l'utiliser en rafale avec plusieurs requêtes différentes... Cette requète à plusieurs warnings indiqués par SL Les réponses de type Dataserver ne reviennent pas nécessairement dans l'ordre des appeks.
![]() Temps de réponses qui "gèlent" le script pendant le requêtes au serveur et je passe sous silence le traitement des erreurs de toutes sortes...et non gérées dans 99,99% dans les scripts utilisant cette commandes. Si si vérifiez! Si je rajoute dans le cas qui nous préocupe (la lecture d'une notcard) les warnings donnés pour LlGetNotecardLine Cette fonction fait dormir le script pendant 0.1 secondes. Si nom n'est pas dans l'inventaire de la prim et n'est pas un UUID ou n'est pas un note alors une erreur se produit sur le canal DEBUG_CHANNEL. Si nom est une UUID il n'y a alors aucune conséquence sur les droits de l'objet.
Si la ligne demandée fait plus de 255 bytes, le serveur de données ne renverra que les 255 premiers bytes de la ligne. Si la note est vide, le serveur de données générera une erreur sur le DEBUG_CHANNEL selon laquelle la note n’existe pas car tant que note n’est pas sauvegardée, elle ne consiste qu’en un emplacement d’inventaire (llGetInventoryKey renverra NULL_KEY). vous comprenez mieux coder la lecture d'une une notecard n'est pas le simple dans LSL Pour ceux qui ont bien lu les restrictions...??? le delai de 0.1 semble peu important.. semble être oui mais dans la réalité que se passe t il? le temps TOTAL = 0.1 x le nombre de lignes!! Un fichier standard/ commun de 35 lignes prendra 3.5 secondes non pas de traitement mais d'attente! Vous comprenez mieux pourquoi ce sujet est souvent passé sous silence et que le copier /coller fonctionne à merveille? Courage! on va essayer de rendre les choses plus simples et si possible plus intéressantes et/ou instructives .. A suivre... |
![]() |
|
Aller à la page... |
Traitement d'un Fichier de configuration...
Suivre Répondre |
|
Partager | Rechercher |
|
Moi depuis novembre 2007 j'utilise cette base dénichée sur un site (sais plus où); il répond à tes critéres:
Code:
string notecard_name = "configuration"; // name of notecard goes here // internals integer DEBUG = FALSE; integer line; key queryhandle; // to separate Dataserver requests key notecarduuid; init() { queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line notecarduuid = llGetInventoryKey(notecard_name); } // Config data loaded from notecard, with some sane defaults integer channel = 1000; string email_address = "revolution.perenti@skidzpartz.com"; default { changed(integer change) { // We want to reload channel notecard if it changed if (change & CHANGED_INVENTORY) if(notecarduuid != llGetInventoryKey(notecard_name)) init(); } state_entry() { init(); } dataserver(key query_id, string data) { if (query_id == queryhandle) { if (data != EOF) { // not at the end of the notecard // yay! Parsing time // pesky whitespace data = llStringTrim(data, STRING_TRIM_HEAD); // is it a comment? if (llGetSubString (data, 0, 0) != "#") { integer s = llSubStringIndex(data, "="); if(~s)//does it have an "=" in it? { string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM)); data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM); //Insert your token parsers here. if (token == "email_address") email_address = data; else if (token == "channel") channel = (integer)data; } } queryhandle = llGetNotecardLine(notecard_name, ++line); if(DEBUG) llOwnerSay("Notecard Data: " + data); } else { if(DEBUG) llOwnerSay("Done Reading Notecard"); state configuration ; } } } } state configuration { state_entry() { llListen(channel, "", "", ""); llShout(0, "Channel set to " + (string)channel); llShout(0, "Email set to " + (string)email_address); } } Code:
#exemple de notecard 'configuration' #mettre votre email ici email_address=elenia.boucher |
![]() |
|
Elenia Boucher |
Voir le profil public |
Trouver plus de messages par Elenia Boucher |
|
dispo sur la bibliothèque de linden
http://wiki.secondlife.com/wiki/Dataserver_API |
![]() |
|
|
Citation :
|
![]() |
|
Elenia Boucher |
Voir le profil public |
Trouver plus de messages par Elenia Boucher |
Elenia Boucher |
Voir le profil public |
Trouver plus de messages par Elenia Boucher |
|
Le projet
Une photo vaut mieux qu'un grand discours
![]() Il y a 3 scripts...1 est l'applicatif lui même. Donc 2 scripts pour la gestion du fichier. Les 2 scripts peuvent être fusionner mais on perdrait en lecture, en répartition des fonctions et aussi compréhension ce qui n'est pas le but ici....et on doit aussi respecter les objectifs fixés. Analyse de l'applicatif(1/3): Script Set_Primitive_Params Code PHP:
[9:31] Object: 0 <0.5,0.75,0.5> 1 < 1.0,1.0,1.0 > 93d9d03a-ce57-3921-3e01-7de6ba14f1ec 1 [9:31] Object: Durée de lecture: 0.200309 s Le script est basique....mais 5 choses sont à noter quand même: 1. Le temps de réponse est très rapide 0.2 s au lieu des 3 secondes prévisible 2. L'ordre de lecture des paramètres se fait par Code PHP:
3. list_values est une liste contenant les paramètres dans l'ordre d'écritures de la carte. 4. Si on désire un autre paramètre par exemple PRIM_PHANTOM trois actions simples à faire : 1. porter à 7 le nombre de paramètres 2. enregistrer ce paramètre dans le fichier! ...et modifier l'applicatif en tant que tel pour gérer ce nouveau paramètre. 5. C'est ici que l'on pourra tester les valeurs des paramètres un vecteur reste un vecteur ... mais sa valeur va varier suivant son utilisation <0.5,0.5,0.5> pour une couleur et <125.235,125.36,1002.258> pour une position... Bref la lecture d'un fichier de configuration en est réduit ici côté applicatif à une demande de lecture. une réception de liste ... en 0.2 secondes |
![]() |
|
Analyse de l'applicatif(3/3):
Analyse de l'applicatif(3/3) ouf!:
La partie la plus intéressante mais hélas la plus complexe. Librement inspiré (et modifiée) du wiki pour l'intégrer dans le projet... Attachez - vous cette fois! Code PHP:
Comment fonctionne t il? Déjà tout seul! et sous l'aspect d'une plaisanterie cela n'en est pas une... En effet souvenez vous du temps de 0.2 s de lecture... rendez possible parce qu'il n'attend personne pour lire le fichier de configuration dès qu'il en a l'opportunité ( detecter un changement ) il va le lire et effectuer tous les tests "système" et charger toutes listes que nous avons vu précédemment. Code PHP:
Se rappeler TOUJOURS que les scripts sont des taches ... et que les serveurs SL sont multitasks. je poursuis... Une deuxième info est l'utilisation IMPERATIVE d'un timer ( watchdog) Code PHP:
Ordre de transmission venant de l'applicatif... Code PHP:
Le reste reste du classique mise à part la batterie de tests que j'ai mis en place, libre à chacun d'en rajouter... Mon but visait plus à présenter une architecture globale qu'à présenter du code pur du code. Pour ceux que veulent l'utiliser comme tel... juste remplacer mon applicatif par le votre et paramétrer le fichier de configuration. Ce projet est dispo sur Xstreet libre de droits pour 0$L. https://www.xstreetsl.com/modules.ph...ItemID=1714825 Je complèterai possiblement ce post mais pour l'instant j'ai faim! |
![]() |
|
#240361 |
Suivre Répondre |
Fil d'ariane
Connectés sur ce fil1 connecté (0 membre et 1 invité)
Afficher la liste détaillée des connectés
|