sábado, 21 de novembro de 2009

AjaxUpload para uploads sem complicação

Olá galera! Recentemente acabei um pequeno projeto em que estive trabalhando e que vocês podem conferir aqui (pcveiculos.com). Devo falar mais sobre ele depois, mas este post é para falar de um plugin bem legal que usei junto com o jquery (se você não usa, não sabe o que está perdendo) no projeto , é o AjaxUpload. Obs: No site do AjaxUpload fala que ele pode ser usado com outras bibliotecas como a Prototype, Mootools etc.

O AjaxUpload basicamente permite que o usuário clique em um botão (por exemplo) em uma página web e escolha um arquivo que ele deseja enviar para o servidor web. Depois de o usuário escolher o arquivo, o plugin pode automaticamente enviar o arquivo escolhido para o servidor. Isso mesmo, sem refresh da página inteira, sem precisar criar um formulário e um "input" tipo "file", tudo bem prático e simples. E o usuário ainda pode enviar mais de um arquivo ao mesmo tempo.

Bom aqui vai um link para um exemplo pronto (usando PHP), adaptado do próprio código exemplo do AjaxUpload, a maior diferença é que eu adicionei alguns comentários no código que tentam explicar algumas opções básicas .Exemplo AjaxUpload. Como vocês podem ver no exemplo eu também usei a biblioteca jquery.

Quando for testar o exemplo não se esqueça de setar as permissões da pasta uploads para aceitar ler e escrever arquivos. Qualquer dúvida ou problema encontrado comentem aí!

terça-feira, 20 de outubro de 2009

Um banco de dados de cidades e estados

Olá pessoal!
Estou trabalhando em um pequeno projeto e nele necessito ter acesso ao nome de todas as cidades do Brasil, assim como o estado de cada uma. Depois de algumas buscas na internet eu efetivamente achei alguns bancos de dados prontos contendo tabelas com os nomes das cidades e também o estado de cada uma.
Acontece que estas bases de dados que achei possuem alguns problemas. Uma que achei tinha mais de 9000 registros de cidades, sendo que o Brasil possui oficialmente um pouco mais de 5500 cidades. E também em todas as bases que achei o formato dos dados não estava do jeito que eu queria, todos os nomes dos municípios estavam com todos os caracteres em maiúsculo e também não tinham os acentos devidos.
Pesquisando um pouco mais achei no site do IBGE uma relação com todos os municípios e seus respectivos estados do ano de 2007 (para meu caso está atualizado o bastante), os arquivos estão neste endereço. O problema é que todos estes dados estão divididos em arquivos no formato xls, sendo um arquivo para cada estado. Usando a excelente biblioteca excel_reader eu fiz um pequeno script para pegar todos os dados dos arquivos xls (somente a sigla do estado e o nome de cada cidade) e transportá-los para uma tabela do banco de dados MySQL.
Junto com os scripts tem um arquivo chamado constants.php com os seguintes parâmetros de configuração:

DATABASE_HOST => Endereço do servidor mysql.
DATABASE_USER => Usuário para acessar o servidor mysql.
DATABASE_PASS => Senha do usuário mysql.
DATABASE_NAME => Nome do banco de dados onde a tabela de cidades será criada.
CITIES_TABLE_NAME => Nome da tabela com os dados das cidades que será criada.
ID_NAME_COLUMN_NAME => Nome da coluna chave primária da tabela de cidades.
ESTATE_NAME_COLUMN_NAME => Nome da coluna com o estado de cada cidade.
CITY_NAME_COLUMN_NAME => Nome da coluna com o nome de cada cidade.

Depois de configurar estas opções de acordo com seu gosto é só rodar o arquivo main.php. Os scripts podem ser baixados aqui. Junto deles vai uma pasta chamada data que contém todos os arquivos xls do IBGE.
Aqui vai um link para uma exportação da tabela de cidades que criei usando os scripts caso você queira importar os dados diretamente. A tabela possui 5518 registros.
Novamente gostaria de falar da qualidade da bilbioteca excel_reader para ler os arquivos xls. Foi uma das duas que consegui fazer rodar mas a única que não teve problemas com uso de memória e tempo de execução.
Valeu e até a próxima.

sábado, 26 de setembro de 2009

Tradução - 5 importantes dicas para debugar código PHP

Fala aí galera! Mais uma tradução (talvez eu devesse mudar de profissão), é um artigo bem legal com dicas para dominar a habilidade de debugar seus maravilhosos scripts php que insistem em não fazer o que você quer. Vi isso no blog phpcollection e o artigo original pode ser acessado aqui. Então vamos lá!

Debugar código em php é um pesadelo para todos os programadores php e estes são os momentos onde eles sentem falta da funcionalidade de trace das funções do java. Contudo algumas técnicas simples de debug podem ajudar você a codificar mais rápido e salvar o valiosíssimo tempo de desenvolvimento.

Todas estas técnicas são baseadas na minha experiência e adoraria conhecer quais outras técnicas de debug programadores php usam para encontrar erros em seu código! Por favor comente abaixo e compartilhe com a comunidade sua arma secreta para debugar código php.

Então, minhas 5 dicas para debug são (em nenhuma ordem em particular):

1) - Debug de código php simultâneo: Use um editor com um debugger php simultâneo (como phped, PhpDesigner, Eclipse, etc ), editores como editpad, notepad não suportam debug simultâneo então neles você precisa rodar o script php no browser para encontrar erros. Estes outros editores rodam os script php via linha de comando a cada vez que o script é salvo e apresentam os erros encontrados.

Pequenos erros humanos como esquecer de um ponto e vírgula, não terminar a linha corretamente, errar as chaves etc podem ser facilmente encontrados usando um debugger php simultâneo.

2) - Use xdebug - A extensão xdebug permite você achar a pilha de execução ou a pilha de chamada de funções em mensagens de erro, a alocação de memória e previne execuções de recursão infinita acontecerem.

Também fornece informações de profiling do código PHP e tem a capacidade de debugar scripts interativamente com um cliente de debug.

Xdeug pode ser encotrado em xdebug.org (Editores como phpdesigner e phpdebug já contêm o Xdebug embutido).

3) - Ative as mensagens de erro do php - O arquivo php.ini possui muitas opções de configuração. Entres estas opções exitem algumas opções que controlam a forma como mensagens de erro são exibidas para o usuário. Tenha certeza de que as duas seguintes opções estejam configuradas como a seguir:

display_errors = On
error_reporting = E_ALL & ~E_NOTICE

4) - Use comandos como print e echo de antemão em pontos críticos para debug - Esta dica é de certa forma um método caseiro que uso para debugar php que eu considero extremamente útil para analisar grandes bases de código php.

Enquanto estou programando eu crio algumas seções virtuais de código e nestas seções eu coloco comandos echo para assegurar que o interpretador está passando por aquela seção corretamente e escrevendo a informação requerida corretamente.

Mas como não posso deixar estas seções sempre executando, eu coloco um comando if debug_check para verificar se o código está sendo executado em modo de debug ou modo de produção.
Exemplo:

$debug_check = 1;

foreach ($array as $data) {

if ($debug_check == 1)

print ($data);

}

Aqui a varável $debug_check é definida no topo do script. Assim que for mudada para 1 , o código passa a mostrar todos comandos echo e print, somente quando eu estiver debugando o código.

Quando estou em modo de produção eu simplesmente mudo o valor de $debug_check para 0 que agora vai esconder todos os comandos echo e print. Isto leva um pouco mais de tempo no inicío mas é muito útil a longo prazo.

5) - Use frameworks - Frameworks são umas das maiores mudanças na programação moderna, frameworks php como CodeIgniter e CakePHP provêem muitas funcionalidades para se construir casos de teste, testes unitários e debug.

Também, como a maior parte do código roda dentro de bibliotecas as mensagens de erro são bem feitas e providenciam detalhes internos.

Dois dos meus frameworks favoritos são : cakephp e codeingiter.

Espero que você tenha apreciado estas 5 técnicas de debug para php. Eu pesso para todos compartilharem aqui seus conselhos para debugar código php. Eu vou compilar todos eles em um post com os devidos créditos e publicar! Isso pode ser bem útil para todos os programadores php ao redor do mundo. (Isso foi no post original mas se as dicas forem legais eu posso colocar a tradução aqui novamente)

É isso aí! Valeu pessoal!

quarta-feira, 23 de setembro de 2009

Domínios

Estou criando um site(na verdade estou apenas na fase de ideias, mas pretendo falar sobre o desenvolvimento dele aqui no blog em breve). Hoje fiquei um tempo pensando em domínios, e percebi que todos os bons nomes para domínios já foram escolhidos (pelo menos na área que estou pensando).
Escolher um domínio até parece um tipo de arte arcana obscura pelo que li em alguns artigos na web (aqui, aqui e aqui), este último até tem um download de um pdf de 70 páginas sobre como escolher um domínio. Talvez eu devesse criar um domínio estilo web 2.0 como flickr, twitter, blogger, reddit, digg (perceberam que o segredo é terminar em "r" ou ter duas letras repetidas no nome?). Bem, vou pensar mais um pouco e se alguém quiser deixar uma sugestão de como criar um bom domínio eu fico agradecido. Valeu!

sábado, 29 de agosto de 2009

Calcular distância entre as cidades do Brasil

Olá pessoal! Achei um post interessante onde o autor (Marcos Roberto Silva) colocou um código perl que usa o google maps para dizer qual a distância entre duas cidades. A quem interessar o artigo está aqui.
Eu vi o código e ele é bem simples, assim fiz uma versão usando php (o php tem muitas coisas parecidas com o perl, afinal ele tem suas origens ligadas ao perl).
Este é o código php que faz toda a mágica:
Update: Olhe no fim do post
$origem = "Oiapoque-AP";
$origem_codificada = urlencode($origem);
$destino = "Chui-RS";
$destino_codificado = urlencode($destino);

if (! empty($origem) && ! empty($destino)) {
$url = "http://maps.google.com.br/maps?saddr={$origem_codificada}&daddr={$destino_codificado}&hl=en&z=1";
$conteudo = file_get_contents($url);
$dados = split(',distance:"', $conteudo);
$distancia = split(' km",', $dados[1]);
$distancia[0] = str_ireplace(',', '', $distancia[0]);

$mensagem = "Distancia de $origem a $destino = $distancia[0] km\n";
} else {
$mensagem = "Preencha os dois campos como Goiânia-GO e Brasília-DF";
}



O código praticamente não tem diferença do original. Você pode adaptá-lo facilmente para exibi-lo em uma página web.

Update:
Conforme os comentários este código já está obsoleto, tanto pelo fato de a Google ter mudado a resposta da página quanto pelo fato do código provocar warnings do tipo Deprecated nas versões mais recentes do PHP. No código abaixo uma versão que alterei rapidamente. Aparentemente ela funciona, mas depende muito da resposta enviada pelos servidores da Google.

sexta-feira, 14 de agosto de 2009

Atalhos extremamente úteis para o NetBeans (Tradução)

