Older blog entries for jarod (starting at number 111)

Escreva para quem vai dar manutenção!

Do C2 Wiki, através do Coding Horror: "Sempre codifique como se a pessoa que vai dar manutenção no seu código fosse um psicopata violento que sabe onde você mora."

Syndicated 2008-07-15 13:29:13 from devlog

Bugs mais velhos do que eu! (ou você!)

Dois meses atrás eu fiquei espantado com a idade do bug do BSD que tinha sido corrigido: 25 anos. Pois não é que hoje eu fico sabendo de um bug no yacc do OpenBSD que remonta há 33 anos? Mais velho que eu!

Syndicated 2008-07-09 15:06:20 from devlog

Protocol Buffers

http://google-opensource.blogspot.com/2008/07/protocol-buffers-googles-data.html

É o nome do mais novo projeto do google disponibilizado para a comunidade do código livre.

Segundo a descrição no anúncio do projeto, ele nasceu da necessidade de serializar dados e trocar esses dados serializados pela rede de forma eficiente. Já nasceu com versões para Java, C++, ou Python.

Você define uma descrição de um objeto, um arquivo .proto, e o compilador gera o código necessário para acesso na linguagem que você escolher, dentre as três suportadas.

Segundo a documentação: "Protocol buffers are now Google's lingua franca for data – at time of writing, there are 48,162 different message types defined in the Google code tree across 12,183 .proto files. They're used both in RPC systems and for persistent storage of data in a variety of storage systems."

Syndicated 2008-07-08 14:36:44 from devlog

4 Jul 2008 (updated 8 Jul 2008 at 04:08 UTC) »

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!
…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!

Syndicated 2008-07-04 15:23:04 (Updated 2008-07-08 03:49:13) from devlog

Mais Text Munger

Whitespace, punctuation, numbers -- anything that isn't a word -- should also remain unchanged.

Ou seja, minha implementação anterior está fundamentalmente errada ;)

E eu só li essa parte do enunciado depois do comentário do Rodolpho.

Mas é fácil de resolver, usando o shlex mesmo:


import sys
import shlex

from random import shuffle

def munge(text):
    t = shlex.shlex(text, posix=False)
    t.quotes = "'"
    t.whitespace = ""
    #print(list(t))
    s = (munge_word(word) for word in t)
    print("".join(s))

def munge_word(aword):
    s = list(aword)
    first = s.pop(0)
    try:
      last = s.pop()
    except IndexError:
        return aword
    shuffle(s)
    return first + ''.join(s) + last

try:
  s = open(sys.argv[1]).read()
  munge(s)
except IndexError:
  print("Usage: munge.py file")
 

Syndicated 2008-07-03 20:15:12 (Updated 2008-07-03 20:15:43) from devlog

Mysql usando bazaar, no launchpad!

http://blogs.mysql.com/kaj/2008/06/19/version-control-thanks-bitkeeper-welcome-bazaar/

Você pode até torcer o nariz para o fato de ser o launchpad, ou ser o bazaar, mas para mim, isso é uma seta gigantesca em direção a comunidade. Finalmente, o mysql está substituindo o bitkeeper por um sistema de controle de versões livre, e colocando isso num 'forge' público e bem conhecido. Uma ótima novidade, principalmente para a comunidade. ;)

Syndicated 2008-07-01 22:14:38 from devlog

Scammer atrapalhado

Uma imagem vale mais do que mil palavras nesse caso.. Reparem o nome da função disparada no link falso: onClickUnsafeLink .

scammer

Syndicated 2008-07-01 15:52:35 (Updated 2008-07-01 15:54:57) from devlog

Text Munger (ou nem tudo é como deveria ser)

Tudo começou quando eu esbarrei nesse link . O texto contém 15 exercícios de programação, entre eles o que eu me propus a fazer, o text munger.

O exercício consiste no seguinte: dado um texto qualquer, o text munger deve retornar o texto com as palavras desse texto modificadas da seguinte forma: ao invés da palavra original, teremos a primeira letra da palavra original, o resto da palavra (com exceção da última letra) embaralhado seguido da última letra da palavra.

