Older blog entries for jarod (starting at number 26)

JavaScript - eu gosto!

Na página da tiobe que mede o ranking de popularidade das linguagens, uma notícia curiosa: "JavaScript atinge o seu ranking mais alto e ultrapassa C#". Embora eu não tenha colocado javascript na minha lista das doze mais, tenho um carinho especial por linguagem. Mas não foi sempre assim.

A primeira vez que eu vi JavaScript, eu estava no colégio. Tinha um cara na sala que ficava cheio de pompa, dizendo que fazia páginas e DHTML. De vez em quando vinha ele nos mostrar códigos cheio de DIVs, LAYERS (lembram-se disso?) e uma porção de ifs, incompreensíveis pra mim. Não me empolguei com aquilo. Vendo a história, vejo que me livrei do fogo cruzado da guerra dos navegadores. Comecei a ver JavaScript com mais afinco na época que entrei no ministério. Isso porquê era mais divertido fazer a parte do JavaScript do que escrever milhares de consultas SQL, que no fim das contas, eram todas iguais.

Mas, o inesperado é que eu tomei gosto pela coisa. E a onda de ajax e web 2.0, fizeram com que muita gente, mesmo sem muito gosto, fosse obrigada a mexer com JavaScript. Ou, usar frameworks como o Google Web Toolkit, que permite que você desenvolva ajax sem escrever JavaScript. O suporte de CSS e JavaScript nos navegadores, apesar de falhos, permitem que não seja mais tão difícil escrever código crossbrowser. Melhor assim.

A partir de um link no googletron, eu fui parar no Coding Horror ( com isso, descobri de onde o Gabriel Falcão tirou o ícone que usa no talk), e acabei finalmente aqui: http://blogs.msdn.com/ericlippert/archive/2004/03/18/92422.aspx . Era uma discussão de como as pessoas poderiam usar (e usam) orientação a objetos de formas nocivas. Desse último site, gostaria de citar uma frase:

"É claro, eu posso estar sendo um pouco tendencioso. Eu gastei cinco dos últimos oito anos trabalhando com JScript quie pode ser usada como uma linguagem imperativa, orientada a objetos e linguagem funcional, e é normalmente embutida dentro de linguagens declarativas como HTML e XML (Meu colega da Netscape, Waldemar Howart, disse me uma vez que JavaScript era apenas uma outra sintaxe para Common Lisp - ele era um fã aficcionado de programação funcional).

Pensando nisso, Jscript pode ser uma linguagem pedagógica muito interessante. É muito fácil ser produtivo com pequenos scripts imperativos,ela implementa características de linguagens funcionais como closures e funções anônimas, e tem um modo interessante e não padrão de implementar Orientação a Objetos (herança de protótipos)."

Bom, eu passaria longe de Jscript, mas, apesar das complicaçõezinhas dos navegadores, acho divertido escrever JavaScript.

Para pensar:

  1. Já repararam como lisp influencia muita coisa por aí? Segundo Peter Norvig, Python é um 'dialeto de lisp com uma sintaze mais tradicional. Matz já afirmou a influência de Lisp sobre Ruby. Agora, nessa citação, Waldemar Howart afirma a influência de Lisp sobre JavaScript. Existe um documento que descreve a evolução de linguagem Lua, e nele é declarada a influência de Scheme sobre Lua.

  2. Já olharam além das 20 mais no ranking do tiobe? Em outubro do ano passado, a lista de Lua comemorava o fato de lua ter entrado em 50º lugar no tiobe . Esse mês, ela está em 25º lugar!

Para ler:

  • Editor Intype - pode ser programado usando JavaScript (eles mudaram da linguagem Lua. Eu continuaria com Lua.)
  • Forca em JavaScript - Uma das coisas que fiz enquanto aprendia
  • EcmaScript 4 - As propostas para o ECMAScript 4.
  • El Micox - Diversos exemplos de scripts

Syndicated 2007-03-27 13:21:34 from Walter Cruz - devlog

Lançada Versão 0.96 do Django

http://www.djangoproject.com/weblog/2007/mar/23/096/

Anunciado em http://www.djangoproject.com/weblog/2007/mar/23/096/

Um trecho do post:

Estamos incrivelmente orgulhosos de anunciar o lançamento do Django 0.96!

O alvo principal para o 0.96 foi uma limpeza e estabilização de características introduzidas no 0.95. As notas de lançamento cobrem as poucas mudanças que não mantém retrocompatibilidade, mas para a maioria das pessoas o processo de atualização deve ser simples.

