quinta-feira, 13 de maio de 2010

Manipulando imagens em Java

Para manipular imagens em Java, existem uma API: a Java Advanced Imaging (JAI). Ela é bem joinha e bem fácil de mexer.

Eu precisei, pra um relatório, dados vários resultados numéricos criar vários gráficos. Todos eles foram criados com o JFreeChart exceto um. O que eu usei JAI é uma figura que precisava ser semelhante ao Input Number Slider (componente do RichFaces), já que o Sun UI Visual não sei o quê do Netbeans não tem um componente parecido.
Pra gerar a figura que representa o slider, eu calculei o tamanho da margem esquerda que o meu slider (o losango cinza) deveria estar e unia esta imagem à imagem base pra gerar coisas no estilo:

Segue a classe teste que eu gerei:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ImageCombiner {
public static void main(String[] args) {
try {
BufferedImage img1 = ImageIO.read(
new File("perfilRiscoImagemBase.jpg"));
BufferedImage img2 = ImageIO.read(new File("pontoImagemBase.jpg"));
BufferedImage ponto = ImageIO.read(new File("ponto.jpg"));
// calculo de onde colocar o ponto
Double valor, posicao;

for (valor = new Double(1); valor <= 4; valor += 1) {
// gerando a figura do ponto
BufferedImage figuraPonto = new BufferedImage(img2.getWidth(),
img2.getHeight(), BufferedImage.TYPE_INT_RGB);

Graphics g1 = figuraPonto.getGraphics();
g1.drawImage(img2, 0, 0, null);
posicao = (((valor - 1) * 532) / 3) + 8;

if (valor < 3) {
posicao += valor;
} else if (valor >= 3 && valor < 4) {
posicao += new Double(2);
}
System.out.println("posicao; " + posicao);

// posicionando o ponto
g1.drawImage(ponto, posicao.intValue(), 0, null);
// gerando a figura final
BufferedImage combined = new BufferedImage(img1.getWidth(),
img1.getHeight(), BufferedImage.TYPE_INT_RGB);

Graphics g = combined.getGraphics();
g.drawImage(img1, 0, 0, null);
g.drawImage(figuraPonto, 0, 0, null);
g.dispose();
String fileName = "resultado" + valor.doubleValue() + ".png";
File file = new File(fileName);
ImageIO.write(combined, "png", file);
}
} catch (Exception w) {
w.printStackTrace();
}
}
}

segunda-feira, 10 de maio de 2010

O que ficou d'A Liga ou esse é o meu disk chocolate

A Band lançou um novo programa terça-feira passada: A Liga. A idéia é mostrar a realidade de uma certa situação do ponto de vista de quem vive nela. O lançamento girou sobre o tema morador de rua. De boa, pra mim, não mostrou nada do que eu não soubesse. A diferença é que eu não preciso passar pelo que os moradores de rua passam. Uma coisa que me chateia nesse tipo de programa é que ele apenas expõe o problema colocando questões muito pertinentes que caibam na situação retratada, mas não te dá nenhuma dica de como colaborar pra tentar melhorar o que já está.

Ao terminar o programa, eu fiquei pensando sobre o dar ou não esmola, dar ou não comida pra alguém que te pede na rua. E os pensamentos, aos poucos, foram indo, indo, indo até que cheguei na seguinte conclusão: o problema de discrepância social está e é tão enraizado na sociedade que simplesmente não existe solução.

Explico: desde lá do tempo do Jesus, descrito na Briba, desde lá se fala que os reis que tinham tudo e o povo que tinha nada e que a renda não era distribuída corretamente. E talvez até desde antes disso. Não tenho muito conhecimento histórico pra comprovar que, talvez, se a Igreja Católica não tivesse realizado as Cruzadas, hoje a história seria diferente. A história da humanidade já começou subvertida e o passar do tempo fez com que a coisa descambasse cada vez mais. Dentro do meu pensamento a única solução viável que apareceu seria começar tudo de novo, mas acho meio difícil.

Com certeza, várias pessoas falarão que tal ONG conseguiu esse resultado, a outra ONG conseguiu aquele resultado. E eu não estou aqui pra tirar esse mérito dessas ONG. Mas o que elas fazem, infelizmente, não é solução. É remendo pra um problema que não tem solução. Não vai ser Bolsa Família, não vai ser PAC, não vai ser a maravilhosa notícia de que o Brasil é o país número um em investir corretamente o dinheiro público que vai brotar uma solução.

Porque eu acredito que você só passa para a próxima geração aquilo que você conhece.

Conhecer: v.t. Transitivo. Ter conhecimento de; fazer ideia ou ter noção de; ter relações com alguém; ter visto ou visitado;saber; avaliar; apreciar.

