Mostrando postagens com marcador php. Mostrar todas as postagens
Mostrando postagens com marcador php. Mostrar todas as postagens

sábado, 19 de maio de 2012

Quando os menus do Moodle param de funcionar, o que fazer?

Estou administrando desde o final do ano passado um sistema Moodle na Fatec Ipiranga. A ideia do sistema é servir como um repositório de conteúdo do material que os professores utilizam em sala de aula, gerenciar o lançamento de notas, faltas e servir como um espaço para que os alunos possam trocar mensagens, links, blogar e gerenciar um pouco melhor sua vida acadêmica.


Já tenho trabalhado com Moodle desde 2005, quando participei do projeto Pangea em sua proposta de formação para conselheiros de conselhos municipais do trabalho. Projeto inicial, Moodle ainda bem embrionário e muita coisa mudou no Moodle e na Internet desde então.

Ocorre que nesse ano estamos trabalhando com o Moodle versão 2, ou seja, com todas as novas funcionalidades e recursos que essa nova série do sistema tem para oferecer. Porém, nem tudo é simples...

De uns 10 dias pra cá, o Moodle simplesmente começou a não permitir que abríssemos seus menus em javascript. O sistema parou de permitir que os usuários acessassem seus conteúdos.

Pesquisando, pesquisando, pesquisando... achei algumas recomendações que queria deixar documentando por aqui, pois outros devem passar pelo mesmo problema e o susto é razoável.

O Moodle gera um cache de várias funcionalidades: html, javascript, dados dinâmicos e outras coisinhas do sistema. Esse cache fica no servidor e vai chegando num nível que ele não consegue gerenciar direito. Logo, o sistema precisa limpar o próprio cache, porém, ele não sabe disso até que você informe.

Logo, o Moodle disponibiliza um script em php que fica nesse endereço: http://yourdomain.com/admin/purgecaches.php

Esse script limpa tudo o que estiver em cache no servidor, fazendo com que todas as novas funcionalidades tenham de ser carregadas novamente para o cliente. Isso traz as funções do sistema de volta ao seu modo padrão.

quarta-feira, 14 de março de 2012

Acesso a banco de dados em PHP: algumas diferenças entre os métodos estruturado e orientado a objetos

O PHP é uma linguagem de programação híbrida que tanto pode funcionar orientado a objetos quando de modo estruturado.

Tenho me dedicado nos últimos ao desenvolvimento de alguns scripts para tratamento identificação de nomes na base de dados de docentes, alunos e funcionários da USP. Problema crítico, dado que a quantidade de pessoas no banco chega próximo a 1milhão e, como meu objetivo é identificar de modo automático o nome do autor de um artigo e sua localização dentro da USP, a tarefa se torna de uma escala considerável.

Semana passada, montei um pequeno script, que reproduzo logo a seguir, para buscar no banco de dados a ocorrência de nomes idênticos a um arquivo base em CSV que eu tinha a minha disposição. Esse arquivo em CSV foi gerado com outro script que montei, que pega o nome de todos os autores de um artigo, identifica aqueles que são da USP e cria linhas separadas para cada um deles. Muito, bem, com esse arquivo na mão montei o script abaixo para consulta no banco de dados:

    $consulta = 'SELECT CODPES FROM tudo t WHERE t.NOMPES =\''.$nomecompleto.'\' LIMIT 0,1';
    $resultado = $mysqli->query($consulta);   
    if ($resultado->fetch_row())
        list($codigopessoa) = $resultado->fetch_row();
       



Até aí, normal. Quando comecei a rodar na consulta a base de nomes, um erro interessante apareceu, indicando ser na linha do comando fetch_row() acima listado: Fatal error: Call to a member function query() on a non-object.
 
Até então, não tinha visto esse erro no acesso a um banco de dados. O código estava correto e retornava o resultado até um determinado número de registros de meu arquivo CSV, sendo que acima desse número o script simplesmente parava de funcionar. Eu estava usando a conexão orientada a objetos, a partir da classe mysqli para acesso ao banco.

Checando em alguns fórums, achei uma recomendação que dizia utilizar o modo estruturado para acesso ao banco, dado que isso teria um outro efeito no modo de gerenciamento de conexões, evitando esse tipo de erro em um conjunto massivo de dados. Bingo. Mudei o script acima para esse aqui e funcionou:

$consulta = 'SELECT CODPES FROM tudo t WHERE t.NOMPES =\''.$nomecompleto.'\' LIMIT 0,1';
    $resultado = mysql_query($consulta,$mysqli);

    while ($row = mysql_fetch_assoc($resultado)) { ....}


Conclusão: os métodos de acesso não são diferentes, em termos de comportamento, apenas por uma questão de serem estruturados ou orientado a objetos. Eles são diferentes enquanto modo de gerenciamento de conexão, podendo resultar em erros de acesso ao banco quando utilizados de modo massivo.

terça-feira, 23 de agosto de 2011

