quinta-feira, 20 de dezembro de 2007

URLs Amigáveis com Apache e PHP

Nesse artigo veremos como implementar URL’s mais amigáveis para as pessoas acessarem nosso site, sem o “trauma” de ver “códigos esquisitos” na barra de endereço do browser.

Outra motivação de implementarmos as URL’s amigáveis em nossos sites, é para sermos rastreáveis por spiders que normalmente ignoram arquivos com extensão que denotam programas que retornam conteúdo variável.

Essa técnica que passaremos aqui ajuda a destacar nosso site em sites de busca como o Google ou Yahoo e é uma ferramenta da SEO (Search Engine Optimization).

Se você não está entendendo direito o que estou dizendo vamos para um exemplo. Imagine que tenhamos um site que mostra artigos e informações sobre seus autores. Sem a utilização das URL’s amigáveis, poderíamos acessar um artigo da seguinte maneira:

http://www.sitedeartigos.com.br/artigo.php?id=123

Agora, utilizando a técnica que será passada por esse artigo, poderíamos acessar nosso site da seguinte maneira:

http://www.sitedeartigos.com.br/artigo/123

A URL acima é muito mais interessante de se ler do que a primeira URL informada. Creio que com esse simples exemplo, podemos entender qual o benefício que obteremos após aprendermos essa técnica.


Configuração do Apache
Como tudo na nossa área de programação, há várias
maneiras de se atingir um mesmo objetivo. Utilizarei uma técnica que desviará
qualquer chamada para o arquivo index.php que será o nosso manipulador de
requisições. Portanto, tudo passará pelo index.php e ele será o responsável por
carregar os arquivos corretamente.

A versão do Apache que estou utilizando é a 2.2.4.


1) Vá até o arquivo httpd.conf e descomente a linha
# LoadModule rewrite_module modules/mod_rewrite.so
Para descomentar, basta retirar o símbolo de cerquilha na frente da linha.
Essa alteração nos permitirá manipular as requisições, redirecionando-as para o arquivo index.php

2) Ainda no arquivo httpd.conf, localize a linha onde há a diretiva <Directory /> e garanta que tenha a seguinte linha dentro da diretiva: AllowOverride All.
Essa alteração nos permitirá utilizar o arquivo
.htaccess.

3)Reinicie o serviço do Apache


Configuração do arquivo .htaccess
Para nosso exemplo, vamos assumir que o site será testado dentro do diretório thiagomp que por sua vez tem o diretório teste.
Dentro do diretório teste ficará nossos arquivos PHP, inclusive o arquivo
index.php.
Portanto, nossa URL base seria http://localhost/thiagomp/teste.
Para funcionar o esquema, crie um arquivo chamado .htaccess (repare que há um ponto antes do nome do arquivo...) com o seguinte conteúdo:

RewriteEngine on
RewriteRule .* index.php
php_flag magic_quotes_gpc off
php_flag register_globals off

Repare que ligamos o motor de reescrita com a primeira linha e depois implementamos a regra de redirecionamento. A regra é bem simples: qualquer coisa que for informada, deve ser redirecionada para o arquivo index.php.

As outras duas opções nem seriam tão necessárias, mas são ótimas para garantir segurança e a sanidade de nossos códigos.

O arquivo .htaccess deve ser salvo dentro do diretório teste.


Arquivos para o teste
Abaixo será mostrado os arquivos utilizados para o testes com comentários. Tais arquivos foram testados com o PHP versão 5.2.4.

artigo.php

<?php
$idArtigo = isset($parameter['id']) ? $parameter['id'] : 0;
if(empty($idArtigo)){
  echo "<h2>Não foi selecionado o ID do artigo</h2>";
}else{
  echo "<h2>Mostra o artigo de ID $idArtigo</h2>";
}

autor.php
<?php
$idAutor = isset($parameter['id']) ? $parameter['id'] : 0;
if(empty($idAutor)){
  echo "<h2>Não foi selecionado o ID do autor</h2>";
}else{
  echo "<h2>Mostra informações do autor de ID $idAutor</h2>";
}


