Desenvolvimento e família

No momento estou com um tempo livre e pouco dinheiro e isso permite realizar coisas prazerosas na vida. Tudo realmente tem seu lado positivo!

Para não ficar com a mente ociosa acabei lançando o checkports.online, uma web app simples para checar se a porta de algum computador na internet está disponível para conexões. Foi um ótimo exercício implementar uma worker pool em Go e usar Vue e reCaptcha no front. Vamos ver se pelo menos ajuda no pagamento da própria hospedagem.

Na parte de família brinquei de casinha com minha filha por algumas horas. Batom, cabelo sendo escovado e por ai vai. Muito gratificante ver o amor tão puro de uma criança.

marianinhos

Anúncios

R para Humanos

É comum que algumas pessoas me procurem no Skype e WhatsApp para tirar duvidas de R. As duvidas sempre são as mesmas encontradas em cursos presenciais, mas desta vez com os dados da pesquisa do mestrado ou doutorado.

Então pensei um curso no modelo 20-80 (20 teoria e 80 prática) com essas duvidas mais comuns que todo mundo vai passar enquanto trabalha nos próprios dados. Como estou bem apertado financeiramente criei um crowdfunding para os custos do curso.

O curso vai ser na forma de screencasts (vídeos da tela do RStudio) com no máximo 30 minutos cada. Algo para assistir depois do trabalho ou para tirar uma duvida rápida no assunto. Claro que o curso só sai com seu apoio, se tiver um tempinho faça uma visita em R para humanos

CSV. Você acaba de se fuder

Cuidado a postagem abaixo contem ódio, muito ódio.

Eu trabalho com frequência com arquivos no formato CSV (Comma-Separated Values) para manipulação de dados. Se você é pesquisador ou um programador você já trabalhou e teve alguma dor de cabeça com a manipulação de arquivos no formato CSV. Vamos começar com a definição formal do CSV.

O documento que define o formato do CSV é o RFC 4180. Precisa ter alguma noção de informática para entender o documento na integra, mas vamos comentar os pontos importantes.

Definições

Each record is located on a separate line, delimited by a line break (CRLF). For example:

aaa,bbb,ccc CRLF

zzz,yyy,xxx CRLF

 

Então temos o exemplo com dois registros e cada registro é separado por uma quebra de linha. Para os menos versados em informática o CRLF são dois caracteres invisíveis que compõem a quebra de uma linha. Para quem já passo pelo inferno de formatar algum documento seguindo normas ABNT ou de pós-graduações deve conhecer o símbolo ¶. Ele mostra caracteres invisíveis como o espaço e a quebra de linha.

 

The last record in the file may or may not have an ending line break. For example:

aaa,bbb,ccc CRLF

zzz,yyy,xxx

 

Não mudou muito do exemplo anterior, mas agora sabemos que o último registro não precisa ter uma quebra de linha. Isso significa que se você abrir um CSV no bloco de notas a última linha pode ser vazia ou não, somente isso!

 

There maybe an optional header line appearing as the first line of the file with the same format as normal record lines. This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional “header” parameter of this MIME type). For example:

field_name,field_name,field_name CRLF

aaa,bbb,ccc CRLF

zzz,yyy,xxx CRLF

 

Vamos ignorar a parte do MIME type que não é o foco no momento e tentar diferenciar apenas o exemplo atual dos anteriores. Podemos ter um novo registro que é definido como cabeçalho do arquivo que deve aparecer na primeira linha. Trocando em miúdos podemos ter uma linha no começo do arquivo que contém o título das colunas.

 

Within the header and each record, there may be one or more fields, separated by commas. Each line should contain the same number of fields throughout the file. Spaces are considered part of a field and should not be ignored. The last field in the record must not be followed by a comma. For example:

aaa,bbb,ccc

 

Aqui temos a definição de campos, do separador (vírgula) e três regras: devemos ter o mesmo número de campos em todo o arquivo, espaços não devem ser ignorados e o último campo não deve ter o separador. No exemplo acima temos o CSV com um registro e três campos no total, repare que com todas as definições que temos até agora já começa a lembrar o CSV que manipulamos no dia a dia.

 

Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields. For example:

“aaa”,”bbb”,”ccc” CRLF

zzz,yyy,xxx

 