Uma mudança em particular afeta os usuários do MySQL em versões antigas: Se acontecer com você um erro, sobre o Django requerer uma versão mais nova do MySQLdb, você irá precisar ou atualizar o MySQLdb para a versão 1.2.1p2 ou superior, ou alterar sua configuração de DATABASE_ENGINE para "mysql_old". Você pode ler mais sobre essa mudança nas notas de lançamento.

Além disso, o Django agora se integra melhor com ferramentas de teste. A versão 0.96 vem com uma nova biblioteca para lidar com formulários - newforms.

Leia o post falando sobre a nova versão do Django em: http://www.djangoproject.com/weblog/2007/mar/23/096/

Syndicated 2007-03-23 22:33:09 from VarDump

Avisos Rápidos - 23/03/2007

Curtas:

  1. Lembram do kodumaro? É um blog colaborativo sobre programação. Ele começou no wordpress, mas já há alguns dias mudou-se para o blogspot. A nova URL é http://kodumaro.blogspot.com/ . Atualizem suas URLS e feeds!

  2. Eu estou com uma porção de idéias de textos e artigos pra postar. Portanto, devo postar algo inédito no kodumaro também, ao invés de manter o reblogging contínuo lá. Portanto, assinem o feed.

  3. Por falar, em feeds, estou redirecionando os feeds do devlog para o feedburner. Assim vai ficar mais fácil contar quantas pessoas ainda tem paciência de assinar meu feed

  4. Outra: como vocês sabe, sou fãs de coisas não muito populares. Gosto do editor de textos SciTE, dos sintetizadores Alesis e do b2evolution, essa engine de blog que move as coisas aqui. Criei um blog específico sobre o b2evolution, onde pretendo divulgar dicas, plugins, e tentar prosseguir com meu projeto para esse ano, que é criar uma comunidade em torno dele no Brasil. Dê uma passadinha lá também: http://b2evolution.waltercruz.com/

Syndicated 2007-03-23 17:26:01 from VarDump

Cartões Postais e Outros Presentes