naoencontrada.php
<?php
echo "<h2>Página não encontrada</h2>";

index.php
<?php
/**
 * Recupera a URL solicitada e quebra cada parte dela.
 * Portanto, se a URL for algo do tipo http://localhost/thiagomp/teste/artigo/10 obteremos o seguinte array:
 * array(5) {
 *  [0]=>  string(0) ""
 *  [1]=>  string(6) "thiagomp"
 *  [2]=>  string(12) "teste"
 *  [3]=>  string(6) "artigo"
 *  [4]=>  string(1) "10"
 * }
 *
 * Com isso poderíamos convencionar que em nosso site, tudo o que vier depois da URL base, primeiro virá o nome do arquivo que vamos invocar e depois os parametros, sendo que primeiro parametro será sempre um ID
 */


$parts explode('/'$_SERVER['REQUEST_URI']);

/**
 * Esse trecho testa quantos diretórios há na URL solicitada. Dependendo da quantidade de diretórios passados, nosso programa ajustará os valores que serão procurados nas páginas invocadas
 */
if(count($parts) == 5){ // o usuário informou uma pagina e um ID
  $params array_slice($parts, -2);
  $pagina $params[0];
  $id $params[1];
}elseif(count($parts) == 4){ //o usuário informou apenas a pagina
  $params array_slice($parts, -1);
  $pagina $params[0];
  $id 0;
}else{ // nada foi informado
  $pagina "nenhuma";
  $id 0;
}

switch ($pagina){ //seleciona a página
  
case 'artigo'// implementamos o que queremos fazer quando uma determinada página for encontrada...
    $parameter[
'id'] = $id// configura o parametro que será recuperado na $pagina.php
    include("$pagina.php"); //... nesse caso vamos incluir o arquivo para execução
    break;
  case 'autor'
//idem ao artigo
    
$parameter[
'id'] = $id;
    include("$pagina.php");
    break;
  default: 
//caso a página solicitada não exista, mostraremos um erro
    
include('naoencontrada.php');
}


Depois de copiar os conteúdos e gravá-los em
arquivos, basta efetuarmos um teste colocando no browser a URL http://localhost/thiagomp/teste/artigo/10

Espero que esse artigo seja útil para lhe dar uma
noção sobre o funcionamento das URL’s amigáveis. Com certeza é um exemplo muito
simples, porém, para quem está iniciando, será muito bom para compreender o
conceito e continuar o desenvolvimento dos conhecimentos nessa área.

Caso algum erro ocorra com os arquivos ou tenha algo
para acrescentar, fique a vontade de comentar.

Até o próximo post.

domingo, 21 de outubro de 2007

Tempestade de poeira

Hoje o post não é nada sobre Tecnologia.
É para mostrar uma tempestade de poeira que chegou aqui em Ribeirão Preto.

Vejam as fotos e o vídeo abaixo:







Abraços e até o próximo post.

terça-feira, 25 de setembro de 2007

Problema de acentuação com PHP e JSON

Hoje estava trabalhando em uma aplicação com AJAX e me deparei um com problema de acentuação no retorno de alguns dados via JSON do MySQL.
Se em algum campo tiver a palavra "Éramos", por exemplo, ao executar um encode (utilizei a Services_JSON provida pelo PEAR), ele retornará algo como \u0072amos que será renderizado como "ramos".
Depois de googlar sobre o assunto, descobri uma maneira de evitar esse problema.
Considere que o código abaixo é um PHP que retorna dados no formato JSON

<?php
header('Content-type: application/json charset=iso-8859-1');

/*
* codigo para conexao no banco e enviar consulta
* ...
*/

while($row = fetch()){
array_walk($row, 'toUtf8');
$data[] = $row;
}

/*
* codigo para terminar de montar o array de retorno dos dados
*/

require_once('JSON.php');
$json = new Services_JSON();
echo
$json->encode($returnValue); // Instead of json_encode


