Trabalho prático 2011/2012 Linguagens de programação
INTRODUÇÃO ... 3
1.
CPYTHON-INTERFACE GRÁFICA ... 3
1.1
D
ESCARGA DE REGISTOS PARA A BASE DE DADOS... 3
1.2
V
ISUALIZAÇÃO DE DADOS E ESTATÍSTICAS DOS REGISTOS... 3
1.2.1 Visualização de dados ... 3
1.2.2 Visualização de Gráficos da estatística .. 3
1.3
G
ERAR SITE A PARTIR DOS DADOS... 4
1.4
C
ONTAR OS TAGS HTML NUMA PÁGINA... 4
1.5
G
ERAR FICHEIROCSV ... 4
1.5.1
Guardar lista ... 4
1.5.1
Guardar estatísticas ... 4
2.
INTERFACE GRÁFICA JYTHON ... 4
N
OTAS IMPORTANTES ANTES DE UTILIZAR A APLICAÇÃO... 4
2.1
D
ESCARGA DE REGISTO PARA A BASE DE DADOS... 4
2.2
V
ISUALIZAÇÃO DE DADOS E ESTATÍSTICAS DOS REGISTOS... 5
2.2.1 Visualização de dados ... 5
2.3
G
ERAR SITE A PARTIR DOS DADOS... 5
2.4
C
ONTAR OS TAGS HTML NUMA PÁGINA... 5
2.5
G
ERAR FICHEIROCSV ... 6
2.5.1
Guardar valores da lista ... 6
2.5.2
Guardar estatísticas ... 6
3.
METODOLOGIA ... 6
3.1–
D
ESCARGA DE FICHEIROSCSV
PARA A BASE DE DADOS... 6
3.1.1-Leitura de dados do CSV ... 6
3.1.1.1-CPython ... 6
3.1.1.2-Jython ... 6
3.1.2-Escrita dos dados para a base de dados 6
3.1.2.1-CPython ... 6
3.1.2.2-Jython ... 6
3.1.3-Esquema Dump to data base ... 6
3.2
E
STATÍSTICAS(CP
YHTON EJ
YTHON) ... 7
3.2.1 Gerar estrutura para estatística ... 7
3.2.2 Encontrar dados ao longo dos anos ... 7
3.2.2.1(CPython) ... 7
3.2.2.1(Jython) ... 7
3.2.3 Apresentação dos dados estatística ... 7
3.2.3 Apresentação de dados sob forma de
gráfico (Apenas CPython) ... 8
3.3
G
ERAÇÃO DE SITE A PARTIR DAS ESTRUTURAS DE DADOS(CP
YTHON EJ
YTHON) .... 8
3.3.1- Procedimento ... 8
3.3.2- Representação de site para estrutura de
três níveis ... 8
3.3.3 Representação de site para estrutura de
quatro níveis ... 8
3.4
R
ETIRAR INFORMAÇÃO DOS TAGS DE UMA PÁGINAHTML
(CP
YTHON EJ
YTHON) ... 8
3.5
E
SCRITA DE DADOS PARA FICHEIROCSV .... 8
3.5.1 CPython ... 9
3.5.2 Jython ... 9
4.
EM CONCLUSÃO ... 9
Introdução
Este relatório visa demonstrar o funcionamento das aplicações desenvolvidas de acordo com os requisitos estabelecidos no trabalho pratico entregue ao aluno. Sendo este dividido em três partes:
Inicia-se por demonstrar as funcionalidades da aplicação gráfica quer na versão CPython quer na versão Jython , comprovando que estas estão de acordo com o pedido. O próximo passo será uma descrição da metodologia utilizada no funcionamento interno da aplicação, descrição das varias classes, como estas interagem para que a aplicação funcione.
Em conclusão será feita uma comparação entre a
aplicação CPython e Jython com o fim de expor os pros e contras no desenvolvimento.
1. CPython-Interface gráfica
Esta aplicação trata-se de uma interface gráfica com o utilizador, que permite o envio de registos agrupados em ficheiros CSV retirados do site
“http://www.rebides.oces.mctes.pt/Rebides09/”. para uma base de dados recorrendo á sqlite3, a aplicação apenas funciona correctamente para registos retirados de acordo com a estrutura no site. Para design da interface gráfica recorreu-se á aplicação wxGlade que permite design interactivo de interface com as bibliotecas wxPython. 1.1 Descarga de registos para a base de dados Esta funcionalidade esta disponível no menu file->Send csv to db, uma vez seleccionado é apresentado uma caixa de dialogo para escolha do ficheiro csv, de seguida é apresentada uma view formada por duas caixas de entrada de texto que permitem especificar o nome da base de dados e o nome da tabela, mais um butão com o texto “Dump to data base” o qual ao ser premido inicia o processo de descarga de registo para a base de dados, ao lado do Butão pode-se ver um texto que mostra o numero de registos criados na base de dados assim como numa wxGauge por baixo do botão.
1.2 Visualização de dados e estatísticas dos registos
1.2.1 Visualização de dados
De acordo com o que é pedido no enunciado do trabalho, o programa permite visualizar as seguintes estatísticas:
• Número de professores por estabelecimento por ano
• Número de professores por estabelecimento por categoria por ano
• Número de professores por estabelecimento por grau por ano.
Para visualização desta informação optou-se por criar uma interface com três botões, cada um representando o tipo de estatística.
De acordo com, aquele que é premido, será apresentado: • Três listas para a primeira estatística,
representando a primeira os anos, a segunda os estabelecimentos no ano seleccionado e a terceira os professores no estabelecimento no determinado ano, existe ainda por baixo das lista texto a referir o numero de anos, estabelecimentos e professores.
E ainda existe uma lista mais a baixo que permite ver o item seleccionado pelos anos.
• Quatro listas para a segunda e a terceira, representado a primeira os anos, a segunda os estabelecimentos, a terceira as categorias ou os graus conforme a opção escolhida e a quarta os professores. E ainda existe uma lista mais a baixo que permite ver o item seleccionado pelos anos.
1.2.2 Visualização de Gráficos da estatística A aplicação permite gerar gráficos para visualizar as estatísticas.
Para tal basta clicar duas vezes na lista de
estabelecimentos, categorias ou graus, sendo mostrado de seguida um gráfico de barras dos professores naquele estabelecimento pelos anos, isto na primeira opção pois se
for numa das outras duas será visualizado o numero de categorias ou graus pelos anos.
Ao clicar nas categorias ou graus será visualizado o gráfico de número de professores na categoria ou grau seleccionado, pelos anos.
1.3 Gerar site a partir dos dados
A aplicação permite gerar uma série de ficheiros html, baseados na estrutura de dados seleccionados para a estatística, sendo possível navegar através das páginas recorrendo a links obedecendo ás estruturas:
• Primeira estatística tem a estrutura Anos->Estabelecimentos->Professores
• Segunda estatística tem a estrutura Anos->Estabelecimentos->Categorias->Professores. • Terceira estatística tem a estrutura Anos->Estabelecimentos->Graus->Professores.
Esta opção esta disponível na view das listas de dados, a partir do Butão Create html site.
Uma vez seleccionada o programa gera uma série de ficheiros de acordo com a estrutura, sendo o ficheiro principal com os links dos anos o index.html, Após gerar todos os ficheiros, o programa, lança o servidor http e abre o firefox no endereço do localhost e porta do servidor para visualizar o site.
É possível lançar o servidor e abrir o browser sem gerar o site no menu file opção Start http server.
1.4 Contar os tags html numa página
O programa, tem como pedido, a funcionalidade de contar tags H1, H2, H3, DIV, P, UL, OL como pedido no enunciado, para tal no menu file a opção get html info, então é nos mostrado uma caixa de diálogo na qual se insere a url da página e de seguida é nos mostrado a contagens desses tags.
1.5 Gerar ficheiro CSV 1.5.1 Guardar lista
Como pedido no enunciando, o programa tem a
funcionalidade de enviar a lista de dados seleccionados á partir da estatística para um ficheiro CSV, para isso basta numa das vistas de estatística seleccionar dados ate á lista de professores, ai é nos mostrado um butão com o texto “Dump teachers to CSV”, após clicar é nos pedido para indicar um ficheiro de destino e de seguida a informação é enviada para o destino
1.5.1 Guardar estatísticas
Para guardar as estatísticas num ficheiro csv, ao chamar um gráfico, é nos tornado visível o botão “Send statistics to CSV”, possibilita guardar no csv, as informações disponíveis no gráfico.
2. Interface Gráfica Jython
Notas importantes antes de utilizar a aplicação A aplicação JythonApp utiliza duas bibliotecas que não vêm instaladas com o Java ,a openscsv-2.3.jar e a sqlitesjdbc-v056.jar, por isso, deve-se fazer download, neste caso da página http://www.zentus.com/sqlitejdbc/ a driver do sqlite e da página
http://opencsv.sourceforge.net/ o opencsv.
Seguidamente para que estas possam ser utilizadas no Jython, deve-se adiciona-las ao classpath do sistema, para tal efeito, uma das possibilidades será criar o ficheiro .bashrc na directoria home do sistema, colocando lá o seguinte conteúdo:
export CLASSPATH=”/caminho até o ficheiro” + “Nome da biblioteca”.jar + :$CLASSPATH
2.1 Descarga de registo para a base de dados A versão de Jython permite a descarga de registos contidos em ficheiros CSV para uma base de dados sqlite3, para tal efeito na interface gráfica existe um submenu no menu file, Send to Data Base, ao ser seleccionado pede o ficheiro de origem a partir de uma caixa de dialogo de selecção de ficheiro.
Seguidamente é pedido o nome da base de dados e o nome da tabela, o passo seguinte será clicar em Dump to Data Base para iniciar o processo de descarga.
Uma vez finalizado mostra o numero de registos inseridos na base de dados.
2.2 Visualização de dados e estatísticas dos registos
2.2.1 Visualização de dados
De acordo com o que é pedido no enunciado do trabalho, o programa permite visualizar as seguintes estatísticas: • Número de professores por estabelecimento por ano
• Número de professores por estabelecimento por categoria por ano
• Número de professores por estabelecimento por grau por ano.
Para visualização desta informação optou-se por criar uma interface com três botões, cada um representando o tipo de estatística.
De acordo o aquele que é premido será apresentado: • Três listas para a primeira estatística, representando a primeira os anos, a segunda os estabelecimentos no ano seleccionado e a terceira os professores no estabelecimento no determinado ano, existe ainda por baixo das lista texto a referir o numero de anos, estabelecimentos e professores.
• Quatro listas para a segunda e a terceira, representado a primeira os anos, a segunda os estabelecimentos, a terceira as categorias ou os graus conforme a opção escolhida e a quarta os professores.
2.3 Gerar site a partir dos dados
A aplicação permite gerar uma série de ficheiros html, baseados na estrutura de dados seleccionados para a estatística, sendo possível navegar através das páginas recorrendo a links obedecendo ás estruturas:
• Primeira estatística tem a estrutura Anos->Estabelecimentos->Professores
• Segunda estatística tem a estrutura Anos->Estabelecimentos->Categorias->Professores. • Terceira estatística tem a estrutura Anos->Estabelecimentos->Graus->Professores.
Esta opção esta disponível na view das listas de dados, a partir do Butão Create html site.
Uma vez seleccionada o programa gera uma série de ficheiros de acordo com a estrutura, sendo o ficheiro principal com os links dos anos o index.html, e por cada nível da estrutura cria uma directoria com ficheiros html sobre os dados de cada nível.
2.4 Contar os tags html numa página
O programa tem como pedido a funcionalidade de contar tags H1, H2, H3, DIV, P, UL, OL como pedido no enunciado, para tal no menu file a opção get html info, então é nos mostrado uma caixa de dialogo na qual se insere a url da página e de seguida é nos mostrado a contagens desses tags.
Na sua versão Jython foi necessário indicar o caminha para as bibliotecas standard do python, através do import sys, e utilizando o sys.path.append(‘paths do python’). Como referido no código fonte do programa.
2.5 Gerar ficheiro CSV 2.5.1 Guardar valores da lista
Como pedido no enunciando, o programa tem a
funcionalidade de enviar a lista de dados seleccionados á partir da estatística para um ficheiro csv, para isso basta numa das vistas de estatística seleccionar dados ate á lista de professores, ai é nos mostrado um butão com o texto “Dump teachers to csv”, após clicar é nos pedido para indicar um ficheiro de destino e desseguida a informação é enviada para o destino.
2.5.2 Guardar estatísticas
Ao clicarmos na lista 2 ou 3 o butao “Dump statistics to csv” fica activo, permitindo guardar num ficheiro csv, a informação de todos os anos sobre o item selecionado
3. Metodologia
Para desenvolver a aplicação CPython , criou-se o ficheiro CPythonApp.py onde foi colocado o código python e modificou-se a sua propriedade de execução através do comando unix chmod +x CPythonApp.py.
Este ficheiro foi gerado através da aplicação WXGlade, e modificado posteriormente, no qual foi adicionado métodos e atributos para dar solução aos problemas propostos.
Na aplicação Jython criou-se o ficheiro JythonApp.py para desenvolvimento da interface gráfica, recorreu-se as bibliotecas gráficas swing do Java.
3.1– Descarga de ficheiros CSV para a base de dados 3.1.1-Leitura de dados do CSV
3.1.1.1-CPython
Para ser possível a leitura do dados do ficheiro no caso do CPython recorreu-se ao modulo csv do python e criou-se um método __getData(self):, este retorna a primeira linha do ficheiro csv, contendo esta os campos a criar a tabela na base de dados e ainda uma lista de listas contendo os restantes registos.
3.1.1.2-Jython
Para ler os registo do CSV, no Jython, recorreu-se á biblioteca opencsv e á class FileReader do Java. A aplicação conta com o método __getData(self):, este
permite a leitura dos dados do csv e separa os nomes dos campos do resto dos dados, retornado ambos.
3.1.2-Escrita dos dados para a base de dados 3.1.2.1-CPython
Para lidar com a base de dados criou-se o modulo SQLConverter.py, contem a Classe Converter que utiliza o modulo sqlite3 do python, no seu construtor recebe o nome da base de dados e o nome da tabela.
Para criar a tabela na base de dados, existe o método createDB, este cria a base de dados e se a tabela não existe cria-a com os campos que lhe são passados por parâmetro, previamente a á criação da base de dados este são filtrados recorrendo ao método normalize que prepara uma String no formato do sql para que não existe erros de caracteres.
O próximo passo é a inserção dos dados na tabela , para isso desenvolveu-se o método insertDB, que recebe uma lista que representa um registo, este é normalizado pelo método __normalize(self): e é inserido na base de dados. 3.1.2.2-Jython
Para lidar com a base de dados criou-se o modulo SQLConverter.py, contem a Classe JConverter que utiliza a biblioteca sqlitejdbc-v056.jar, no seu construtor recebe o nome da base de dados e o nome da tabela.
Para criar a tabela na base de dados, existe o método createDB, este cria a base de dados e se a tabela não existe cria-a com os campos que lhe são passados por parâmetro, previamente a á criação da base de dados, este são filtrados recorrendo ao método normalize que prepara uma String no formato do sql para que não existe erros de caracteres.
O próximo passo é a inserção dos dados na tabela , para isso desenvolveu-se o método insertDB, que recebe uma lista que representa um registo, este é normalizado pelo método normalize e é inserido na base de dados. 3.1.3-Esquema Dump to data base
3.2 Estatísticas (CPyhton e Jython) 3.2.1 Gerar estrutura para estatística
Para lidar com este problema desenvolveu-se uma um modulo Statistics com uma classe Statistics, a qual recebe o total de data proveniente da base de dados e cria uma estrutura de dicionários e listas, conforme a opção escolhida :
Professores por estabelecimento por ano será a seguinte :
Três níveis
Professores por estabelecimento por categoria por ano será a seguinte :
Quatro níveis
Professores por estabelecimento por grau por ano será a seguinte :
Quatro níveis
3.2.2 Encontrar dados ao longo dos anos 3.2.2.1(CPython)
Na class Statistics, existem dois métodos, para pesquisa na estrutura por uma entidade.
• Um para criar uma lista com base numa estrutura de três níveis nominado
treeLevelsSearch(self,scool,data):, este é utilizado na primeira estrutura de estatística, criando uma lista de valores ordenados, a partir de data, representando a contagem de professores, se se tiver escolhido a primeira opção na interface gráfica, caso contrario permite contar o número de graus ou categorias numa escola, e outra lista legenda contendo anos em que existe dados dessa entidade scool seleccionada na lista2.
• Outro para operar uma estrutura de quatro níveis, nominado fourLevelsSeach(self,pcat,scool,data):,
utilizado nas outras duas, criando também uma lista da contagem de elementos no ultimo nível e respectiva lista
ordenada ,com os anos em que existe a respectiva scool seleccionada na lista 2 e nessa a categoria ou grau contido em pcat seleccionada na lista 3.
3.2.2.1(Jython)
Na class Statistics, existem dois métodos, para pesquisa na estrutura de uma entidade.
• Um para criar uma lista com base numa estrutura de três níveis nominado
JTreeLevelsSearch(self,scool,data):, este é utilizado na primeira estrutura de estatística, criando uma lista de valores a partir de data, representando a contagem de professores, se se tiver escolhido a primeira opção na interface gráfica, caso contrario permite contar o número de graus ou categorias numa escola, e outra lista legenda contendo anos em que existe dados dessa entidade scool seleccionada na lista2.
• Outro para operar uma estrutura de quatro níveis, nominado JFourLevelsSeach(self,pcat,scool,data):, utilizado nas outras duas, criando também uma lista da contagem de elementos no ultimo nível e respectiva lista com os anos em que existe a respectiva scool seleccionada na lista 2 e nessa a categoria ou grau contido em pcat seleccionada na lista 3.
3.2.3 Apresentação dos dados estatística
Para apresentar os dados na interface gráfica, optou-se por utilizar uma interface de listas que permitem seleccionar os anos, escolas nesse ano, categorias nessa escola, ou graus e visualizar os professores nessa linha.
• Funcionamento do sistema de apresentação de dados.
Ao escolher um ano da lista este procura na estrutura o que lhe corresponde e cria uma lista com as chaves do dicionário, esta por sua vez é adicionada á lista de estabelecimentos, clicando nesta é verificado qual das estatísticas foi escolhida, se for a primeira é verificado a que corresponde na estrutura e cada registo de professores na lista é transformada numa string através do método __setStringList(self): e estas são colocadas como itens na lista 4.
Se não se tratar da primeira opção significa que ainda existe um outro nivel e portanto outra lista, categorias ou graus, conforme a opção escolhida, nesse casso ainda se trata de um dicionário de dicionários, então como no nível
anterior é criada uma lista de chave e mostrada na lista 3, aí então uma seleccionada é que os registos são
transformados numa lista de strings e adicionados á lista 4.
3.2.3 Apresentação de dados sob forma de gráfico (Apenas CPython)
Para ser possível a apresentação dos dados sob a forma de gráfico, utilizou-se o modulo Matplotlib como pedido no enunciado, dos vários tipos de gráficos disponíveis no modulo, optou-se por utilizar um gráfico de barras, possibilitando a visualização do numero de professores num determinado estabelecimento, categoria ou grau, em todos os anos inseridos na base de dados e ainda permite visualizar o gráfico do numero de categorias e graus num determinado estabelecimento pelos diferentes anos. Para dar resposta a esta funcionalidade criou-se o modulo Graph que contem a Class Graph, esta recebe os
parâmetros, titulo para o gráfico, legenda lateral e legenda inferior.
Esta conta com o método:
• drawGraph(), recebe os valores (values, legend) retirados de a partir de um dos anteriores e elabora o gráfico.
3.3 Geração de site a partir das estruturas de dados (CPython e Jython)
3.3.1- Procedimento
Este procedimento consiste na leitura de uma estrutura gerada pela class Statistics nível a nível, cria-se um ficheiro html com o nome da chave do dicionário e insere-lhe links para os ficheiros criados no nível seguinte, assim sucessivamente até ao penúltimo nível no qual o ficheiro html não contem links mas sim uma tabela de professores contidos no ultimo nível da estrutura.
Cada nível esta dividido por pastas no sistema de
ficheiros, o índex.hml, ficheiro inicial do site esta junto ao CPythonApp.py, os ficheiros do nível seguinte estão contidos num directoria years criada pelo programa ao gerar o site, o próximo nível esta em establishmentes dentro de years, caso a estatística escolhida seja a primeira, dentro desta estão os ficheiros com informação dos professores, se não, ainda existira mais um nível antes desta informação, este contara mais uma directoria sendo esta com o nome catgory ou degree dependendo da opção escolhida.
(Server apenas em CPython):
Esta funcionalidade como referido anteriormente, esta disponível a partir de um butão na parte de estatística na interface gráfica, ao premir o butão o site é gerado, e também é iniciado o firefox no endereço do local host na porta 8005, o qual mostra o ficheiro índex.html.
Isto é possível pois existe um modulo HTTPServer .py criado que contem a class Server, esta permite a utilização do simpleHttpServer do python, e ainda, esta class herda da class Thread o que permite que o servidor corra noutra execução externa ao programa e o sistema não bloquei. 3.3.2- Representação de site para estrutura de três níveis
3.3.3 Representação de site para estrutura de quatro níveis
3.4 Retirar informação dos tags de uma página HTML (CPython e Jython)
A aplicação como já referido anteriormente, permite retirar informação sobre o numero de tags numa página html, isto é possível graças ao modulo HTTPRetriver que contem a class HttpRetriver, esta recebe no seu construtor o parâmetro url, sendo este o endereço da página,
recorrendo ao modulo urllib2 é possível ler a o conteúdo desse ficheiro e o guardar numa variável, para este ser processado pelo modulo BeautifulSoap, este possibilita ao ser indicado o tag pretendido, retornar uma lista desses elementos contidos no documento.
Tendo em conta estas propriedades, bastou-se cirar um método na class HttpRetriver, getTagCount(self,tag):, que recebe o tag pretendido por parâmetro e devolve o comprimento da lista retornada do BeautilfulSoap, cumprindo assim o requisito pedido, efectuando-se esta operação para todos os tags pretendidos, o ultimo passo foi mostrar essa informação ao utilizador recorrendo ao widget wx.statictext adicionado ao interface gráfico. 3.5 Escrita de dados para ficheiro CSV
Como pedido no enunciado, o programa permite a escrita de dados resultantes da pesquisa para um ficheiro CSV. Para este fim, registo a registo, os dados dos professores, contidos no nível 4 da estrutura de estatística, sendo cada campo separado por ‘,’ , são enviados para o ficheiro CSV.
3.5.1 CPython
Para resolver esta questão utilizou-se o modulo csv do python e criou-se o método __EVT_SEND_CSV que envia os registos o ficheiro seleccionado.
3.5.2 Jython
Utilizou-se a biblioteca opencsv e a class FileWriter do Java , e criou-se o método __teachersToCSV que envia os registos para o ficheiro seleccionado.
4. Em conclusão
Durante o desenvolvimento das aplicações notou-se que a aplicação de CPython tem disponível todos os módulos necessários ao desenvolvimento, a excepção do Beaultifulsoap, no entanto a aplicação Jython foi
necessário a instalação de sqlitejdbc-v056.jar, opencsv.jar e ainda o Beautifulsoap.
Em termos de syntax, na utilização dos módulos python, estes são de mais fácil utilização que as classes Java. Em termos de tempos de execução a aplicação python é ligeiramente mais rápida.
Em comparação de estrutura de uma aplicação para outra não existe muita diferença, apenas na diferenciação dos módulos utilizados.