Tag: ‘php’
GeoLite City informações completas do seu IP – Parte II
Você já viu que utilizando as bibliotecas do GeoLite é possivel localizar o pais de um IP, mas é uma informação limitada, já com o GeoLite City exibe informações mais detalhadas além do Pais como Estado, Cidade, Latitude e Longitude, Código Postal (CEP) e muito mais.
Como esta é uma ferramenta gratuita, algumas informações não estão totalmente completas como por exemplo o CEP e Código de Área (telefônia). Em meus testes consegui identificar que para os EUA, Canadá e Itália estes dados estão disponíveis, mas para o Brasil (pelo menos para o estado de São Paulo) ainda não.
Este código complementa o mesmo utilizado em GeoLite Country, porém, utiliza um objeto com as caracteristicas de localização.
Faça o download do arquivo dat, copie o geoipcity.inc também, crie o arquivo – geoipregionvars.php – com as variáveis e constantes necessárias como este, certifique-se que o arquivo geoip.inc esteja na sua estrutura de arquivos, que deverá ficar assim:

Vamos ao código! O seu arquivo index.php deverá centralizar a obtenção do IP e chamar as funções para decodificar e exibir os dados sobre ele, veja:
<?php
// Includes da API
require("geoipregionvars.php");
require("geoipcity.inc");
// Obtem o IP
$vIP = $_SERVER['REMOTE_ADDR'];
// Abre o arquivo dat com o banco de dados
$giCity = geoip_open("GeoLiteCity.dat",GEOIP_STANDARD);
// obtem o registro do
$record = geoip_record_by_addr($giCity, $vIP);
?>
Até aqui conseguimos identificar o IP e obter as informações sobre de localização que está na variável $record, a seguir esta a camada de visualização dos dados.
<?
// obtem o registro do
$record = geoip_record_by_addr($giCity, $vIP);
if( !empty($record) ){?>
<table border="0" cellpadding="2" cellspacing="1">
<tr>
<th colspan="2">Informações sobre o IP
<em>"<?= $vIP ?>"</em></th>
</tr>
<tr>
<td width="35%">País</td>
<td width="65%"><?= $record->country_name ?></td>
</tr>
<tr>
<td>Estado</td>
<td>
<?=$GEOIP_REGION_NAME[$record->country_code][$record->region] ?>
</td>
</tr>
<tr>
<td>Cidade</td>
<td><?= $record->city ?></td>
</tr>
<? if(!empty($record->postal_code)){ ?>
<tr>
<td>CEP</td>
<td><?= $record->postal_code ?></td>
</tr>
<? } ?>
<tr>
<td>Latitude</td>
<td><?= $record->latitude ?></td>
</tr>
<tr>
<td>Longitude</td>
<td><?= $record->longitude ?></td>
</tr>
</table>
<?
}
?>
Have a fun.
GeoLite Country Obtendo a localização por IP – Parte I
Certa vez fiz um curso de um determinado produto cujo sua função basicamente era medir a audiência dos sites da empresa em que trabalhava, na mesma época onde pagava-se absurdos por este tipo de informação, irônia ou não, hoje o Google Analytics faz gratuitamente. O que me mais me fascinou foi quando a instrutora explicou a importância do IP, como é distribuído, o que é possível fazer através de seu rastreamento, assuntos de deixar qualquer geek boquiaberto.
Portanto, resolvi fazer este post para demonstrar uma facilidade muito interessante e pouco utilizado em sites nacionais, como os de operadora de telefônia, que preferem perguntar qual a sua cidade ao invés de identificar seu IP e redirecioná-lo aos serviços prestados em sua região e, fornecer uma opção para mudar de região quando quiser.
Talvez você encontre diversos outros bancos de dados de IPs na internet, porém, o mais popular é da Maxmind, que disponibiliza um bom serviço e gratuíto e também um serviço mais amplo por alguns dólares. A versão free é chamada de GeoLite e fornece além dos dados em CSV e DAT, incluí uma série de APIs para as linguagens de programação mais populares e alguns tutoriais de como utilizá-las, aqui utilizaremos PHP.
Vamos lá, faça o download do arquivo dat do GeoLite Country, e depois baixe as funções para manipulação do arquivo dat. Não será necessária nenhuma configuração no servidor tão menos no PHP, veja como é simples a identificação de pais utilizando os recursos do GeoLite Country.
<?php
// Inclui as funções do GeoIP Country
require("geoip.inc");
// Abre o arquivo .dat (banco de dados)
// especificando o caminho fisico do mesmo.
$gi = geoip_open("GeoIP.dat", GEOIP_STANDARD);
// recebendo o IP
$vIP = $_SERVER['REMOTE_ADDR'];
echo "Endereço de IP identificado: " . $vIP . "<br/>";
// Exibe a sigla e o nome do País
echo geoip_country_code_by_addr($gi, $vIP);
echo geoip_country_name_by_addr($gi, $vIP);
// fecha a conexão com o banco de dados
geoip_close($gi);
?>
Uma informação básica como esta, permite aos sites de serviços fornecerem funcionalidades, customizações, atrações no geral para que seu visitante sinta-se mais confortável se isto é possível.
Vou dar sequência a esta sessão de post, aprofundando as funcionalidades do GeoLite.
Namastê.
Web Services com Apache Axis e Tipos Complexos – Part III
Criar WebServices já foi um trabalho árduo, mas há alguns anos isto deixou de ser um problema com a ajuda das IDEs. Então vou mostrar como utilizar os recursos do Eclipse que facilitam o desenvolvimento de serviços.
Você já sabe o que é um WebServices e também como é simples publicá-lo utilizando Axis, mas nem todos seus serviços irão trabalhar apenas com tipos de dados primitivos, provavelmente será necessário retornar uma lista de Pessoas, Enderecos, ou qualquer outro tipo de dado complexo.
Nosso cenário é um projeto cujo o objetivo é fornecer consultas de Países e seus respectivos Estados, acessados através de serviços, a definição de Beans, DAOs e qualquer outras classes serão ocultadas, porém, no final deste post você poderá baixar a versão completa do projeto.

