miércoles, 25 de julio de 2007

Presentació final

El dia 29 de juny vaig fer la defensa del projecte de final de carrera.
El tribunal va ser format per Marc Alier, Maria José Casany, Miquel Barceló i Montserrat Vela.
La defensa va ser satisfactòria i el projecte es va donar per finalitzat.

jueves, 21 de junio de 2007

14a Reunió PFC

Ha tingut lloc avui dijous dia 21 de juny. Hem parlat de la presentació que s'ha de dur a terme el divendres 29 de juny a les 9 del matí al despatx S205 de l'edifici Omega.

Per altra banda he registrat les còpies de la memòria a secretaria i les he entregat al tribunal.

13a Reunió PFC

Avui hem acordat acabar la memòria per la setmana que ve per tal de poder-la entregar.

jueves, 7 de junio de 2007

12a Reunió PFC

La 12a reunió es va dur a terme el 31 de maig. Es va acordar continuar fent la memòria i arreglar petits problemes de forumWiki i Backup/Restore.

viernes, 25 de mayo de 2007

11a Reunió PFC

Va tenir lloc ahir dia 24 de maig.
Hem donat per tancat l'API de connexió a bd's.
Hem enfocat de manera diferent el file protocol. S'utilitzarà l'API de la Núria per llegir el recorstore, es guardaran les dades i es restauran també utilitzant l'API de la Núria.
Després de parlar amb el becari esperem tenir llest per la setmana que ve que l'API de connexió a bd's pugui llegir els fòrums i wiki's de Moodle.

10a Reunió PFC

Va tenir lloc el 17 de maig.
Es va acordar que s'havia d'arreglar alguns petits problemes de l'API de connexió a bd's.
També s'ha de parlar amb el becari per fer funcionar el block to take away.
En quant al file protocol, s'ha de testejar per trobar el problema que fa petar la J2MESDLIB.
Per últim s'ha de treballar en la memòria.

jueves, 3 de mayo de 2007

9a Reunió PFC

Avui dia 3-5 hem decidit deixar en standby la connexió entre j2me i moodle i aprofundir en la tecnologia J2ME. Més concretament es vol implementar les funcionalitats de backup i restore d'arxius.
També s'ha d'acabar el servidor php provant amb les bases de dades que crea el block del Marc i després enviar-li al Marc (Alier) aquest script php + block per que ho pengi a morfeo.
També s'ha d'acabar l'api de connexió a bd's afegint la funcionalitat de crear una vista materilitzada de les taules amb una J2ME Table.
La propera reunió serà la setmana que ve

jueves, 19 de abril de 2007

8a Reunió PFC

La 8a reunió ha tingut lloc avui dia 19 d'abril.
Em comentat algunes coses més sobre el servidor php i hem decidit que de moment hauria de funcionar sense autenticació i sense timeout.
Paral·lelament s'haurà de fer una valoració de Moodle Mobile aprofundint en els punts forts i dèbils d'aquest software.
La propera reunió tindrà lloc d'aquí a dues setmanes.

7a Reunió PFC

La 7a reunió va tenir lloc el passat dimecres dia 11 d'abril.
Vam parlar de detalls tècnics del servidor php. A més vam parlar de l'informe preliminar que s'ha de presentar aquesta setmana.

lunes, 26 de marzo de 2007

6a Reunió PFC

En la reunió d'avui (26 de març) hem decidit que el següent pas al projecte serà poder visualitzar en un dispositiu mòbil algunes parts de moodle a les que un usuari estigui subscrit.
Aquestes parts seran:
- Fòrum (Visualitzar i afegir posts)
- Wiki (De moment només visualitzar (potser també afegir comentaris))
- Glossari (de moment encara no cal)
- Calendari (de moment encara no cal)

Per tal de fer això, en Marc crearà un Block de moodle (MOBILE FEED) que s'encarregarà d'autentificar als usuaris i de guardar a la base de dades les noves dades que hi ha hagut des de l'última connexió del dispositiu mòbil.

El dispositiu mòbil utilitzarà l'API de connexió a bases de dades ja creada en el pas anterior del projecte per obtenir les dades de la bd.

