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!