segunda-feira, 31 de dezembro de 2007

Links para quem está iniciando no desenvolvimento WEB.

Para quem já tem certa experiência com o desenvolvimento, estes links podem não fazer muita diferença, mas para quem está começando podem representar toda a diferença.

PHP.net (portugês ou inglês)
W3Schools (em inglês)
PHPBuilder (em inglês)
GotAPI (em inglês)

E você, tem algum link para sugerir? Deixe o seu link e o seu comentário.

Firefox 3: O que esperar.

Com o fim decretado pela AOL ao Netscape Navigator, resolvi dar uma olhada no que está sendo desenvolvido para o tão aguardado Firefox 3. No momento em que escrevo este artigo, a versão atual é a beta 2.

  • Apenas um lembrete: Esta versão é destinada a desenvolvedores. Caso você esteja fazendo o download desta versão beta, esteja ciente de que ainda não é a versão final e que erros inesperados poderão ocorrer. Portanto: baixe-a por sua própria conta e risco.
As melhorias para o usuário final estão divididas em 3 categorias:
  • Experiência do usuário;
  • Segurança e privacidade;
  • Performance.
Vamos a cada uma delas.

Experiência do usuário: Nesta categoria, alguns melhoramentos foram efetuados para simplificar a navegação do usuário pelas páginas da internet. As melhorias englobam o gerenciamento de senhas, instalação de add-ons simplificada, novo gerenciador de downloads com possibilidade de reiniciar seus downloads, mesmo que o browser seja fechado ou a conexão tenha caído, integração melhorada com o Windows Vista e com o MacOSX, utilização de tags para seus favoritos e suporte melhorado a navegação offline.

Na área de segurança e privacidade, há uma maneira de saber mais informações sobre o site que você está acessando, proteção contra malwares, proteção contra pishing de páginas, erros SSL compreensíveis, proteção para add-ons desatualizados ou inseguros, atualização dos add-ons de maneira segura, integração com antivírus e, no caso de usuários do Windows Vista, suporte ao controle de sites inapropriados às crianças presente no próprio sistema operacional.

Já na área de performance, a confiabilidade ao gravar o histórico, cookies, os favoritos e as preferências foram melhoradas através de um banco de dados com suporte a transações. A velocidade foi melhorada através da modificação do código que gerenciavam como a tela é exibida e o tratamento do leiaoute da página. Por fim, o gerenciamento de memória foi melhorado, fazendo com que o Firefox consuma menos memória para as páginas.

Agora, resta apenas esperar pelo lançamento da nova versão. Deixe seu comentário sobre o que você espera da nova versão.

domingo, 30 de dezembro de 2007

Para refletir neste final de ano...

Geração de PDF's no Windows.

Quem nunca precisou gerar um PDF para enviar por e-mail com uma proposta que atire a primeira pedra. Há algum tempo, venho testando uma ferramenta freeware para Windows® e até agora, não tive nenhum problema.

Estou falando do CutePDF Writer. É uma ferramenta leve e pequena (seu download tem aproximadamente 1.6 MB), mas tem apenas um pré-requisito importante: é necessário ter instalada a versão 8.15 do GhostScript.

O que esta ferramenta faz é criar uma impressora virtual em sua máquina, chamada de CutePDF Writer. Assim, qualquer programa, por mais antigo que seja, está apto a gerar PDF's, bastando apenas indicar a impressora virtual na hora de imprimir.

Ao enviar qualquer documento para esta impressora virtual, aparece uma tela solicitando "onde" o programa deverá salvar o documento, bem como seu nome. Simples, não?
Para instalá-la, é necessário baixar o GhostScript e instalá-lo. Após concluir este processo, baixe o CutePDF Writer e instale-o. Ambas as instalações seguem o processo "Next-Next-Finish" ou "Avançar-Avançar-Concluir", padrão nos instaladores. Após a instalação de ambos, faz-se necessário reiniciar a máquina.

Feito isto, você já pode gerar PDF's de todos os seus arquivos cujos programas possibilitem a escolha da impressora.

Caso você utilize Linux, você pode fazer uso do Samba para criar esta impressora virtual e gerar seus PDF's. Consulte a documentação do Samba para maiores detalhes.

