sexta-feira, 31 de outubro de 2008

Transferir bytes de um lado pro outro

Quando você quer transferir bytes de um lado pro outro via socket você pode utilizar várias estratégias, eu criei dois Iterators para facilitar esta tarefa.


Trecho da classe que envia

Socket s = new Socket("localhost", 8888);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
byte[] nome = { 1, 2, 3, 4, 5, 6, 7 };

ByteArrayInputStream bytArrIn = new ByteArrayInputStream(nome);

SenderInputStreamIterator it = new SenderInputStreamIterator(in, out, bytArrIn);
while (it.hasNext()) {
byte[] b = (byte[]) it.next();
System.out.println(b[0]);
}



Trecho da classe que recebe

ServerSocket serv = new ServerSocket(8888);
Socket s = serv.accept();
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();

ByteArrayOutputStream byteArrOut = new ByteArrayOutputStream();
ReaderInputStreamIterator it = new ReaderInputStreamIterator(in, out);
while (it.hasNext()) {
byte[] b = (byte[]) it.next();
System.out.println(b[0]);

}





/**
* Classe criada para receber as informações enviadas pelo
* SenderInputStreamIterator.

*
* Oquê acontece na verdade é que esta classe pergunta diz: Tem mais? Então
* manda!
*
* @author Clayton.Passos
*
*/
public class ReaderInputStreamIterator implements Iterator {
private static final int BUFFER_SIZE = 1;
private DataInputStream dataIn;
private DataOutputStream dataOut;
private byte[] buffer = new byte[BUFFER_SIZE];

/**
*
* @param in
* Canal de comunicação de entrada de dados, utilizado para pedir
* mais informações para o SenderInputStreamIterator através do
* hasNext(). Também é utilizado pelo next() par ler as
* informações que o SenderInputStreamIterator está enviando.
*
* @param out
* Canal de comunicação utilizado para pedir mais informações ao
* SenderInputStreamIterator
*/
public ReaderInputStreamIterator(InputStream in, OutputStream out) {
this.dataIn = new DataInputStream(in);
this.dataOut = new DataOutputStream(out);
}

public boolean hasNext() {
try {
// Tem mais informações/bytes?
dataOut.writeByte(TransferProtocol.hasNext);
byte hasNext = dataIn.readByte();

switch (hasNext) {
case TransferProtocol.yesHasNext:
return true;
case TransferProtocol.noHasNext:
return false;
default:
throw new IllegalStateException("TransferProtocol unexpected");
}

} catch (Exception e) {
throw new IllegalStateException(e);
}
}

public Object next() {
try {
// Se tem mais informações/bytes? Então manda.
dataIn.readFully(buffer);
return buffer;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}

/**
* Not implemented, and in real case... you don´t implement this method
*/
public void remove() {
throw new IllegalStateException("Not implemented");
}
}






/**
* Classe destinada a enviar as informações contida no InputStream para a saída
* de dados sob demanda.

* Oquê acontece na verdade é que esta classe fica esperando a
* ReaderInputStreamIterator perguntar: Tem mais?
*
*

* Dialogo:
* Reader: Tem alguma coisa ai pra mim? Tem mais?
* Sender: Tenho, Toma!
*

*
* @author Clayton.Passos
*
*/
public class SenderInputStreamIterator implements Iterator {
private static final int BUFFER_SIZE = 1;
private DataInputStream dataIn;
private DataOutputStream dataOut;
private int bytesRead;
private byte[] buffer = new byte[BUFFER_SIZE];
private ByteArrayInputStream byteArrIn;

/**
*
* @param in
* Canal de comunicação para que o hasNext saiba que o
* ReaderInputStreamIterator está pedindo mais informações
* @param out
* Canal de comunicação para que o next() possa enviar a
* informação
*
* @param byteArrIn
* informações a serem enviadas e recebidas pelo
* ReaderInputStreamIterator
*/
public SenderInputStreamIterator(InputStream in, OutputStream out,
ByteArrayInputStream byteArrIn) {
this.dataIn = new DataInputStream(in);
this.dataOut = new DataOutputStream(out);
this.byteArrIn = byteArrIn;
}

public boolean hasNext() {
try {
// Reader está pedindo mais informações/bytes?
byte hasNext = dataIn.readByte();
if (hasNext == TransferProtocol.hasNext) {
bytesRead = byteArrIn.read(buffer);
// Se tem, então avisa que tem
if (bytesRead != -1) {
dataOut.write(TransferProtocol.yesHasNext);
dataOut.flush();
return true;
// Se não tem, então avisa que não tem
} else {
dataOut.writeByte(TransferProtocol.noHasNext);
dataOut.flush();
return false;
}

} else {
throw new IllegalStateException("TransferProtocol unexpected");
}

} catch (Exception e) {
throw new IllegalStateException(e);
}
}

public Object next() {
try {
// Manda mais informações/bytes
dataOut.write(buffer);
dataOut.flush();
} catch (Exception e) {
throw new IllegalStateException(e);
}
return buffer;
}

/**
* Not implemented, and in real case... you don´t implement this method
*/
public void remove() {
throw new IllegalStateException("Not implemented");
}
}

segunda-feira, 20 de outubro de 2008

Campos de banco X Hibernate

Como saber o nome da coluna utilizada no banco de dados no mapeamento do hibernate, em tempo de execução?

Como saber o nome da tabela utilizada para persistir uma entidade?


Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();

// através do Configuration
PersistentClass classMapping =
cfg.getClassMapping("com.entity.Usuario");

String tableName = classMapping.getTable().getName();
System.out.println("Nome da tabela: " + tableName);

Column column2 = classMapping.getTable().getColumn(2);
System.out.println("Nome da 2ª coluna: " + column2.getName());

Chave primaria hibernate

Como saber qual é a propriedade referente a chave primária e um objeto utilizando hibernate?


Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();

//através do Configuration
PersistentClass classMapping =
cfg.getClassMapping("com.model.entity.Usuario");

System.out.println("chave: " +classMapping .getIdentifierProperty().getName());

KeyValue identifier = classMapping.getIdentifier();
Iterator columnIterator = identifier.getColumnIterator();
while(columnIterator.hasNext()){
Column cl = (Column) columnIterator.next();
System.out.println("chave: " +cl.getName());
}


//Através da Factory
ClassMetadata classMetadata =
factory.getClassMetadata("com.model.entity.Usuario");

System.out.println("chave: "
+ classMetadata.getIdentifierPropertyName());

sábado, 18 de outubro de 2008

Compactar e descompactar

Classe utilitária para compactar e descompactar arquivos zip apartir de um stream de dados



/**
* Compact and Unpack Zip files
*
* @author Clayton.Passos
*
*/
public class Zip implements ICompactOperation {
private static final int BUFFER_SIZE = 1024;

/**
* Compacta os arquivos da lista armazenando-os no output
*
* @param fileLst
* List
* @param dataOut
*
* @param pathComplete
* Se for verdadeiro guardará todo o caminho até o arquivo

* Se for falso armazenará apenas o arquivo, sem o caminho
* @throws IOException
*/
public static void compact(List fileLst, DataOutputStream dataOut,
boolean pathComplete) throws IOException {
ZipOutputStream out = new ZipOutputStream(dataOut);
out.setLevel(9);

// Create a buffer for reading the files
byte[] BUFFER = new byte[BUFFER_SIZE];

// Compress the files
FileInputStream in;
File file;
for (int i = 0; i < fileLst.size(); i++) {
file = (File) fileLst.get(i);
in = new FileInputStream(file);

// Add ZIP entry to output stream.
ZipEntry entry;
if (pathComplete) { // Complete path in zip file
entry = new ZipEntry(file.getPath());
} else {// only file in zip file, no path
entry = new ZipEntry(file.getName());
}

out.putNextEntry(entry);

// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(BUFFER)) > 0) {
out.write(BUFFER, 0, len);
out.flush();
}

// Complete the entry
out.closeEntry();
in.close();
}

// Complete the ZIP file
out.close();
}

/**
* Descompacta o arquivo no local definido por outFilesPath
*
* @param dataIn
*
* @param outFilesPath
* Local onde ficarão os arquivos
* @throws IOException
*/
public static void unpack(DataInputStream dataIn, String outFilesPath)
throws IOException {
ZipInputStream zis = new ZipInputStream(dataIn);
ZipEntry zipEntry = null;
byte[] BUFFER = new byte[BUFFER_SIZE];
String path;
while ((zipEntry = zis.getNextEntry()) != null) {
path = outFilesPath + File.separator + zipEntry.getName();

// if don´t exist, create this path
new File(new File(path).getParent()).mkdirs();

FileOutputStream fileOut = new FileOutputStream(path);
int count;
while ((count = zis.read(BUFFER, 0, BUFFER_SIZE)) != -1) {
fileOut.write(BUFFER, 0, count);
}
fileOut.close();

}
zis.close();
}
}

sábado, 14 de junho de 2008

Como ativar windows XP

Só pra mim não perder esse texto :D



1. Vá em Iniciar > Executar

2. Digite regedit e clique em OK.

3. Já dentro do regedit, navegue até a chave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\WPAEvents
4. No painel à direita, clique duas vezes em OOBETimer

5. Na janela que foi aberta, apague qualquer valor e clique em OK. Feche o regedit
6. Vá novamente em Iniciar > Executar e dessa vez digite:
%systemroot%\system32\oobe\msoobe.exe /a

7. Na janela que foi aberta, escolha a opção Sim, desejo telefonar…

8. Na próxima etapa, clique no botão Alterar chave de produto.

9. Na etapa seguinte, digite a CD-Key:
THMPV-77D6F-94376-8HGKG-VRDRQ
e clique no botão Atualizar

10. Após clicar no botão Atualizar, o assistente para ativação voltará para a janela anterior, então, clique em Lembrar mais tarde e reinicie o Windows.

11. Reiniciado o Windows vá novamente em Iniciar > Executar e digite:
%systemroot%\system32\oobe\msoobe.exe /a

12. Aparecerá a seguinte mensagem:

Ativação do Windows
O Windows já está ativado. Clique em OK para sair

segunda-feira, 9 de junho de 2008

BusinessDelegate X Session Facade

Encontrei esse texto em algum lugar, não sei onde, mas achei bastante interessante....


O Facade e o Delegate tem muitas semelhanças, na maiora dos sistemas q conheço o mesmo objeto tem faz o papel dos dois. Um delegate por natureza é um Facade.

A diferença mais significativa entra Delegate e Facade, é que o Delegate abstrai a complexidade da chamada de métodos de negócio. Enquanto que o Facade é para abstrair a complexidade de um fluxo, ou workflow.
Delegate vc usa sempre para chamar um BO.
Facade vc usa quanto precisa disponibilizar uma forma simples de acessar vários métodos de negócio. Por exemplo: inserir usuário e enviar e-mail. São duas operações, mas para que os objetos clientes não precisem conhecer dois BOs("Criador de usuários"e "enviador de mail") e usado um Facade. Assim o cliente conhece apenas um metodo do Facade, e não se preocupa em como funciona a camada de negócios.
Cliente == Interface gráfica, camada controle, ou qq outra traquitana q acesso Busines Objects(BO).

Resumindo:
Delegate: Abstrai para o clinete, detalhes de como é implementado um Objeto de Negócio.
Facade: Abstrai para o cliente a compexidade entre workflow de Objetos de Negócio

Links para os dois patterns:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html
http://java.sun.com/blueprints/corej2eepatterns/Patterns/SessionFacade.html

sexta-feira, 6 de junho de 2008

Livro e mais livros para download

http://www.ebook3000.com
http://downloadebookz.info
http://www.ebooksocean.com/

http://booksforpeople.sharedaa.com/
http://www.dbebooks.in/
http://ebooksbyte.com/
http://www.free-ebooks-library.com/


http://ebooksgratis.com.br/
http://ebooksgratis.com.br/category/revistas-mensais-e-mensais/arquitetura-e-urbanismo/


Nestes links, além de livros, você encontrará os chamados "video trainer", que nada mais são do que aulas em forma de video
http://downeb.com/
http://downea.info/
http://raload.com/
http://www.netbks.info/
http://booktraining.org/
http://www.netbks.com
booktraining.co
http://ranxo.com/
http://knowfree.net
http://sevno.info/
http://www.free-ebook-download.net/

quinta-feira, 29 de maio de 2008

Scrum

"Nossa história no início foi bem parecida com as histórias tradicionais. Sabe aquelas empresas que gastam uma semi-fortuna com uma consultoria para desenhar um processo de desenvolvimento de software? Assim estávamos nós no início de 2007. Poucos projetos eram entregues nas datas acordadas e muitos deles falhavam ou não satisfaziam as necessidades dos clientes. Contratar uma grande consultoria de software parecia ser uma boa tentativa de arrumar as coisas, mas o resultado do trabalho foi um documento que descrevia um processo com algumas centenas de páginas que devia ser seguido á risca, isso sem contar as dúzias de documentos padrão para todos os tipos de requisição e comunicação que se possa imaginar. Dezenas de páginas descreviam quem deveria falar com quem e quem entrega qual documento em qual momento. O processo foi feito para lidar com todas as complexidades, burocracias e exigências que nós mesmos criamos dentro da empresa."


Se você sentiu alguma identificação com esta estória, então leia o restante....

http://www.infoblogs.com.br/view.action?contentId=36535
http://blog.fragmental.com.br/2007/08/15/introduzindo-agilidade-num-ambiente/

quarta-feira, 21 de maio de 2008

Um pouco sobre internacionalização

Um pouco sobre internacionalização



Internacionalização também é conhecida por i18n devido as dezoito letras que estão entre a primeira e a última da palavra inglesa internationalization, é uma técnica utilizada para desenvolver softwares de maneira que o mesmo possa ser facilmente traduzido a outras línguas. Mas não só isso, um software internacionalizado deve ser adaptável o suficiente para se adequar a características regionais, legais, culturais e técnicas, tais como fuso horário, formato de números, datas, sistemas métricos e moedas. Este processo pode ser automático, ou manual.


Como há diferenças entre as diversas línguas “irmãs” como é o caso do português de Portugal e o do Brasil, é recomendável especificar estas diferenças. Para isto utiliza-se o l10n (da palavra inglesa localization) em conjunto do i18n, evidentemente os dois são complementares. O i10n adiciona características especificas de uma região.

Analogamente, quando criamos um objeto Locale desta forma:

Locale ptBR = new Locale(“pt”, “BR”);


Estamos dizendo que nossa língua é o português, mas que esta língua é especifica para o local Brasil. Mas, claro, se quisermos definir apenas a língua (i18n) podemos utilizar o construtor que recebe apenas a língua, como a seguir:

Locale pt = new Locale(“pt”);

Um software internacionalizado normalmente vem com um ou vários arquivos texto. Estes devem seguir o seguinte padrão:

MyResources.properties
MyResources_fr.properties
MyResources_fr_CH.properties
MyResources_pt_BR.properties
MyResources_en.properties

Para o arquivo de mensagens da listagem 6 ser reconhecida pela classe ResouceBundle, este deve seguir este mesmo padrão (nome + _ + língua + _ + pais + . + properties), ficando assim:

messages_pt_BR.properties
messages_enproperties

Caso não seja definida um Locale para o ResourceBoundle, este irá utilizar o que ele detectar que normalmente é o disponibilizado pelo Sistema Operacional.

Consulte a API de ResourceBundle para maiores detalhes.

Hibernate Validator

Hibernate Validator

A base para o JSR 303: Bean Validation.

