domingo, 29 de dezembro de 2013

Utilizando concatenação de Strings com StringBuilder

Já vimos em posts passados a classe String é responsável pelo armazenamento de dados do tipo texto, isto é, guarda uma sequência de caracteres. Esta classe é java.lang.String e por incrível que pareça os objetos String são imutáveis, ou seja, depois que criado seu conteúdo jamais é alterado. Já vimos anteriormente, que na verdade quando fazemos s = "aa" e depois s = "bb", existem 3 objetos uma para cada string imutável e um objeto s que aponta primeiro para "aa" e depois para "bb". A classe é final, ou seja, não pode ser alterada por nenhuma outra classe.

Outra classe que permite manipular strings é StringBuffer (java.lang.StringBuffer) que é geralmente recomendada para armazenarmos um grande número de caracteres. Esta classe cria objetos mutáveis, ou seja, diferente de String, o seu valor (valor armazenado em sua instância) pode ser alterado,  pode ser alterado. Também é uma classe final. Esta classe tem outra característica importante: seus métodos são synchronized, assim pode ser utilizada em aplicações multithread sem qualquer alteração.

Existe ainda uma terceira classe - java.lang.StringBuilder - que implementa a mesma API de StringBuffer porém não é thread safe (seus métodos não são synchronized). Como é a mesma API apresentaremos neste post somente exemplos com StringBuffer.



Redução de Dimensões

Em implementação de aprendizado de máquina, normalmente tratamos com um volume de dados muito grande e a complexidade de qualquer classificador ou regressor depende do tamanho da entrada. Desta forma a complexidade de tempo e espaço tem relação direta com o número de exemplos de treinamento para o classificador ou regressor. Existem métodos que permitem selecionar os recursos, isto é, escolher um subconjunto de características importantes do resto, de forma que possamos tratar um volume menor de dados. Em métodos de projeção, estamos interessados ​​em encontrar um mapeamento das entradas no espaço n-dimensional original para um novo espaço k-dimensional (menor que n), com perda mínima de informação. Em álgebra linear, a decomposição em valores singulares ou singular value decomposition (SVD) é a fatoração de uma matriz real ou complexa que nos permite selecionar um subconjunto de vetores mantendo um valor grande da variação existente nos dados originais. É isto que veremos nos dois vídeos deste post.

Veja a sequência no segundo post.

quinta-feira, 26 de dezembro de 2013

Usando estilos de formatação para Strings

Vamos ver nestes dois vídeos como utilizar os recursos de formatação para criação de Strings (usando String.format) e para apresentação de Strings (utilizando System.out.printf).





Usando concatenação de String

Vamos ver agora como concatenar duas Strings. Em outro post mostrarei como realizar a mesma tarefa com StringBuilder. O Java recomenda a utilização desta segunda classe em strings mutáveis.


Operações básicas com String


Vamos ver alguns exemplos de operações com strings:
  • removendo espaços em branco com trim()
  • comparando strings com equals()
  • comparando strings sem case sensitive com equalsIgnoreCase()
  • comparando string em array com charAt()
  • achando parte em uma string com regionMatches()
Vamos conhecer um pouco das funções primeiro:

a) String.trim()
Se você já tiver uma string em uma variável a, chamando a.trim() será gerada uma cópia da string com os espaços em branco no início e no final da string removidos. Se este objeto a representa uma seqüência de caracteres vazia, ou se o primeiro e/ou o último caracteres têm códigos superiores a '\ u0020' (o caractere de espaço), então é simplesmente retornada uma referência para a. Isto é,
a = " abc ";
b = a.trim() // retorna uma nova string "abc"

a = "abc";
b = a.trim() // retorna uma referência para a, isto é, b == a

b) String.equals()
Compara a string a com a string passada como parâmetro. O resultado é true se o argumento não é nulo, é uma String e representa a mesma seqüência de caracteres.