Em um blog que fala muito de PHP o que o netbeans estará fazendo aqui? Nebeans não é para Java?! Bom, venho usando a versão dele para php a algum tempo e tenho que dizer que ele é um excelente editor para esta linguagem.
Um dia destes trombei com um post bem interessante falando de alguns atalhos no netbeans que estão me ajudando a ser muito mais produtivo neste ambiente. Para aqueles que acham que o netbeans é pesado, lento, foi feito em java e etc, sugiro olharem a versão específica para php que é bem leve e tem somente os recursos básicos (se bem que você tem a opção de instalar diversos plugins para adiconar outras finalidades) para php.
O artigo original você encontra neste link. Obrigado
Aí vai a tradução:
Já tem um bom tempo que confio somente no NetBeans para o desenvolvimento em Java e PHP. Até agora, ele está além das minhas maiores expectativas - estou totalmente satisfeito com esta excelente IDE. Hoje, eu estava procurando por um atalho que me premitisse duplica uma linha, e (felizmente!) encontrei este grande post Top 10 NetBeans IDE Keyboard shortcuts. Não somente encontrei o atalho de duplicar a linha, eu também descobri diversas outras pérolas que devido a não estarem disponíveis nas minhas IDE's anteriores, eu nunca tinha considerado procurar por elas.
Então, decidi compilar minha própria lista de atalhos que me salvam um bom tempo durante as sessões de desenvolvimento.
Shift + esc Alterna a área de trabalho entre Maximizar/Minimizar.
Como o autor do post original, eu gosto muito de ter o máximo possível de área de trabalho para o código. E quando ocasionalmente eu preciso ver um dos painéis suplementares (como Arquivos, projetos, Navegador etc), eu confio mais nos atalhos, alternando maximizando/minimizando eles. Então, se eu preciso ver alguns dos painéis acoplados eu digito alguns dos seguintes atalhos:
Ctrl + 1 - Janela de Projeto
Ctrl + 2 - Janela de Arquivos
Ctrl + 3 - Janela de Favoritos
Ctrl + 4 - Janela de Saída
Ctrl + 5 - Janela de Serviços
Ctrl + 2 - Janela de Tarefas

e quando termino, Ctrl + 0 para voltar para o editor. Tente você mesmo, tenho certeza de que, você ficará maravilhado com a quantidade de tempo que isso salva para você, enquanto faz a área de código menos confusa.

Alt + Enter Ver sugestões de correção
NetBeans faz a sua vida ficar bem mais fácil, seu analisador de código Java realmente faz um bom trabalho. Muitos dos erros são filtrados mesmo antes da compilação - você deve ver a lâmpada no lado esquerdo do seu código, você pode ver as sugestões de correção clicando nisto ou (economia de tempo novamente) apertando Alt + Enter. Eu pessoalmente gosto muito deste, como eu prefiro ver porque a IDE está reclamando sem retirar minhas mãos do teclado.

Ctrl + F12 Navegar para o membro
Se sua classe é muito grande, então a visualização de membros no paindel Navegador (Ctrl + 7 lembra-se?) pode não ser a melhor opção. Apenas aperte Ctrl + F12 e você poderá navegar mais fácilmente, porque esta opção possui filtros que eliminam os membros que não se encaixam no que você está digitando.

Alt + Insert Gerar código
Este é um dos meus favoritos - geradores de código para setters/getters/construtores são muito sexy para serem enganados. Este atalhos faz eles serem ainda mais úteis.

Ctrl + Shif + Seta para baixo Duplicar as linnhas.
Duplicar linhas nunca foi tão fácil :) . Se você quer que a duplicação seja inserida antes da linha corrente, use Seta para cima ao invés de Seta para Baixo.

Ctrl + W Fechar janela corrente
Firefox honra este atalho, assim como o Konqueror. Então, até configurei meu console para usar este atalho por padrão. Em pouco tempo você vai se acostumar a apertar esta combinação ao invés de Ctrl + F4.

Ctrl + PgUp e Ctrl + PgDown Navegar entre as janelas
De novo, me acostumei com este com o Firefox. Fica rápido percorrer entre os documentos abertos.

Ctrl + P Mostra os argumentos dos métodos
Dentro dos parenteses do método use esta combinação para ver quais parâmetros estão presentes. Muito útil quando estiver revendo código.

Ctrl + ; Adiciona um ponto e vírgula no final da linha sem mover o cursor.
Se você estiver trabalhando em um código e o netbeans sublinhar a linha com vermelho (devido ao ainda inexistente ponto e vírgula no final da linha) apertar Ctrl + ; (Ctrl + ponto e vírgula) é o bastante para fechar o comando, enquanto você ainda está posicionado na mesma posição na linha. Vi primeiro no dzone.com , e adoro usar este atalho.

Ctrl + K e Ctrl + L Auto completa com a próxima/anterior palavra compatível
Eu uso esta combinação mais frequentemento do que Ctrl + Espaço para auto-completar. Listar todos os itens com Ctrl + Espaço pode ser lento, mas apertando Ctrl + K é isntântaneo. Muito frequentemente o nome da varável que você está digitando já foi digitado em outro local no mesmo arquivo corrente, completar com Ctrl + K ou Ctrl + L é provavelmente o mais óbvio a ser feito.

Ctrl + E Excluia linha atual

Ctrl + Del e Ctrl + Backspace Exclui a próxima/anterior palavra.

Eu geralmente uso Ctrl + BackSpace, mas em algumas ocasiões Ctrl + Del se provou útil.
Isto é mais do que o bastante para colocá-lo no caminho. Em algum tempo, eu planejo escrever uma lista mais extensa de atalhos exóticos que você raramento usa, porque dificilmente você os conhecia.
Que atalhos lhe dão mais tempo?

sábado, 25 de julho de 2009

Triângulo de pascal em ActionScript 3

