Archive for dezembro \28\-02:00 2011

Java Tips: Preload de Imagens usando ImageIcon

Posted on dezembro 28, 2011. Filed under: Java, Tips |

Fazer preload de imagens no Java pode parecer um tanto complicado, porém é mais simples do que você imagina, ainda mais usando a classe ImageIcon. Para começar, vamos responder a pergunta: Em quais momentos você precisa que imagens sejam totalmente carregadas antes de continuar um determinado processo ? Tive essa situação no desenvolvimento de um Applet no qual deve carregar imagens que estão disponíveis na Internet.

O construtor da classe ImageIcon aceita um objeto do tipo URL como parâmetro. Você pode especificar uma URL onde esta localizada a imagem desejada. Internamente, na classe ImageIcon, é realizado o preload da imagem usando MediaTracker. Dessa forma é possível monitorar o status de loading desta imagem.

Segue abaixo exemplo de como usar o ImageIcon para carregar uma imagem em uma URL e somente continuar após a imagem ter sido carregada:

        try {
            ImageIcon image = new ImageIcon(new URL("http://www.exemplo.com.br/imagem.png"));
            
            //manter o loop enquanto a imagem estiver sendo carregada
            while(image.getImageLoadStatus() == MediaTracker.LOADING);
        
            //neste momento a imagem já foi totalmente carregada
            
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }

Os possíveis status do MediaTracker são: LOADING (Carregando), COMPLETE (Totalmente carregada), ERRORED (Erro ao carregar), ABORTED (Cancelada).

Você pode obter a imagem em um objeto do tipo Image facilmente:

Image img = image.getImage();
Ler Post Completo | Make a Comment ( None so far )

Webservices com Zend Framework parte I

Posted on dezembro 26, 2011. Filed under: PHP, Zend Framework |

Veja versão deste artigo usando Zend Framework 2:
Webservices SOAP com Zend Framework 2

Introdução

Neste artigo vamos abordar a criação e utilização de webservices SOAP usando Zend Framework. Procurei dividir este artigo em 3 posts. Primeiro post vamos abordar o protocolo SOAP, no segundo post vamos abordar o protocolo REST e no terceiro post iremos abordar algumas das principais APIs de comunicação através de webservices implementados pelo Zend Framework.

SOAP

SOAP é um protcolo escrito em XML para comunicação entre diferentes aplicações. A comunicação entre serviços usando SOAP é realizada em cima da camada HTTP. SOAP pode ser implemetando em qualquer linguagem (PHP, Java, ASP, .NET, etc.). Dessa forma criamos um canal de comunicação entre aplicações desenvolvidas em linguagens e plataformas diferentes.

Devido a comunicação do SOAP estar em cima da camada HTTP evita que a comunicação seja bloqueada por um firewall ou proxy pois o protocolo HTTP é liberado nas maioria das vezes.

Para que um cliente SOAP acesse um serviço é necessário requisitar primeiramente um arquivo denominado WSDL (Web Services Description Language). O arquivo WSDL especifica todas as funções disponíveis pelo webservice, os tipos de dados dos parâmetros entre outras informações relevantes. Quando criarmos nossos próprios webservices teremos que disponibilizar também um arquivo WSDL.

Zend Framework

O Zend Framework fornece ferramentas importantes para trabalhar com Webservices. Através do componente Zend_Soap_Client podemos consumir Webservices e com o componente Zend_Soap_Server podemos criar nossos próprios webservices de maneira simples e eficaz. Neste artigo vamos demonstar a utilização desses dois componentes. Vamos criar nossos próprios webservices e depois como consumí-los.

Criando nosso Webservice SOAP

Para criação do webservice em SOAP vamos utilizar a classe Zend_Soap_Server. Para que funcione corretamente nosso webservice, precisamos disponibilizar o arquivo WSDL. Apesar de ser possível trabalhar com SOAP sem a utilização de um arquivo WSDL, conhecido como modo não WSDL (non-WSDL mode), onde no PHP é possível, porém não aconselhado. A maioria das linguagens de programação exigem a utilização de um arquivo WSDL.

O código abaixo é responsável pela criação de nosso webservice. Vamos disponibilizar os métodos soma e subtrai através da classe Calculadora:

<?php 
/* incluir as classes necessoarias */ 
require_once("Zend/Soap/Server.php"); 
require_once("Zend/Soap/AutoDiscover.php"); 

if(isset($_GET['wsdl'])) {         
        /*          
         * Usar o Soap AutoDiscover para criacao do WSDL de forma dinamica          
         */         
        $autodiscover = new Zend_Soap_AutoDiscover();         
        $autodiscover->setClass('Calculadora');
        $autodiscover->handle();
} else {
        // Disponibilizar o webservice atraves do canal:
        $soap = new Zend_Soap_Server("http://127.0.0.1/soap/soap.php?wsdl");
        $soap->setClass('Calculadora');
        $soap->handle();
}

/*
 * Classe calculadora
 */
class Calculadora {

        /**
         * Realiza Soma
         * @param integer $a
         * @param integer $b
         * @return integer
         */
        public function soma($a, $b) {
                return $a + $b;
        }

        /**
         * Realiza Subtracao
         * @param integer $a
         * @param integer $b
         * @return integer
         */
        public function subtrai($a, $b) {
                return $a - $b;
        }
}

Pontos interssantes à observar no webservice acima:

  • Zend_Soap_AutoDiscover é responsável pela criação dinâmica do WSDL, poupando nosso tempo de ter que criar o WSDL na mão, que é muito trabalhoso.
  • Os blocos de comentário na classe Calculadora ajudam o AutoDiscover na criação do WSDL.

Criando o cliente

Vamos criar um webservice client que irá consumir nosso webservice criado anteriormente:

<?php 
/* incluir classes necessarias */ 
require_once("Zend/Soap/Client.php"); 

/* canal de chamada para webservice */ 
$soap = new Zend_Soap_Client("http://127.0.0.1/soap/soap.php?wsdl"); 

echo $soap->soma(11, 2) . PHP_EOL; // imprime 3
echo $soap->subtrai(11, 2) . PHP_EOL; //imprime 9

Até o próximo. Sucesso!

Ler Post Completo | Make a Comment ( 36 so far )

Java Tips: Passando tipos primitivos por referência

Posted on dezembro 22, 2011. Filed under: Java, Tips |

Por padrão no Java os tipos primitivos (int,long,double,etc..) são passados por valor e não por referência. Portanto caso você altere o valor de um tipo primitivo dentro de um método, essa mudança não será visível fora da chamada do método. Por exemplo:

public void atualizaContador(int contador) {
		contador++;
}

int contador = 0;
atualizaContador(contador);

//contador agora = 0

Existem várias formas de contornar essa situação e obter o resultado desejado, como por exemplo, a criação de uma classe auxiliar… Porém uma maneira bem simples de resolver é criar um array com um único elemento. Arrays de tipos primitivos em java são passados como referência e não por valor:

public void atualizaContador(int[] contador) {
		contador[0]++;
}

int[] contador = new int[1];
contador[0] = 0;
atualizaContador(contador);

//contador[0] agora = 1
Ler Post Completo | Make a Comment ( None so far )

Java Tips: Usando JList

Posted on dezembro 20, 2011. Filed under: Java, Tips |

Neste POST reuni várias dicas relacionadas ao componente JList do Java. São dicas úteis que me ajudaram a criar funcionalidades importantes em uma aplicação que estou desenvolvendo. Tive que pesquisar várias fontes para descobrir todas essas dicas, portanto resolvi reuni-las em um único lugar para ajudar outros desenvolvedores.

Criando JList básico com alguns itens:

DefaultListModel model = new DefaultListModel();
JList list = new JList(model);

model.add(0, "item 1");
model.add(1, "item 2");
model.add(2, "item 3");

Adicionando dados no final do JList de forma dinâmica:

DefaultListModel model = (DefaultListModel) list.getModel();
model.add(model.getSize(), "item final");

Adicionando dados no começo do JList de forma dinâmica:

DefaultListModel model = (DefaultListModel) list.getModel();
model.add(0, "item começo");

Inserindo scroll para o JList:

DefaultListModel model = new DefaultListModel();
JList list = new JList(model);

// adicionar dados no list
// ..
//scroll
JScrollPane jscroll = new JScrollPane(list);

