Feed Artigos Comentários

Arquivo de CategoriasDicas



Java & Dicas Hildebrando em 15 Out 2008

Java no Ubuntu : Acertando Encoding no Eclipse

Uma coisa que precisamos nos preocupar quando temos ambientes heterogêneos de desenvolvimento é que em algum momento haverá a troca de dados de uma estação para outra, essa troca pode ser uma simples copia de arquivo ou o acesso a repositorio de arquivos.

Para que essas trocas não levem a problemas de caracteres é preciso que os ambientes de desenvolvimento conversem na mesma lingua.

Padronizando no Eclipse, seguimos a ajuda de http://www.guj.com.br/posts/list/18869.java , o que precisamos fazer é ajustar todas nossas estações para utilizar o mesmo padrão de encoding de arquivo, no caso utilizaremos o ISO-8859-1.

No Eclipse :

Window >> Preferences >> General >> workspace >> Text File Encoding

Feito isso agora funciona perfeito. Todos codificam no mesmo padrão.

Java & Dicas Hildebrando em 15 Out 2008

Java no Ubuntu : Inicio

Estamos fazendo um estudo para migrar as estações de desenvolvimento que não são .NET para o Sistema Operacional Ubuntu.

Nosso primeiro requsito é a parte de instalação do JDK no Ubuntu e para isso é preciso intalar o Java e configurar a variavel de ambiente JAVA_HOME.

Instalar o Java, pode ser feito tanto pelo gerenciador de pacotes do Ubuntu quanto fazendo download pelo site da Sun. Se for feito pelo gerenciador a opção que se tem é o OpenJDK e é so fazer um next>next>finish, sem mistério.

Se for baixar do site da Sun (http://java.sun.com) baixe a versão binaria (é a não RPM).

O unico detalhe é que o arquivo não vem executável, para isso :

chmod 777 jdk1.5....

Execute o arquivo

./jdk1.5...

Após a instalação do JDK ser realizada com sucesso o próximo passo é configurar a variável de ambiente.

Para que todos os usuarios acessem essa variavel de ambiente, é preciso adicionar algumas configurações nos arquivos /etc/bash.bashrc e /etc/profile.

As configurações precisam ser feitas nos dois arquivos pois um é para login shel (console) e o outro é login no shel (gnome por exemplo).

export JAVA_HOME=/usr/lib/jdk1.5
export PATH=$JAVA_HOME/bin:$PATH

Dicas Hildebrando em 09 Out 2008

JPAQL - Filtrando pelo ultimo status de um historico

Para alguns sistemas toda a alteração que ocorre em uma entidade deve ser armazenada com informações como “quem alterou”, “a data” e “para qual situação mudou”. Podemos representar assim :

1 - Entidade Chamado
2 - Entidade ChamadoHistorico
3 - Entidade Status

public class Chamado {
private Integer id;
private List<ChamadoHistorico> chamadoHistoricos;
}
public class Status {
private Integer id;
private String descricao;
}
public class ChamadoHistorico {
private Integer id;
private Date data;
private Chamado chamado;
private Status status;
}

Na tela que mostra todos os chamados, precisamos retornar uma lista com os chamados e seus ultimos status. Para isso devemos criar métodos na entidade Chamado que retornem seu ultimo status algo como :


@Transient
public Status getUltimoStatus(){
Status status = null;
if(chamadoHistoricos != null && !chamadoHistoricos.isEmpty()){
for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {
status = chamadoHistorico.getStatus();
}
}
return status;
}

@Transient
public Date getUltimaData(){
Date data = null;
if(chamadoHistoricos != null && !chamadoHistoricos.isEmpty()){
for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {
data = chamadoHistorico.getData();
}
}
return data;
}

Percorrendo essa lista utilizando JSTL e EL.

<table>
<tr>
<th>Id</th>
<th>Ultima Atualizacao</th>
<th>Status</th>
</tr>
<c:forEach items=${nomeDaListaComChamados} var="chamado">
<tr>
<td>${chamado.id}</td>
<td>${chamado.ultimaData}</td>
<td>${chamado.ultimoStatus.descricao}</td>
</tr>
</c:forEach>
</table>

E da parte de JPAQL, posso ter a situação de filtrar apenas os chamados “EM ABERTO” == 1 :

select chamado from Chamado chamado left join chamado.chamadoHistoricos as historico
where historico.id in (select max(ch.id) from ChamadoHistorico ch group by ch.fise.id)
and historico.status.id = 1

Dicas Hildebrando em 22 Fev 2007

Chega de Spam

Se ja não bastasse os spams que preenchem as nossas caixas de correio, agora os novos alvos são os blogs. Por se tratarem de sites com muitas visitas, a publicação de propagandas de algum produto/serviço “maravilhoso” pode ser um ótimo negócio.

Infelizmente muitos blogs ainda não estão preparados para esse ataque e acabam tendo informações inoportunas publicadas. Este blog, por exemplo, é bombardeado com 10 tentativas diárias. Nossa única proteção é pedir aprovaçao das mensagens publicadas, e ao identificar que o conteúdo é spam então bloquear o emissor.

Portanto, faça o seu blog, publique seus pensamentos e opiniões, discuta fatos, mas tenha paciência, porque eles tambêm chegaram nos blogs.

Dicas & Banco de Dados Hildebrando em 28 Nov 2006

Oracle para desenvolvedores Java

Estou fazendo uma analogia a um artigo publicado na Java Magazine com o titulo ‘MySQL para desenvolvedores Java’. Minha principal motivação é uma recente instalação/configuração de um Oracle aqui na empresa.

Se você é um desenvolvedor então a sua função é produzir código, fazer levantamentos, criar modelos e afins. Toda a responsabilidade do banco de dados fica por conta do DBA da empresa. E o papel (Database Administrator) exige uma administração completa do banco, com acompanhamentos, configurações, otimizações. Porém você não precisa se tornar um DBA, mas pode te ajudar em algumas situações se voce souber o necessário.

1 - Instalação

O download é gratuito, basta acessar a pagina da Oracle e lá você encontrara a versão do banco que deseja.

A instalação no Windows é muito facil, tanto que muitos livros preferem abordar apenas instalações em Unix/Linux pois nestes é necessário algumas configurações. É o famoso NNF (Next,Next,Finish). E voce deve utilizar assim mesmo. Nosso objetivo não é customiza-lo, e sim utiliza-lo.

2 - Estrutura

Depois que o Oracle foi instalado é criado alguns usuarios padrão. O mais importante é o SYS. Ele é o usuario com perfil ADM para a instancia do banco que foi criada. Você deve utilizar o banco ORCL, o padrão configurado pelo Oracle.

Administre o banco pela interface WEB. Cada banco fica em uma porta, portanto acesse a padrão:

http://localhost:5500/em (A porta pode variar)

login : SYS
senha :
perfil : SYSDBA

3 - Usuarios

O Oracle trabalha focado nos usuarios, ou seja, quando é criado um usuario junto é criado um schema com mesmo nome. Portanto crie quantos usuarios forem necessários. Após a criação dos usuarios, faça o login com os mesmos e assim siga criando as estruturas como Tabelas, Sinonimos, Triggers, Indices, Sequences, etc.

4 - Acessando do Java

Não se preocupe em baixar o client do Oracle, pois o driver JDBC consegue fazer a integração tranquilamente. Para baixar o driver novamente acesse o endereço da Oracle e adicione o jar no seu CLASSPATH. O unico detalhe é quanto a url de conexao.

jdbc:oracle:thin:@localhost:1521:ORCL

Versões mais antigas do Oracle, para voce conseguir executar sem o client instalado.

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))