Firefox: uma solução para memory leaks.

Ultimamente estava cansado de, muitas vezes, precisar fechar o Firefox pois ele estava consumindo devorando a memória RAM do meu equipamento. Coincidentemente, há alguns dias atrás enquanto eu navegava na internet por outro motivo, encontrei uma solução que resolveu meus problemas do Firefox no consumo elevado exagerado de memória.

Esta é a minha tradução livre do artigo escrito pelo Ryan do CybernetNews.

Esta pequena correção irá mover o Firefox para o seu disco rígido quando você minimizá-lo, representando um consumo de, aproximadamente, 10 MB de memória enquanto minimizado. Entretanto, quando você maximizá-lo, irá obviamente, aumentar a utilização de memória. Mas não irá chegar ao utilizado antes de minimizá-lo. Por exemplo: O Firefox estava utilizando 180 MB e então eu resolvo minimizá-lo e, após alguns segundos, maximizo-o novamente. Após maximizá-lo e continuar trabalhando, aparentemente estava consumindo apenas 60 MB. Isto pode parecer uma boa solução para mim, uma vez que freqüentemente eu minimizo-o e maximizo-o.

Eu sei que muitas pessoas irão dizer que o Firefox demorará um pouco mais para maximizar, uma vez que encontra-se localizado no disco rígido, mas não percebi NENHUMA demora. É a sua habilidade em redesenhar-se tão rapidamente quanto possível se estiver localizado na RAM. Seguem os passos para ativar este hack:

  1. Abra o Firefox e, na barra de endereços, digite about:config e pressione Enter.
  2. Clique com o botão direito na página e selecione Nova opção -> Boolean.
  3. Na caixa de texto que aparece, digite config.trim_on_minimize e pressione Enter.
  4. Selecione True e então pressione Enter.
  5. Reinicie o Firefox.

Simples não? De qualquer maneira, você sempre pode retornar e apagar a configuração que você criou, caso apresente algum problema. Eu também configurei a opção browser.sessionhistory.max_total_viewers para 0 pois isto irá prevenir o Firefox de fazer o cache das páginas a serem utilizadas no botão Voltar. Suponho que isto irá liberar alguma memória que tenha sido utilizada.

Este fix também funciona com o Thunderbird, mas ainda não pude testá-lo. Este fix "deve" funcionar também com o Netscape, Mozilla e o SeaMonkey.

Infelizmente esta correção funciona apenas para máquinas Windows. Usuários Macintosh e Linux não notarão diferença alguma.

Como vocês puderam perceber, é um fix que pode ajudar (e muito) àqueles que utilizam mais de um navegador e, de tempos em tempos, precisa alternar para testar as páginas que estão desenvolvendo.

Upload de múltiplos arquivos usando um único INPUT.

Recentemente, deparei-me com uma necessidade de poder efetuar upload de múltiplos arquivos usando código em javascript.

O modelo atual permitia apenas o envio de um único arquivo por vez. Foi aí que resolvi desenvolver algo mas estava esbarrando em um problema um tanto impeditivo: o script estava gerando alertas no browser do usuário.

Ter que reconfigurar o browser de todos os clientes para não ficar gerando o alerta seria uma tarefa impossível e fora de cogitação (sem contar o trabalho extra que iria gerar para o pessoal da área de suporte).

Após isto tudo ter ocorrido, comecei a pesquisar no grande oráculo Google sobre uma maneira de gerar este script de maneira não-obstrutiva.

Então, ontem eu acabei encontrando uma maneira. Neste link, você poderá encontrar uma descrição sobre como trabalha o script, bem como o download do código fonte (são apenas 4 KB ou 2 KB comprimido).

Outro detalhe importante: testei o script no Internet Explorer 5.5 (eu sei que é um browser arcaico velho, mas tem gente que ainda o utiliza), Firefox 1.5/2.0, Opera 8 e Safari 3.0.4. Em todos eles funcionou perfeitamente.

Fica a dica a todos.

Programação: menos é mais.

