Tag Archives: Desenvolvimento Web

Url Rewriting – como tornar a estrutura de urls do seu site amigável e profissional

Há algumas semanas, um grande buzz foi gerado no Twitter depois que uma reportagem sobre fraudes na internet deu a entender que urls com a extensão .php seriam, em sua maioria, vírus. O “especialista em segurança” estava dando dicas para que as pessoas não clicassem em links suspeitos, e a forma que ele falou, com a edição que foi feita, deixou bem claro que “a maioria das páginas em php são vírus.” O acontecido se deu no Jornal Hoje, e o vídeo pode ser visto nesse link: http://www.youtube.com/watch?v=x9_qwgYrESg .

O que muitas pessoas podem não saber é que a linguagem PHP é a mais utilizada na WEB nos dias atuais. Pesquisas recentes indicam que ele é usado em 59% dos sites (contra 34% do ASP, que fica em segundo). Acontece que nem todo site que usa php precisa mostrar isso através das extensões .php. Existem técnicas para esconder a extensão dos arquivos; essas técnicas são geralmente usadas por questões de segurança e otimização para mecanismos de busca. Sites e CMSs profissionais (como o WordPress, usado aqui neste blog) não exibem suas extensões de arquivo, e a técnica mais utilizada para isso é Url Rewriting.

Para quem não conhece, a técnica de Url Rewriting funciona como uma reescrita de urls, um tipo de mascaramento que tem por objetivo tornar a url mais amigável e esconder as extensões dos arquivos, o que acaba tendo um aspecto de segurança também. Os servidores web e frameworks mais conhecidos implementam esse mecanismo, seja de maneira nativa ou através de módulos. No nosso caso, como estamos falando de PHP, estamos falando de Apache com mod_rewrite habilitado (a maioria dos servidores pagos e instalações padrão já vêm com esse módulo ativo).

Nesse post, você terá uma visão geral de como criar as regras do url rewriting em uma estrutura de site que utiliza essa técnica de maneira prática e inteligente, similar ao que é utilizado pelo WordPress.

mod_rewrite e o .htaccess

Antes de mais nada, é legal entender como funciona o esquema de url rewriting no apache. Precisamos estabelecer regras que devem ser colocadas no arquivo .htaccess, na raiz do diretório www (o arquivo .htaccess também pode vir em qualquer subdiretório, estabelecendo regras próprias para aquele diretório específico). As regras são definidas através de expressões regulares. A imagem abaixo explica como é feito o processamento após a requisição vinda do usuário:

 

a requisição

 

