First (WordPress) Post!

2010-03-27

Olá. Sejam bem-vindos à minha nova casa. Acabei de me mudar do Blogger para o WordPress e estou tentando me acostumar com a nova casa e com a nova vizinhança. :-)


Meus filhos não gostam de ler. E agora?!

2010-01-28

O Andreyev me mandou um link pro diário do Mentor Muniz, mais precisamente pro post no qual ele conta sobre a sua árdua luta pra manter o nível de leitura de suas filhas. Eu também tenho uma filha de sete e um filho (que perigo) pré-adolescente e achei o relato muito interessante. Só que, infelizmente, ele não achou uma fórmula mágica…

Aqui em casa eu tenho tentado ler junto com o Tiago há vários anos. Normalmente na cama, antes de dormirmos. Noto que ele gosta. Ele interage, ri e comenta. Quando vamos retomar a leitura ele quase sempre se lembra de onde paramos na véspera mais facilmente do que eu.

Mas ele gosta quando eu leio em voz alta pra ele. Ele mesmo não quer ler em voz alta pra mim. Cheguei a pensar nos últimos tempos em oferecer um prêmio financeiro por livro lido, mas temo que isso acabe passando a ideia de que a leitura não passa de um “trabalho enfadonho”.

A Ju já tem pedido pra comprar livros de estórias e já leu um inteiro sozinha. Mas ainda não comecei a tentar estimulá-la oficialmente…

Eu, que sempre gostei de ler, não tenho certeza de como é que isso começou. Sempre achei que deve ter sido algum dos primeiros livros que eu li que me fisgou. Li “A Ilha Perdida” aos 8 anos e me lembro que gostei tremendamente. Depois foram outros livros da Coleção Vaga-Lume, lembram? “O Escaravelho do Diabo” era ótimo! Depois vieram os livros da Agatha Christie, dos quais eu devo ter lido uns 40. Este mês reli “O Caso dos Dez Negrinhos” (que foi retraduzido e renomeado como “E Não Sobrou Nenhum”) com o Tiago e ele gostou bastante. Mas eu li todo ele em voz alta…

Outra série que o Mentor comenta e que eu li toda pro Tiago é a da Turma do Gordo, cujo primeiro é “O Gênio do Crime”. Os dois ou três primeiros livros da série são muito legais mas depois as estórias começam a ficar muito surreais e sem graça.

Eu não sei se ainda não consegui encontrar o tipo de livro que vai “fisgar” o Tiago ou se a prática de ler em voz alta acaba deixando-o mal-acostumado ou, ainda, se a solução é outra ou se não tem mesmo uma solução…

Alguma idéia?


(Eu ia postar o seguinte como comentário, mas acho que faltou mesmo dizer porque que eu acho a leitura importante.)

Eu também acho que a leitura vai se transformar nos próximos anos. Não há como evitar. Mas se as vendas recentes do Kindle da Amazon indicam alguma coisa não é que a leitura de livros vai deixar de existir por completo.

Por que eu gostaria de cultivar o hábito da leitura nos meus filhos? Em parte é um tanto óbvio, mas há alguns argumentos que eu li recentemente que trazem à luz algumas razões mais específicas.

Um deles é o artigo do Nich Carr chamado Is Google Making Us Stupid?, no qual ele sugere que “na medida em que nós vamos perdendo o nosso repertório interno de uma densa herança cultural nós nos arriscamos a nos transformar em “pessoas panquecas”, espalhando-nos de modo largo e raso enquanto nos conectamos à vasta rede de informações acessíveis ao mero toque de um botão”. (Inspirador, não?)

Tem também um excelente artigo do Keith Stanovich, What Reading Does for the Mind?, no qual ele mostra evidências de como a quantidade de leitura (independente da qualidade, aliás) na infância tem consequências mensuráveis no nível de inteligência do adulto. E o mais impressionante é que quanto mais cedo a criança adquire o hábito, maiores são as consequências…

Agora dá licença que eu tô com pressa… :-)


Pequenos Céticos

2009-12-05

Mais dia, menos dia, acaba chegando na vida de toda mãe aquele momento em que seu filho faz aquela temível pergunta:

- Mamãe?
- Sim, querido.
- De onde vieram as pessoas?
- Você quer dizer, os bebês? Bem, primeiro o homem pega o pênis e…
- Não, não. Eu quero saber das primeiras pessoas. De onde vieram as primeiras pessoas na Terra?

