sábado, 26 de junho de 2021

Passando parametros de retorno do Moodle para um URL externo

 Depois de algum tempo sem alimentar o blog, fui desafiado a criar um mecanismo de navegação entre o Moodle e uma página HTML externa, de forma que um parâmetro "URL de retorno" seja enviado quando o aluno clicar no link dentro do Moodle. Para compreender este exemplo você precisa de alguns conhecimentos básicos sobre HTML e Javascript. 

O contexto anterior era que ao acessar a página HTML o usuário sai do Moodle e passa a navegar dentro da página HTML externa sem qualquer vinculo como o Moodle, e quando ele quer voltar não ha link/botão para voltar, ou há um link/botão criado de forma estática no código impedindo que vários cursos usem a mesma página HTML. 

Para este exempo vamos utilizar a ferramenta nativa URL do moodle presete em todas as versões.



Este recurso permite adicionar um url/link de uma página externa e é aqui que nós iremos adicionar o parâmetro de retorno. 





Nós iremos editar o recurso "URL externo" para  adicionar um parametro de retorno da seguinte forma:
https://paginaexterna.com.br/apostia/modulo1.html?return=https://mymoodle.com.br/course/view.php?id=51

 


Se desejar você pode também passar alguns outros parâmetros pré-programados disponíevis no Moodle, como nome do aluno, nome do curso, e-mail, dentre outros. Mas infelizmante dentre as opções disponíveis não existe um parametro para URL de retorno. 


Feito isso vamos acessar o link gerado pelo Moodle e obeservar os parâmetros que serão enviado para a página HTML externa. É obvio que você precisa ser editor da página HTML para que ela possa receber e interpretar esses parâmetros, caso contrário não terá nenhum efeito enviar um parâmetro para uma página que não está preparada para recebêlos. 


Do outro lado usando o Firebug ou Ferramentas do Programador do Crome podemos observar que os parâmetros desejados foram corretamente enviados para a página HTML pelo método HTTP GET na URL. 


Agora é só usar uma função Javascript para salvar essa informação em um cookie do navegador e usá-la quando necessário. Criei um exemplo bem simples usando Javascript para criar um link de retorno na página. Primeiro eu inseri duas funções Javascript para facilitar cirar e recuperar cookies. 

<script>
function setCookie(cname, cvalue, exdays) { 
  const d = new Date();
  d.setTime(d.getTime() + (exdays*24*60*60*1000));
  let expires = "expires="+ d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(cname) {
  let name = cname + "=";
  let decodedCookie = decodeURIComponent(document.cookie);
  let ca = decodedCookie.split(';');
  for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
  c = c.substring(1);
}
if (c.indexOf(name) == 0) {
  return c.substring(name.length, c.length);
}
  }
  return "";
}

</script>

Agora na página HTML vamos recupear os parâmetros e salvar cada variável em um cookie que fica armazenado temporáriamente no navegador do usuário. Faça isso na página inicial ou index do seu site, não precisa repetir esta operação em todas as páginas, somente onde irá receber os parâmetros vindos do Moodle.

<script>

const urlParams = new URLSearchParams(window.location.search);

//Recebe um parâmetro e salva em cookie no navegador do usuário
setCookie("urlReturn", urlParams.get('return'));

//Redireciona para a tela inicial do recurso html
window.location.href = "modulo1/aula1.html";  

</script>

 

 Agora precisamos recuperar o parâmetro e adicionar no código da página de forma dinâmica. Segue um exemplo de como poderá recuperar o parâmetro salvo no cookie e adicionar dinâmicamente a um link no código HTML. Este procedimento deverá ser repetido em todas as páginas que forem mostrar o link "Retornar ao Moodle". 

<body>

<p id="linkVoltar"></p>

</body>

<script>

document.getElementById("linkVoltar").innerHTML =  '<a href="'+getCookie("urlReturn")+'" >Retornar ao Moodle</a>';

</script>


O resultado será um link com com o URL de retorno para o Moodle, assim será possivel navegar até uma página HTML externa e voltar para o mesmo curso no Moodle, a mesma página pode ser usada por vários cursos diferentes e até instalações Moodle diferentes. Também é possível cirar um link par seguir para próxima atividade sem que o aluno precise alternar abas do navegador, evitando que ele se perca na navegação. 

 


E da mesma forma você poderá usar outros parâmetros como nome do aluno, nome do curso, um identificador do aluno, etc. Neste exemplo, vamos dar boas vindas ao aluno: 



