Hospedagem Profissional

Hospedagem Profissional
Clique aqui e ganhe US$ 10,00 para testar durante 1 mês a melhor hospedagem: Digital Ocean!

quinta-feira, 11 de dezembro de 2008

20 DICAS PARA O SUCESSO PESSOAL


01. Elogie três pessoas por dia.
02. Tenha um aperto de mão firme.
03. Olhe as pessoas nos olhos.
04. Gaste menos do que ganha.
05. Saiba perdoar a si e aos outros.
06. Trate os outros como gostaria de ser tratado.
07. Faça novos amigos.
08. Saiba guardar segredos.
09. Não adie uma alegria.
10. Surpreenda aqueles que você ama com presentes inesperados.
11. Sorria.
12. Aceite sempre uma mão estendida.
13. Pague suas contas em dia.
14. Não ore para pedir coisas. Ore para agradecer e pedir sabedoria e coragem.
15. Dê às pessoas uma segunda chance.
16. Não tome nenhuma decisão quando estiver cansado ou nervoso.
17. Respeite todas as coisas vivas, especialmente as indefesas.
18. Dê o melhor de si no seu trabalho.
19. Seja humilde, principalmente nas vitórias.
20. Jamais prive uma pessoa de esperança. Pode ser que ela só tenha isso.
Por Luiz A.. Marins Filho

quinta-feira, 4 de dezembro de 2008

Connect IIS 6 to Tomcat 5

I needed to set up a simple distributed system consisting of an outward facing, secured IIS 6 web server and an internal, dedicated Flex server running under Tomcat 5. There is a lot of documentation out there but that in itself is a problem. It is difficult to know what really applies and what is out of date. I just successfully set up several such systems using the Tomcat <==> IIS connector. Following are the steps I took, and comments and tips about what I have learned.


Here is a link to the connector documentation index, if you want to do this the hard way:

http://jakarta.apache.org/tomcat/connectors-doc/


First the problem in a nutshell:


You can happily call your Flex applications from an IIS application (like ASP.NET) on an internal development system by using the host name (or IP address) and the port number. For example, in a custom wrapper this will work:

http://myFlexServer:8080/flex/myApp/myFile.mxml.


However, if you try to use that custom wrapper from outside the firewall, in other words, from the internet, you will find that port 8080, and most others, are blocked, and you cannot access your Flex application.


One solution is a "Jakarta Tomcat Connector", which directs calls to your Flex app through the IIS web server to the Flex/Tomcat server. You can do the same this with JRUN, and, I suspect, other J2EE servers as well. This connector allows you to use the IIS web server in the URL to the Flex app, without requiring any port specifications to gag the firewall. So the URL

to a Flex app like in the example above becomes:

http://www.myIISWebServer.com/flex/myApp/myFile.mxml.


How does a “connector” work? There are IIS and Tomcat parts. The Tomcat side is already set up for you in ...\Tomcat 5.0\conf\server.xml, whose job it is to create Tomcat "listeners" on specified ports. It sets up the normal listener on, for example, port 8080, but it also sets up a special listener on port 8009.
In fact, if you have the Tomcat log level set to "Info" (the "Monitor Tomcat" menu/dialog, logging tab), you can look in the log: ...\Tomcat 5.0\logs\stdout.log, and see the line: "INFO: JK2: ajp13 listening on /0.0.0.0:8009"


But you can really just trust me, it is there.


On the IIS side, the connector works by using an "ISAPI" filter. This "filter" watches URL s for certain "contexts", and passes those contexts on to the specified handler dll. The simplest "context" is one of the folders under the Tomcat "webapps" folder.
For example, /flex/, and /samples/ (yes, these are the folders you think) are Tomcat contexts in a default flex install.


Setting up IIS to use Tomcat connector


You actually have to do some work now, but not as much as you would think by reading the documentation.

Note: You want to be working with the “JK” connector, NOT the JK2 connector, which has been deprecated. Never mind that the log shows JK2, or that there is a jk2.properties file in the Tomcat\conf folder, and that a google search will turn up a lot of people still using JK2.

First, obtain the connector installer: isapi_redirect-1.2.14.exe It is available from several locations including:

http://www.devlib.org/apache/jakarta/tomcat-connectors/jk/binaries/win32/jk-1.2.14/

Now run the install. There does not appear to be any documentation for the installer, but here is a link to a document that describes the manual method of what the installer does, plus troubleshooting and general info, just FYI.