lembre-se de utilizar o usuario criado anteriormente para acessar as tabelas.

5 - Conclusão

É isso ai. Não tem segredo. O resto esta relacionado com tarefas de administração, inclusive toda a parte de dar direitos e tudo mais. Pode parecer simples mas o mundo ADM é uma outra realidade. Um DBA tem preocupações com um foco diferente, inclusive o Oracle é tem a fama do banco com mais parafusos para apertar, cada uma com uma função que pode ajudar muito no gerenciamento dos dados.

Dicas & Tutorias Hildebrando em 15 Out 2006

Entendendo e aproveitando XML DOM com Javascript.

Trabalhar com XML envolve a criação/leitura de um documento texto. Esta é a definição mais simples para as tarefas de XML, porém destas podemos ramificar em diversos parsers e validadores que a complexidade aumenta em progressão geométrica.

Neste texto que escrevo quero destacar a leitura de um XML via Javascript. Você ira precisar disto em toda situação que o servidor envia para o cliente um arquivo XML que deve ser interpretado.

Existem inumeros frameworks para isso, inclusive outras estratégias mais elegantes como a transformação do XML com XSL.

Como AJAX esta na moda vamos contextualizar nas chamadas assincronas o XML.

Primeiramente, adicione a API DOM no seu bookmark (http://www.howtocreate.co.uk/tutorials/javascript/domstructure). Este link não é do W3.com mas detalha de forma bem estruturada a API.

1 - Declarando um XML


var responseXML = '<response>'+
'<messages>'+
'<total>30</total>'+
'<message>'+
'<sender>Joao do Caminhao</sender>'+
'<text>Quero saber mais...</text>'+
'</message>'+
'<message>'+
'<sender>Atendente 01</sender>'+
'<text>Ja irei verificar senhor</text>'+
'</message>'+
'</messages>'+
'<status>O usuario esta digitando uma mensagem</status>'+
'<fault>skjdcnskjdncjksdnc</fault>'+
'</response>';

Declarando uma string com conteudo XML.

2 - Utilizando o parser do browser

Alguém precisa fazer o trabalho da leitura do elementos/atributos do XML. Todo browser que suporta elementos DOM possue um parser. Para você poder utiliza-lo pode declarar as linhas abaixo para criar uma referencia do documento associado ao parser. Estas linhas ja indicam parsers Cross-browsers.


var xmldoc = null;
if (window.ActiveXObject) {
xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async="false";
xmldoc.loadXML(responseXML);
} else {
var parser = new DOMParser();
xmldoc = parser.parseFromString(responseXML,"text/xml");
}

O elemento de resultado é o xmldoc e é a partir dele que iremos percorrer os nós do XML.

3 - Acessando os Nodes

var response = xmldoc.getElementsByTagName('response');

No exemplo acima eu quero recuperar a tag do XML. Porem assim como a assinatura do xmldoc indica o resultado é um vetor. Detalhe, se não existir esta tag, é retornado um vetor com tamanho 0.

alert(response[0].tagName)

tagName ira retornar o nome da tag. No entanto o mais importante dela são os nós internos ou seu valor.

Os Nodes internos a esta tag são acessados com outro método.


if(response[0].hasChildNodes()){
for(var k = 0 ; k < response[0].childNodes.length ; k++){
alert(response[0].childNodes[k]);
alert(response[0].childNodes[k].nodeValue);
}
}

Tudo ira depender de como esta formado o seu documento XML. Porem com isso ja podemos montar metodos auxiliares para facilitar a navegação nos Nodes.

4 - Utilizando tudo isso com AJAX

Imagine a situação que uma chamada assíncrona ira retornar as informações de endereço, baseado em um numero de cep.

XML Resultado


Av. Javascript DOM
EMACS
São Paulo
SP

Para recuperar os dados pode-se usar variações do método abaixo :


var cep = xmldoc.getElementsByTagName('response')[0]; //Ja retornar o Node
if(cep.hasChildNodes()){
for(var k = 0 ; k < cep.childNodes.length ; k++){
var valor = cep.childNodes[k].nodeValue;
if(cep.childNodes[k].tagName == 'bairro'){
//..>Atribuir o valor no campo bairro….
}
//…>E assim por diante
}

Dicas Hildebrando em 07 Set 2006

Preenchimento de combo com AJAX

Independente do framework ou biblioteca para utilização de AJAX nos seus sistemas, é importante destacar a interação do resultado das chamadas assíncronas com os elementos da tela.

O exemplo abaixo foi aplicado na alteração dos valores de um combo na tela


//O primeiro parametro eh um codigo se ja existe item selecionado ou nao
//200|1|item1|2|item2|3|item3
function callbackPreencherCombo(responseAJAX){
var response = responseAJAX.split('|');
var combo = document.getElementById('produtoItemData');
combo.disabled = false;
combo.options.length = 0;
if(response[0] == '200'){
var contador = 0;
for(i = 1 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
}else if(response[0] == '201'){
var contador = 0;
for(i = 2 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
for(i = 0; i < combo.options.length; i++ ){
if(combo.options[i].value == response[1]){
combo.options[i].selected = true;
}else{
combo.options[i].selected = false;
}
}
}
}

Dicas Hildebrando em 27 Ago 2006

AJAX response

Ao utilizar invocações assíncronas com AJAX, com o objeto de consulta a dados (preencher um combo, dados do cliente, dados do produto, endereço do cep) normalmente estes dados vêm separados por um token. Algo como:

Av. Ibirapuera|206|04087-070|São Paulo|SP

Porém esta simples linha pode te causar problemas se vc nao setar o conten-type correto no response.

Assim, quando fizer uma consulta com AJAX e o seu javascript:alert de depuração do retorno apresentar ‘????’ basta setar o response com os valores:


response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/plain; charset=ISO-8859-1");
PrintWriter out = response.getWriter();
out.print("Av. Ibirapuera|206|04087-070|São Paulo|SP");

Dicas Hildebrando em 21 Ago 2006

Hospede o seu próprio site…

Aqui na empresa estamos montando uma estrutura para suportar projetos dos nossos colaboradores. Assim vou compartilhar alguns problemas encontrados caso voce (sua empresa) também se aventure .

1 - Voce precisa registrar seu dominio no registro.br (sites nacionais). registro.br.

No ato do registro é obrigatorio informar os DNS que irão resolver o nome do seu domínio.

Voce pode utilizar o seu próprio servidor para ser o um dos DNS, porém para funcionar vc precisa liberar a porta 53 tcp/udp para o servidor do registro.br conseguir acessar.

2 - Para tratar diferentes dominios, é necessário configurar no Web Server multiplos domínios. Com o Apache isso é possível através do VirtualHost

3 - Analise bem a utilzação de um servidor de email, pois são esses que os robôs mais procuraram. Eu recomendo a utilização do QMail (logo que finalizar o HowTo eu ja posto aqui) junto a fortes politicas de firewall.

4 - Monitore a utilização do servidor com os logs do WebServer.

5 - Todo projeto deve ter um grupo. E é associado usuarios ao grupo do projeto, assim é possível liberar um diretorio de FTP para acesso aos arquivos do Projeto.

Logo que identificar mais eu ja posto aqui.