Com este exemplo você já conseiguirá direcionar o aluno a uma página HTML externa, enviar alguns parâmetros e criar um link ou botão de retordo para o curso no Moodle ou próxima atividade.  Daí em diante é com a sua criatividade, faça bom proveito. 

Infelizmente esta opção não permite que a página HTML devolva parâmetros para o Moodle, mas existem outros recursos que podem fazer isso, mas não trataremos nesse post, farei outro em breve, prometo.

Atenção: 

Faz-se necessário obsevar que parâmetros sigilosos ou que comprometam a privacidade não devem ser enviados dessa forma a uma página extena sem os devidos cuidados de segurança.O URL de retorno não compromete a seguraça pois ao retornar ao Moodle este irá exigir autenticação do aluno para permitir que ele acesse o curso, caso contrário o Moodle irá recusar o acesso. 

terça-feira, 14 de julho de 2020

Tabela de logs muito grande

Tive problemas com tamanho da tabela de logs, com mais de 80 milhões de registros, vou registrar aqui rapidamente a solução, depois volto para detalhar melhor.

A primeira ação foi Particionar a tabela mdl_logstore_standard_log no MySql, só esta tabela está ocupando 27GB. A opção de limpar os logs não foi considerada, pois por política adotamos manter os logs por pelo menos 5 anos. Para otimizar as consultas e consumo de memória no MySql optamos pelo particionamento usando a seguinte operação:

IMPORTANTE: Faça uma backup da sua base de dados antes de executar essa query e colocar o Moodle e modo manutenção, este processo pode ser demorado dependendo da quantidade de dados.

ALTER TABLE mdl_logstore_standard_log
PARTITION BY RANGE (id)
(  
    PARTITION p0 VALUES LESS THAN ( 20000000),
    PARTITION p1 VALUES LESS THAN ( 40000000),
    PARTITION p2 VALUES LESS THAN ( 60000000),
    PARTITION p3 VALUES LESS THAN ( 80000000),
    PARTITION p4 VALUES LESS THAN (100000000),
    PARTITION p5 VALUES LESS THAN (120000000),
    PARTITION p6 VALUES LESS THAN (140000000),
    PARTITION p7 VALUES LESS THAN (160000000),
    PARTITION pn VALUES LESS THAN MAXVALUE
);

quarta-feira, 27 de julho de 2016

Acessibilidade no Moodle

     Para começar o conceito de ACESSIBILIDADE é muito amplo e faz referência à POSSIBILIDADE DE ACESSO a local físico ou a informação. A possibilidade de acesso pode variar conforme a capacidade física de cada indivíduo sendo necessária a criação de ALTERNATIVAS para se garantir o pleno acesso a todos, tanto em espaços físicos quanto virtuais. 

     Da mesma forma que uma escada pode representar uma BARREIRA que impede o acesso de um cadeirante a uma sala de aula, uma imagem sem descrição textual em um curso on-line pode impedir uma pessoa cega de compreender uma informação visual e também um vídeo sem libras ou legenda pode impedir uma pessoa surda de ter o entendimento completo do conteúdo audiovisual. 

     Antes de entrar na leitura das recomendações da W3C e do E-Gov é importante entender quais são as principais limitações, barreiras e alternativas de acesso para o caso de cada usuário. 

