Mostrando entradas con la etiqueta reenginyeria. Mostrar todas las entradas
Mostrando entradas con la etiqueta reenginyeria. Mostrar todas las entradas

sábado, abril 21, 2007

Moodle Developer Conference April 2007

Aquest divendres vaig arribar a les 9h al despatx amb el Pablo decidits a especificar i dissenyar part de la API de la NWiki. La idea es crear una API que ens serveixi tant per l'entorn Moodle com per l'entorn OKI.

Quan ja portavem un parell d'hores currrant i ja teniem com una dotzena de classes i una vintena de metodes especificats per a dos casos d'ús de la wiki, em sona el telèfon. Miro la pantalla: Ludo. Que deu passar? "Bon dia, xiquet. Que passa?". Marc: "Panic!" Com que panic, i ara que passa? Kernel panic no podia ser, el meu linux seguia funcionant correctement, així que alguna cosa passava per la comunitat Moodle. Segurament, algún moodler havia trobat un megabug a la NWiki.

Posno, la wiki seguia funcionant bé. Com que ultimament, anem tots molt atabalats, no ens haviem assavantat que a les 11hores GMT es celebrava una Online Moodle Developer Conference. El Marc, em va passar aquest link, la llista a temes a tractar durant la conferència.

Sorprenentment, o no, el futur de la NWiki en Moodle1.9 no era un dels temes a tractar. En canvi, la OU Wiki, una wiki que estant fent la gent de la Open University, sí. Ni corto ni perezoso, el Marc va editar la wiki on hi havia l'ordre del dia i va afegir "nwiki ?" a la llista de temes. A més a més, "nwiki" era un link a una pàgina que no existia, pel que surtia de color vermell. Vaya tela! Ens buscarem la ruina, jejeje. Bueno, aqui, qui no plora, no mama.

Així doncs, ens vam possar mans a la feina, algún representant del nostre projecte tenia que assitir a aquella reunió per donar el nostre punt de vista i que el Martin ens digués publicament quin era el futur de la NWiki. Vam comentar quins eren el punts que voliem tocar i qunes respostes voliem aconseguir i ens vam començar a buscar la vida per poder conectar-nos a la conferència.

Elluminate era el software que es faria servir per realitzar la conferència. Una aplicació molt ben parida per fer reunions online. Chat, videoconferencia, pissarra compartida, possibilitat de compartir aplicacions... i una de les coses que em va agradar més: si volies dir alguna cosa pel micro, només tenies que apretar el botó "raise your hand" per ficar-te a la cua dels que havien demanat el torn de paraula. Tot molt ben pensat.

Durant la reunió es van tocar molts punts a més dels que estaven a la llista. El Pablo, fins hi tot va aconseguir parlar de OKI i de Concerto. Em va sorprendre és que el Martin sabés molt bé de que anabem els dos temes.

Quan vam aconseguir parlar sobre la NWiki, ja portavem una 1h de conferència. El Martin i el Marc van estar una estona parlant sobre el codi, temes d'accessibilitat sobretot, i de tots els requisits que ens haviem estat demanat durant l'últim any que ja haviem complert. Jo encara no ho entenc, pero igual que el Petr Skoda, es va queixar dels blocks... en la meva opinió, una de les millors eines complementaries que te el nostres software. Finalment, ens van dir que quan complissim XHTML strict ja en tornariem a parlar, pero que no ens prometien res. Si ara matiex ficaven la NWiki a dins del core de Moodle i després no compliem les expectatives, una doble migració (referint-se a OU Wiki), no seria ben vista pels usuaris. Suposo que qui paga mana...

Conclusions d'un dia complet:
  • La NWiki seguiex on està, amb moltes descarregues al dia, amb molt usuaris descontents de ewiki que fan la migració cap a la nostra wiki, peró sense ser oficial i sense saber si ho serà mai.
  • M'he enterat de coses que a les que no hagués prestat atenció com els events i he ampliat coneixements sobre els moodleforms.
  • Triunfador clarisim: el senyor Pablo, que en un principi no volia saber-ne res de la conferència i quan va marxar tothom volia el seu mail. Una molt bona entrada a la comunitat.

lunes, marzo 26, 2007

Reenginyeria del WikiStorage

