Tag Archives: PHP

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.

Palestra no Ensol – desenvolvimento de apps para o Twitter em PHP

Hoje palestrei no V Ensol – a palestra foi sobre desenvolvimento de aplicativos em PHP para o Twitter, com o auxílio da biblioteca open source TwitterTools. Abaixo seguem os slides da palestra :) pra quem não pôde ir, ou pra quem foi e quer dar uma estudada a mais no tema.

 

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!

PHP GD – Escrevendo texto em imagens com fontes TTF

Em mais um artigo sobre a utilização da biblioteca GD no php, vamos ver como podemos adicionar textos em imagens, escritos com qualquer fonte True Type.

A título de exemplo, vamos utilizar a foto abaixo:

Faremos um script que irá escrever exatamente no papelão que o carinha está segurando, e o resultado vocês já devem imaginar :D A idéia é ficar o mais realista possível, é claro!

O primeiro passo é encontrar uma fonte legal. Isso é fácil; sites de fontes para download gratuito não faltam na internet. Optei por uma fonte com estilo escrito à mão, para dar mais veracidade ao resultado. Baixei uma chamada “Handprinting” [ download aqui ].

Testando pouco a pouco na mão, cheguei às coordenadas, inclinação e tamanho ideal da fonte. O ideal é ir testando mesmo, até se ajustar. Pra ficar mais divertido, coloquei pra pegar o texto via GET, caso a pessoa queira definir dinamicamente :) Vamos ao código:

<?php
header("Content-type: image/jpeg");
// Set the enviroment variable for GD
putenv('GDFONTPATH=' . realpath('.'));

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

if(!empty($_GET['texto']))
	$texto = $_GET['texto'];
else
	$texto = "dorgas, mano!";

$font = "Printing.ttf";
$black = imagecolorallocate($result, 0, 0, 0);
imagettftext($result, 60, 5, 250, 450, $black, $font, $texto);

imagejpeg($result);
?>

Resultado:


Demo online:

Digite uma frase:

 

Observações do script: A definição da constante GDFONTPATH é necessária quando não utilizamos um caminho absoluto ao definir a fonte ttf a ser usada. Retirando essa definição no exemplo acima, o script deixará de funcionar na maioria das instalações atuais do php, a não ser que você defina o caminho utilizando $_SERVER['DOCUMENT_ROOT'] para dizer o caminho completo da fonte.

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

Manipulação de imagens no PHP com a lib GD – gerar thumbnails

Continuando a série de posts sobre manipulação de imagens no PHP, dessa vez vamos trabalhar com outra funcionalidade muito comum e extremamente útil da GD: redimensionamento de imagens.

Ao se trabalhar com imagens enviadas pelo usuário através de um formulário, precisamos estabelecer limites de tamanho para que a imagem se enquadre ao nosso layout de site, além de evitar transtornos com o espaço em disco ocupado por imagens excessivamente grandes.

Para gerar um resultado fiel à imagem original, precisamos realizar um cálculo proporcional para definir o novo tamanho da imagem, baseado nos tamanhos máximos que iremos definir como limites.

O algoritmo é simples: passamos a largura e altura máximos, pegamos a largura e altura atuais da imagem. Caso ultrapassem os tamanhos máximos, iremos calcular usando regra de três quais serão os novos tamanhos da imagem (não podemos simplesmente definir que a imagem terá a largura e altura máximos definidos, pois isso poderá deixá-la com aspecto esticado em muitos casos). Após definir os novos tamanhos, criamos uma imagem em branco com o tamanho definido, copiamos a imagem original para dentro dessa nova imagem e salvamos o resultado.

Vamos ver como isso funciona na prática, usando a GD:

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

$larguraMax = 200;
$alturaMax = 100;
$source = "foto_exemplos.jpg";

$tamanho = getimagesize($source);

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

/* se for formato 'paisagem' */
if($largura > $larguraMax)
{
	$largura = $larguraMax;
	$altura = ($largura * $tamanho[1]) / $tamanho[0];
}
/* pode acontecer que mesmo depois do redimensionamento inicial baseado na LARGURA, a imagem continue
 * com a ALTURA maior que a permitida. por isso não usamos else aqui, e fazemos a checagem contraria.
 */
if($altura > $alturaMax)
{
	$altura = $alturaMax;
	$largura = ($tamanho[0] * $altura) / $tamanho[1];

	/* pode acontecer que mesmo depois do redimensionamento inicial baseado na ALTURA, a imagem continue
	 * com a LARGURA maior que a permitida. por isso não usamos else aqui, e fazemos a checagem contraria.
	 */
	if($largura > $larguraMax)
	{
		$largura = $larguraMax;
		$altura = ($largura * $tamanho[1]) / $tamanho[0];
	}
}