function toUtf8(&$item, $key) {
$item = iconv("iso-8859-1","utf-8",$item);
}

O segredo está aqui:
$item = iconv("iso-8859-1","utf-8",$item);

O fato de converter todas strings para utf-8 utilizando a iconv, garantiu que meus dados fossem renderizados corretamente.

Por hoje é isso!
Abraços.

quarta-feira, 5 de setembro de 2007

Desenvolvimento para Linux

Após longos seis meses volto a postar no blog!
Não vou prometer nada, mas espero blogar mais.
Fui questionado sobre quais as ferramentas para desenvolvimento de software desktop para Linux. Quem fez pergunta era um programador Delphi.


Para quem trabalha com Delphi, existe o compilador freepascal e GNU Pascal Compiler.
Também tem o Lazarus que é uma IDE inspirada no Delphi.
Quem trabalha com Delphi normalmente utiliza o Firebird. O Firebird também pode
ser instalado no Linux.
Também tem o MySQL que é um banco de dados muito difundido e o PostgreSQL que é um banco menos difundido, porém poderoso.

Agora, se você está realmente querendo mudar, Java é a melhor opção de desenvolvimento para Linux, na minha opinião.
Tem um ótimo IDE free, o NetBeans, que se conecta em praticamente todos os databases, graças a arquitetura do JDBC de Java.

Outra ferramenta que vem ganhando bastante espaço em desenvolvimento desktop para Linux é o PHP-GTK. O PHP
é uma linguagem já muito utilizada para desenvolvimento web e com extensa gama de APIs para conexão nativa aos bancos de dados mais utilizados no mundo. Com essa extensão, ficou fácil o programador que já conhece PHP também desenvolver para desktop.

Não poderia deixar de citar o projeto MONO. Não o conheço muito, mas pelo que tenho lido, é uma ótima opção de desenvolvimento utilizando uma plataforma parecida com o .NET da Microsoft. O Sharp Develop é uma ótima IDE gratuita.
Seguindo essa linha, há o Real Basic, HBasic e Gambas, para programadores Visual Basic.
Certamente há mais opções como Python, QT, C, C++, Jython, Tcl/Tk , JRuby, entre outras.


Abraços e até o próximo post

quinta-feira, 1 de março de 2007

Delphi for PHP


Mais uma IDE para desenvolvimento disponível no mercado: Delphi for PHP.
A CodeGear, empresa criada pela Borland para dar continuidade aos produtos para desenvolvedores, adaptou o seu produto para o desenvolvimento de PHP. Eles já aceitam pedidos, mas entregarão o produto em março (não foi especificado o dia específico).
Não encontrei nada do site informando se haverá alguma versão para avaliação do produto, mas já enviei um email para eles perguntando sobre isso.

Fiquei muito feliz de saber dessa notícia, pois é uma empresa que desenvolve um produto amplamente conhecido como o Delphi (entre outros...) e demonstra a força que PHP tem exercido no mundo dos desenvolvedores.
A IDE foi devidamente adicionada a lista de editores de PHP que mantenho aqui no blog.

A ferramenta tem um preço sugerido de US$ 249,00.
Para os mais curiosos, existe um vídeo para ver a ferramenta em ação.

Abaixo mais um screeshot publicado no site da CodeGear.



Mais informações:
Notícia do lançamento do produto pela CodeGear (em inglês)
Info online (em português)

Abraços e até o próximo post.

terça-feira, 30 de janeiro de 2007

Zend Studio 5.5 e outras coisas

Estava lendo o blog do Yossi Leon (gerente de produto da Zend Technologies) e encontrei uma demonstração do Zend Studio 5.5 feita por ele mesmo.
O inglês dele não é dos melhores, mas não posso dizer nada, pois o meu ainda não é também!

Esses dias estive trabalhando numa classe simples para gerar xml's, estou colocando comentários nela e espero divulgá-la no phpclasses.org assim que terminar. Quando for publicada eu posto uma mensagem aqui.

