quarta-feira, 9 de setembro de 2009

Eclipse e plugins

Tutorial de Instalação do Eclipse com vários plugins (Aptana, PDT, DBViewer, Subversive e RegexUtil) no Ubuntu

por Alexandre Gomes Gaigalas, do Acorda pra Web!

Nesse Tutorial você vai aprender...

  • Baixar e instalar uma versão do Eclipse no Ubuntu
  • Usar o gerenciador de atualizações do Eclipse
  • Instalar Plugins no Eclipse
  • Instalar o Aptana, uma IDE para desenvolvimento de sistemas web em HTML, JavaScript, CSS e AJAX
  • Instalar o PDT, uma IDE para desenvolvimento web em PHP
  • Instalar o DBViewer, um plugin para acesso e administração de bancos de dados
  • Instalar o Subversive, para trabalhar com repositórios SVN no Eclipse
  • Instalar o RegexUtil, plugin para construir e testar Expressões Regulares no Eclipse

Como Baixar o Eclipse

Embora o Ubuntu possua em seus repositórios um pacote para o Eclipse, a última versão disponível é a 3.2, que é antiga demais para utilizarmos todas essas ferramentas. Isso torna necessário baixar o Eclipse diretamente do site oficial e instalar manualmente, o que é um processo extremamente simples.

Todas as versões do Eclipse recebem nomes de luas. A última versão, 3.4, chama-se Ganymede. Nesse tutorial utilizaremos a versão 3.3, chamada Europa. Não instalaremos a versão mais atual porque alguns plugins ainda não funcionam com ela, mas assim que houver uma alternativa para instalá-las, esse tutorial será atualizado

Primeiro, baixe o Eclipse 3.3.2 Classic, conforme a imagem abaixo

Navegador apontado para a página de Download do Eclipse 3.3.2.

Escolha o mirror, geralmente o primeiro da lista:

Navegador apontado para a página de escolha do mirror de download do Eclipse.

Instalação do Eclipse

Após terminar o download, você terá um arquivo .tar.gz. basta extrairmos esse arquivo que a pasta eclipse será gerada. Se você não sabe extrair o arquivo, clique em cima do ícone do mesmo com o botão direito e selecione a opção "Extrair Aqui".

Arquivo .tag.gz extraido para a pasta eclipse.

Para uma melhor organização, eu resolvi mover a pasta eclipse para o diretório do meu usuário dentro da pasta home do sistema. À partir de lá, abri pela primeira vez o executável eclipse dentro da pasta:

Pasta e executável do eclipse destacados.

Criação do Primeiro Workspace

No Eclipse existe o conceito de workspaces, que são diretórios nos quais todas as suas configurações e preferências ficam armazenados. Na primeira execução do Eclipse, ele solicitará que você informe o local de criação de um primeiro workspace. Eu geralmente crio um diretório chamado workspace dentro da pasta do meu usuário dentro do diretório home.

Diálogo de escolha do caminho do workspace.

A Interface do Eclipse

Nesse tutorial, que cobre apenas a instalação, não explicarei como funciona o Eclipse e todos os recursos presentes em sua interface. Utilizaremos, por enquanto, apenas o menu "Help" e o submenu "Software Updates", que abrirá a seguinte janela.

Janela de Instalação de Atualizações no Eclipse.

Marcaremos a opção "Search for new features to install", que significa que o atualizador buscará novos plugins para instalar no seu sistema. Ao avançarmos veremos a seguinte interface:

Atualizador/Instalador do Eclipse

O processo de atualização e adição de novos plugins no Eclipse é feito por sites que contém informações sobre os arquivos a serem baixados e atualizados. Esses sites, chamados de Update Sites aparecem em uma lista nessa janela. Para adicionar um novo site à partir de uma URL, utilizamos o botão "New Remote Site...". Adicionaremos os Update Sites dos plugins que desejamos adicionar:

Diálogo de Cadastro do Update Site do Aptana

Aptana, usando endereço http://update.aptana.com/install/studio/3.2/

Diálogo de Cadastro do Update Site do DBViewer

DBViewer, usando endereço http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/

Diálogo de Cadastro do Update Site do Subversive

Subversive, usando endereço http://www.polarion.org/projects/subversive/download/1.1/update-site/

Diálogo de Cadastro do Update Site do PDT

PDT, usando endereço http://download.eclipse.org/tools/pdt/updates/

Diálogo de Cadastro do Update Site do RegexUtil

RegexUtil, usando endereço http://regex-util.sourceforge.net/update/

Marcaremos o Eclipse para buscar novos plugins em todos os Update Sites, sem esquecer de marcar a opção de selecionar automaticamente or mirrors.

Instalador de Plugins do Eclipse