c) String.equalsIgnoreCase()
Compara as strings sem considerar as letras em maiúsculas e minúsculas, isto é, retorna true se:

  1. String.equals() retorna true ou
  2. Como se tivesse aplicado Character.toUpperCase(char) para ambas as strings e daí String.equals() retorna true ou
  3. Como se tivesse aplicado Character.toLowerCase(char) para ambas as strings e daí String.equals() retorna true.
d) String.charAt(i)
Este método permite acessar o valor de char na posição i. O valor do índice i pode variar entre 0 e String.length() - 1.

e) String.regionMatches()
Este método testa se duas regiões das duas strings são iguais. Para isto devemos informar a posição onde começará a comparação na string original e também na string passada como parâmetro, bem como a quantidade de caracteres deve ser comparada. O resultado será verdadeiro se estas partes das strings representam sequências de caracteres idênticos.

Vamos ver no vídeo como utilizá-las

segunda-feira, 23 de dezembro de 2013

Usando Sockets para criar comunicação em Java - Parte 2 de 3

Continuando nosso post anterior, veremos neste post um exemplo de comunicação TCP usando socket. O exemplo é bem simples:
  1. um cliente conecta em um servidor
  2. o cliente envia para o servidor uma sequência de bytes fora de ordem
  3. o servidor recebe os dados, ordena e devolve ao cliente de forma ordenada.
Veremos duas variações do servidor. A primeira realiza um loop while, o servidor bloquea esperando uma conexão, quando recebe a conexão, o servidor processa (e enquanto isto não aceita outras conexões). A segunda versão, cria uma thread para cada conexão, assim pode receber conexões simultâneas de diversos clientes.


Usando Sockets para criar comunicação em Java - Parte 1 de 3

Neste post e nos próximos dois mostrarei como é feita a comunicação via socket em Java. Apresentarei as classes neste primeiro post:

Para TCP utilizaremos basicamente:

  • java.net.ServerSocket: cria um socket de comunicação TCP para o lado servidor
  • java.net.Socket: cria um socket de comunicação (pode ser utilizado por ambos os lados)

enquanto para UDP utilizaremos

  • java.net.DatagramSocket: representa um socket para enviar e receber datagrama (pacotes UDP). Deve ser utilizado para enviar e/ou receber os pacotes pela rede. Estes pacote são dirigidos e encaminhados individualmente. Os diversos pacotes enviados a partir de um computador podem ser encaminhados de forma diferente e pode chegar em qualquer ordem no outro computador.
  • java.net.DatagramPacket: esta classe representa um datagrama (isto é, o dado que queremos transmitir ou que recebemos). O serviço de entrega é sem conexão, ou seja, a mensagem é encaminhada a partir de um computador para outro baseado somente na informação contida dentro dele. A entrega de pacotes e sua ordem não são garantidos.




Nos dois posts seguintes veremos um exemplo de comunicação TCP e outro em UDP.

domingo, 22 de dezembro de 2013

Usando a classe InetAddress para ver endereços IP

A classe InetAddress é utilizada pelo Java para representar um endereço de Internet ou endereço IP, que consiste em um número de 32-bit ou 128-bit sem sinal. Esta arquitetura é definida pelas RFC 790: Assigned Numbers, RFC 1918: Address Allocation for Private Internets, RFC 2365: Administratively Scoped IP Multicast e RFC 2373: IP Version 6 Addressing Architecture.

Uma instância de InetAddress consiste em um endereço IP e seu nome de host correspondente (se fez a resolução do nome). Veremos no vídeo como esta classe se comporta. Devemos notar que existem diversos métodos estáticos e métodos que se comportam como factories que facilitam o tratamento deste tipo de informação. A classe InetAddress não tem construtores visíveis. Para criar um objeto InetAddress, você tem que usar um dos métodos disponíveis de fábrica. Os métodos tipo factory são uma convenção em que métodos estáticos em uma classe que retornam uma instância da classe InetAddress.