Não tem muito o que dizer dessa definição, podemos limitar os campos dentro de aspas duplas e caso não seja delimitado por aspas duplas pode ocorrer dentro do campo. Você vai entender melhor na próxima.

 

Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. For example:

“aaa”,”b CRLF

bb”,”ccc” CRLF

zzz,yyy,xxx

 

É aqui onde a merda toda geralmente acontece. Até aqui foi dito que a vírgula é o separador de campos, mas você por algum motivo quer colocar parágrafos nos campos. É bem provável que você vai ter várias vírgulas no seu CSV. Isso vai CAGAR a interpretação do CSV como foi definida até agora. Para resolver esse problema existe a opção de usar as aspas duplas. Exemplo:

“1,2,3”,”aaa”

Temos um registro com dois campos. Sem as aspas teremos o caso:

1,2,3,aaaa

Temos um registro com 4 campos. Se você no seu Excel quer ver 1,2,3 na mesma célula e fica aparecendo cada número em uma coluna e “empurrando” os outros campos para a direita o motivo foi uma implementação errada do CSV. Da mesma forma se quiser colocar várias linhas dentro de um campo é só seguir o próprio exemplo da penúltima definição.

 

If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote. For example:

“aaa”,”b””bb”,”ccc”

 

Você deveria estar se perguntando como colocar aspas duplas nos campos já que ela tem um significado definido no CSV. Essa definição existe para resolver esse problema. É só colocar duas “” para aparecer uma “.

Beleza, acabamos de ver a definição. Parece legal bem redonda né?

CSV, na vida real

Tudo bem que o RFC só surgiu depois (2005) do uso do CSV ser bem difundido, mas não é possível que ninguém ainda conhece o RFC.

Lembro que estava com problema de abrir um CSV de 4gb para realizar um processamento a nível de coluna e um amigo da TI teve a ideia genial de fazer um programinha em Java para interpretar o CSV e aplicar meu filtro. Fiquei bem feliz, iam fazer meu trabalho pela primeira vez. Meu colega implementou simplesmente dividindo os campos pelo separador (tabulação). Obviamente deu merda e eu tive que usar uma biblioteca para aplicar o filtro.

Outro caso que eu não esqueço era a diferença que o mesmo arquivo CSV tinha dentro da mesma organização (GBIF). Os dados do GBIF são coletados pelo seu próprio software IPT e a comunidade internacional consegue ter acesso no próprio portal online do GBIF. Eu trabalhei com esses dados com frequência e ficava maravilhado de como um CSV produto do portal GBIF não conseguia ser interpretado corretamente novamente pelo software IPT (sua fonte original). O principal problema era o separador tabulação, a justificava era que a vírgula era muito comum e poderia “estragar” o CSV. Estragar como caralho!? O padrão define tratamento do separador padrão (vírgula) usando aspas duplas. Eles também geravam CSVs nesse formato:

“aaa”,”bb”b,ccc

“aaa”,”bb”b”,ccc

 

Que merda é essa?! Como que interpreta o segundo campo no primeiro registro? Ele é “bb”b? Ou é bbb? Não dá para saber e cada software (IPT, GBIF, LibreOffice, Excel) vai interpretar de um jeito o que gera o inferno na manipulação de dados. Parece bobeira quando você pensa no seu CSV de 20 linhas da graduação, mas quando você entra na escala de milhões de linhas os dados são automaticamente classificados como de “baixa qualidade” ou “lixo”. As coisas estão mudando aos poucos, no https://github.com/gbif/gbif-common/issues/1 eu reporto para o GBIF que a biblioteca deles não segue o RFC.

Grande parte da culpa é do Excel. Se você usa as configurações regionais do Windows em Português Brasileiro o seu CSV vai utilizar o separador “;”. A Microsoft não deve ter recursos suficientes para ler a desgraça do RFC. O CSV não precisa de outro separador para resolver o problema. O uso de aspas duplas resolve o problema!

Se você é um programador não implemente padrões sem ler. Não, faça melhor. Siga a regra de implementação de criptografia. Use uma boa biblioteca que implementa o que você precisa.

Se você utiliza CSV com frequência você vai se FUDER, eventualmente.

Baixando anime em massa utilizando R + IRC

Qual a missão? Baixar vários episódios em massa, com velocidade aceitável, sem fillers.

Minha primeira ideia foi utilizar o torrent mas dependendo do anime é difícil possuir seed e ainda tenho que filtrar manual cada filler. Então pensei no IRC onde isso já é possível a muito tempo.