Olá pessoal! Estava tirando a poeira dos meus conhecimentos de as3 e implementei um código que reproduz o triângulo de pascal (Link).
Acho que ele não está muito difícil de entender. A classe PascalsTriangle recebe recebe um número de linhas que vão ser calculadas e retorna um array de arrays. Cada um destes arrays retornados é uma linha do triângulo. A classe Main chama os métodos na classe PascalsTriangle e exibe os valores no stage no formato de um triangulo. Se quiser alterar o tamanho do triângulo basta alterar a constante NUMBER_OF_ROWS na classe Main.as.
Eu compilei o arquivo usando o flex mas deve funcionar no flash também, embora você deva retirar a seguinte linha do arquivo Main.as:
[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
O links para donwload:Triângulo de Pascal

domingo, 5 de julho de 2009

Clonando objetos em PHP

Estes dias eu estava escrevendo um código que parecia mais ou menos assim (está simplificado aqui):


$instancia_robo = new Robo();
$robos = array();
for($i = 0; $i < 5; $i++) {
$robo = $instancia_robo;
$robo->id = $i;
$robos[] = $robo;
}
var_dump($robos);


Eu achava que não tinha necessidade de ficar instanciando a variável $robo dentro do loop para poder ter diferentes instancias dela (e isso teria funcionado no php versão 4, alguém ainda usa esta versão?). No php 5 agora todos os objetos são passados por referência (coisa feia eu não saber disso, eu sei). Mas esta versão do php providencia uma palavra chave chamada clone. Exemplo abaixo:


echo 'Usando clone';
$instancia_robo = new Robo();
$robos = array();
for($i = 0; $i < 5; $i++) {
$robo = clone $instancia_robo;
$robo->id = $i;
$robos[] = $robo;
}
var_dump($robos);


Compare os dois códigos rodando para você ver a diferença. Os objetos dentro do array no código usando clone ficam com a sequência correta. Uma forma de arrumar o primeiro código sem usar o clone seria instanciando a variável $robo dentro do loop ao invés dela receber a variável $instancia_robo. Os próximos códigos tentam fazer um comparativo do tempo que cada comando leva (um usando clone e outro instanciando a variável dentro do loop).
Clone:

ini_set("memory_limit","512M");

class Robo {

public $id;
}

define('MAX_NUMEROS', 1000000);

echo 'Usando clone', '
';
$instancia_robo = new Robo();
$robos = array();
$start= microtime(TRUE);
for($i = 0; $i < MAX_NUMEROS; $i++) {
$robo = clone $instancia_robo;
$robo->id = $i;
$robos[] = $robo;
}
$finish = microtime(TRUE);
echo 'Tempo decorrido ', $finish - $start;


Instância:

ini_set("memory_limit","512M");

class Robo {

public $id;
}

define('MAX_NUMEROS', 1000000);

echo 'Instanciando', '
';
$robos = array();
$start = microtime(TRUE);
for($i = 0; $i < MAX_NUMEROS; $i++) {
$robo = new Robo;
$robo->id = $i;
$robos[] = $robo;
}
$finish = microtime(TRUE);
echo 'Tempo decorrido ', $finish - $start, '
';


Rodando no meu computador (Dual core 1.73 GHZ, 2 GB RAM) as diferenças de tempo de execução dos dois códigos foram pequenas.
Comparando:
Clone
1 - 3,01864814758
2 - 3,74507808685
3 - 2,97225308418
Média: 3,24532644
Instância
1 - 3,50589299202
2 - 4,54684591293
3 - 3,42544102669
Média: 3,826059977
É claro que o teste não tem muito rigor. Provavelmente os resultados dependem mais da complexidade da classe do objeto. Se tivéssemos usado uma classe com métodos mágicos como __construct provavelmente as diferenças seriam maiores a favor do comando clone.

terça-feira, 2 de junho de 2009

Criando helpers que carregam bibliotecas do codeigniter

Olá pessoal! Só passando aqui para dar uma dica bem legal do codeigniter.
No ci você pode criar arquivos com funções php que você chama de helpers, estas funções podem ser usadas no controller, views e models (de acordo com o padrão MVC as views não seriam um bom lugar para se chamar um helper já que lá não é lugar de lógica de aplicação).
O problema é que originalmente estes helpers não possuem uma forma fácil e transparente para acessar as funções do ci (como funções das classes bd, session, config etc.). Mas através do método get_instance() esta tarefa fica bem simples.
Para se criar um helper não tem segredo: dentro da pasta application de sua aplicação ci tem uma pasta chamada helpers. Dentro dela você pode criar um arquivo chamado login_helper.php por exemplo. Dentro dele podemos colocar o seguinte conteúdo dentro das tags php:

function logout_usuario() {
$ci = & get_instance();
$ci->load->library('session');
$ci->session->unset_userdata('usuario_logado');
}

Através do comando get_instance eu consigo acessar uma instância do objeto global do ci. Com este objeto tenho acesso as classes, bibliotecas e outros helpers existentes, podendo assim usá-los nos meus próprios helpers. Se quiséssemos usar a biblioteca de encriptação por exemplo bastaria fazer o seguinte:

$ci = & get_instance();
$ci->load->library('encrypt');
$ci->encrypt->encode('valor secreto', 'chave do valor secreto');

Usamos o operador & junto ao comando get_instance() para pegar uma referência direta ao objeto global do ci, assim evitando uma cópia do objeto em memória.
Para você acessar seu helper basta fazer isso no controlador por exemplo:

$this->load->helper('login');
logout_usuario();

Note que ao carregar o helper ignoramos o "_helper.php" do nome do arquivo.

A dica está dada, até a próxima!

quinta-feira, 2 de abril de 2009

Google agora tem ajuda de humanos!

Estava eu a fazer mais uma das muitas pesquisas diárias que faço no google, estava logado na minha conta google, quando percebi as novidades:
Agora o google está exibindo botões que permitem você "Promover" ou "Remover" os links que ele retorna na busca. Eu não sei bem se isso é uma novidade (em relação ao google), mas para mim é.
Agora com pessoas com cérebros muito mais avançados no reconhecimento de padrões abstratos do que os computadores de hoje em dia ajudando em seu algoritmo de busca estas devem se tornar ainda mais relevantes. Por exemplo, quando você buscar por python você quer saber da linguagem de programação, do grupo de humor inglês ou da cobra?
E é claro que a empresa vai aproveitar para colher informações dos links que você promove ou remove para poder ter um perfil seu ainda mais completo e assim lhe mostrar anúncios ainda mais personalisados, e ganhar bilhões de dólares.

domingo, 22 de março de 2009

Jogo em flash

Olá pessoal! Vou colocar para download o código de um jogo que desenvolvi usando Flash. Eu usei actionscript 3 para criar o código. O jogo é bem besta, mas talvez ajude alguém que está querendo começar a desenvolver seus próprios jogos.
Baixe aqui!

sexta-feira, 27 de fevereiro de 2009

Verificar se um ponto está dentro de um polígono no Google Maps

Dica rápida para quem está usando Google Maps e javascript (se bem que é quase impossível usar o google maps sem javascript).

Estes códigos permitem verificar se determinado ponto está ou não dentro de um objeto GPolygon(polígono).

Primeiro código:




// // === A method for testing if a point is inside a polygon
// === Returns true if poly contains point
// === Algorithm shamelessly stolen from http://alienryderflex.com/polygon/
GPolygon.prototype.Contains = function(point) {
var j=0;
var oddNodes = false;
var x = point.lng();
var y = point.lat();
for (var i=0; i < this.getVertexCount(); i++) {
j++;
if (j == this.getVertexCount()) {j = 0;}
if (((this.getVertex(i).lat() < y) && (this.getVertex(j).lat() >= y))
|| ((this.getVertex(j).lat() < y) && (this.getVertex(i).lat() >= y))) {
if ( this.getVertex(i).lng() + (y - this.getVertex(i).lat())
/ (this.getVertex(j).lat()-this.getVertex(i).lat())
* (this.getVertex(j).lng() - this.getVertex(i).lng()) oddNodes = !oddNodes
}
}
}
return oddNodes;
}

Ele adiciona a funcao Contains(point) no objeto GPolygon. Eu a retirei do seguinte endereço:http://econym.org.uk/gmap/inside.htm.

Aliás nesta página tem um excelente tutorial sobre o Google Maps. Para usá-la você faria o seguinte:

var polygon = new GPolygon(points);

polygon.Contains(algumPonto);



O outro código é este:


// Create polygon method for collision detection
GPolygon.prototype.containsLatLng = function(latLng) {
// Do simple calculation so we don't do more CPU-intensive calcs for obvious misses
var bounds = this.getBounds();

if(!bounds.containsLatLng(latLng)) {
return false;
}

var numPoints = this.getVertexCount();
var inPoly = false;
var i;
var j = numPoints-1;

for(var i=0; i < numPoints; i++) {
var vertex1 = this.getVertex(i);
var vertex2 = this.getVertex(j);

if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) {
if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
inPoly = !inPoly;
}
}

j = i;
}