Em uma das missões do programa, uma das repórteres estava com um bando de moleques no Rio de Janeiro. Moleques que não tiveram carinho, atenção, respeito e dignidade dos pais. Moleques que preferiam estar na rua do que estar em casa. Moleques que eventualmente vão conhecer sexo, sexo vai ser sem proteção, sexo que pode gerar outro rebento como eles, rebento que será mais um. Existem exceções? Existem, a reportagem mostra um casal que buscam sua dignidade dentro do que eles têm, o moleque fotógrafo do Cidade de Deus também, mas eles não são a regra.

Porque eu acredito que existe um aspecto que jamais será alterado na humanidade: a índole.


Índole: s.f. Propensão natural, disposição, inclinação. Gênio, caráter, temperamento.

sexta-feira, 7 de maio de 2010

Trocando o path de aplicações no Tomcat

Achei esse post aqui para saber como trocar o path principal de aplicações do Tomcat pra direcionar direto pra minha aplicação.

De qualquer forma, a dica está aqui:

  1. Procure por  <Context path="" docBase="ROOT" /> e troque por <Context path="" docBase="NEW_FOLDER_NAME" >. Se não tiver, coloca a linha apontando direto pra sua aplicação. A linha precisa estar dentro da tag <host>(que fica dentro da tag <engine>).

  2. Pare o Tomcat

  3. Delete os arquivos em work\Catalina\localhost

  4. Starte o Tomcat


ps. coloca o Context dentro do server.xml.

quarta-feira, 5 de maio de 2010

Unindo dois (ou mais) .jasper para obtenção de apenas um relatório

Enfrentei o problema de ter um relatório muito grande para ser gerado usando JasperReport. Nem com subrelatórios o maldito era gerado. Cheguei à conclusão que o iReport não funciona legal com relatórios cuja base é extensa (e depois encontrei alguns posts pela internet falando que a quebra de página do iReport/Jasper não funciona corretamente).

A solução que encontrei foi fazer dois arquivos .jasper diferentes que, juntos, compunham meu relatório. O problema na sequência foi unir esses dois .jasper para a obtenção de um único relatório. Segue minha solução fortemente baseada nesse post do GUJ:
public void imprimirRelatorio() {

ExternalContext econtext = getExternalContext();
InputStream stream;

List j = new ArrayList();

try {
Map params = new HashMap(); // preenche os parâmetros do relatório 1
stream =
econtext.getResourceAsStream("/WEB-INF/reports/rel1.jasper");
j.add(JasperFillManager.fillReport(stream, params));

params = new HashMap(); // preenche os parâmetros do relatório 2
stream =
econtext.getResourceAsStream("/WEB-INF/reports/rel2.jasper");
j.add(JasperFillManager.fillReport(stream, params));

JRPdfExporter exporter = new JRPdfExporter();
HttpServletResponse response =
(HttpServletResponse) econtext.getResponse();
FacesContext fcontext = FacesContext.getCurrentInstance();
ByteArrayOutputStream retorno = new ByteArrayOutputStream();

exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, j);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, retorno);
exporter.setParameter
(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS,
Boolean.TRUE);
exporter.exportReport();

byte[] retornoArray = retorno.toByteArray();

response.setContentType("application/pdf");
response.setContentLength(retornoArray.length);

OutputStream output = response.getOutputStream();
output.write(retornoArray);
output.flush();
output.close();

} catch (RuntimeException e) {
// logar e tratar exception
} catch (Exception e) {
e.printStackTrace();
} finally {

        try {
stream.close();
} catch (IOException e) {
// logar e tratar exception
}
}

fcontext.responseComplete();}

O código acima ainda está bem cru. Fica como excercício pra você melhorá-lo. :)

terça-feira, 4 de maio de 2010

O Susto

Versão dela:
Hoje levantei pra lá de atrasada e lembrei que coloquei calças jeans pra lavar. Fui até a área de serviço, abri a tampa da máqiuna, peguei as calças e, enquanto estava estendendo-as, ouço a cama estalar. Penso Tobi está se virando pra continuar dormindo. De repente, ouço um barulhinho de beijo. Olho pra trás, tava o Tobi atrás de mim com sua carinha branca e redonda dele me mandando um beijinho.
Lógico que dei um mega pulão unido de um grito e um xingamento.

Versão dele:
Ouvi a máquina estalar. Pensei que a máquina tinha estragado do nada como aconteceu com a da tia. Eu sei que tu coloca às vezes roupa pra lavar de noite. Olhei pro lado, tu já tinha ido embora, então vim investigar o barulho da máquina. Aí te vi na lavanderia. Resolvi mandar um beijinho.