Também estou trabalhando com C# desenvolvendo aplicativos para o Windows CE, num coletor de dados da empresa onde trabalho. Tem sido empolgante fazer progressos no desenvolvimento de aplicativos embarcados. Creio que profissionais desse tipo de software terão muito espaço, assim como os desenvolvedores de webaplicativos.

Juventude PIB Bebedouro

No fim de semana passado (dias 26, 27 e 28) fui a Bebedouro para visitar Família e amigos. Claro que não pude deixar de ir à PIB (Primeira Igreja Batista).
O pessoal do FP 378 (nome do ministério Jovem da PIB) iniciou o FP News! Ficou muito divertido e o vídeo está disponibilizado aí abaixo.



Quanto as publicações técnicas, vou ver se faço uma outra postagem ainda hoje.

Abraços e até o próximo post.

segunda-feira, 22 de janeiro de 2007

Constantes pré-definidas do PHP

O PHP fornece algumas constantes que podem ser de suma importancia para o desenvolvedor.
Uma lista de todas as constantes pode ser encontrada no site oficial do PHP

Abaixo uma lista de algumas constantes que considero importantes:

DIRECTORY_SEPARATOR - Dependendo do sistema operacional, as barras de seperação de diretório pode ser para frente (/) ou para trás (\), para não ter erro, utilize essa constante para informar o caminho de um arquivo.

PHP_EOL - Dependendo do sistema operacional, a quebra de linha em um arquivo texto pode ser apenas um caracter de line feed (\n) ou uma combinação dos caracteres de carriage return mais line feed (\r\n). Com essa constante, você pode inserir quebras de linhas sem se preocupar em qual SO está sendo gerado o arquivo.

M_PI - Informa o número do PI (aquele número matemático, lembra?)

Você também pode executar o código abaixo para ver todas as constantes definidas em seu ambiente e quais os valores de cada uma.

<?php
print
'<pre>';
print_r(get_defined_constants());
print
'</pre>';
?>


Parece que não, mas o conhecimento dessas constantes podem fazer uma grande diferença no desenvolvimento de seu webaplicativo.

Até o próximo post.

terça-feira, 16 de janeiro de 2007

Expressões regulares no MySQL

Expressões regulares é algo que de tempo em tempo temos que utilizar para obtermos um resultado adequado.
Alguns dias atrás tive que procurar em uma base de dados MySQL 4.1 clientes que tivessem pelo menos um email cadastrado corretamente. Na tabela, haviam duas colunas: email1 e email2.
Para resolver esse problema, recorri a instrução REGEXP e veja o que saiu:

SELECT nome_do_cliente, email1, email2,
email1 REGEXP "^.*@[a-zA-Z0-9].*$" AS valido1,
email2 REGEXP "^.*@[a-zA-Z0-9].*$" AS valido2
FROM clientes
HAVING (valido1 = 1 OR valido2 = 1)

Se o campo combinar com a expressão regular, então o SGBD retornará 1 (um), se não combinar retornará 0 (zero). Por isso fiz o HAVING para poder utilizar os apelidos das ERs.

Por hoje é só...

Abraços e até o próximo post.

segunda-feira, 15 de janeiro de 2007

Minimizador de códigos javascript

Estou percebendo que postar mensagens todos os dias num blog é algo trabalhoso! Esses dias estive com ilustres visitas aqui em casa e acabei ficando sem tempo de postar.

Hoje, em minhas "navegações perdidas" descobri o JSMIN. É um aplicativo interessante que pega o código javascript e retira um monte de caracteres desnecessários, reduzindo o tamanho do fonte a ser transferido ao cliente.

Vejam um código Javascript antes de ser "minificado":

// is.js

// (c) 2001 Douglas Crockford
// 2001 June 3


// is

// The -is- object is used to identify the browser. Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5.