IRC é uma tecnologia bem antiga de comunicação que lembra bastante salas da Uol. Mesmo estando bem fora de “moda” ainda continua popular em projetos abertos e anime.

channel_window

Exemplo do cliente HexChat na rede FreeNode. Incríveis 565 pessoas no #defocus!

A primeira coisa é encontrar uma packlist contendo todos os episódios. Utilizando o Naruto Shippuuden como exemplo o HorribleSubs Packlist possui uma lista bem completada dos episódios. Visitando o packlist e filtrando por Naruto é possível baixar toda a tabela e converter para o formato .CSV com o LibreOffice.

Screenshot-2018-1-3 Packlist

Packlist

Primeira tarefa é carregar a lista e verificar se realmente tem os 500 episódios prometidos.

shippuuden = read.csv('packlist.csv', stringsAsFactors = F)
# find the prefix common to all eps
lastCommon = ""
i = 1
while ( all(substr(shippuuden$name, 1, i) == substr(shippuuden$name[1], 1, i)) ) {
  lastCommon = substr(shippuuden$name, 1, i)
  i = i + 1
}
prefix = substr(shippuuden$name[1], 1, i - 1)

epPattern = ".+?(\\d+).+" # select only the ep number part
eps = sub(epPattern, "\\1", shippuuden$name)
numberFormat = sprintf("%%0%dd", min(nchar(eps))) # assuming eps start from ep 1 to X
# check if packlist is missing any ep
epsModel = list()
for(i in sprintf(numberFormat, 1:max(as.numeric(eps)) ) ) {
  if ( !any(eps == i) ) {
    epsModel[[ i ]] = list(miss = T)
    next
  }

  hasEp = which(eps == i)
  if ( length(hasEp) == 1 ) {
    epsModel[[ i ]] = list(miss = F,
                           bot = shippuuden[hasEp, 'bot'],
                           pack = shippuuden[hasEp, 'pack'],
                           size = shippuuden[hasEp, 'size'],
                           name = shippuuden[hasEp, 'name']
                           )
  } else if ( is.null(epsModel[[ i ]]) ) {
    # if multiple bots have the same ep, pick the first one
    myQuality = which(grepl(quality, shippuuden[hasEp, ]$name))
    myQuality = ifelse(length(myQuality) > 1, myQuality[1], myQuality)
    epsModel[[ i ]] = list(miss = F,
                           bot = shippuuden[hasEp[myQuality], 'bot'],
                           pack = shippuuden[hasEp[myQuality], 'pack'],
                           size = shippuuden[hasEp[myQuality], 'size'],
                           name = shippuuden[hasEp[myQuality], 'name']
    )
  }
}

O trecho acima monta uma lista de 1-500 com os seguintes elementos:

  • miss: se verdadeiro indica que o episódio não foi encontrado em nenhum bot e em nenhuma qualidade
  • bot: nick do bot que disponibiliza o download desse episódio
  • pack: número do arquivo na packlist do bot
  • size: tamanho do episódio
  • name: nome completo do episódio incluindo extensão

Removendo os fillers:

filler = c(57:70,
           91:112,
           144:151,
           170:171,
           176:196,
           223:242,
           257:260,
           271,
           279:281,
           284:295,
           303:320,
           327,
           349:361,
           376:377,
           388:390,
           394:413,
           416:417,
           419,
           422:423,
           427:457,
           460:462,
           464:468,
           480:483)
ep2download = do.call(rbind.data.frame, epsModel[-filler])

E finalmente gerando as msgs para colar no IRC:

by(ep2download[, c('bot','pack')], ep2download$bot, function(x) paste("/msg",unique(x$bot), "XDCC BATCH", paste(getRange(x$pack),collapse = ',' )) )

Exemplo da saída:

ep2download$bot: CR-BATCH|480p
[1] "/msg CR-BATCH|480p XDCC BATCH 759-814,829-837"
----------------------------------------------------------------------------------------------
ep2download$bot: CR-BATCH|720p
[1] "/msg CR-BATCH|720p XDCC BATCH 1773-1803,1812-1829,1832-1835,1857-1882,1903-1916,1921-1930,1932-1938,1942-1943,1956-1962,1981-1986,1988-2008,2022-2035,2038-2047,2051-2053,2074-2075,2078,2080-2081,2084-2097"
----------------------------------------------------------------------------------------------
ep2download$bot: Ginpachi-Sensei
[1] "/msg Ginpachi-Sensei XDCC BATCH 1618-1619,1623,1629-1639,1644-1660"

