Archive for the ‘Programação’ Category.

Apresentando o BPEL com o Adapter File

A solução da Oracle para o conceito de arquitetura de serviços SOA, conhecida como Oracle SOA Suite disponibiliza um pacote com diversos recursos para organização, orquestração, segurança e integração. Para este último posso destacar o Business Process Execution Language, BPEL, que integrado ao JDeveloper é uma excelente ferramenta de trabalho, fácil, simples e com alguns recursos (adapters) pré-compilados que auxiliam o desenvolvimento.

O BPEL é uma linguagem descrita em XML que básicamente é utilizada para desenhar processo de negócio seguindo como base o BPM, destaca-se pela simplicidade da criação de um processo e pela amigável interface, proporcionando uma sensação agradável no momento do design. O utilizador de BPEL não necessita de conhecimentos em linguagem de programação, porém, o programador poderá obter mais recursos da ferramenta.

Para apresentar o BPEL escolhi algo um pouco mais além do famoso “Hello Word”, vamos trabalhar em um cenário de integração de softwares, aonde o legado irá disponibilizar um arquivo TXT no padrão CVS posicional diáriamente, o processo deverá interpretar o conteúdo deste arquivo e gravar no banco.

Pré-Requisitos

JDeveloper 10.1.3.4 (com suporte a SOA).

SOA Suite 10.1.3.1.0 (Com Windows Vista, talvez vc tenha problemas, baixe o patch).

MySQL.

Parte 1 – Criando o Projeto

Crie um projeto do tipo BPEL Project em File -> New -> Projects -> BPEL Process Project (certifique-se de que está filtrando por todas as tecnologias). Em seguida, dê um nome ao projeto e na opção template opte por Empty BPEL Process.

proj02 - New Project 2

Parte 2 – Usando o Adapter File

O Adapter File é um recurso do BPEL para manipulação de arquivos, oferece três opções Leitura, Escrita e Sincronização (Read, Writer e Synchronous Read), além dele existe o Adapter FTP (autoexplicativo), porém iremos falar sobre ele depois. Continuando com nosso projeto, vamos utiliza a opção Read para o arquivo texto que estará disponível no diretório c:\interface_dir, haverá um pooling a cada 1 minuto, obviamente que isto é apenas para testes você deve adequar o intervalo de tempo de acordo com sua necessidade, veja a seguir o passo-a-passo do Adapter File.

Veja aqui os screenshot do passo-a-passo para configurar o File Adapter.

Até este passo fizemos apenas configurações básicas da funcionalidade do Adapter, porém, agora é necessário definir um o mapeamento das colunas posicional (fixo), utililzando um Schema XSD, veja a seguir como é simples:

Screenshots para criar o Schema XSD.

Parte 3 – Criando o Adapter Database

Crie um banco de dados no MySQL ou em qualquer outro SGDB, em seguida crie a tabela pais que irá receber os dados contidos no arquivo texto. Antes de utilizar o Adapter Database certifique-se que sua conexão com o banco está feita pelo JDeveloper, ela será necessária para os passos a seguir, portando vá até a aba Connection, se não existir crie-a.

Connection

Com a tabela criada e a conexão feita, agora vamos utilizar o componente Database Adapter que será o responsável por executar instruções SQL. Os passos aqui são tão simples quanto a criação da conexão, porém, é importante destacar que no Passo 4 escolha a opção Execute Custom SQL, e no quinto e último passo coloque a instrução de inserção da tabela pais, não se preocupe com o XSD ele será criado automáticamente, veja como fica:

Custom SQL

Passo 4 – While e Variáveis

Para cada campo do arquivo TXT, mapeado pelo Schema XSD, devemos criar uma variável que irá armazenar o valor dos campos, então vá até a aba Structure e crie as variáveis.

Variaveis - 01

Variaveis - 02

Depois de todas as variáveis criadas precisamos associa-las aos campos do XSD e inicializa-las, mas para isto devo esclarecer uma coisa, sabemos que o arquivo texto poderá ter uma ou mais linhas de registro, portanto é necessária uma instrução de repetição. Utilizaremos o componente WHILE, a partir de uma variável contadora (índice).

diagram_01

O While cria um novo escopo aonde devemos arrastar os componentes de assinatura das variáveis e chamada da procedure, ou seja, para cada registro iremos fazer a inicialização da variáveis e a chamada da procedure para gravar no banco de dados, finalizando o nosso processo BPEL.

diagram_02