El primer pas serà canviar el servlet que fa de servidor proxy per connectar-se a la bd, per un webservice fet en php.

5a Reunió PFC

La cinquena reunió va ser el dijous 16 de març i només vam comentar aspectes tècnics de la construcció de l'API per connectar mòbils a Bases de dades.

domingo, 25 de marzo de 2007

Manual del programador de l'api MobileHTTPConnection

Què és MobileHTTPConnection

L'API MobileHTTPConnection és una interfície d'ús senzill per programadors de J2ME que vulguin connectar-se a una base de dades i executar sentències SQL sobre la mateixa.
Aquesta API gestiona la connexió de forma asíncrona, de manera que quan es faci una crida, no caldrà estar esperant a que aquesta rebi la resposta del servidor, sinó que quan el programador ho desitgi demanarà el resultat obtingut o si està connectat o desconnectat a la base de dades, i si el resultat encara no està disponible, podrà tornar més tard a recuperar-lo.

Com utilitzar l'API

L'API consta del mètode constructor i de 7 funcions bàsiques:

- A la constructora se li passen els paràmetres que es necessiten per connectar-se a la base de dades: ip a on està el servidor proxy, nom de la base de dades, usuari i password per accedir a la base de dades.
- DBConnectionRequest (): Envia al servidor la petició d'obrir la base de dades. Aquest mètode llença una excepció si la base de dades especificada ja ha estat oberta o si la connexió s'ha perdut.
- DBOpened (): Mira si la base de dades està oberta o no. Aquest mètode llença una excepció si el mètode DBConnectionRequest no ha estat cridat prèviament, si el servidor ha trobat problemes mentre s'obria la base de dades o si la connexió s'ha perdut.
- DBStatement (sentència SQL): Envia la sentència SQL desitjada al servidor. Aquesta funció retorna un número o tiquet que és que s'ha de presentar quan es vol obtenir el resultat. Aquest mètode llença una excepció si la base de dades no ha estat oberta prèviament o si la connexió s'ha perdut.
- DBResultRequest (tiquet): Retorna el resultat associat al tiquet en forma de MobileHTTPStatementResult. Aquest mètode llença una excepció si la base de dades no ha estat oberta prèviament o si la connexió s'ha perdut.
- DBClose (): Envia al servidor la petició de tancar la base de dades. Aquest mètode llença una excepció si la base de dades no ha estat oberta prèviament o si la connexió s'ha perdut.
- DBClosed (): Mira si la base de dades està tancada o no. Aquest mètode llença una excepció si el mètode DBClose no ha estat cridat prèviament, si el servidor ha trobat problemes mentre es tancava la base de dades o si la connexió s'ha perdut.
- DBReinit (): En cas que hi hagi hagut una pèrdua de la connexió, s'haurà de cridar aquest mètode per reinicialitzar l'API i tornar a començar des del principi.

La classe MobileHTTPException representa les excepcions comentades anteriorment.
Aquesta classe té 2 mètodes:
- getCode(): que retorna el codi associat a l'excepció.
- getMessage(): que retorna el missatge associat a l'excepció.
L'excepció associada a la pèrdua de connexió té codi -1, per tant, quant es faci un catch d'una excepció s'ha de verificar si el codi de la mateixa és -1. En cas que ho sigui, s'ha de cridar el mètode DBReinit() i fer el necessari a la midlet per tornar a cridar el mètode DBConnectionRequest.

MobileHTTPStatementResult és una representació del resultat obtingut d'una sentència SQL, que aconseguim quan cridem a DBResultRequest(tiquet). A més aquesta classe crearà una J2METable anomenada SDLIB_temp_table que serà una vista materialitzada del resultat.
Quan tenim la instància de MobileHTTPResultRequest el primer que hem de fer és preguntar per l'estat del resultat (getStatus()), per saber si està en espera (MobileHTTPResultRequest.WAITING), si el resultat està disponible i és correcte (MobileHTTPResultRequest.OK) o bé si el resultat està disponible, però ha estat un error (MobileHTTPResultRequest.KO).
A partir d'aquí MobileHTTPResultRequest té diversos mètodes que donen tota la informació necessària sobre el resultat.
Quan un resultat ja no estigui en espera hi ha diverses opcions:

- Si l'estat és MobileHTTPResultRequest.KO, llavors el resultat és un error. En aquest cas obtindrem el missatge d'error cridant a getErrorMessage().

- Si l'estat és MobileHTTPResultRequest.OK, el resultat pot venir d'una consulta (que ho sabrem cridant a isSelect()) o bé d'una actualització (que ho sabrem cridant a isWrite()).

- Si és una consulta, podrem obtenir les dades utilitzant els següents mètodes:
-getStringResult(): que retornarà una matriu d'Strings, amb el resultat de la consulta.
- getCols(): que retornarà el número de columnes.
- getRows(): que retornarà el número de files.
- getColumnLength(): que retornarà en un vector d'enters les longituds màximes de les columnes.
- getColumnTypes(): que retornarà en un vector d'Strings els tipus de les columnes.
- getColumnNames(): que retornarà en un vector d'Strings els noms de les columnes.

- Si és una actualització, podrem obtenir les dades utilitzant els següents mètodes:
- getRows(): que retornarà el número de files afectades.


En tot tipus de resultats, sempre podrem veure la sentència SQL a la qual estan associats mitjançant el mètode getStatement().

jueves, 8 de marzo de 2007

4a Reunió PFC

La 4a reunió ha estat el dia 8 de març i hem acordat:
-Acabar l'API amb les algunes petites modificacions (el midlet no ha de implementar cap patró listener, ha de ser l'api la que ho faci)
-Fer una documentació de l'api a nivell de manual de programador.
-Crear javadoc en anglès
-Fer que el servlet que reb les peticions es pugui configurar (mitjançant un arxiu xml)

La propera reunió serà la setmana del 12 de març.

3a Reunió PFC

La tercera reunió va ser el dijous 22 de febrer i només vam comentar aspectes tècnics de la construcció de l'API per connectar mòbils a Bases de dades

miércoles, 7 de febrero de 2007

2a Reunió PFC

En aquesta 2a reunió hem acordat les següents coses:
-Racionalitzar les aplicacions de client i servidor en la connexió d'un dispositiu mòbil contra una base de dades. Més concretament la creació d'una interfície d'ús molt senzill per enviar sentències SQL del dispositiu mòbil a la base de dades.
-La comunicació entre dispositiu mòbil i servidor serà per http.
-La tecnologia utilitzada de la banda del client serà J2ME.
-El client haurà d'enviar querys i peticions de resposta (el servidor no enviarà la resposta fins que el dispositiu ho demani).
-La tecnologia utilitzada de la banda del servidor serà J2EE i PHP.
-El servidor es connectarà a una base de dades mitjançant JDBC.
-El servidor haurà de tenir aplicacions de control i configuració.
-Aquesta feina durarà unes 4 setmanes.
-La propera reunió serà el dia 21 a les 8 del matí

lunes, 5 de febrero de 2007

Manual del programador de J2ME amb J2MESDLIB utilitzant Netbeans

Requisits:

-Netbeans 5.5 amb Java: Aquest IDE per java es pot aconseguir a: http://www.netbeans.info/downloads/index.php

-Netbeans Mobility Pack 5.5: Això és un Add-on de Netbeans i es pot aconseguir a:
http://www.netbeans.info/downloads/index.php?rs=11&p=4

-LSDATALIB: És la llibreria de tractament de fitxers desenvolupada per dfwikiteam. Aquesta llibreria es pot aconseguir a:
http://morfeo.upc.es/crom/mod/wiki/view.php?id=16&page=view/J2MEMicroDBTests&gid=0&uid=0

-J2MESDLIB: És la llibreria que permet treballar amb taules relacionals en dispositius mòbils desenvolupada per dfwikiteam. Aquesta llibreria es pot aconseguir a:
http://morfeo.upc.es/crom/mod/wiki/view.php?id=16&page=view/Introducci%F3+a+J2MEMicroDB&gid=0&uid=0
a l'apartat de "Com descarregar J2MESDLIB?"

Com preparar l'entorn de treball

