<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on Peczenyj's Blog</title><link>http://pacman.blog.br/categories/java/</link><description>Recent content in Java on Peczenyj's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 11 Aug 2008 10:48:00 -0300</lastBuildDate><atom:link href="http://pacman.blog.br/categories/java/atom.xml" rel="self" type="application/rss+xml"/><item><title>Closures em Java - Parte 2</title><link>http://pacman.blog.br/blog/2008/08/11/closures-em-java-parte-2/</link><pubDate>Mon, 11 Aug 2008 10:48:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/11/closures-em-java-parte-2/</guid><description>&lt;div class='post'>
Ainda sobre a Closures do java 7, agora será possivel fazer isso:&lt;br />&lt;br />&lt;pre>&lt;code>public class A {&lt;br /> public static void main(String args[]) {&lt;br /> @Shared int acumulador = 0;&lt;br />&lt;br /> {int => int } xxx = { int i => acumulador += i; i};&lt;br />&lt;br /> System.out.println(xxx.invoke(1));&lt;br /> System.out.println(xxx.invoke(2));&lt;br /> System.out.println(xxx.invoke(3));&lt;br /> System.out.println("o valor do acumulador eh " + acumulador );&lt;br />&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Só eu estou achando divertido?&lt;br />&lt;br />&lt;a href="http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html">http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Não dá ideia!!&lt;BR/>&lt;BR/>Logo aparece um @Global da vida... ;-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
Fiquei com medo que tu falasse que era uma "variavel global" &lt;BR/>&lt;BR/>hehe&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Martins, sem o @Shared o codigo compila mas gera um warning. É uma marcação que a variavel é compartilhada com outra closure ou bloco de código.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcelo Martins&lt;/div>
&lt;div class='content'>
O que que vem a ser aquele @shared?&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Fabio Nascimento&lt;/div>
&lt;div class='content'>
Pois é, a única dúvida é como ele faz o autoboxing escondido(leia-se por debaixo dos panos)?&lt;BR/>Mas no geral, tbm estou gostando, vamos ver... quando chegar a hora do SDK implementar isso de verdade mesmo.&lt;BR/>&lt;BR/>Té +&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Closures em Java</title><link>http://pacman.blog.br/blog/2008/08/08/closures-em-java/</link><pubDate>Fri, 08 Aug 2008 19:23:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/08/closures-em-java/</guid><description>&lt;div class='post'>
Olha o que vai ter no java 1.7&lt;br />&lt;br />&lt;pre>&lt;code>public class A {&lt;br /> public static void main(String args[]) {&lt;br /> exec( { int a, int b => a + b });&lt;br /> exec( { int a, int b => a * b });&lt;br /> exec( { int a, int b => &lt;br /> System.out.println("closure " + a + ":" + b); &lt;br /> (a * a) + (b * b) &lt;br /> });&lt;br /> }&lt;br /> public static void exec({ int, int => int } closure){&lt;br /> System.out.println(closure.invoke(3,2));&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />&lt;pre>$ java -Xbootclasspath/p:./closures-2008-08-04/lib/closures.jar A&lt;br />5&lt;br />6&lt;br />closure 3:2&lt;br />13&lt;/pre>&lt;br />&lt;br />Divertido :)&lt;br />&lt;br />Fonte:&lt;br />&lt;a href="http://guj.com.br/posts/list/99477.java">http://guj.com.br/posts/list/99477.java&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Hehehe... bizarro mesmo sera quando o java tiver suporte a pipes, sinais e outras coisas do mundo shell/C/*nix.&lt;BR/>&lt;BR/>Imagina uma classe fazendo um TRAP... hehehe!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>La Batalema Pitonisto&lt;/div>
&lt;div class='content'>
Tenho muito medo disso!&lt;BR/>&lt;BR/>[]'s&lt;BR/>Cacilhas, La Batalema&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Voltas às Aulas e o Java - parte 2</title><link>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</link><pubDate>Thu, 07 Aug 2008 17:43:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</guid><description>&lt;div class='post'>
Existe o clássico problema de determinar se um aluno passou ou não de ano quando são informados as notas e o número de faltas.&lt;br />&lt;br />Vejamos: &lt;br />1) O número de faltas é acima do permitido?. Aqui entra um &lt;span style="font-weight:bold;">if&lt;/span> dos bons com uma comparação numérica, quando um número é maior ou igual a outro.&lt;br />2) A média é basicamente somar as X notas e dividir por X (se for média aritmética). Somar e dividir são operações matemáticas básicas.&lt;br />&lt;br />Uma forma de fazer é:&lt;br />&lt;code> if( numero_de_faltas &amp;gt; maximo_de_faltas_toleradas) {&lt;br /> // reprovado por faltas&lt;br />} else if ( media_do_aluno &amp;lt; media_para_passar ){&lt;br /> // reprovado por nota&lt;br />} &lt;br />// se nem um nem outro, esta aprovado&lt;br />&lt;/code>&lt;br />&lt;br />O ruim dessa abordagem é que o aluno estar aprovado é uma condição "que sobra". Se passarmos a focar a aprovação do mesmo ficaria assim:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else {&lt;br /> // reprovado!&lt;br />}&lt;/code>&lt;br />&lt;br />É claro que eu posso que eu posso querer saber o motivo pelo qual o aluno foi reprovado:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else if(numero_de_faltas &amp;gt; maximo_de_faltas_toleradas){&lt;br /> // reprovado pelo número de faltas: ignoro a média.&lt;br />} else {&lt;br /> // aqui só sobra a reprovação por nota, &lt;br /> // basta fazer a tabela-verdade dessas expressões&lt;br />}&lt;/code>&lt;br />&lt;br />Se o foco do professor for o algoritmo, isso é o que deveria ser analisado. Quem implementa corretamente um método que recebe X notas e um número de faltas e consegue responder a essas perguntas consegue descrever facilmente os casos de teste para verificar se a implementação corresponde ao que se espera.&lt;br />&lt;br />Um programa que tenha algum tipo de interação (seja Swing ou console) ajuda a fazer um macarrão de código, mesclando o algoritmo com o controle de estado dos "menuzinhos". No fim vemos laços de repetição aonde não são necessários, calculo de média errado, etc.&lt;br />&lt;br />Ok, não acho que um marinheiro de primeira viagem devesse começar por JUnit, mas uma com boa noção dos fundamentos da linguagem e evitando a interação desnecessária com o usuario (poderia ser usado até os parâmetros do main), acredito num melhor desempenho. O risco é o aluno acreditar que java é dificil ou que tudo se resume a getters/setters e gigantescos try/catch's onde as exceptions são varridas pra debaixo do tapete. &lt;br />&lt;br />Eu colocaria TDD num segundo momento, mas ai sem perdão, ensinando o caboclo a fazer do jeito certo o quanto antes. O que é dificil se eles conseguem passar sem saber fazer aritmética básica.&lt;/div></description></item><item><title>Test Driven Development - parte 1.</title><link>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</link><pubDate>Wed, 06 Aug 2008 14:31:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</guid><description>&lt;div class='post'>
Veja este código:&lt;br />&lt;br />&lt;pre>&lt;code> public void testEhPar() throws Exception{&lt;br /> assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /> assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /> assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /> &lt;br /> assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /> assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /> assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); &lt;br /> }&lt;/code>&lt;/pre>&lt;br />&lt;br />Dentro de uma classe de teste, usando o framework &lt;a href="http://junit.sourceforge.net/#Getting">JUnit&lt;/a>, a leitura dessas linhas é a seguinte:&lt;br />&lt;br />Eu tenho um objeto chamado &lt;span style="font-style:italic;">algortimo&lt;/span>.&lt;br />A chamada algoritmo.ehPar(2) deve retornar &lt;span style="font-weight:bold;">true&lt;/span>, pois 2 é par, e este método informa se o parâmetro informado é, ou não, par.&lt;br />O método &lt;span style="font-weight:bold;">assertTrue&lt;/span> recebe dois parâmetros: uma mensagem informando o significado deste teste, e o resultado do mesmo.&lt;br />&lt;br />Se o método estivesse com algum problema e retornasse false, isso:&lt;br />&lt;br />assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br />&lt;br />seria o mesmo que&lt;br />&lt;br />assertTrue("2 deve ser par",false);&lt;br />&lt;br />Logo, o teste falha, pois &lt;span style="font-weight:bold;">2 deve ser par&lt;/span>.&lt;br />&lt;br />Esta é uma forma &lt;span style="font-style:italic;">programática&lt;/span> de garantir o comportamento do código que eu desenvolvo: testando. Se o meu método só depende dos parâmetros informados, é muito simples verificar o seu funcionamento.&lt;br />&lt;br />Desenvolvendo os testes antes de implementar o código, tendo apenas as assinaturas dos métodos (por isso recorri a uma interface &lt;a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java.html">aqui&lt;/a>, lembra?), eu posso pensar nos comportamentos esperados e, então, vou desenvolvendo até que todos os testes estejam passando.&lt;br />&lt;br />Não é nada fácil, funciona melhor quando o projeto que estás desenvolvendo está começando, porém os resultados são excelentes: veja o quanto de tempo estás economizando! Se tu pretendes determinar se um código teu está funcionando por programas que perguntam os valores, escrever &lt;br />&lt;br />&lt;pre>$ ant clean test&lt;/pre>&lt;br />&lt;br />é muito mais rápido! &lt;br />&lt;br />O problema surge quando queremos fazer algo complexo, pois a dificuldade de testar mostra problemas na arquitetura adotada, por exemplo. Quanto temos objetos que tem objetos, herança, polimorfismo, tecnicas mais avançadas podem ser usadas como usar Mocks de objetos (e prover os mecanismos para injetar estes Mocks).&lt;br />&lt;br />No caso desse exemplo, esta é uma solução:&lt;br />&lt;pre>&lt;code>public boolean ehPar(int numero){&lt;br /> return numero % 2 == 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Muitos alunos desconhecem as operações de divisão e módulo entre inteiros. O 1, inteiro, dividido por 2, inteiro, não é 0.5, (em java), e sim 0, pois este é o resultado da divisão inteira. O resto da divisão, simbolizado por %, retorna 1. Dessa forma, o resto da divisão de um numero par por 2 é 0, caso contrario é um número inteiro. São operações básicas que precisam ser dominadas. Repare que eu fiz um código que funcione, não tentei nada mais maquiavélico que dê 0.0001 milissegundos mais rápido. &lt;a href="http://gc.blog.br/2008/01/08/a-falacia-da-otimizacao-prematura/">Evite a otimização precoce&lt;/a>.&lt;br />&lt;br />Programar profissionalmente é uma tarefa de &lt;span style="font-weight:bold;">muita&lt;/span> responsabilidade. Desenvolver testes para garantir a qualidade provê excelentes resultados a longo prazo.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Sim sim, escrevi errado!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>OLP&lt;/div>
&lt;div class='content'>
"caso contrario é um número inteiro" não seria "caso contrario o numero é impar" ?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Voltas às Aulas e o Java</title><link>http://pacman.blog.br/blog/2008/08/04/voltas-s-aulas-e-o-java/</link><pubDate>Mon, 04 Aug 2008 12:20:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/04/voltas-s-aulas-e-o-java/</guid><description>&lt;div class='post'>
Na época de volta às aulas nas faculdades percebe-se uma grande invasão de alunos desesperados em foruns de informática para resolverem os seus execícios. É facil reconhecer um aluno em pânico com o seu primeiro &lt;span style="font-style:italic;">while&lt;/span> ou algum exercício sobre Fibonacci: eles não tentam, simplesmente colam o enunciado do problema esperando a resposta pronta.&lt;br />&lt;br />Entretanto tão bizarro quanto são os exercícios propostos: um programa que leia pergunte 2 numeros e retorne a soma, ou um programa para calcular alguma coisa que pergunte ao usuário... perai, pergunte? Um programa perguntando? Como?&lt;br />&lt;br />Este é o típico programa 'interativo' com o usuário. Quando não usa a entrada padrão (algo completamente misterioso para boa parte dos alunos), usam algum recurso SWING. Mas sera que ninguem pensa o quão PREJUDICIAL são estes exercícios?&lt;br />&lt;br />Normalmente o aluno se preocupa com a apresentação do mesmo, fazendo frescuras de menuzinhos, asteriscos pra lá e pra cá... e o algoritmo que é bom nada. Sinceramente: dane-se os menuzinhos. Sabem quantos programas com menuzinhos e que vão perguntar alguma coisa pro usuario vcs vão fazer na vida profissional de vcs? 0! Zero! Nenhum!&lt;br />&lt;br />Existem muitas formas de interação com o usuario, hoje em dia vc pode ter interfaces web, por exemplo. Eu acho que, num primeiro momento, a única interação com o usuario deveria ser escrever na tela. Nada mais que isso se o camarada não sabe o que significa um NullPointerException.&lt;br />&lt;br />&lt;br />Exemplo pratico:&lt;br />&lt;br />- Prepare um diretório para trabalhar (suponho que vc vai usar linux, senão deve ser facil portar este exemplo para outros sistemas operacionais).&lt;br />- Crie um diretorio lib e copie o junit-4.4.jar pra lá (use o google pra baixar esse arquivo, se vc não conseguir saia do curso de informática).&lt;br />- Crie a estrutura abaixo, ainda no diretório de trabalho:&lt;br />src/java&lt;br />src/test&lt;br />- Instale o aplicativo ant (de novo o google te ajuda, alias vc tem algum JDK instalado, certo??).&lt;br />- Crie um arquivo chamado build.xml no diretorio de trabalho.&lt;br />- Baixe o arquivo ant-junit.jar daqui [ http://www.java2s.com/Code/Jar/ANT/Downloadantjunitjar.htm ] e copie o .JAR para ~/.ant/lib (se não existe, crie).&lt;br />&lt;br />Agora vem a proposta: baseado nessa interface:&lt;br />&lt;br />&lt;pre>&lt;code>public interface Algoritmo{&lt;br />/* dado um numero, retorna true se for par */ &lt;br />boolean ehPar(int numero);&lt;br />/* calcula o valor absoluto ou modulo de um numero, ex: -1 vira 1, 1 vira 1 */&lt;br />int calculaModulo(int numero);&lt;br />/* calcula algum termo da série de fibonacci: se 0, mostra o primeiro, se 1 mostra o segundo...*/&lt;br />int calculaFibonacci(int elemento);&lt;br />/* calcula o fatorial do numero indicado */&lt;br />long calculaFatorial(int numero);&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Vais criar uma classe chamada, digamos, SuaClasse que implementa esta interface (percebeu que tudo deve ficar em src/java não é?). Não pense na implementação dessa classe ainda.&lt;br />&lt;br />No diretorio src/test vc vai salvar esta classe:&lt;br />&lt;br />&lt;pre>&lt;code>import junit.framework.TestCase;&lt;br />&lt;br />public class AlgoritmoTeste extends TestCase{&lt;br /> Algoritmo algoritmo;&lt;br /> public void setUp(){&lt;br /> algoritmo = new SuaClasse();&lt;br /> }&lt;br /> &lt;br /> public void tearDown(){&lt;br /> algoritmo = null; &lt;br /> }&lt;br /> &lt;br /> public void testEhPar() throws Exception{&lt;br /> assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /> assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /> assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /> &lt;br /> assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /> assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /> assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaModulo() throws Exception{&lt;br /> assertTrue("modulo de 3 deve ser 3",algoritmo.calculaModulo(3) == 3);&lt;br /> assertTrue("modulo de -3 deve ser 3",algoritmo.calculaModulo(-3) == 3);&lt;br /> assertTrue("modulo de 5 deve ser 5",algoritmo.calculaModulo(5) == 5);&lt;br /> assertTrue("modulo de -5 deve ser 5",algoritmo.calculaModulo(-5) == 5); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaFibonacci() throws Exception{&lt;br /> assertTrue("elemento 0 da serie fibonacci deve ser 0",algoritmo.calculaFibonacci(0) == 0);&lt;br /> assertTrue("elemento 1 da serie fibonacci deve ser 1",algoritmo.calculaFibonacci(1) == 1);&lt;br /> assertTrue("elemento 2 da serie fibonacci deve ser 1",algoritmo.calculaFibonacci(2) == 1);&lt;br /> assertTrue("elemento 3 da serie fibonacci deve ser 2",algoritmo.calculaFibonacci(3) == 2); &lt;br /> assertTrue("elemento 4 da serie fibonacci deve ser 3",algoritmo.calculaFibonacci(4) == 3);&lt;br /> assertTrue("elemento 5 da serie fibonacci deve ser 5",algoritmo.calculaFibonacci(5) == 5);&lt;br /> assertTrue("elemento 6 da serie fibonacci deve ser 8",algoritmo.calculaFibonacci(6) == 8);&lt;br /> assertTrue("elemento 7 da serie fibonacci deve ser 13",algoritmo.calculaFibonacci(7) == 13); &lt;br /> assertTrue("elemento 11 da serie fibonacci deve ser 89",algoritmo.calculaFibonacci(11) == 89);&lt;br /> assertTrue("elemento 13 da serie fibonacci deve ser 223",algoritmo.calculaFibonacci(13) == 233); &lt;br /> }&lt;br /> &lt;br /> public void testCalculaFatorial() throws Exception{&lt;br /> assertTrue("Fatorial de 1 deve ser 1",algoritmo.calculaFatorial(1) == 1);&lt;br /> assertTrue("Fatorial de 2 deve ser 2",algoritmo.calculaFatorial(2) == 2);&lt;br /> assertTrue("Fatorial de 3 deve ser 6",algoritmo.calculaFatorial(3) == 6);&lt;br /> assertTrue("Fatorial de 4 deve ser 24",algoritmo.calculaFatorial(4) == 24);&lt;br /> assertTrue("Fatorial de 5 deve ser 120",algoritmo.calculaFatorial(5) == 120);&lt;br /> assertTrue("Fatorial de 6 deve ser 720",algoritmo.calculaFatorial(6) == 720);&lt;br /> assertTrue("Fatorial de 10 deve ser 3628800L",algoritmo.calculaFatorial(10) == 3628800L); &lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Uma ideia sobre o JUnit pode ser encontrada aqui: [ http://guj.com.br/java.tutorial.artigo.40.1.guj ], alias o guj, na sessão de tutoriais, explica varias coisas, é ótimo material de referência!&lt;br />&lt;br />Ok, vc tem a interface que vc deve respeitar e um arquivo de teste. Vamos falar do arquivo de build do ant.&lt;br />&lt;br />&lt;pre>&lt;code>&amp;lt;project name="Meu Projeto" basedir="." default="dist"&amp;gt;&lt;br /> &amp;lt;description&amp;gt;&lt;br /> Aprendendo a fazer um build.xml para o ant&lt;br /> &amp;lt;/description&amp;gt;&lt;br />&lt;br /> &amp;lt;property name="lib" location="lib"/&amp;gt;&lt;br /> &amp;lt;property name="src" location="src/java"/&amp;gt;&lt;br /> &amp;lt;property name="test" location="src/test"/&amp;gt;&lt;br />&lt;br /> &amp;lt;property name="build" location="build"/&amp;gt;&lt;br /> &amp;lt;property name="dist" location="dist"/&amp;gt;&lt;br />&lt;br /> &amp;lt;path id="classpath.test"&amp;gt; &lt;br /> &amp;lt;pathelement location="${test}" /&amp;gt;&lt;br /> &amp;lt;pathelement location="${build}" /&amp;gt;&lt;br /> &amp;lt;pathelement location="${lib}/junit-4.4.jar" /&amp;gt;&lt;br /> &amp;lt;/path&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="init"&amp;gt;&lt;br /> &amp;lt;!-- Create the time stamp --&amp;gt;&lt;br /> &amp;lt;tstamp/&amp;gt;&lt;br /> &amp;lt;!-- Create the build directory structure used by compile --&amp;gt;&lt;br /> &amp;lt;mkdir dir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="compile" depends="init" description="compile the source " &amp;gt;&lt;br /> &amp;lt;!-- Compile the java code from ${src} into ${build} --&amp;gt;&lt;br /> &amp;lt;javac srcdir="${src}" destdir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="dist" depends="compile" description="generate the distribution" &amp;gt;&lt;br /> &amp;lt;!-- Create the distribution directory --&amp;gt;&lt;br /> &amp;lt;mkdir dir="${dist}/lib"/&amp;gt;&lt;br />&lt;br /> &amp;lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&amp;gt;&lt;br /> &amp;lt;jar jarfile="${dist}/lib/Algortimo-${DSTAMP}.jar" basedir="${build}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="clean" description="clean up" &amp;gt;&lt;br /> &amp;lt;!-- Delete the ${build} and ${dist} directory trees --&amp;gt;&lt;br /> &amp;lt;delete dir="${build}"/&amp;gt;&lt;br /> &amp;lt;delete dir="${dist}"/&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&lt;br /> &amp;lt;target name="test" depends="compile"&amp;gt;&lt;br /> &amp;lt;javac srcdir="${test}"&amp;gt;&lt;br /> &amp;lt;classpath refid="classpath.test"/&amp;gt;&lt;br /> &amp;lt;/javac&amp;gt;&lt;br /> &amp;lt;junit&amp;gt;&lt;br /> &amp;lt;classpath refid="classpath.test" /&amp;gt;&lt;br /> &amp;lt;formatter type="brief" usefile="false" /&amp;gt;&lt;br /> &amp;lt;test name="AlgoritmoTeste"/&amp;gt;&lt;br /> &amp;lt;/junit&amp;gt;&lt;br /> &amp;lt;/target&amp;gt;&lt;br />&amp;lt;/project&amp;gt;&lt;br />&lt;/code>&lt;/pre>&lt;br />&lt;br />A utilização desse arquivo é muito simples, não se amedronte pelo tamanho do arquivo, o formato xml do ant é bizarro e verboso, sou muito mais um Makefile, porém uma vez com ele feito basta ir adicionando coisas "com cuidado". Sem falar que tudo tem documentação oficial cheia de exemplos, só não aprende quem &lt;span style="font-weight:bold;">não&lt;/span> quer.&lt;br />&lt;br />$ ant &lt;br />isso deve compilar a sua classe e gerar um jar (pode ser util no futuro).&lt;br />&lt;br />$ ant clean&lt;br />limpa os diretorios que vc acabou de criar com as suas paradas compiladas.&lt;br />&lt;br />$ ant test&lt;br />compila e executa os testes unítarios.&lt;br />&lt;br />É claro que vc vai dizer, e agora??? Bom, veja isso:&lt;br />&lt;br />&lt;pre>&lt;code>public class SuaClasse implements Algoritmo{&lt;br /> public boolean ehPar(int numero){return false;}&lt;br /> public int calculaModulo(int numero){ return -1;}&lt;br /> public int calculaFibonacci(int elemento){return -1;}&lt;br /> public long calculaFatorial(int numero){return -1;}&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Olha que legal! Uma classe que tem o minimo pra compilar! Agora vamos testar...&lt;br />&lt;br />&lt;pre>$ ant test&lt;br />Buildfile: build.xml&lt;br />&lt;br />init:&lt;br /> [mkdir] Created dir: /home/GLOBO.COM/peczenyj/test/junit/build&lt;br />&lt;br />compile:&lt;br /> [javac] Compiling 2 source files to /home/GLOBO.COM/peczenyj/test/junit/build&lt;br />&lt;br />test:&lt;br /> [javac] Compiling 1 source file&lt;br /> [junit] Testsuite: AlgoritmoTeste&lt;br /> [junit] Tests run: 4, Failures: 4, Errors: 0, Time elapsed: 0.005 sec&lt;br /> [junit] &lt;br /> [junit] Testcase: testEhPar(AlgoritmoTeste): FAILED&lt;br /> [junit] 2 deve ser par&lt;br /> [junit] junit.framework.AssertionFailedError: 2 deve ser par&lt;br /> [junit] at AlgoritmoTeste.testEhPar(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaModulo(AlgoritmoTeste): FAILED&lt;br /> [junit] modulo de 3 deve ser 3&lt;br /> [junit] junit.framework.AssertionFailedError: modulo de 3 deve ser 3&lt;br /> [junit] at AlgoritmoTeste.testCalculaModulo(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaFibonacci(AlgoritmoTeste): FAILED&lt;br /> [junit] elemento 0 da serie fibonacci deve ser 0&lt;br /> [junit] junit.framework.AssertionFailedError: elemento 0 da serie fibonacci deve ser 0&lt;br /> [junit] at AlgoritmoTeste.testCalculaFibonacci(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Testcase: testCalculaFatorial(AlgoritmoTeste): FAILED&lt;br /> [junit] Fatorial de 1 deve ser 1&lt;br /> [junit] junit.framework.AssertionFailedError: Fatorial de 1 deve ser 1&lt;br /> [junit] at AlgoritmoTeste.testCalculaFatorial(Unknown Source)&lt;br /> [junit] &lt;br /> [junit] &lt;br /> [junit] Test AlgoritmoTeste FAILED&lt;br />&lt;br />BUILD SUCCESSFUL&lt;br />Total time: 1 second&lt;/pre>&lt;br />&lt;br />Agora basta escrever codigo de verdade na SuaClasse e testar, estara pronto quando TUDO estiver passando. São 4 métodos básicos, sabendo lidar com variaveis locais, if e for, vc consegue muita coisa.&lt;br />&lt;br />Se eu fosse professor eu daria exercícios assim: o projeto deveria compilar e todos os testes deveriam passar senão o aluno leva 0. A nota viria de acordo com o que eu espero, posso usar um EMMA e ver a cobertura de código, posso avaliar a presença de um Javadoc que preste, etc.&lt;br />&lt;br />Enfim, eu seria um professor muito malvado }-)&lt;br />&lt;br />Não perca a parte 2 &lt;a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java-parte-2.html">aqui&lt;/a>, e uma introdução ao TDD &lt;a href="http://pacman.blog.br/2008/08/test-driven-development-parte-1.html">aqui&lt;/a>.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Marcelo&lt;/div>
&lt;div class='content'>
Muito bom o post, parabéns. Na minha opinião todo professor poderia ser "ruim" desse jeito.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rafael Ponte&lt;/div>
&lt;div class='content'>
Excelente post, parabéns!&lt;BR/>&lt;BR/>Infelizmente muitos professores se preocupam mais com telinhas e "firulas" do que o que é importante na disciplina, pior é que muitos destes professores nunca nem ouviram falar sobre TDD ou mesmo testes unitários!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Gall&lt;/div>
&lt;div class='content'>
Está aí uma coisa que sempre achei errado e vi acontecer várias vezes com mais de um professor onde estudo: o cara começa ensinando bibliotecas para desenvolvimento de aplicações gráficas e detalhes específicos de determinada linguagem para uma galera que não sabe nada (e quando digo que não sabe nada digo que não sabem nem definir o termo) de algoritmos, ou herança e polimorfismo por exemplo.&lt;BR/>&lt;BR/>Terminam as matérias que envolvem programação sabendo como fazer sobrecarga de operadores, mas implementando toda a lógica de um programa dentro de uma única classe com métodos static. Sabem fazer janelas com botões bonitinhos, mas se matam para implementar a lógica do programa.&lt;BR/>&lt;BR/>Ficaria feliz se minha primeira aula de programação fosse no esquema do seu post. Sempre gostei de brincar com os exercícios propostos em sala, mas o cara era tão inflexível que certo dia veio me pedir para trocar de editor de texto, porque o que eu estava utilizando era complicado demais (vim) e me confundiria (wtf?). Tive aulas bastante boas depois, com um cara que valorizava o que é realmente essencial, mas alguns de meus colegas não tiveram a mesma sorte e continuaram tendo aulas desse tipo durante vários semestres.&lt;BR/>&lt;BR/>Triste é ver o camarada que me pediu para trocar de editor de texto sendo citado como "excelente professor para quem está começando". :-|&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
É aquilo, ou se aprende por necessidade ou pq se gosta da parada. Eu propus algo que, se alguem gosta de programar, vai se amarrar em fazer.&lt;BR/>&lt;BR/>Mas tem quem &lt;I>cague&lt;/I> pra isso. Paciência, depois vai pegar um estágio onde vai ter que fazer algo &lt;B>muito&lt;/B> pior e sem internet pra poder postar as dúvidas!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>tiago_stos&lt;/div>
&lt;div class='content'>
Concordo como Roger, professor que faz aluno pensar e aprender algo útil é visto como professor ruim, que não sabe ensinar. Caso verídico de um professor do semestre passado.&lt;BR/>&lt;BR/>Interessante notar que alguns professores que fazem os alunos pensarem mas ensino coisas inúteis não tem fama tão ruim...&lt;BR/>&lt;BR/>Agora, Tiago, vc deveria dar aulas para alguns professores sobre como ensinar de verdade... hehe&lt;BR/>&lt;BR/>Muito bom.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Roger Leite&lt;/div>
&lt;div class='content'>
É Tiago, você seria um professor malvado e muito odiado, porque, seguindo a experiência acadêmica que tive, todo professor que ensina algo útil, e faz os alunos pensarem, geralmente caem naquela listinha (de troca de professor) que vai pra secretaria.&lt;BR/>&lt;BR/>Pelo menos foi isso que eu vi acontecer. :(&lt;BR/>&lt;BR/>De qualquer maneira, concordo com o seu post, e se um dia eu der aula, vou seguir a dica !&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>CMilfont&lt;/div>
&lt;div class='content'>
Tiago, a academia não é para você. Você seria uam vergonha para seus colegas de "d[e]ocência".&lt;BR/>Onde já se viu utilizar Junit, ant e essas bizarrices em sala de aula?&lt;BR/>Cadê o bom e velho pascal? [engraçado que tem aluno do 5º semestre ainda chamando de pascoal]&lt;BR/>Cadê os System.out.println que todo sistema de vergonha tem?&lt;BR/>:)&lt;BR/>Tirando a brincadeira, muito bom seu artigo!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Falta o convite de alguma instituição de ensino, de preferência uma que não dê bola pras tais "Certificações".&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Rafael Carneiro&lt;/div>
&lt;div class='content'>
Você já está indo no caminho correto... quando será professor mesmo? :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Tenho que dar o primeiro exemplo }-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Albineli Motta&lt;/div>
&lt;div class='content'>
Pra mim você está sendo bonzinho, pois você escreveu os testes pros alunos. Assim fica mole.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sobre o "ensino" de Java hoje em dia.</title><link>http://pacman.blog.br/blog/2008/03/06/sobre-o-ensino-de-java-hoje-em-dia/</link><pubDate>Thu, 06 Mar 2008 08:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/03/06/sobre-o-ensino-de-java-hoje-em-dia/</guid><description>&lt;div class='post'>
Java é uma linguagem orientada a objetos que contem tipos primitivos e wrappers para estes tipos, é executada sobre uma maquina virtual, com suporte a herança simples mas possui &lt;span style="font-style:italic;">interfaces&lt;/span>, com mecanismos de sobreescrita e sobrecarga de métodos, com um sistema de tratamento de exceções que te &lt;span style="font-weight:bold;">obriga&lt;/span> a tratar determinadas situações e por ai vai.&lt;br />&lt;br />Ao meu ver o estudo da linguagem deveria focar o domínio do mecanismo de herança e a construção de classes, domínio dos métodos, tipos de retorno, escopos de variavel, conversão de tipos, domínio das estruturas condicionais, de loops e de tratamento de erros, domínio das operações matemáticas e lógicas e,principalmente, domínio da classe String (ok, &lt;span style="font-style:italic;">domínio&lt;/span> pode ser uma palavra forte, talvez uma boa noção fosse suficiente em algumas situações).&lt;br />&lt;br />Com disso tudo, o aluno deveria primeiro trabalhar com argumentos de linha de comando (o que vc acha que o &lt;span style="font-weight:bold;">main&lt;/span> recebe?), depois passar a estudar a leitura e escrita em arquivo texto e, por fim, leitura pela entrada padrão.&lt;br />&lt;br />Pois leitura pela entrada padrão é o que vc menos vai fazer em Java. Ninguem faz programa com menuzinho em Java pra console no mercado. Temos coisas mais complexas pela frente e sem conhecer tudo aquilo que eu listei antes só é possivel fazer gambiarras (como as famosas &lt;span style="font-style:italic;">class functions&lt;/span>, gigantescos métodos que fazem centenas de coisas com nomes adequados do tipo &lt;span style="font-weight:bold;">createTree3&lt;/span>).&lt;br />&lt;br />Ensina-se Java ao contrário: primeiro o camarada programa como se fosse C, perdendo tempo em fazer menus e estruturas de controle pois o usuario pode ter dado um enter, tab, "ç" ou ter digitado algo inválido quando deveria aprender os fundamentos da linguagem. Cria-se vícios que pode ser custoso para remover (como encher o código de getters/setters sem necessidade). A prova disso é que invariavelmente temos comparação de Strings usando o operador == quando deveria ser utilizado os métodos adequados para isso (imagina o susto quando a galera descobre o &lt;a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)">equalsIgnoreCase&lt;/a>).&lt;br />&lt;br />Eu vejo muitos estudantes incapazes de compilar e executar uma classe (o famoso &lt;a href="http://guj.com.br/java.tutorial.artigo.16.1.guj">hello world&lt;/a>) pois os mesmos nunca fizeram uso da linha de comando muito menos foram apresentados ao conceito de &lt;a href="http://guj.com.br/java.tutorial.artigo.108.1.guj">classpath&lt;/a>. Vejo barbaridades típicas de quem não conhece (ou não sabe ler) o javadoc das classes básicas. Fico me perguntando quando esses jovens serão capazes de ler um "Effective Java", por exemplo.&lt;br />&lt;br />&lt;a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/">Aqui&lt;/a> tem um excelente começo.&lt;br />&lt;br />Espero que os professores acordem para essa realidade e que os alunos percebam que estão sendo prejudicados e passem a estudar por sua conta os tópicos necessários para sair arrasando pro ai.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Guilherme&lt;/div>
&lt;div class='content'>
O problema é que esses tais sistemas distribuídos não existem em qualquer lugar como se fala, e as pessoas frequentemente usam objetos fantoches independente da situação. Os sistemas distribuídos acabaram virando uma "desculpa" para os "objetos burros" existirem...&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
tem tda razão ferhr, mas no caso do sistema distribuido estamos falando de Data Transfer Objects (DTOs). É o caso que é necessario o fantochismo (as vezes da ate pra colocar alguma funcionalidade neles... mas é raro)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
(aliás, todo problema gerado por quaisquer linguagens de programação é o abuso).&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
Também vejo problemas com abuso. Neste caso, concordo plenamente.&lt;BR/>&lt;BR/>Mas também não vejo problemas com certos fantochismos, principalmente quando você tem que tratar um objeto (ou seria neste caso "dados"?) em sistemas distribuídos ou usando duas, três linguagens diferentes.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Ao invés de criar um objeto cheio de get/set desnecessário, poderiamos preparar interfaces fluentes, como no exemplo do &lt;A HREF="http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/" REL="nofollow">Chapiewski&lt;/A>.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
o problema está escrito la, chegou a ler o post? Voce deixa de programar orientado a objetos pra programar estruturado.&lt;BR/>&lt;BR/>value objects nunca precisaram obrigatoriamente de getters e setters. alias, value objects imutaveis sao muito mais interessantes.&lt;BR/>&lt;BR/>getters e setters não fazem encapsulamento por si só, isso é uma ilusão! as vezes muito pelo contrario: voce acaba expondo atributos que nao deveria expor: deveria ter criado métodos para trabalhar com esses atributos, em vez de apenas fornecer um simples par de getter e setter. Esse é o mais que conhecido anti pattern do dominio de modelo anemico:&lt;BR/>&lt;BR/>http://www.guj.com.br/posts/list/75388.java&lt;BR/>&lt;BR/>Seus objetos acabam virando fantoches:&lt;BR/>http://www.fragmental.com.br/wiki/index.php?title=Fantoches&lt;BR/>&lt;BR/>Em nenhum momento falei para nunca utilizar getter e setters, o problema é seu abuso. quem vem de linguagem estruturada e esta comecando com orientacao a objetos, costuma abusar demais disso, deixando seu sistema identico a um nao orientado a objetos.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
> fehr, usar getters e setters gerados, como &lt;BR/>> voce falou, é muito perigoso e pode gerar&lt;BR/>> um dominio muito fraco. os objetos podem&lt;BR/>> passar a ser apenas estruturinhas de dados:&lt;BR/>&lt;BR/>ValueObjects / encapsulação, anyone? E qual o problema de alguns objetos serem apenas "estruturinhas de dados"? Nenhum. Depende da aplicação, da idéia. Não há bala de prata.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>paulo&lt;/div>
&lt;div class='content'>
Oi Tiago! Agradeço o link para o blog da Caelum. Nos tentamos seguir essa linha de pensamento, focar no que é realmente importante: interfaces, polimorfismo, reescrita de método, encapsulamento. Alias, quando mostramos java.util e java.io, damos mais atencao para o bom uso das interfaces e polimorfismo desses pacotes do que a API em si. Saber fazer um bom design é o que é fundamental.&lt;BR/>&lt;BR/>fehr, usar getters e setters gerados, como voce falou, é muito perigoso e pode gerar um dominio muito fraco. os objetos podem passar a ser apenas estruturinhas de dados:&lt;BR/>&lt;BR/>http://blog.caelum.com.br/2006/09/14/nao-aprender-oo-getters-e-setters/&lt;BR/>&lt;BR/>e atraves de reflection da sim para manipular os atributos, sem necessidade dos getter e setters, nao vejo reflection como motivacao para o uso dos getters e setters.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Daniel Wildt&lt;/div>
&lt;div class='content'>
Tiago, belo post. Eu vejo ser necessário ensinar o aluno que java não é dependente de uma IDE como ocorre com algumas outras linguagens de programação. Passo pelo menos 3 aulas trabalhando diretamente na linha de comando e usando um editor de texto sem sintax highlight. E desde o início trabalho identação de código fonte, organização de código fonte, enfim, o programador tem que entender a base do processo e tem que saber aplicar isto para qualquer outra linguagem de programação que venha a aprender.&lt;BR/>&lt;BR/>Ainda, que você não precisa de uma IDE com 5000 plug-ins para ter produtividade. Deve achar o que te deixa produtivo, como disse o &lt;A HREF="http://vitorpamplona.com/lastChanges.pr?page=6" REL="nofollow">Vitor Pamplona&lt;/A>.&lt;BR/>&lt;BR/>E principalmente, focar no ensino de orientação a objetos. Criar classes, entender composição e herança, saber diferenciar uma classe abstrata de uma interface. Gosto de trabalhar todos os princípios para que um aluno possa ler um livro sobre design patterns e saber como construir aquilo, porque ele entende orientação a objetos, e não porque sabe java. &lt;BR/>&lt;BR/>Já vi aluno meu reclamar que não consegue aprender patterns porque o material que passei não era em java.&lt;BR/>&lt;BR/>O &lt;A HREF="http://www.urubatan.com.br/coisas-que-eu-nao-entendo-mercado-de-trabalho/" REL="nofollow">Urubatan já falou em um post dele que aprender uma linguagem de programação deveria ser um processo rápido&lt;/A>. Concordo com isto e no meu entendimento isto está relacionado a sua habilidade de abstração e de entender como as linguagens orientadas a objetos funcionam.&lt;BR/>&lt;BR/>Eu aqui fico pensando em como estes profissionais que hoje tem problemas vão evoluir para novas linguagens de programação e assim manter a própria empregabilidade em alta.&lt;BR/>&lt;BR/>Será culpa somente do aluno ou também é culpa do professor? &lt;BR/>&lt;BR/>Como professor, me considero um cara muito chato e deixo claro sempre para os alunos que não existe melhor linguagem de programação. Semestre passado em uma disciplina de desenvolvimento para web, ensinei ASP.NET, Java Server Faces e Ruby on Rails. Só que antes disto trabalhei muito o que envolve desenvolver para a internet.&lt;BR/>&lt;BR/>Ufa, ficou longo o comentário... :-)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Ana Carolina&lt;/div>
&lt;div class='content'>
Oi Tiago.&lt;BR/>&lt;BR/>Concordo totalmente contigo.&lt;BR/>Trabalho com cursos e também disciplinas de cursos técnicos e sei que não adianta começar com a parte prática sem a parte teórica, e também não adianta o objetivo ser "conquistar o mundo", é com exemplos simples, mastigados e várias atividades que se consegue base para um bom profissional. Depois disso é que podemos aprofundar o assunto e abordar tópicos mais avançados.&lt;BR/>&lt;BR/>Ah! E não é só Java.&lt;BR/>Tenho muito aluno que vem dizendo que "eu sei trabalhar com banco de dados" e na verdade usou o Access e nem sabe o que é uma view.&lt;BR/>&lt;BR/>Quando surge o incêndio, é a teoria que te ajuda. &lt;BR/>&lt;BR/>Se o aluno aprende primeiro "na mão", da forma mais trabalhosa e programando em modo texto, com certeza depois ele pode ir pra uma interface gráfica, mas o contrário não é verdadeiro.&lt;BR/>&lt;BR/>Conheço um "professor" de Linguagem C que não sabia que um for() pode ser infinito heheheh &lt;BR/>&lt;BR/>Por esses problemas é que eu sou contra estes cursos muito curtos que ensinam "tudo" e não ensinam os fundamentos das coisas. &lt;BR/>&lt;BR/>É por essas e outras que quem trabalha com TI sofre tanto preconceito. Todos os anos vários "fabricantes de gambiarras" aparecem por aí (mas eles não tem muito sucesso, não se preocupe! heheheh)&lt;BR/>&lt;BR/>Um forte abraço.&lt;BR/>&lt;BR/>Ana Carolina &lt;BR/>http://anacarol.blog.br&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>ferhr&lt;/div>
&lt;div class='content'>
No início (bem no início, há mais de dez anos) via a questão dos getters/setters com muita desconfiança. &lt;BR/>&lt;BR/>No entanto é fácil de criá-los, nem que seja através de geração de código. &lt;BR/>&lt;BR/>Sem eles, entretanto, fica difícil fazer certas coisas com reflexão e afins.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Analise Orientada a Objetos com Java - Parte 1</title><link>http://pacman.blog.br/blog/2007/11/17/analise-orientada-objetos-com-java/</link><pubDate>Sat, 17 Nov 2007 15:02:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/11/17/analise-orientada-objetos-com-java/</guid><description>&lt;div class='post'>
Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java. &lt;br />&lt;br />Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa de análise orientada à objetos feita de forma progressiva, comentários são bem vindos.&lt;br />&lt;br />A primeira proposta foram 2 matrizes bidimensionais, uma com os professores disponíveis naquele dia e outra com as turmas, distribuidas ao longo de uma semana. Eu logo percebi que isso podia ser um problema de modelagem, pois se vc vai utilizar matrizes, paineis, interface textual ou seja lá o que for, isto é apenas uma camada - &lt;span style="font-weight:bold;">a visão&lt;/span>. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:&lt;br />&lt;br />&lt;pre>&lt;code>class Professor{}&lt;br />class Disciplina{}&lt;br />class Turma{&lt;br /> Disciplina disciplina;&lt;br /> Professor professor;&lt;br />}&lt;br />public class Main{&lt;br /> public static void main(String[] args) {&lt;br /> Professor oseias = new Professor();&lt;br /> Disciplina matematica = new Disciplina();&lt;br /> Turma matA = new Turma();&lt;br /> &lt;br /> matA.disciplina = matematica;&lt;br /> matA.professor = oseias;&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />A minha classe &lt;span style="font-weight:bold;">Main &lt;/span>mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe &lt;span style="font-weight:bold;">Professor&lt;/span>, uma classe &lt;span style="font-weight:bold;">Disciplina &lt;/span>e uma classe &lt;span style="font-weight:bold;">Turma&lt;/span>. Se vc observarem qualquer instituição de ensino vão perceber que uma turma tem-um professor e tem-uma disciplina associados (&lt;span style="font-style:italic;">composição&lt;/span>).&lt;br />&lt;br />Percebam também que eu não fui até uma escola ou universidade e fiquei horas levantando requisitos, criado diagramas uml ou documentos no word - apenas criei uma casca inicial de código (cheio de problemas por sinal). Também não me importo, ainda, com nenhum aspecto &lt;span style="font-style:italic;">temporal&lt;/span>. Sem falar que esta escola todos os professores podem dar qualquer disciplina - agora vamos implementar direito.&lt;br />&lt;br />Vejamos... uma turma não troca de disciplina facilmente, mas de professor sim. Faz sentido, então, ter um setter de professor e um construtor que receba uma disciplina. Outra coisa, eu não defini nada nas outras classes, então está na hora de definir 2 atributos : id (numérico) e nome (String). Vou diferenciar os objetos pelo código, isto é, o seu id, e o nome será utilizado como descrição. Vou sobreescrever os métodos equals e toString.&lt;br />&lt;br />Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).&lt;br />&lt;br />&lt;pre>&lt;code>class Professor{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> public Professor(long id,String nome){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ return this.nome ; }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Professor))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Professor) o).getId() == this.id; &lt;br /> return test;&lt;br /> } &lt;br />}&lt;br />class Disciplina{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> public Disciplina(long id,String nome){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ return this.nome ; }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Disciplina))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Disciplina) o).getId() == this.id; &lt;br /> return test;&lt;br /> }&lt;br />}&lt;br />class Turma{&lt;br /> long id;&lt;br /> private String nome;&lt;br /> private Disciplina disciplina;&lt;br /> private Professor professor;&lt;br /> public Turma(long id, String nome,Disciplina disciplina){&lt;br /> this.id = id;&lt;br /> this.nome = nome;&lt;br /> this.disciplina = disciplina;&lt;br /> }&lt;br /> public void setProfessor(Professor professor){&lt;br /> this.professor = professor;&lt;br /> }&lt;br /> public long getId(){ return id; }&lt;br /> public String toString(){ &lt;br /> return this.nome + " [" + this.disciplina &lt;br /> + "] c/ " + this.professor ; &lt;br /> }&lt;br /> public boolean equals(Object o){&lt;br /> boolean test = false;&lt;br />&lt;br /> if (!(o instanceof Turma))&lt;br /> test = super.equals(o);&lt;br /> else &lt;br /> test = ((Turma) o).getId() == this.id; &lt;br /> return test;&lt;br /> } &lt;br />}&lt;br />public class Main {&lt;br /> public static void main(String[] args) {&lt;br /> /* objetos bem comportados */&lt;br /> Professor oseias = new Professor(1L,"Oseias");&lt;br /> Disciplina matematica = new Disciplina(1L,"Matematica");&lt;br /> Turma matA = new Turma(1L,"Matematica A", matematica);&lt;br /> matA.setProfessor(oseias); &lt;br /> &lt;br /> System.out.println("Professor " + oseias); &lt;br /> System.out.println("Disciplina " + matematica); &lt;br /> System.out.println("Turma " + matA);&lt;br /> &lt;br /> /* objetos mal comportados &lt;br /> * Sujeitos a NullPointerException */&lt;br /> Professor juca = new Professor(2L,null);&lt;br /> Disciplina calculo = new Disciplina(2L,null);&lt;br /> Turma matB = new Turma(2L,"Matematica B", null);&lt;br /> matB.setProfessor(null); // nem precisava mas...&lt;br /> Turma matC = new Turma(3L,"Matematica C",calculo); &lt;br /> Turma matD = new Turma(4L,"Matematica D",calculo);&lt;br /> matD.setProfessor(juca);&lt;br /> &lt;br /> System.out.println("Juca? " + juca);&lt;br /> System.out.println("Calculo?" + calculo);&lt;br /> System.out.println("matB? " + matB); &lt;br /> System.out.println("matC? " + matC);&lt;br /> System.out.println("matD? " + matD);&lt;br /> }&lt;br />}&lt;/pre>&lt;/code>&lt;br />&lt;br />Mas que raios eu estou fazendo? veja a saída desse programa:&lt;br />&lt;br />&lt;pre>Professor Oseias&lt;br />Disciplina Matematica&lt;br />Turma Matematica A [Matematica] c/ Oseias&lt;br />Juca? null&lt;br />Calculo?null&lt;br />matB? Matematica B [null] c/ null&lt;br />matC? Matematica C [null] c/ null&lt;br />matD? Matematica D [null] c/ null&lt;/pre>&lt;br />&lt;br />Qual o significado? Bom... eu tenho uma forma razoavel de representar um professor, disciplina e turma, porém não é pratico, o construtor está gigante e, em muitas situações, eu posso ter parâmetros nulos, o que pode ser uma fonte de problemas. Existem muitas formas de refatorar estas classes, eu nem toquei no &lt;a href="http://blog.caelum.com.br/2006/09/04/ensinando-que-e-o-hashcode/">HashCode&lt;/a>, enfim, tem muito pano pra manga. &lt;br />&lt;br />Apresento a vcs o desenvolvimento em etapas, iterativo. Eu estou chutando requisitos aos poucos, é verdade, mas eu entrego um codigo testável e completo e cada ciclo. Com os usuarios testando esse código (nesse caso, uma API, mas enfim...) eu obtenho um feedback interessante. O que vc acha?&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Saudações, sir Peczenyj. :)&lt;BR/>Muito boa a abordagem da análise.&lt;BR/>Java, como sempre, usual e prático no que diz respeito a conceitos de orientação a objeto (a não ser herança múlt... ops, heim? alguém disse algo? ah bom... :D ). &lt;BR/>Pois bem, quero ver a segunda parte pra descobrir o que pretende com esses construtores.&lt;BR/>No mais, já que Professores e Disciplinas são apenas referenciados em Turmas, e têm a sua existência independente destas, ainda acredito que a relação seria uma Agregação. E não Composição, como citou.&lt;BR/>Voltando... Vc descreveu o problema como possuindo o objetivo de atribuir professores às disciplinas. Tem alguma restrição ou regra geral que o problema define e pretende seguir (disponibilidade, horários, etc)? Ou continuará o foco em relacionar professores e disciplinas sem maiores restrições?&lt;BR/>Então é isso, continue o bom trabalho de sempre.&lt;BR/>Abraço.&lt;BR/>Até +.&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Marcio&lt;/div>
&lt;div class='content'>
Eu acho que você deveria usar um problema mais complexo como exemplo e ver se isso realmente funciona. Seu exemplo é bem simples e todo mundo conhece o domínio (estou deduzindo que você estudou e fez faculdade :))&lt;BR/>&lt;BR/>Acho que não é necessário coletar todos os requisitos possíveis e modelar todos os detalhes do sistema, mas é quase obrigatório um estudo do domínio e um design, nem que seja um rascunho, do sistema. Os outros detalhes surgirão com a implementação. :)&lt;BR/>&lt;BR/>[]'s&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Aprenda Java com os melhores versão Tropa de Elite</title><link>http://pacman.blog.br/blog/2007/09/30/aprenda-java-com-os-melhores-verso/</link><pubDate>Sun, 30 Sep 2007 21:01:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/09/30/aprenda-java-com-os-melhores-verso/</guid><description>&lt;div class='post'>
Exatamente: Não vem com essa que vc é &lt;span style="font-style:italic;">istudante&lt;/span>, vai tomar tapa na cara se não aprender Java. Saiba que, de cada 100, só 5 terminam o curso. Nem na Sun se treina programador assim.&lt;br />&lt;br />&lt;pre>&lt;code>/*&lt;br />* O Bope foi criado para atuar quando a policia perde o controle&lt;br />* E no rio de janeiro isso acontece com bastante frequencia&lt;br />*/&lt;br />class Bope{&lt;br /> &lt;br /> private String nome; &lt;br /> private int vitimas;&lt;br /> &lt;br /> public Bope(String nome){&lt;br /> this.nome = nome;&lt;br /> this.vitimas =0;&lt;br /> }&lt;br /> &lt;br /> public void matou(int tantas_vitimas_agora){ &lt;br /> this.vitimas = this.vitimas + tantas_vitimas_agora;&lt;br /> }&lt;br /> &lt;br /> public int quantas_vitimas(){&lt;br /> return this.vitimas;&lt;br /> }&lt;br />}&lt;br />&lt;br />public class Programa{&lt;br /> public static void main(String [] xxx){&lt;br /> // Apresento o capitão nascimento&lt;br /> Bope capitao = new Bope("Capitao Nascimento");&lt;br /> &lt;br /> // quando o capitão sobe a favela, é pra matar, não pra morrer&lt;br /> capitao.matou(1000);&lt;br /> &lt;br /> // agora ele subiu o morro de novo, com ele não tem erro.&lt;br /> capitao.matou(2000);&lt;br /> &lt;br /> // e a farda dele não é azul, é PRETA&lt;br /> System.out.println("O Bope matou: " + capitao.quantas_vitimas());&lt;br /> }&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Entendeu? Não?&lt;br />&lt;br />ENTÃO PEDE PRA SAIR, GUERREIRO!&lt;br />TU É CORRUPTO, TEU LUGAR É COM .NET, É COM VB! JOCKEY DE IDE! PEDE PRA SAIR AGORA!&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>RIC@RDO&lt;/div>
&lt;div class='content'>
Te puxou em Peczenyj!!&lt;BR/>Essa ficou muito boa!!!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>gto&lt;/div>
&lt;div class='content'>
hahah!&lt;BR/>Nunca tinha comentado por aqui, mas leio as vezes. Dessa vez me obriguei a comentar.&lt;BR/>&lt;BR/>Vou te dizer, pra ficar bem ao estilo do bope, com direito a caveirão e tudo mais, só faltava um método "ondeTaOBaianoPorra" :D&lt;BR/>&lt;BR/>E claro, as ameaças com vouTeMostrarOSaco e pegaAVassoura...&lt;BR/>&lt;BR/>uh!&lt;BR/>&lt;BR/>[]'s!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Fala Peczenyj.&lt;BR/>Estamos na mesma, só na base das descrições.&lt;BR/>Agora, "Jokey de IDE" foi PHoda. LOL&lt;BR/>Nunca tinha achado uma expressão que casasse tão bem. (com o jeito do Capitão Nascimento claro) :D&lt;BR/>Isso inspira a fazer um do senado.&lt;BR/>Difícil é que nunca sairia da prioridade mais alta (e com imunidade a kills).&lt;BR/>Farewell. :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Acontece que o Capitão Nascimento aprendeu C primeiro, eu até tentei corrigir isso mas ele me ameaçou, disse q eu era moleque.&lt;BR/>&lt;BR/>E não vi o filme ainda, me alimento das descrições eletrizadas dos meus colegas de trabalho :)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Edson&lt;/div>
&lt;div class='content'>
Assistiu ao filme na versão oficial (na única sala que o passa em Jundiaí) ou foi em piratão mesmo? &lt;BR/>Tem de tomar um tapa no ouvido mesmo, que "quantas_vitimas" é o jeito C de falar, e BOPE que se preza fala em Java ("quantasVitimas") :P&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>rsfair&lt;/div>
&lt;div class='content'>
Nada como comentários para facilitar o entendimento do programa :)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>JEDI - Java Education and Development Initiative</title><link>http://pacman.blog.br/blog/2007/08/18/jedi-java-education-and-development/</link><pubDate>Sat, 18 Aug 2007 15:22:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/08/18/jedi-java-education-and-development/</guid><description>&lt;div class='post'>
&lt;span style="font-weight:bold;">JEDI e o ensino de Java gratuito&lt;/span>&lt;br />&lt;br />Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystems, nasce através do Java Research &amp; Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.&lt;br />&lt;br />A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.&lt;br />&lt;br />Tecnologia Java&lt;br />&lt;br />A tecnologia Java está presente, hoje, em 2 bilhões de dispositivos tecnológicos em todo o planeta - e também fora dele, já que podemos localizar dispositivos Java rodando até em Marte. Existem hoje, no mundo, cerca de 579 milhões de celulares com Java, 93 operadoras de telefonia móvel, 750 milhões de cartões SmartCard (do tipo JavaCard) distribuídos, 650 milhões de computadores pessoais e com 2 milhões de cópias da plataforma empresarial J2EE. Por isto, 68% das novas aplicações, hoje, são desenvolvidas em Java, que substituiu o C++ como a competência mais procurada pelos profissionais. É executado em múltiplas plataformas e em uma ampla gama de dispositivos, indo de um pequeno chip em SmartCards aos servidores dos Grandes Data Centers.&lt;br />&lt;br />Demanda por Profissionais&lt;br />&lt;br />Com tudo isso, existe hoje, uma demanda por 2 milhões de novos profissionais de TI a cada ano. Desenvolvedores Java, devem prover soluções nas mais diversas áreas de tecnologia. Torna-se crescente a necessidade, por exemplo, do desenvolvimento de soluções para aparelhos celulares que demandam uma integração com sistemas legados, de maneira a fornecer soluções corporativas. A partir disto, o conhecimento de Java e de sistemas abertos, são imprescindíveis para profissionais de TI.&lt;br />&lt;br />Além da demanda, a tendência é um outro fator motivador para este mercado. No Brasil, esta aponta para direção de trabalhos realizados para clientes de fora do país - o outsourced. É crescente a procura por parte das organizações, o desenvolvimento de projetos baseados em tecnologia Java, distribuindo-se as aplicações desenvolvidas aqui pela Internet.&lt;br />&lt;br />Todavia, a busca do mercado por esse perfil de profissional vai de encontro com a capacidade de fornecimento do conhecimento Java. O fato é que, o mercado tem dificuldade em encontrar desenvolvedores com competência nos fundamentos de Tecnologia da Informação, orientação a objetos, conhecimento e experiência em Java avançado, competência em comunicação e nas relações interpessoais.&lt;br />&lt;br />A industria de software supre o despreparo dos profissionais formados pelo mercado, com a necessidade de re-treinamento interno dos novos contratados, muitos graduados sem conhecimento em TI. A grande maioria não tem uma certificação, que tem um valor adicional no mercado, especialmente para trabalhos executados fora do pais. Outro fator que colabora para o despreparo do profissional é fato do treinamento oficial Java da Sun ser relativamente caro e os programas de treinamento interno das empresas atuais serem pouco abrangentes. Disso resulta uma contratação de apenas 5% dos currículos recebidos nas empresas.&lt;br />&lt;br />Academicamente o treinamento é, muitas vezes gratuito e de boa qualidade, é acessível. Contrastando, os professores não possuem experiência prática das demandas da indústria e não há, por parte de centros acadêmicos, a compreensão com respeito ás preocupações da industria de software, que não conseguem cobrir as necessidades que o mercado exige. Aliado a isso, está a dificuldade de alterar os currículos acadêmicos.&lt;br />&lt;br />E o JEDI ?&lt;br />&lt;br />O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais, slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas. Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.&lt;br />&lt;br />Na Filipinas já existe uma estrutura acadêmica dividida em fases. Na primeira fase foram disponibilizados os cursos de Introdução a programação I (versão 1.3); Introdução a Programação II (versão 1.1) e Estruturas de Dados (versão1.1). Na segunda fase os cursos de Engenharia de software (versão 1.0); Desenvolvimento de aplicações móveis (versão 1.0); Programação Web (versão 1.0). Na terceira fase, os cursos de Web Services; Segurança em Java e Programação, modelagem e análise orientada à objetos. Completando quatro semestres de curso com: Sistemas operacionais; Gerenciamento de projetos orientados à objetos e Inteligência artificial. Todo este material está atualmente disponível para download, em Inglês, no site Java.net.&lt;br />&lt;br />A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas através de JP Petines (Java champion), no Brasil através de Daniel deOliveira (Java champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.&lt;br />&lt;br />Hoje o JEDI concentra o maior número de membros nas Filipinas. Desde fevereiro de 2005 até abril de 2006 são 110 escolas - 10% de todas as universidades e faculdades das Filipinas aderentes ao programa; Foram realizados 13 treinamentos e formados 207 instrutores multiplicadores, que formaram 1.318 instrutores que atendem a 48.205 estudantes.&lt;br />&lt;br />Países de Língua Portuguesa&lt;br />&lt;br />O Brasília Java Users Group - DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Angola, Cabo Verde, Guiné-Bissau, Brasil, Moçambique, Portugal, São Tomé e Príncipe; Timor Leste serão países que poderão fazer o treinamento em língua nativa, com todos os recursos que a iniciativa provê. O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que fornece ao grupo apoio logístico, administrativo e jurídico.&lt;br />&lt;br />Atualmente, o Brasil conta, segundo a SUN Microsystems, com 70 mil desenvolvedores Java e 43 grupos de usuários Java, com mais de 25 mil membros participantes. É através do apoio destes grupos distribuídos em todos os estados da nação que esta iniciativa espera se consolidar, para elevar o nível de aprendizado Java, provendo melhores profissionais para atender as exigências do mercado mundial.&lt;br />&lt;br />Como participar do JEDI ?&lt;br />&lt;br />No momento estamos trabalhando na tradução e adaptação do material utilizado na Filipinas. Um vez que este esteja concluído, os cursos poderão ser acessados pelo site. Ao concluir o processo cada aluno terá que fazer uma prova presencial para obter a sua certificação, que será oferecida agentes que serão certificados em todo Brasil.&lt;br />&lt;br />O DFJUG necessita de pessoas para corrigir e dar opiniões sobre todo o material produzido e realizar testes de Stress no site aonde o JEDI será hospedado, isso é um trabalho que somente poderá ser realizado com o apoio de toda a comunidade javanesa existente no Brasil. Quem quiser participar da iniciativa, no Brasil, deve acessar a página do DFJUG (www.dfjug.org) e entrar em contato com o grupo. Junte-se a nós, participe no instrutor ou como aluno desta iniciativa, poderemos assim enriquecer o conhecimento da linguagem e difundi-la de uma forma totalmente gratuita, voluntária e colaborativa, no Brasil e em diversos paises de língua portuguesa, será seu trabalho e seu empenho que ajudará elevar o Brasil ao hall dos melhores desenvolvedores JAVA no mundo.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Eduardo Bregaida&lt;/div>
&lt;div class='content'>
Me manda um e-mail ou MP no GUJ e fala tbm com o WilliamSilva do GUJ tbm q vc entra rapidinho =)&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Eduardo Bregaida&lt;/div>
&lt;div class='content'>
Boa, está também envolvido no JEDI?&lt;BR/>&lt;BR/>[]s&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Israel&lt;/div>
&lt;div class='content'>
Putz cara... vou confessar que só caiu a ficha agora no lance do "nuts" UHAUHAUHAUHUA :D&lt;BR/>&lt;BR/>Vou te colocar no blogroll. Abraços!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>Israel&lt;/div>
&lt;div class='content'>
Nunca viu Jericho? Não sabe o que tá perdendo hehehe :)&lt;BR/>&lt;BR/>A propósito, bem legal o teu blog. Gostei muito dos posts. Parabéns.&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Sugestões de Leitura</title><link>http://pacman.blog.br/blog/2007/07/11/sugestes-de-leitura/</link><pubDate>Wed, 11 Jul 2007 15:38:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/07/11/sugestes-de-leitura/</guid><description>&lt;div class='post'>
Ja ouviu falar na tal Web 2.0? Veja os &lt;a href="http://www.slideshare.net/pcalcado/somos-nozes">slides&lt;/a> da apresentação do Philip Calçado.&lt;br />&lt;br />Quer dominar o Vi/Vim? Veja este pequeno &lt;a href="http://wiki.if.uff.br/operador/doku.php/dicas:vi">guia&lt;/a>.&lt;br />&lt;br />Se inglês não é problema, vc pode aprender &lt;a href="http://www.planetpdf.com/developer/article.asp?ContentID=6632">Java&lt;/a>, &lt;a href="http://www.planetpdf.com/developer/article.asp?ContentID=6634">C++&lt;/a> ou &lt;a href="http://www.advancedlinuxprogramming.com/">Programação Avançada em Linux&lt;/a> usando livros gratuitos e de ótima qualidade.&lt;br />&lt;br />No site da InfoQ vc ainda pode baixar livros de &lt;a href="http://www.infoq.com/minibooks/enterprise-soa">SOA&lt;/a>, &lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches">Scrum &amp; XP&lt;/a>, &lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">Domain Driven&lt;/a> e &lt;a href="http://www.infoq.com/minibooks/vsnettt">Dicas de Visual Studio .NET&lt;/a>.&lt;br />&lt;br />E, se vc se interessa por Gerência de Projetos, vai gostar &lt;a href="http://www.leanconstruction.org/pdf/ObsoleteTheory.pdf">desse artigo&lt;/a>.&lt;br />&lt;br />Boa leitura!&lt;/div></description></item><item><title>Ola Mundo!</title><link>http://pacman.blog.br/blog/2007/06/11/ola-mundo/</link><pubDate>Mon, 11 Jun 2007 16:42:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/06/11/ola-mundo/</guid><description>&lt;div class='post'>
Quando aprendemos uma nova linguagem de programação, normalmente o primeiro exemplo é o famoso "Hello World!", ou seja, um pequeno código que imprime uma mensagem na tela do computador.&lt;br />&lt;br />Em C, ele seria assim:&lt;br />&lt;br />&lt;pre>&lt;code>/* Um comentário */&lt;br />#include &amp;lt;stdio.h&amp;gt;&lt;br />&lt;br />int main ()&lt;br />{&lt;br /> puts ("Hello world!");&lt;br /> return 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />As vezes o &lt;span style="font-weight:bold;">puts&lt;/span> é substituido pelo multifacetado &lt;span style="font-weight:bold;">printf&lt;/span> no exemplo, mas o efeito é o mesmo. Vejamos como seria em Java.&lt;br />&lt;br />&lt;pre>&lt;code>/* Comentarios, igual ao C */&lt;br />package Hello;&lt;br />&lt;br />public class HelloWorld {&lt;br /> public static void main(String[] args) {&lt;br /> System.out.println("Hello world");&lt;br /> }&lt;br /> }&lt;/code>&lt;/pre>&lt;br />&lt;br />As diferenças são várias, apesar da estrutura ser semelhante. Em C nós temos funções parametrizadas, enquanto em Java nós temos objetos (System.out) e métodos (println). &lt;br />&lt;br />Por fim, vamos ver um exemplo em Shell Script&lt;br />&lt;br />&lt;pre>&lt;code>#!/bin/bash&lt;br /># comentario&lt;br />echo "Hello World!"&lt;/code>&lt;/pre>&lt;br />&lt;br />Diferente de uma linguagem de programação, aqui o interpretador de comandos (normalmente) chama um programa capaz de escrever mensagens para o usuario. Ou seja, alguem ja escreveu um "Hello World!" genérico o suficiente para nós. &lt;br />&lt;br />Cada linguagem possui um propósito. Enquanto vc projeta sistemas operacionais e drivers em C, Java ocupa uma área no desenvolvimento de grandes sistemas corporativos enquanto o shell está presente na administração de determinadas tarefas de um servidor (normalmente rodando algum sabor de *nix). &lt;br />&lt;br />Não basta comparar um hello world, pois é preciso ver muito além da sintaxe e recursos da linguagem, mas normalmente se começa por ele.&lt;br />&lt;br />Outros exemplos podem ser encontrados &lt;a href="http://www.roesler-ac.de/wolfram/hello.htm">aqui&lt;/a>.&lt;br />&lt;br />Abraços&lt;/div></description></item></channel></rss>