Analisando a formação de redes na ferramenta Fórum do Moodle

Sempre considerei o Moodle uma plataforma bastante dura, engessada e pouco sedutora para a promoção de um espaço de conversa online em relação a outras possibilidades, como o Drupal e Wordpress.

O fato é que tenho trabalho, nem tanto por opção mas por uma questão demanda do edital, com o Moodle na Rede de Formação do projeto Telecentros.BR. Tenho documentado por aqui alguns movimentos que temos feito de análise da formação de redes de conversas entre os monitores que estão participando desse processo. Já são mais de 1300 nesse momento e os primeiros estudos que comecei a fazer me mostraram algo que de fato eu pouco esperava: um uso muito intenso dos módulos de comunicação, acima de qualquer outra coisa que eu já tinha visto em um projeto como esse.

Continuando nessa pesquisa/estudo/experiência comecei ontem a noite a estudar como analisar a formação dessas redes entre os monitores a partir de suas conversas nos fóruns disponíveis pelos diversos tópicos do curso. O Gus havia me dado um toque de que estava ocorrendo um tipo de conversa interessante/intensa por ali, dado a percepção que ele estava tendo nos encontros de formação presencial com os monitores, pelos papos que estava ouvindo na reunião com as equipes de cada polo. Deu um tempo, resolvi investigar isso.

O fato é que o modo que o Moodle dificulta muito as coisas pela maneira com que ele guarda os dados na na sua tabela de fórum. A tabela onde conseguimos extrair as conversas é chamada de mdl_forum_posts, que organiza as mensagens em colunas chamadas: "discussion", "parent", "user", "created", "subject" e "message", entre outras que importam menos para o que queria fazer por aqui. A coluna discussion guarda o número de uma thread de conversas, ou seja, o número de um tópico qualquer criado dentro de um fórum. A coluna "parent" guarda o número do fórum onde ocorreu a conversa. A coluna user guarda o usuário que postou naquela discussão, repetindo a discussão e o usuário caso haja repetição de qualquer um deles. A coluna created guarda o timestamp (horário em formato Unix) de quando a postagem foi feita e as colunas subject e message guardam o título e o conteúdo da postagem.

A complicação é que, diferente das tabelas de mensagens online, não temos diretamente do Moodle uma listagem de relacione quem conversou diretamente com quem. Dado isso, montei um script em PHP que monta essa correlação de quem conversou com quem. A ideia básica desse script considerar que todo mundo que postou numa discussão conversou com todo mundo nessa discussão, formando um grupo que interage entre si a partir dessa discussão. Sem dúvida, podemos montar isso de outra forma, considerando o tempo de postagem ou outros critérios para como relacionar as pessoas. É algo que pretendo explorar a partir desse estudo inicial. O script lê os dados de um arquivo que contêm basicamente duas colunas: número da discussão e id do usuário que postou na discussão. Ele monta para cada discussão um array e depois faz uma combinação entre todos os usuários desse array, exibindo na tela para uso posterior.

Segue aqui o script:


function possibilities ($input) {
 
  for ($contador=0;$contador<=count($input);$contador++){
    $elementoatual = array_shift($input);
    foreach ($input AS $current) {
        if (!empty($input)) {
        printf("%d,%d
",$elementoatual,$current);
            }
        }       
    }
 }

    $fh=fopen('c:\xampp\htdocs\arquivos\forum.csv','r');
    $dados = array ();
   
    while (list($discussao,$pai,$usuario,$timestamp) = fgetcsv($fh,1024,',')){
       
        // cria um array temporário com as duas variáveis coletadas
        $arraytemp = array($discussao,$usuario);
       
        // acrescenta o array temporário num array que vai agregar todos os dados do arquivo.
        array_push($dados,$arraytemp);       
    }
   
    //indexa o array pela primeira dimensão, no caso, pelo campo da discussão
    sort($dados);
   
    $contador=0;      
    $discussaoux=9999999;
    $acumulaarray = array();
    foreach ($dados AS $dado){
   
        if ($dados[$contador][0]!=$discussao) {         
            $discussao=$dados[$contador][0];
            possibilities($acumulaarray);
            $acumulaarray = array();
        }    

        array_push($acumulaarray,$dados[$contador][1]);
        $contador++;

    }
   
    fclose($fh);
    ?>;
       

Só para ilustrar os primeiros utilizando esse script para montar um arquivo no formato Pajek, segue a primeira imagem da rede que gerei ontem a noite:





Alguns dados interessantes sobre ela, limpando loops e múltiplas conexões entre pares:
  • grau médio de conexão: 27,44
  • diâmetro da rede: 13 (maior distância entre dois pontos).
O próximo passo é começar a detalhar essa análise, buscando descobrir como o fórum tem sido apropriado pelos monitores, pelos tutores e equipes de polos, analisando as possíveis diferenças regionais que podem se desdobrar em diferentes estratégias de como cada polo tem utilizado/ocupado esse ambiente.