Receba links do Delicious via RSS

Até alguns dias não tinha percebido que a seção “Links for you” do del.icio.us, possui um link “private feed for this page” no rodapé da página. Se você assinar esse feed, portanto, sempre que alguém lhe sugerir um link dentro do sistema você será notificado através do feed. Essa dica vale também para a seção “Subscriptions” (mas não recomendo, eu não consegui agüentar por 2 dias a assinatura do meu feed, sendo que eu assinava apenas 4 tags).

Se você assina feeds via Google Reader precisará definir um nome para esse novo feed, pois por algum motivo o Google não consegue gerar um nome automaticamente e o deixa como “title unknown”.


Renomeando múltiplos arquivos simultaneamente no Linux

Hoje, no trabalho, precisava renomear uma grande quantidade de arquivos de um mesmo diretório com uma regra bastante simples: queria que a extensão de todos eles passasse de .wbm para .wbmp. Encontrei, sem querer, o programa rename disponível no Ubuntu, e fui logo ler seu manual (man rename).

Infelizmente o manual era minúsculo, com apenas 2 exemplos. Achei, inicialmente, tão confuso que não entendi que no primeiro exemplo se encontrava a solução para o meu problema. Como estava com pressa acabei renomeando os arquivos no braço, mas eis aqui a solução, após uma pequena busca no Google (veja o segundo comentário deste artigo):

rename 's/\.wbm/.wbmp/' *.wbm

Depois de ler essa dica comecei a entender melhor o sucinto manual…

O primeiro parâmetro passado ao comando deve ser uma expressão regular compatível com Perl na forma:

'modificador/trecho-do-nome-que-se-deseja-alterar/como-vai-ficar-esse-mesmo-trecho/'

O último parâmetro é o padrão de nome de arquivo ao qual as mudanças definidas no primeiro parâmetro se aplicam. Consulte a documentação do Perl (link no fim do artigo) para entender quais são os modificadores válidos e o que significam.

Não sou o mago das expressões regulares para poder dar outros exemplos úteis, por isso, se você quer realizar procedimentos um pouco mais complexos, recomendo a leitura da documentação do Perl para expressões regulares.


Sintaxe do PHP: o que eles estavam pensando?

Em: 18/02/2008 Tags: PHP Comentários (5) Referencie do seu blog (Trackback)

Alguns dias atrás estava atrás da resposta para uma dúvida que atormentava minha alma: por que diabos isto não é válido em PHP5?

new MyClass()->some_method()->other_method();

Ou isso, caso o problema seja aquele new no caminho:

(new MyClass())->some_method()->other_method();

Isto o quê?”, você me pergunta. Formulando novamente a pergunta: por quê não é possível encadear uma chamada de método a uma instância recém-criada, sem ter que associar essa instância a uma variável?. É verdade, a situação já foi pior. Voltemos aos dias do PHP4 (muitos ainda continuam lá, é verdade). O código abaixo seria inválido:

$obj = new MyClass();
$obj->some_method()->other_method();

Sim, no PHP4 ainda não era permitido o encadeamento de chamadas de métodos. E no PHP5 o PHP nos dá isso, mas pela metade, afinal o exemplo inicial do post não é válido.

Esta discussão propõe várias técnicas para passar por cima desse problema, mas são todas gambiarras, nada mais que isso. Assino a lista dos desenvolvedores do PHP mas ainda não vi nenhuma discussão a respeito, então é possível que os que sentem falta disso sejam a minoria. Será?

Como faríamos isso em Python?

MyClass().some_method().other_method()

Trivial, não? Em Ruby?

MyClass.new.some_method.other_method

Tão trivial quanto. Mas se você está com o PHP, ria pra não chorar. Já não basta ter que digitar dois caracteres (->) no lugar de um (.) para enviar mensagens a objetos, ainda temos que agüentar esse tipo de falha/esquecimento/sei-lá-o-quê na sintaxe da linguagem? Estamos perdidos.


Python e Django cheat sheets

Pra quem gosta de cheatsheets encontrei hoje este post no Delicious com algumas para Python e uma para Django 0.95. Aproveitem!


Atalhos de teclado do Google Reader

O Google Reader possui usabilidade excelente, mas para que possamos ler nossos feeds rapidamente precisamos de bons atalhos de teclado. E, sim, o Reader possui ótimos atalhos. Quais são eles? Digite ? quando dentro da interface do Reader, e então os principais atalhos serão exibidos para você. Digite Esc para que a janela desapareça. Ou você pode optar por consultar esta listagem. Um post recente mostra uma pesquisa que os desenvolvedores do Reader fizeram para descobrir os atalhos de teclado mais utilizados pelos usuários. Embora o atalho mais utilizado seja o j (próximo item), o pessoal do Google alerta que o atalho mais importante, afinal, é o ?.