Possivelmente uma mensagem de erro de dependência aparecerá no topo, ao lado de um "X" vermelho. Note o nome do pacote org.eclipse.wst.

Para corrigir esse problema, vamos até a raiz do Europa Discovery Site e selecionaremos o requisito dentro da árvore "Web and JEE Development". O pacote que devemos adicionar é o Web Standard Tools.

Atualizando WST

Novas dependências surgirão, mas como se trata de um pacote desenvolvido pela equipe do Eclipse, poderemos usar um recurso interessante do instalador, o "Select Required", que resolverá as dependências por nós. Após clicar nesse botão, todos os erros devem desaparecer.

Resolvendo Dependências com o Select Required

Devido a alguns problemas de compatibilidade, nesse tutorial eu recomendo a remoção dos plugins de integração do subversive, no ítem "Subversive" da árvore:

Removendo plugins de integração do Subversive

Com todas as instalações devidamente marcadas, devemos ver uma tela similar a essa, e poderemos avançar:

Tela com atualizações marcadas.

Ao avançar, o Eclipse perguntará sobre a validação digital dos plugins. Basta confirmar a instalação conforme a imagem:

Verificação de assinatura digital dos plugins do eclipse.

Depois de algum tempo baixando os pacotes ele concluirá a instalação, basta reiniciar o Eclipse e todos os plugins já estarão disponíveis para utilização!

Se você ainda não sabe como utilizar o Eclipse ou algum dos plugins, aguarde os próximos artigos da série ;)

Dicas PHP

É comum ver scripts com dezenas de linhas de código pra fazer algo extremamente simples. Fica aqui meu apelo desesperado com algumas dicas rápidas.

1 – Listar arquivos de um diretório

Se não houver um motivo muito claro pra usar opendir, readdir e closedir (não consigo pensar em nenhum), a forma mais prática de listar o conteúdo de um diretório é com DirectoryIterator:

$iterator = new DirectoryIterator('/var/www');

foreach ( $iterator as $entry ) {
echo $entry->getFilename(), "\n";
}

Se for necessário listar os arquivos recursivamente, percorrendo todos os subdiretórios, é só usar o RecursiveDirectoryIterator junto com o RecursiveIteratorIterator:

$iterator = new RecursiveDirectoryIterator('/var/www');
$recursiveIterator = new RecursiveIteratorIterator($iterator);

foreach ( $recursiveIterator as $entry ) {
echo $entry->getFilename(), "\n";
}

Com um pouco de criatividade, é possível estender essas classes com qualquer lógica facilmente, como por exemplo, para montar uma árvore com a estrutura dos diretórios.

2 – montar e desmontar query strings

Mesmo que menos comum (e menos útil), colocar uma query string numa URL é um trabalho trivial demais pra ser feito com implode, concatenando tudo ou qualquer outro método engenhoso. Desde o lançamento do PHP 5 é possível contar com a http_build_query:

$dados = array(
'hl' => 'pt-BR',
'q' => 'Forgetting Sarah Marshall',
'testa-escape' => 'acentuação',
);

echo http_build_query($dados);
// hl=pt-BR&q=Forgetting+Sarah+Marshall&testa-escape=acentua%C3%A7%C3%A3o

E o inverso também é possível com as funções parse_url e parse_str:

$url = parse_url('http://www.google.com/search?q=anneke+van+giersbergen&num=50');

parse_str($url['query'], $query);

echo $query['q'];
// anneke van giersbergen

Só fique atento que, por motivos alheios ao bom senso, parse_str por padrão extrai as variáveis no escopo onde foi chamada. É necessário passar um segundo argumento para ter um array gerado por referência, como no exemplo acima com a variável $query.

3 – ler páginas remotas

Dentre todas as implementações, a mais desnecessária costuma ser fsockopen, fwrite, feof, fgets e fclose para ler arquivos remotos por HTTP.

Uma função já resolve:

$contents = file_get_contents('http://php.net/file_get_contents');

Isso é possível graças aos protocol wrappers que encapsulam a lógica de acesso aos respectivos protocolos, tal como HTTP. Esta forma de acesso, no entanto, depende da configuração allow_url_fopen estar habilitada no php.ini (que é o padrão).

Para ler os response headers da requisição, utilize fopen com stream_get_meta_data.

E se um dia você quiser impressionar a mulherada, veja a função stream_wrapper_register para criar o seu próprio protocol wrapper.

4 – submeter dados por post para uma página remota

A coisa fica mais complicada quando o desenvolvedor pensa em usar cURL pra submeter dados por POST para outro servidor. A extensão até tem seu mérito, mas usá-la apenas pra este propósito é um grande equívoco.