http://jakarta.apache.org/tomcat/connectors-doc/howto/iis.html


Briefly, the install creates a folder structure and adds a few files to it, sets some registry entries, creates an IIS virtual directory, adds the isapi_redirect.dll to the IIS website ISAPI filters tab.
It should take care of all the steps listed in the above howto document under "Configuring the ISAPI Redirector".

Next add a Web Service Extension. This needs to be done manually because the install works for IIS 5 and 6, but “Web Service Extension” only applies to IIS 6.

  • Open the … Administrative Tools, Internet Information Services console.
  • In the tree on the left, click ” Web Service Extensions”
  • In the right hand pane, click “Add a new Web Service Extension”
  • For the Extension Name, enter: Jakarta Tomcat
  • Click the “Add” button.
  • Browse and select C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector\bin\isapi_redirector.dll
  • Click the “Allow” button. DO NOT MISS THIS STEP!
  • From the “Services” MMC, restart “IIS Admin”

Now, the install defaults to looking for a Tomcat listener on localhost. If your Tomcat is on a different server, as mine was, you will need to make a simple edit.


On the IIS web server, edit:

C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector\conf\workers.properties.minimal

Change the line that says:

worker.ajp13w.host=localhost

To:

worker.ajp13w.host= www.myIISWebServer.com


You can also use an IP address.
I do not know if a machine name will work.

Restart IIS.

At this stage we can test the tomcat examples, using this URL :

http://www.myIISWebServer.com/jsp-examples/index.html

If it loads we are good to continue. If not, you will need to look at the troubleshooting section of the howto/iis.html document.

If we are good to continue, we will next add the flex “context”. The following assumes a default Flex install, with your application in:

...\Tomcat 5.0\webapps\flex

Adding the "flex" context:


On the IIS web server, edit:

C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector\conf\uriworkermap.properties

In the # [URL ]=[Worker name] section, add this line:

/flex/*=wlb

Save the file.

Restart IIS.

Finally, test the connector with Flex using an URL like this:

http://www.myIISWebServer.com/flex/myApp/myFile.mxml.


Security caveat:


In our setup, where the flex app was called from a custom wrapper in a tightly secured ASP.NET application, adding the
connector / isapi redirector had the consequence of breaking the security on the Flex app because it can be called directly from the web.


The ideal solution would have been for the Tomcat container’s authorization module to read the ASP.NET forms security token to permit access. Regretfully, I have not been able to make this work yet.

Tracy Spratt

Fonte : http://www.cflex.net/showFileDetails.cfm?ObjectID=296

terça-feira, 2 de dezembro de 2008

Inovação

sexta-feira, 21 de novembro de 2008

Hibernate Criteria com subquery

É realmente impressionante como o Hibernate pode fazer consultas sql usando Criteria. Ontem precisei fazer uma consulta e cheguei à conclusão que seria necessário o uso de subquery.

Primeiro, fiz a consulta por um query console do meu banco para ter certeza. E um pouco descrente de que Criteria iria resolver o meu problema 100%, procurei por subquery na documetação do Hibernate.

Encontrei a solução e, para a minha surpresa, a consulta sql gerada foi exatamente a que eu havia feito no query console do meu banco de dados.

Então, vamos ao exemplo!

Suponhamos que temos registros de frutos e que, cada fruto contém uma lista de vitaminas:


Fruit: Pineapple
--Vitamins: [Vitamin C, Vitamin B6]
Fruit: Orange
--Vitamins: [Vitamin C, Vitamin B6]
Fruit: Banana
--Vitamins: [Vitamin C, Vitamin A]

Nossas classes, já mapeadas com annotations, ficariam assim:

Fruit.java:


JAVA:
  1. @SequenceGenerator(name = "sq_fruit", sequenceName = "sq_fruit")
  2. public class Fruit {

  3. @Id
  4. @GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_fruit")
  5. private Integer id;
  6. private String name;
  7. @ManyToMany(cascade = CascadeType.ALL)
  8. @ForeignKey(name = "fk_Fuit", inverseName = "fk_Vitamin")
  9. @JoinTable( name = "Fuits_Vitamins",
  10. joinColumns = @JoinColumn(name = "Fruit_id"),
  11. inverseJoinColumns = @JoinColumn(name = "Vitamin_id"))
  12. private List<Vitamin> vitamins;

  13. // getters, setters...

  14. }

Vitamin.java:


JAVA:
  1. @SequenceGenerator(name = "sq_vitamin", sequenceName = "sq_vitamin")
  2. public class Vitamin {

  3. @Id
  4. @GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_vitamin")
  5. private Integer id;
  6. private String name;

  7. // getters, setters...

  8. }

Em uma busca simples, poderíamos recuperar uma lista de todas os frutos que contém a vitamina C:


JAVA:
  1. Criteria criteria = session.createCriteria(Fruit.class, "fruit");
  2. criteria.createAlias("fruit.vitamins", "vitamin");
  3. criteria.add(Restrictions.eq("vitamin.name", "Vitamin C"), Criteria.LEFT_JOIN);

  4. List fruits = criteria.list();

  5. for (Fruit f: fruits) {
  6. System.out.println("Fruit: " + f.getName());
  7. System.out.println("--Vitamin: " + f.getName());
  8. }

Como pedimos, esta consulta retorna uma lista de frutos. Porém, cada fruto retornado conterá apenas uma vitamina: a vitamina C!


Fruit: Pinnapple
--Vitamin: Vitamin C
Fruit: Orange
--Vitamin: Vitamin C
Fruit: Banana
--Vitamin: Vitamin C

Foi exatamente o que pedimos quando adicionamos Restrictions.eq("vitamin.name", "Vitamin C") para a criteria.

Até aqui tudo bem, se apenas fossem necessárias os frutos. E se precisássemos agora fazer a mesma consulta (por "vitamica C"), mas gostariámos de ver todas as vitaminas que cada fruto contém? Usamos subquery!


JAVA:
  1. // todos frutos que contém a vitamina C
  2. DetachedCriteria dc = DetachedCriteria.forClass(Fruit.class, "fruit");
  3. dc.createAlias("fruit.vitamins", "vitamin", Criteria.INNER_JOIN);
  4. dc.add(Restrictions.eq("vitamin.name", "Vitamin C"));
  5. dc.setProjection(Property.forName("fruit.id"));

  6. // mas quero ver as outras vitaminas que o fruto tem
  7. Criteria criteria = session.createCriteria(Fruit.class, "fruit");
  8. criteria.createAlias("fruit.vitamins", "vitamin", Criteria.LEFT_JOIN);
  9. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
  10. criteria.add(Property.forName("fruit.id").in(dc));

  11. List list = criteria.list();

  12. for (Fruit fruit : list) {
  13. System.out.println("Fruit: " + fruit.getName());
  14. System.out.println("--Vitamins: " + fruit.getVitamins());
  15. }

O método in() da classe Property recebe uma DetachedCriteria. Uma DetachedCriteria nos permite criar uma consulta fora de uma sessão, para ser executada posteriormente em uma sessão arbitrária.

A saída no console, com o logger da query:


JAVA:
  1. Hibernate:
  2. select
  3. this_.id as id1_1_,
  4. this_.name as name1_1_,
  5. vitamins3_.Fruit_id as Fruit1_3_,
  6. vitamin1_.id as Vitamin2_3_,
  7. vitamin1_.id as id0_0_,
  8. vitamin1_.name as name0_0_
  9. from
  10. Fruit this_
  11. left outer join
  12. Fuits_Vitamins vitamins3_
  13. on this_.id=vitamins3_.Fruit_id
  14. left outer join
  15. Vitamin vitamin1_
  16. on vitamins3_.Vitamin_id=vitamin1_.id
  17. where
  18. this_.id in (
  19. select
  20. fruit_.id as y0_
  21. from
  22. Fruit fruit_
  23. inner join
  24. Fuits_Vitamins vitamins3_
  25. on fruit_.id=vitamins3_.Fruit_id
  26. inner join
  27. Vitamin vitamin1_
  28. on vitamins3_.Vitamin_id=vitamin1_.id
  29. where
  30. vitamin1_.name=?
  31. )

Fruit: Pineapple
--Vitamins: [Vitamin C, Vitamin B6]
Fruit: Orange
--Vitamins: [Vitamin C, Vitamin B6]
Fruit: Banana
--Vitamins: [Vitamin C, Vitamin A]

Tem outro exemplo aqui, usando Detached queries and subqueries.

Por Rodrigo Facholi em http://blog.dclick.com.br/2008/10/09/hibernate-criteria-com-subquery/pt/

segunda-feira, 3 de novembro de 2008

Mentawai 1.14.1 Lançada,babem !!!!


Galera, foi lançada a versão 1.14.1 do Mentawai, confesso que algumas das novidades realmente me deixaram muito feliz.

Velhas solicitaçãos dos adeptos deste framework foram atendidas, como o MentaBlank, a modelo do StrutsBlank, DateFilter para uma converção correta de dados do tipo data informados na jsp, e uma forma de mudar o usuário logado sem ter de fazer logoff antes, entre outras.

Mas algumas novidades que me surpreenderam foram :
- IPFilter
- ExecUtil
- ImageMinSizeRule
- ImageUtils
- SendLater
- DateUtils

Veja a lista completa de mudanças abaixo e suas respectivas explicações:

- Projeto MentaBlank.zip: ponto de partida facilitado para qualquer aplicação web com o Mentawai

- getStringValue, getBooleanValue, getIntValue, etc. são agora getString, getBoolean, getInt, etc.
Os métodos antigos foram depreciados.

- getStringValues e getIntValues são agora getStrings e getInts. Os métodos antigos foram depreciados.

- IpFilter para permitir o acesso a uma action de apenas requisições vindas de certos IPs.

- ExecUtil para permitir facilmente a execução de processos externos
(Java é muito pentelho em relação a isso...)

- ImageMinSizeRule para validar o tamanho (dimensão) mínimo de uma imagem recebida num request.

- ImageUtils para fazer crop, resize, conversão e outras operações com imagens que chegaram via upload.

- Possibilidade de configurar filtros específicos para uma ou mais classes de Action.
(Antes só podia especificar isso numa ActionConfig)

- sendLater para enviar email de forma assíncrona sem bloquear a requisição web.

- melhorias no tag de paginação (paginatorTag)

- loadListMinus e buildSelectMinus para permitir carregar uma lista de beans excluindo certos campos

- DateUtils para facilitar o trabalho com dates.

- FileUploadFilter atualizado para trabalhar com o último commons FileUpload (1.2.1)

- DateFilter para criar um java.util.Date a partir de um dia, mês e ano no input
(usando o locale correto)

- Listas padrão para dias do mês e anos (apenas números)

- DIFilter agora é AutoWiringFilter (antigo foi depreciado)

- método replaceUserSession para trocar o usuario da sessao sem reiniciar/invalidar a sessao

- não precisa mais especificar a classe do ApplicationManager no web.xml. O framework faz
um scan e descobre sozinho agora.

- setReloadable para recarregar o application manager quando este for modificado.
Precisa do excelente produto ZeroTurnaround

- correções de bugs e muitas outras melhorias

Para que não sabe oquê é o framework Mentawai, confira o seguinte post do nosso blog :
- http://i9webjava.blogspot.com/2008/10/voc-j-ouviu-falar-do-framework-mentawai.html

Mais informações :
- Site Oficial : http://www.mentaframework.org
- Forum Oficial : http://forum.mentaframework.org/forums/list.page

quarta-feira, 29 de outubro de 2008

Extreme Programming (XP)

Metodologia adequada a equipes pequenas (até 10 pessoas), parte do princípio de que a melhor documentação é o código fonte: qualquer outra documentação fica logo desatualizada e por isso perde a confiabilidade.

Baseada em práticas, como programação aos pares, semana de 40 horas e reuniões em pé. Frases conhecidas: 1) Sem um processo, só uma pessoa excepcional consegue desenvolver um sistema... Com muito processo,pessoas excepcionais não conseguem desenvolver sistemas excepcionais 2) Uma boa equipe pequena produz mais que grandes equipes

Desenvolvida em 1996 por Kent Beck, é uma metodologia bastante nova que renega todos os paradigmas do desenvolvimento tradicional de software. Para a XP®, a arquitetura do sistema é uma metáfora. A arquitetura é na verdade desenvolvida ao longo do projeto onde todo o código escrito é constantemente reconstruído para aumentar a simplicidade e objetividade do mesmo. A XP® vem ganhando inúmeros adeptos dentre os programadores mais experientes.

O manifesto Ágil

“Estamos evidenciando maneiras melhores de desenvolver software fazendo-o nós mesmos e ajudando outros a fazê-lo. Através desse trabalho, passamos a valorizar:- Indivíduos e interação MAIS QUE processos e ferramentas; - Software em funcionamento MAIS QUE documentação abrangente; - Colaboração com o cliente MAIS QUE negociação de contratos; - Responder a mudanças MAIS QUE seguir um plano. Ou seja, mesmo tendo valor os itens à direita, valorizamos mais os itens à esquerda.

As Práticas do XP

  • The Customer is Always Available - O cliente está sempre disponível para resolver dúvidas, alterar o escopo de uma iteração e definir prioridades.
  • Metaphor - O time se comunica sobre o software em termos de uma metáfora, caso consiga encontrar uma boa.
    Planning Game
    - Os jogadores do jogo do planejamento são o cliente e os técnicos. O objetivo: colocar em produção as funcionalidades de maior valor possível durante o decorrer do jogo.
  • Small Releases - O software é entregue em pequenas versões para que o cliente possa obter o seu ganho o mais cedo possível e para minimizar riscos.
  • Acceptance Tests - São definidos pelo usuário e são os critérios de aceitação do software.
  • Test First Design - Primeiro são escritos os testes, depois é feita a implementação e por último trabalha-se o design. Continuous Integration - Os diversos módulos do software são integrados diversas vezes por dia e todos os testes unitários são executados. O código não passa até obter sucesso em 100% dos testes unitários.
  • Simple Design- O código está, a qualquer momento, na forma mais simples que passe todos os testes.
  • Refactoring - A cada nova funcionalidade adicionada, é trabalhado o design do código até ficar na sua forma mais simples.
  • Pair Programming - Todo código de produção é desenvolvido por duas pessoas trabalhando com o mesmo teclado, o mesmo mouse e o mesmo monitor.
  • Move People Around - As duplas de programação são revezadas em média a cada 2h.
  • Collective Code Ownership - E equipe como um todo é responsável por cada arquivo de código. Não é preciso pedir autorização para alterar qualquer arquivo.
  • Coding Standards - Todo código é desenvolvido seguindo um padrão.
  • 40 Hour Week - Trabalhar por longos períodos é contraproducente.


Valores do XP

  • Simplicidade O design do software é simplificado continuamente. É isso que sustenta a premissa extrema. O processo em si também é adaptado, a cada dia, se alguém vir como torná-lo mais simples.
  • Comunicação Prefira: chat a eMail, telefonemas a chat, conversar pessoalmente a telefonemas, trabalhar na mesma sala a ter salas isoladas, trabalhar em conjunto a revisar o resultado final.
  • Coragem É preciso coragem para: apontar um problema no projeto, parar quando você está cansado, pedir ajuda quando necessário, simplificar código que já está funcionando, dizer ao cliente que não será possível implementar um requisito no prazo estimado, fazer alterações no processo de desenvolvimento. Ou seja, fazer a coisa certa mesmo que não seja a coisa mais popular naquele momento.
  • Feedback Todo problema é evidenciado o mais cedo possível para que possa ser corrigido o mais cedo possível. Toda oportunidade é descoberta o mais cedo possível para que possa ser aproveitada o mais cedo possível.

segunda-feira, 27 de outubro de 2008

NOSSO PADRÃO PARA CRIAÇÃO DE VO’s (Value Objects)

Nosso padrão interno para criação de VOs em conjunto com Hibernate Annotations:



@Entity(name="Redacao")

@SequenceGenerator(name="sequence_redacao", sequenceName = "sequence_redacao", allocationSize = 1)

@Proxy (lazy=false)

public class RedacaoVO implements Serializable {



@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_redacao")

private Long idRedacao;



@Column(nullable=false)

private DOMINIO_SIM_NAO flagRedacaoValida;


@Column(nullable=false)

private String urlPDF;



@OneToOne

@JoinColumn(name="idCandidato",nullable=false)

@ForeignKey(name="fk_candidato")

private CandidatoVO candidato;



@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name="idLote", insertable = true, updatable=true)

@Fetch(FetchMode.JOIN)

@Cascade(CascadeType.SAVE_UPDATE)

@ForeignKey(name="fk_lote")

private LoteVO lote;



@OneToMany(mappedBy="redacao", fetch = FetchType.LAZY)

@Fetch(FetchMode.SUBSELECT)

@Cascade(CascadeType.ALL)

@ForeignKey(name="fk_redacao")

private List correcoes;



@ManyToMany(fetch = FetchType.LAZY)

@JoinTable(name="banca_redacao",

joinColumns=@JoinColumn(name="idLote"),

inverseJoinColumns=@JoinColumn(name="idRedacao"))

@ForeignKey(name="fk_redacao")

private List bancas;


@Version

private Integer version;


//Métodos Get e Set suprimidos

}