Source code browser para o Vim

Em: 16/02/2008 Tags: Vim Comentários (0) Referencie do seu blog (Trackback)

Se você já configurou o Vim com suporte ao Exuberante Ctags (aprenda neste post como fazê-lo), provavelmente vai se interessar pelo plugin Tag List (é o mais votado e mais baixado entre todos os plugins do site do Vim). Ele funciona na forma de uma janela auxiliar dentro do editor, permitindo que você navegue facilmente entre definições de funções, classes, constantes etc. em diversas linguagens. Note que esse plugin só terá utilidade se você possui o suporte ao Exuberant Ctags instalado e Vim versão 6 ou superior. Na imagem abaixo você pode ver um exemplo de uma sessão do Vim + plugin Tag List ativo (é uma sessão onde vemos o código-fonte do próprio Tag List).

Uma sessão do Vim com o plugin Tag List ativo

Ao navegar pela janela do lado esquerdo (a janela da Tag List), podemos parar o cursor sobre uma “tag” e então apertar, por exemplo, Enter, para que o Vim passe o nosso cursor para o lado direito, posicionando-o sobre a tag correspondente dentro do código-fonte. Esse é apenas o comando mais básico entre os diversos comandos úteis que esse plugin nos provê.

Como instalar:

  • Baixe a última versão do pacote do site oficial
  • Extraia o arquivo zip baixado e mova o arquivo plugin/taglist.vim para o diretório ~/.vim/plugin/

Agora seu Vim irá carregar o plugin automaticamente, mas nada acontecerá a menos que você o configure adequadamente. Você pode começar com as mesmas configurações que eu adotei: abra o arquivo ~/.vimrc e adicione as seguintes linhas:

" Tag List
let Tlist_Auto_Open=1
let Tlist_Inc_Winwidth=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Enable_Fold_Column=0
let Tlist_File_Fold_Auto_Close=1
let tlist_php_settings='php;c:class;d:constant;f:function'
nnoremap <silent> <F8> :TlistToggle<CR>

Com elas teremos o seguinte comportamento:

  • A janela da Tag List sempre se abrirá junto com o Vim quando estivermos editando um código-fonte
  • A tecla F8 passa a ser um atalho para esconder/exibir a janela da Tag List - muito conveniente quando desejamos ter mais espaço na janela principal

Para entender melhor todas essas opções e as demais disponíveis não deixe de ler o manual oficial da Tag List.


diff e vimdiff

Em: 16/02/2008 Tags: Linux, Vim Comentários (0) Referencie do seu blog (Trackback)

Já precisou visualizar, de forma rápida, as diferenças entre dois arquivos de texto? Provavelmente já, mas se não precisou provavelmente um dia precisará.

A diferença entre o conteúdo de dois arquivos de texto (também conhecida popularmente como diff) pode ser calculada facilmente com o auxílio de dois programas do Linux (entre outros):

  • diff
  • vimdiff

diff

Considere os dois programas abaixo, a.py:

for n in range(1, 10):
    print 'Now n = %d' % n

print 'Finished!'

e b.py:

for n in range(1, 11):
    print 'Agora n = %d' % n

print 'Finished!'

Podemos utilizar o programa diff para descobrir quais linhas desses arquivos são diferentes. Invocamos o programa passando os arquivos a serem comparados como uma lista de parâmetros, da seguinte forma:

diff a.py b.py 

Teríamos a seguinte saída:

1,2c1,2
< for n in range(1, 10):
<     print 'Now n = %d' % n
---
> for n in range(1, 11):
>     print 'Agora n = %d' % n

A saída nos indica que as linhas 1 e 2 dos arquivos são diferentes. Mas não há nenhum destaque para os caracteres que são de fato as diferenças dessas linhas.

Como o programa diff não possui uma opção como “saída colorida”, acho que sua utilidade pára por aqui. Mas agora entra o vimdiff.

vimdiff

O vimdiff é um “modo alternativo” do Vim. Ele nos permite editar duas ou três versões de um arquivo simultaneamente enquanto nos mostra as diferenças entre elas. Não precisamos necessariamente editar esses arquivos: o simples fato de abrir 2 arquivos simultaneamente nesse programa já pode ser tudo o que precisamos, em algumas situações.

Veja na imagem abaixo como o Vim fica diferente nesse modo vimdiff:

vimdiff

O comando utilizado para abrir o Vim dessa forma foi o seguinte:

vimdiff a.py b.py

Se as cores utilizadas para iluminar as diferenças entre os arquivos não são as mais bonitas, ao menos o resultado é aquele que esperamos: agora podemos visualizar claramente as diferenças entre a.py e b.py. Se nossos arquivos, em vez de 6 linhas possuíssem 600, poderíamos percorrê-los linha por linha para visualizar as diferenças. Quando o vimdiff encontra diversas linhas vizinhas sem diferenças para os dois/três arquivos elas são “comprimidas” com o folding do Vim, para que possamos focar a atenção apenas nas diferenças, e não nas similaridades.

Para ter o vimdiff disponível no Ubuntu acredito que seja necessário instalar o pacote vim-full:

sudo apt-get install vim-full

O comando wc do Linux

Acabei de descobrir um comando que pode ser útil para muitos: como calcular a quantidade de linhas de um arquivo. É o comando wc com a opção -l. Exemplo:

wc -l meu_arquivo.txt

Você pode aplicar esse comando em todos os arquivos de um diretório, e verá uma saída como a seguinte (note que a última linha da saída é a soma da quantidade de linhas de todos os arquivos listados):

caio@caio-desktop:~/tmp$ wc -l *
  11 a.txt
  30 b.txt
  51 c.txt
  31 d.txt
 123 total

Ao contrário da maioria dos programas que conheço no Linux o wc possui poucas opções, e entre as mais legais (mas não necessariamente úteis) estão:

  • --chars: imprime a quantidade total de caracteres do arquivo
  • --max-line-length: imprime a quantidade de caracteres da linha mais longa do arquivo
  • --words: imprime a quantidade de palavras do arquivo

Objetos e referências no PHP5

Em: 12/02/2008 Tags: PHP Comentários (2) Referencie do seu blog (Trackback)

Estava lendo esta apresentação da Laura Thomson, autora de um ótimo livro sobre a linguagem, quando deparei com um erro no slide 95. Ela afirma que no PHP4 os objetos são automaticamente passados por referência, enquanto no PHP5 não. O que acontece é justamente o contrário. O exemplo abaixo demonstra o funcionamento da atribuição de objetos (operador =) a referências no PHP5.

class MyClass {
}

$a = new MyClass();
$b = clone $a;

if ($a === $b) {
    echo '$a and $b point to the same object.'."\n";
} else {
    echo '$a and $b DO NOT point to the same object.'."\n";
}

$c = new MyClass();
$d = $c;

if ($c === $d) {
    echo '$c and $d point to the same object.'."\n";
} else {
    echo '$c and $d DO NOT point to the same object.'."\n";
}

A saída desse programa é a seguinte:

$a and $b DO NOT point to the same object.
$c and $d point to the same object.

Os pontos importantes a notar:

  • O operador clone força a criação de uma nova instância de MyClass, com os mesmos atributos de $a (o objeto é “clonado”).
  • O operador ===, quando aplicado a duas referências, indica se ambas apontam para um mesmo objeto.
  • O operador =, quando aplicado a dois objetos, faz com que a referência do lado esquerdo do operador aponte para o mesmo objeto para o qual a referência do lado direito aponta (uma cópia do objeto não será criada em memória).

No manual oficial do PHP também há um parágrafo que expressa exatamente esse conceito:

[…] quando se utiliza o operador de identidade (===), objetos são idênticos se e apenas se eles são a mesma instância da mesma classe.


Uma DSL para manipular datas em JavaScript

Hoje precisei realizar uma operação que, inicialmente, me parecia bastante simples: a partir de um objeto Date do JavaScript, queria calcular um outro objeto Date, sendo que o segundo representaria uma data 5 dias no passado. Fácil? Não foi. É verdade, eu estava sem uma boa referência por perto, mas a verdade é que não consegui descobrir como fazê-lo em poucas linhas. Uma nova busca no Google e encontro a DateJS, que é exatamente o que eu procurava: uma DSL para manipulação de datas em JavaScript.

Como ela resolveu meu problema? Em 1 linha. Os exemplos abaixo mostram a utilização da biblioteca a partir da linha de comando, com o Rhino. Na segunda linha do exemplo está a solução para o meu problema inicial.

js> load('date.js')
js> (5).days().ago()
Wed Feb 06 2008 20:47:28 GMT-0200 (BRST)
js> Date.today().is().monday()
true
js> Date.parse('next saturday')
Sat Feb 16 2008 00:00:00 GMT-0200 (BRST)

Faça o download e confira como é fácil utilizá-la! O site oficial mostra outros exemplos interessantes.


Próxima página »