Labels em ciclos

19 August, 2008 por thiago

Ora aqui está algo que eu fui confrontado recentemente e no qual desconhecia por completo na linguagem Java. A utilização de labels nos ciclos e a possibilidade de um controle maior nos ciclos. Para melhor entenderem segue o seguinte exemplo:

public class Labels {

   public static void main(String[] args){		

      int j = 2;
      label1:for( int i=1; i < j++; i++ ) { //linha 1

         label2:for( int k=0; k < j--; k++ ){ //linha 2

            if( j > k/i ) //linha 3
	       break label1;
	}
      }
      System.out.println(j); //linha 4
   }
}

Como se vê, temos 2 ciclos encadeados, e antes de cada ciclo temos àquilo que se chama de labels (label1 e label2).

Após a linha 1 temos a seguinte situação: j = 3; i = 1.

Após a linha 2 temos a seguinte situação: j = 2; i = 1; k = 0.

A condição na linha 3 é satisfeita pois 2 > 0/1.
Tendo em conta que a instrução nesta condição é de break do primeiro ciclo (isto é feito indicando a label que neste caso é a label1), então o código não continua mais o ciclo e avança. Como a próxima instrução a ser executada é a linha 4, o output final será 2.

Espero que isto possa servir para alguém nem que seja para perceber que é possível um maior poder sobre ciclos encadeados e manipulação dos mesmos.

Representações númericas

18 August, 2008 por thiago

Considerando o seguinte excerto de código:

public class Numeric {
	public static void main(String[] args){
		int i = 0xf; // linha 1 (hexadecimal)
		int j = new Integer("0110"); //linha 2
		int k = 0110; //linha 3 (Octal)
		System.out.println(i);
		System.out.println(j);
		System.out.println(k);
	}
}

Na linha 1, o valor representado para i é hexadecimal. Tendo em conta que é f, o valor será 15.

Na linha 2, o valor representado para j é um Integer que recebe no construtor uma String que deve representar um valor númerico. Este construtor deverá filtrar a String de tal modo que transforma 0110 em 110, ou seja transforma em representação decimal.

Já na linha 3, o valor representado para k 0110. O Java interpreta este valor como Octal, logo fará a conversão de 0110 para decimal, o que dará o valor 72.

É interessante ver como o Java trata algumas das representações númericas. Estou também a dar este exemplo pois sei que será útil para alguns de vós.

Férias

9 August, 2008 por thiago

Estou de férias durante a próxima semana. Vou tentar arranjar um tempinho para actualizar o blog mas como estas vão ser as únicas férias que vou ter em 2008 não posso prometer nada :P. Mas podem estar descansados que os posts não acabam.

Publicado em Geral | Sem Comentários »

Atenção ao static

7 August, 2008 por thiago

Tendo a conta a seguinte situação:

public class NullExample {

	public static void main(String[] args){
		NullExample q24 = null;
		int i = q24.throwDice(); //linha 1
		int j = getDice().throwDice();
		System.out.println("Result: "+i+","+j);
	}

	private static int throwDice(){
		return 1+(int)(Math.random()*6);
	}

	private static NullExample getDice(){
		return null;
	}
}

Assim à primeira vista qual seria o resultado de executar esta classe? Chegaria a imprimir algum output ou lançaria um NullPointerException?

Pois bem eu responderia que o programa lançaria uma excepção NullPointerException pois como podemos ver na linha 1, é invocado o método throwDice() utilizando uma instância que está a null. Na verdade e em casos destes convém estarmos muito atentos pois o método throwDice está declarado como static, logo não é um método de instância e sim da classe em si.

Ou seja, no fundo este programa vai imprimir um output e não lançara qualquer excepção. Se retirarem a keyword static do método throwDice() já obterão a excepção ao executar a classe.

Espero que este exemplo vá ajudar alguém a perceber um pouco melhor o conceito de static

Um exemplo de criação de queries dentro de queries em Oracle pode ser:

SELECT 'DROP TABLE ' || object_name
FROM all_objects
WHERE object_type = 'TABLE'
AND owner = USER

Neste exemplo utilizamos a tabela do sistema Oracle chamada all_objects. O meu objectivo neste caso foi criar queries de drop às minhas tabelas. Ao executar esta query irei obter X queries de drop. (X é o número de tabelas criadas pelo meu utilizador).

Isto é apenas um exemplo e pode ajudar-vos a utilizar na criação de outras queries. É consoante a imaginação de cada um.

RandomAccessFile class

5 August, 2008 por thiago

A classe RandomAccessFile é uma classe que funciona como um array de bytes aonde é possível escrever e ler informação no sistema de ficheiros. Esse array tem uma espécie de cursor que aponta a um determinado espaço da memória.

É possível controlar onde o cursor fica a apontar no array de bytes através dos métodos getFilePointer() e seek().

Exemplo de utilização do RandomAccessFile:


import java.io.*;
public class ConversionsUsingRAF {
	public static void main(String[] args) throws IOException{

		RandomAccessFile raf = new RandomAccessFile("test.dat","rw"); //linha 1
		raf.writeInt(4); //linha 2
		raf.writeShort(2); //linha 3
		raf.writeByte(8); //linha 4
		raf.seek(3); //linha 5
		short a1 = raf.readShort(); //linha 6
		short a2 = raf.readShort(); //linha 7

		System.out.println("a1: "+ a1+" a2: " + a2); // Output será: a1: 1024 a2: 520
	}
}

Como podemos ver, na linha 1 é declarado um novo RandomAccessFile de um modo muito simples com o modo rw (read-write). Este modo permite utilizar os métodos readXXX() e writeXXX() como podemos ver nas linhas 2,3,4,6 e 7. A manipulação do cursor pode-se ver na linha 5 onde pedimos para o cursor ficar apontado na posição 3.

