Algumas estatísticas do blogue Infraestrutura da Internet (II)

 

Introdução

 

Dicionários em Python é um recurso poderoso. É bom exercitar. Aqui segue um exemplo, na oportunidade que estava verificando a evolução do acesso a este blogue.

Somente exibo as células do Anaconda, outra facilidade incrível.

 

As células do Anaconda com gráficos a partir de dicionários, em Python 3.

 


Figura 1

 


Figura 2

 


Figura 3

 


Figura 4

 


Figura 5

Anúncios

Análise de participação nos encontros do IETF

 

Introdução

 

Há imenso interesse em saber como tem sido a participação da América Latina nas reuniões do Internet Engineering Task Force (IETF), que acontecem três vezes ao ano. Desde o encontro do IETF 72 (27 de julho a 1 de agosto de 2008) realizado em Dublin tem estado disponível os participantes de cada encontro. A URL de acesso a estas informações é padrão e coincide com a do IETF 100, a ser realizado em Singapura em 11-17 de dezembro de 2017, onde somente o número pode ser trocado para atingir o encontro desejado, como ilustra a Figura 1.

 

urlComum Figura 1. URL padrão dos encontros do IETF

A aparência da página mudou ao longo do tempo, mas não de forma radical, como se pode ver na Figura 2 observando o cabeçalho da tabela contida nos encontros 72 e 100, respectivamente.

 

paginaAttendees72-100
Figura 2. Visões dos encontros podem ser diferentes, como se pode ver nas páginas dos encontros IETF 72 e IETF 100, respectivamente.

 

Na página do encontro IETF 100, também aparece a referência “0 on Site“, o que não acontece na do IETF 72. Estas diferenças podem ocorrer em outros momentos sugerindo um cuidado especial no desenvolvimento de um processo automático para obter todos os dados, inclusive dos próximos encontros.

 

Adicionalmente, os recursos aqui tratados serão utilizados na construção do wordIETF, um repositório léxico, semântico e de bases de dados de aprendizagem para o projeto SKAU, ambos já comentados aqui no blogue e que serão revistos oportunamente.

 

Como automatizar o processo de captura dos dados

 

Existem várias formas de fazer isto. Várias técnicas e inúmeras linguagens. neste texto será usada a linguagem Python 3 e a facilidade do módulo Beautiful Soup1,2. Trata-se de uma escolha pessoal, que recaem, entretanto, sobre ferramentas universais. Colaboradores com habilidades mais apropriadas podem aperfeiçoar o que está sendo apresentado pois o material (dados e programas) estão disponíveis no GitHub,   https://github.com/juliaobraga/ietf, com este propósito.

 

Python e Beautiful Soup são ferramentas muito utilizadas e estão disponíveis na Internet com detalhes surpreendentes e não iremos nos preocupar em ensinar nenhuma das duas ferramentas. Apenas faremos comentários úteis sobre algumas facilidades disponíveis na Beautiful Soup.

 

Primeiros passos

 

Inicialmente será analisado o código HTML destas páginas, partindo da premissa que não há diferença entre elas, por enquanto. O código IETF01 da Figura 3 mostra a leitura e gravação do conteúdo da página do IETF 100, usando o “requests” como visto na linha 1.

ietf01-codigo
Figura 3. Código 01: usando o requests para ler o conteúdo HTML da página de inscritos no IETF 100 e gravando em aquivo, o resultado. Embora o módulo BeautifulSoup tenha sido chamado (linha 2), não foi usado neste código.

 

As Figuras 4 e 5 exibem trechos do arquivo gerado pelo código da Figura 3. O arquivo foi modificado manualmente para apresentar de forma clara a hierarquia dos marcadores da linguagem HTML, hierarquia esta, que interessa ao BeautifulSoup.

 

Ietf100-conteudo-01
Figura 4. Trecho inicial do conteúdo capturado. Este cabeçalho não tem nenhum valor para o objetivo desejado.

 

A Figura 4 exibe o cabeçalho do arquivo e o marcador a partir do qual estão as informações que interessam ao objetivo a ser conseguido, usando o BeautifulSoup.

 

Ietf100-conteudo-02
Figura 5. Em (a) mostra o inicio do trecho que interessa começando no segundo, exceto o cabeçalho. Em (b), o final do arquivo exibindo onde terminam os respectivos marcadores.

 

A solução de gravar o documento HTML lido pelo requests, para uma análise da hierarquia, não é a única. Alguns navegadores possuem recursos para tal análise. Por exemplo, o Firefox possui o HttpFox3, muito interessante, como pode-se ver na Figura 6.

 

http-fox
Figura 6. O HttpFox do Firefox, em ação.

 

O recurso Inspecionar do Chrome (do Opera, também) tem um visual e facilidades adicionais bastante atrativos, como mostra a Figura 7.

 

inspecionarChrome
Figura 7. O recurso Inspecionar do Chrome possui vantagens adicionais e visual apropriado para a análise humana, da hierarquia.

 

Como se sabe que há diferenças nas páginas dos diferentes encontros (pelo menos encontramos diferenças entre o IETF 72 e o IETF 100, usaremos o Inspecionar do Chrome para resolver estas dúvidas.

 

Capturando as informações

 

Voltemos à Figura 5.  A segunda <table> tem o cabeçalho formado pela primeira <tr> seguida por marcadores <th> e na sequência, até o final, os  marcadores <tr> contem seis marcadores <td> seguidas por um marcador <th>.

 

A Figura 8 exibe o código Python do resultado final para captura dos dados dos inscritos no IETF 100. A reunião está indicada na linha 57. O trecho acrescentado para a captura corresponde à função analisa_html, compreendendo as linhas 26 a 52.

 


Figura 8. Código 02: aplicando o Beautiful Soup sobre o arquivo HTML obtido pelo código da Figura 3, considerando que se deseja o conteúdo do segundo marcador <table>.

 

Na linha 29 está a chamada do Beautiful Soup para a captura de todo o conteúdo da página de inscritos no encontro do IETF 100. Na linha 31,  o método find_all é executado para encontrar dentro do segundo marcador <table> (observar o índice), todas as ocorrências do marcador <tr> (um outro find_all). Este método find_all retorna uma lista (razão do índice [1] no <table>, já que o primeiro marcador <table> ([0]), não interessa. O for garante que a cada interação, a variável row tenha os marcadores <td> e <th> do marcador <tr>. Para cada row aplica-se, na linha 32, o find_all construindo uma lista (pTD) de seis (6) marcadores <td>. Por garantia, um if verifica se o tamanho da lista pTD é 6, para seguir à frente. A primeira coisa a fazer é obter, ainda de row, o marcador <th>. executando o método find, pois sabe-se que há somente um marcador <th> em row, que na linha 34 coloca na variável profile, o texto do marcador <th>. Se profile é a palavra Click, tem-se uma URL, em um marcador a. Isto está sendo feito nas linhas 36-39. O trecho de código das linhas 41-48, monta um dicionário e concatena cada row obtido na interação do for da linha 31.

 

Para terminar, o Pandas é usado (chamada na linha 3, para construir a tabela com base no dicionário construído pela função analisa_html e grava uma planilha Excel.

 

Considerações e recomendações

 

  • Na comparação feita entre o IETF 72 e o IETF 100 há diferenças no número de colunas, ou no número de marcadores <td> e/ou <th> dentro dos marcadores <tr> (na lista row).
  • Feita a alteração proposta no item anterior, na rotina principal basta um loop de 72 a 100.
  • Os encontros passados são invariáveis. Isto é, não há inconveniência que os dados estejam localmente. Só o encontro atual é variável e a recomendação é tratá-lo de forma diferenciada.
  • Com todos os encontros acessíveis (remotamente ou localmente) é possível responder questões tais como: fulano de tal participou de quantos eventos do IETF? Quais? Remotamente ou “on site“?
  • Expandir as estatísticas para todos os países é uma opção útil.
  • Disposição dos dados de forma a facilitar seu uso em tarefas que envolvam aprendizagem de máquina, por exemplo

 

Referências

 

    1. Leonardo Richardson. Beautiful Soup Documentation. Disponível em  https://www.crummy.com/software/BeautifulSoup/bs3/documentation.html. Acessado em 05/11/2007.
    2. Beautiful Soup Documentation. https://www.crummy.com/software/BeautifulSoup/bs4/doc/
    3. https://addons.mozilla.org/pt-BR/firefox/addon/httpfox/

Datas e outros assuntos

 

Introdução

 

Este texto tem caráter dinâmico, isto é, ele será modificado na medida do possível. Contem uma série de mapas conceituais relacionando eventos e suas respectivas datas, por século. Eventualmente, algumas descrições interessantes poderão ser adicionadas, bem como referências bibliográficas.

 

Século XXI

 

seculoxxi

 

Século XX

 

seculoXX

Alguns dados do Século XX foram obtidos em: Brief History of Machine Learning

 

Século XIX

 

seculoXIX

 

Século XVIII

 

seculoXVIII

 

Século XVII

 

 

Século XV

 

 

Referências

 

  1. Braga, J. P. e Nascimento, C. K., A visita de Marie Curie ao Brasil. Amazon, 2017

O Mathematica é bom de texto

 

Introdução

 

Visualização está em moda. Não é para menos! Há inúmeras ferramentas disponíveis para exibir incríveis representações e uma exemplar revisão sistemática (LENGLER; EPPLER, 2007) exibe A Periodic Table of Visualization Methods. O Mathematica1 (Wolfram Mathematica), com facilidades ampliadas, não fica para trás. Como o interesse deste documento é falar sobre textos, no Mathematica, a Figura 1 mostra algumas alternativas de produzir nuvens de palavras. Para todos os gostos e finalidades.

wordcloudsFigura 1. Variações de nuvens de texto, no Mathematica, sobre a RFC7892 após manipulações no texto original. A função que produz cada uma das variações estão acima da respectiva imagem.

Mas, o que interessa, na realidade é indicar como o Mathematica é incrivelmente apropriado para manipular textos. Alguns exercícios foram feitos durante os estudos preliminares para a construção do WordIETF. Eles serão apresentados, sem a intenção de ensinar o uso do Mathematica.

 

Exercícios sobre o Mathematica

 

Tais exercícios foram executados sobre uma única RFC, a RFC7892. Foi uma escolha arbitrária, a partir das mais recentes. E, mais ainda, não há nenhum propósito adicional, além de mostrar que o Mathematica é bom de texto. Interpretações complementares são deixadas para o leitor.

 

Construindo um dicionário

 

Um dicionário pode ser construido através do Association. Um .Association é contruído pelo Dataset. A figura abaixo ilustra as diversas alternativas de Association, que na realidade é uma List.

 construindoassociation

Sendo uma List, uma série de funções estão disponíveis para produzir procedimentos sofisticados para manipular um dicionário. Este esforço pode ser evitado ao aproveitar uma proposta completa feita em Mangano (2010). Existe, entretanto, alguns problemas na proposta do livro, que foram corrigidas aqui, com a versão apresentada na figura abaixo.

 

dicionariomangano

Uma olhada na figura abaixo permite entender o uso das principais funções desta proposta de dicionário, desde sua criação até sua destruição.

usandodicionario

 

Lendo arquivos textos

 

Entrada e saída é uma das primeiras coisas a se aprender em uma linguagem de programação. Na sua diversidade, o Mathematica é uma linguagem de programação. E ele tem muitos recursos relacionados com entrada e saída. Por exemplo, Import é uma função poderosa. Para este exercício a escolha foi pela ReadList que permite a leitura da RFC7892 em uma lista de “strings”, separadas por caracteres definidos através de WordSeparators. A aplicação está na figura abaixo, com um trecho do resultado.

readlist

 

Populando o WordIETF

 

A aplicação escolhida é simples por razões óbvias. Trata-se de popular o dicionário WordIETF com os acrônimos que aparecem na RFC7892. Pela figura acima vê-se que os acrônimos estão entre parênteses (por exemplo, IETF) e o significado deles, em tese, está nas tantas palavras que o antecedem (no exemplo do IETF, nas cinco palavras anteriores). Em linhas gerais, o nosso algoritmo deve seguir os seguintes passos:

  • Ler a RFC7892 em busca de acrônimos.
  • Determina o tamanho n do acrônimo encontrado
  • Se o acrônimo não estiver no WordIETF, captura as n palavras anteriores e inclui o acrônimo.
  • Remova o acrônimo e seu significado do conteúdo da RFC lida.
  • Repita até que não haja mais acrônimos

 

Na figura abaixo, a preparação para o algoritmo. Em particular, a preparação do WordIETF.

etapaspreliminaresalgoritmo

Duas funções foram criadas com o objetivo de facilitar o algoritmo: verifica se é um acrônimo e retorna na lista para capturar o significado do acrônimo. Elas estão na figura que segue.

funcoes

O algoritmo, que apesar de incorporar experiências pessoais, dispensa maiores comentários e está na figura a seguir.

algoritmo

O resultado da execução do algoritmo está na figura a seguir, em 7 repetições sobre o texto da RFC, com tempo insignificante. Na sequência, o estado do dicionário após a execução.

resultadoalgoritmo

 

wordietffinal

 

Comentários finais

 

Foram muitas as experiências com o Mathematica para manipulação de textos, até porque foi uma exigência parcial de minha última disciplina do doutorado “Tópicos Avançados de Sistemas Computacionais Adaptativos”, com o Prof. Dr. Pedro Paulo Balbi de Oliveira, a quem agradeço as orientações durante a oportunidade. Abaixo, algumas considerações adicionais da experiência e das infinitas possibilidades do Mathematica.

  • Na figura abaixo, um exercício para responder a questão “Como poderia ser organizado o WordIETF?

    wordietforganizacao

  • O Mathematica é uma linguagem de programação funcional2. A maior parte dos exemplos acima foram procedurais. O Mathematica é, também, uma linguagem de programação procedural! Mas, ela é mais eficiente em sua característica funcional. A partir da leitura da RFC, usando a função Map, para tentar retirar os acrônimos, obtemos o seguinte resultado.

    mapinicial

     

    Retirando as cadeias vazias:

    retirandostringsvazios

     

    Combinando as duas funções têm-se o problema resolvido funcionalmente:

    resultadofucional

  • Muitos recursos para acesso a dicionários e sítios importantes externos estão disponíveis, como por exemplo, a Wikipedia. Duas imagens abaixo ilustram algumas alternativas.

    consultaexterna1

    consultaexterna2

 

 

Referências

 

LENGLER, R.; EPPLER, M. J. Towards a periodic table of visualization methods for management. In: IASTED Proceedings of the Conference on Graphics and Visualization in Engineering (GVE 2007), Clearwater, Florida, USA. [S.l.: s.n.], 2007.

MANGANO, S. Mathematica Cookbook. [S.l.]: “O’Reilly Media, Inc.”, 2010.

 


     

  1. http://www.wolfram.com/mathematica/
  2. https://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming

 

s

WordIETF

Introdução

Este texto evolui as preocupações, grosso modo, em dar “inteligência” aos agentes (ou IEs – Intelligents Elements} do modelo AEASD (Autonomous Elements Architecture for Specific Domains), cuja origem foi na dissertação de mestrado e em discussões posteriores (Braga-Filho, 2015) (Braga; Omar; Granville, 2015).

Trata-se de uma evolução, e natural aperfeiçoamento, da contextualização e da maneira de enxergar o problema. É um processo de aprendizagem, contínuo, permanente e natural, na vida de um pesquisador. Como a visão de Charles Darwin1, na sua celebrada e incontestável teoria. Se eu vivesse eternamente, chegaria a um consenso preciso, sobre a questão principal. Não sendo eterno, a contribuição pode interessar aos mais jovens.

A Figura 1 do meu texto “Preparando as RFCs para o UIMA” (https://ii.blog.br/2016/01/08/preparando-as-rfcs-para-o-uima/) sofreu uma pequena alteração e apresenta-se como a Figura 1, a seguir.

 tese-modeloprincipalFigura 1. Novo modelo global.

O que mudou foram as ferramentas (item 5, na figura). O Apache UIMA não é a única ferramenta disponível. Em algumas etapas, mas simples, ele é dispensável. Existem muitas outras! O que torna mais complexo, o tratamento de textos, um assunto muitíssimo difícil, como falam inúmeros autores. Com a linguagem natural nem se fala. Basta ouvir o pensamento de Noam Chomsky1 de que a linguagem natural não constitui um domínio sobre o qual se podem construir teorias científicas coerentes, como escreve Neil Smith2 em seu longo prefácio do “Novos horizontes no estudo da linguagem e da mente” (Chomsky, 2005).

Trata-se neste texto, portanto, incorporar outras reflexões e mostrar a necessidade de se criar um dicionário léxico sobre as RFCs, como o objetivo de facilitar os trabalhos futuros. Este dicionário, em um domínio específico (sobre as RFCs) é similar ao WordNet3, que se nomeou de WordIETF.

Contextualização

Resumindo, o conjunto de dados (textos não estruturados), isto é, o corpora que se deseja incluir no projeto é mostrado na Figura 2.

tese-corpusFigura 2. Corpora que interessa ao projeto final e que deve ser tratado.

Por razões de simplicidade, os exercícios preliminares serão reduzidos a um único corpus, como mostra a Figura 3

tese-corpusunico
Figura 3. Corpus sob o qual a experiência preliminar será feita.

Simplificando, fica mais fácil seguir a proposta mostrada na Figura 4, que mostra a evolução atual do que se tem em mente, para o futuro.

tese-proposta
Figura 4. A atual evolução do modelo e as questões de pesquisa envolvidas: (2), (3) e (4).

O item (1) da figura acima está desenhado na Figura 2 do texto “Preparando as RFCs para o UIMA” (https://ii.blog.br/2016/01/08/preparando-as-rfcs-para-o-uima/). O item (2) representa uma das três questões de pesquisa que, de imediato, leva à criação de um dicionário léxico, WordIETF, consignado a partir do corpus, parte do RFC Editor4.

Como estabelecer o WordIETF

Em um livro bastante interessante sobre processamento de textos (Ingersoll; Morton; Farris, 2013), ferramentas do Apache são indicadas: Hadoop5, Lucene+Solr6 com o PyLucene, Mahout7 e o openNLP8. Tais ferramentas são, realmente, suficientes para resolver desafios no domínio de um texto, como mostra a Figura 5.

tamming-desafios
Figura 5. Desafios na mantipulação de textos.

O UIMA já foi parcialmente testado e as outras propostas da Apache serão verificadas. A Python, com o seu NLTK (Natural Languange Tool Kit), permite sem maiores esforços, a construção do WordIETF e resolver os desafios da Figura 5. Oportunamente serão descritas as experiências.

Uma outra ferramenta, que pode ser até mesmo complementar é o Mathematica4. Pode o Mathematica resolver os desafios e contribuir para a construção do WordIETF? A resposta é sim, com veremos em novos documentos mais à frente.

Conclusões

Trata-se de um projeto de pesquisa que exige a construção de um dicionário léxico, o WordIETF. Observa-se a necessidade de cooperação e contribuições de eventuais interessados.

Uma das maneiras de receber colaboração e contribuições é a divulgação no âmbito do IETF e de outras comunidades interessadas. Neste sentido, caso haja tempo hábil será enviado um I-D para o IETF 96 (Berlim), em julho próximo.

Resultados parciais e dificuldades encontradas, evolução e outras informações úteis serão postas neste blogue.

Referências

BRAGA-FILHO, L. J. Modelo para Implementação de Elementos Inteligentes em
Domínios Restritos da Infraestrutura da Internet
. Dissertação (Mestrado) — Universidade Presbiteriana Mackenzie, São Paulo, SP, 8 2015.

BRAGA, J.; OMAR, N.; GRANVILLE, L. Z. Uma proposta para o uso de elementos
inteligentes em domínios restritos da infraestrutura da internet. In: Anais CSBC, WPIETFIRTF. Recife, Pernambuco, Brasil: [s.n.], 2015

CHOMSKY, N. Novos horizontes no estudo da linguagem e da mente. [S.l.]: Unesp, 2005.

INGERSOLL, G. S.; MORTON, T. S.; FARRIS, A. L. Taming text: how to find, organize,
and manipulate it. [S.l.]: Manning Publications Co., 2013.


1. https://pt.wikipedia.org/wiki/Charles_Darwin
2. https://en.wikipedia.org/wiki/Neil_Smith_%28linguist%29
3. https://wordnet.princeton.edu/
4. https://www.rfc-editor.org/
5. http://hadoop.apache.org/
6. http://lucene.apache.org/index.htm
7. http://mahout.apache.org/
8. https://opennlp.apache.org/index.html
9. http://www.wolfram.com/

Categorias:Apache, IETF, Modelos, TCP/IP, WordIETF

Anaconda

 

Introdução

 

Anaconda é um ambiente fantástico para desenvolvimento. Aqui escrevo algumas dicas do uso individual em meu dia a dia.

 

Dicas diretas

 

  1. Escolha a instalação preferida (Python 3 ou Python2), em https://www.continuum.io/downloads. Eu escolhi a Python 3.
  2. Minha instalação foi em Windows 10, no diretório padrão C:\Users\jb\Anaconda3
  3. Como precisava da Python 2, instalei-a usando o comando conda create -n py27 python=2.7 anaconda. Com este comando, criei o ambiente py27. Portanto, fiquei com dois ambientes: o raiz (com a Python 3) e o ambiente py27 (com a Python 2). Ando nos dois ambientes usando os comandos activate e deactivate. A figura do prompt do DOS abaixo, exibe estes movimentos.

    ambientesanaconda

  4. Como preciso de trabalhar com os dois notebooks ao mesmo tempo, abro duas instâncias do meu navegador principal e dois prompts do DOS. Clico em uma das instâncias do navegador, vou no diretório de instalação e digito notebook jupyter. Tenho neste caso, o notebook com Python 3. Clico na segunda instância do navegador e no outro prompt do DOS digito activate py27 e em seguida notebook jupyter. Tenho então, os dois notebooks desejados. A figura abaixo exibe os dois ambientes.

    doisambientesanaconda

  5. Observem na figura acima, que a R foi instalada no ambiente py27. Foi uma escolha arbitrária da minha parte. Poderia ter sido no ambiente raiz. Típico caso em que o freguês é quem manda!
  6. Numerando as colunas do programa: Na célula, use a tecla L para alternar a numeração das linhas do programa.
  7. CTRL+Enter executa a célula; SHIFT+Enter executa a célula e abre uma nova célula, na sequência.

Preparando as RFCs para o UIMA

Introdução

Uma vez entendido o UIMA segue a aprendizagem sobre ele. Olhando primeira figura do texto Instalação do Apache UIMA (Apache UIMA Installation), vê-se o conjunto de material não estruturado a ser analisado, reproduzida na Figura 1, com ênfase no repositório do RFC Editor, onde repousam os principais documentos do IETF.

aeasd-1

Figura 1. O repositório das RFCs. Primeira base não estruturada a ser analisada pelo UIMA.

Como trabalhar com o repositório das RFCs

RFCs não possuem data e hora marcadas para aparecer e, estão em um formato que deve ser normalizado (brancos, figuras em texto, autores, diferenças de padrões de escrita, etc.), para adaptar-se ao UIMA ou outra aplicação. Este processo de normalização é, na verdade uma “arrumação” sobre os dados de entrada e possui as característica descritas por Wickham (2014)1. Portanto é necessário, um pré-processamento, no qual estas duas questões serão resolvidas. A Figura 2 apresenta um modelo preliminar a ser seguido.

uima-preprocessamentorfcs

Figura 2. O pré-processamento das RFCs.

O próprio RFC Editor recomenda um mecanismo2 de recuperação de RFCs usando o rsync, uma ferramenta disponível nos sistema a la Unix e também, no Windows. Como mostra a Figura 2, o rsync trás a base do RFC Editor para o diretório rfstemp/ local, de forma incremental, como se desejava. Sobre este diretório, um programa em Python (denominado preprocess.py) é executado periodicamente e, sempre, executa o rsync, transferindo as novas RFCs para o diretório rfcs/, as quais são consumidas pelo UIMA. A Figura 3 mostra o exemplo de uma execução do rsync, no Windows 10, via prompt e uma nova RFC disponível (rfc7715.txt). Naturalmente, esta execução não foi a primeira vez, oportunidade em que isto é, o diretório rfstemp/ já tinha sido populado com TODAS as RFCs.

uima-rsync-exemplo

Figura 3. Execução do rsync e a disponibilidade de uma nova RFC enfatizada em vermelho.

A periodicidade de execução do programa preprocess.py é feita, automaticamente, através do cron (um processo, também, disponível para o Windows). Ele preserva a informação sobre a última RFC atualizada, captura as novas, normalizando e colocando-as no diretório de entrada para o UIMA (rfcs/). O processo de normalização é simples, retirando tudo o que é texto inútil de cada RFC (brancos, rodapés, etc.). Em função do UIMA, o programa preprocess.py, eventualmente, evoluirá o processo de normalização e/ou aperfeiçoará a entrada (isto é, o conteúdo do diretório rfcs/).

O UIMA, ao consumir as RFCs deixa o diretório rfcs vazio. Nas atividades do UIMA, Java é a principal linguagem, como vimos no primeiro artigo da série: Instalação do Apache UIMA (Apache UIMA Installation). O segundo artigo é uma visão geral do UIMA: Funcionamento Básico do Apache UIMA


  1. Wickham, H. Tidy Statistic. Journal of Statistical Software, Foundation for Open Access Statistics, v. 59, n. 10, 2014.
  2. https://www.rfc-editor.org/retrieve/rsync/
%d blogueiros gostam disto: