Últimas Publicações

Cálculo de frete em PHP

Antes de usar o exemplo abaixo, entenda que o serviço disponibilizado pelo Correios é para utilização individual dos usuários do portal através do seguinte endereço http://www.correios.com.br/encomendas/precos/. Essa técnica simula a navegação de um usuário, isso torna a dica suscetível a qualquer alteração no sistema disponível atualmente.

Esta dica é de 2007 mas funciona bem até hoje!

Crie um arquivo.php com o código-fonte abaixo:

<?php 
 
/**
* Retorna dados relativos ao calculo de frete nos Correios/Brasil
*
* @param string $servico com os valores PAC, Sedex, Sedex10, SedexHoje, ESedex ou Malote
* @param integer $cepOrigem CEP de origem da encomenda
* @param integer $cepDestino CEP de destino da encomenda
* @param integer $peso Peso da encomenta em Kg
* @return array Resultado da operacao
*/
function consultar($servico, $cepOrigem, $cepDestino, $peso) {
	$arrServicos = array("pac" => 41106,
			"sedex" => 40010,
			"sedex10" => 40215,
			"sedexhoje" => 40290,
			"esedex" => 81019,
			"malote" => 44105);
	$cod_servico = $arrServicos[$servico];
 
	$url = "http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=&servico=$cod_servico&cepOrigem=$cepOrigem&cepDestino=$cepDestino&peso=$peso&MaoPropria=N&valorDeclarado=&avisoRecebimento=N";
	$html = file_get_contents($url);
 
	preg_match_all("/[\?\&]([\w]+)=([a-zA-Z0-9\.]+)/i", $html, $parts);
	for ($x = 0; $x < count($parts[1]); $x++) $resposta[$parts[1][$x]] = $parts[2][$x];
 
	return $resposta;
}
 
// Testando a funcao
echo '<html><body>Teste de cálculo de frete (<a href="http://www.baladao.com.br/blog/calculo-de-frete-em-php/">http://www.baladao.com.br/blog/calculo-de-frete-em-php/</a>):<br><pre>';
$resultado = consultar('sedex', '91350190', '90030130', '1');
print_r($resultado);
?>

Agora é só usar os valores retornados pelo array como quiser, lembrando que o resultado do cálculo no exemplo é o campo $resultado[Tarifa]. Veja aqui o resultado do teste.

abs.
Juliano

Reaproveitamento com Custom TagLibs Java

Suponhamos que você tenha criado um componente interessante para usabilidade da sua aplicação web e agora vai precisar reutilizá-lo em vários locais ou até mesmo em outros projetos. A maioria dos desenvolvedores nesse caso utilizaria o método include, porém na minha opinião essa não é a melhor forma de resolver o problema.

Para isso existem as TagLibs ou TagFiles em Java. Neste post apresentarei um exemplo completo de Custom TagLib que poderá servir de modelo para a criação dos seus próprios componentes.

1° passo - Criando uma Tag raiz personalizada (Custom Tag):

package org.myframework;
import java.io.IOException;
import javax.servlet.jsp.tagext.TagSupport;
 
/**
 * @author Juliano V. Baladão
 * @version 1.0
 *
 * Descrição: TagLib raiz.
 */
public class TagTestePai extends TagSupport {
    private String id = null;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int doStartTag() throws javax.servlet.jsp.JspException {
        StringBuffer sb = new StringBuffer();
        // Aqui voce podera inserir o codigo do seu componente
        sb.append("Start_Pai_" + this.getId() + "\n");
        try {
        	pageContext.getOut().write(sb.toString());
        } catch (IOException ioException) {
        	System.out.println("Error: TagTestePai.doStartTag() - "
        	+ ioException.getMessage());
        }
        return EVAL_BODY_INCLUDE;
    }
    public int doEndTag() throws javax.servlet.jsp.JspException {
        StringBuffer sb = new StringBuffer();
        // Aqui voce podera inserir o codigo do seu componente
        sb.append("End_Pai\n");
        try {
        	pageContext.getOut().write(sb.toString());
        } catch (IOException ioException) {
        	System.out.println("Error: TagTestePai.doEndTag() - "
        	+ ioException.getMessage());
        }
        this.release();
        return EVAL_PAGE;
    }
    public void release() {
        super.release();
        this.id = null;
    }
}

2° passo - Criando uma Tag filha:

package org.myframework;
import java.io.IOException;
import javax.servlet.jsp.tagext.TagSupport;
 
/**
 * @author Juliano V. Baladão
 * @version 1.0
 *
 * Descrição: TagLib filha.
 */
public class TagTesteFilho extends TagSupport {
    private String id = null;
    private TagTestePai parent = null;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int doStartTag() throws javax.servlet.jsp.JspException {
        StringBuffer sb = new StringBuffer();
        if (getParent() == null) {
	    	sb.append("Start_Filho_null\n");
        } else {
	    	// Aqui voce podera inserir o codigo do seu componente
        	TagTestePai pai = (TagTestePai) getParent();
        	sb.append("Start_Filho_" + this.getId() + "_De_"
        	+ pai.getId() + "\n");
        }
        try {
        	pageContext.getOut().write(sb.toString());
        } catch (IOException ioException) {
        	System.out.println("Error: TagTesteFilho.doStartTag() - "
        	+ ioException.getMessage());
        }
        return EVAL_BODY_INCLUDE;
    }
    public int doEndTag() throws javax.servlet.jsp.JspException {
        StringBuffer sb = new StringBuffer();
        if (this.parent == null) {
	    	sb.append("End_Filho_null\n");
        } else {
	    	// Aqui voce podera inserir o codigo do seu componente
        	TagTestePai pai = (TagTestePai) getParent();
        	sb.append("End_Filho_" + this.getId() "\n");
        }
        try {
        	pageContext.getOut().write(sb.toString());
        } catch (IOException ioException) {
        	System.out.println("Error: TagTesteFilho.doEndTag() - "
        	+ ioException.getMessage());
        }
        this.release();
        return EVAL_PAGE;
    }
    public void release() {
        super.release();
        this.id = null;
        this.parent = null;
    }
}