Vamos supor que temos o diretório www como a raiz do site meusite.com . Imagine que dentro dessa pasta www, nós temos o diretório “abc/def/ghi” (acessando via http, a url ficaria http://meusite.com/abc/def/ghi ). Mas gostaríamos que todos os arquivos dessa pasta fossem acessíveis através de um caminho diferente e mais simples: /xyz . Ou seja, ao invés de acessar pelo endereço http:/meusite.com/abc/def/ghi/arquivo.html, eu quero usar http://meusite.com/xyz/arquivo.html (onde o diretório /xyz na verdade não existe).

Nosso arquivo .htaccess ficaria assim:

RewriteEngine On

RewriteBase   /

RewriteRule  ^/xyz(.*) /abc/def/ghi$1

Para maiores detalhes sobre todas as regras possíveis, e o que cada item significa, é bom dar uma olhada na documentação do Apache sobre o mod_rewrite:  http://httpd.apache.org/docs/current/mod/mod_rewrite.html . Esse post aqui também tem umas dicas básicas muito boas: http://php.refulz.com/201105/url-rewriting-with-apache/ (ambos em inglês).

Passo 1 – .htaccess

Podemos criar várias regras no htaccess para nossos scripts, porém, existe uma maneira mais simples de trabalharmos com o url rewriting. Através de uma regra geral, podemos deixar o processamento a cargo de um script php, ao invés de encher o arquivo .htaccess de regras. Esse é o esquema utilizado pelo WordPress. Abaixo está o conteúdo de um arquivo .htaccess padrão utilizado por essa plataforma:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Basicamente, o que esse .htaccess especifica é que: toda requisição, tendo como diretório base o “/”, que não for um arquivo nem um diretório (que jogariam um erro 404 normalmente, pois não existem), deve ser repassada para o script /index.php, que ficará responsável por tratar essas requisições da maneira que quiser. Ou seja, no arquivo index.php deve haver um processamento para obter a requisição feita e decidir o que deve ser chamado – um típico controlador.

É bom lembrar que diretórios existentes não serão afetados, já que a regra do url rewriting só irá redirecionar para o index quando não existir um arquivo ou diretório no caminho especificado.

Passo 2 – Controlador php e estrutura de diretórios

Utilizando o .htaccess exemplificado acima, o script index.php será responsável por definir o que deve ser chamado – faremos isso com uso de includes. Fica a seu critério a organização do seu framework, porém irei fazer aqui uma sugestão, que deixa o diretório de arquivos bem organizado e torna o desenvolvimento bem mais fácil. Primeiro, vamos dar uma olhada no arquivo index.php, que é o controlador do framework:

<?php
/* no config.php você pode iniciar sessão e conectar ao BD por exemplo */
require_once("includes/config.php");

$uri = $_SERVER['REQUEST_URI'];
//default = index
$pagina = "index";

if($uri != "/")
{
      /* faz o parsing do url rewriting */

        /* retira parametros de url*/
	$t = explode('?',$uri);
	$path = explode("/",$t[0]);

	$module = strtolower($path[1]);
	/* checagem extra para a existência de um diretório com esse nome */
	if(!is_dir($module))
	{
          /*verifica se existe o módulo requisitado*/
		if(is_dir("modules/$module"))
			$pagina = $module."/index";
		else if(is_file("modules/$module.php"))
			$pagina = $module;
		else
            /* caso não exista, incluir o módulo de 'not found' */
			$pagina = "404";

	}
}

require_once("modules/$pagina.php");

Como vocês podem ver, a lógica é bem simples. É importante verificar se o arquivo existe antes de tentar incluí-lo – verificamos se existe aquele “módulo”. Uma requisição feita para “/contato“, por exemplo, resultará na checagem/inclusão do arquivo “modules/contato/index.php” OU “modules/contato.php“.

E assim, para cada página que você quiser acrescentar, pode criar um arquivo ou diretório dentro da pasta “modules” (você poderia usar diretórios para organizar melhor quando houvesse “submódulos”). Dentro desse arquivo você ainda pode criar regras (um switch já serve) para testar um segundo,  terceiro nível de requisição (por exemplo: “/contato/orcamento” ). Nesse caso, a página que será incluída continuará sendo a “contato.php“, dentro dela é que você irá checar se existe um “submódulo”, o que pode ser feito facilmente com regex ou verificando o array $path. Nossa estrutura de diretórios/arquivos estaria mais ou menos assim:

/
/includes
   /includes/config.php
/modules
   /contato.php
   /404.php
/.htaccess
/index.php

Bom, acredito que a partir daí já dá pra desenvolver a idéia né? Adicionando a engine de templates Smarty, você já deixa seu framework mais elaborado e modulado, facilitando ainda mais a criação de novas páginas / módulos. Nesse caso, use os arquivos de módulo para obter as informações necessárias, e dar o display no template.

É importante ter um módulo “404″ para chamar quando não encontrar a página que o usuário pediu, já que não haverá mais o erro 404 padrão pois estamos pegando tudo o que “não existe” e tentando mapear no nosso framework. Nesse arquivo você deve exibir alguma mensagem indicando que o conteúdo não foi encontrado.

Quero aprender PHP (ou outra linguagem web) sozinho, e agora? O passo a passo

elePHPant, seu lindo!

Esse post foi idealizado para aquelas pessoas que estão pretendendo aprender PHP ou até mesmo outra linguagem de programação, por conta própria, assim como eu aprendi. É possível, é viável, de graça e só depende de você.

Muitas pessoas me pedem uma indicação de curso ou livro, ou me perguntam como eu aprendi. Eu aprendi sozinha, com material da internet, praticando principalmente através de exemplos e com muita “tentativa-e-erro”. Já fazem mais ou menos 08 anos que comecei, e apesar de ter acumulado bastante experiência, sempre há algo novo para aprender. Por isso, acredito que nenhum livro pode superar o aprendizado obtido com a prática, ou mesmo reunir todo o conteúdo necessário pra que uma pessoa aprenda “TUDO” sobre uma linguagem de programação. Se fosse possível, seria inviável, e ninguém conseguiria ler o livro todo e assimilar 100% do conteúdo! Algumas coisas a gente só aprende mesmo quebrando a cabeça com os erros.

1. Isso é MESMO sua área?

Muitas pessoas são atraídas para o mundinho das ciências exatas por conta de alguma influência que não necessariamente indica uma real “aptidão” para a área. Você não precisa ser fera em matemática, física e química… mas é imprescindível ter um bom pensamento lógico, e isso a gente não aprende estudando “lógica e algoritmos”. É algo que você tem, ou não tem, e pode exercitar com a prática.

Se você não sabe fazer uma regra de três, amigo(a), infelizmente temo que essa não é a sua área. Como eu já disse, não precisa ser fera em matemática, eu mesma passo vergonha em se tratando de fórmulas e cálculos, mas a boa e velha regra de três junto a um bom pensamento lógico resolvem a maior parte dos seus problemas no dia-a-dia de programação web. A pequena parte restante você encontra na WEB, e para isso você precisa ser desenrolado, saber pesquisar – isso faz parte da próxima dica.

2. Saber pesquisar, e saber ler textos em inglês

O Google pode resolver a maioria dos seus problemas, mas é preciso saber pesquisar. E é muito importante ter em mente que a maioria dos conteúdos relacionados a programação, independente da linguagem, estarão em inglês. Geralmente, os MELHORES conteúdos, e mais recentes, vão estar em inglês, então você tem que deixar a preguiça de lado e desenrolar a leitura nessa língua. Use o Google Translator, que por mais que não seja perfeito, ainda é a melhor opção em tradutores online. E procure estudar mesmo, porque se você vai trabalhar nessa área e planeja ser um bom profissional, o inglês a nível de leitura é essencial.

Dica: Um excelente site onde você pode aprender inglês e outras línguas, de forma gratuita e com uma ótima didática, é o Livemocha.com .

Outra dica: para buscar resultados mais recentes (o que é de grande importância quando lidamos com resolução de erros) acrescente na busca o termo inurl:2011 (o ano atual, no caso…). Assim você encontra geralmente posts em blogs que foram criados no ano atual, o que lhe dá mais chances de encontrar uma resolução para o seu problema de acordo com a versão atual das ferramentas que está usando. Também procure ser bem específico na sua busca.

3. Montando um ambiente de desenvolvimento

Para testar seus scripts php, você precisa de um servidor Apache com PHP rodando, localmente ou em um servidor remoto ao qual você tenha acesso via FTP. Localmente é bem mais rápido para testar, mas você precisa instalar o servidor. Existem soluções bem facilitadas para todos os sistemas operacionais. Você também vai precisar de um editor para facilitar o processo de escrita de códigos.

4. Material de estudo

Para começar, é interessante ter um material de base. Pode ser um livro bem simples, só pra você começar, fazer um ‘Hello World’ e aprender algumas noções. Um livro dá uma orientação básica para quem está iniciando, dá um pouco mais de segurança, por isso acredito que é interessante. É complicado para mim indicar um livro, já que eu não conheço os livros, não os li, então não tenho como garantir; porém, pelas avaliações, você pode encontrar umas opções básicas em torno de 30 a 50 reais, que parecem ser o ideal para quem está começando. Fazendo uma pesquisa rápida no Submarino, achei interessante o “Fundamentos de PHP“, tem avaliações positivas de pessoas que leram, e custa módicos 30 reais.

Mas isso também é opcional. É possível encontrar conteúdo muito bom na internet. Minhas recomendações para que você possa iniciar os estudos são:

Antes de mais nada (o básico do básico)

  • Como funciona a internet – se você vai desenvolver para a WEB, precisa entender como se dá o processo de acessar um site, o que acontece, que tecnologias estão envolvidas. Esse infográfico (em inglês) explica direitinho o processo de comunicação na internet: http://www.makeuseof.com/tag/internet-works-infographic/
  • Como funciona um servidor WEB – o servidor web é responsavel por fornecer as páginas que você acessa na web. As linguagens de programação server-side (php, asp, python) são executadas no lado do servidor, e já retornam tudo “mastigadinho” para o browser, enquanto que liguagens client-side (javascript) são executadas no próprio browser. O servidor web utilizado pelo PHP é o APACHE, e nesse link tem uma explicação simples do seu funcionamento: http://www.aocubo.tecnologia.ws/?p=35

PHP

  • Manual oficial do PHP - Esse é o manual oficial disponibilizado no site php.net (esse site tem que ser a sua referência sempre.. adicione nos favoritos!). Está disponível também em português. http://www.php.net/manual/pt_BR/
  • Referência das funções – Material essencial, também do site oficial php.net. Todas as funções do PHP, com exemplos e comentários dos usuários. Basta buscar pelo nome da função, no canto superior do site -> http://php.net
  • Practical PHP Programming – Um manual/guia muito bom, bem completo mesmo, em inglês. http://www.tuxradar.com/practicalphp

Complementos

Outros links interessantes (tudo em inglês) podem ser encontrados aqui: http://www.smashingapps.com/2011/06/02/45-useful-yet-free-ebooks-for-designers-and-developers.html .

5. A prática é a melhor professora

Não adianta nada você ler todo esse material e não praticar, ou testar uma vez e pronto. Você tem que ir fundo, repetir os testes com pequenas modificações, assim você vai compreendendo melhor o funcionamento das funções e tudo o mais. Pense em coisas práticas, tenha em mente um projeto simples para ir desenvolvendo, essa é a melhor maneira de encontrar motivação para seus estudos e práticas. Depois você vai complicando mais, aos poucos. A boa e velha “agenda” é um bom aplicativo para aprender o básico de banco de dados e formulários. Ou pense em outra coisa que não seja demasiado complicada, e coloque em prática.

É importante ter os pés no chão, e começar com coisas simples. As coisas mais básicas que você precisa aprender e praticar são:

  • Diferenças do GET e POST
  • Formulários – enviar e receber as informações postadas em um formulário
  • Banco de dados – adicionar, remover, modificar
  • Upload de imagens e arquivos
  • Sessões

A partir daí já é possível criar projetinhos simples, com autenticação de usuário inclusive.

6. Estruturada X Orientada a Objetos

O PHP suporta orientação a objetos, embora não seja totalmente dependente desse conceito, como o Java.

A programação estruturada é mais fácil para quem está começando. Dependendo do material utilizado para estudo, você pode já aprender em cima do conceito de OO, mas geralmente é ensinado primeiro o básico, a sintaxe da linguagem e a utilização de forma estruturada. Depois é vista a parte de OO, e aí você pode utilizar classes para organizar melhor seu projeto.

7. Desesperar jamais

Talento é paciência sem fim. – Gustave Flaubert

Erros vão aparecer, mensagens de erro são comuns e você precisa aprender a lidar com elas. Geralmente as mensagens indicam o número da linha onde está contido o erro, erros de sintaxe são muito comuns pra quem está começando. Também podem acontecer outros tipos de erros, mais ligados à lógica da programação, e geralmente para resolver esses você vai precisar fazer uma busca no Google.

No mais, é preciso ter paciência e perseverança, praticar um pouquinho todos os dias, e como dito anteriormente, é legal ter um projeto em mente, assim você se estimula a ir aprendendo as coisas que precisa para colocar seu projeto em prática.

Boa Sorte!

Manual do programador inexperiente

Hoje é o Dia do Programador. A data é comemorada no 256º dia do ano, já que “256″ é o número emblemático que simboliza a quantidade de valores distintos que podem ser representados com um byte de oito bits.

A cada ano dezenas, centenas de recém formados programadores entram no mercado, com pouca ou quase nenhuma experiência, para concorrerem com profissionais mais experientes, nem sempre formados.

É verdade que no quesito programação, a experiência vale mais que o diploma. Por melhor que um curso seja, não haverá tempo de ensinar tudo, e esse é o tipo de coisa que se aprende na prática. Após muitas tentativas, erros e acertos, um programador adquire a experiência necessária para poder dizer com segurança que pode resolver uma demanda, ou que isso não será possível na linguagem que ele domina, e terão de partir para uma alternativa. A experiência produz códigos mais limpos e organizados, com soluções otimizadas.

Mas enfim: você é inexperiente; acabou de sair da faculdade, ou simplesmente quer aprender a programar por conta própria. O que você deve saber, e por onde começar?

Se você já escolheu a linguagem que quer trabalhar, pode pular direto para o item 2.

1. Escolher uma linguagem.

Nas faculdades, somos obrigados a cursar cadeiras de lógica e algoritmos, e depois temos de aprender uma linguagem que é definida por eles como a básica. Mas quem vai definir a linguagem que será a sua especialidade, é você.

Para tanto, você precisará levar em consideração vários fatores: facilidade de aprendizado; facilidade de montar o ambiente de desenvolvimento; oportunidades no mercado de trabalho; possibilidades que a linguagem oferece; material disponível na internet gratuitamente.

Não existe melhor ou pior linguagem, porque tudo depende do uso que se deseja fazer, da finalidade, do tempo que você espera dedicar, e do retorno que você espera financeiramente.

Depois de estudar bem as possibilidades e decidir,  você pode partir para o próximo passo. As minhas humildes sugestões onde vejo um bom futuro são: Python, Ruby on Rails e o bom e velho PHP. Vendo pelo conjunto, eu continuo achando PHP a linguagem mais fácil tanto para montagem do ambiente, em questão de preços de servidor de hospedagem e facilidade de aprendizagem. Em compensação, o Python é a tendência pro futuro, e o mercado ainda não tem tantos programadores Python. O perigo é você não encontrar facilmente um emprego pra começar, pois a demanda é sempre maior pra PHP.

Obs: se você não tem experiência nenhuma com qualquer tipo de linguagem de programação, não tem idéia do que seja um IF ou WHILE, pode ser útil estudar algoritmos antes de começar pra valer. Mas não é obrigatório; algumas pessoas tem mais facilidade com a lógica da programação, e entendem o processo ao ver os exemplos da linguagem.

2. Montagem do ambiente de desenvolvimento no seu pc

Seja qual for a linguagem que você deseja trabalhar, precisará de um ambiente de desenvolvimento no seu computador, para começar a testar os códigos. Programação só se aprende na prática. Procure tutoriais de instalação dos programas necessários na internet e prepare a sua máquina.

No caso do PHP, você pode baixar o Wamp (para Windows), que já vem com PHP + Apache + MySQL + PhpMyAdmin. Se você usar Linux (Ubuntu), veja nesse artigo como preparar um bom ambiente de desenvolvimento para PHP .

3. Procure documentação

É sempre bom ter o site oficial de linguagem, com a referência completa de suas funções, aberto. Nenhum programador decora todas as funções da linguagem, a consulta é sempre necessária, nem que seja para relembrar os argumentos que devem ser passados para uma função.

Para começar, é importante também um manual ou tutorial, que irá guiá-lo pelos primeiros passos. Exemplos práticos são sempre a melhor maneira de assimilar, mas não adianta só olhar; é preciso copiar e repetir na sua máquina, ver o funcionamento, modificar, personalizar. Assim você fixa o que está estudando.

Depois de se acostumar bem com a sintaxe da linguagem, é hora de partir para o próximo passo.

4. Pratique criando coisas novas

Mais uma vez eu repito: programação se aprende na prática. Você precisa praticar bastante, criando coisas diferentes, personalizando o código, de preferência para criar algo útil. Criar um sistema / programinha / site com utilidade é ver o resultado do seu estudo, diferente de quando estamos só testando pequenos trechos de código.

5. Estágio – programação na vida real

Nada melhor que um estágio na área para ir ganhando experiência em casos reais. Programar para si mesmo é mais fácil, claro! Quando temos de resolver uma demanda, com prazo determinado, as coisas são diferentes. Isso é programação na vida real, coisa que a gente só aprende no estágio ou emprego.

Agora, o TopFive do bom programador:

  1. Seja organizado no seu código: utilize identação para aninhar blocos, tente usar um padrão para as variáveis. Limpe seu código sempre que possível, porque em programação (assim como em várias outras áreas), menos é mais.
  2. Deixe comentários quando necessário. Não precisa comentar linha por linha.
  3. Leia códigos de outras pessoas, linha por linha para compreender como foi feito. É muito bom compreender o raciocínio de outros programadores mais experientes, porque cada pessoa pensa de um jeito diferente para resolver um problema. Às vezes a solução é incrivelmente simples, mas a gente complica, muitas vezes por falta de experiência mesmo.
  4. Pratique sempre, de preferência todos os dias. A melhor maneira de fazer isso é criando um projeto real para manter e ir melhorando pouco a pouco, com novas implementações. Além de estar aprendendo, você irá gerar um resultado que poderá trazer retorno financeiro e/ou profissional.
  5. Compartilhe o conhecimento! Ajude quem está começando, afinal você já passou por isso um dia e sabe como é difícil.

Espero que essas dicas ajudem alguém. Abraços!

Manipulação de imagens no PHP com a lib GD – Colagem de fotos

Em mais um post sobre manipulação de imagens usando a lib GD no PHP, veremos como é possível fazer sobreposição de imagens, resultando em uma espécie de colagem de fotos.

Primeiro Exemplo – Mural Warhol

Nesse primeiro exemplo vamos repetir a mesma foto em versões diferentes, aplicando filtro de cor para um resultado que lembra o estilo de Andy Warhol.

<?php
header("Content-type: image/jpeg");

$source = "foto_exemplos.jpg";

$tamanho = getimagesize($source);

$wi = $tamanho[0];
$he = $tamanho[1];

/* numero de colunas e linhas da montagem nXn, altere para modificar o n. de colagens */
$c = 2;
$l = 2;
$result = imagecreatetruecolor($wi*$c, $he*$l);

for($i=0;$i<$l;$i++)
{
	for($j=0;$j<$c;$j++)
	{
		$source = imagecreatefromjpeg("foto_exemplos.jpg");
		imagefilter($source, IMG_FILTER_COLORIZE, rand(0,255), rand(0,255), rand(0,255),40);
		imagecopyresampled($result, $source, $j*$wi, $i*$he, 0, 0, $wi, $he, $wi, $he);

	}

}

imagejpeg($result);

?>

O resultado será sempre diferente, pois os valores passados à função imagefilter são randômicos. Cada vez que você der reload no script ele irá gerar diferentes combinações de cores. Aqui está um exemplo de resultado:

Segundo Exemplo – Foto com Colagens / Moldura

Nesse exemplo você verá como é fácil colar imagens png com transparências em cima de uma foto. Vou colar um png de um passarinho no canto esquerdo superior, e depois uma árvore no canto direito inferior.

<?php
header("Content-type: image/jpeg");

$result = imagecreatefromjpeg("foto_exemplos.jpg");

$bird = imagecreatefrompng("bird.png");
imagecopyresampled($result, $bird, 0, 0, 0, 0, imagesx($bird), imagesy($bird),  imagesx($bird), imagesy($bird));

$tree = imagecreatefrompng("tree.png");
imagecopyresampled($result, $tree, imagesx($result)-imagesx($tree), imagesy($result)-imagesy($tree), 0, 0, imagesx($tree), imagesy($tree),  imagesx($tree), imagesy($tree));

imagejpeg($result);

?>

Resultado:

Seguindo esse mesmo princípio, é possível colar molduras e criar montagens bem interessantes. No exemplo abaixo, usando uma moldura com o mesmo tamanho da foto (o código é quase igual, colando a moldura na posição 0,0 da foto):

<?php
header("Content-type: image/jpeg");

$result = imagecreatefromjpeg("foto_exemplos.jpg");

$moldura = imagecreatefrompng("moldura.png");
imagecopyresampled($result, $moldura, 0, 0, 0, 0, imagesx($moldura), imagesy($moldura),  imagesx($moldura), imagesy($moldura));

imagejpeg($result);
?>

Resultado:

Como você pode ver, a aplicação de pngs e colagem de fotos é muito simples. O que dificulta mais o trabalho com esses métodos é o posicionamento e tamanho das imagens. Geralmente, você precisará utilizar algum esquema mais elaborado com javascript para definir a posição certa aonde colar as imagens, caso faça algo totalmente dinâmico. Redimensionamento também pode ser extremamente necessário.

Para maiores informações sobre a GD e referência das funções utilizadas aqui, verifique : http://www.php.net/manual/en/ref.image.php

Montando um site php com autenticação baseada em Twitter+OAuth e persistência

Neste artigo você verá como é possível criar um site em php com autenticação de usuários toda baseada no Twitter, usando a biblioteca Twittertools que desenvolvi.

Antes de começar, vamos ter uma idéia mais detalhada de como é feita a autenticação do usuário pelo Twitter através do seu site, que nesse fluxograma chamarei de APP:

  1. Usuário acessa APP. APP identifica que ele não está logado;
  2. APP faz uma requisição ao Twitter, identificando-se (com suas chaves consumer_key e consumer_key_secret )  os tokens de acesso (request_token e request_token_secret);
  3. APP faz nova requisição ao Twitter, identificando-se com suas chaves e passando o request_token, pedindo o link de autorização para o usuário; guarda o request_token_secret na sessão;
  4. Twitter retorna o link que APP deve passar para o usuário autorizá-la;
  5. Usuário acessa o link e autoriza APP;
  6. Usuário é redirecionado de volta para APP trazendo o request_token;
  7. APP recebe o request_token e faz uma nova requisição ao Twitter, informando o request_token e o request_token_secret, e solicitando o access_token e access_token_secret do usuário;
  8. Twitter responde com access_token e access_token_secret do usuário, e APP agora pode realizar qualquer requisição usando estas chaves.

As chaves consumer_key e consumer_key_secret devem ser obtidas ao registrar a sua aplicação no Twitter. Instruções detalhadas de como fazer isso podem ser encontradas aqui: http://erikafocke.com.br/twittertools . Uma vez com estas chaves, já é possível “começar a brincadeira”.

Download da biblioteca Twittertools: http://github.com/erikaheidi/Twittertools

No nosso exemplo, criaremos uma “mini” rede de usuários que serão listados na página principal. Veja a demonstração funcionando aqui: http://erikafocke.com.br/demos/happyelephant

Precisaremos criar uma tabela de usuários, para reconhecermos quando eles retornarem ao site. Guardaremos o id to usuário no Twitter, que será a nossa chave primária, e as chaves. A idéia de guardar as chaves é funcional para o caso de você realizar operações com a conta do usuário mesmo quando ele não estiver logado no seu site, ou quando você já possui um outro sistema de autenticação e quer apenas integrar o Twitter ao seu site, possibilitando que as pessoas façam login como de costume e possam postar atualizações no Twitter sem precisar repetir esse processo de autorização da aplicação.

A tabela básica para o nosso exemplo é a seguinte:

CREATE TABLE IF NOT EXISTS `tw_users` (
  `tw_id` int(11) NOT NULL,
  `access_token` varchar(200) NOT NULL,
  `access_token_secret` varchar(200) NOT NULL,
  `last_seen` datetime NOT NULL,
  PRIMARY KEY  (`tw_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Além das classes da TwitterTools, criei também uma classe de usuário, que irá salvar os dados em banco e atualizar a data/hora em que o usuário acessa o site, para sabermos quando foi a última vez que ele acessou. Essa classe também lista os usuários que já se “cadastraram” no site.

<?php

class User {

	var $tw_id;
	var $atoken;
	var $atoken_secret;
	var $last_seen;

	var $new;
	static $table = "tw_users";

	function __construct($tw_id,$atoken,$atoken_secret)
	{
		$this->tw_id = $tw_id;
		$this->atoken = $atoken;
		$this->atoken_secret = $atoken_secret;

	}

	function update()
	{
		$date = date("Y-m-d H:i:s");

		$query = mysql_query("SELECT last_seen FROM " . self::$table . " WHERE tw_id='$this->tw_id' ") or die(mysql_error());
		if(mysql_num_rows($query))
		{
			$this->last_seen = mysql_result($query,0);
			$upd = mysql_query("UPDATE " . self::$table . " SET last_seen='$date' WHERE tw_id='$this->tw_id' ") or die(mysql_error());
		}
		else
		{
			$this->new = 1;
			$ins = mysql_query("INSERT INTO " . self::$table . "(tw_id,access_token,access_token_secret,last_seen) VALUES('$this->tw_id','$this->atoken','$this->atoken_secret','$date') ") or die(mysq_error());
		}
	}

	static function getUsers($limit=30)
	{
		$query = mysql_query("SELECT tw_id FROM " . self::$table . " ORDER BY last_seen LIMIT $limit") or die(mysql_error());

		while($x = mysql_fetch_array($query))
		{
			if(empty($lista_users))
				$lista_users = $x['tw_id'];
			else
				$lista_users .= ",".$x['tw_id'];
		}
		return $lista_users;
	}

}
?>

No arquivo index.php você vai ver as coisas “funcionarem”. Não vou colar aqui pra não ficar grande demais o post! Vale mais a pena fazer o download :)

Você pode fazer download da pasta com todo o código completo desse exemplo aqui: happyelephant.zip

Dúvidas? Deixe um comentário :) Gostou? Comente também, aproveite e dê um retweet :P

Montando um ambiente de desenvolvimento web no Ubuntu 10.04

Há cerca de um mês, resolvi definitivamente pôr fim ao hábito de usar o Windows, e instalar o Ubuntu.

O meu maior problema era montar um ambiente de desenvolvimento web eficiente, que pudesse de fato substituir o pacote Dreamweaver + Fireworks, que utilizo há anos. Já tentei anteriormente, e não consegui me adaptar com as opções disponíveis até então no Linux.

Porém, como já fazia cerca de 2 anos dessa tentavia, resolvi fazer uma nova experiência para ver o que há de novo tanto na versão atual do Ubuntu (10.04, ou LucidLynx), quanto nos softwares disponíveis para ele.

Após a instalação(muito fácil e rápida, por sinal), já me agradei bastante com as novas opções de integração com redes sociais que o Ubuntu 10.04 traz. É possível configurar Twitter, FlickR, Digg, GTalk, dentre outros, como vocês podem conferir no screenshot abaixo:

Outra grande evolução do Ubuntu 10.04, e que por sinal o coloca numa posição extremamente privilegiada em relação ao Windows, é o Ubuntu Software Center, que me fez lembrar muito a App Store da Apple. Através dessa aplicação nativa, você navega e instala programas com a facilidade de um clique.

Bom, após essas boas impressões iniciais, deu pra ter certeza que o S.O é ótimo e até superou minhas expectativas. Agora era uma questão de softwares, para poder montar o ambiente de trabalho ideal.

Pra começar, instalei o Google Chrome pra Linux, porque não curto o Firefox. Pra isso, precisei baixar no site o .deb, depois foi só dar dois cliques, e o xxx de pacotes já instalou pra mim. Nenhum trabalho até agora!

Então, hora de instalar o servidor web Apache+PHP+MySQL. Pelo terminal:

sudo apt-get install apache2 libapache2-mod-php5

E depois o mysql:

sudo apt-get install mysql-server-5.1 php5-mysql

Também não foi nem um pouco trabalhoso pra quem é do tempo em que tínhamos de usar ./configure (cheio de opções macabras), make e make install.
Depois de deixar o servidor web pronto, comecei a busca por um bom editor que comportasse PHP/Xhtml/Css/Javascript. Para não deixar a desejar em relação ao Dreamweaver, o editor que eu procurava precisava de:

  • Syntax Highlight eficiente para PHP,Xhtml,Css e Javascript
  • Autocompletar para funções PHP
  • Autoclose para tags xhtml
  • FileBrowser integrado

Estas caraterísticas aceleram bastante a escrita dos meus códigos, e por essa razão são essenciais para não baixarem a minha produtividade após uma migração de SO e softwares. Experimentei os seguintes editores: GEdit, GVim,  SCite, Bluefish e Amaya (o editor da W3C). Os resultados foram frustrantes, nenhuma dessas opções corresponderam às minhas expectativas.

Então eu resolvi testar um outro editor que não parecia ser conhecido: o Geany (http://www.geany.org/), descrito como “a fast and lightweight IDE using gtk2″. Não criei expectativas, mas após a instalação, comecei a testá-lo e vi que era exatamente o que eu queria. Leve, com suporte a plugins e criação de projetos, ele foi até melhor do que eu esperava, com alguns recursos que não existem no Dreamweaver – por exemplo, o autocompletar dele reconhece também métodos e variáveis de classe disponíveis no escopo do código atual.

Ativei o plugin FileBrowser que já vem nele, e posso dizer que está sendo perfeito para mim. Existem outros plugins interessantes disponíveis no site oficial do Geany, como o que faz a integração entre o editor e ferramentas de controle de versão como o Git.

O Geany ainda está na versão 0.19, porém já supera muitos outros editores consagrados existentes no mercado, com as seguintes funcionalidades (copiei do site oficial):

  • Syntax highlighting
  • Code folding
  • Symbol name auto-completion
  • Construct completion/snippets
  • Auto-closing of XML and HTML tags
  • Call tips
  • Many supported filetypes including C, Java, PHP, HTML, Python, Perl, Pascal and more
  • Symbol lists
  • Code navigation
  • Build system to compile and execute your code
  • Simple project management
  • Plugin interface

No site oficial do Geany vocês podem conhecer maiores detalhes do projeto: http://www.geany.org

Espero que ajude alguém! =D Pra mim, esse editor (Geany) foi a melhor descoberta dos últimos tempos.