Problemas no upgrade do Kubuntu 7.10 para 8.04

Linux, Ubuntu No Comments

Após o upgrade de versão do Kubuntu 7.10 para o 8.04 tive alguns pequenos problemas:

  • Apache2 + SVN: reclamando que faltava o MPM (só foi instalar o pacote apache2-mpm-worker)
  • Splash Screen do KDE: ocorria um erro ao carregar (só foi instalar o pacote ksplash-engine-moodin)

E o problema mais chato que tive foi que o som não estava mais funcionando. Após pesquisar muito achei alguns bugs abertos sobre este problema. Uma das soluções encontradas foi instalar o alsa à partir do código fonte:

sudo apt-get install module-assistant
sudo m-a update
sudo m-a prepare
sudo m-a a-i alsa
sudo modprobe snd-hda-intel
sudo /etc/init.d/alsa-utils reset

Após isto o som já estará funcionando. Bom, por enquanto foram apenas estes problemas encontrados!

JSF - Duplicate componentID

Java EE, Programação No Comments

Utilizando o DataTable do RichFaces em uma simples página, após um reload na página sempre era retornado o seguinte erro:

Duplicate component ID '_id0:_dataTable:_id1' found in view.

Segue abaixo o código da página que causava o erro:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
	xmlns:rich="http://richfaces.ajax4jsf.org/rich">

	<h:form binding="#{UserConsultPage.component}">
		<rich:dataTable id="dataTable"
			binding="#{UserConsultPage.dataTable}" var="item">
			<rich:column>
				<f:facet name="header">
					<h:outputText value="Name" />
				</f:facet>
				<h:outputText value="#{item.name}" />
			</rich:column>
			<rich:column>
				<f:facet name="header">
					<h:outputText value="Email" />
				</f:facet>
				<h:outputText value="#{item.email}" />
			</rich:column>
		</rich:dataTable>

		<h:commandButton id="btnLoad" actionListener="#{UserConsultPage.load}" />
	</h:form>

</ui:composition>

A solução foi colocar id’s em todos os componentes “outputText”. Segue abaixo a página modificada:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
	xmlns:rich="http://richfaces.ajax4jsf.org/rich">

	<h:form binding="#{UserConsultPage.component}">
		<rich:dataTable id="dataTable"
			binding="#{UserConsultPage.dataTable}" var="item">
			<rich:column>
				<f:facet name="header">
					<h:outputText id=”headerNameValue” value=”Name” />
				</f:facet>
				<h:outputText id=”nameValue” value=”#{item.name}” />
			</rich:column>
			<rich:column>
				<f:facet name=”header”>
					<h:outputText id=”headerEmailValue” value=”Email” />
				</f:facet>
				<h:outputText id=”emailValue” value=”#{item.email}” />
			</rich:column>
		</rich:dataTable>

		<h:commandButton id=”btnLoad” actionListener=”#{UserConsultPage.load}” />
	</h:form>

</ui:composition>

JSF + Spring + JPA + Hibernate

Java EE, Programação 1 Comment

Ao tentar fazer o deploy de uma aplicação utilizando JSF, Spring e JPA (com implementação do hibernate) é recebida a seguinte exception:

javax.persistence.PersistenceException: org.hibernate.SessionException: Session is closed!

Para resolver este problema, basta apenas adicionar o seguinte filtro no “web.xml”:

<filter>
	<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
	<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

Debug no Tomcat 5.5

Java EE, Programação No Comments

Para rodar um debug remoto no tomcat 5.5 no Ubuntu, basta editar o arquivo “/etc/init.d/tomcat5.5″ e colocar a seguinte linha:


-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

antes das linhas:


# Define other required variables
CATALINA_PID="/var/run/$NAME.pid"
BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap
JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar"

Problema no botão back do navegador

Java EE, Programação No Comments