Copia e cola no IRC, configura o HexChat para aceitar automaticamente transferência de arquivos e GG. Lembrando que omiti algumas coisas como por exemplo a preferência pela resolução 720p e a verificação que o episódio já foi baixado.

Isso é tudo pessoal! Nerdizando nas férias em vez de descansar 😦

Combat Logs e sua interpretação no WoW

O que é o Combat log?

Também conhecido apenas como log, é um arquivo na pasta do WoW que registra todos os acontecimentos de combate enquanto estiver ativo. Para ativar/desativar basta digitar /combatlog. Um arquivo novo vai ser criado em dentro da sua pasta do WoW (Logs\WoWCombatLog.txt).

Como interpretar?

Se você tentou abrir o arquivo percebeu que o conteúdo é ilegível. Vendo essa dificuldade alguns sites se especializaram em ajudar os jogadores na analise. O mais utilizado no momento é o https://www.warcraftlogs.com/.

Upload do log

Antes de começar a utilizar o site é necessário fazer o envio dos seus logs. O próprio Warcraft Logs tem um programa que te auxilia nessa tarefa. Nesse link https://www.warcraftlogs.com/reports/upload/ você encontra os downloads.

Após abrir a ferramenta e realizar o login você recebe três opções:

  • Upload a Log: permite o envio de logs já completados (permite escolher os combates igual o Split Log).
  • Live Log: faz o envio do log em tempo real. Se ocorrer um wipe ou kill vai ficar disponível para avaliação no site.
  • Split Log: permite fazer a divisão do arquivo do log sem a necessidade de envio para o site (opção menos usada).

O fluxo que eu sigo é: entrar na raid -> ativar o Live log -> raidar/wipar -> estudar o log. É possível usar o próprio DBM para fazer o logging da luta realizando a configuração abaixo.

captura-de-tela-2016-12-21-21-20-31

Interpretação básica

Vamos começar vendo algumas interpretações que eu fiz recentemente. O objetivo não é ferir a imagem de ninguém, mas fazer o crescimento do grupo como um todo.

Xavius, DPS no alvo errado!

A estratégia seguida pela guilda é focar o Xavius até 65% de sua vida, tentando ao máximo evitar o surgimento de outro ADD. Isso não tem sido sempre consistente, ocorrendo algumas tentativas com dois ADDs.

Primeiro vamos selecionar o intervalo de tempo que consiste da vida do Xavius de 100% até 65%.

  1. Clique na aba Resources
  2. Mude o modo de exibição para Enemies
  3. Certifique que escolheu Hit Points para exibição no gráfico
  4. Desmarque qualquer outra opção além do Xavius
  5. Clique e arraste da esquerda para a direita, começando no eixo X que indica 65% de vida até o começo.

captura-de-tela-2016-12-24-01-21-41

O resultado dessa seleção é um filtro onde só aparecem os eventos desse intervalo de tempo (vida do Xavius 100% até 65%). Observe abaixo mudança na escala do eixo X, só temos o intervalo desejado.

captura-de-tela-2016-12-24-01-21-57

Agora vamos analisar se alguém deu DPS além do esperado no ADD.

  1. Retorne a exibição para Friendlies
  2. Clique na aba Damage Done
  3. Mude de All Enemies para Corruption Horror (nome do nosso ADD)
  4. Desejamos ver quais jogadores deram o dano no ADD, selecione Done By Source

captura-de-tela-2016-12-24-01-34-42

O Zerafin foi o top dano no ADD, mas ele não tinha muitas opções já que dois talentos fazem o dano ser em área (famoso cleave).

Interpretações já prontas!

Em algumas lutas/dificuldades o Warcraft Logs já possui as analises prontas.

Quem é o nob que toma cheetos na luta do Odyn?

Selecione a aba Problems e desça até Avoidable Damage e escolha a skill.

Conclusão

Os logs possuem outras utilidades que não foram abordadas aqui. Algumas guildas começaram a utilizar os logs para procurar jogadores que possuem o dano acima da média (50%+ na aba Damage Done). Jogadores postam seus logs nos tópicos “Fix my DPS” no mmo-champion para ouvir a sugestão de quem manja mais, ou utilizam ferramentas automáticas para isso http://www.checkmywow.com/. No fim da pra fazer muita coisa com os logs e não é uma coisa de outro mundo a sua interpretação.