Autor
Clayton K. N. Passos (netstart[@]gmail.com): Viciado em tecnologia. Atualmente trabalha como Desenvolvedor/Analista Pleno. (http://japz-j.blogspot.com)

A validação de dados pode e deve ser um processo centralizado e flexível o bastante para ser desempenhando em diferentes camfadas de um sistema, mas de forma centralizada. Utilizando o Hibernate Validator, inspiração para a JSR 303, isto pode ser uma tarefa simples.

Introdução
Validação de dados é uma tarefa comum, muitas vezes implementada em diferentes camadas, de diversas maneiras e até mesmo separado do framework de validação, consumindo tempo e causando erros difíceis de serem encontrados pela falta de centralização dos interesses (concerns).
Vários projetos vêm implementando e apresentando suas idéias no que diz respeito à validação de dados, entre eles: Struts, Spring e Hibernate. Neste artigo falaremos sobre a forma proposta pelo Hibernate 3, que é uma das inspirações para a JSR 303, uma das novas especificações prevista para o Java 7.
Nas primeiras versões do Hibernate 3, a API de validação estava junto do sub-projeto Hibernate Annotations, mas no momento da escrita deste artigo esta API encontra-se separada e leva o nome Hibernate Validator. Vale ressaltar que para a validação dos recursos aqui apresentados, utilizamos as próprias classes de teste do Hibernate Validator com algumas pequenas modificações e também os softwares e APIs nas seguintes versões:

· Hibernate Validator 3.0.0.GA;
· Hibernate Core 3.2.4.GA;
· Hibernate-Annotations 3.3.0.GA
· Eclipse 3.2.2;
· Java 1.6.0_01-b06.

Hibernate Validator

Seguindo o princípio da filosofia DRY (Don’t Repeat YourSelf), o Hibernate Validator trás uma forma de adicionar regras para validação automática de dados, de maneira que estas validações sejam implementadas uma e somente uma vez em toda a aplicação, eliminando a duplicação destas regras entre as diversas camadas (presentation, data access, database schema).

Utilizar annotations para adicionar regras é bastante conveniente e elegante, com elas podemos definir várias regras diretamente no modelo de classes persistente. O Hibernate Validator (H.V.) possuí algumas validações comuns (@NotNull, @Email, @Max, @Length, entre outras), mas não prende o desenvolvedor, possibilitando, a criação de validações personalizadas e internacionalizadas.

Cada annotation é associada a uma implementação de validação, que verifica se a instancia da entidade obedece a sua regra. O Hibernate faz isto automaticamente antes de um insert ou update, mas você também pode chamar a validação a qualquer momento em sua aplicação e de qualquer Java Persistence provider (JPA).

As validações podem ser utilizadas em dois níveis: aplicação e banco de dados. A primeira traz a possibilidade de validar a instancia de classes através de suas regras em tempo de execução (veja o quadro de constraints), enquanto que a segunda é incorporada ao Hibernate metamodel e ao database schema gerado, traduzindo as regras que você adicionou no mapeamento de suas entidades. Por exemplo, se você adicionar @NotNull a uma propriedade de sua entidade, a coluna irá ser declarada como not null no DDL schema gerado pelo Hibernate (hbm2ddl). Caso você não queria mais este comportamento, basta atribuir false a hibernate.validator.apply_to_ddl.
Este artigo está focado na primeira forma de validação.


Constraints

Aqui você pode ver uma lista de algumas regras que podem ser adicionadas a suas entidades, de maneira que o hibernate possa validar as informações armazenadas dentro delas. Lembre-se de que estas são constraints que o Hibernate Validator fornece para nós trabalharmos, mas podemos definir as nossas constraints personalizadas. Mas o que são constraints?Em poucas palavras: Constraints são regras de restrição, e sua semântica é definida pelas annotations que a descrevem.

Annotation Funcionalidade
@Length(min=, max=): Verifica se o tamanho da string esta dentro dos limites.

@Max(value=): Verifica se o valor é maior ou igual. Aplicado a representações de números, armazenados até mesmo em String.

@Min(value=): Verifica se o valor é menor ou igual. Aplicado a representações de números, armazenados até mesmo em String.

@NotNull: Checa se o valor não é null.

@NotEmpty: Checa se não é null e não vazia.

@Past: Checa se uma data esta no passado.

@Future: Checa se uma data esta no futuro.

@Pattern(regex=”regexp”, flag=)ou@Patten({@Pattern(...)}): Checa se a propriedade obedece à expressão regular.

@Range(min=, max=): Confere se o valor está entre o mínimo e o máximo (incluindo), aplicado a valores numéricos, mesmo armazenados em String.

@Size(min=, max=): Confere se a quantidade de elementos esta entre o mínimo e o máximo (incluído), aplicado a Array, Collection, Map.

@AssertFalse: Confere se o valor de uma propriedade boolean é false.

@AssertTrue :Confere se o valor de uma propriedade boolean é true

@Valid: Impõe uma validação recursiva aos objetos associados. Se o objeto é uma Collection, Map ou um Array, os elementos são validados recursivamente.

@Email: Confere se a string é um e-mail válido.

@CreditCardNumber: Confere se a string é um número de cartão de crédito válido.

@Digits: Verifica quantidade de dígitos ante e depois do separador de casa decimal (integerDigits e factionalDigits).

@EAN: Verifica se a string é um código EAN ou UPC-A válido



Como utilizar o framework?
É chegada a hora de “sujarmos as mãos” e ver como a teoria se aplica na prática. Lembre-se de que se você estiver utilizando o Hibernate como uma solução para o Mapeamento Objeto Relacional (ORM), a integração do Hibernate Core com o Hibernate Validador é transparente. As validações ocorrem sempre antes de qualquer insert ou update, caso haja algum erro será disparado uma exceção com as regras violadas. Se por algum motivo for necessário desabilitar a esta integração basta atribuir false a hibernate.validator.autoregister_listeners.

Para começar vamos criar uma classe que servirá apenas para nos mostrar os erros de uma forma mais amigável. Chamaremos esta classe de HandlerTest e seu propósito de existência é o de imprimir na saída padrão as mensagens de erro, se tiver alguma, caso contrário deverá nos avisar de que não há nenhum erro, veja a listagem 1.

Analisando o código, vemos que a classe HandlerTest verifica se o array de InvalidValue é igual a 0, esta é a forma da qual você pode ter certeza de que não nenhum erro foi detectado pelo Hibernate Validator, pois, sempre que for detectado um erro, haverá algum elemento no array retornado pelo validador. Caso o array invalidValues tenha algum elemento o código da listagem 1 chama o método print() para nos mostrar o quê tem dentro do array. Veja o quadro InvalidValue para saber a utilidade dos principais métodos desta classe.


Listagem 1: Classe HandlerTest
public class HandlerTest {
public static void printErrors(InvalidValue[] invalidValues) {
System.out.println("** Listagem de erros **");
if (invalidValues.length == 0) {
System.out.println("Oba! Não há erros!\n");
} else {
print(invalidValues);
}
}

private static void print(InvalidValue[] invalidValues) {
Class clazz = invalidValues[0].getBeanClass();
System.out.print("Há " + invalidValues.length);
System.out.println(" erro(s) na entidade: " + clazz.getSimpleName());
for (InvalidValue iv : invalidValues) {
System.out.print("A propriedade ");
System.out.print(iv.getPropertyName());
System.out.println(" possui o seguinte erro: ");
System.out.println(iv.getMessage());
if (iv.getValue() != null) {
System.out.print("Valor errado: ");
System.out.println(iv.getValue());
}
}
}
}



InvalidValue
GetBeanClass(): Retorna o tipo da classe que provocou o erro.

getBean(): Retorna a instancia da classe que falhou na validação.

getMessage(): Retorna a mensagem de erro, que pode estar internacionalizada.

getValue(): Retorna o valor errado.


Como já dissemos, você pode validar as informações contidas em suas entidades, em qualquer lugar do sistema. A maneira de fazer isto é chamando o método getInvalidValues da classe ClassValidator, se houver algum erro na entidade ele retornará um array de InvalidValue contendo diversas informações pertinentes a este erro. Simples, não?

Agora que já temos uma maneira simples de verificar as validações, vamos a um caso de uso fictício, suponha que para a compra de um carro o mesmo deve obedecer a dois critérios, seu IPVA deve estar pago e livre de amassados. Definimos classe Car utilizando as Annotations @AssertTrue e @AssertFalse de maneira que a propriedade ipvaPago seja igual a true, e que a propriedade amassado seja igual a false, veja a listagem 2.

Listagem 2: Classe Carro

public class Carro{
String cor;
@AssertTrue
boolean ipvaPago;
@AssertFalse
boolean amassado;
}



Na listagem 2 podemos observar que as constraints foram adicionadas em cima da propriedade, uma alternativa caso seja necessário é definidas sobre o método get da respectiva propriedade. Particularmente não gostamos de definir as regras em cima dos métodos getXX(), pois torna o código menos intuitivo e menos legível, aconselhamos que sempre utilize a propriedade para adicionar as constraints.

Acompanhe na listagem 3, que a classe AssertTest imprimirá primeiramente dois erros, mas posteriormente, como não será detectado nenhum erro pelo validador, apenas haverá uma mensagem confirmando que as informações contidas na entidade são válidas. Como não definimos nada no código referente a língua, as mensagens de erros virão na língua configurada no Sistema Operacional. Até o momento da escrita deste artigo, eram onze as línguas suportadas, entre elas: português do Brasil; inglês; espanhol; italiano; francês; chinês e alemão.

Lista 3: Classe AssertTest

public class AssertTest {
public static void main(String[] args) {
Car fuscao = new Car();
fuscao.cor = "preto";
fuscao.ipvaPago = false;
fuscao.amassado = true;

ClassValidator classValidator = new ClassValidator(Car.class);
InvalidValue[] invalidValues = classValidator.getInvalidValues(fuscao);
printErrors(invalidValues);

fuscao.ipvaPago = true;
fuscao.amassado = false;
invalidValues = classValidator.getInvalidValues(fuscao);
printErrors(invalidValues);
}
}


Definindo suas próprias validações

Criar nossas próprias validações é muito simples, é necessário apenas duas coisas, criar uma Annotation que descreva a regra e criar uma classe que implemente a interface org.hibernate.validator.Validator (veja a listagem 4 e 5), feito isto é só adicionar a Annotation a sua entidade para que ela seja validada.

Listagem 4: Annotation Phone


@ValidatorClass(PhoneValidator.class)
@Target({FIELD, METHOD})
@Retention(RUNTIME)
@Documented
public @interface Phone {
String ddd() default "44";
String message() default "{validator.phone}";
}


Na listagem 4, podemos acompanhar o código de uma Annotation destinada a validação de telefones. Três pontos importantes devem ser observados nesta classe. Na primeira linha temos a anotation @ValidatorClass dizendo que é utilizado a classe PhoneValidator como a implementação que irá validar a entidade anotada com @Phone. Os dois próximos pontos importantes são as propriedades ddd e message. Ambas podem ser mudadas no momento de definir uma entidade da seguinte forma:
@Phone(ddd = “45”, message = “mensagem de erro”)

A propriedade message tem propósito especifico, que é armazenar uma string que será utilizada caso um erro proveniente desta Annotation seja detectada. No exemplo, o valor default é {validator.phone}, uma mensagem nada inteligível, mas aliado ao recurso de internacionalização ela será, pois com esta chave o mecanismos de internacionalização do Hibernate Validator tentará encontrar a mensagem apropriada, caso não encontre será utilizado a string {validador.phone} na integra.

A classe PhoneValidator mostrada na listagem 5, possuí apenas dois métodos reescritos da interface Validator. Enquanto o método initialize(Phone parameters) recupera os valores atribuídos na entidade para a annotatoin @Phone o método isValid(Object value) faz o trabalho de verificar se o conteúdo da propriedade é valido, atente para o parâmetro que isValid recebe, esta é a informação que deve ser validada. Em nosso código de exemplo para um telefone ser válido é preciso estar no formado (44)0000-0000 (DDD 44 entre parênteses, seguido de quatro números, um traço e novamente quatro números).

O Hibernate Validator utiliza a classe ResourceBundle para internacionalizar as mensagens de erros. É bastante tranqüilo trabalhar com ela, primeiramente precisamos de um arquivo .properties, dentro dos padrões (veja o quadro: Um pouco sobre internacionalização); a Annotation precisa estar preparada para trabalhar com a mensagem internacionalizada e que seja explicitado que utilizaremos o arquivo específico para as mensagems.

Na listagem 6, temos um código completo, que imprime a mesma mensagem de erro em duas línguas diferente. Para isto foram necessárias apenas algumas linhas de código adicionais, veja que foi preciso passar no segundo parâmetro do construtor de ClassValidator um ResouceBundle que foi criado apartir de um Locale.

É possível sobrescrever as mensagens padrão do H.V., a regra é simples. Dentro do arquivo que você armazena as mensagens internacionalizadas, você adiciona a chave validator.nomedaannotation. Por exemplo, para mudar a mensagem da annotation @NotNull haverá no arquivo a seguinte chave:
validator.notnull=Erro, a propriedade não pode ser null

Se for necessário informar os valores permitidos, como é caso de @Length, podemos colocar o nome da variável entre chaves, desta forma, esta será trocada automaticamente pelo valor configurado na entidade. Veja o exemplo a seguir:
validator.length=Xii!! Deu erro no Length, os valores devem estar entre {min} e {max}

Listagem 5: Classe PhoneValidator


public class PhoneValidator implements Validator {
private String dddValid;
public void initialize(Phone parameters) {
dddValid = parameters.ddd();
}

public boolean isValid(Object value) {
if (value == null) {
return true;
}

String phone = (String) value;
//(44)9962-3019
String reg = "\\(" +dddValid+ "\\)[0-9]{4}\\-[0-9]{4}";
Pattern pattern = Pattern.compile(reg);
Matcher match = pattern.matcher(phone);
return match.matches();
}
}



Listagem 6: Classe PhoneTest

public class PhoneTest {
public static void main(String[] args) {
HomePhone hPhone = new HomePhone();
hPhone.phone = "3366-3330";

Locale ptBR = new Locale("pt", "BR");
ResourceBundle rBundleDefault = ResourceBundle.getBundle("messages", ptBR);
ResourceBundle rBundleEnglish = ResourceBundle.getBundle("messages", Locale.ENGLISH);
ClassValidator classValidator;
classValidator = new ClassValidator(HomePhone.class, rBundleEnglish);
InvalidValue[] invalidValues = classValidator.getInvalidValues(hPhone);
printErrors(invalidValues);

classValidator = new ClassValidator(HomePhone.class, rBundleDefault);
invalidValues = classValidator.getInvalidValues(hPhone);
printErrors(invalidValues);

hPhone.phone = "(44)9962-3019";
invalidValues = classValidator.getInvalidValues(hPhone);
printErrors(invalidValues);
}
}



Não se preocupe

O Hibernate Validator cuida de vários problemas comuns do desenvolvimento de software. Referencia circular, muito discutido no quesito qualidade de software, é um destes problemas, este tipo de situação, comum, levou a alguns brasileiros criarem um pluguin para o Eclipse chamado ByeCycle que auxilia a eliminar referencias circulares. Acompanhe pela listagem 7 que a entidade Contact nos diz que a entidade Brother também deve passar pela validação (@Valid), mas a Classe Brother faz o mesmo para com a classe Contact, isto poderia facilmente levar a um problema sério de referencia circular, mas isto não é algo do qual devemos nos preocupar, pois o H. V. sabe lidar com esta situação perfeitamente, nos permitindo usar estas classes.

Listagem 7: Referencia circular

public class Contact {
@NotNull
public String phone;
@Valid
public Brother brother;
}

public class Brother {
@NotEmpty
public String name;
@Valid
public Contact contact;
}


É possível validar todos os elementos de uma Collection ou array facilmente, não é necessário nenhum recurso “informágico”. Basta adicionar a Annotation @Valid a estrutura que esta terá todos os seu itens validados. Acompanhe a listagem 8 que demonstra como uma classe TV pode ter o seu Map de Show verificado item a item pelo Hibernate Validator.

Listagem 8: iterable

public class Tv {
@NotNull
public String name;
@Valid
public Map shows = new HashMap();
}
public class Show {
@NotNull
public String name;
}


Esta poderosa ferramenta nos permite também agregar várias expressões regulares, para validar uma única propriedade, acompanhe a listagem 9, observe que definimos duas E.R. e também personalizamos as mensagens que serão utilizadas para informar o usuário caso alguma destas regras sejam desrespeitadas.

Listagem 9: agregando E.R.

@Patterns( {
@Pattern(regex = "^[A-Z0-9-]+$", message = "must contain alphabetical characters only"),
@Pattern(regex = "^....-....-....$", message = "must match ....-....-....") }
)


Integração com Hibernate
A utilização do Hibernate (core) propriamente dito em conjunto com o Hibernate Validator é feita através do Hibernate Annotation (ou Hibernate EntityManager) e neste caso a validação será automática, não será necessário nenhum código para chamar o validador, pois esta chamada ocorrerá antes de qualquer inserção de dados novos ou alterações (save ou update).

Para verificar este comportamento foi criado uma entidade chamada Linha, a ela demos alguns atributos e algumas regras para serem verificadas, como por exemplo @NotNull e @Length(max = 100). Também foram criadas as classes HibernateUtil e LinhaTeste, classes utilizadas para nos fornecer a Session e testar o comportamento de validação respectivamente.

Após a execução do teste dois tipos de exceções foram lançadas: org.hibernate.PropertyValueException e org.hibernate.validator.InvalidStateException ambas indicando problemas encontrados pelo Hibernate Validator, veja a listagem 11 e 12 para verificar um pequeno trecho da exceção.

Não é recomendável mas caso seja necessário, é possível desligar a pré validação atribuindo false a variável de configuração:
hibernate.validator.autoregister_listeners

Listagem 10: Classe LinhaTeste

public static void main(String[] args) {
Linha linha = new Linha();
linha.setIdLinha(new BigDecimal(10));
Session session = HibernateUtil.getSession();
session.getTransaction().begin();
session.save(linha);
session.getTransaction().commit();
HibernateUtil.getSession().close();
}


Listagem 11: exceção lançada pela validação do Hibernate
Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: org.hibernate.validator.test.hibernateIntegracao.Linha.codigo
...

Listagem 12: exceção lançada pela validação do Hibernate
Exception in thread "main" org.hibernate.validator.InvalidStateException: validation failed for: org.hibernate.validator.test.hibernateIntegracao.Linha
...

Camada de apresentação

JBoss Seam é um poderoso framework para a construção de aplicações Web 2.0, unificando e integrando tecnologias como: AJAX, JSF, EJB3, Java Portlets e BPM. Este projeto é desenhado para eliminar a complexidade destas arquiteturas, de maneira a possibilitar os desenvolvedores criar aplicações web simplesmente anotando classes POJOs [7].

JavaServer Faces é um framework MVC, também para desenvolvimento de aplicações Web, que permite o desenvolvimento de aplicações para internet ao estilo Delphi, (arrastando e soltando). Considerado por muitos, a última palavra em desenvolvimento Web, resultado obtido pela maturidade de tecnologias como JSP/Servlet (Model1), Model2 (MVC) e Struts.

Trabalhando juntas, as tecnologias JSF e JBoss SeamÔ pode-se disparar o processo de validação até a camada de apresentação usando as tags e , desta forma, enquanto as regras são expressas no model as mensagens de erro são apresentadas na view, sem duplicação para o usuário, um exemplo de utilização desta tag encontra-se na listagem 13, veja também documentação do JBoss SeamÔ para maiores detalhes.

Listagem 13: visualizando as mensagens de erro com JSF

< s:validateAll>
< div>
Telefone:
< h:inputText value="#{validator.phone}" required="true" />
< /div>
< /s:validateAll>


JSR 303: Bean Validation
Bean Validation, já aprovada e prevista para a versão 7 do Java, deverá padronizar a definição de validadores, regras de validação e afins. Baseado em annotations e descritores XML, este novo recurso fornecerá em tempo de execução meios de checar e validar as propriedades de classes persistentes. Para validações mais comuns e simples, serão utilizadas annotations, enquanto casos mais complexos ou regras de negócios específicas utilizarão um descritor XML para configurar a validação [1].

Fortemente inspirada no Commons-Validator, Hibernate Validator e XWork Validation Framework, a JSR 303 poderá ser utilizada não somente em aplicações web, mas também em aplicações desktop e para a camada de persistência, permitirá o envio mensagens de erros internacionalizadas, e também a personalização através da classe ResourceBundle.

O líder deste sub-projeto (Hibernate Validator) é um dos membros da JSR 303, por isto podemos esperar que esta nova especificação do Java seja bem semelhante ao que descrevemos neste artigo.


Considerações Finais

Consistência de dados, testes e validação, são itens dos quais todos precisamos, mais cedo ou mais tarde a esta necessidade “bate nossa porta”, é nesta hora que precisamos tomar a decisão de qual tecnologia e estratégia adotar. O Hibernate Validator fornece um tratamento bem interessante, como ela é fortemente ligada a Bean Validation, acreditamos que vale, e muito, dedicar algumas horas para a pesquisa e aprendizado deste recurso, não somente porque é algo que está por vir no Java 7, mas porque este tende a ser um padrão no desenvolvimento de aplicações.

Para facilitar a vida do leitor, está disponível para download um projeto eclipse com os fontes utilizados para validar as informações contidas neste material. Nele você encontrara exemplos de validações, incluindo até mesmo algumas que não foram extensivamente exploradas neste texto. É importante ressaltar que muitos dos códigos foram retirados ou modificados dos próprios testes unitários (JUnit) do Hibernate Validator, por isto, caso o leitor queira ter acesso aos originais basta buscar direto na fonte.


Referências

[1] JSR 303: Bean Validation http://jcp.org/en/jsr/detail?id=303
[2] Hibernate - http://www.hibernate.org
[3] Commons-Validator - http://jakarta.apache.org/commons/validator
[4] XWork Validation Framework - http://wiki.opensymphony.com/display/XW/Validation+Framework
[5] API da classe ResourceBundle
[6] Internacionalization support - http://java.sun.com/javase/6/docs/technotes/guides/intl/index.html
[7] http://www.jboss.com/products/seam

quinta-feira, 1 de maio de 2008

Oque é ser programador?

Ser um programador nada mais é doque um transformador, assim como uma planta faz fotosintece(como escreve isso?) transformando agua e luz solar em seu próprio alimento, o orogramador transforma café em linhas de código

Continuous Integration

i believe that is a important paradigm....

An important part of any software development process is getting reliable builds of the software. Despite its importance, we are often surprised when this isn't done. We stress a fully automated and reproducible build, including testing, that runs many times a day. This allows each developer to integrate daily thus reducing integration problems.


http://www.martinfowler.com/articles/continuousIntegration.html

Coleção de exemplos e templates reutilizaveis com JEE 5

Now i'll indicate to you a p4j5 project, this project is a collection of samples and reusable templates which demonstrates patterns, approaches and architectural ideas for the Java EE 5 platform.


https://p4j5.dev.java.net/

http://www.adam-bien.com/tdb

SOA x ESB, oque?

Original: http://www.guj.com.br/posts/list/77933.java

Encontrei no forum uma explicação bastante clara sobre o assunto, leiam...


Pois bem. Primeira coisa que deve ser entendida sobre SOA (Arquitetura Orientada a Serviços) é que SOA não é um produto, ela é simplesmente um paradigma. Do mesmo jeito que programação orientada a objetos é um paradigma, e não um produto. Dito isso, outro ponto importante a ser levado em consideração é que SOA está na moda. Por isso você verá muitas empresas por aí (IBM, Oracle, BEA e outras) vendendo SOA, empurrando SOA para os seus clientes goela abaixo. Isso é uma enganação. SOA não é um produto e portanto não pode ser vendida. SOA é algo que você terá que implementar na prática, por si só, ou junto com a sua equipe de desenvolvimento. O que essas empresas podem lhe fornecer será no máximo algumas ferramentas, frameworks, bibliotecas para facilitar o seu trabalho.

Outro ponto importantíssimo é entender se você realmente precisa de SOA, ou seja, quando é que SOA se torna necessária de fato?

SOA é um paradigma para grandes sistemas distribuídos de proprietários e tecnologias diferentes! Se este não for o seu caso, você não precisa de SOA!

Voltando agora para a sua pergunta e levando em consideração as afirmações acima:

O que é um ESB (Enterprise Service Bus)?

Nada melhor para explicar um conceito "novo" do que através de um exemplo. Suponha a seguinte situação. Uma empresa X possui um sistema de grande porte desenvolvido em Java (JEE, EJB e outros). Essa empresa X adquire uma empresa Y que por sua vez utiliza tecnologia .NET. A empresa possui um sistema de CRM que necessita, por alguma motivo, obter informações dos dois sistemas para que possa fazer algum processo de atendimento ao cliente. Para fazer isso você teria várias opções, poderia conectar os dois sistemas diretamente, poderia desenvolver uma classe (ou todo um pacote de classes) que faça acesso aos dois sistemas.

Com tempo, à medida que surgissem outras necessidades de conectar esses dois sistemas, você acabaria por ter uma confusão geral de sistemas acessando outros sistemas. Um caos de verdade. Para evitar isso, entra o papel de ESB, que neste caso seria um "negociador", seria uma "interface" para a qual você iria solicitar a execução de alguns processos, consultas, etc. Ou seja, um elemento intermediário que seria responsável por conectar sistemas diferentes. O seu sistema Java nem tomaria conhecimento de que o outro sistema é feito em .NET ou em qualquer outra tecnologia, porque ele se comunicaria apenas com o ESB, o qual por sua vez teria o papel de se conectar a esses outros sistemas. Resumidamente, ESB seria uma abstração dessa interconexão de sistemas que usam tecnologias diferentes.

A maneira mais comum de se implementar um ESB hoje é através de Web Services, mas isso não é regra, existem outras formas de se realizar a mesma atividade. (ESB <> Web Services).

Se ainda não está claro o que é um ESB, vamos tentar entrar mais na parte prática da coisa, vamos imaginar o que poderia ser um ESB. Ele poderia muito bem ser um sistema "independente" desenvolvido em .NET que disponibiliza uma séria de Web Services e que se conecta a vários backends usados pela empresa. (Usei exemplo de .NET em um fórum Java de propósito, para destacar que SOA é independente de tecnologia usada). Como Web Sevices são um padrão (tudo bem que esse padrão ainda possui diversas coisas "não padronizadas", mas é possível seguindo boas práticas e alguns padrões já estabelecidos alcançar um resultado bom), o seu sistema Java poderia se conectar a esse "ESB.NET" atráves de Web Services e obter o resultado desejado.

Só para concluir e para ficar bem claro:
SOA é um paradigma e não um produto.

Se alguém chegar dizendo que tem uma solução SOA pronta para sua empresa, isso é mentira.

ESB é o coração de uma arquitetura SOA, é o ponto de interconexão entre sistemas que usam tecnologias diferentes.

SOA está na moda, cuidado ao adquirir "produtos prontos".

Web Services são apenas uma maneira dentre outras para implementar tal arquitetura (embora de longe a mais usada).

Espero ter esclarecido para você e para outros leitores deste fórum alguns conceitos de SOA.

sexta-feira, 11 de abril de 2008

TESTE PARA DESCOBRIR SUA PERSONALIDADE

TESTE PARA DESCOBRIR SUA PERSONALIDADE



1. Quando você se sente melhor?
(a) pela manhã
(b) durante a tarde e final de tarde
(c) tarde da noite

2. Você normalmente caminha
(a) bastante rápido, com passos longos,
(b) bastante rápido, com passos curtos e ligeiros,
(c) menos rápido e cabeça para cima, olhando o mundo de frente
(d) menos rápido, com a cabeça para abaixo
(e) muito lentamente

3. Ao falar com pessoas você
(a) fica de puê com seus braços dobrados
(b) fica com suas mãos apertadas (fechadas)
(c) com uma ou ambas mãos em seus quadris
(d) toca ou empurra a pessoa a quem você está falando
(e) brinca com sua orelha, toca seu queixo, ou alisa seu cabelo

4. Ao relaxar, você se senta com
(a) seus joelhos dobrados juntos lado a lado com suas pernas
(b) cruza suas pernas
(c) com suas pernas esticadas ou abertas
(d) uma perna debaixo de você

5. Quando algo realmente o fizer rir, você reage com
(a) uma gargalhada,
(b) uma risada, mas não muito alta
(c) um quieto riso
(d) um sorriso embaraçado

6. Quando você vai para uma festa ou reunião social, você..
(a) faz uma entrada chamativa assim todo o mundo o nota
(b) faz uma entrada quieta, enquanto procura conhecidos
(c) faz uma entrada mais quieta, tentando ficar desapercebido

7. Você está trabalhando muito firme, muito concentrado, e te interrompem. Você:
(a) dá boas vindas à interrupção
(b) fica extremamente irritado
(c) varia entre este dois extremos

8. O qual das cores seguintes você gosta mais?
(a) vermelho ou laranja
(b) preto
(c) amarelo ou azul claro
(d) verde
(e) escuro azul ou roxo
(f) branco
(g) marrom ou cinza

9. Quando você já está na cama, nesses últimos momentos antes de ir dormir, você deita
(a) reto de costas
(b) reto de bruços
(c) em seu lado, ligeiramente curvo
(d) com sua cabeça em um braço
(e) com sua cabeça debaixo das cobertas

10. Você freqüentemente sonha que você está
(a) caindo
(b) lutando ou discutindo
(c) procurando algo ou alguêm
(d) voando ou flutuando
(e) você normalmente não tem sonhos (não lembra)
(f) seus sonhos sempre são agradáveis

PONTOS:
1. (a) 2 (b) 4 (c) 6
2. (a) 6 (b) 4 (c) 7 (d) 2 (e) 1
3. (a) 4 (b) 2 (c) 5 (d) 7 (e) 6
4. (a) 4 (b) 6 (c) 2 (d) 1
5. (a) 6 (b) 4 (c) 3 (d) 5 (e) 2
6. (a) 6 (b) 4 (c) 2
7. (a) 6 (b) 2 (c) 4
8. (a) 6 (b) 7 (c) 5 (d) 4 (e) 3 (f) 2 (g) 1
9. (a) 7 (b) 5 (c) 4 (d) 2 (e) 1
10.(a) 4 (b) 2 (c) 3 (d) 5 (e) 6 (f) 1

Agora some o número total de pontos.


MAIS DE 60 PONTOS:

Outros o vêem como alguêm que eles deveriam tomar cuidado "que você uê visto como vaidoso, egocêntrico, e que uê extremamente dominante. Outros podem o admirar, desejando que eles poderiam estar mais como você, mas não confiam sempre em você, hesitando de se tornarem muito envolvidos com você.


51 A 60 PONTOS:
Outros o vêem como uma pessoa personalidade altamente volátil, bastante impulsiva; um líder natural que uê rápido em tomar decisões, entretanto não sempre certa. Eles o vêem como tipo arrojado e aventureiro, alguêm que tentará qualquer coisa uma vez; alguêm que se arrisca e desfruta uma aventura. Eles gostam de estar em sua companhia por causa da excitação que você radia.


41 A 50 PONTOS:
Outros o vêem como vivo, encantador, divertido, prático, e sempre interessante; alguêm que constantemente está no centro da atenção, mas suficientemente sensato não deixar isto subir para a cabeça. Eles tambuêm o vêem como amável, considerado, e compreensivo; alguêm que sempre os animará e os ajudará.


31 A 40 PONTOS:
Outros o vêem como sensato, cauteloso, cuidadoso e prático. Eles o vêem como inteligente, talentoso, ou abençoado, mas modesto. Uma pessoa que não faz os amigos muito depressa ou facilmente, mas alguêm que uê extremamente leal aos amigos, e que espera a mesma lealdade em retorno. Esses que realmente conseguem sabem que é difícil abalar sua confiança em seus amigos, mas igualmente que leva muito tempo para superar isto se aquela confiança foi quebrada.


21 A 30 PONTOS:
Seus amigos o vêem como diligente e nervoso. Eles o vêem como muito cauteloso, extremamente cuidadoso. Realmente os pega de surpresa se você faz algo impulsivamente ou no afã do momento, esperando que você examinasse tudo cuidadosamente de todos os lados e então, normalmente, decide contra isto. Eles pensam que esta reação é causada em parte por sua natureza cuidadosa.


ABAIXO DE 21 PONTOS:
As pessoas pensam que você é tímido, nervoso, e indeciso, alguêm que precisa pensar mais, que sempre quer que outra pessoa tome as decisões e que não quer se envolver com qualquer um ou qualquer coisa. Eles o vêem como um preocupado que sempre vê problemas que não existem. Algumas pessoas pensam que você é enfadonho. São os que conhecem bem sabem que você não é.

Você tem raciocinio lógico?

Continue a sequência de números apresentados.

Tente fazer esse teste em cinco minutos.


1-) 1322543210, 1344543210, 1366543210,
A) 1388543211
B) 1366543211
C) 1388543210
D) 1300543210

2-) 1234567890, 6789012345, 1234567890,
A) 6789012345
B) 1234567890
C) 2345678901
D) 7890123456

3-) 1234678125, 1236784125, 1237846125,
A) 1234678126
B) 1234678125
C) 1238467125
D) 1234678251

4-) 2938204185, 3938204184, 4938204183,
A) 1938204182
B) 5938204182
C) 5938204183
D) 5938204186

5-) 5494859485, 5496959406, 5498059427,
A) 5494859448
B) 5490159427
C) 5490159448
D) 5494859485

6-) 4356787874, 4361787879, 4366787884,
A) 4361787889
B) 4351787889
C) 4377787889
D) 4371787889

7-) 4135646789, 2115444769, 6155848709,
A) 4135646789
B) 8175040729
C) 0195242749
D) 2115444769

8-) 4564310041, 4575533341, 4586756641,
A) 4597867741
B) 4597979941
C) 4597978841
D) 4597869941

9-) 4594594854, 9594594859, 9894594889,
A) 4894594854
B) 4894594884
C) 9874594789
D) 9594594859

10-) 3429857414, 3021827314, 3122837415,
A) 3220817315
B) 3323847315
C) 3428807315
D) 3223847516
















Resultado:
1=C 2=A 3=C 4=B 5=C 6=D 7=A 8=B 9=C 10=D






10 Acertos
Você é a lógica em pessoa. O que está esperando para se tornar PHD em física ou
matemática?

8/9 Acertos
Você uê extremamente lógico, pode ser um grande engenheiro ou químico.

6/7 Acertos
Bom em lógica, você está apto à informática, direito ou economia.

4/5 Acertos
Sua lógica uê regular, pode trabalhar em qualquer ramo, mas evite a área de exatas para
não sofrer.

2/3 Acertos
Lógica deficiente, mantenha distância de tudo que lembre matematica. Faça letras,
história ou geografia.

0/1 Acertos
Seu futuro é ser revolucionário, psicólogo, sociólogo, reporter ou ator. Quanto
mais viagem, melhor.



Quantos você acertou em 5 minutos?

Eu acertei 5 :( será que tenho de mudar de profissão?

sábado, 15 de março de 2008

Utilidade pública

Sábado , 15 de Março de 2008

Alerta ao consumidor
No dia internacional do consumidor, O Jornal Hoje faz um alerta para quem tem seguro de carro. Você pode estar sendo lesado, sem saber. O Ministério Público já comprovou o envolvimento de seguradoras em crimes como estelionato e falsificação de documentos.







Numa lista, estão alguns dos muitos consumidores lesados pelas seguradoras. O publicitário Fernando Domingos que também foi vítima de uma dessas empresas faz parte de uma ONG criada para dar voz a essas pessoas. “Eu comecei a pesquisar e quando eu comecei essa investigação eu vi que eram dezenas de pessoas que passaram a centenas e milhares de pessoas como eu”, conta.

O Ministério Público de São Paulo já comprovou a prática de diversos crimes e está processando as seguradoras por estelionato, falsificação de documento público, ameaça a consumidores, coação de testemunhas, provas forjadas e formação de quadrilha ou bando. “Os representantes de seguradoras e os policiais abordam o consumidor e deixam bem claro ou você desiste do recebimento do seguro ou então você será indiciado e processado por estelionato, porque nós temos um documento paraguaio de compra e venda do seu veículo na data que você disse que havia sido furtado”, diz o promotor José Luiz Bednarski.

Dona Maria Isabel passou por isso. Na delegacia onde foi denunciar o roubo do carro do filho foi acusada e humilhada. “Disse que eu era a chefe da quadrilha internacional”, conta.

Além desses crimes, a seguradora também lucra com a desinformação dos consumidores. Está no contrato que a franquia do seguro só precisa ser paga quando você amassar o carro. Se você bater num outro veículo o reparo dos danos desse terceiro veículo deve ser feito pela seguradora sem nenhuma franquia. Só que pouca gente sabe disso.

O presidente do sindicato das oficinas de São Paulo encaminhou várias denúncias á secretaria da Justiça. “É um círculo que tem colocado principalmente a vida do consumidor em risco”, diz.

O Jornal Hoje procurou a superintendência de seguros privados para falar sobre as acusações do Ministério Público, mas não tivemos resposta.

sexta-feira, 29 de fevereiro de 2008

Cursos Gratuitos Online

A Fundação Bradesco através do portal Escola Virtual oferece cursos online sobre Lógica Orientada a Objetos, C++, HTML, Java Script, Redes, entre outros.
Os cursos são gratuitos e o aluno em direito a um certificado de conclusão.

Além disso a fundação também oferece um curso semipresencial em parceria com a Cisco para certificação CCNA e CCNP , uma ótima oportunidade de se especializar em roteamento e gerenciamento de redes de grande porte ;)


Lista dos cursos oferecidos Cursos


http://www.escolavirtual.org.br/

quarta-feira, 27 de fevereiro de 2008

Dica de certificação.

Se você está para perder o seu voucher porque ele vai expirar leia esta dica.

Digamos que seu voucher irá expirar em 29/02/2008 e hoje é 27/02/2008, digamos também que além de você não ter se preparado para a prova, você está impossibilitado de se deslocar até o centro autorizado mais próximo para realizar sua prova.

Um simples e breve pensamento deve tomar conta se seu sub-conciênte: " FUDEU! "

Calma, calma. Não criemos cânico.

Recentemente descobri que você tem até o dia 29/02/2008 para agendar o seu teste, esta data não é a data máxima para realização da prova.

Novamente seu sub-conciênte toma conta e um pensamento toma conta do seu eu: " COMO NÃO, TODO MUNDO FALA QUE É ASSIM, PORRA! TA LOCO?" .

Calma, calma. Não criemos cânico, eu explico.

Como havia dito, você tem até o dia 29/02/2008 para agendar o seu teste, e para não perde-lo siga os seguinte passos:

- Vá ao site da Prometric e agende o seu teste para a data mais longe possível, normalmente dois meses para frente.

Desta forma você tem dois meses para se preparar e realizar seu teste. Neste ponto você já ganhou dois meses de tempo, ou seja, totalizando quatorze meses ná prática e não os doze de costume.

Se em dois meses você ainda não conseguiu se organizar e fazer seu teste, siga o próximo passo.

- Vá novamente ao site da Prometric e reagende o seu teste para data mais longe possível. Novamente, dois meses para frente.

Desta forma você tem novamente mais dois meses para realizar o seu teste, ou seja você ganhou, na prática, dezesseis meses para fazer seu teste.

Não consegui verificar se existe limite para o reagendamento, então se neste tempo você ainda não conseguiu se organizar e se preparar para o teste repita o reagendamento :D


É CLARO QUE A MELHOR DICA AQUI É NÃO DEIXAR CHEGAR E ESSE PONTO :D

domingo, 24 de fevereiro de 2008

Management of Project

Sempre falo de algumas experiências que tive como gerente de projeto eu não adotei uma filosofia única de desenvolvimento, sempre achei que ficar preso em um processo específico é ruim ao projeto e por isso sempre preferi analisar o projeto como um todo e pegar partes dos processos que mais se adequavam ao problema.

Recentemente descobri que Ivar Jacobson (um dos pais da UML e do RUP) evangeliza que o importante não é o processo em si e sim as praticas, outra coisa que descobri é que o cara está cansado de processos. O que Ivar propõe é o foco no uso de práticas que fazem sentido.

Bom... acredito que no final eu não estou tão errado em defender esta forma de trabalhar afinal, o gande Ivan Jacobson com suas décadas de experiência na área pensa como eu.

Não deixe para depois - tech debt

Nos projetos de software sempre há algum nível de tech debt. Sempre a mesma história: não temos tempo para isso agora, na próxima oportunidade corrigimos.

O problema é que em muitos casos o acúmulo de coisas que deixamos pelo meio do caminho é prejudicial à saúde do projeto. Mais que preciosismo de nerds e perfeccionistas, tech debt pode –e geralmente vai- atrasar o andamento do time.

É bom alocar um orçamento para resolver estes problemas. Durante o planning game é importante deixar claro que precisamos resolver problemas enquanto estamos implementando funcionalidades e geralmente alocar alguns pontos na iteração para eles, normalmente algo perto de 20% do trabalho. Normalmente é aceitavel que estas histórias técnicas tenham prioridade baixa e no geral tudo ocorre bem.

No caso de uma emergência então costuma-se não ser muito flexível em relação à solução do problema. As histórias técnicas neste caso ganham prioridade máxima dentro da iteração.

Como geralmente o cliente está satisfeito com a velocidade da equipe num processo ágil (se não está há outro problema) quando sobra –e quase sempre sobra- tempo extra numa iteração geralmente eu preenche-se com tech debt, e em especial deixa-se os desenvolvedores priorizarem o que querem fazer. Muitas vezes não dá tempo para fazer homologação destas mudanças durante a iteração vigente e elas acabam indo para produção apenas na iteração posterior, mas é uma boa estratégia.

O que importa é não deixar o tech debt acumular. Se há duvidas dos problemas que o acúmulo de histórias técnicas causam basta lembrar a última vez que você entrou em um projeto para dar manutenção em um sistema pré-existente. Eu nunca vi um caso onde o sistema antigo não tenha toneladas de problemas causados por “deixar para depois” mudanças que não eram urgentes mas foram crescendo em urgência com o tempo.


Copiei e mudei algumas palavras para passar a mensagem que que gostaria de passar a todos vocês.


tech debts

quinta-feira, 7 de fevereiro de 2008

Por que devo contratar você?

a jornalista Mary Pratt, da edição norte-americana do COMPUTERWORLD, entrevistou alguns executivos de TI sobre suas perguntas favoritas durante uma entrevista de emprego. Saiba o que eles responderam.

Boa leitura

terça-feira, 29 de janeiro de 2008

Sobre entrevistas

Hoje vou indicar a leitura de dois posts que falam sobre entrevistas. Os posts falaram sobre as esperiências dos autores, não que elas sejam um regra a todas as ocasiões, mas acredito que seja uma boa fonte de conhecimento sobre o assunto.

então... vamos a leitura...

sobre entrevistas

sobre entrevistas 2

sexta-feira, 25 de janeiro de 2008

Cargos e salários

Veja qual a relação de Cargos e Salários de acordo com o site http://www.elancers.net


Analista de Sistemas Júnior
Geral: R$ 3.194,00
Grande Porte: R$ 3.125,00
Indústria: R$ 3.296,00
Serviço: R$ 3.092,00
Saúde: R$ 3.004,00


Analista de Sistemas Pleno
Geral: R$ 4.525,00
Pequeno Porte: R$ 4.078,00
Médio Porte: R$ 4.528,00
Grande Porte: R$ 4.553,00
Indústria: R$ 4.297,00
Comércio: R$ 4.661,00
Serviço: R$ 4.316,00
Saúde: R$ 4.227,00


Analista de Sistemas Sênior
Geral: R$ 6.660,00
Médio Porte: R$ 6.931,00
Grande Porte: R$ 6.506,00
Indústria: R$ 6.246,00
Construção: R$ 6.340,00
Comércio: R$ 6.558,00
Serviço: R$ 6.138,00
Saúde: R$ 6.371,00


Analista de Suporte Técnico Júnior
Geral: R$ 2.807,00
Pequeno Porte: R$ 1.863,00
Médio Porte: R$ 2.653,00
Grande Porte: R$ 2.857,00
Indústria: R$ 2.428,00
Comércio: R$ 2.418,00
Serviço: R$ 2.953,00
Saúde: R$ 2.541,00


Analista de Suporte Técnico Pleno
Geral: R$ 4.216,00
Médio Porte: R$ 3.931,00
Grande Porte: R$ 4.180,00
Indústria: R$ 3.913,00
Comércio: R$ 3.186,00
Serviço: R$ 4.077,00
Saúde: R$ 2.613,00


Analista de Suporte Técnico Sênior
Geral: R$ 5.760,00
Médio Porte: R$ 4.949,00
Grande Porte: R$ 5.721,00
Indústria: R$ 5.604,00
Serviço: R$ 5.519,00


Coordenador de Projetos
Geral: R$ 4.922,00
Grande Porte: R$ 5.116,00
Construção: R$ 5.079,00


Gerente de Desenvolvimento de Sistemas
Geral: R$ 12.040,00
Grande Porte: R$ 11.796,00
Indústria: R$ 11.883,00
Serviço: R$ 11.759,00

segunda-feira, 21 de janeiro de 2008

9 Best Practices for Home-Based Web Workers

In this post, i am going to indicate nine practices for Home-Based web workers...

If you can be difficult to keep work and personal life from blending into one big mess, you need read this article.




read this full article

Segredos para motivar equipes

Hoje vou indicar alguns pontos importantes para a motivação da equipe, pontos estes que já venho defendendo a algum tempo, aqueles que me conhecem sabe que eu sempre procurei de alguma forma suprir alguns destes itens da forma que for possível.

Veja alguns pontos relatados no artigo:


- Salário compatível com o de mercado
- Participação nos lucros
- Plano de cargos e salários
- Perspectiva de crescimento
- Treinamento e capacitação
- Tratar também dos problemas e anceios pessoais do profissional

Veja o material completo....


Segredos para motivar equipes

segunda-feira, 14 de janeiro de 2008

Onze passos para transformar-se em um programador de excelência

Resumidamente são este os pontos descritos pelo autor....

1. Apaixonar-se pela atividade.
2. Desenvolva sua inteligência.
3. Investigue todas as funcionalidades de seus editores.
4. Utilize algum sistema de controle de versões.
5. Não perca tempo escrevendo códigos para problemas que muita gente já deve ter resolvido.
6. Divida para conquistar.
7. Tenha poucas e boas fontes.
8. Tenha gana de aprender.
9. Estude diversas tecnologias.
10. Controle o desencanto.
11. Você ainda é um humano.




Leia o original para ter mais detalhes...

Onze passos para transformar-se em um programador de excelência

Como identificar bons programadores?

Um artigo de Paul Graham fala dos 18 erros que podem levar projetos ao fracasso. Entre os erros ele cita a contratação de péssimos programadores como um dos fatores. Assim este texto fala justamente de como reconhecer os bons programadores


Indicadores positivos:

1. Apaixonado por tecnologia
2. Programa por Hobby
3. Participa de discussões técnicas
4. Possui projetos pessoais em paralelo
5. Aprende novas tecnologias por conta própria
6. Tem a capacidade de opinar qual a melhor tecnologia para cada tipo de uso.
7. Sente desconforto em trabalhar com uma tecnologia na qual ele não crê que seja "ideal"
8. Esperto e capaz de conversar sobre vários assuntos.
9. Começou a programar bem antes de entrar na faculdade
10. Conhece várias tecnologias (algumas podem nem estar presentes no seu Curriculum)


Indicadores Negativos:

1. Programa apenas no trabalho
2. Não quer ou não gosta de participar de debates técnicos
3. Somente aprende novas tecnologias quando a empresa paga cursos
4. Está feliz em trabalhar com qualquer tecnologia. "Toda tecnologia é boa"
5. Não parece ser "esperto"
6. Começou a programar na faculdade
7. Toda sua experiência de programação está no Curriculum
8. Focado em apenas 1 ou 2 tecnologias sem experiência fora delas.

quarta-feira, 2 de janeiro de 2008

Teste de QI

Recebi agora pouco por e-mail, achei legal o brinquedinho.

Levei +- 2 segundos pra conseguir achar o maluco que ta escondido ali (sim, eu cronometrei) E vcs? quanto tempo levaram?


Você consegue achar um homem nessa foto em 3 segundos?

De acordo com experiências médicas:
Se você conseguir achar o homem em três segundos, o lado direito de seu cérebro é mais desenvolvido do que o cérebro de pessoas normais.
Se você conseguir achar o homem em 1 minuto, o lado direito de seu cérebro é normalmente desenvolvido.

Se você conseguir achar a cabeça do homem em 1 a 3 minutos, o lado direito de seu cérebro está reagindo lentamente, e você deveria ingerir mais proteína.

Se conseguir achar o homem somente em 3 minutos ou mais, o lado direito de seu cérebro é um desastre, extremamente lento, e a única sugestão é: assista a mais desenhos animados para ajudar a desenvolver o lado direito de seu cérebro.

Isso não é piada, tem um homem realmente lá na foto! Já achou?


Oque sigfica ter o lado direito mais desenvolvido que a maioria das pessoas? Não faço idéia, mas se você descobrir, me diga :D


clique para ver a imagem

Expressividade no Código

Hoje vou recomendar a leitura deste post -> "Expressividade no Código"

Veja um trexo do que você vai encontrar neste post....

"E logo surge alguém sugerindo que deveria haver documentação. Existem casos onde documentação, seja JavaDoc, especificação funcional ou etc. é fundamental mas neste caso é diferente. JavaDoc, especificação textual e etc. devem ser uma fonte importante quando que está interessado nessa informação não vai lero código, é como reutilizar uma biblioteca ou um framework. Ninguém quer abrir o Spring para entender como utilizá-lo, precisamos de documentação para isso."

Muito bem dito não é mesmo?
O trexo acima é importante de se ter em mente, principalmente quando você se confronta com um gerente que não sabe pra que serve uma documentação, e ele te afirma que basta olhar a documentação, que a tarefa deve ser feito rapidamente em alguns minutos, afinal a documentação esta bem escrita e com ela o desenvolvedor deve conseguir encontrar o problema e soluciona-la sem grandes problemas..... tcs tcs tcs.


Expressividade no Código