Tag: dica (Página 1 de 2)

Caminhos relativos, absolutos e outras rotinas de arquivos em Java

A classe File do Java encapsula de forma simplificada um arquivo ou diretório do sistema de arquivos local. O seu construtor pode receber caminhos absolutos ou relativos ao diretório atual do programa, por exemplo:

new File(".") //--> diretório atual do programa

O problema de usar caminhos relativos é que pode haver confusão em algumas situações, já que o diretório atual do programa pode ser modificado. Além disso, se o usuário pode digitar o caminho ou parte dele em algum campo, em geral deve-se evitar que ele use caminhos relativos, com exceção no caso de ser uma configuração do próprio programa.

Verificando se um caminho é relativo

O método File.isAbsolute() nos ajuda nessas tarefas e diz se o caminho é absoluto.

Veja um exemplo:

File f1 = new File("..");
System.out.println(f1.isAbsolute()); //imprime false

File f2 = new File("c:\\temp");
System.out.println(f2.isAbsolute()); //imprime true

Recuperando o caminho absoluto

Outro método útil é getAbsolutePath(). Ele retorna o caminho completo de uma instância da classe File.

Veja mais um exemplo:

File arquivo1 = new File("\\pasta\\arquivo.xml");
System.out.println(arquivo1.getAbsolutePath()); //imprime C:\pasta\arquivo.xml

File arquivo2 = new File("c:\\pasta\\arquivo.xml");
System.out.println(arquivo2.getAbsolutePath()); //imprime c:\pasta\arquivo.xml

Outras funcionalidades interessantes de File

A classe File possui vários métodos interessantes para situações específicas, por exemplo

  • getParentFile: retorna um File apontando para o diretório que contém o arquivo ou diretório atual.
  • getAbsoluteFile: retorna outra instância de File com o caminho absoluto.
  • toURI: retorna uma URI (Universal Resource Identifier) que começa com file:. É interessante para uso na rede.
  • isFile e idDirectory: informa se File aponta para um arquivo ou diretório, respectivamente.
  • exists: informa se o arquivo existe.
  • canRead e canWrite: informa se o arquivo pode ser lido ou gravado, respectivamente.
  • createNewFile: cria um novo arquivo em branco.
  • delete: apaga o arquivo ou diretório (se estiver vazio).
  • length: retorna o tamanho do arquivo em bytes.
  • list e listFiles: lista arquivos e diretórios, caso File seja um diretório.
  • mkdir e mkdirs: cria um diretório, caso File seja um diretório. O último também cria os diretórios “pais”, caso não existam.
  • getFreeSpace: retorna o espaço disponível na unidade para onde File está apontando.
  • createTempFile: método estático que retorna um arquivo temporário único para ser usado pelo programa. O método deleteOnExit faz com que esse arquivo seja apagado quando o programa Java terminar de executar.

Além dos métodos, a classe File possui algumas constantes (atributos estáticos) importantes para leitura e gravação de arquivos em diferentes plataformas:

  • File.separator: separador de nomes de diretórios. No Unix e Linux é /, enquanto no Windows é \.
  • File.pathSeparator: separador de vários caminhos de diretórios, para permitir criar uma lista de vários diretórios, como a variável PATH do sistema. No Unix e Linux é :, enquanto no Windows é ;.

Este artigo foi baseado na minha resposta no StackOverflow em Português!

Eclipse: acabando com alguns erros de validação desnecessários

Erros de sintaxe em bibliotecas Javascript como jQuery e jQuery UI quando estão minimizadas (compactadas)

É uma dor de cabeça ver seu projeto sempre com erro por colocar uma versão minified do jQuery ou jQuery UI. A solução para isso, que aplica-se a qualquer script avaliado incorretamente como tendo um erro, é excluir o arquivo javascript específico da validação do Eclipse.

Em resumo, você precisa excluir os arquivos javascript da sua lista de fontes, conforme as telas abaixo:

Abaixo, o passo-a-passo com detalhes:

  1. Clique com o botão direito no projeto e, no menu, escolha a opção Properties.
  2. Navegue até o item JavaScript > Include Path e selecione a aba Source.
  3. Selecione o item Excluded na lista e clique em Edit….
  4. Clique em Add Multiple… e selecione os arquivos com problemas
  5. Clique em Finish e em Ok para confirmar

Observação: restrinja essa configuração para bibliotecas conhecidas e confiáveis, evitando a todo custo fazer isso para seus próprios scripts de modo a ocultar erros no seu código.

Erros de validação e sintaxe em XML

Existem muitos problemas diferentes de validação em XML. Tentarei cobrir os mais comuns:

Eclipse não consegue acessar o arquivo de validação (XSD ou DTD)

Por alguma razão, o Eclipse não consegue acessar o arquivo de definição (XSD ou DTD). Logo no início do XML, provavelmente você vai notar que há uma URL para um arquivo com extensão .dtd ou .xsd. Se o estiver offline, sob um proxy ou por qualquer outro motivo o Eclipse não puder baixar esse arquivo, ocorrerá erro de validação e uma possível lentidão até ocorrer um timeout.

Para resolver isso, baixe manualmente o arquivo de definição a partir da URL, acesse a configuração Windows > Preferences… > XML > XML Catalog no Eclipse, clique em Add… e adicione manualmente o arquivo baixado.

URL de arquivo de validação incorreta

Falhas de validação referentes à sintaxe também ocorrem com frequência. Após certificar-se de que está tudo certo no corpo do XML, verifique se as declarações dos arquivos de validação estão corretos na raiz do arquivo (xmlns e xsi:schemaLocation).

Recentemente tive problemas com um arquivo web.xml que estava com uma URL depreciada:

http://java.sun.com/xml/ns/j2ee

Ao invés da atualizada:

http://java.sun.com/xml/ns/javaee

A mensagem de erro era longa, iniciando com “s4s-elt-character: Non-whitespace characters…“. Bastou trocar j2ee para javaee e o erro de validação desapareceu. Na versão 2.5 da API do Servlet, o conteúdo correto da declaração é:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
		http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	version="2.5">
(...)

Versão de arquivo de validação incorreta

Outro problema que já tive algumas vezes foi com o XML de configuração do Spring Framework. Atualizei a versão do framework e o XML de configuração começou apresentar erros somente quando eu estava offline.

Isso ocorre porque, no caso do Spring, o DTD de validação vem empacotado dentro do jar. Com a URL certa, mesmo offline o Eclipse encontra o arquivo de validação. Mas se mudarmos a versão do jar sem refletir a mudança no XML, o Eclipse vai tentar localizar o arquivo na internet.

Foi preciso apenas trocar a versão do caminho do DTD correspondendo à versão do Spring Framework. Exemplo:

<?xml version="1.0" encoding="UTF-8"?> 
<beans
    xmlns="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
(...)

Nesse exemplo, a versão 3.0 deveria ser atualizada para 3.1, conforme o upgrade do framework:

<?xml version="1.0" encoding="UTF-8"?> 
<beans
    xmlns="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
(...)

Erros em projetos Maven com o plugin m2e (Maven to Eclipse)

Antes de mais nada, é importante salientar que o m2e é um plugin do Eclipse que o integra ao Maven. Entretanto, o Maven possui seus próprios plugins. Portanto, não confundamos plugins do Eclipse com plugins do Maven.

Project configuration is not up-to-date with pom.xml

O erro mais comum em projetos com a Maven Nature (Natureza Maven, aqueles que ficam com um pequeno “M” no ícone do projeto) é quando o projeto não está atualizado conforme o arquivo de configuração do Maven (pom.xml). A mensagem é  “Project configuration is not up-to-date with pom.xml” e ocorre porque, dependendo das alterações no pom, as configurações de projeto (.project) e do classpath (.classpath), além de outros possíveis plugins do Eclipse, precisam ser atualizadas para refletir o novo pom.

Este é o problema mais simples de resolver, pois basta clicar com o botão direito sobre o projeto, acessar o menu Maven > Update Project… e confirmar.

Plugin execution not covered by lifecycle configuration

Outro erro comum ocorre ao usar um plugin no build do Maven que não seja reconhecido pelo m2e. Aparece a temida mensagem “Plugin execution not covered by lifecycle configuration…“. Isso ocorre porque o m2e não sabe como executar um determinado plugin do Maven dentro do Eclipse.

Anteriormente era necessário acrescentar uma tag um tanto volumosa em nosso pom para informar ao m2e o que ele deve fazer. Já nas versões mais novas do m2e, basta selecionar o erro new view Problems e aplicar um Quick Fix, solicitando ao m2e acrescentar o código necessário automaticamente.

É importante atentar para o fato de que há duas opções de solução: a primeira é acrescentar o código no próprio pom.xml, enquanto a segunda é acrescentar a solução de forma global para os projetos do workspace, o que é bem conveniente no caso de usar um certo plugin em vários projetos.

