Ir para o conteúdo

 Voltar a OpenACS: Des...
Tela cheia

Problema com encoding no news-aggregator

13 de Fevereiro de 2008, 14:30 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 36 vezes
Oi gente, meu nome é vitor e sou novo na comunidade. Estou montando um site em dotlrn para a Secretaria de Patrimônio da União – MP. Instalei o pacote news-aggregator no meu site e tive um problema: estou pegando um feed em LATIN 1 e meu banco está em UNICODE. Mudei o arquivo  “packages/news-aggregator/sql/postgresql/news-aggregator-create.sql” com as funções de conver do postgres para:

create or replace function na_source__new ( 
...
        insert into na_sources ( 
...
       ) values ( 
                v_source_id, 
                p_package_id, 
                p_owner_id, 
                p_feed_url, 
                p_link, 
                convert(p_title using utf8_to_iso_8859_1), 
                convert(p_description using utf8_to_iso_8859_1), 
                p_updates, 
                p_last_scanned, 
                p_last_modified 
        ); 

Isso até que funcionou. Mas depois de um tempo, quando o News Aggregator faz um update, o título a descrição são novamente escritas no banco usando LATIN 1. Eu não faço idéia de onde devo mudar para solucioar esse problema. Alguém sabe?

Obrigado, Vitor

Autor: Vitor Reis


1919 comentários

  • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
    13 de Fevereiro de 2008, 15:55

     

    Vítor,

    o OpenACS utiliza um procedimento agendado para atualizar os feeds gravados no BD. Procedimentos agendados são registrados para cada pacote via o procedimento ad_schedule_proc.

    Dentro do diretório tcl do news-aggregator procure um arquivo com final -init.tcl para verificar qual o procedimento agendado que é responsável pelo update. A partir daí vc consegue rastrear via api-doc onde realizar a mudança.

    Mas veja que o problema não deve estar na gravação/recuperação dos dados no database. O problema deve estar na renderização dos caracteres latinos pelo AolServer quando vc visualiza o feed gerado pelo news-aggregator.

    Acredito que o melhor ajuste não seria alterar as stored procedures do news-aggregator, ao invés disso vc poderia olhar como o pacote feed-parser monta o feed a partir dos dados gravados no database para que ele seja servido pelo AolServer. O feed-parser é o service do openacs para criação de RSS/ATOM

    • D6827fdfa8a02708ad4351960349710b?only path=false&size=50&d=404Vitor Reis(usuário não autenticado)
      13 de Fevereiro de 2008, 16:41

       

      Opa, esqueci de comentar: não encontrei nenhum arquivo -init.tcl na minha versão, nem nada referente dentro de qualquer arquivo :(

       Eu achei que o problema fosse na gravação/recuperação porque quando eu visualizo a tabela na_items no banco, eu vejo lá os dados gravados com um encoding diferente.

       Bom, agora deixa eu ver se entendi o que você disse (hehe, como falei sou novo nesse mundo), o ideal seria tratar o feed que eu recebo, certo? Eu até pensei nisso, mas como? Seria pelo arquivo:

      packages/news-aggregator/tcl/news-aggregator-procs-postgresql.xql ?

      Obrigado pela ajuda!
       

      • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
        13 de Fevereiro de 2008, 16:54

         

        Exato! vc entendeu corretamente, o correto é tratar o feed que o news-aggregator recebe. Quem faz isso é o pacote feed-parser que usa o tDOM para ler o arquivo.
         

        E, como eu suspeitava, o problema está na definição do feed que vc pegou, ou melhor na (in)definição.

        Vá até o feed original e peça para exibir o código fonte. Vc vai ver que o cabeçalho do feed é omisso quanto a codificação do arquivo. Ele declara apenas

        <?xml version="1.0"?>
         enquanto deveria declarar

        <?xml version="1.0" encoding="ISO-8859-1"? >

        Então o feed-parser está tratando o feed que o news-aggregator recebe como o padrão que é UTF-8.

        Dê uma olhada na procedure  feed_parser::parse_feed no API-DOC. O código está bem esclarecedor e tem até o seguinte comentário

        # Unless we have explicit encoding information, we'll assume UTF-8

        Agora, o ideal mesmo seria pedir pro povo a Agência Brasil arrumar o feed que eles estão disponibilizando :-)

        • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
          13 de Fevereiro de 2008, 17:08

           

          Hummm... pela versão do seu news-aggregator vc deve estar usando código do branch oacs-5-1 no cvs (vc está usando qual distro dotlrn? 2.1, 2.2 ou 2.3?)

          Dei 1 olhada, o arquivo -init.tcl não está lá. O agendamento está sendo feito direto no arquivo tcl/news-aggregator-procs.tcl. Vc vai ver lah o agendamento dessa forma:

          # schedule hourly updates ad_schedule_proc 600 na_update_sources 

          O correto é que isto esteja em um arquivo -init.tcl. Isso foi consertado no branch oacs-5-2 do CVS. Mas não atualize por que eu não sei da compatibilidade com a distro dotlrn que vc está usando...

        • D6827fdfa8a02708ad4351960349710b?only path=false&size=50&d=404Vitor Reis(usuário não autenticado)
          26 de Fevereiro de 2008, 10:47

           

          Fala Orzenil, fiquei um tempo aqui tentando quebrar a cabeça, mas não tive muito sucesso. Realmente parece ser isso que você falou. Mas ao tentar com esse feed: www.​esta​dao.​com.​br/r​ss/u​ltim​as.x​ml também me deu o mesmo erro, e o estranho que esse feed tem declardo que está usando encoding de utf8, e mesmo assim está dando erro no meu portal. Ah, já limpei a base, o sql e o tcl que tinha modificado. Você poderia testar no seu se também dá esse erro?

           De qualquer forma, olhei e não consegui fazer com que o feed-parser modificasse o seu comportamento. Tentei algo como:

              # Unless we have explicit encoding information, we'll assume UTF-8
              if { [regexp {^[[:space:]]*<\?xml[^>]+encoding="([^"]*)"} $xml match encoding] } {
                  set encoding [string tolower $encoding]
                  set tcl_encoding [ns_encodingforcharset $encoding]
                  if { $tcl_encoding ne "" } {
                      set xml [encoding convertfrom $tcl_encoding $xml]
                  }
              } else {
                          set encoding [string tolower 'ISO-8859-1']
                  set tcl_encoding [ns_encodingforcharset $encoding]
                  set xml [encoding convertfrom $tcl_encoding $xml]
                  }

          mas não consegui nada :/ Sei que devo estar
          errando o tcl, só não consigo ver onde.

          Obrigado pela ajuda!

          • 12cf2da8b1a1753868c7e20816b7dab5?only path=false&size=50&d=404Eduardo Santos(usuário não autenticado)
            26 de Fevereiro de 2008, 11:08

             

            Vitor, aí vai uma dica que pode ajudar: vamos tentar debugar o valor que você está recebendo de encoding.

            Na linha com o seguinte comando: 

               set encoding [string tolower $encoding]

            Adicione o seguinte código:

            ns_log Notice "O encoding é: $encoding"­

            Ele vai escrever no log o valor de encoding que você está recebendo, aí você pode verificar se a codificação recebida está correta. Detalhe importante: todas as vezes que alterar um arquivo na pasta /tcl é necessário recarregá-lo no link /acs-admin/apm.

            • D6827fdfa8a02708ad4351960349710b?only path=false&size=50&d=404Vitor Reis(usuário não autenticado)
              26 de Fevereiro de 2008, 12:11

               

              Fala eduardo, obrigado pela ajuda, principalmente com essa parte de debug :p

              Então, parece realmente que o news-aggregator não usa então o feed-parser. Coloquei o ns_log e ele não me voltou nada a cada troca de feed, ou atualização.  Vi que o news-aggregator tem uma função chamada
              na_parse, e parece que tudo é feito por lá. Coloquei o ns_log lá e toda vez que algum feed é adicionado ou atualizado ele retorna algo.

              Agora preciso descobrir como reencodar tudo :/ Basicamente ele só tem um tratamento de erro e um

               return $result

              Tentei a mesma coisa que tinha postado aqui antes, mas não deu...

              set encoding [string tolower ISO-8859-1]
              set tcl_encoding [ns_encodingforcharset $encoding]
              ns_log Notice "Feed parsing in NA with encoding $encoding"
              ns_log Notice "Feed parsing $result"
              return [encoding convertfrom $tcl_encoding $result]
              O log me aparece tudo ok, me volta o encoding usado, dá a mensagem de encoding carregado, me volta o $result , mas pelo que parece não converte. Alguma ajuda? :/

              Obrigado gente!

          • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
            26 de Fevereiro de 2008, 13:01

             

            ­Vitor,

            cara, a versao que vc ta usando e muuuito antiga. Dei uma olhada no cvs para o código na sua versão e realmente o news-aggregator não usa o feed-parser na versão 0.5.

            Para inserir os itens do feed ele simplesmente faz uma chamada ao procedimento na_parse enquanto na versao que uso ele chama o procedimento feed_parser::parse_feed.

            Experimente o seguinte. Na definição do procedimento na_parse, no arquivo news-aggregator-procs.tcl adicione o tratamento para encoding logo no inicio do corpo do procedimento.

            Antes de

            if { [catch {

            adicione

            if { [regexp {^[[:space:]]*<\?xml[^>]+encoding="([^"]*)"} $xml match encoding] } {
            set encoding [string tolower $encoding]
            set tcl_encoding [ns_encodingforcharset $encoding]
            if { $tcl_encoding ne "" } {
            set xml [encoding convertfrom $tcl_encoding $xml]
            }
            }

             

            Depois não esqueca de recarregar o arquivo indo até seuh​ost/​acs-​admi​n/ap​m e clicando em Watch all files, para o pacote news-aggregator. 

            • D6827fdfa8a02708ad4351960349710b?only path=false&size=50&d=404Vitor Reis(usuário não autenticado)
              26 de Fevereiro de 2008, 18:23

               

              Fiz um esforço grande para migrar o meu news-aggregator para uma versão mais nova, mas não tive muito sucesso. Peguei tudo do cvs e ficou dando conflito entre o dotlrn-news-aggregator, o news-aggregator-portlet e o news-aggregator. Depois tentei pegar tudo do branch oacs-5-2 e tb não deu certo. Resultado, voltei tudo para versão que estava e fiz o que você falou Orzenil.

               A dificuldade foi porque pela forma que tá eu não consegui capturar a parte que indica o encoding. Mas dai fiz assim:

              set encoding [string tolower UTF-8]
              set tcl_encoding [ns_encodingforcharset $encoding]
              set xml [encoding convertfrom $tcl_encoding $xml]
               Agora minha dúvida é, existe alguma função no tcl que eu consigo descobrir em que encoding está uma determinada string?

               abs, vitor

  • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
    13 de Fevereiro de 2008, 16:24

     

    Vitor,

    vc pode postar aqui qual o feed que vc pegou? Fiz 1 teste com uma instalação nova do news-aggregator, importei feeds ATOM do br-linux (http://br-linux.org/feed/atom/) e RSS0.91 da folhaonline (http://feeds.folha.uol.com.br/folha/informatica/rss091.xml) e não encontrei problema com codificação..

    Qual a versão do pacote news-aggregator q vc está usando (ver no arquivo news-aggregator.info) ?

  • Ac4d5e1ff9417940e7cdaa02a9abedf2?only path=false&size=50&d=404Rodrigo Proença(usuário não autenticado)
    27 de Fevereiro de 2008, 10:16

     

    oi Vitor,

    vou aproveitar a carona no assuto do pacote do news-aggregator e alertar para usá-lo com moderação :-)

    Tivemos problemas de performance em uma instalação com muitos usuários onde cada comunidade registrava diversos feeds, assim automaticamente a cada curto período o servidor requisitava uma grande quantidade de itens que eram armazenados no banco de dados.

    Com o passar de alguns meses a tabela ficou gigantesca e para renderizar o portal dos usuários que tinham instanciado o portlet do news-aggregator o servidor levava minutos!

    Para remover os itens antigos em lote não havia interface então tivemos que deletar manualmente, operação que pelo tamanho do banco tambem demorou bastante, pensavamos até que o servidor tinha travado.

    Posteriormente fizemos páginas para isso que talves ainda encontre em algum backup perdido em minhas bagunças :-) mais provável e fácil é o Orzenil fazer um novo e melhor!

     Abraço

    • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
      27 de Fevereiro de 2008, 15:10

       

      Bem lembrado, Rodrigo.

      Também não guardei as alterações que fizemos...

      De qualquer forma atualizei os arquivos para download na comunidade acrescentando a ação de exclusão automática de itens antigos. Para manter itens de forma permanente também acrescentei a possibilidade do usuário do news-agreggator  salvar itens dos feeds cadastrados por ele.

      Se desejar aqui estão os arquivos.

      • 12cf2da8b1a1753868c7e20816b7dab5?only path=false&size=50&d=404Eduardo Santos(usuário não autenticado)
        27 de Fevereiro de 2008, 15:39

         

        Orzenil e Rodrigo,

        Muitos dos arquivos antigos eu coloquei aqui no Portal. Será que o news-aggregator que estamos usando aqui foi o que vocês melhoraram? consultei o CVS do OpenACS e não existe a  interface admin, mas no nosso tem. Acho que pode ter alguma coisa a ver. Dêem uma olhada:

        svn.softwarepublico.gov.br/trac/openacs/browser/spb/packages/news-aggregator

        • Ac4d5e1ff9417940e7cdaa02a9abedf2?only path=false&size=50&d=404Rodrigo Proença(usuário não autenticado)
          27 de Fevereiro de 2008, 16:29

           

          oi Eduardo,

          Tem razão; esta é a versão do  pacote modificado por nós. Seria legal se alguem desse um diff e tirasse as diferenças para comitarem nas novas versões.

          Lembro de outro bug que tinha e nós corrigimos referente a um administrador da comunidade adicionar um feed e os outros não conseguiam ver nem remover, pois o objeto era vinculado ao ID do usuário e não do grupo. Não havia a pasta admin mesmo, nós criamos para sanar estes problemas de segurança e permissão.

           A vizualização usando ad_form, o agrupamento e o link na categoria do portlet foram outras melhorias que desenvolvemos para o pacote. 

          • 12cf2da8b1a1753868c7e20816b7dab5?only path=false&size=50&d=404Eduardo Santos(usuário não autenticado)
            27 de Fevereiro de 2008, 16:45

             

            Tirar um diff é relativamente fácil; difícil é conseguir colocar as melhorias na última versão do CVS do OpenACS. Acho que melhor deixarmos assim mesmo, com o código disponível aqui para quem gostar mais.

          • Aaa585a3b5743e24dad5fc7222fdda04?only path=false&size=50&d=404Orzenil Silva Junior(usuário não autenticado)
            27 de Fevereiro de 2008, 16:59

             

            Rodrigo,

            eu concordo com o Eduardo. Essa versão 0.5 do news-agreggator (branch oacs-5-1) já é muito datada e só é relevante para quem usa o dotLRN. 

            A versão disponível em oacs-5-2 ou superior é completamente diferente, utilizando o feed-parser e incluíndo a possibilidade de um usuário gerenciar diferentes agregadores, o que acarreta diferença considerável no data model.

            Acho que o caminho mais interessante seria partir do news-aggregator novo (oacs-5-2 ou HEAD) e torná-lo compatível com o dotLRN caso alguém deseje usar esse pacote em instalações dotlrn-2-2 ou dotlrn-2-3. Particularmente não tenho interesse por que meu saco com o dotlLRN já acabou :-( e eu realmente quero dedicar mais tempo a OpenACS+XoTcl mas se alguém desejar mexer posta aí que a gente ajuda :-)

Oportunidade de Trabalho com OpenACS

9 de Dezembro de 2011, 16:07, por Desconhecido

Domí­nio do ambiente Linux em modo Shell;



Fundamentos de desenvolvimento e criação de comunidades virtuais com o framework OpenACS

28 de Outubro de 2010, 16:51, por Desconhecido

Durante o Latinoware, que será realizado em Foz do Iguaçu entre os dias 10 e 12 de Novembro, será realizada uma oficina sobre desenvolvimento em OpenACS. A oficina é parte da iniciativa de compartilhamento do Projeto Software Público Internacional, e conta com apoio da organização.



Oficina sobre OpenACS em Belo Horizonte

19 de Novembro de 2008, 9:43, por Desconhecido

No dia 27 de novembro de 2008, será realizado durante o Encontro Mineiro de Software Livre, uma oficina para formação de desenvolvedores OpenACS. A oficina tem por objetivo introduzir a ferramenta na cidade e atender a uma demanda crescente por especialistas na área.



Treinamento em OpenACS em Brasília tem sua aula inaugural

10 de Novembro de 2008, 9:43, por Desconhecido

Fruto de uma paceria entre a Lupa Treinamento e a Secretaria de Logística e Tecnologia da Informação do Ministério do Planejamento, começou no último Sábado o terceiro treinamento em OpenACS realizado em Brasília.



Instalacao do OACS 5.3 em Debian e Ubuntu

29 de Janeiro de 2008, 16:52, por Desconhecido

Acaba http://cognovis.de/developer/ou de sair do forno...