Há muito tempo venho observado alguns programas fontes de alguns colegas que desenvolvem. Muitas vezes, o desenvolvedores optam por soluções malucas mirabolantes para contornar um problema que as vezes é simples, mas devido a complexidade de sua estrutura (design de tela, campos de entrada de dados, lógica interna, etc) o impedem de simplificar sua tarefa no desenvolvimento sem ter que refazer reescrever boa parte do código.

Quando desenvolvo, não utilizo o código mais complexo possível e sim o mais simples. As vezes, isto pode parecer coisa de inexperiente amador, mas numa eventual manutenção, fica muito mais simples e rápido de efetuá-la.

Recentemente, eu havia lido este artigo publicado pelo Carlos Brando em seu blog sobre Ruby on Rails, o qual fez-me parar e analisar os códigos que estava desenvolvendo. Ainda bem que estou no caminho certo.

E você, como tem desenvolvido? Tem escrito códigos muito complexos e que só você consegue entender? Lembre-se: ninguém, mas ninguém mesmo, é insubstituível.

Stored Procedures no MySQL

Navegando na internet, encontrei um bom artigo escrito por Wagner Bianchi descrevendo como trabalhar com store procedures no MySQL. Ele pode ser encontrado aqui. Leitura recomendada.

Falcon - O mais novo engine transacional do MySQL.

Falcon - O mais novo engine transacional do MySQL.Estava dando uma olhada no que há de novo na nova versão do MySQL, a qual ainda encontra-se em estágio de desenvolvimento. No momento em que escrevo este artigo, o desenvolvimento encontra-se em estágio alfa.

Esta nova versão, provê maior confiabilidade, performance e avanços para facilitar sua utilização com a utilização do engine Falcon.

More... Algumas novidades na versão 6:

  • Transações ACID.
  • Recuperações após uma parada não esperada (crash).
  • Espaço para tabelas (tablespaces) definidos pelo usuário. Isto já é comum em servidores PostgreSQL, Oracle, entre outros.
  • Cache de dados aprimorado, dando maior velocidade.
  • Índices B-Tree avançados.
  • Monitoramento de performance e diagnóstico em tabelas.
  • Configuração simplificada.
Esquema de funcionamento do Falcon.

Para compreender melhor como funciona este novo engine, foi disponibilizada documentação divididas em três partes, as quais podem ser acessadas aqui, aqui e aqui.

Vale o lembrete: apesar de estar na versão pré-produção (conforme os desenvolvedores definem) ainda é cedo para colocá-lo no ambiente de produção.

ADOdb, Store procedures em MySQL e problemas.