O array de bytes terá então o seguinte aspecto:

  • 00000000 00000000 00000000 00000100 (writeInt) 4 bytes
  • 00000000 00000010 (writeShort) 2 bytes
  • 00001000 (writeByte) 1 byte

Logo tendo em conta que o cursor está a apontar a posição 3, o output será de facto 1024 e 520 (readShort pede para ler um short que tem 2 bytes).

API: RandomAccessFile

Falta de actualizações

5 August, 2008 por thiago

Como têm reparado o blog foi abandonado… Infelizmente tive algumas mudanças na minha vida e também por falta de motivação deixei de postar.

De qualquer modo após algum tempo parado e tendo em conta que ainda há um certo número de leitores fiéis do blog, decidi continuar a colocar novidades. Fiquem atentos a novos posts.

Mês atarefado

26 April, 2008 por rogeriopvl

Como já devem ter reparado os posts no blog, de um dia para o outro simplesmente pararam. Isto deve-se a um mês bastante atarefado para os autores. No entanto aproveito para relembrar que o Dev-PT não está parado e que estamos neste momento a trabalhar num agregador de feeds temáticas (também conhecido como “planeta”) para o Dev-PT. Por isso se é do vosso interesse, fiquem atentos :)

Publicado em Geral | Sem Comentários »

Casos de uso comuns em aplicações web

10 April, 2008 por thiago

Cada aplicação web tem funcionalidades diferentes e são construídas para propositos diferentes. No entanto existe um conjunto de funcionalidades comuns em todas elas, como por exemplo:

  • Registar e activar conta de um novo utilizador no sistema
  • Recuperar password
  • Apagar conta de utilizador no sistema

Cada aplicação implementa estes casos de uso de modos diferentes. Cada modo tem as suas vantagens e desvantagens. Depende de quem o está a implementar e como normalmente gosta de implementar.

Seguidamente vou falar sobre estes 4 casos de uso e falar no que eu acho que seja a melhor e mais segura maneira de os implementar

Registar e Activar conta de um novo utilizador

Para este caso, existem duas soluções diferentes que me agradam:

A primeira é guardar na Base de dados informação sobre o username, useremail, userid, password (cifrada com hash), data de registo (timestamp) numa tabela. A password seria gerada automaticamente pelo sistema e enviada para o email da pessoa em questão. A conta em si já estaria activada, com a nuance que quando o utilizador entrasse no sistema pela primeira vez era obrigado a mudar a password.

A segunda seria guardar numa tabela da base de dados os campos username, useremail, userid, password, data de registo (timestamp) e flag de activação de conta. O utilizador registava-se com a password que pretendia, no entanto a sua conta não era automaticamente activada (a flag de activacao estaria a false). Assim que acabasse o registo seria enviado ao utilizador um email com um link que permitia ao utilizador activar a sua conta para poder ser usada. Este link poderia ser o timestamp do registo encoded mais o hash da sua password. Apenas a pessoa dona do email é que poderia de facto activar a sua conta (passando a flag de activação a true). Estes dois métodos alias são constantemente utilizados hoje em dia.

Recuperar password

Este caso de uso é bastante simples quando não guardamos a password do utilizador cifrada. Para isso basta enviar um email ao utilizador no qual informamos qual é a sua password. Apesar de simples este método de guardar a password em claro na base de dados não é uma boa prática e não deve ser considerado.

Quando a password é cifrada e guardada na base de dados o caso é diferente. Não é nos possível obter uma password através da sua hash, logo não é possível enviar um email ao utilizador com a sua password. Um modo agradavel de resolver este problema é do sistema permitir um modo de fazer reset à password de modo a que o utilizador escolha qual será a sua nova password. Para isso é necessário criar um link especial que apenas poderá ser acedido pelo dono da conta (a ser enviado por email) de modo a fazer um reset à sua password. Esse link poderá ser o timestamp do registo da conta mais o hash da password original.

Desactivação de conta de utilizador no sistema

Apenas um utilizador que tiver conta e estiver dentro do sistema é que poderá aceder a este caso de uso e confirmar se de facto quer apagar a sua conta do sistema. Apesar de simples este caso de uso tem uma curiosidade. A opção de Apagar deveria ser realmente eliminar toda a informação sobre o utilizador e a sua conta naquele sistema. No entanto em alguns sistemas, como por exemplo em redes sociais como o hi5 isto não se verifica. Mesmo que tenhamos optado por apagar a nossa conta hi5, os nossos dados mantêm-se no sistema e se quisermos voltar a registar uma conta de hi5 com o email que ja utilizamos previamente, a nossa conta é “restaurada”. Não sei se não haverá aqui alguma violação de informação. Quem sabe algum de vocês poderão dar a vossa opinião sobre isto?

Publicado em Técnicas | 1 Comentário »

Monster.com

9 April, 2008 por thiago

O site Monster.com, é a principal rede de empregos que existe actualmente na Internet. É um serviço que permite a qualquer pessoa no mundo procurar aquele emprego perfeito, quer seja no seu país, quer seja no estrangeiro.

Eu próprio já utilizei este serviço para procurar uma possibilidade de emprego no estrangeiro e devo confessar que fiquei surpreendido por ter sido imediatamente contactado por telefone no sentido de serem marcadas entrevistas.

É sem dúvida um serviço muito útil e que pode ajudar na procura daquele emprego que desejariamos. No entanto aconselho as pessoas a terem cuidado na sua utilização. Se não querem ser constantemente contactadas telefonicamente, apenas indiquem um endereço de email. Evitam assim contatos inesperados e que por vezes podem ser desagradaveis.

Publicado em Geral | Sem Comentários »