Bem como já foi demonstrado aqui precisamos de uma classe para que seja a base do serviço, neste caso será a harpia.region.services.Region, veja:
package harpia.region.services;
/* imports ocultados */
public class Region {
private RegionDAO rdao = new RegionDAO();
/**
*
* @param Nome do Pais
* @return Todos os países encontrados
*/
public Pais[] find(String nmPais){
ArrayList<pais> list = rdao.getAllPais( nmPais );
Pais[] paises = new Pais[list.size()];
list.toArray(paises);
return paises;
}
}
Criando o WSDL
Crie um novo objeto chamado Web Service (File > New > Others > Web Service). Após selecionar Web Service clique em Next.
Clique em Browse e selecione a classe responsável por implementar o serviço, ou seja, harpia.region.services.Region. Veja que o tipo deve ser Bottom up Java Web Service.
Na sequência serão exibidos os métodos disponibilizados pelo serviço, caso você não queira publicar basta desmarcar.

E por fim a caixa de dialogo informa que o servidor Apache está down é que será necessário fazer o startup para concluir a criação e publicação do WSDL, utilize esta mesma tela para iniciar o servidor e concluir o passo-a-passo.
Veja que um novo arquivo foi criado em projeto, agora existe o wsdl/Region.wsdl.
O WSDL (Web Service Description Language) nada mais é do que um Schema XML cujo está descrito o serviço de internet. Você poderá acessar este serviço em http://localhost/Harpia/wsdl/Region.wsdl ou também http://localhost/Harpia/services/Region?wsdl.
Criando o Client
Nosso serviço foi criado em Java 1.5, porem, neste momento poderiamos fazer uma solicitação a partir de qualquer linguagem que saiba interpretar o WSDL. Vamos continuar no Java por enquanto e fazer a chamada do nosso Web Service.
Já que a intensão é mostrar como a IDE facilita a criação de Web Services, aqui vai mais um wizard de como fazer o Web Service Client no eclipse.
Hey Client! Chamaí o serviço pow!
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import harpia.region.bean.Pais;
import harpia.region.services.RegionServiceLocator;
public class HarpiaClient {
public static void main(String[] args) throws RemoteException, ServiceException {
// obter o nome do pais para pesquisa
String nome = JOptionPane.showInputDialog(null, "Qual é o pais?", "Unido");
RegionServiceLocator locator = new RegionServiceLocator(); // localizando ...
Pais[] paises = locator.getRegion().find(nome); // procurando ...
for (int i = 0; i < paises.length; i++) { // exibindo
Pais pais = paises[i];
System.out.println("["+i+"] " + pais.getNome() + " | ID: " + pais.getId_pais());
}
// Simples assim
}
}
E para aqueles que ainda dizem por aí que tudo isso aqui é conversa fiada, se é que existe algum maluco pra dizer isto, tomaí! PHP consumindo o Web Service feito em Java.
<?
$client = new SoapClient(null, array('location' => 'http://localhost/Harpia/services/Region?wsdl',
'uri' => 'http://localhost/Harpia/services/Region?wsdl',
'trace' => '1'));
$result = $client->find('ale');
if( is_soap_fault($result) ){
echo "Ocorreu algum erro.<br/>";
}else{
print_r($result);
}
unset($client);
?>
Faça download dos fontes aqui.
That’s all.
AJAX: Nada novo, mas que muda tudo!
Resolvi escrever sobre AJAX porque vejo muita confusão ainda sobre o assunto, tem uma galera que não sabe exatamente o que é e, como se aplica e o que se ganha utilizando a técnica. Vou apenas demonstrar o mecanismo básico para funcionamento, não é um segredo, esse mesmo tutorial pode ser encontrado em milhares de sites na internet.
AJAX (Asynchronous JavaScript and XML) é uma técnica simples aplicada em ambiente de internet que utiliza apenas JavaScript e XML, possibilitando ao desenvolvedor criar funcionalidades mais ricas, daí o famoso RIA (Rich Internet Application). É possível usar AJAX em qualquer linguagem dinâmica de internet que suporte XML, como PHP, ASP, J2EE, .NET, etc. A diferença realmente está nos navegadores de internet, que utilizam o componente chave XMLHttpRequest cada um a sua maneira.
O processo é feito de maneira simples, o XMLHttpRequest faz uma chamada assíncrona por XML a uma outra página oculta aos olhos do usuário. Esta página oculta por sua vez devolve as informações processadas ao XMLHttpRequest, também via XML, e utilizando JavaScript é feito o parse do XML e exibido o resultado na página principal, que originou a chamada.
Para obter o XMLHttpRequest, eh comum a utilização deste bloco JavaScript
if( window.XMLHttpRequest ){ // Firefox, Safári, etc.
xmlReq= new XMLHttpRequest();
}else if( window.ActiveXObject ){ // Se for IE – ActiveX version
xmlReq = new ActiveXObject(“Microsoft.XMLHTTP”);
}
Existem outras maneiras para obter o componente, cada programador decide pelo mais conveniente, veja este outro exemplo:
try{
xmlReq = new ActiveXObject(“Microsoft.XMLHTTP”); // IE
}catch(e){ // Falhou, para os normais
xmlReq = new XMLHttpRequest();
}
Após obter o XMLHttpRequest, vamos fazer a comunicação com um XML e exibir seu conteúdo, e tudo isso usando apenas JavaScript.
// faz a chamada no servidor da página dinâmica, responsavel por devolver o XML response
// o primeiro parametro indica se a chamada será via GET ou POST
// o segundo informa qual é a página, e por último se será uma chamada assíncrona
xmlReq.open(“GET”, “http://localhost/ajax/response.php”, true);
xmlReq.onreadystatechange=function(){
if( xmlReq.readyState < 4 ){
// Enquanto é aguardado o retorno, pode-se exibir uma mensagem
}else{
if( xmlReq.readyState == 4 ){
// Aqui é colocado o processo de parser do XMLResponse.
}
}
}// end OnReadyStateChange
xmlReq.send(null); // transporte
Vejam que a primeira ação é chamar a página “oculta”, responsável por retornar o XML com os dados necessário.
O readyState indica qual o nível do processamento, esses são os estados: 1 – Sendo enviado; 2 – Processando; 3 – Armazenando e 4 – Pronto. É possível utilizar a propriedade status do XMLHttpResponse, esta por sua vez indica o status da página que foi chamada, ou seja, se ocorreu algum erro ou não.
That`s all! Simples não? É assim que funciona o famoso AJAX, nada mais além disso, os recursos de JavaScript são utilizados ao extremo. Atualmente existem recursos extremamente avançados e mais seguros que este exemplo, mesmo assim é válido o entendimento do mecanismo utilizado nesses frameworks e esclarecer o funcionamento do AJAX.
Você pode fazer aqui o download de um exemplo simples, porém muito útil em formulários de cadastro, onde três dropdowns (País, Estado e Cidade) interdependentes, que ao fazer o reload da página para carregá-los é muito cansativo. Vale ressaltar que utilizei PHP para a construção deste pequeno tutorial, acabando como mito de que AJAX está vinculado a Java/.Net.
Ambiente
PHP 5 e MySQL 5, rodando em Windows XP, IE 6 e 7 e Firefox 2.
Desafio
Talvez você tenha idéia melhores para aplicar o AJAX depois de entendê-lo e, eu não me surpreenderia com isto, então faço aqui um desafio para estimular o aprendizado: crie um Auto-Completar! Você é capaz?!