Fiquei perplexa. O que eu podia dizer? Eu sabia que esse momento iria chegar, mas eu ainda estava completamente despreparada. Eu ficaria feliz em falar de sexo com ele, mas evolução? Como eu poderia explicar evolução para meu filho de três anos quando eu mesma não entendia direito? Afinal, eu era produto do sistema educacional público da Carolina do Sul.

E foi aí que eu disse a pior coisa que qualquer mãe pode dizer ao seu filho quando ele pergunta sobre esse tema controvertido. Não, eu não lhe disse que nós fomos criados por Deus ou que nós fomos plantados aqui há milênios como um experimento extraterrestre. Eu lhe disse algo muito, muito pior.

- Querido, um dia os macacos viraram gente.

Não sei quanto a vocês, mas eu quase caí da rede de tanto rir quando li esse começo da introdução ao artigo de Heidi Anderson, “Skeptical Parenting: Raising Young Critical Thinkers”, na Skeptical Inquiry de novembro. Afinal, eu também tenho dois filhos e nem sempre é fácil encontrar as respostas certas.

A introdução é excepcional e cria muita expectativa para o resto do artigo que não consegue manter o mesmo nível. De qualquer modo, ele é útil para pais céticos vivendo numa comunidade a-cética como a nossa.


José Gabino Jr.

2009-05-10

Mesmo Assim

Se nunca mais me visses e eu te olhasse,
Se te esquecesses que te amei um dia,
Se o teu eterno amor fosse fugace
Como a noite que sinto é triste e fria…

Se um dia me dissesses, face a face,
Que só asco por mim sentir podia…
E se tua boca me amaldiçoasse
Com louca maldição, feroz, sombria…

Se tornasses em pó minha ilusão,
Deixando que esta grande solidão
Que paira sobre mim, fatal desabe…

Se me fizesses tanto mal, eu juro
Qu’inda serias luz no meu futuro,
Que o mesmo te amaria – ou mais…
                                       Quem sabe?

Essa é uma das minhas poesias prediletas do livro Olhos no Horizonte, do José Gabino Jr. Roubei este e outro livro do Gabino de meu pai há vários anos e os reencontrei semana passada enquanto vasculhava o sótão à procura de livros pra encher a nova estante do escritório.

O Gabino foi colega do meu pai na Cemig, em Belo Horizonte, lá pelos idos de 1987. Nessa época eu ainda estava na faculdade e foi numa das férias que eu ainda passava com meus pais que eu conheci o Gabino e o vi presentear meu pai com dois livros de poesias. Lembro-me muito pouco dele e provavelmente sequer chegamos a conversar. Mas fiquei seu fã logo na primeira leitura dos seus livros.

Os dois livros são edições caseiras, provavelmente produzidas pela família dele, um de 1978 e outro de 1986. Descobri que ele publicou um livro mais recente chamado Colhidos pelo Caminho e o encomendei na Estante Virtual.

Na introdução do segundo livro, Sol Entre Neblina, ele diz que:

Se conseguir transmitir alguma emoção a pelo menos um leitor, o esforço feito estará recompensado.

Então está, Gabino.


Tô no Ubuntu!

2009-04-27

Ontem eu resolvi atualizar meu Kubuntu 8.10 para 9.04 no computador de casa. Foi tudo liso. Reiniciei o computador, me loguei e estou trabalhando desde então sem qualquer empecilho.

Mas não é só nesse sentido que eu “tô no Ubuntu”. É que finalmente eu tenho um projeto meu (nesse caso, um projetinho) integrando essa distribuição:


gustavo@wise:~$ apt-cache show libsvn-look-perl
Package: libsvn-look-perl
Priority: optional
Section: universe/perl
Installed-Size: 68
Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
Original-Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Version: 0.13.463-2
Depends: perl (>= 5.6.0-16), subversion
Filename: pool/universe/libs/libsvn-look-perl/libsvn-look-perl_0.13.463-2_all.deb
Size: 10250
MD5sum: 7105c8c22d06e4b1c49b78366499765f
SHA1: 4d4844e729f12cef21c7578d5b6846df9447a925
SHA256: 4c44bc636203dceb3e6beed7575553e8be0fb833644ec2716c222130bc58e733
Description: caching wrapper around the svnlook command
  The svnlook command is the workhorse of Subversion hook scripts,
  being used to gather all sorts of information about a repository, its
  revisions, and its transactions. SVN::Look provides a simple object
  oriented interface to a specific svnlook invocation, to make it
  easier to hook writers to get and use the information they
  need. Moreover, all the information gathered by calling the svnlook
  command is cached in the object, avoiding repetitious calls.
Homepage: http://search.cpan.org/dist/SVN-Look/
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu

Tenho um projeto mais interessante que está pra entrar numa versão futura do Debian, o SVN::Hooks que deverá entrar como pacote libsvn-hooks-perl.

Tá ficando bom…


Guitar Hero

2009-04-04

Eu nunca me interessei muito por “joguinhos eletrônicos”. Mas em dezembro passado trouxemos um Wii dos EUA junto com um punhado de jogos. Acabamos eu e meu filho ficando vic…, err…, aficionados do Guitar Hero World Tour. Já perdi longas horas brincando e cheguei num nível interessante. E, pra poder contar vantagem, resolvi publicar o nosso score. :-)

O objetivo é deixar tudo verde, mas tá cada vez mais difícil melhorar.


Camisa por dentro da calça

2009-03-28

Faz tempo que meus dois filhos implicam com o meu hábito de vestir a camisa por dentro da calça. Como sempre, eu me divirto. Há uns dias minha filha Juliana (de seis anos) me veio com essa:

- Pai, por que é que você põe a camisa por dentro da calça?
- Por que o papai acha mais confortável.
- Por que é que você prefere o conforto à beleza?
(…. pausa pra pensar numa boa resposta…)
- Acho que é porque eu sou velho!


Desenferrujando

2008-08-22

Se você gosta de programar e adora Perl… nah… mesmo que você odeie Perl, pare o que está fazendo e assista já à entrevista do Damian Conway.

São meros 35 minutos em que ele fala do seu PhD em biologia computacional, do sotaque “errado” dos americanos, de linguagens de programação em geral e de Perl 6 especificamente. Eu nunca li ou ouvi uma explicação mais interessante sobre a diferença entre tipagem estática e tipagem dinâmica.

E o final da última resposta merece até uma tentativa de tradução:

…para ser um bom programador você tem que efetivamente programar. E isso é algo que não acontece. Sabe, a gente estuda computação, a gente aprende todas aquelas coisas e fica o tempo todo fazendo exercícios e provas. Daí a gente se forma e começa a freqüentar reuniões, a desenhar modelos, diagramas e todo o resto e você pára de programar. E se você é promovido, então você é literalmente promovido a perder a oportunidade de continuar programando e eu acho que isso é um problema. Se você quer ser um jogador de tênis realmente bom, você vai treinar todos os dias. Se você quer ser um grande lutador de artes marciais você vai pro tatame todo santo dia. Se você quer ser um grande programador, você vai programar todo dia—mesmo que você tenha que usar seu próprio tempo pra isso. Se você está acordado, você é um programador. Se você está acordado às 11 horas da noite, ou às 3 da manhã, você tem que usar parte desse tempo para programar porque assim que você começa a enferrujar você começa a morrer como um programador.


Nerdiness

2008-08-19


I am nerdier than 88% of all people. Are you a nerd? Click here to find out!

Hmmm… devo ter mentido um pouco nas respostas porque não esperava que fosse tão alto assim.

O teste é antigo. Acho que eu já o havia feito há vários anos, mas nem me lembro quanto deu naquela época. Talvez eu tenha melhorado de tanto ouvir o nerdcast.

Lembrei do teste depois de ver o resultado do TK… acho que ele já foi muito mais nerd nos bons tempos. :-)


TIMTOWTDI

2008-08-16

Essa semana eu e minha equipe assistimos a uma palestra muito interessante sobre Python, ministrada pelo meu colega João Bueno. Lá pelas tantas ele começou a apresentar uns slides perigosos… cada um comparando Python a uma outra linguagem de programação. Perl, bash, Java e Ruby. Esses slides são perigosos porque comparar decentemente duas linguagens é uma tarefa complexa que não se pode condensar em um só slide. Primeiro é preciso definir um conjunto de critérios objetivos para a comparação. Depois, é preciso levar em conta o contexto de uso da linguagem. Coisas como o domínio das aplicações que serão desenvolvidas, as plataformas de desenvolvimento e de implantação, a experiência dos desenvolvedores com a linguagem, o tamanho da equipe e as restrições de prazo do projeto. Depois disso tudo, é preciso resistir arduamente à tentação de “puxar a sardinha” pro lado da linguagem de nossa predileção pra não parecer que estamos apenas fazendo picuinha.