"Eu estava mais interessado em ver onde as pessoas estavam usando o Linux. Em vez de dinheiro, preferi cartões-postais. E choveram, cartões - da Nova Zelândia, do Japão, da Holanda, dos Estados Unidos. (...) Os cartões-postais chegavam às centenas e não tenho idéia do que aconteceu com eles. Devem ter desaparecido em uma de minha mudanças. Avuton diz que eu sou a 'pessoa menos nostálgica' que ele já conheceu." (Linus Torvalds, em Só por prazer - Linux - os bastidores de sua criação (editora Campus)

Hoje quase todo mundo (inclusive eu) tem adsense. E quase toda página de projetos de software livre (pelo menos as internacionais) tem um botão do paypal para você doar algo para o projeto. Eu, como não ando tendo muito dinheiro para doar, faço minha doação em código e em relatórios de bugs, sempre que possível. Além disso, colaboro publicando textos, dicas e trechos de código no meu site.

Nunca esperei receber nada por isso (exceto, talvez os guias rápidos pelas minhas dicas publicadas no dicas-l, e é claro um pouco de reconhecimento. Quem não gosta disso?). Até que duas semanas atrás, um amigo (que prefere manter-se anônimo) que utilizou alguns códigos publicados quis me presentear! Após alguns dias, recebi os dois livros que escolhi: Criando páginas web com CSS (de Andy Budd, Camron Moll e Simon Collison - editora Prentice-Hall) e SQL, Curso Prático (Celso H. Poderoso de Oliveira - editora Novatec). Em breve farei uma resenha de ambos, mas posso adiantar que ambos são muito bons!

Muito tempo atrás, eu comprei (por uns 2 ou 3 reais) o livro "OS/2 para leigos". No final do livro, ele tinha um espaço em branco para escrever com um cabeçalho mais ou menos assim: "cara que conhece de computador pra me dar uma mão" e na outra coluna "lanche favorito para suborno". Apesar da palavra suborno parecer um pouco pejorativa, tenho que admitir: nós, programadores e curiosos de computador somos de fato, subornáveis. E contribuir financeiramente com um software que você usa, não é tecnicamente um suborno. (A não ser é claro, no caso do vim, onde só tem direito a voto quem fizer uma doação. Mas isso ainda não é suborno: se fosse livre pra todo mundo sugerir algo, virava uma casa da mãe Joana. Além disso, a doação será destinada ao projeto de ajuda para as crianças de Uganda) Para citar um exemplo famoso, o Augusto Campos, do br-linux, faz doações periódicas a vários projetos (veja por exemplo, a campanha de doações para a wikipedia).

Talvez com isso, seja hora deu perder a vergonha na cara e publicar minha wishlist no submarino. E segundo o Nando Vieira, que fala sobre adsense entre outras coisas em um podcast, eu deveria blogar sobre o RBD para aumentar meus lucros com o adsense. Mas continuarei blogando sobre programação, tecnologia, python e outras coisas que eu gosto de ler, e que eu imagino que vocês apreciem também!

Syndicated 2007-03-21 17:13:57 from VarDump

Compensa aprender python?

Uma das vantagens de se ter um domínio próprio é contar com uma série de ferramentas para ver estatísticas diversas, entre elas, como as pessoas chegam no seu site. É curioso ver o que as pessoas procuraram nos mecanismos de busca. A partir dessas buscas, resolvi responder a algumas delas e escrever textos sobre essas buscas aqui no site. E a primeira pergunta é: 'Compensa aprender python?'

Sou um fã da linguagem, logo, não posso dizer que minha resposta seja imparcial, embora eu esteja tentando sê-lo.

A resposta é: depende. As linguagens 'de mercado' agora são Java, .NET (esse, mais do que uma linguagem) e, concorrendo num terceiro lugar para web, PHP. Uma pesquisa num jornal de domingo, ou em sites de empregos revelará dezenas de vagas nessas linguagens, e pouquíssimas em outras linguagens como python ou ruby, ou até outras mais antigas, como perl.

Mas, se você trabalha com uma linguagem de tipagem estática e compilada (C ou Java, por exemplo) aprender uma linguagem de tipagem dinâmica e interpretada pode levá-lo a executar algumas tarefas mais rapidamente do que seria com uma outra linguagem. Isso porque, com python, você pode ir testando direto no console, a sintaxe da linguagem é fácil e ela tem baterias incluídas - uma porção de bibliotecas para fazer quase tudo o que você quer.

E python é uma linguagem de uso geral, ao contrário de PHP, que é voltada para web (apesar do PHP-GTK fazer um esforço noutra direção). Você pode escrever programas para web (Django e TurboGears são apenas duas formas dentre várias), para desktop, robôs de busca, e muito mais. Muitas vezes, os empregos disponíveis para as linguagens da moda são para 'apertadores de parafuso', ou como diria o Fábio Akita, mais tela de cadastro. Um conhecimento de uma linguagem que não seja a da moda, pode te levar a trabalhar com coisas mais legais (por exemplo, Lua, a preferida para script em jogos, ou Python no celular). Seu interesse em python (ou outra linguagem que não seja a 'de mercado', como lua, ruby ou lisp) pode sinalizar a seu [futuro] empregador que você gosta de fato do que faz e está interessado em aprender. A escolha de aprender python deve ser muito mais calcada numa decisão pessoal do que pela observação do mercado. Pelo menos, na observação do mercado brasileiro.

Sugiro também a leitura de: http://www.1bit.com.br/content.1bit/weblog/meu_caso_com_o_python_2

Syndicated 2007-03-16 18:27:03 from VarDump

Compensa aprender python?

Uma das vantagens de se ter um domínio próprio é contar com uma série de ferramentas para ver estatísticas diversas, entre elas, como as pessoas chegam no seu site. É curioso ver o que as pessoas procuraram nos mecanismos de busca. A partir dessas buscas, resolvi responder a algumas delas e escrever textos sobre essas buscas aqui no site. E a primeira pergunta é: 'Compensa aprender python?'

Sou um fã da linguagem, logo, não posso dizer que minha resposta seja imparcial, embora eu esteja tentando sê-lo.

A resposta é: depende. As linguagens 'de mercado' agora são Java, .NET (esse, mais do que uma linguagem) e, concorrendo num terceiro lugar para web, PHP. Uma pesquisa num jornal de domingo, ou em sites de empregos revelará dezenas de vagas nessas linguagens, e pouquíssimas em outras linguagens como python ou ruby, ou até outras mais antigas, como perl.

Mas, se você trabalha com uma linguagem de tipagem estática e compilada (C ou Java, por exemplo) aprender uma linguagem de tipagem dinâmica e interpretada pode levá-lo a executar algumas tarefas mais rapidamente do que seria com uma outra linguagem. Isso porque, com python, você pode ir testando direto no console, a sintaxe da linguagem é fácil e ela tem baterias incluídas - uma porção de bibliotecas para fazer quase tudo o que você quer.

E python é uma linguagem de uso geral, ao contrário de PHP, que é voltada para web (apesar do PHP-GTK fazer um esforço noutra direção). Você pode escrever programas para web (Django e TurboGears são apenas duas formas dentre várias), para desktop, robôs de busca, e muito mais. Muitas vezes, os empregos disponíveis para as linguagens da moda são para 'apertadores de parafuso', ou como diria o Fábio Akita, mais tela de cadastro. Um conhecimento de uma linguagem que não seja a da moda, pode te levar a trabalhar com coisas mais legais (por exemplo, Lua, a preferida para script em jogos, ou Python no celular). Seu interesse em python (ou outra linguagem que não seja a 'de mercado', como lua, ruby ou lisp) pode sinalizar a seu [futuro] empregador que você gosta de fato do que faz e está interessado em aprender. A escolha de aprender python deve ser muito mais calcada numa decisão pessoal do que pela observação do mercado. Pelo menos, na observação do mercado brasileiro.

Sugiro também a leitura de: http://www.1bit.com.br/content.1bit/weblog/meu_caso_com_o_python_2

Syndicated 2007-03-16 17:27:03 from VarDump

Armadilha no LISTEN e NOTIFY (PostgreSQL)

Tradução do texto de Greg Sabino Mullane em seu blog.

O título original é LISTEN AND NOTIFY gotcha. Resolvi traduzir gotcha como armadilha. Primeiro, a definição de gotcha da wikipedia:
Em programação, um gotcha é uma característica de um sistema, um programa, ou uma linguagem de programação que funciona da forma como está documentado mas é contra-intuitivo e quase sempre propícia à erro porque é fácil de usar e impredizível em seu resultado.

Existe um problema sutil com os comandos LISTEN e NOTIFY. Enquanto o nome que você atribui no comando LISTEN parece um texto comum, ele é na verdade aquilo que é chamado de "nome" no PostgreSQL, que significa que está sujeito às mesmas estranhas regras e comportamento. Eu pessoalmente adoraria ver isso mudado de uma nome de relação para uma string normal, mas até que isso ocorra, seja cuidadoso com a forma que você usa essa dupla. Aqui está um exemplo de uso comum:

$ LISTEN employee;
LISTEN

$ NOTIFY employee;
NOTIFY
Asynchronous notification "employee" received from server process with PID 8875.

No exemplo acima, nós começamos a ouvir por evemtos com o nome "employee", então disparamos um NOTIFY com o mesmo nome e obtemos uma notificação imediata sobre isso. Porém, como o nome está sujeito a todas as regras de nomes de relações, existem outros problemas:

$ LISTEN host;
LISTEN

$ LISTEN user;
ERROR:  syntax error at or near "user"
LINE 1: listen user;
               ^

$ LISTEN "user";
LISTEN

$ SELECT * FROM pg_listener;
 relname  | listenerpid | notification 
----------+-------------+--------------
 employee |        8875 |            0
 user     |        8875 |            0
 host     |        8875 |            0
(3 rows)

$ NOTIFY user;
ERROR:  syntax error at or near "user"
LINE 1: listen user;
               ^

$ NOTIFY "user";
NOTIFY
Asynchronous notification "employee" received from server process with PID 8875.

Observe que precisamos colocar a palavra "user" entre aspas, pois a palavra user não é válida como um nome de relação sem aspas. Agora note que a tabela pg_listener não nos dá nenhuma dica que isso precisa estar entre aspas. O problema real acontece quando adicionamos pontos ao nosso "nome". O Postgres trata isso como uma sequência de esquema, tabela, e coluna e remove tudo, exceto a parte final do nome:

$ LISTEN newyork.employee;
LISTEN

$ NOTIFY newyork.emplyee;
NOTIFY
Asynchronous notification "employee" received from server process with PID 8875.

$ NOTIFY losangeles.employee;
NOTIFY
Asynchronous notification "employee" received from server process with PID 8875.

$ NOTIFY elephants.makeagood.employee;
NOTIFY
Asynchronous notification "employee" received from server process with PID 8875.

$ LISTEN thisworks.forunquoted.user;
LISTEN

$ LISTEN cannot.handle.three.dots;                       
ERROR:  improper qualified name (too many dotted names): cannot.handle.three.dots                                           

Eu enviei uma correção para a documentação, mas tome cuidado, principalmente se você escreve código que gera nomes automáticos para os seus argumentos LISTEN.

Syndicated 2007-03-14 13:20:41 from VarDump

Rails Rally: Apertem os cintos, o piloto sumiu

Semana de rails rally. Uma semana atípica para mim. Eu, que nunca faço nada a noite, que estava planejando junto com o Diogo (meu colega de trabalho) participarmos juntos do Rails Rally, me vejo empilhado em coisas a fazer! Não bastasse isso, uma baita duma dor de cabeça, que resolveu me acompanhar a semana inteira (já contei a vocês que tenho 11 graus de miopia? Desconfio que essa dor seja por causa dos óculos).

Resumindo: comecei um projeto, mas ficou só nisso. Mas não foi de todo ruim: aprendi mais um pouco sobre rails e sobre como funciona a herança no Active Record. Perdi o rally. Por (forçoso) W.O.

Syndicated 2007-03-10 01:27:33 from VarDump

Adicionando usuários ao trac via script

Esse é meu primeiro post que foi publicado no kodumaro também. A partir de agora, você pode me acompanhar lá também. Além disso, estou com um blog separado sobre o b2evolution que você pode acessar em http://b2evolution.waltercruz.com, onde pretendo postar dicas, plugins e muito mais sobre o CMS que eu uso no meu site.

Há um tempo atrás, como todo desenvolvedor que se preze, comecei a usar um controle de versão, no caso, o subversion. Logo depois, descobri o trac, uma ferramenta que agrega ao svn um wiki e um bugtrack. Uma mão na roda pra gerenciamento de projetos!

A ferramenta padrão para administrar o trac é por linha de comando: trac-admin. Sempre que eu criava um novo repositório, precisava adicionar os usuários com permissão de desenvolvedor no trac correspondente a esse repositório. Porque não facilitar as coisas?

Como o trac é feito em python, posso usar a API em um programa. Foi o que fiz. O resultado:


#!/usr/bin/python2.4
# -*- coding: iso-8859-1 -*-
import sys
import os
import trac.scripts.admin as admin
from trac.perm import PermissionSystem as Permission
import pysqlite2

class TracHelper(object):

    developers = ("walter","cacilhas","torcato","will")
    developersPermissions = ("WIKI_ADMIN","REPORT_ADMIN","TICKET_MODIFY")

    def __init__(self,projectPath):
        try:
          self.projectPath = projectPath
          self.env = admin.Environment(self.projectPath)
          self.permissao = Permission(self.env)
        except:
          'Eh necessario especificar um projeto'

    def addDeveloperProfile(self):
        for permission in self.developersPermissions:
            try:
                self.permissao.grant_permission('developer',permission)
            except pysqlite2.dbapi2.IntegrityError, e:
                print('Já existe usuário com essa permissão')
                sys.exit(1)

    def addDevelopers(self):
        for developer in self.developers:
            try:
                self.permissao.grant_permission(developer,'developer')
            except pysqlite2.dbapi2.IntegrityError, e:
                print('O usuário ' + developer + ' já existecom essa permissão')
                sys.exit(1)               

    def destroyDeveloperProfile(self):
        for permission in self.developersPermissions:
            self.permissao.revoke_permission('developer',permission)

if __name__ == "__main__":
      try:
        helper = TracHelper(sys.argv[1])
      except:
        print('É necessário informar o caminho do Projeto')
        sys.exit(1)

      #helper.destroyDeveloperProfile()
      helper.addDeveloperProfile()
      helper.addDevelopers()

O modo de usar é simples: ./usuariostrac.py /var/trac/repositorio .

Dito isso, eis o que descubro hoje: um plugin para o trac para fazer a administração dele via web. Mas diga que não foi mais interessante o passeio pela API do trac?

Syndicated 2007-03-06 20:27:47 from VarDump

Closures

Com a popularidade da linguagem Ruby, conceitos como meta-programação, blocos e closures começam a se tornar parte do vocabulário de muitos programadores. Alguns, como por exemplo os usuários de Lua e JavaScript já estão acostumados com isso. Outros, como os usuários de Java tem adicionado a palavrinha closures na lista de coisas que desejam ter na linguagem. Mas o que vem a ser isso?

=> Continua ...

Syndicated 2007-02-22 20:20:51 from VarDump

17 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!