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.
Blog destinados aos meus alunos, colegas professores, desenvolvedores e afins da área da tecnologia de informação.
quarta-feira, 7 de abril de 2010
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:
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.
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
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 \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.
-alias projeto_alias \
-keypass projeto_123 \
-keystore projeto.keystore \
-storepass projeto_storepass
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.
command+shift+4: Captura uma parte da tela que você escolher.
Assinar:
Postagens (Atom)