Enviando scroll para o final automaticamente:

DefaultListModel model = new DefaultListModel();
JList list = new JList(model);

// adicionar dados no list
// ..
//scroll
JScrollPane jscroll = new JScrollPane(list);

jscroll.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
	public void adjustmentValueChanged(AdjustmentEvent e) {  
	     e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
}});

Limpando itens do JList:

// limpando todo o Jlist
list.setModel(new DefaultListModel());

// limpando todo o JList de outra forma
DefaultListModel model = (DefaultListModel) list.getModel();
model.clear();

// removendo o segundo item do list
mode.remove(1);

// removendo o ultimo item do list
int pos = model.getSize() - 1;
if (pos >= 0) {
    model.remove(pos);
}

Substituíndo itens:

DefaultListModel model = (DefaultListModel) list.getModel();
model.set(0, "Reescrevendo o primeiro item do list");

Selecionando itens no List:

// selecionando o primeiro item
list.setSelectedIndex(0);

// selecionando o ultimo item do list
DefaultListModel model = (DefaultListModel) list.getModel();
list.setSelectedIndex(model.getSize() - 1);

//limpando seleções
list.clearSelection();

Obtendo índices selecinados

// retorna o indice do primeiro item selecioando na lista
int index = list.getSelectedIndex();

// retorna array contendo todos os indices selecionados na lista
int[] indexes = list.getSelectedIndices();
Ler Post Completo | Make a Comment ( 2 so far )

Palestra no CISL dia 8/12

Posted on dezembro 5, 2011. Filed under: Uncategorized |

Próximo dia 8 de Dezembro, quinta-feira, irei apresentar mais uma palestra técnica no CISL (Comitê de Implementação de Software Livre). O tema da palestra será Tuning Apache/MySQL e PHP para Desenvolvedores. Abaixo mais detalhes sobre a palestra.

“A palestra será transmitida a partir do auditório do Serpro da regional São Paulo, para acompanhar é possível comparecer presencialmente no local da palestra, ou então acompanhar por vídeo streaming livre do Serpro”.

Para maiores informações acessar:
http://www.softwarelivre.gov.br/eventos/tuning-apache-mysql-e-php-para-desenvolvedores/

Detalhes da Palestra:

Tuning Apache/MySQL/PHP para Desenvolvedores

  • Introdução
  • Apache
    • AllowOverride
    • ExtendedStatus
    • SymLinks
    • KeepAlive
    • MaxClients
  • MySQL
    • Monitorando consultas lentas
    • max_connections
    • query_cache_size
    • thread_cache_size
  • PHP
    • Identificando gargalos
    • memcached
    • Aceleradores de código
    • APC (Alternative PHP Cache)
    • Caching com Zend_Cache
    • Computação em Nuvem
Ler Post Completo | Make a Comment ( None so far )

Tips: Zend_Http_Client

Posted on dezembro 3, 2011. Filed under: PHP, Tips, Zend Framework |

O componente Zend_Http_Client distribuído junto com o Zend Framework é uma ótima opção para você que precisa desenvolver programas automatizados na web. Robôs que capturam informações de páginas na web, uma técnica conhecida como web scraping, é extremamente útil em diversas situações, substituindo um esforço que teria que ser feito manualmente.

Este componente funciona como um cliente do protocolo HTTP. Útil para manipular requisições (POST, GET, PUT, etc.), fazer upload e download de arquivos, autenticação em proxies e manipulação de cookies. É uma ótima alternativa em relação à extensão libcurl para PHP. Menos esforço e deixa o código mais limpo.

Abaixo vamos alguns exemplos úteis do Zend_Http_Client. Perceba que ele pode ser usado independente do framework MVC.

  • Neste exemplo, estamos fazendo uma requisição GET simples, obtendo o corpo da resposta e imprimindo na tela. Setando um timeout de 120 segundos e dizendo para não seguir redirecionamentos.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos e nao seguir redirects
$client->setConfig(array('timeout' => 120, 'max_redirects' => 0));

// define a URL da requisicao
$client->setUri("http://www.google.com");

// realiza uma requisicao GET
$response = $client->request('GET');

// imprime a resposta da requisicao
echo $response->getBody();
  • No próximo exemplo temos um script que realiza um POST em uma página de login, autenticando no site e exibindo o conteúdo da resposta da página logada.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos 
$client->setConfig(array('timeout' => 120));

// define a URL da requisicao
$client->setUri("http://localhost/examples/login.php");

// define os parametros de POST, usuario e senha
$client->setParameterPost(array(
        'usuario' => 'douglas',
        'senha' => 'pass123',
));

// realiza uma requisicao POST
$response = $client->request('POST');

// imprime o corpo da pagina apos login
echo $response->getBody();
  • Neste exemplo, primeiramente estamos fazendo login em um site, e sequencialmente navegando em páginas internas que são disponíveis somente para usuários logados. Para que seja possível isso no Zend_Http_Client você tem que informá-lo para manter a sessão ativa através do método setCookieJar.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos 
$client->setConfig(array('timeout' => 120));

// define a URL da requisicao
$client->setUri("http://localhost/examples/login.php");

// seta para que o cliente HTTP mantenha a sessao ativa
$client->setCookieJar();

// define os parametros de POST
$client->setParameterPost(array(
        'usuario' => 'douglas',
        'senha' => 'pass123',
));

// realiza login
$client->request('POST');

// acessando paginas restritas
$client->setUri("http://localhost/examples/interno.php");
$response = $client->request('GET');
echo $response->getBody();

// acessando paginas restritas
$client->setUri("http://localhost/examples/interno1.php");
$response = $client->request('GET');
echo $response->getBody();
  • Próximo exemplo, estamos fazendo o download de um arquivo pdf e salvando em disco de forma simples.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos
$client->setConfig(array('timeout' => 120));

// define a URL do arquivo para download
$client->setUri("http://localhost/examples/arquivo.pdf");

// realiza a requisicao
$response = $client->request('GET');

// salva o conteudo do arquivo no disco local
file_put_contents("arquivo.pdf", $response->getBody());
  • Próximo exemplo, estamos fazendo o download de um arquivo pdf através de stream. Ideal para arquivos muito grandes. Dessa forma, não precisamos armazenar todo o conteúdo do arquivo em memória.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos 
$client->setConfig(array('timeout' => 120));

// define a URL do arquivo para download
$client->setUri("http://localhost/examples/arquivo.pdf");

// faz o download do arquivo via stream
$client->setStream("arquivo.pdf")->request('GET');
  • Próximo exemplo, realizamos o upload simples de um arquivo.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos 
$client->setConfig(array('timeout' => 120));

// define a URL onde sera realizado o upload
$client->setUri("http://localhost/examples/upload.php");

// define o arquivo que sera enviado.
// O segundo parametro seria equivalente ao nome do campo input file
$client->setFileUpload("arquivo.pdf", "arquivo");

// efetiva o upload
$client->request('POST');
  • Próximo exemplo, utilizamos as requisições http através de um proxy.
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// configuracoes para utilizar proxy
$client->setConfig(array(
        'adapter' => 'Zend_Http_Client_Adapter_Proxy',
        'proxy_host' => '192.168.0.254',
        'proxy_port' => 8080,
        'proxy_user' => 'douglas',
        'proxy_pass' => 'senha123',
        'sslusecontext' => false,
));

// define a URL da requisicao
$client->setUri("http://www.google.com");

// realiza uma requisicao GET
$response = $client->request('GET');

// imprime a resposta da requisicao
echo $response->getBody();
  • Próximo exemplo, fazemos uma requisição utilizando autenticação HTTP (Basic).
<?php
require_once("Zend/Http/Client.php");

$client = new Zend_Http_Client();

// define algumas configuracoes:
// timeout de 120 segundos
$client->setConfig(array('timeout' => 120));

// usuario senha para autenticacao http
$client->setAuth('douglas', 'senha123');

// define a URL da requisicao
$client->setUri("http://localhost/admin");

// realiza uma requisicao GET
$response = $client->request('GET');

// imprime a resposta da requisicao
echo $response->getBody();

Procurei neste post fornecer diversos scripts que realizam tarefas diversas de forma simples. Scripts prontos para uso, para que você possa usar como base em seus programas. Espero que aproveitem.

Ler Post Completo | Make a Comment ( 2 so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: