26 de agosto de 2008

Maus Profissionais de TI

Pessoal aí vai uma dica, como confio em alguém que diz que Java é orientado a pacotes (package)?
Um curso que vi em uma instituição me fez pensar seriamente se as universidades querem formar profissionais qualificados ou apenas pegar dinheiro dos pobres alunos que pagam cursos para tentarem aprender.
Uma instituição séria para cursos de verão é a USP e a FIAP (no meu conhecimento), porém muitas outras deixam a desejar.
O fato é que um cara que diz ter anos de experiência na área de informática fala só besteiras para um monte de aluno que está ali querendo aprender é realmente lamentável...
Certificação? Bom é sempre bom ter uma, tenho a minha da IBM, estou para tirar as outras, mas com 4 anos de experiência a certificação tiro pela minha satisfação pessoal e não mais para provar para as empresas que tenho conhecimento da linguagem em questão, hoje em dia muitos bons programadores não tem certificação, assim como muitos certificados (que decoraram livrinhos) não sabem se virar no dia a dia, assim como também há aqueles que estudam, tiram e são exemplos de programadores, ou seja, é trivial, lógico que é um diferencial em entrevistas, principalmente no início de carreira, mas é no dia a dia que veremos se o cara é bom, cursos? sim tenho muitos caro instrutor, é ótimo estar sempre estudando e se atualizando, é realmente uma pena saber que uma instituição que tem como professor um cara tão ruim ganhando e enganando pessoas inocentes e vir criticar os outros, falar de certificação, sendo que ele nem sabe o que é isso...
Pessoal procurem saber quem é o seu instrutor, coloque no GUJ e pesquise, participe de fóruns, não seja enganado por qualquer pilantra.

22 de agosto de 2008

Apresentação Java Básico IT Training

Montei uma apresentação básica que será apresentado neste Sábado dia 23/08/2008 na Rua Amazonas, número 521 em São Caetano do Sul, sobre o novo curso de Java na IT Training, vale a pena conferir.

Bug no sistema da Anatel

Hoje falando com meu amigo Diego Plentz descobri que ele havia achado um Bug muito básico, porém extremamente perigoso no site da Anatel.
Esse bug é o seguinte eu consigo entrar no sistema de Ordem de Serviço deles, pegar informações pessoais de usuários como telefones, e-mails, dentre outras informações, assim como abrir nova ordem de serviço, como fazer isso? Muito simples bastava pegar o CPF e o e-mail do usuário que solicitou o chamado para a Anatel... mas como fazer isso? Bastava pegar essa URL: http://sistemas.anatel.gov.br/focus/FaleConosco/MostrarDetalheSolicitacao.asp?idtSolicitacao=7094111 sendo que o idSolicitacao é sequencial, ou seja, se eu continuar colocando outros números, vou pegar ordem de serviços de outras pessoas...
Uma falha grave, aparentemente a Anatel colocou em manutenção este sistema.

Caso queira visualizar a reclamação, leia o blog do Diego ou veja no GUJ a notícia.

Como nosso amigo Kumpera disse em seu blog sobre esse Bug:
Segurança como essa é inadmissivel para um órgão governamental. Isso é ridículo, é um afronte a nossa privacidade. Os amadores que fizeram esse sistema ignoraram todas regras básicas de segurança que qualquer desenvolvedor safo tem a obrigação de saber. Anatel, corrija isso com urgência e tome as devidas medidas administrativas para esse tipo de desastre não ocorra novamente. Por favor, a todos que lerem este texto, liguem já para a Anatel no 0800 33 2001, registrem uma reclamação formal e divulguem esse problema para o quanto antes ser solucionado.

12 de agosto de 2008

Criar um relógio digital utilizando SWT.

Olá galeraaaa...

Essa é a minha estréia aqui no Java Anywhere. Minhas postagens vão parecer no mínimo interessantes...pois dificilmente irei abordar temas avançados de Java, mas principalmente aqueles que parecem ser mais básicos...que todos acham que sabem...mas sempre fica alguma dúvida. Principalmente para quem está começando na área.
Bom, vamos falar de interface gráfica, mais especificamente o SWT. Atualmente eu trabalho única e exclusivamente com SWT. Porque o SWT e não o Swing? O SWT é "portável". Roda em qualquer plataforma. É preciso adaptá-lo ao sistema operacional, mas ainda assim ele é vantajoso. É bonito e tem algumas particularidades que facilitam para nós desenvolvedores, e outras que nos deixam com mais cabelos brancos.
Eu precisei desenvolver um relógio digital que deveria aparecer em uma tela de agendamento de consultas. Não seria nenhuma novidade, afinal, existem vários exemplos de relógios digitais na Web, mas, todos em Swing. Aí começa o problema. O SWT tem a sua própria metodologia para o uso de Threads. Aliás, ele tem a sua própria Thread, se me permitem afirmar. E como compreender isso? Eu procurei muito. Fiz várias perguntas no GUJ...mas ninguém sabia responder, até um amigo meu de trabalho me mostrar como é que se trabalha com Threads em SWT (Valeu Charles).
Bem, vamos lá. Vamos criar o nosso relógio digital.

Em primeiro lugar é importante que você já tenha o seu Eclipse com o devido Visual Editor e as Libs do SWT.

Primeiro passo: Construa uma Visual Classe chamada Relogio. Deixe como composite e mantenha o método main assinalado.

Nesse momento sua classe estará assim:

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

public class Relogio extends Composite {



public Relogio(Composite parent, int style) {
super(parent, style);
initialize();
}

private void initialize() {
setSize(new Point(300, 135));
//setLayout(new GridLayout());
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setSize(new Point(300, 135));
new Relogio(shell, SWT.NONE);
shell.open();

while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}

Você vai perceber que não estou utilizando o GridLayout, como o próprio Eclipse já sugere. Comente e trabalhe sem o Grid por hora.
Agora, o próximo passo é você criar duas Labels. Nomeie uma como labelData e a outra como labelHora.

Nesse momento você terá algo desse tipo:

labelData = new Label(this, SWT.NONE);
labelData.setBounds(new Rectangle(45, 60, 100, 30));
labelData.setText("");

labelHora = new Label(this, SWT.NONE);
labelHora.setBounds(new Rectangle(165, 60, 100, 30));
labelHora.setText("");
this.setSize(new Point(300, 135));
//Comente aqui//
//setLayout(new GridLayout());
}

Eu procurei ajustar a tela ao meu gosto sem seguir nenhum padrão pelo simples fato de se tratar de apenas uma demonstração.
Agora...pra deixar nossa classe bem organizada, vamos declarar a fonte assim como o tamanho do texto como atributos "private".Em seguida, dentro do construtor e antes de chamar o método initialize() adicionaremos aos atributos o tamanho e a fonte do texto.
Essa mesma variável nós usaremos agora lá no nosso Label assim como mostra o exemplo. parece que estou dando voltas não é ? Mas para quem faz manutenção esse tipo de organização ajuda muito.

public class Relogio extends Composite {



private Label labelData = null;
private Label labelHora = null;
private Font fontVerdanaDataBold = null;
private Font fontVerdanaHoraBold = null;

public Relogio(Composite parent, int style) {
super(parent, style);

//Aqui declaramos como queremos o nosso texto//
this.fontVerdanaDataBold = new Font(getDisplay(), "Verdana", 12, SWT.BOLD);
this.fontVerdanaHoraBold = new Font(getDisplay(), "Verdana", 12, SWT.BOLD);

initialize();

}

private void initialize() {
labelData = new Label(this, SWT.NONE);
labelData.setBounds(new Rectangle(45, 60, 100, 30));
//Aqui declaramos a variável com tamanho e fonte do texto//
labelData.setFont(fontVerdanaDataBold);
labelData.setText("");

labelHora = new Label(this, SWT.NONE);
labelHora.setBounds(new Rectangle(165, 60, 100, 30));
//Aqui declaramos a variável com tamanho e fonte do texto//
labelData.setFont(fontVerdanaHoraBold);
labelHora.setText("");

this.setSize(new Point(300, 135));
//comente essa linha//
//setLayout(new GridLayout());
}

Agora, vamos a parte mais gostosa do bolo. A criação desse relógio.
Bem abaixo da linha " labelHora.setText("")" iremos criar uma Thread. Essa é aquela que conhecemos. Não tem segredo algum. Logo em seguida criamos as variáveis de conversão de data e hora, não devemos esquecer dos "imports" e não esquecer de usar "data" do pacote javaUtil no "import". Mas e essa tal Thread do SWT?
Ela está lá dentro. Logo abaixo das variáveis de data e hora. Ela se chama "asyncExec". Sem ela, o relógio não funcionaria.
O código ficará assim:

(new Thread(new Runnable() {
SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy");

SimpleDateFormat sdfHora = new SimpleDateFormat("HH:mm:ss");

public void run() {
while (true) {
if (!isDisposed() && !getDisplay().isDisposed()) {

//Aqui chamamos a tal "Thread" do SWT///
getDisplay().asyncExec(new Runnable() {
public void run() {
if (!labelData.isDisposed()
&& !labelHora.isDisposed()) {
Date data = new Date();
labelData.setText(sdfData.format(data));
labelHora.setText(sdfHora.format(data));
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
} else {
break;
}
}
}

})).start();

De mais é tudo Java básico. Vale a pena fazer o teste em casa. Fica muito bacana.Não esqueçam de ajustar o tamanho da tela também no "método main" ok?
Boa sorte galera. Espero ter ajudado.

Apresentação sobre Wicket do USCS.java 2008


Introdução Wicket

From: adantas, 8 minutes ago





Um breve intrução ao framework web Wicket. Esta apresentação está focada em demonstrar as vantagens do wicket que são: simplicidade e agilidade.


SlideShare Link

11 de agosto de 2008

JavaServer Faces: Facilitando o Desenvolvimento Web - Palestra É Dia de Java 2007


Produtividade com JavaServer Faces

From: eduardo.bregaida, 9 minutes ago





Palestra Ministrada na Universidade de Santa Barbara do Oeste


SlideShare Link

JavaServer Faces Produtividade em Desenvolvimento - JustJava 2007


JavaServer Faces Produtividade em Desenvolvimento

From: eduardo.bregaida, 1 hour ago





Palestra ministrada no JustJava 2007


SlideShare Link

Profiling: Como Diagnosticar Problemas de Performance


Profiling - IMES.java - Haroldo Macedo

From: eduardo.bregaida, 1 hour ago





Palestra de Haroldo Macedo para o evento IMES.java


SlideShare Link

Red Code

Red Code

From: juliano.claiton, 1 minute ago




Palestra ministrada no último evento IMES(USCS).java
Códigos mal escritos e anti-patterns. O caminho do sucesso para o Blue Code.


SlideShare Link


JSF e outras tecnologias Java Web - IMES.java

Estou postando a palestra que ministrei no evento IMES.java (USCS.java), o evento infelizmente foi marcado por um dia chuvoso.
Todas as palestras foram ótimas, logo estaremos disponibilizando as outras palestras no site do evento.








SlideShare Link

1 de agosto de 2008

Struts 1.x.x

Bom pessoal, Struts está no passado, deveria estar morto, mas ainda existem milhares de sistemas legados.
Hoje estarei falando de uma prática meio particular de desenvolvimento que ando vendo por aqui e em outros sistemas legados pelos quais já passei.


Tratando Seus objetos do Bean sem copy/paste no Form.

Hoje o que temos em alguns sistemas legados é um grande copy/paste do bean no form ou seja:

Exemplo:
public class Pessoa {
private Integer id;
private String nome;
private String endereco;
private Integer idade;
// getters e setters
}


Esse é um simples Bean Pessoa.java com seus getters and Setters.

Mas quando vamos criar o Form olha só:
PessoaForm
Integer id;
String nome;
String endereço;
Integer idade;
//getters and setters
void validate(){
//aqui validadores
}
Isso é muito feio, um jeito bonito de resolver seria:
PessoaForm
Pessoa pessoa = new Pessoa();
//getters and setters
void validate(){
//aqui validadores
}

No final nossas Actions de CRUD ficariam muito mais fáceis:
IncluirPessoaAction
PessoaForm pessoaForm = (PessoaForm)form;
Pessoa pessoa = pessoaForm.getPessoa();
pessoaDAO.inserirPessoa(pessoa);
No final, somente iria mudar a chamada do método nas outras actions, como excluirPessoa, alterarPessoa, selecionarPessoa.

E a chamada no JSP?
pessoa.jsp
<html:text property="pessoa.nome" size="60" name="pessoaForm" maxlength="50" styleId="txtNome"/>

Parece mais trabalhoso no JSP do que se tivéssemos copiado os atributos do Bean, mudado tudo para String, mas na realidade, não precisaremos mais ficar dando casts desnecessários, as validações ficariam restritas no Form e o mesmo iria ficar visivelmente mais limpo.

Se um dia o Bean aumentar, ou seja, implementar novos atributos a atualização disto será bem mais simples...


Caso seu Bean chame um outro objeto, ou seja, um outro Bean trate-o como no exemplo abaixo:
Eemplo:
Bean
PessoaFisica
Integer id;
Pessoa pessoa = new Pessoa();
//getters and setters


Form
PessoaFisicaForm
PessoaFisica pessoaFisica = new PessoaFisica();
//getters and setters
//validate

JSP
<html:text property="pessoa.nome" size="60" name=" pessoaFisicaForm" maxlength="50" styleId="txtNome"/>
Poderíamos ter casos de beans dentro de beans e no JSP é só chamar com “.” Que representam os getters.
Bom é algo que ando vendo em muitos sistemas legados, Beans tendo seus atributos copiados no form como String para tratar tudo mais fácil, depois milhões de Casts nas Actions...


Bom é isso, aí está minha dica para quem vai pegar buchas de sistemas legados.

[]sss