En l'estat actual de la NWiki tenim una macro variable que conté tota la informació per el correcte funcionament de la wiki. Això no pot ser. Cal aplicar una mica de reenginyeria.

Una mica d'historia...

Els primers dies de la DFWiki, a Moodle es permetia l'ús de variables globals. Per gestionar de forma ràpida i senzilla tota la informació provinent dels formularis, s'usava una variable global anomenada $dfform. Aquesta variable era un array amb una infinitat de posicions, tantes com elements en tots els formularis de la wiki.

Per exemple, en l'utilitat de import XML hi ha aquest formulari:

El codi que genera el botó "Yes" és el seguent:
<input type="submit" name="dfform[sure]" value="<?php print_string('yes');?>" />
Per recullir aquesta informació, només començar l'execució del codi de la wiki, el que es feia era declarar la variable global y recullir els seus possibles valors amb una crida a optional_param().

global $dfform;
$dfform=optional_param('dfform');

Per saber si l'usuari havia premut aquest botó, només calia mirar si $dfform["sure"] tenia valor en el moment adequat i com que era una variable global no hi havia cap problema.


A principis d'Octubre de 2007, se'ns va avisar desde Moodle que l'ús d'aquest tipus de variables esta prohibit. Per aquest motiu, dos projectistes van estar pensant com eliminar-les de la forma menys danyina per l'evolució del codi i dels PFCs. Va apareixer la classe WikiStorage.

D'aquesta manera, vam passar a tindre una macro variable que contenia tota la informació i que s'anava passant per referència amunt i avall.

Bàsicament, el procediment va ser:
  1. Crear l'arxiu wikistorage.class.php per definir els atributs i unes quantes funcions.
  2. Substituir tots els "global ......" per "global $WS".
  3. Concatenar a totes les variables globals $WS-> per davant.
  4. Eliminar els "global $WS" i afegir-lo com a parametre a les funcions.

Un cop acabada aquesta tasca, en Petr Skoda ens va dir que no estavam utilitzant correctament la funció optional_param() i que per aquest motiu tenim molt bugs de seguretat.

Va resultar ser que la funció tenia 3 parametres i que moltes vegades, només en feiem fer servir 1.
function optional_param($parname, $default=NULL, $type=PARAM_CLEAN) ;

on $parname és el nom de la variable que es vol agafar, $default és el valor que ha de pendre la variable si no es troba valor ni per GET ni POST i $type és el tipus de parametre que s'ha d'anar a buscar.

PARAM_CLEAN és l'opció més restrictiva de les que es pot escullir per fer la crida i per tant la més ineficient (com a curiositat, PARAM_CLEAN = 0x666;). En Petr ens va dir que escullissim l'opció correcte en cada cas. Si el parametre era un numero, PARAM_INT; si era un string, PARAM_ALPHA; etc. Així, es podria fer un tractament més correcte del contingut de la variable.

En cap de les crides a aquesta funció de la wiki s'especificava el tercer parametre. Per tant un grup de projectistes van estar adaptant el codi a aquesta nova norma.

Ja que $dfform és un array de tipus heterogenis, no es podia fer una crida directa a optional_param() , ja que no existeix "type" amb aquest objectiu. Per aquest motiu, es va decidir agafar els parametres un per un. Primer de tot, es van renombrar tots els elements de formularis del tipus dfform[xxx] per dfformxxx. Després es va fer crear la funció wiki_dfform_param() on es recullien una per una les variables dels formularis.

En l'exemple de la finestra d'import XML, el botó va passar a
<input type="submit" name="dfformsure" value="<?php print_string('yes');?>" />
i el seu valor es recollia de la següent manera:
$WS->dfform['sure'] = optional_param('dfformsure',NULL,PARAM_INT);

Estat actual

Si ja no tenim variables globals i no podem agafar tots els parametres dels formularis de cop, perque seguim mantenin la mateixa filosofia que fa un any?

Tranquilament, podem eliminar l'atribut dfform i molts altres de la classe WikiStorage i agafar el seu valor només quan ens faci falta. A més a més, cal que tinguin aquest comportament de variable global? Si sabem quan ens fan falta aquests valors (normalment, dins del context d'una funció), perque no poden ser variables locals?