En primer lloc s'ha d'instal·lar el Netbeans. Per fer això només cal executar l'arxiu d'instal·lació de Netbeans i seguir els passos que indica la pantalla.
En segon lloc s'ha d'instal·lar el Netbeans Mobility pack. De la mateixa manera que Neatbeans, només cal executar el programa d'instal·lació i seguir les instruccions de la pantalla. Cal recordar que no es pot instal·lar el Mobility Pack sense haver instal·lat prèviament Netbeans.

Per poder utilitzar les llibreries LSDATALIB i J2MESDLIB, s'ha crear un nou projecte i afegir les llibreries manualment.
Per crear un nou projecte a Netbeans cal anar al menú "File" i prémer "New Project".
















Després d'això s'ha de triar el tipus d'aplicació que es vol programar. Triarem com a "categories" Mobile i com a "projects" Mobile Application. Un cop triat, només cal seguir els passos que la pantalla indica: donar un nom al projecte i dir on s'ha de guardar (opcionalment el projecte pot venir amb l'aplicació "hello MIDlet", per tal de tenir una petita guia de com utilitzar MIDlets) i triar la plataforma de l'emulador així com les configuracions pertinents, que per començar, les deixarem amb les opcions per defecte.


Per tal d'afegir les llibreries LSDATALIB i J2MESDLIB s'haurà de prémer el botó dret del ratolí damunt del projecte en qüestió, després "Set active Project Configuration" i finalment Add configuration to Project.
La pantalla de nova configuració demanarà "Use Configuration Template". La plantilla que s'ha de seleccionar és "DefaultColorPhone_template".
A sota caldrà posar el nom de la nova configuració.











Ara és el moment d'afegir les llibreries de fitxers i bases de dades.
Cal prémer "Libraries & Resources". Després "Add Jar/Zip" i buscar els arxius descarregats prèviament de LSDATALIB i J2MESDLIB.
A més, per tal de poder treballar amb les llibreries gràfiques de Netbeans, s'ha de prémer "Add Library" i afegir "Netbeans MIDP Components". Aquesta llibreria permatrà utilitzar components gràfics que el programa de prova necessita.
Arribat aquest punt, podem començar a programar.


Manual del programador de J2MESDLIB

La llibreria J2MESDLIB permet treballar amb taules relacionals en dispositius mòbils. Aquesta API proporciona els mètodes necessaris per poder crear, modificar i esborrar, en definitiva, gestionar taules en una base de dades relacional.
En aquesta secció veurem com utilitzar la API de la llibreria J2MESDLIB per a poder gestionar taules en una base de dades relacional.

Com crear una base de dades i afegir-hi una taula

En primer lloc, cal generar una base de dades que actuarà com contenidor de taules. Per això és necessari cridar al mètode de classe generateDB. Si la base de dades no existeix aquest mètode s'encarrega de crear les taules del catàleg, que tindran com funció principal emmagatzemar informació sobre les taules dels usuaris de la base de dades. Aquest mètode rep un paràmetre per indicar si s'ha de mostrar informació de les operacions que es realitzen per la sortida estàndard. Aquesta opció resulta útil en la fase de depurat de l'aplicació.

Després d'haver generat el catàleg de la base de dades es pot passar a gestionar les taules. Per a crear una taula en la nova base de dades cal utilitzar el mètode CreateTable. Aquest mètode rep com primer paràmetre el nom de la taula a crear, el segon paràmetre és un vector amb els camps de la taula i el tercer paràmetre és un enter que indica el nombre de columnes que formen la clau primària de la taula.

Suposem que volem crear en la base de dades de discs de música. Anem a crear una taula de discs amb tres camps: el nom de l'artista, el nom del disc i el gènere. El nom de l'artista en conjunció amb el nom del disc actuarà de com identificador(clau primària) de cada entrada de la base de dades.

Per definir els camps de la taula s'utilitza la classe J2MEColumn. El constructor de J2MEColumn rep com a paràmetres el nom del camp, si el camp formarà part de la clau primària de la taula o no, el tipus del camp (BOOL, DOUBLE, INT i VARCHAR són els tipus de dades disponibles en aquesta versió) i la grandària del camp. Després de definir els camps de la taula cal guardar-los en un vector i aquest vector és el segon paràmetre del mètode createTable.

El següent fragment de codi mostra com podem crear la base de dades i la taula.

J2MESDLIB.generateDB(false);
J2MEColumn c1 = new J2MEColumn("artista",true,J2MEColumn.ColumnType.VARCHAR,J2MEColumn.ColumnType.CHAR_SIZE*15);
J2MEColumn c2 = new J2MEColumn("disc",true,J2MEColumn.ColumnType.VARCHAR,J2MEColumn.ColumnType.CHAR_SIZE*15);
J2MEColumn c3 = new J2MEColumn("genere",false,J2MEColumn.ColumnType.VARCHAR,J2MEColumn.ColumnType.CHAR_SIZE*15);
Vector columnes = new Vector();
columnes.addElement(c1);
columnes.addElement(c2);
columnes.addElement(c3);
J2METable t = J2MESDLIB.createTable("musicbd",columnes,2);

Inserció de fila

Una vegada creada la taula podem passar a la inserció de noves tuples o files.
En primer lloc, obrim la base de dades cridant al mètode generateDB, després és necessari carregar la taula a la qual accedirem cridant al mètode loadTable. En cas que la taula no existeixi ens encarreguem de crear-la. A continuació podem passar a la creació d'una nova fila. Per a això utilitzarem la classe J2MERow. Crearem una fila buida amb el mètode createRow, després afegirem les dades de la fila amb el mètode setColValue. El primer paràmetre d'aquest mètode és la dada que anem a guardar i el segon paràmetre el número de camp. En el nostre exemple el nom de l'artista és el camp número 0, el nom del disc és el camp número 1 i el gènere el número 2. Per a acabar afegirem la fila a la taula de contactes a través del mètode addRow i guardarem els canvis en la taula amb el mètode saveTable.

El codi quedaria de la següent manera:

J2METable t=null;
J2MESDLIB.generateDB(false);
if(J2MESDLIB.existsTable("musicbd")){
t = J2MESDLIB.loadTable("musicbd");
}
else{
t = crearMusicBD();
}

J2MERow r = t.createRow();
r.setColValue("artista",0);
r.setColValue("disc",1);
r.setColValue("genere",2);
t.addRow(r);
t.saveTable();
t.closeTable();
J2MESDLIB.closeDB();

Cerca de fila

Com hem fet en l'exemple anterior en primer lloc obrim la base de dades i carreguem la taula de contactes. A continuació utilitzarem la classe J2MEKey per a buscar el contacte pel seu nom. Per a això creem un objecte de la classe J2MEKey i amb el mètode addValueKey afegim el nom de l'artista i el nom del disc de l'entrada que volem buscar (en el nostre exemple "artista" i "disc"). Invocant el mètode seek buscarem l'entrada a la taula. Si l'entrada existeix podrem obtenir les seves dades amb el mètode read.
En la versió actual de la llibreria només es pot buscar de forma eficient per clau primària o identificador.

El codi seria el següent:

J2METable t = null;
J2MERow r = null;
J2MESDLIB.generateDB(false);

if(J2MESDLIB.existsTable("musicbd")){
t = J2MESDLIB.loadTable("musicbd");
if (t.rowCount()>0){
J2MEKey key = new J2MEKey();
key.addValueKey("artista");
key.addValueKey("disc");
if(t.seek(key)){
r = t.read();
}
}
}
t.closeTable();
J2MESDLIB.closeDB();

Actualitzar/Modificar una fila

Després d'obrir la base de dades i carregar la taula crearem un objecte de la classe J2MEKey que ens servirà per buscar a la taula l'entrada que anem a modificar. Això ho farem invocant el mètode seek. Una vegada trobat, llegirem les dades invocant el mètode read. A continuació modificarem la columna corresponent i després modificarem la fila a través del mètode update, al que passarem com paràmetre les noves dades del contacte. Finalment, gravarem els canvis fets en la taula a través del mètode saveTable.

En la versió actual de la llibreria no es pot modificar la clau primària de la taula. Per això en l'exemple anterior només podrem modificar el gènere.

El codi seria el següent:

J2METable t = null;
J2MESDLIB.generateDB(false);
if(J2MESDLIB.existsTable("musicbd")){
t = J2MESDLIB.loadTable("musicbd");
J2MEKey key = new J2MEKey();
key.addValueKey("artista");
key.addValueKey("disc");
if(t.seek(key)){
J2MERow row = t.read();
row.setColValue("nouGenere",2);
t.update(row);
t.saveTable();
}

}
t.closeTable();
J2MESDLIB.closeDB();

Esborrar fila

Anem a esborrar les dades de l'entrada "artista""disc". Per a això obrirem la base de dades i carregarem la taula. A continuació crearem un objecte J2MEKey per localitzar l'entrada "artista""disc". Això ho farem invocant el mètode seek. Una vegada localitzada, passarem a esborrar-la de la taula a través del mètode delete.

Codi:

J2METable t = null;
J2MESDLIB.generateDB(false);

if(J2MESDLIB.existsTable("musicbd")){
t = J2MESDLIB.loadTable("musicbd");
J2MEKey key = new J2MEKey();
key.addValueKey("artista");
key.addValueKey("disc");
if(t.seek(key)){
t.delete();
}
}
t.closeTable();
J2MESDLIB.closeDB();

Manual d'usuari de l'aplicació d'exemple

Aquesta aplicació gestiona una petita base de dades de discos d'artistes i pretén il·lustrar el funcionament de la llibreria J2MESDLIB.
Per engegar l'aplicació només cal executar sobre la màquina virtual de java els arxius d'exemple.
Quan apareixi l'emulador de mòbil, cal seleccionar el MIDlet ExempreSDLib i prémer el botó launch, llavors apareixerà la pantalla de benvinguda que explicarà com funciona el programa.
Les dues funcions bàsiques són, veure la base de dades (que permetrà gestionar-la) i afegir una nova entrada a la base de dades.

















Per afegir una nova entrada només cal prémer menú i seguidament el número 2 i apareixerà una nova pantalla per inserir dades.
S'ha d'escriure el nom de l'artista, el nom del disc i el gènere al qual pertany. Finalment prémer Ok.















Per arribar a la pantalla a la gestió de la base de dades s'ha de prémer el botó menú i després el número 2. En aquesta pantalla es pot veure el contingut de la base de dades.
A més es poden fer cerques amb tres criteris diferents, un per cada atribut de la taula. Per tal de fer-ho, només cal seleccionar el criteri que es vol, escriure el text a buscar i finalment prémer menú i número 1. Si el camp de text a buscar queda buit, es mostraran totes les entrades.
Prement menú i número 2 anirem a la pantalla de modificació de dades.
Prement menú i número 3 anirem a la pantalla d'esborrat d'entrades.










A la pantalla d'edició d'entrades es mostraran les entrades que havien quedat visibles a la pantalla de visualització de la base de dades, és a dir, que si s'havia fet alguna cerca i havien quedat només les entrades trobades, en aquesta pantalla només apareixeran aquestes.
Per editar s'ha d'anar a la fila corresponent i prémer el botó Editar.














En arribar a la pantalla d'edició de les dades, aquestes apareixeran i només es permetrà modificar els camps que no formin part de l'identificador. En aquest cas només es podrà modificar el gènere, donat que el nom de l'artista i el disc identifiquen l'entrada a la base de dades.
Una vegada modificat, cal prémer Ok.













De la mateixa manera que a la pantalla d'edició d'entrades, en la d'esborrat de dades apareixeran les entrades que havien quedat a la pantalla de visualització de la base de dades.
També caldrà seleccionar la fila de l'entrada que volem esborrar i prémer el botó Ok.

jueves, 18 de enero de 2007

1a Reunió PFC

Ens hem reunit per primera vegada per parlar del punt de partida del projecte.

La feina acordada per a la propera reunió, que serà la setmana del 29 de gener al 2 de febrer, és:
-Familiaritzar-se amb la llibreria J2MESDLIB
-Fer una petita aplicació que mostri com funciona J2MESDLIB
-Fer una guia del programador, pas a pas, de com fer un programa en J2ME utilitzant J2MESDLIB a la Wiki de morfeo