Cegos - limitação visual completa, a barreira é a incapacidade de interpretação de todo e qualquer elemento visual tais como imagens, animações e vídeos. Para utilizar computadores utilizam softwares leitor de tela que transformam texto e hipertexto em áudio utilizando um sistematizador de voz e a navegação é inteiramente feita utilizando o teclado. Necessita que imagens e vídeos apresentem descrição textual alternativa ou audiodescrição e a navegação é inteiramente realizada por teclado (ex.: tab e shift+tab) não pode depender do uso do mouse.
Baixa visão - limitação visual parcial, a barreira é a incapacidade de interpretar com nitidez elementos visuais como imagens, animações e vídeos. Para utilizar computadores precisam aumentar o tamanho e contraste dos elementos visuais. Necessitam que o site permita aumentar o tamanho de fontes e imagens e também aumentar o contraste pela mudança da cor de fundo. A baixa visão também é comum a pessoas idosas e com vista cansada.
Surdos - limitação auditiva completa, a barreira é a incapacidade de interpretação de elementos em áudio e audiovisuais. Para utilizar computadores necessitam que haja alternativas textual, tal como legenda, ou libras para os elementos auditivos.
Déficit auditivo - limitação auditiva parcial, a barreira é o volume do áudio sedo necessário dispositivo para controle de volume, equipamento headfone individual ou aparelho auditivo auricular.
Limitação motora -  a barreira mais comum é a incapacidade de utilização de mouse e teclados, sendo necessários outros hardwares que permitam o controle da navegação aproveitando o movimento dos pés, da cabeça, da boca e dos olhos. Normalmente esses hardwares utilizam sequência de navegação semelhantes aos do teclado.

      Ao construir um site ou um software é fundamental que se tome alguns cuidados para garantir que o CÓDIGO, a NAVEGAÇÃO  e o  CONTEÚDO sejam acessíveis para a maioria dos utilizadores, se for um site governamental ou com finalidade educacional as recomendações de acessibilidade tornam-se obrigatórias. As recomendações da W3C em português podem ajudar nessa tarefa (https://www.w3.org/Translations/WCAG20-pt-br). 

     Faz-se necessário destacar que para garantir ACESSIBILIDADE a um site não é necessário sacrificar nenhuma funcionalidade que se pretenda fazer, mas em alguns casos será necessário construir mais de uma forma de navegar e de apresentar uma uma determinada informação.

Vamos aqui comenta algumas das recomendações para construção do código do site minimamente acessível:

Conteúdo alternativo - a descrição textual de imagens, legendas, audiodescrição de vídeos/animações e texto alternativo são opções complementares para garantir máxima acessibilidade à informação. Mas é importante ao publicar o conteúdo no site que se realize o correto preenchimento do conteúdo alternativo, nas versões mais recentes do Moodle, por exemplo, o texto alternativo e título dos arquivos passaram a ser obrigatórios, mas é raro quem tem a preocupação de preencher corretamente esta informação.
Navegação disponível por teclado -  garantir a possibilidade de navegação via teclado é garantia da possibilidade de navegação por meio de software leitor de tela e também outros hardwares de navegação disponíveis no mercado. Ações dinâmicas que dependam dos eventos onmousclick e onmousouver são impossíveis de serem acessados via teclado, mas isso não impossibilita o seu uso desde que haja também outra forma de navegação também via teclado.
Fornecer opções simplificadas de navegação - a criação de atalhos de navegação com a utilização de ancoras e a disponibilização de um mapalink simplificado do site também podem facilitar a navegação.

     Por ser tão importante vale a pena aprofundar um pouco no diálogo sobre a DESCRIÇÃO TEXTUAL de imagens  e elementos gráficos como logos, botões, gif animado, ícones, smiles que representem algum significado necessário à compreensão da mensagem devem apresentar um texto alternativo que a descreva. É importante ter atenção na hora de fazer uma descrição textual, pois a mesma imagem pode ser descrita de formas diferentes a depender do contexto que a mensagem está inseria. Nó código a descrição textual é colocada dentro da tag IMG podendo ser inserida dentro do atributo TITLE ou ALT, mas se você estiver utilizando algum sistema como Moodle basta acrescentar a descrição no momento que fizer up-load da imagem que ela será incorporada ao conteúdo no momento da apresentação. Mas em alguns casos a descrição textual pode ser tão útil que pode ser inserida também como LEGENDA como nos exemplos à seguir:

Legenda 1: Carro fazendo uma curva

Legenda 2: Carro fazendo uma curva acentuada em pista molhada mostrando o limite de atrito dos pneus.

Legenda 3: Carro com faróis acesos em atenção à nova legislação de trânsito.

Legenda 4: Pista molhada em dia de treino de corrida automobilística.





     Caso tenha interesse em aprofundar na leitura sobre a construção de Ambientes Virtuais de Aprendizágem Acessível segue sugestão de algumas experiências para leitura complementar:


domingo, 3 de janeiro de 2016

Módulo Plugin Local

Depois de tentar distorcer as funcionalidades do sistema para atender a demandas específicas, em 2015, eu decidi iniciar os estudos sobre desenvolvimento para Moodle. E observo que as versões mais recentes estão ficando cada vez melhor documentadas e com desenvolvimento mais fácil. Então se você sabe um pouco de PHP vale a pena tentar. 

Aqui existem dois caminhos a seguir. Desenvolver um módulo completo do zero ou criar um clone de algum módulo já existente e fazer modificações para que te atenda.   Fazer um clone é muito simples, basta copiar o módulo para a pasta de execução, renomear ele, e alterar o nome dele no clódigo (eu utilizo o Notpad++ para localizar e substituir em lote todas as ocorrências que o nome do módulo aparece no código) e por ultimo trocar o nome do arquivo de linguas. Isso é muito bom para fazer pequenas alterações em alguma funcionalidade do sistema e evita modificar a estrutura core. Em um outro momento falarei mais detalhadamente sobre esse método. 

Mas tem alguns momentos que você precisa desenvolver algo maior, um módulo completamente novo que não cabe da estrutura padrão. Desde as primeiras versões do Moodle já foi lançado um tipo de módulo curinga para o Moodle chamado simplesmente de "Local", até a versão 2.7 parece que ele não tinha decolado ainda, mas foram feitas alguns modificações importantes na sua API que vem tornando interessante e transforma o Moodle numa forte framework de desenvolvimento. Digo isso pois antes quando você precisava desenvolver algo diferente era mais fácil desenvolver tudo em algum framework externo e integrar de alguma forma com o Moodle. Agora não, você pode desenvolver tudo dentro do Moodle mesmo, utilizando a sua API e ainda estendendo e incorporando novas APIs. 

Eu até tentei localizar um modelo de Modulo Local para desenvolvimento, mas não encontrei. Então, a partir da documentação oficial (https://docs.moodle.org/dev/Local_plugins), iniciei a desenvolver um projeto aberto com um modelo base para iniciar um projeto qualquer. Você pode verificar e até contribuir em: https://github.com/exavier28/localframework

sexta-feira, 30 de outubro de 2015

Gestão de Inscrição em Cursos no Moodle

É hora de falar um pouco sobre os mecanismos de inscrição em cursos do Moodle. Cada instituição ou projeto possui uma forma particular de selecionar a entrada de alunos em seus cursos, o Moodle oferece algumas formas padrão, porém é possível ir um pouco além e utilizar formas mais personalizadas e até mesmos desenvolver um plugin específico.

Técnicamente a inscrição é uma ação em que o sistema vincula um usuário (id_user) a um curso (id_curso) e atribui um papel (perfil) e consequentemente um conjunto de permissões a ele.

E no Moodle existem uma diversidade enorme de módulos com diferentes fluxos de inscrição nativos, outros na biblioteca da moodle.org ou você pode ainda criar o seu próprio módulo se souber um pouco de programação PHP ou ainda você pode desenvolver em um sistema externo todo o seu fluxo de inscrição ao final fazer a importação desses dados para o Moodle.

Nesse momento veremos alguns módulos módulos padrão de inscrição no Moodle 2.8. Ele apresenta uma lista de plugins de inscrição (enrol) instalados mas desativados que podem ser ativados caso seja necessário.

O padrão obrigatório é o "Inscrições Manuais" em que  administrador ou professor poderá localizar usuários já cadastrados e realizar o seu vinculo a um curso. Nesse caso a aluno não tem opção de se inscrever, somente poderá ter acesso ao espaço virtual de curso após alguém inscrevê-lo manualmente. É um mecanismo simples porém existe um grande trabalho manual, nada é automatizado.
Mas para quem tem interesse em criar mecanismos automatizados de entrada de alunos existem uma diversidade de plugins para isso. O plugin de "Auto Inscrição" permite ao professor criar uma senha e passar aos seus alunos, quando ele acessar a plataforma e digitar a senha no ato da inscrição isso irá filtrar e permitir a entrada apenas dos portadores dessa senha. Isso já evita a necessidade de ter alguém inserindo alunos manualmente.
Agora se você já possui algum Sistema de Gestão Acadêmico (SGA), WebSite, E-comerce ou outro sistema uma boa opção é o plugin "Base de dados externa". Ele permite acesso SQL a um banco de dados externo e sincronizar uma lista de usuários inscritos que é verificado periodicamente por uma rotina CRON do Moodle. Esse é o mecanismos mais simples de integração do Moodle com um outro sistema que faz a inscrição, e eu irei aqui detalhar passo a passo essa integração.

Tendo em vista que cada sistema tem uma estrutura de banco distinta, primeiro você deverá criar uma Viwer do banco de dados do sistema que deseja exportar e mantê-la atualizada frequentemente. Para isso você pode criar uma rotina interna em seu banco de dados ou um script ativado via CRON para manter essa Viwer sempre atualizada.  O Moodle irá importar os dados de inscrição diretamente dessa Viwer. Segue um exemplo, mas você deverá personalizar essa saída de dados conforme a estrutura do seu banco. Uma dica válida é identificar o usuário pelo metadado e-mail que geralmente é utilizado nesses sistema e também no Moodle. Mas você pode utilizar outros identificadores, podendo salvar um identificador como CPF no IdNumber do cadastro no Moodle e pareando com a sua Viwer.

CREATE VIEW InscricaoExport AS    
  SELECT     cadastro.emailuser,    
           cadastro.email,         
           inscrito.nomebrevecurso

  FROM        
           cadastro, inscrito
Para configuração do módulo você irá informar o formato de conexão com o banco de dados, no exemplo eu escolhi MySqli e informei o caminho do banco de dados, usuário e senha. Mas existem uma grande variedade de tipos de bancos de dados que ele se conecta. As imagens abaixo ilustram as telas de configuração.




Com isso quando o CRON for executado ele irá fazer a varredura na base externa, verificar os novos usuários inscritos e fazer a sincronização. Faz-se necessário destacar que o usuário deve existir em ambas as bases de dados, caso não exista é possível realizar um outra rotina para sincronização da base de usuários chamada "Autenticação em base de dados externa" com sincronização de usuários cadastrados.

Com essa dica você poderá ir além do básico, e começar a desenvolver integração do seu Moodle com algum sistema externo como um Sistema de Gestão ou até mesmo com um E-comerce para que possa ter rotinas aromatizadas de entrada de alunos nos seus cursos. 

Por hoje, esta é a minha contribuição.
Atc, Eduardo Xavier.

quinta-feira, 25 de outubro de 2012

Gestão de permissões no contexto de atividades


É muito comum o professor desejar mudar as regras de uma determinada atividade ou de todas as atividades do seu curso, mesmo que as regras globais da plataforma sejam diferentes. As regras globais são definidas pelo Admin seguindo, geralmente, políticas institucionais. As regras do Curso geralmente herdam as configurações globais (trataremos disso em outra publicação).  Neste post trataremos no menor contexto de permissão que possibilita mudar as regras de uma atividade sem interferir nas demais atividades do curso ou da plataforma.

Por exemplo, a regra global é “permite que alunos possam responder em fórum mas não podem iniciar novas discussões”. No contexto do Curso essa regra é herdada do contexto superior (global) e a regra é mantida. Mas o professor quer que os seus alunos possam “iniciar novas discussões” em um determinado fórum sem interferir ou afetar o funcionamento dos demais fóruns do curso e da plataforma.

É possível mudas as configurações localmente desse fórum, ou de qualquer outra atividade, para adaptá-la às necessidades específicas pretendida pelo professor. Primeiramente vamos comparar as configurações de permissão para essa permissão ou “capacibility” nos 3 contextos: global, curso, atividade.

Contexto: Global
Admin do site >> Usuários >> Permissões >> Definir Funções >> Estudantes

Contexto: Curso
Admin do curso >> Designar funções >> Sobrepor permissões >> Estudantes

Contexto: Atividade
Curso >> Ativar Edição >> Atualizar Atividade (fórum) >> Sobrepor permissões >> Estudantes


Observe que a determinada permissão está como “proibida” no contexto global. Já no contexto do Curso está como “Não atribuída”, que é o mesmo que herdar do contexto superior, no caso o global. E por ultimo está como “permitida” no contexto menor, da referida atividade. Assim, nesse determinado fórum, os estudantes podem “iniciar novas discussões” sem afetar o funcionamento dos demais fóruns do curso e da plataforma.

O mesmo pode ser feito para as diversas outras ações possíveis para o fórum, tais como: acrescentar notícia, criar anexos, cancelar todas as mensagens, editar qualquer mensagem, avaliar mensagens, etc.. As ações possíveis para outras atividades podem variar conforme a dinâmica de cada atividade, tais como fórum, questionário, wiki, glossário, tarefa, etc. E você pode também modificar as permissões locais para qualquer função, seja ela de tutor, estudante, moderador e outros.

Dica:

É muito comum o professor desejar que os alunos possam responder a um fórum num determinado período, mas em um determinado momento ele deseja impedir novas postagens mas permitir que os alunos tenham acesso aos diálogos antigos para consulta. A única forma de fazer isso é, iniciar o fórum permitindo novas discussões no referido fórum e, mais adiante, mudar essa configuração para proibir iniciar novas discussões. Assim ele pode mudar a regra no meio do processo, potencializado ainda mais as possibilidades de uso educacional das ferramenta conforme as necessidades do plano pedagógico.

domingo, 22 de abril de 2012

Exportar nota de um curso para outro no MOODLE


Em muitos contextos é necessário dividir um curso grande em vários ambientes virtuais no Moodle compondo vários módulos ou disciplinas. Isso permite uma melhor gestão de cronograma e de usuários no seu curso, mas em contrapartida as notas são distribuídas e você precisará de alguma estratégia para agrupá-las novamente. Uma forma de fazer isso é exportar a tabela e notas no formato XML e importar em um outro ambiente de curso ou metacurso.