A Imaginação Educada

A Imaginação Educada

Terminei de ler ontem o excelente livro A Imaginação Educada, do crítico literário Northrop Frye. Trata-se da transcrição de seis palestras onde o autor fala sobre o que é literatura e qual o seu papel. O livro é curto mas, pelo menos no meu caso, precisa ser lido mais de uma vez. Considero uma leitura essencial.

Recomendação: Ruby on Rails Tutorial

Ruby on Rails Tutorial é um excelente livro sobre Ruby on Rails disponibilizado gratuitamente no site do autor, Michael Hartl. O leitor é guiado por todo o processo de desenvolvimento e deployment de um aplicativo exemplo, no caso uma espécie de clone do Twitter.

Estou seguindo o tutorial, no momento em que escrevo estão implementados os sistemas de cadastro e login:

Como resolvi o erro “The method driver /usr/lib/apt/methods/http could not be found”

Eu tentava instalar o Heroku no meu workspace no Codenvy quando me deparei com esse erro ao tentar adicionar um repositório apt. A própria mensagem de erro sugeria a solução: instalar o pacote apt-transport-https. O problema foi que esse pacote não era encontrado, e eu não podia usar apt-get update por causa do primeiro erro.

A solução foi:

  • abrir o arquivo /etc/apt/sources.list para edição
  • remover a linha que indicava o repositório do Heroku (deb https://cli-assets.heroku.com/branches/stable/apt ./)
  • rodar o apt-get update
  • instalar o pacote apt-transport-https (sudo apt-get install apt-transport-https)
  • adicionar novamente o repositório do Heroku
  • rodar o apt-get update
  • por fim, instalar o Heroku

O problema, se ainda não está claro, era o “https” no começo da URL do repositório do Heroku; instalar o pacote apt-transport-https resolve isso, mas a instalação, pelo menos no meu caso, não podia ser feita enquanto apt-get update resultasse em erro.

Dez Maneiras de Destruir a Imaginação do seu Filho

Comecei a ler esse excelente livro (Ten Ways to Destroy the Imagination of Your Child, no original) durante essa semana. Nele o autor expõe de maneira brilhante como aperfeiçoamos o processo de destruição da imaginação de nossas crianças, ao mesmo tempo em que anunciamos fazer exatamente o oposto.

O que mais me marcou até o momento foi um trecho que fala sobre a memória (tradução minha):

“Como, então, nós nos livramos dos Fatos? O primeiro passo é manter a memória fraca e vazia.

Isso pode parecer ir contra a intuição. “Nós não ensinamos mais através da memorização por repetição,” dizem os nossos educadores hoje em dia, empinando  orgulhosamente seus narizes. “Nós preferimos ensinar o pensamento crítico. Nós preferimos mexer com a imaginação.”

Enquanto os professores continuarem batendo nessa mesma tecla, nós não precisaremos temer que o próximo Dante ou Mozart se forme em nossas escolas. Isso porque uma memória desenvolvida é um maravilhoso e terrível armazém de coisas vistas, ouvidas e feitas. Ela consegue fazer o que nenhum mero motor de busca na internet consegue. Ela pode reunir ao mesmo tempo coisas aparentemente sem relação, moldando uma impressão completa, ou um novo pensamento. […] Sem a biblioteca da memória, a imaginação simplesmente não tem muito sobre o que pensar, ou coisas com as quais brincar.”

Algoritmos de busca em grafo em Ruby

Parecido com o parser de grafos que fiz em C, só que este funciona com grafos valorados. Implementei breadth-first search (busca em amplitude), depth-first search (busca em profundidade) e o algoritmo de Dijkstra. Está tudo no repositório graph_ruby, junto com a minha primeira tentativa de gerar documentação com o rdoc.

Script para renomear PDFs

Meu primeiro script em Ruby que faz algo útil, feito para ser utilizado a partir do shell. Utilizei a biblioteca pdf-reader. Só funciona se o pdf tiver informações de título e autor. Por padrão ele renomeia o pdf para o formato “título [autor]”, se quiser mudar é só alterar a linha 15.

Exemplo de uso (tenta renomear todos os arquivos pdf do diretório atual):
ruby pdf_rename.rb *.pdf

require 'pdf-reader'

if ARGV.empty?
    puts "Usage: ruby pdf_rename.rb 'file.pdf'"
    exit 1
end

ARGV.each do |arg|
    filename = arg
    nfilename = ""

    begin
        PDF::Reader.open(filename) do |reader|
            if reader.info[:Author] && reader.info[:Title]
                nfilename = reader.info[:Title] + " [" + reader.info[:Author] + "].pdf"
            end
        end
    rescue
        puts "Could not read PDF '#{filename}'."
        next
    end

    if nfilename != ""
        begin
            File.rename(filename, nfilename)
        rescue
            puts "Could not rename file '#{filename}' to '#{nfilename}'."
            next
        end
    else
        puts "Could not extract author and title information from PDF '#{filename}'."
        next
    end
end

Repositórios atualizados

Nota

Fiquei 4 dias sem internet no meu computador e acabei quase reescrevendo todos os meus repositórios:

  • a hash table agora usa void * no lugar de double para os valores (para mais flexibilidade);
  • adicionei uma implementação de lista encadeada ao repositório m;
  • o parser de grafos agora tem mais funções de busca, utiliza a nova implementação de lista encadeada e foi adicionado um programa que pode ser utilizado para testar se uma configuração de grafo está correta;
  • o parser de gramáticas livres de contexto agora utiliza a hash table para guardar as definições, além de também fazer uso da implementação de lista encadeada.
(este post é patrocinado pelo Valdeir, que me emprestou um adaptador wifi USB)

Gerador de Nuvens de Palavras

Apresentei em um trabalho na disciplina de I.A., junto com o Valdeir Cesconeto, um script em Python que gera uma nuvem de palavras customizada a partir de um tema qualquer escolhido pelo usuário. Para isso utilizamos as bibliotecas wikipedia e word_cloud, além de fazer um web scraping do Google Imagens. O código precisa de revisões antes de ser postado, mas gostei do resultado e por isso já deixo aqui algumas das minhas imagens geradas favoritas.

 

Parser de Grafos

Fiz um parser de grafos em C. Depois que um arquivo de configuração de grafo for lido (src/test.txt, por exemplo), você pode fazer perguntas para encontrar o menor caminho entre dois vértices (utilizando breadth-first search).

Exemplo:queries

Implementei utilizando minha hash table. Cada vértice do grafo tem um nome e uma lista de strings que representam as arestas; depois de lidos, os vértices são inseridos na hash table que por sua vez é utilizada na função de busca.