var is = {
ie: navigator.appName == 'Microsoft Internet Explorer',
java: navigator.javaEnabled(),
ns: navigator.appName == 'Netscape',
ua: navigator.userAgent.toLowerCase(),
version: parseFloat(navigator.appVersion.substr(21)) ||
parseFloat(navigator.appVersion),
win: navigator.platform == 'Win32'
}
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
is.ie = is.ns = false;
is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
is.ie = is.ns = false;
is.gecko = true;
}

Tamanho total: 1004 bytes.

Agora vejam depois de passar pelo JSMIN:

var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
}

Tamanho total: 438 bytes

Uma economia de 566 bytes... é uma diferença considerável para um script de exemplo. Para as nossas bibliotecas javascript com certeza fara uma diferença muito maior!


Abraços e até o próximo post.

quinta-feira, 11 de janeiro de 2007

Shell script com PHP

Para os programadores PHP que trabalham com linux, é possível utilizar a linguagem para fazer os famigerados shel scripts! Muito mais legal do que utilizar o bash. :-)
Para fazer isso, tente o seguinte:

1 - Abra o vi/vim:
$ vi teste.php

2 - Escreva o seguinte código:
#!/usr/bin/php -q
<?php
echo "Hello World!\n";
?>

3 - Saia do vi/vim salvando o código digitado:
[ESC][:][x] (Tecla ESC, depois, tecla dois pontos e por último, tecla x minúsculo)

4 - Coloque permissões de execução no arquivo:
$ chmod 744 teste.php

5 - Execute o fabuloso programa teste.php:
$ ./teste.php

6 - Você deverá ver a saída do programa:
Hello World!

Legal né?! Imagine agora você com toda a API do PHP disponível no shell! Imagine você fazendo acesso a banco de dados com a facilidade do PHP dentro do shell!!! Tudo de bom!
Depois disso, dei adeus ao bom bash!

Até o próximo post.

terça-feira, 9 de janeiro de 2007

Cotação do dólar

Esses dias eu tive a necessidade de colocar num site a cotação do dólar do Estadão. Para resolver esse problema desenvolvi o seguinte script:

if(!$fp=fopen("http://www.estadao.com.br/economia/financas/
cotacoes/resumo.htm"
,"r" )){
    echo
"Erro ao recuperar a cotação do dia" ;
    exit ;
}

$conteudo = '';

while(!
feof($fp))
    
$conteudo .= fgets($fp,1024);
fclose($fp);

$conteudo = substr($conteudo, strpos($conteudo, ""));
$pos = strpos($conteudo, "");
$conteudo = substr($conteudo, 0, strpos($conteudo, "", $pos+1));

echo
$conteudo;
?>

Espero que possa lhe ajudar caso esteja precisando de algo parecido com isso!

Ah! Hoje li a notícia de que o youtube seria bloqueado por causa da Srta. Daniela Cicarelli que teve seus públicos atos devassos publicados em um site de grande público como o youtube... simplesmente lamentável. Mas a decisão já foi revista e nós brasileiros podemos acessar o maior síte de vídeos do mundo.

Até o próximo post.

segunda-feira, 8 de janeiro de 2007

imagecreatefrombmp

Eu já havia enviado essa mensagem por email à várias pessoas, porém, creio que seja uma informação útil para ficar registrada aqui no blog.

Alguém já precisou de uma função imagecreatefrombmp?
Eu estava precisando de uma para pegar umas capas de livros que estavam
nesse formato, porém a API do PHP não fornece tal função. Eu creio que o problema nem é a API do PHP mas sim a biblioteca GD que o PHP empacota.
Na minha cruzada para resolver o problema, encontrei uma que faz o
serviço de modo igual as funções da API do PHP.
Vocês poderão encotrá-la no seguinte endereço:
http://www.jpexs.com/php.html

Com certeza uma ótima ferramenta para se ter em mãos... quem sabe um
dia você não vai precisar!

Até o próximo post.

sábado, 6 de janeiro de 2007

Editores PHP