As funções que fazem uso dos protocol wrappers aceitam um objeto de stream context, criado pela função stream_context_create, para configurar alguns aspectos do protocolo. As opções de contexto do protocolo HTTP permitem definir, entre outras coisas, o método de acesso (GET, POST, etc) e o conteúdo a ser postado:

$content = http_build_query(array(
'cidade' => 'Rio de Janeiro',
'tipo' => 'Apartamento',
));

$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'content' => $content,
)
));

$contents = file_get_contents('http://exemplo/teste.php', null, $context);

Quando não for necessário ler o retorno da requisição, basta chamar a url com fopen passando o contexto como quarto argumento.

5 – fazer download de um arquivo remoto

Vale lembrar que a maioria das funções de stream e filesystem aceitam URLs completas e fazem uso da abstração do protocolo. O que eu vejo muita gente esquecer é que isso inclui a função copy:

$url = "http://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg";

copy($url, '/tmp/' . urldecode(basename($url)));

O trecho acima vai baixar a imagem remota e salvar no arquivo local /tmp/Terri Clark.jpg. E caso não seja óbvio, “local” se refere a quem está executando o script PHP, que no caso será o seu servidor caso seja um script web, e não o cliente que está acessando pelo browser.

Se o objetivo for realmente repassar o conteúdo remoto para o cliente que estiver acessando pelo browser, o script é igualmente simples:

$url = 'http://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg';

$handle = fopen($url, 'r');

$meta_data = stream_get_meta_data($handle);

// Repassa todos os headers do servidor remoto para o nosso cliente
foreach ( $meta_data['wrapper_data'] as $header ) {
header($header);
}

// Repassa o conteúdo para o nosso cliente
fpassthru($handle);

Considerando que estamos apenas testando a funcionalidade. Ter um script de proxy totalmente funcional é bem mais complexo, e certamente já tem algo pronto por aí.

6 – fazer cálculo com data

Dentre todas as simplificações possíveis, a que mais costuma comover é a função strtotime. Pra quem já está acostumado, parece que não faz mais do que sua obrigação. Mas pra quem ainda faz cálculos com data multiplicando por 86400, chega a parecer mágico:

echo 'Amanhã: ', strftime('%A', strtotime('tomorrow'));
// Amanhã: domingo

echo 'Próxima segunda: ', strftime('%d de %B de %Y', strtotime('next monday'));
// Próxima segunda: 01 de junho de 2009

echo 'Vencimento: ', strftime('%d/%m/%Y', strtotime('+3 months'));
// Vencimento: 30/08/2009

Mais exemplos você mesmo pode ver no manual do PHP ou na página de Date Input Formats do projeto GNU. Para o nome dos meses e dias da semana ficarem em português, utilize setlocale(LC_TIME, ‘pt_BR’); antes de chamar a função strftime.

7 – escapar sql e html

Felizmente nunca mais vi nenhum script com aberrações anti-sql-injection, mas há algum tempo era possível encontrar pessoas removendo palavras-chave de SQL de todas as strings que íam para o banco de dados. Se o usuário digitasse palavras como select, delete ou drop, elas eram simplesmente removidas da frase. Isso quando o programador não interrompia o script e acusava o usuário de estar tentando explorar alguma falha de segurança. Eu juro, isso existia.

Ao trabalhar com PDO, a melhor opção (pra não dizer a única!) é utilizar prepare e execute pra separar a query em si dos seus parâmetros:

$conexao = new PDO('mysql:dbname=banco;host=localhost', 'login', 'senha');

$uf = 'RJ';
$idade = 18;

$sth = $conexao->prepare('SELECT nome FROM pessoa WHERE uf = ? AND idade > ?');

$sth->execute(array($uf, $idade));

while ( $row = $sth->fetch() ) {
echo $row['nome'];
}

Se estiver utilizando drivers nativos, veja as funções mysql_real_escape_string ou mysqli_prepare e mysqli_stmt_bind_param, dependendo da extensão. Certamente outros bancos de dados têm a mesma funcionalidade.

A única preocupação é garantir que os parâmetros não se misturem com a query; não precisa inventar moda e remover o que o usuário digitou.

Outra confusão comum é ao escapar HTML. O objetivo é evitar que o texto digitado por um usuário seja interpretado pelo browser de todos os usuários do site.

Conceitualmente, esta é uma responsabilidade da camada de exibição. O template é que deve utilizar htmlspecialchars antes de gerar a saída na tela, e não antes de salvar no banco. Isso garante que o conteúdo que está no banco é fiel ao que foi digitado pelo usuário e pode ser reaproveitado em outras mídias além do HTML.

O que pode e deve ser feito é filtrar conteúdo realmente indevido, como caracteres inválidos ou espaços extras, dependendo da aplicação.


fonte: http://garotosopa.wordpress.com/2009/05/30/7-coisas-simples-em-php-que-alguns-ainda-complicam/