Para acessar a configuração global de mapeamento de plugins, acesse Window > Preferences… > Maven > Lifecycle Mappings. Nesta tela você pode abrir o arquivo clicando no botão Open workspace lifecycle mappings metadata.

Outros problemas com Maven

Se, ao tentar atualizar o projeto com o Update Project ocorrer algum tipo de exceção, tome as seguintes providências:

  • Verifique se você está sob um proxy. Se estiver, configure seus dados de acesso no arquivo settings.xml seguindo o modelo existente, recarregue as configurações do Maven através do botão de refresh na view Maven Repositories do Eclipse e faça um novo Update Project.
  • Verifique também as versões de dependências entre seus projetos. Uma versão errada pode gerar diferentes erros.
  • Remova do seu arquivo .classpath qualquer entrada que use uma variável, do tipo kind=”var”.
  • Verifique se existe algum outro erro no classpath, pois, por exemplo, uma entrada apontando para um arquivo jar inexistente impede o Eclipse de compilar o projeto. Faça um novo Update Project.
  • Quando a compilação do projeto falha mesmo quando o Maven Dependecies está funcionando (isto é, o classpath está sendo gerenciado corretamente pelo Maven), pode ser que algum jar baixado pelo Maven esteja corrompido. Verifique na sua pasta de repositório (geralmente uma pasta chamada “.m2” dentro da sua pasta de usuário) se os jars usados no seu projeto estão íntegros, abrindo-os com alguma ferramenta como o 7-zip.
  • Verifique na view Problems se existe algum erro no projeto que seja relacionado ao Maven. Procure então na view Error Log por mais detalhes, para tentar encontrar alguma pista sobre a causa. Por fim, se não encontrar a causa, olhe o arquivo de log do m2e no diretório “.metadata\.plugins\org.eclipse.m2e.logback.configuration” do seu workspace.

E você? Tem algum erro/problema misterioso em seus projetos do Eclipse? Comente!

Comportamento recursivo inesperado no SQL Server

Como todo desenvolvedor, provavelmente você já perdeu horas com um problema que beira o bizarro até perceber que era algo muito simples.

Uma colega estava testando um sistema onde uma procedure era acionada e, após algum tempo, ocorria um erro “Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)”.

O erro refere-se ao limite de chamadas empilhadas ou recursivas, por exemplo, uma função que chama outra, que chama outra e assim por diante. Entretanto, a procedure não tinha nenhuma chamada desse tipo.

Analisei por alguns segundos os script de criação da procedure, algo como:

CREATE PROCEDURE MINHA_PROC (...) AS
BEGIN
... conteúdo ...
END
EXEC PROCEDURE MINHA_PROC [valores de teste]

Então lembrei de uma “pegadinha” de sintaxe. Para o SQL Server, o conteúdo de uma procedure é tudo o que está entre o CREATE e o “GO”. É o equivalente à barra invertida no Oracle.

Repare que no código de exemplo não existe um GO, pois o desenvolvedor assumiu que o bloco BEGIN/END demarcaria a procedure, mas não é o caso. O comando “EXEC” usado para testar a procedure acabou incluído como parte dela e, quando executada, criou chamadas recursivas até estourar o limite.

Solução? Tão simples quando um “GO”:

CREATE PROCEDURE MINHA_PROC (...) AS
BEGIN
... conteúdo ...
END
GO
EXEC PROCEDURE MINHA_PROC [valores de teste]

Uma forma simples de contar registros e limpar tabelas de uma base de dados

Uma colega estava com alguns backups de uma base de dados SQL Server para realizar testes e queria diminuir o tamanho das bases limpando tabelas de log e operacionais, mantendo apenas as configurações do sistema. O problema é que as bases eram tão grandes que ultrapassavam o limite de 10 GB estabelecido na versão SQL Express 2008.

Ele não precisava e nem queria entender a estrutura de tabelas, então sugeri uma maneira rápida e simples de identificar tabelas com muitos registros e uma forma de excluí-las rapidamente.

A query abaixo retorna vários selects que exibem o total de registros de cada tabela de um banco de dados:

