quarta-feira, 7 de abril de 2010

Fragilidade

Estava lendo um antigo livro sobre programação e achei um parágrafo muito interessante:

Fragilidade de um software.
"A fragilidade é o grau em que as alterações pequenas influenciarão as partes grandes do sistema. O software tente a ser difícil de manejar por muitas razões, mas a razão principal é a fragilidade."

Muitos sistemas são feitos através de muita documentação para que cubra todos os casos de uso, mas o mais importante é esquecido, os testes automatizados. É muito simples fazer um teste, eu mesmo ensino meus alunos a fazer testes de unidade em pascal assim que começa o conteúdo de sub-programação.
Na maioria dos casos o mais complicado é a vontade de fazer o teste. Ou seja, é mais fácil implementar ou alterar a aplicação e testar na interface gráfica com apenas um "caso feliz" do que deixar no legado no sistema um caso de uso implementado.

Outra parte do texto diz: "Isso, por sua vez, resulta no legacy lock-in (prisão ao sistema legado) e outras perversões". O que seria em outras palavras "Se está funcionando, não mexe!".

E para concluir o texto ainda diz que é lamentável a distância que existe entre muitos sistemas que existem no mercado e uma boa arquitetura de código.

quinta-feira, 1 de abril de 2010

Configurações para compilar o jasper 3.7.1 com o maven

Estava fazendo um projeto para retornar relatórios PDF quando requisitado certas informações via WEB.
As ferramentas utilizadas eram: maven 2 e iReport 3.7.1

Ao compilar o relatório via iReport tudo funcionava, mas quando pedia para o maven fazer o serviço, aparecia uma infeliz mensagem: "Language "groovy" not supported by this report compiler." e logo abaixo "Expecting "java" instead."

Já estava desistindo e regredindo versões por causa da mensagem quando resolvi investir um pouco de tempo para pesquisar. Determinei um time-box para não ficar viajando muito e por fim encontrei a seguinte solução.

Primeiramente abri o arquivo jrxml e removi o trecho language="groovy". Mandei compilar no maven e funcionou, mas fiquei pensando se teria que fazer isto para todos os relatórios que tinham pela frente. Estava dentro do meu time-box e resolvi pesquisar mais.

Primeiro pesquisei porque eu usaria o groovy. Resumidamente, o groovy foi adicionado ao jasper para simplificar as expressões colocadas nos relatórios, ou seja, o que antes eu faria new Double($F{f1}.doubleValue() +
$F{f2}.doubleValue()) com o groovy eu faço $F{f1} + $F{f2}. Quer argumentação maior que esta?

Adicionei o groovy-all-1.7.1 às dependencias do plugin do jasper e na configuração do plugin apontei o compilador JRGroovyCompiler.

Fim.

A configuração ficou assim:


<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jasperreports-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile-reports</goal>
</goals>
</execution>
</executions>

<configuration>
<compiler>net.sf.jasperreports.compilers.JRGroovyCompiler</compiler>
</configuration>

<dependencies>
<dependency>
<groupId>jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>

Matando um dragão.

Para descontrair, segue abaixo um texto muito criativo enviado por um aluno meu.



Certa vem um dragão aprisionou uma linda princesa em uma torre de ilha distante, a única forma de se acessar esta ilha era atravéz de uma ponte na qual o dragão ficava dia e noite de vigia, então lá vão nossos "heróis" da informática salvar a princesa, cada uma sua maneira:


Programador Java

Chega, encontra o dragão. Desenvolve um framework para aniquilamento de dragões em múltiplas camadas. Escreve vários artigos sobre o framework, mas não mata o dragão.

Programador .NET

Chega, olha a ideia do Javanês e a copia, tenta matar o dragão, mas é comido pelo réptil.

Programador PHP

Desenvolve em alguns minutos uma lamina perfeita, afiada e funcional. Escolhe uma bonita textura para o cabo, e outra bonita textura para a armadura. Escreve um CSS com o alinhamento exato dos golpes necessários para matar o dragão. Corre para matar o dragão, mas, chegando lá, descobre que as texturas que escolheu para o cabo da espada e para a armadura não combinam com dragão e nem com o vestido da princesa. Volta pra frente do micro e e perde algumas horas para produzir texturas melhores no photoshop. Volta majestoso para matar o dragão, uma cena bonita mesmo, todas as cores em equilíbrio. A princesa sorri, por ser salva por um herói tão bem alinhado, o dragão sorri também, pois quando o programador tenta o primeiro golpe, descobre que fez o CSS dos golpes para IE e não para o MOZILA. Resultado, churrasquinho de programador.

Programador C

Chega, olha para o dragão com olhar de desprezo, puxa seu canivete, minúsculo extremamente leve e simples degola o dragão. Encontra a princesa, mas a ignora para ver os últimos checkins no cvs do kernel do linux.

Programador C++

Cria um canivete básico e vai juntando funcionalidades até ter uma espada complexa avassaladora, mas que apenas ele consegue entender … Mata o dragão, mas trava no meio da ponte por causa dos memory leaks.

Programador COBOL

Chega,olha o dragão, pensa que tá velho demais para conseguir matar um bicho daquele tamanho e pegar a princesa e, então, vai embora de volta ao seu mundinho.

Programador Pascal

Se prepara durante 10 anos para criar um sistema de aniquilamento de dragão… Chegando lá descobre que o programa só aceita lagartixas no máximo médias como entrada.

Programador VB

Monta uma arma de destruição de dragões a partir de vários componentes, parte pro pau pra cima do dragão e, na hora H, descobre que a espada só funciona durante noites chuvosas, e deve ser reiniciada a cada golpe para voltar a funcionar, só não sabe o pq disso…

Programador PL/SQL

Coleta dados de outros matadores de dragão, cria tabelas com N relacionamentos de complexidade ternaria, dados em 3 dimensões, OLAP, demora 15 anos para processar a informação. Enquanto isso a princesa virou lésbica.

Programador Ruby

Chega com uma p*t* fama, falando que é o melhor faz tudo, quando vai enfrentar o dragão ao invés de ir pros finalmente, mostra um videozinho dele matando um dragao … O dragão come ele de tédio.

Programador Smalltalk

chega, analisa o dragão e a princesa, vira as costas e vai embora, pois eles são muito inferiores.

Programador Shell Script

Cria uma arma poderosa para matar os dragões, mas, na hora H, não se lembra como usá-la.

Programador Shell Script - 2

O cara chega no dragão com um script de 2 linhas que mata, corta, estripa, empala, pica em pedacinhos e empalha o bicho, mas na hora que ele roda, o script aumenta, engorda, enfurece e coloca álcool no fogo do dragão.

Programador Assembly

Acha que está fazendo o mais certo e enxuto, porém troca um A por D, mata a princesa e transa com o dragão.

Programador Fortran

Chega desenvolve uma solução com 45000 linhas de codigo, mata o dragão vai ao encontro da princesa … mas esta o chama de tiuzinho e sai correndo atrás do programador java que era elegante e ficou rico.

Programador Fox Pro

Desenvolve um sistema para matar o dragão, por fora é bunitinho e funciona, mas por dentro está tudo remendado. Quando ele vai executar o aniquilador de dragões descobre que esqueceu de indexar os DBF´s.

Programador Clipper

Monta uma rotina que carrega um array de codeblocks para insultar o dragão, cantar a princesa, carregar a espada para memória, moer o dragão, limpar a sujeira, lascar leite condensado com morangos na princesa gostosa, transar com a princesa, tomar banho, ligar o carro, colocar gasolina e voltar pra casa. Na hora de rodar recebe um "Bound Error: Array Access" e o dragão come ele com farinha.

Programador Python

Quis correr, levantando a espada para o golpe fatal, mas como a linguagem não é multithread o dragão esperou de boca aberta o guerreiro se aproximar.

Analista de processos

Chega ao dragão com duas toneladas de documentação desenvolvida sobre o processo de se matar um dragão genérico, desenvolve um fluxograma super complexo para libertar a princesa e se casar com ela, convence o dragão que aquilo vai ser bom pra ele, e que não será doloroso. Ao executar o processo ele estima o esforço e o tamanho do estrago que isso vai causar, a assinatura do papa, do buda e do Raul Seixas para o plano, e então compra 2 bombas nucleares, 45 canhões, 1 porta aviões, contrata 3000 homens armados até os dentes, quando na verdade necessitaria apenas da espada que estava na sua mão o tempo todo.

quinta-feira, 25 de fevereiro de 2010

Nada de programação, mas tudo de lógica.

Recentemente recebi um email muito interessante. Não sei qual a fidelidade das informações, por isso reproduzirei o texto da mesma maneira que recebi.


O pensamento abaixo foi ESCRITO POR ADRIAN ROGERS NO ANO DE 1931 !!!

"É impossível levar o pobre à prosperidade através de legislações que punem os ricos pela prosperidade.
Por cada pessoa que recebe sem trabalhar, outra pessoa deve trabalhar sem receber.
O governo não pode dar para alguém aquilo que não tira de outro alguém.
Quando metade da população entende a idéia de que não precisa trabalhar, pois a outra metade da população irá sustentá-la, e quando esta outra metade entende que não vale mais a pena trabalhar para sustentar a primeira metade, então chegamos ao começo do fim de uma nação.
É impossível multiplicar riqueza dividindo-a. "

Adrian Rogers, 1931

terça-feira, 23 de fevereiro de 2010

Como criar uma keystore para assinar aplicações JAVA

A linha de comando é a seguinte:
keytool -genkey \
-alias projeto_alias \
-keypass projeto_123 \
-keystore projeto.keystore \
-storepass projeto_storepass
Onde keytool é o software que vem junto com a instalação do JDK, -keygen é o parâmetro para criação da chave e o restante são parâmetros para posterior assinatura de seu JAR. Esta chave funcionará por 6 meses (tempo padrão), caso queria aumentar este tempo, basta colocar o parâmetro -validity e passar o valor em dias.

terça-feira, 2 de fevereiro de 2010

Como fazer printscreen no Mac

command+shift+3: Captura a tela inteira.
command+shift+4: Captura uma parte da tela que você escolher.