Dentre as várias soluções disponíveis no ruby quiz, a solução em destaque, de Gordon Thiesfeld, usa a expressão regular \b para dividir as palavras. Expressões regulares são iguais em qualquer linguagem, certo? Bom, quase certo. O b funciona da mesma forma no ruby, perl e php, mas funciona de forma diferente no python. Ou não funciona. Na verdade, não sei se é um bug da implementação ou algo assim.

Eu poderia usar outra regex para dividir as palavras e as pontuações, mas já que o fato do \b não funcionar tinha me deixado frustrado com as regex (e eu não queria pensar muito nelas, pra mim o \b deveria funcionar), parti para outra solução. Descobri o shlex, um analisador léxico simples, que para o que eu precisava, funcionava muito bem.

Minha solução para o problema:


import sys
import shlex

from random import shuffle

def munge(text):
    t = shlex.shlex(text, posix=False)
    t.quotes = "'"
    s = [munge_word(word) for word in t]
    print(" ".join(s))

def munge_word(aword):
    s = list(aword)
    first = s.pop(0)
    try:
      last = s.pop()
    except IndexError:
        return aword
    shuffle(s)
    return first + ''.join(s) + last

try:
  s = open(sys.argv[1]).read()
  munge(s)
except IndexError:
  print("Usage: munge.py file")
 

Observe que a solução não está 100% igual a proposta em ruby. Devido a junção em (" ".join(s)), acabam aparecendo uns espaços em branco que não existiam no texto original.
Existe ainda uma solução em smalltalk proposta pelo Rodrigo Cacilhas no kodumaro. E você gosta de exercícios assim? Sabe porque o \b na implementação de regex do python não funciona como eu esperava? (ou serão minhas expectativas que estão erradas?). Os comentários estão aí para vocês!

Syndicated 2008-06-30 14:42:20 (Updated 2008-06-30 18:12:01) from devlog

Comparação de versões

Para um software, dizer que a versão 0.2 é maior que a 0.1 é moleza, mas como dizer que a versão 0.2.2 é maior que a 0.2?

Esse é um tipo de comparação que pode ser necessário feita. Talvez você tenha alguma parte do seu código que tenha uma implementação diferente e melhor para acima da versão x. O b2evolution usa isso, por exemplo, para habilitar o modo TRADITIONAL no Mysql quando o debug está ativado apenas a partir do MySQL 5.0.2. E usa também para habililtar alguns espertezas disponíveis apenas no PHP 5.1.

Em Python, a comparação pode ser feita usando o pkg_resources:

>>> from pkg_resources import parse_version
>>>
>>> parse_version("0.10") > parse_version("0.9")
True

>>> True
True
>>> parse_version("0.2.2") > parse_version("0.2")
True

>>> parse_version("0.1.2") > parse_version("0.2")
False

>>> parse_version("0.2.2") > parse_version("0.2")
True
>>>

Em PHP, usa-se a função version_compare

(Dica do pkg_resources retirada de http://lucumr.pocoo.org/cogitations/2008/06/19/%E2%80%A6-and-010-follows-09/)

Syndicated 2008-06-25 15:01:47 from devlog

Comparação de versões

Para um software, dizer que a versão 0.2 é maior que a 0.1 é moleza, mas como dizer que a versão 0.2.2 é maior que a 0.2?

Esse é um tipo de comparação que pode ser necessário feita. Talvez você tenha alguma parte do seu código que tenha uma implementação diferente e melhor para acima da versão x. O b2evolution usa isso, por exemplo, para habilitar o modo TRADITIONAL no Mysql quando o debug está ativado apenas a partir do MySQL 5.0.2. E usa também para habililtar alguns espertezas disponíveis apenas no PHP 5.1.

Em Python, a comparação pode ser feita usando o pkg_resources:

>>> from pkg_resources import parse_version
>>>
>>> parse_version("0.10") > parse_version("0.9")
True

>>> True
True
>>> parse_version("0.2.2") > parse_version("0.2")
True

>>> parse_version("0.1.2") > parse_version("0.2")
False

>>> parse_version("0.2.2") > parse_version("0.2")
True
>>>

Em PHP, usa-se a função version_compare

(Dica do pkg_resources retirada de http://lucumr.pocoo.org/cogitations/2008/06/19/%E2%80%A6-and-010-follows-09/)

Syndicated 2008-06-25 15:00:47 from devlog

102 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!