3° passo - Montando o arquivo MyFramework.tld (Tag Library Descriptor):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>
  <tlibversion>2.0</tlibversion>
  <jspversion>1.5</jspversion>
  <shortname></shortname>
  <uri>myFramework</uri>

  <tag>
    <name>testePai</name>
    <tagclass>org.myframework.TagTestePai</tagclass>
	<bodycontent>jsp</bodycontent>
    <attribute>
      <name>id</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

  <tag>
    <name>testeFilho</name>
    <tagclass>org.myframework.TagTesteFilho</tagclass>
    <attribute>
      <name>id</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

</taglib>

4° passo - Definindo o TLD no web.xml da seu projeto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_4.dtd">

<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <welcome-file-list>
  	<welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <taglib>
    <taglib-uri>myFramework</taglib-uri>
    <taglib-location>/WEB-INF/tld/MyFramework.tld</taglib-location>
  </taglib> 

</web-app>

5° passo - Insira as Tags criadas nas suas páginas JSP:

...
<%@ taglib uri="myFramework" prefix="my" %>
...
<my:testePai id="TagRaiz_A">
    <my:testeFilho id="SubTag_1" />
    <my:testeFilho id="SubTag_2" />
    <my:testeFilho id="SubTag_3" />
</my:testePai>
...

Em breve colocarei este exemplo para download aqui…

abs.
Juliano

Compactação de campos LONGTEXT/BLOB no MySQL.

Dica rápida para economizar espaço em disco em campos LONGTEXT/BLOB do MySQL, existem duas funções que fazem a compactação e descompactação de campos diretamente na sua query: COMPRESS e UNCOMPRESS.

Para inserir um registro compactando o campo “texto” utilize a função COMPRESS conforme o exemplo abaixo:

INSERT INTO tabela (id, chamada, texto) 
VALUES ('215', 'Artigo X', COMPRESS('TEXTO LONGO...'));

Depois para carregar os dados descompactados basta fazer o seguinte:

SELECT id, chamado, UNCOMPRESS(texto) AS texto FROM tabela WHERE id = '215';

Ambas as funções podem ser usadas no UPDATE. O exemplo abaixo descompacta o conteúdo do campo “texto” definitivamente.

UPDATE chamado SET texto = UNCOMPRESS(texto) WHERE id = '215';

Um conselho, faça a experiência em uma área de testes e avalie a performance do seu sistema com essa mudança. Tenho certeza que isso irá reduzir drasticamente o espaço em disco utilizado pela seu banco de dados, mas por outro lado você deve perder um pouco de performance sobrecarregando o processador. Verifique os recursos disponíveis em seu servidor para então decidir se é uma boa solução para o seu caso.

Importante!

Se você grava arquivos já compactados neste campo, como imagens no formato JPG, aconselho não utilizar essa técnica, pois a economia de espaço em disco não será considerável.

abs.
Juliano

Momento de nostalgia.

Não sei se é motivo de orgulho ou vergonha, mas em 2001 postei um pequeno artigo na iMasters sobre Interbase:

http://imasters.uol.com.br/noticia/60/interbase/introducao_ao_interbase/

Obs.: É raro ver um portal com uma base de dados tão antiga intacta, parabéns iMasters.

Desenvolvimento Ágil com Scrum

Se você é líder de uma equipe de desenvolvimento pequena (no máximo 10 pessoas), com certeza já deve ter passado por momentos de pressão onde o acúmulo de atividades e a expectativa do(s) cliente(s) parecem soterrar a todos. Nesses casos você pensa: - Assim não dá! Precisamos ampliar a equipe. Contudo, antes de inflar seu quadro de funcionários, considere a possibilidade de implantar um método ágil de desenvolvimento como o Scrum, pode ser a solução dos seus problemas :)

Ultimamente algumas pessoas me perguntaram sobre o Scrum e ocorreu-me a idéia de escrever um resumo do método aqui. No entanto, quando fiz uma pesquisa na web encontrei ótimas referências sobre o assunto então, ao invés de fazer uma releitura, indicarei o blog do Alexandre Magno.

Em breve pretendo escrever sobre algumas experiências, boas e ruins, com desenvolvimento ágil vivenciadas pela nossa equipe.

abs.
Juliano

Merecido começo novo!

É incrível como a Internet mudou nos últimos anos, lembro que em 1997, ter uma conta no Geocities com uma tela dizendo “Bem vindo a minha Home Page!” exibindo um GIF animado em 3D apontando para o seu e-mail pessoal era considerado uma grande conquista (nerd)! Hoje em dia isso é roteiro de conversa de bar com os amigos para descontrair, quem sabe qualquer hora dessas escrevo um texto contando todas estas peripécias do século passado… Vai ser divertido ler os comentários do pessoal que também começou naquela época.

Uma década e alguns anos depois, ter um website exige um investimento muito maior em todos os sentidos, e hoje começa minha luta para contrariar o velho ditado “casa de ferreiro, espeto de pau”. Quando nos dedicamos integralmente a uma empresa, o sonho de ter um site profissional/pessoal fica sempre em segundo plano. Desenvolver um site do zero é um esforço que merece um retorno financeiro, porém eu nunca gostei da idéia de gastar horas livres trabalhando por permuta para mim mesmo (caramba). Mas agora tudo mudou, existem vários CMS (gerenciadores de conteúdo) de ótima qualidade, e depois de avaliar alguns o grande escolhido foi o Wordpress.