nMDS, como funciona?

Este é um post que eu queria escrever desde o mestrado durante as aulas de ecologia de comunidades. Hoje vamos aprender como realmente funciona uma das ordenações mais usadas no momento, o escalonamento multidimensional não métrico (nMDS).

Quando realizamos uma ordenação estamos buscando  uma forma de visualizar de forma mais simplificada as dimensões do nosso problema. Quem nunca criou uma tabela de dados após uma coleta e ficou na duvida de como explorar a informação? O nMDS é uma dessas formas de visualização dos dados que é extremamente robusta e consegue passar sobre as limitações usuais.

Como funciona

O objetivo do nMDS é representar os seus dados que estão em N-dimensões em sua forma original para algo pelo menos N-1 dimensões. Irei exemplificar dando um exemplo em R com o conjunto de dados iris. O conjunto consiste da mensuração de quatro características de 50 flores em três espécies (mais informações digita ?iris no R).

O nMDS é uma solução numérica e significa que vamos passar por varias tentativas até a aproximação de uma solução para o problema, abaixo lista as etapas que um nMDS executa:

  1. Calcular um índice de dissimilaridade dos dados originais;
  2. Distribuir aleatoriamente os pontos no espaço com N dimensões desejado (serve como solução inicial do problema);
  3. Calcular o índice de dissimilaridade da solução proposta;
  4. Comparar a dissimilaridade dos dados originais com a dissimilaridade da solução atual (esse passo é conhecido como Stress);
  5. Se o Stress for aceitável termine a execução do nMDS, caso contrario continue no passo 2 tentando melhorar a solução anterior.

Passo 1: envolve ter algum conhecimento sobre índices de dissimilaridade para escolha correta. A escolha de um índice de dissimilaridade afeta diretamente o resultado final do seu nMDS. O post sobre simetria de índices pode ajudar!

Usando o pacote vegan podemos calcular vários índices de dissimilaridade, abaixo um exemplo:

library(vegan)
vegdist(iris[, 1:4], "bray") 
# calcula o índice de Bray-Curtis para as colunas de mensuração do conjunto iris

 

 

Passo 2: como é um algoritmo iterativos temos que partir de algum ponto (mesmo que não seja bom!), a solução aleatória é empregada na primeira iteração desse algoritmo. No caso do conjunto de dados iris uma solução aleatória em duas dimensões:

random solution

Primeira solução proposta pelo nMDS. São exibidos 150 pontos, o que corresponde ao número de linhas no conjunto de dados iris.

Passo 3: mesmo procedimento do passo 1, só que agora vamos utilizar os dados do passo 2! Com isso temos a dissimilaridade original e a da nova solução proposta.

Passo 4: aqui vamos calcular o stress da solução proposta contra os dados originais. O stress é a métrica de ajuste da nossa solução aos dados originais. Quanto menor o stress melhor, formula abaixo:

S = \sqrt{ \frac{\sum (d_{ij} - D_{ij})^2}{\sum d_{ij}^2 } },

onde d_{ij} é a dissimilaridade dos dados originais na posição ij e D_{ij} a dissimilaridade da solução proposta no passo 2. Basicamente pegamos as duas dissimilaridades e subtraímos, quanto mais próximo a 0 mais similar são as soluções.

Passo 5: se o stress do passo anterior estiver dentro de uma margem ideal, terminamos o processo de nMDS. Essa margem ideal é arbitraria e logo não existe uma regra absoluta de qual valor é ideal, aqui entra a interpretação do resultado.

Se o valor do stress ainda não foi o ideal determinado pelo pesquisador voltamos ao passo 2 mas em vez de gerar uma solução aleatória vamos tentar mover os pontos da solução anterior para conseguir abaixar mais um pouco o stress. Essa “movida” de pontos que consome muito tempo no nMDS e dependendo da implementação é possível não encontrar uma boa solução!

O algoritmo de nMDS mais usado é a função wrapper do pacote vegan chamada metaMDS. Apesar de ser extremamente rápido na maioria dos casos o metaMDS pode ficar preso em um local optima e a sua solução ser um gráfico aleatório que não te leva a conclusão nenhuma.

Na minha implementação em R do nMDS para esse post eu utilizei um algoritmo genético que tenta chegar a solução por um processo similar a evolução, utilizando reprodução e seleção por fitness. Similar a evolução o algoritmo leva um tempo até chegar a solução, esse tempo pode variar bastante o que caracteriza uma desvantagem para esse algoritmo. Porem, nosso algoritmo não fica preso em local optima pois as mutações que ocorrem nas soluções criam novas possibilidade o tempo todo. A explicação detalhada do algoritmo genético vai ficar para outro post.

Interpretando

Abaixo temos os dois gráfico de ordenação onde em preto, vermelho e verde temos respectivamente as espécies Iris setosa, Iris versicolor e Iris virginica:

 

Como explicado nos passos anteriores o nMDS é construido tentando manter as dissimilaridades na mesma escala dos dados originais. Então, quanto mais próximos os pontos, mais similares eles são. Iris setosa é bem diferente de Iris versicolor e Iris virginica, enquanto Iris versicolor e Iris virginica são mais semelhantes entre si. Conclusão semelhante a Figura 1 de Fisher, R. A. (1936) que usou o mesmo conjunto de dados.

Coloquei a solução com algoritmo genético e a do vegan para demonstrar como a interpretação do stress é arbitraria. O stress do vegan é muito menor do que a nossa solução e várias pessoas iriam afirmar para ignorar a minha solução com stress 0,33. Nunca caiam em uma armadilha de ignorar resultados sem inspecionar gráficos. O gráfico do nMDS é apenas uma visualização dos seus dados com um número menor de dimensões. Não olhe para esse gráfico tentando interpretar a distância de cada ponto, tente procurar agrupamento de pontos (ou ausência deles).

As interpretações devem parar aqui.

  • No nMDS não existe eixo a regra que o primeiro eixo possui a maior variação dos dados;
  • Não se deve usar os eixos do nMDS em outras analises. Os eixos do nMDS não são ortogonais!
  • Se ainda assim quiser usar os eixos, reduza o número de dimensões do nMDS para uma ou utilize todos os eixos em forma de interação (caso seja regressão).

Lembre-se o nMDS é para visualizar os seus dados e entender as dissimilaridades (ou similaridades) entre as suas unidades amostrais.

Conclusão

Soluções numéricas são as minhas favoritas para ensinar. Podem não te dar o resultado em 200 milissegundos como as analíticas mas consigo explicar para minha mãe sem ter que repassar todo o ensino médio da matemática novamente.

Cuidado com valores de corte (p < 0,05, stress < 0,1), eles são perigosos e já causaram muitas estragos invalidando várias conclusões de forma cega. Não importa se é ciência, você ainda precisa fazer as interpretações!

Ainda acho que nMDS deveria ser a primeira ordenação ensinada. Você pode até ensinar sem falar que é o nMDS e vão achar que algum tipo de técnica muito básica, quando falar que é nMDS todos vão ficar espantados que é “só isso?”.

Referência

Como sempre códigos em R desse post no github.

Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179–188.

Qual o próximo passo para a biodiversidade digital?

Nota: as opiniões aqui escritas são minhas e não refletem a opinião do meu empregador.

Chamo de biodiversidade digital todos os aspectos que envolvem a biodiversidade no mundo digital.

Tendo um pouco de experiência em digitalização e publicação da biodiversidade então irei descrever aqui o que eu acho que deve mudar para que o campo avance e possamos nos preocupar mais com coisas mais relevantes.

Padrões

EML

Estado da arte e apresenta poucos espaços disponíveis para melhoria. Não consigo me lembrar da última vez que nesses últimos seis meses que sequer citei o EML no trabalho. Acredito que quando a solução de um problema passa desapercebido significa que ele foi bem resolvido.

DwC

O padrão em si precisa ser mais aberto a sugestões e a equipe do TDWG (“mantedora” do padrão)  precisa de mais pessoas na equipe. É muito triste entrar na página de um padrão tão usado e o link de histórico permanecer quebrado a vários meses.

Muitas melhorias precisam ser feitas no grupo de taxonomia, falta várias sub/sob categorias e uma solução como a dada aos dados ecológicas seria o ideal. Informar o rank taxonômico e seu valor parece uma solução melhor do que termos fixos que contemplam apenas rankings básicos da taxonomia (é muita gente usa tribo!).

Ideal

Uma solução onde os dados são alimentados ao sistema na forma como o pesquisador descreveu sem a necessidade de modificações ou transformações. Também é precisa se desligar da ideia que todo dado é representado por tabelas. Quem grava o áudio/vídeo/fotos não fica usando tabela para salvar o produto. Links na tabela para esses recursos multimídia não são a solução, quando eu baixo um pacote de dados eu quero todos os dados dentro do pacote. Se ocorrer problemas no local da hospedagem o meu pacote de dados se torna inútil.

Solução para o problema é dar uma olhada nas ideias do padrão noSQL, onde é possível ter um formato híbrido com formato tabular e objetos (nossos vídeos).

Ferramentas

IPT

Uma opção para armazenamento de dados em algum banco de dados. Iria facilitar a indexação de recursos assim como a geração de métricas dos dados. Relacionado a isso o IPT precisa urgente de uma API. Só existe a necessidade de indexadores devido a falta de uma API…

A definição dos termos DwC em núcleos começa a ser irritante mostrando suas limitações no padrão estrela. Essa definição dos núcleos não pertence ao padrão do DwC. Nenhum pesquisador gosta de ideia de modificar sua tabela  e depois ter que dividi-la em outras três por uma implementação de um padrão de forma arbitraria pela ferramenta de publicação.

Metacat

Estou afastado da ferramenta a alguns meses. Ainda assino a lista de desenvolvimento para acompanhar as novidades e parece que última relevante é relacionada ao sistema de busca da DataONE (off-topic da ferramenta) que parece ter sofrido melhorias consideráveis.

Tentei fazer o download do último código fonte e desisti depois de ver o tamanho de quase 900 mb. Me pergunto como um código fonte pode chegar a esse tamanho absurdo? Este projeto também já deveria ter migrado para o GitHub. Se o financiamento acabar também podemos perder acesso ao código fonte. O GitHub daria o prolongamento da vida da ferramenta por contribuições da comunidade.

Ainda possui recursos que eu sonho em ver no IPT como a replicação que permite compartilhar seus dados de forma segura entre instalações da ferramenta. API local que permite criação de portal de dados com a própria ferramenta e indexação por Solr.

Ideal

Uma ferramenta com todos os recursos listados no último paragrafo do Metacat mas com a interface de adição de recursos do IPT e com um novo modelo de armazenamento de dados que também iria implicar em um novo padrão superior ao DwC. A noção de dados de ocorrência ou ecológicos deve desaparecer para o software e existir apenas na cabeça do pesquisador.

E claro que não seja em Java, não adianta falar que Java roda em qualquer plataforma se todo mundo usa servidores Linux eliminando assim a principal vantagem argumentada. Java não é ruim, mas desenvolvedores competentes parecem escassos. Toda vez que eu olhei para um campo na ferramenta e imaginei “se eu fizer isso vai dar pau” aconteceu. Eu sou um biólogo, se é óbvio para mim deveria ser ridículo para um programador com diploma. Um desses bugs que reportei pode simplesmente travar o IPT por vários segundos, com um pouco de maldade eu poderia travar todas os IPTs disponíveis por quanto tempo eu tivesse paciência. Esses bugs são comuns em ambas as ferramentas.

Conclusão ou tl;dr

Desaparecimento dos padrões de formatação de tabelas. Não queremos mais tabelas! Queremos poder usar vídeos e áudio nos pacotes de dados, nada de anexo. Um vídeo por registro se assim eu desejar.

A ferramenta deve se virar para resolver meu problema. Eu me adaptar a soluções dos informáticos não é solução do problema. Se a minha “tabela” está nesse formato deve ter um motivo muito bom. Será que é o formato mais comum para a análise deste tipo de dado? Será que meus pares de pesquisa também gostariam de receber nesse formato? Se eu apresentar em outro formato isso vai ajudar o compartilhamento de dados sobre a biodiversidade? São todas perguntas que parecem esquecidas e precisam ser feitas e refeitas até a exaustão para avançarmos para o próximo nível.

Fim da relação política/financeira dessas ferramentas/padrões. Sim várias vezes eu consigo notar que todo mundo sabe do problema, concorda com o problema, mas não vamos fazer nada por motivos políticos.

Que se foda *****, eu quero é resolver o problema.

Conclusão no final da discussão sobre o “estado da arte” da biodiversidade digital