use NOME_BASE
go
select 'select ''' + name + ''', count(*) from ' + name from sys.tables

Basta executar esse código, substituindo o nome da base a ser usada, copiar o resultado gerado e executá-lo.

Esta query gera deletes para cada tabela, no caso de ser necessário limpar a base toda:

select 'delete from ' + name from sys.tables

A versão usando truncate:

select 'truncate table ' + name from sys.tables

Aprenda Inglês de Graça

Aprender outro idioma é fundamental. Ponto. Inglês é essencial para a área de TI. Ponto.

Estudar numa escola ou com um professor particular pode ser muito bom, embora seja necessário conciliar horários, se locomover até o local, correr o risco de não ter um professor qualificado ou imprevistos pessoais que não permitam o aproveitamento das aulas. Ou você simplesmente gosta de correr atrás do conhecimento por conta.

Buscar material na internet ou através de livros é uma forma de aprender ou aperfeiçoar o outro idioma. Existe bastante conteúdo online para autoaprendizagem, inclusive gratuito. É possível estudar e aprender de graça!

Por um lado, quem busca um curso online com tutores e certificados pode acessar o www.englishtown.com, que conta com alunos de todo o mundo, professores nativos e cujo certificado tem equivalência a exames reconhecidos como IELTS e TOEFL.  Mas tudo isso tem um preço, partindo de R$ 119,00 mensais. Entretanto, este site também disponibiliza gratuitamente e-mails diários com lições de Inglês. Conclusão: só vale a pena se houver tempo, interesse e dedicação.

Por outro lado, há opções gratuitas para se aperfeiçoar o Inglês sem compromisso. Vejamos duas delas que eu pessoalmente recomendo:

British Concil – Learning English

Site: http://learnenglish.britishcouncil.org/en/

Possui uma variedade interessante de conteúdo: gramática, vocabulário, vídeos, áudios, atividades, jogos e até piadas. Uma categoria interessante é Business & Work, com vários assuntos e atividades relacionadas a empresas e ao mercado de trabalho. Outra seção importante é a que ajuda na preparação para o exame IELTS.

Além do Learning English, o British Concil disponibiliza outros três subsites:

  1. Learning English Teens: conteúdo para adolescentes
  2. Teaching English: conteúdo para professores de Inglês
  3. Learning English Kids: conteúdo para crianças

English as a Second Language Podcast (ESLPOD)

Site: http://www.eslpod.com

Disponibiliza conteúdo em áudio (aproximadamente 3 vezes na semana) para treino de vocabulário e entendimento do inglês falado.

Cada lição começa geralmente com um diálogo de fácil entendimento, em velocidade reduzida e num contexto específico. Então, o professor revisa toda a conversa, analisando o significado de expressões e chamando a atenção para gramática, etc. Ao final, o mesmo diálogo é repetido, mas desta vez de forma natural, como um norte-americano falaria no dia-a-dia.

Opcionalmente pode-se adquirir o guia de estudo para cada podcast por US$ 10,00 mensais.

Agora é com você. Dedique-se e aprenda Inglês de graça.

SQL Server: o porquê do ponto duplo (“..”) para acessar outros bancos

Você já se perguntou por que usa-se um ponto duplo (“..”) para acessar uma tabela de outro banco de dados no SQL Server?

USE BD1
GO
SELECT * FROM BD2..TABELA

Já vi algumas pessoas questionarem e acho que a primeira reação é supor que seja uma espécie de operador especial.

Bem, para entender isso é preciso saber que um objeto (como uma tabela) no SQL Server possui uma identificação assim:

Servidor.BancoDeDados.Schema.Objeto

Com relação ao Schema, as pessoas criam geralmente todos os objetos no Schema padrão, o dbo. Como os objetos estão no mesmo Schema, especificá-lo é opcional.

Mas, quando esquecemos do “.dbo” nos CREATEs e outras DDLs, é bem provável termos problemas no futuro, pois o Schema padrão do usuário utilizado para executar scripts no cliente pode ser diferente. Já vi casos onde metade dos objetos ficavam num Schema e metade em outro.

Então, se você quer acessar uma tabela e está no mesmo servidor, usando (USE) o mesmo banco de dados e o mesmo Schema, poderá omitir todos estes utilizar apenas o nome da tabela:

SELECT * FROM Objeto

Agora vamos supor que você esteja usando (USE) um banco chamado BD1. Como faríamos para acessar uma tabela de um BD2? Seria tão simples como o exemplo abaixo?

USE BD1
GO
SELECT * FROM BD2..Objeto

A resposta é: depende!

Se os dois objetos não estiverem no mesmo Schema, então você deveria especificar o schema entre os dois pontos, assim:

USE BD1
GO
SELECT * FROM BD2.dbo.Objeto

Portanto, os dois pontos (“..”) seguidos significam que você está omitindo o Schema e solicitando ao SQL Server que utilize o padrão para o seu usuário.

Simples assim.

Evite reiniciar o Tomcat 6 e deixe a inicialização mais rápida

Otimizações geralmente não caem bem em ambientes de desenvolvimento.

Imagine um desenvolvedor tendo que reiniciar o Tomcat a cada alteração em arquivos estáticos ou JSPs durante o desenvolvimento de uma determinada tela do sistema.
Para evitar isso, altere o arquivo context da sua aplicação da seguinte forma, acrescentando ou modificando os parâmetros antiJARLocking e antiResourceLocking para false.
Exemplo:
<Context (...)
    antiJARLocking="false" antiResourceLocking="false">

Agora o Tomcat 6 vai iniciar mais rapidamente e reconhecer alterações nos arquivos do sistema, ficando apenas limitado a cache de frameworks, como JSF, por exemplo.

Explicação

O antiResourceLocking faz com que o Tomcat crie uma pasta TEMP e copie todos os arquivos da aplicação para lá. Então ele ignora o que está na pasta original da aplicação.

Algo semelhante aplica-se ao antiJarLocking, mas com os jars da lib.

Além de desperdiçar espaço em disco, isso atrapalha o desenvolvimento de telas. Ativar esses recursos é indicado para ambientes de produção.

Com isso, o Tomcat também vai iniciar mais rapidamente, porque ele não vai mais ficar sincronizando todos os arquivos da aplicação para a pasta TEMP.

Tomcat lento no Eclipse com o plugin Sysdeo

Numa empresa que usa Tomcat como web container, alguns desenvolvedores relataram uma lentidão na inicialização e na depuração dos sistemas.

Um colega disse que a única solução encontrada até o momento era criar um novo workspace e importar os projetos do antigo.

Depois de pesquisar um pouco, encontrei em num fórum pelo mundo afora (não vou lembrar onde) algo relacionado a breakpoints. Bingo!

Se você está enfrentando um problema semelhante, ou seja Tomcat + Eclipse + Sysdeo + Lentidão, apague todos os breakpoints e há uma grande chance do seu workspace voltar ao normal.

IntelliSense do SQL Server 2008

Se você já usou o SQL Server 2008, já deve ter visto que ele consegue auto-completar nomes de campos e tabelas, além de exibir erros de sintaxe. Este é o “novíssimo” IntelliSense.

O problema é que ele não funciona 100% e tem sérios problemas com cache, pois ao criar novas colunas e tabelas, é difícil fazer ele reconhecer essas alterações.

Vários colegas comentaram esse recurso acaba mais atrapalhando do que ajudando.

Se você compartilha da mesma opinião, fica a dica. Basta clicar no botão da imagem:

Além disso, no menu “Edit > IntelliSense”, você encontra várias opções, como “Refresh Local Cache”, o que significa que ele vai atualizar seu cache local com relação à estrutura da base de dados.

Porém, em alguns testes que fiz, o cache só atualizou mesmo reiniciando o programa… mas quem sabe você pode ter mais sorte!

Problemas com teclas no Eclipse?

Algumas vezes tive problemas com o mapeamento do teclado no Eclipse. De uma hora para outra ele parava de reconhecer os acentos, trocando para um layout padrão americano.

Primeiro pensei ser um bug no Eclipse, depois no Java, mas não encontrei nada.

Pesquisando mais a fundo, descobri que não era bug coisa nenhuma, acontece que o Eclipse possui muitos atalhos que usam a combinação Alt + Shift como base. Porém, ALT + SHIFT é justamente a combinação que o Windows usa para alternar o layout do teclado.

Por padrão, o Windows reconhece o teclado e o configura corretamente como ABNT2, mas ele sempre deixa o teclado padrão americano como segunda opção. Assim, ao usar o refactoring (Alt + Shift + R), por exemplo, às vezes essa combinação pode “escapar” e ser capturada pelo Windows, que troca o mapeamento.

O engraçado é que geralmente os outros aplicativos continuam a reconhecer os acentos e o cedilha normalmente, causando uma baita confusão sobre a causa do comportamento “estranho” do teclado.

Fica a dica:

Para resolver o problema é só pressionar Alt + Shift com o foco no Eclipse até que as teclas voltem ao normal.

Também é possível remover o layout de teclado secundário e assim a combinação de tecla não afetará mais o teclado.

Página 1 de 2

Creative Commons O blog State of the Art de Luiz Ricardo é licenciado sob uma Licença Creative Commons. Copie, compartihe e modifique, apenas cite a fonte.