Faz algum tempo estou procurando uma IDE melhor para desenvolver meus projetos PHP.
Principalmente uma ferramenta que forneça um debugador, pois essa característica realmente acelera a detecção de problemas em relação ao uso de echo's e var_dump's.
Certamente nessa lista ainda falta editores. Se você souber de mais algum que eu não coloquei aqui, por favor, deixe um comentário.
Abaixo segue uma lista dos editores que encontrei:

  1. Edit Plus (windows | pago [possui trial] )
  2. Tulip (linux e windows | free e open source | feito com PHP-GTK)
  3. Crimson Editor (windows | free e open source)
  4. PHPEclipse (JVM - Java Virtual Machine | free e open source)
  5. Notepad++ (windows | free e open source)
  6. PHP Designer (windows | pago)
  7. Programmer's Notepad (windows | free e open source)
  8. Zend Studio (linux, windows, mac os x power | pago)
  9. EmEditor (windows | pago, mas possui versão free)
  10. UltraEdit (windows | pago [possui trial])
  11. Vi (linux | free)
  12. Vim (linux, ms-dos, windows, amiga, os/2, mac os, qnx e etc... | free e open source)
  13. SciTE (linux e windows | free e open source)
  14. Kate (linux | free e open source)
  15. jEdit (JVM | free e open source)
  16. PHP Development Tool (JVM | free e open source, menos o debugger)
  17. PSPad (windows | free)
  18. Dreamweaver (windows, mac | pago)
  19. gPHPEdit (linux | free e open source)
  20. TextWrangler (mac os x | free)
  21. Rapid PHP (windows | pago [possui trial])
  22. skEdit (mac os x | pago [possui trial])
  23. Quanta (linux | free e open source)
  24. BBEditor (mac | pago)
  25. Kwrite (linux | free e open source)
  26. EasyEclipse PHP (linux, mac, windows | empacota vários aplicativos que funcionam no Eclipse)
  27. Bluefish (linux | free e open source)
  28. PHPed (windows | pago [possui trial])
  29. Komodo (linux, solaris, mac os x, windows | pago [possui trial])
  30. BrEdit (windows | free)
  31. PHP Editor (windows | free)
  32. Davor's PHP Constructor (windows | pago)
  33. Alleycode (windows | free)
  34. CodeCharge Studio (windows | pago)
  35. PHP Expert Editor (windows | pago)
  36. Antechinus PHP Editor (windows | pago)
  37. HandyHTML Editor (windows | pago)
  38. DzSoft PHP Editor (windows | pago)
  39. Jext (JVM | free e open source)
  40. FastHTML (windows | free)
  41. EngInSite PHP Editor (windows | pago)
  42. Dynamic HTML Editor (windows | free e pago)
  43. Top PHP Studio (windows | pago)
  44. PHPEdit (windows | pago)
  45. Maguma Open Studio (windows | free e open source)
  46. TSW WebCoder (windows | pago)
  47. TruStudio Foundation (JVM | free e open source)
  48. HTML Kit (windows | free e pago)
  49. HAPEdit (windows | free)
  50. Smultron (mac os x | free e open source)
  51. emacs (linux e windows | free e open source)
  52. xemacs (linux, mac e windows | free e open source)
  53. Delphi for PHP (windows | pago)
Encontrei os 50 primeiros editores, os demais foram sugestões dos comentários. Não testei todos, mas tem muito coisa boa aí no meio.
Essa grande quantidade de editores mostra como a linguagem PHP é amplamente suportada por todo o mundo e nos garante (nós programadores PHP) opção de uma solução que mais se adeque às nossas necessidades.
Outro fato interessante é a quantidade de sistemas operacionais que são suportados pelos editores, com isso, podemos escrever PHP em nosso S.O. preferido.

Até o próximo post.

sexta-feira, 5 de janeiro de 2007

Até que enfim!!!

Até que enfim tenho um blog!
Meu nome é Thiago Melo de Paula, sou Desenvolvedor Web, Cristão (Batista) e Casado (muito bem casado!).
Postarei aqui informações sobre o meu dia-a-dia no trabalho e outras coisas que acontem ao meu redor.

Abraços e até o próximo post.