O processo é simples mas o dominio do ambiente BPEL é excencial, saber criar as variáveis, inicializá-las, passagem de valores, etc. Abaixo está disponível o fonte do projeto criado no JDeveloper.

Clique aqui para baixar o fonte.

Conhecendo a API do Twitter

Incentivado por este post do Blog do Élcio que demonstrou a utilização da API do Twitter no ubuntu de uma maneira muito fácil e simples, então procurei saber um pouco mais sobre ela.

Existem algumas bibliotecas prontas para diversas linguagens, escolhi pela Twitter4j antes de mexer na API do Twitter mesmo, e não me arrependi com algumas poucas linhas de código é possível atualizar seu status e até receber as últimas atualizações, veja como é simples.


import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class Twittando {

public static void main(String[] args) {
// usuário e senha do twitter
String usr = "lucianosilva";
String pwd = "ABCDEFGHIJKL";

try {

Twitter twitter = new Twitter(usr, pwd);
// atualizando o status do twitter
Status status   = twitter.update("Twitter4J, muuito fácil de usar, recomendo!");
System.out.println("Result: " + status.getText() );

} catch (TwitterException e) {
e.printStackTrace();
}
}
}

Não esqueça de fazer o download da biblioteca Twitter4j aqui. E se você for uma pessoa “caprichosa” assim como o Elcio, criaria um UPBox, mas… no meu caso fiz um exemplo mais simples para demonstrar a lista de updates, veja o scriptlet:


<style type="text/css">
#box{
font-family:tahoma,arial;
font-size:10px;
border:1px #000000 solid;
background-color:#ffffff;
width: 300px;
height: 400px;
overflow: auto;
}
</style>
...
<div id="box">
<%
Twitter twitter = new Twitter();
twitter.setUserId("lucianosilva");
twitter.setPassword("ABCDEFGHIJKL");

ArrayList<status> listUpdates = (ArrayList<status>) twitter.getFriendsTimeline();
for(Status status : listUpdates){
User user = status.getUser();
%>
<p><img src="<%= user.getProfileImageURL() %>" border=2/>
&amp;amp;amp;amp;nbsp;:&amp;amp;amp;amp;nbsp;<%= status.getText() %></p>
<%
}// for each end
%>
</div>

Bacana né? Divirta-se.

Combinando APIs GeoLite City com Google Maps

Hello there!

Maravilha, eu só tinha o IP e então conseguiu saber o País daquele endereço de IP, não satisfeito consegui mais dados sobre ele, então surgiu o Estado, Cidade, Latitude e Longitude, e talvez o CEP, o Código de Área internacional, quem sabe?

É mais uma vez eu não estou satisfeito e agora vou fazer com que estes dados sejam exibidos no mapa, usando o Google Maps API. =) E provarei que é tão fácil quanto foram os outros exemplos.

Nós já sabemos o que ter em “mãos” para API GeoLite.

arquivos-geolitecity

Já para utilizar o Google Maps API você deve obter uma chave que permitirá fazer as consultas, veja mais aqui. O código descrito abaixo exibira uma mapa simples com alguns markets-point, mas é possível demonstrar o mapa de diversas maneiras, sabia mais.


<?php
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);

echo $vIP;

// obtem o registro do
$record  = geoip_record_by_addr($giCity, $vIP);
?>

Perceba que no JavaScript abaixo a url do maps solicita através do parâmetro key o código gerado para sua conta, eu substitui o valor por <COLOQUE-SUA-KEY-AQUI>.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<!---// Mude o Key //-->
<script src="http://maps.google.com/maps?file=api&amp;amp;amp;amp;amp;amp;v=2&amp;amp;amp;amp;amp;amp;key=<coloque-SUA-KEY-AQUI>"
type="text/javascript"></script>
<script type="text/javascript">

function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("mapaGeoIP"));

// ---
// Aqui informamos a Latitude e Longitude do IP
//
map.setCenter(new GLatLng(<?= $record->latitude ?>, <?= $record->longitude ?>), 13);

// Adicionado 10 lugares (markets) randômicos próximo a localidade
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var i = 0; i < 15; i++) {
var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan * Math.random());
map.addOverlay(new GMarker(point));
}
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="mapaGeoIP" style="width: 600px; height: 400px"></div>
</body>
</html>

google_maps1

Este é um exercício muito interessante, veja que legal alterando o endereço de IP, para isto vá ao prompt de comando no Windows e digite, por exemplo:

ping bb.com
ping google.com
ping cnn.com

Namastê.

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:

arquivos-geolitecity

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ê.