$thumb = imagecreatetruecolor($largura, $altura);
$imagem_orig = imagecreatefromjpeg($source);

/* argumentos da imagecopyresampled / imagecopyresized :
 * imagem destino, imagem origem, coordX destino, coordY destino, coordX origem, coordY origem,
 * largura destino, altura destino, largura origem, altura origem
 */
imagecopyresampled($thumb, $imagem_orig, 0, 0, 0, 0, $largura, $altura, $wi, $he);
/*
 * para salvar em disco, acrescente à imagejpeg os parâmetros: nome do arquivo e qualidade da imagem.
 * assim:	imagejpeg($thumb, "resultado.jpg", 100);
 * qdo você não define os dois parâmetros finais, o script joga a saída para STDOUT = browser
 */
imagejpeg($thumb);
?>

Veja o resultado após a execução do script. A imagem original de 300×300 foi redimensionada para 100×100, mantendo o aspecto e a proporção.

imagem original (300x300)

redimensionada = 100x100


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

A manipulação/geração de imagens no PHP é um recurso muito útil e versátil, que pode ser usado tanto para operações comuns como o redimensionamento / corte de imagens, quanto para  operações mais complexas, como a criação de montagens, gifs animados e tratamento de fotos.

A biblioteca GD é a mais utilizada no php para essas operações, por já estar presente na maioria das instalações padrão de servidores por aí afora. Ela oferece muitos recursos interessantes, e apesar de ter limitações, serve para todas as operações básicas de manipulação de imagem: corte, redimensionamento, colagem, escrita com fontes true type, efeitos básicos para fotos, e geração de imagens diretamente para o browser (um arquivo .php se “transforma” em um jpg).

Para maiores informações e referência das funções da GD, acesse: http://www.php.net/manual/en/ref.image.php

Neste artigo você verá exemplos de utilização da GD para aplicar efeitos em fotos. Nos exemplos, utilizei a imagem “foto_exemplos.jpg”, no mesmo diretório do script, e joguei a saída diretamente para o browser, não salvando as alterações na imagem.

Brilho

No exemplo abaixo, aumentei o brilho da imagem em “50″. Para diminuir o brilho, basta passar um número negativo.

Brilho +50

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_BRIGHTNESS, 50))
{
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

Contraste

contraste -50

O contraste funciona de maneira similar ao brilho, porém para aumentar o contraste é que você passa um número negativo. Um número positivo irá diminuir o contraste.

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_CONTRAST, -50))
{
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

Filtro de Cor

O filtro COLORIZE permite a você aplicar um filtro de cor na imagem, passando os argumentos que definem a cor: R G B (red, green, blue), e mais um argumento opcional que define a transparência do filtro – de 0 a 127, onde 0 (o padrão) seria totalmente opaco e 127 totalmente transparente – que não fará diferença no resultado da imagem. No exemplo abaixo, usei 100% de verde e nenhuma transparência (R=0,G=255,B=0)

colorize

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_COLORIZE, 0, 255, 0))
{
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

No exemplo abaixo, defini a transparência para 100, acrescentando “100″ na lista dos argumentos.

colorize green c/ alpha=100

Preto e Branco

preto e branco

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_GRAYSCALE))
{
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

Sépia

Para atingirmos o efeito de “Sepia”, aplicamos dois filtros. Primeiro deixamos a imagem preto e branco, depois aplicamos um ‘colorize’ no tom de sépia (amarelado).

sepia tone

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_GRAYSCALE))
{
	imagefilter($img, IMG_FILTER_COLORIZE, 90, 60, 40);
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

Negativo

negativo

<?php
$img = imagecreatefromjpeg("foto_exemplos.jpg");

if($img && imagefilter($img, IMG_FILTER_NEGATE))
{
	header("Content-type: image/jpg");
	imagejpeg($img);
}
else
{
    echo "Ocorreu um erro.";
}

imagedestroy($img);

?>

Lib Php TwitterTools com OAuth – postar, obter timeline, dm, mentions e fazer follow via Twitter API

Acabou de sair a atualização da minha antiga classe TwitMsg, que postava no Twitter utilizando o método antigo de autenticação, que foi eliminado desde o dia 16/08/2010.

A nova biblioteca contém 3 classes, e trabalha utilizando a OAuth para autenticar o usuário e fazer requisições à API do Twitter. Através dela você poderá criar um sistema de autenticação no seu site baseado no Twitter, sem precisar guardar as senhas do usuários, etc.

A TwitterTools permite também postar (já utilizando encurtador de links do Bit.Ly, de forma transparente), dar follows, obter a timeline, mentions e dms do usuário autenticado, e obter os followers de qualquer usuário.

Confira tudo em: http://erikafocke.com.br/twittertools

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.