Outro dia, deparei-me com alguns problemas ao utilizar o ADOdb. Criei algumas stored procedures (sp's) no banco de dados (MySQL) e ao chamá-las através do ADOdb, algumas mensagens de erro eram retornadas.

A primeira delas retornava a seguinte mensagem de erro:

Procedure mySP can't return a result set in the given context.

Referia-se a CLIENT_MULTI_RESULTS estar desabilitada. Como a sp executa comandos e estes produzem mais de uma saída na tela, o ADOdb trata-os como sendo mais de um RecordSet. Após algum tempo pesquisando, encontrei a maneira correta de fazê-la:

$flags = 131074;
$dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags";
$conn = ADONewConnection($dsn);

Em seguida veio outra mensagem:
Commands out of sync

Esta refere-se à execução da SP. Para resolver, configure a variável global $ADODB_COUNTRECS para FALSE.

Há duas maneiras para resolver.

1. No caso de apenas o primeiro grupo de registros interessar a você, você pode descartá-los usando o método Close() da conexão (esta não é a maneira mais elegante mas resolve).

2. Chamar o método NextRecordSet() para recuperar o próximo conjunto de resultados e dar o devido tratamento ao próximo grupo de registros.

Estas foram as principais dificuldades que encontrei até agora ao utilizar sp's junto ao MySQL com o ADOdb. Alguém mais tem alguma situação com outro SGBD utilizando o ADOdb que queira compartilhar conosco?

Frameworks: até que ponto vale a pena utilizá-los?

Um framework ajuda, e muito, no desenvolvimento de aplicações web ou até mesmo sites. No começo pode parecer que ao invés de ajudar, eles atrapalham e complicam o desenvolvimento. Mas após um pouco de utilização, eles tornam sua tarefa no desenvolvimento mais simples.

Para quem está começando a desenvolver aplicações, pode ficar tentado a utilizar o framework XYZ, que faz 90% do que você precisa. Mas os 10% restantes, podem acabar demorando mais que o planejado para ser concluído.

Não vou dizer que o framework atrapalha. O que você precisa ter em mente é justamente saber como e quando utilizá-lo, para que seu código não fique complexo. A conseqüência disto pode ser na hora de uma manutenção, seja por erro ou para melhorar a performance da sua aplicação.

Costumo utilizar frameworks simples, que fazem algumas tarefas específicas. Não uso o framework como kernel principal da aplicação. Para este caso, procuro desenvolver as rotinas para fazer especificamente o que elas precisam fazer. Em alguns casos estas rotinas acabam virando classes (para reutilização/reaproveitamento de código).

Uma ponderação a ser feita é justamente o tamanho do framework: utilizar diversos frameworks podem deixá-la graficamente linda, mas também pode fazer com que sua aplicação torne-se muito lenta tanto para carregar no lado cliente, como também exigir mais poder de processamento e memória recursos do servidor que o necessário.

Frameworks para gerenciamento do lado cliente (como o prototype, script.aculo.us entre outros) podem ser justamente um entrave na carga da aplicação. O prototype, por exemplo, tem aproximadamente 160 KB de código. Por mais que tenhamos conexões de alta velocidade disponíveis e a preços acessíveis, precisaremos focar a aplicação e em qual nicho de mercado ela atuará. Usuários com conexão discada, só irão entrar na aplicação se realmente precisarem dela. Do contrário, após a primeira utilização (e demora para a carga), pensarão duas vezes antes de acessá-la novamente.

Caso você esteja pensando em utilizar um framework para desenvolvimento de uma aplicação, o primeiro passo é definir quem será o seu usuário. Para os casos onde o usuário utiliza linha discada, talvez seja melhor você desenvolver seu próprio framework (com funções, classes e tudo o que você precisar) com apenas o que você precisa. Seu usuário irá agradecer.

Saiu do forno a nova versão do WampServer.

WAMP Server, acrônimo de (Windows, Apache, MySQL e PHP), foi lançado no último dia 21 de novembro. Apesar de não ter sido feito um grande alarde, o grande diferencial entre esta e a versão anterior é a possibilidade de se instalar diferentes versões do Apache, MySQL e do próprio PHP.

As vezes até parece um pouco de contra-senso chamar uma versão mais nova com um número inferior (WAMP5 e WAMP Server 2.0) . O último é a evolução do anterior.

Para você que ainda não o conhece, recomendo que baixe-o, instále-o e teste-o. Estou utilizando e digo de antemão: é uma excelente ferramenta de desenvolvimento.

Agora é só esperar saírem os plugins.

Solucionando problemas de conversão de caracteres.

No Prototype (isto aconteceu comigo), estava tentando a todo custo enviar as requisições utilizando ISO-8859-1. Não havia jeito. Mesmo forçando o encoding, o Prototype teimava em mandar as requisições como UTF-8. E quando chegava no servidor, no PHP eu tinha um problema enorme nas mãos: Converter estes caracteres.

Vasculhando pela net, encontrei uma maneira simples de resolver este problema: O PHP possui uma função biblioteca específica para este tipo de conversão.

Utilizando a função iconv(string $in_charset, string $out_charset, string $str) onde você especifica o charset de entrada, o charset de saída e a string a ser convertida, você será agraciado com a conversão de caracteres.

Esta não foi a melhor forma (o Prototype deveria ter feito a codificação corretamente), mas resolveu meu problema.

quinta-feira, 10 de maio de 2007

Estréia no mundo dos blogs.

Olá a todos!

Estou estreando meu blog hoje, 10/05/2007. O propósito deste blog é descrever um pouco as curiosidades cotidianas que acontecem comigo, as quais estão ligadas diretamente com tecnologia e informática.

Espero que gostem.

Luis Fernando.