return inPoly;
};



Ele basicamente faz a mesma coisa, adiciona a função containsLatLng() no objeto GPolygon. Esta eu peguei em: http://dawsdesign.com/drupal/google_maps_point_in_polygon.

O uso é o mesmo também:

var polygon = new GPolygon(points);

polygon.containsLatLng(algumPonto);



Ambas as funções retornam true ou false.



A primeira não estava identificando corretamente alguns pontos em um polígono com quatro lados de tamanhos irregulares, equanto a segunda

funcionou neste caso. A primeira função funcionou corretamente em um polígono com a forma de um círculo.



Espero que elas ajudem vocês como me ajudaram.

PS.:Me desculpem pelo código, é melhor vocês olharem nos links, ainda não sei o que fazer para publicar código decentemente.

quarta-feira, 18 de fevereiro de 2009

segunda-feira, 9 de fevereiro de 2009

Tradução -Começando com o CodeIgniter parte 2

Saudações a todos!
* Como o blog está somente começando eu ainda não tenho muito o que escrever. Atualmente estou começando a brincar com o CodeIgniter e achei um tutorial introdutório bem legal sobre ele. Ele foi escrito pelo Mike e está publicado no site dele o Capsize Designs. Ele foi bem gentil e permitiu que eu o traduzisse para o português.

Bem vindos novamente. No último texto nós configuramos e rodamos uma instalação do CodeIgniter e nos familiarizamos com a estrutura e instalação. Agora, nós iremos olhar de perto como o CodeIgniter lida com o MVC, e o que MVC realmente significa.

O MVC é o princípio do CodeIgniter e da maioria dos framewroks de aplicações web (Symfony, Zend, CakePHP e até mesmo o infame Ruby on Rails). É também uma boa forma de se estruturar qualquer tipo de aplicação, e você se sentirá uma pessoa melhor por ter aprendido isso. E também é bom na cama. Continuando...

Curso rápido em PHP Orientado a Objetos
CodIgniter não vai fazer sentido a menos que você se familiarize com os conceitos básicos da programação orientada a objetos. O estilo típico de muitos programadores PHP envolve codificar de uma maneira linear (faça isso e depois faça isso ou isso). Isto serve para projetos pequenos (Digo para projetos bem pequenos), mas conforme uma aplicação cresce, ela fica confusa, feia e muito má.

Contrastando com isso, nós temos a programação orientada a objetos. CI( e MVC em geral, nós veremos isso depois), usa uma versão simplificada da POO. No nível básico, nós temos classes, objetos, e funções e métodos. Classes são o modelo geral ou estrutura de alguma coisa. Um bom exemplo de uma classe é um cão. Um cão possui quatro patas, é peludo, pode latir, etc. Um cão é uma classe.

Por seguinte nós temos objetos. Objetos são instâncias especificas de classes. Por exemplo, se "cão" é uma classe, então meu Cão Pastor Australiano chamado "Tuck" seria um objeto. É um membro especifico da classe.

Finalmente, nós temos métodos e funções. Estas são as coisas que um membro da classe pode fazer. Por exemplo, a classe cão tem uma função latir(), uma função pular(), e uma função estaDormindo(), etc. No mundo da programação, você tem que criar um novo objeto (ou instância de uma classe), geralmente (dependendo da linguagem) usando algo similar a var sparky = new Cao();, e então você pode chamar métodos no nosso cão. Em PHP, chamar funções em um objeto usa a sintaxe de flecha, então para fazer Sparky pular nós usaríamos sparky->jump();.

Esta é uma versão BEM simplificada e a definição da Wikipedia de Programação Orientada a Objetos pode ajudá-lo se você ainda estiver confuso. Contudo, é muito importante ter um entendimento básico sobre isso, porque CI depende disso, como nós veremos.