Mas tudo bem… num grupo pequeno esse tipo de discussão é tão estimulante e inofensiva quanto falar de política, futebol e bolsa de valores num happy hour.

Acho que foi no slide sobre bash que o João sugeriu um problema para o qual uma shell Unix padrão não ofereceria uma solução tão econômica e legível quanto o interpretador de comandos interativo Python. O problema era, mais ou menos, o seguinte. Suponha que haja em um diretório um conjunto de arquivos cujos nomes consistem de um prefixo alfabético, seguido de uma seqüência de dígitos e terminando na extensão .jpg. Por exemplo:

 $ ls a0.jpg  b1.jpg  c123.jpg

Eu saí da palestra com o problema na cabeça e a primeira coisa que fiz foi bolar algumas soluções de uma linha e mandar pra ele por email:

 # imprimindo os nomes $ ls | perl -lpe 's/^([a-z]+)(\d+)\.jpg/sprintf "%s%03d.jpg",$1,$2/e' a000.jpg b001.jpg c123.jpg

 # gerando comandos para renomeá-los $ ls | perl -lpe 's/^([a-z]+)(\d+)\.jpg/sprintf "mv %s %s%03d.jpg",$&,$1,$2/e' mv a0.jpg a000.jpg mv b1.jpg b001.jpg mv c123.jpg c123.jpg

 # executando os comandos na shell $ ls | perl -lpe 's/^([a-z]+)(\d+)\.jpg/sprintf "mv %s %s%03d.jpg",$&,$1,$2/e' | sh

É assim que eu normalmente desenvolvo uma solução na shell. Ao invés de loops eu prefiro usar comandos que gerem outros comandos, como os mv acima, de modo que eu posso verificar facilmente se estou fazendo a coisa certa. Depois de ter certeza disso, basta acrescentar um “| sh” no final pra executar os comandos gerados.

Perl tem algumas opções muito úteis na confecção de one liners como o anterior. -l, -a, -n, -p e -e são as que eu utilizo mais frequentemente. Execute um “perldoc perlrun” pra saber mais sobre elas e outras tantas opções interessantes.

Mas, pra não dizer que Perl não pode fazer as coisas sozinho eu acrescentei uma solução que não usa a shell no final.

 # fazendo tudo sozinho $ ls | perl -le '/^([a-z]+)(\d+)\.jpg/;rename $_,sprintf "%s%03d.jpg",$1,$2'

 $ ls a000.jpg  b001.jpg  c123.jpg

Mas assim como eu sou fã de Perl e o João é fã de Python, o Andreyev é fã de Bash e não deixou barato, mandando o seguinte email pro grupo:

 $ ls a0.jpg  b1.jpg  c123.jpg

 $ for i in *.jpg; do j=${i%*.jpg}; printf "mv %s %s%03d.jpg\n" $i ${j//[0-9]/} ${j//[a-z]/}; done mv a0.jpg a000.jpg mv b1.jpg b001.jpg mv c123.jpg c123.jpg

 $ for i in *.jpg; do j=${i%*.jpg}; printf "mv %s %s%03d.jpg\n" $i ${j//[0-9]/} ${j//[a-z]/}; done | sh

 $ ls a000.jpg  b001.jpg  c123.jpg

 $ echo $BASH_VERSION 3.2.25(1)-release

Ninja! Eu vou confessar que nunca tive força de vontade pra aprender esses golpes avançados de manipulação de strings em bash. Pra mim, shell é uma cola que serve pra “grudar” outros comandos. Sempre que eu preciso de algo mais complicado, como estruturas de dados ou expressões regulares, eu não penso duas vezes antes decidir por Perl.

Mas o João pagou pra ver com essa:

 > $ python > Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) > [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 > Type "help", "copyright", "credits" or "license" for more information. >>>> import os >>>> for nome in os.listdir("."): > ...   base, numero, ext = nome[0], nome[1:nome.find(".")], nome.split(".")[-1] > ...   os.rename(nome, "%s%03d.%s" % (base, int(numero), ext)) > ... >>>>

 > # readability counts

Ah… que crítica sutil nesse último comentário… “Legibilidade conta.”

É?

Mas Succinctness is Power!

Quando eu quero resolver uma questão com um one liner a “legibilidade” é irrelevante, porque se eu não vou salvar a solução num script, ninguém mais vai lê-la, certo? Mas vá lá… se fosse pra salvar num script eu provavelmente escreveria algo mais parecido com a sua versão em Python. Algo assim:

    opendir CWD, '.';    foreach $nome (readdir CWD) {        if (($base, $numero, $ext) = ($nome =~ /^(.)(\d+)\.(.*)/)) {           rename $nome, sprintf("%s%03d.%s", $base, $numero, $ext);        }    }    closedir CWD;

Hmmm… eu nem tentei quebrar o nome com operações de strings porque eu acho a expressão regular mais direta e, nesse caso, mais legível. Pra ficar ainda mais legível eu substituiria os comandos opendir, readdir e closedir por um glob pattern:

    foreach $nome () {        if (($base, $numero, $ext) = ($nome =~ /^(.)(\d+)\.(.*)/)) {           rename $nome, sprintf("%s%03d.%s", $base, $numero, $ext);        }    }

Melhor, né?

Mas ainda não está bom. Está muito… carregado, sei lá. Uma das grandes diferenças de Perl em relação a maioria das linguagens, e a Python em particular, é que não precisamos ser sempre explícitos. É mais ou menos como usar pronomes ou sujeito oculto. De início você não entende o idioma e fala assim:

- José é casado. José tem cinco filhos. Os filhos de José são todos solteiros.

Depois, você aprende a usar os pronomes e começa a falar de modo mais econômico.

- José é casado. Ele tem cinco filhos. Eles são todos solteiros.

Até que você fica realmente fluente no idioma e fala naturalmente assim:

- José é casado e tem cinco filhos, todos solteiros.

Ininteligível? Só pra quem está só começando a aprender o português. Normalmente conversamos com pessoas que são tão fluentes quanto nós, de modo que podemos, e devemos, ser econômicos e diretos. Evitando redundâncias nós não somos apenas mais diretos. Somos também mais inteligíveis (ou legíveis), porque não inserimos no discurso aquela série de nomes repetidos que acabam poluindo o texto, escondendo o conteúdo real da mensagem.

Bom, tudo isso pra justificar minha próxima versão, na qual eu suprimo a variável $nome, pois em Perl o iterador de um loop é implícito:

    foreach () {        if (($base, $numero, $ext) = /^(.)(\d+)\.(.*)/) {           rename $_, sprintf("%s%03d.%s", $base, $numero, $ext);        }    }

Se você não conhece Perl não vai saber que a expressão regular está sendo aplicada ao iterador implícito do foreach. Mas se você nunca viu Perl, esse não é o seu maior problema, né? Ah, e o $_ é o “pronome” que usamos pra nos referirmos explicitamente ao iterador dentro do loop.

Pensando bem, essas variáveis locais não estão servindo pra muita coisa além de dar nomes às partes capturadas pela expressão regular. Se fôssemos usá-las muitas vezes, vá lá. Mas pra só usarmos uma vez na próxima linha? A expressão regular já é suficientemente clara (depois adquirir alguma experiência com elas, obviamente). Que tal nos livrarmos dessas variáveis?

    foreach () {        if (/^(.)(\d+)\.(.*)/) {           rename $_, sprintf("%s%03d.%s", $1, $2, $3);        }    }

Hmmm… tá parecendo C. Em Perl é mais direto e legível interpolar as variáveis diretamente na string de formato:

    foreach () {        if (/^(.)(\d+)\.(.*)/) {           rename $_, sprintf("$1%03d.$3", $2);        }    }

Hmmm… o importante é o rename… o if é acessório. Em Perl, podemos inverter o teste e a ação, mais ou menos quando escolhemos a voz ativa ou a voz passiva por razões estilísticas. Então, vamos colocar primeiro o que interessa:

    foreach () {        rename $_, sprintf("$1%03d.$3", $2)            if /^(.)(\d+)\.(.*)/;    }

Legal. Economizamos um par de chaves também, viram?

Ah… direto assim fica mais fácil perceber otimizações triviais:

    foreach () {        rename $_, sprintf("$1%03d.jpg", $2)            if /^(.)(\d+)\.jpg$/;    }

Ou generalizações oportunas:

    foreach () {        rename $_, sprintf("$1%03d.jpg", $2)            if /^([a-z]+)(\d+)\.jpg$/i;    }

Ficou bem legível pra mim. E pra vocês?

De qualquer modo, pelo menos isso prova que There Is More Than One Way To Do It.