O botão back do navegador é muito útil ao usuário para ele conseguir navegar entre diferentes páginas e websites. Entretanto, o botão back pode trazer diversos problemas aos sites. Uma maneira de “travar” o botão é desabilitar completamente o cache das páginas que não devem permitir que sejam acessadas através do botão back.
Para se fazer isso no Java EE basta apenas criar um filtro e mapeá-lo para as url’s necessárias.
Segue abaixo o código do filtro:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class ClearCacheFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        httpResponse.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT");
        httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        httpResponse.addHeader("Cache-Control", "post-check=0, pre-check=0");
        httpResponse.setHeader("Pragma", "no-cache");

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

}

Basicamente o que o filtro faz é setar as diretivas de cache para o navegador. Primeiro ele seta a data de expiração da página para uma data passada. Depois, o código seta 3 diretivas para desabilitar o cache:

  • no-store: não armazena o conteúdo no cache
  • no-cache: o browser deve enviar o request para o servidor mesmo se ele possuir uma cópia do que será enviado
  • must-revalidate: revalida o cache em outro request, se estiver expirado

Depois, são setadas duas diretivas específicas do Internet Explorer. Estas diretivas indicam que o conteúdo sempre deve ser atualizado. E por último, é desabilitado o cache para o protocolo HTTP/1.0 (já que as outras 3 são específicas do HTTP/1.1).

Por último é preciso configurar o filtro na aplicação web. Segue abaixo o trecho de código referente à configuração para o filtro, bem como para ele ser aplicado a todas as páginas da aplicação:

<filter>
	<filter-name>ClearCacheFilter</filter-name>
	<filter-class>br.com.uol.ps.common.web.ClearCacheFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>ClearCacheFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

MySQL não responde para outras máquinas

Programação No Comments

Se você estiver tendo algum problema ao tentar conectar ao MySQL de outra máquina, basta alterar o arquivo “my.cnf” localizado no diretório “/etc/mysql” e comentar a seguinte linha:

bind-address = 127.0.0.1

No caso, ela ficará da seguinte maneira:

#bind-address = 127.0.0.1

Após alterar o arquivo, e salvá-lo, bastar restartar o mysql:

sudo /etc/inid.d/mysql restart

Obs.: esses caminhos e executáveis foram testados no Ubuntu 8.04

Eclipse e PermGen

Programação No Comments

Se você estiver tendo problemas de memória com o Eclipse, como por exemplo:

java.lang.OutOfMemoryError: PermGen space

Basta alterar o arquivo “eclipse.ini” e adicionar as seguintes linhas no final dele:

-XX:PermSize=64M
-XX:MaxPermSize=128M

O primeiro post

Uncategorized No Comments

Talvez esta seja uma tarefa difícil, escolher o que escrever no seu primeiro post, ainda mais se este for o seu primeiro blog. Nesta hora surgem diversas dúvidas: o que escrever, como escrever, pra que criar um blog, onde iremos chegar, etc…
Acho que devo dividir este post em algumas partes:

  • Por que criei o blog
  • Quais assuntos serão escritos neste blog
  • O que quero com este blog

Vamos então definir cada uma destas partes:

Por que criei o blog?
Criei o blog simplesmente porque surgiu a oportunidade de possuir um domínio .com.br com um CPF e não mais com o CNPJ. Mas este não é o único motivo, um outro seria a possibilidade de repassar conhecimentos adquiridos no trabalho / faculdade / pós-graduação / vida. Outro motivo seria postar dúvidas e, de preferência, que alguém me ajuda-se a solucioná-las.

Quais assuntos serão escritos neste blog?
Com certeza, a maior parte dos posts escritos neste blog terão referência direta à área de informática, na qual trabalho há pelo menos 5 anos e estou envolvido com programação desde os 12 anos de idade (12 anos atrás!!!).
Outros assuntos poderão ser abordados neste blog também, como por exemplo shows que irei, discussões sobre assuntos diversos, etc…

O que quero com este blog?
Pergunta muito difícil de responder, mas com certeza a melhor resposta é adquirir conhecimentos com os post aqui discutidos.