Modelos, Visualizações, Controladores, Nossa!
CodeIgniter é baseado na testada e verdadeira filosofia MVC. Basicamente, o ponto básico do MVC é que você separa o que o usuário vê(as visualizações) da lógica da aplicação (geralmente os modelos). A lógica da aplicação e a apresentação são conectados pelos controladores.

Agora, não entre em pânico! Isto é bem mais simples do que parece. E quando você tiver começado, eu te prometo que você não vai querer voltar atrás. Esta separação faz tudo mais simples, fácil de entender, e alguns podem dizer que fica mais bonito (embora eu não gostaria de ser tão nerd assim, então não vou ser). Aqui está o básico do papel de cada um destes três componentes.

NOTA: Você vai ver muitas menções sobre convenções de nomes. Convenções de nomes não são absolutamente necessárias no CI (como o são no CakePHP) mas elas são recomendadas pelo fato de que se você sempre segue as mesmas orientações, você não terá que despender tempo tentando lembrar como aquela coisa era chamada. Eu tento seguir as convenções de nomes do EllisLabs, eles desenvolveram o CodeIgniter, embora você possa desenvolver suas próprias e usá-las.

Modelos
Modelos fazem qualquer coisa entre conectar-se com um banco de dados e realizarem o CRUD (Create (Criar), Read (Ler), Update (Atualizar), Delete (Excluir)). Eu gosto de ter um modelo para cada tabela do meu banco de dados, geralmente chamado "nomedatabela_model.php". Modelos (e Controladores) contem um construtor, frequentemente com o mesmo nome da página exceto que maiúsculo (se a página é chamada blog_model.php, seu construtor será chamado de Blog_model).

Relembrando nossa explanação de programação orientada a objetos, um modelo seria uma "classe". Cada modelo tem suas próprias funções (lembra disso?) que podem ser chamadas depois de você criar uma instância especifica do modelo. Acalme-se. Aqui está um exemplo.
Vamos dizer que você possui um site de E-Commerce, então você provavelmente possui um banco de dados com tabelas como produtos, usuários, compras, etc. Assim, para construir o modelo para a tabela de produtos, você criaria um arquivo chamado produtos_model.php, e o estruturaria assim:

class Produtos_model extends Model {
function Produtos_model() {
parent::Model();
}
function algumacoisa1()
{
.....faz alguma coisa....
}
function algumacoisa2()
{
.....faz alguma coisa....
}


Então basicamente, você tem um modelo com o mesmo nome da página php, e a primeira função é o construtor, que tem o mesmo nome do modelo. O construtor diz ao CI que o pai da classe é classe genérica de modelo(Model). Depois disso, você coloca algumas funções que relacionam o banco de dados e os produtos. Você pode ter uma função getPreco() ou excluiProduto(). Estas funções criam um mini-biblioteca de coisas que seu controlador pode fazer, mas o controlador em si não tem que se preocupar em como elas são feitas. Nós entusiastas da programação gostamos de chamar isso de "abstração". Ohhhhhhh...

Vale lembra que o CI não OBRIGA você a usar modelos. Você pode colocar toda a interação com o banco de dados no controlador se você quiser. Faça um favor a você mesmo e use os modelos. Conforme sua aplicação cresce, você ficará feliz de ter uma camada extra de separação para mantê-lo são.

Controladores
Controladores são pontes entre a lógica de aplicação e a visualização. No exemplo prévio do E-Commerce, o modelo Produtos_model tinha funções que faziam as operações CRUD para nós, e nosso controlador chamará estas operações para fazer o que tiver para fazer, e retornará o que tiver para ser mostrado na visualização. Na minha opinião, controladores são a beleza de frameworks MVC como o CI. Você tem a parte de banco de dados no modelo, a parte visual nas visualizações, e o meio disso nos controladores. Ele é o atravessador. Isso não faz vocês ficarem entusiasmados? Somente eu? Não minta.

A anatomia de um controlador é muito parecida com um modelo. O nome de seu controlador será todo minúsculo, e deve explicar o que ele está manipulando. Por exemplo, nós provavelmente faríamos um controlador produtos.php comunicar nosso produtos_model.php com as visualizações. Bem chame ele de produtos.php, e ele vai ficar mais ou menos assim:

class Produtos extends Controller {
function Produtos() {
parent::Controller();
}
function index() {
echo 'Olá mundo!'
}
}

NOTA: As funções nos controladores são muito legais no CI. Ao invés de ter uma página php separada para cada página no site, você pode ter um controlador para cada seção, e páginas dentro de cada seção possuem sua própria função no controlador. Isto significa que por padrão, quando você navega para um controlador (como www.seusite.com/index.php/produtos), a função index do controlador produtos será chamada. Contudo, se você quer uma página para mostrar todos os sapatos ou outra coisa, você criaria uma função "sapatos()", e então navegaria para www.seusite.com/index.php/produtos/sapatos para executar a função. Isto é incrível.

Mas este era um controlador bem simples. Frequentemente, um controlador irá criar uma instância de um modelo, chamar algumas funções do modelo, e então passar os resultados para a visualização para mostrá-las no browser. Ficará mais ou menos assim:

class Produtos extends Controller {
function list() {
$this->load->model('Productos_model');
$data['preco'] = $this->Produtos_model->getProdutoPreco(algum_parametro);
$this->load->view('produtos_view', $data);
}
}

Acostume-se BEM com a sintaxe dos comandos load ($this->load->algo). Seu controlador usa este comando para criar uma nova instância do modelo ou para passar dados para a view para serem mostrador no browser. Neste caso, nós estamos dizendo o CI que nós iremos conversar com o Produtos_model usando o comando load. Então, nós chamamos a função getProdutoPreco() do Produtos_model e passamos os resultados em um array associativo chamado $data. Nós vamos chamar nosso resultado 'preco', então nós colocamos isso como $data['preco'].

O array $data é muito importante porque é que usamos para passar informações para nossa visualização.
E falando de visualizações...

Visualizações
Visualizações mostram tudo o que o usuário vê. Existem infinitas maneiras de organizar visualizações. Algumas aplicações podem ser pequenas o bastante para ter somente uma visualização, e esta representar diferentes páginas baseada em diferentes informações que os controladores passam para ela. Você pode também ter uma visualização diferente para cada página. Você escolhe, e isto depende do quão complexas suas páginas serão.
Visualizações obviamente vão dentro da pasta de visualizações, e eu usualmente as nomeio como algumacoisa_view.php. Se sua visualização vai mostrar uma lista de produtos, porque o nome não pode ser produtos_view.php. Note que os modelos são nomeados como algumacoisa_model.php e visualizações como algumacoisa_view.php enquanto controladores são somente algumacoisa.php. Isto é porque o nome do controlador é o que aparece na url, e você quer deixá-la bonita. Sim, eu sei, você pode mudar o que aparece na URL para qualquer coisa que você queira no arquivo routes.php, mas como nós estamos no básico, não vou tentar confundi-lo com isso.

Basicamente, uma visualização é muito parecida com uma página html que vocês estão acostumados, possui um DocType, tags, head e body, etc. De fato, é bem comum ter uma visualização cabeçalho e uma visualização rodapé para carregar antes de depois do conteúdo da visualização que você estiver usando.

A parte legal: A visualização mostra informação passada a ela pelo controlador. Qualquer coisa dentro do array $data (no nosso exemplo do controlador, 'preco') será passado a visualização e nós podemos referenciar isso usando o nome do objeto como variável. Isto não é tão confuso quanto parece! Digamos que passamos $data['preco'] para a visualização. Na visualização, nós podemos referenciar isso usando $preco. Se tivéssemos passsado $data['descricao'], nós poderíamos referenciar isso como $descricao. Isto é a beleza disso tudo. Nós podemos até mesmo passar outros arrays para $data. Digamos que o array $data contenha um array chamado 'produtoinfo'. Na visualização, nós poderíamos fazer algo como $produtoinfo['preco'] ou $produtoinfo['entrega'] ou qualquer outra coisa. Oportunidades ilimitadas! EBAAAA! Você pode não estar excitado como eu estou, mas você ficará depois que entender tudo.

Para demonstrar, aqui está uma visualização bem simples que mostra o preço que passamos:


"O preço é: =$preco *



Legal e simples. Note a sintaxe alternativa PHP. Ao invés de usar um comando echo para mandar o preco, nós usamos...

=algumca_coisa_para_mostrar *

... e o "=" fez isso para você. Somente um atalho. Embora, embora como cheekygeek observou nos comentários abaixo (link para o original no inicio do texto), isto requer que as tags curtas (short tags) estejam habilitadas no php.ini. Se isto não funcionar para você, isto deve ser o motivo. Contudo, em system/application/config.php no final do arquivo, você pode mudar $config['rewrite_short_tags'] = TRUE; e o CodeIgniter vai re-escrever todas elas em tempo de execução, então elas ainda vão funcionar no seu servidor.

Bem é o bastante por agora. Espero que você tenha aprendido algo, e volte para ver a parte três! Feliz codificação!

* Eu não sei porque mas o Blogger não está aceitando as tags php. Vou tentar colocar estes códigos nos comentários.

terça-feira, 3 de fevereiro de 2009

Tradução -Começando com o CodeIgniter parte 1

Saudações a todos!
* Como o blog está somente começando eu ainda não tenho muito o que escrever. Atualmente estou começando a brincar com o CodeIgniter e achei um tutorial introdutório bem legal sobre ele. Ele foi escrito pelo Mike e está publicado no site dele o Capsize Designs. Ele foi bem gentil e permitiu que eu o traduzisse para o português.

CodeIgniter é um "Framework de aplicação web open source que permite você escrever programas PHP que arrebentam." O próprio site diz isso. O CodeIgniter é extravagante. Contudo, sua documentação é muito bom depois que você inicia, mas começar é um pouco difícil. É por isso que estou aqui. Espero que depois deste tutorial, você encontre seu caminho para entender o CodeIgniter e tenha um bom entendimento da arquitetura MVC.

Na parte um nós iremos aprender sobre a instalação e configuração do CI, e também conhecer um pouco sobre a estrutura de diretórios (que sempre parece assustar as pessoas). Então vamos começar.

Um pouco de fundamentos
Para aqueles que não estão familiarizados com frameworks PHP ou o conceito MVC (Modelo, Visualização, Controle) em geral, aqui está uma introdução. MVC é um método testado e genuíno de organizar código fonte e arquivos do programa. Basicamente o MVC separa o código de interface do código da lógica do programa.
O CodeIgniter implementa a arquitetura MVC muito bem, e coloca tudo em toneladas de classes PHP e helpers (arquivos com funções úteis para a aplicação) para ser mais produtivo e rápido. Você tem uma classe de manipulação de imagens na qual você tem acesso a funções para redimensionar, cortar e colocar uma marca d' agua facilmente. Você tem uma classe de captcha que torna bem fácil gerar captchas para formulários web. Você tem até mesmo uma classe de codificação ZIP que torna simples criar pacotes zip dinamicamente no seu site. Eu não ficaria surpreso se o CI 2.0 viesse completo com um uma classe pia_cozinha.php! Ponto final. Isso foi divertido.

Dando uma olhada
Agora vamos uma olhada no CodIgniter para ver com o que estamos lidando. Faça o download da versão mais nova do site do CI e descompacte o arquivo em algum lugar do seu servidor. Abra o diretório no seu gerenciador de arquivos e dê uma olhada.
Você deve ver quatro coisas: A pasta "system" (que contém praticamente TUDO, incluindo o código fonte do CI e as pastas para você colocar seu código), uma pasta user_guide (guia de usuário que você pode excluir porque tem tudo no site do CI), um arquivo license.txt, e um arquivo index.php (o qual roteia cada requisição para qualquer lugar que ela precise ir).

Abra a pasta system. Você vê a pasta "application"? Este é seu lar. Não toque em nenhuma das outras pastas a menos que você esteja querendo saber como as coisas funcionam. Ou melhor, nem mesmo faça isso. Dá medo. Somente abra a pasta application. Você vai ver algumas pastas aí dentro. No começo, as únicas pastas com as quais você vai se preocupar são, config, models, views e controllers. Quando você melhorar no desenvolvimento com o CI, talvez você queira desenvolver suas próprias bibliotecas ou helpers que vão ficar nas suas pastas apropriadas, mas espere um pouco! Paciência é a chave! CHAVE!!!

Configuração e instalação
A primeira pasta que iremos olhar é a config. Especificamente, nós vamos mexer com o config.php, autoload.php, e database.php. Abra o config.php e dê uma olhada. Este é o principal lugar para brincar com as opções que o CI oferece. Antes de tudo, mude o valor de $config['base_url'] para o local que sua instalação do CI está. Se você está rodando no localhost e colocou em uma pasta chamada "ci", por exemplo, você colocará "http://localhost/ci/". Se está em um servidor online, vai ficar mais ou menos assim "http://www.seustie.com/seu_diretorio_ci". Seja lá o que você colocar, TENHA CERTEZA de incluir a barra(/) depois do nome do diretório, e tenha TENHA CERTEZA de incluir o "http://".

Continuando, nós veremos que $config['index_page'] está setado para "index.php". Está ok por agora, porque por padrão o CodeIgniter roteia tudo através da página index.php na rota do documento. Isto significa que suas urls ficarão parecidas com "www.seusite.com/index.php/alguma_pagina". Se você quiser tirar o index.php do endereço (Eu sempre tiro! Fica feio!), você pode mudar a configuração $config['index_page'] para uma string vazia (somente duas aspas sem nada entre elas para aqueles que nunca programaram antes) ao invés de "index.php" e faça um arquivo .htaccess para remover isso da url como o wiki do CI ensina.

Vá para $config['log_threshold'] = 0, e mude para 1. Isso permite que mensagens de erro (como mensagens do PHP ) vão para o log. Qualquer coisa menor do que 1 e você não verá nenhum log, qualquer coisa maior do que 1 e seus arquivos de log vão aumentar sem piedade. Então, fique com 1. É uma boa prática.

ATUALIZAÇÃO: Aparentemente alguns servidores teem problemas setando log_threshold para 1, então se você só ver páginas em branco depois da instalação, mude para 0 e veja se funciona. Se alguém puder explicar isso, por favor me avise.

ATUALIZAÇÃO 2: Graças a cheekygeek (nos comentários do artigo original, link no início do texto), nós temos a resposta
"Uma solução para o problema do log_threshold é permitir a escrita na pasta system/logs. Contudo, deixar pastas na web com permissão de escrita(777) nunca é uma boa ideia... A solução mais segura em um sistema compatível com linux é dar a permissão de grupo dos arquivos de log para o usuário do servidor web. Se você estiver usando o Apache, você verá isso definido no arquivo httpd.conf."

Obrigado pela informação, cheekygeek!

De volta ao principal, vá em frente e mude a chave encriptação ($config['encryption_key']) para uma sequência randômica de 32 caracteres alfa-numéricos. Muitas aplicações que usam autenticação ou trabalham com senhas usam a chave de encriptação colocando ela no final da senha (chamam isso de sal) e então criam um hash disso para segurança. Isso faz o armazenamento de senhas um pouco mais seguro.

Agora vamos sair do config.php e iremos para o database.php, também na pasta config. Se sua aplicação não vai usar um banco de dados, você não precisa mexer neste arquivo. A maioria dos usuários irão somente mudar as primeiras quatro opções das opções de banco de dados (hostname, username, password, database). Se você não estiver usando MySQL, você terá que mudar a opção dbdriver, e se você estiver prefixando todas suas tabelas com algo, você terá que mudar o dbprefix. Todo o resto deve estar correto.

Finalmente, nós vamos abrir o autoload.php. Este arquivo basicamente diz para o CI quais dos helpers e bibliotecas você gostaria de carregar automaticamente. Helpers e bibliotecas podem ser carregados em um controlador pelo próprio controlador, mas se tiver algum que você irá usar a maioria dos controladores, você pode simplesmente auto carregá-lo. Se você está usando um banco de dados, você deveria auto-carregar "database" na seção de bibliotecas. Eu geralmente auto-carrego "url" na seção de helper. Visite o guia de usuário do CodeIgniter para ver o que isto tudo faz. Você provavelmente vai precisar despender algum tempo familiarizando-se com tudo isso para tirar total proveito do CI. NOTA: No topo da página do Guia do usuário, tem um pequeno botão chamado "Conteúdo" que revela um menu de navegação deslizante. Estou falando disso porque fiquei duas semanas martelando minha cabeça até eu achar este menu.

Agora abra seu browser, navegue para onde você instalou o CI com o index.php no final (algo como http://localhost/ci/index.php). NOTA: Se você usou o arquivo .htaccess para retirar o index.php da url, você obviamente não precisará colocá-lo no endereço. Você está vendo a página de bem vindo? Se está, você está dominando o CI! Como é bom esta sensação! SIMMMM! Se não está, coloque um comentário aqui ou mande uma mensagem para os ótimos fóruns do CodeIgniter e não deve ser muito difícil para descobrir o que está errado.

Por padrão, o CI carrega o controlador "welcome.php". Para mudar para sua própria página, abra o "routes.php" na pasta de configuração e mude o controlador padrão. Nós vamos falar mais sobre controladores (e modelos e visualizações também!) na próxima parte, fique ligado.

sábado, 31 de janeiro de 2009

Here we go!

Olá pessoal! Este aqui é mais um blog começando e espero que não termine tão rápido.
Vou falar sobre desenvolvimento de software para web e suas tecnologias adjacentes principalmente PHP c/ CodeIgniter, JS e os outros vizinhos. Bem por enquanto é só.