segunda-feira, 10 de outubro de 2011

Arduíno - Tecnologia de Ponta

O Arduino é um micrcontrolador feito para leigos. A prototipagem é extremamente rápida. E além da placa vir pronta para a programação ainda existem os Shields.

Os Shields são placas prontas com funcionalidades diferentes que podem ser conectadas na placa do Arduino. Esse sistema é conhecido como Open Hardware. As empresas disponibilizam vários tipos de hardwares que podem ser utilizados de forma livre onde mesmo os circuitos podem ser modificados.
Toda esta onda cria uma alteração forte no cenário. Essa invenção possui impacto tão grande quanto a invenção do próprio computador. E, em breve, todo cenário de tecnologia sofrerá o impacto da entrada do Arduino no mercado.

O Arduino é uma febre. Todo mundo que domina um pouco de tecnologia está interessado nesse sistema. O Arduino pode ser encontrado no site:
http://www.arduino.cc/

Socket no Arduino

Uma das tarefas mais interessantes do Arduino é a capacidade dele se conectar na Internet através do shield de Ethernet. O Arduino consegue abrir até 4 sockets  a comunidade que está desbravando o Arduino compartilha do conhecimento de forma ampla. No Github, que é um servidor de compartilhamento de código, o pessoal postou um exemplo de socket através do Arduino que pode ser reutilizado de maneira livre no link abaixo:
https://github.com/razerbeans/WebSocket-Arduino

Java Comparable, Comparator e CompareTo

Existem várias formas de comparação em Java, porém quando comparamos String com String ou inteiros com inteiros devemos fazer de forma diferente. O método abaixo cria um objeto Conta com um numero e o nome de uma pessoa. Abaixo o método de comparação utilizando Comparable, Comparator e CompareTo.

Classe Conta.java:


public class Conta implements Comparable{

private String nome;
private int numero;
private long cpf;

public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public long getCpf() {
return cpf;
}
public void setCpf(long cpf) {
this.cpf = cpf;
}

public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}



public Conta() {
// TODO Auto-generated constructor stub
}
public Conta(String nome, int numero, long cpf) {

this.nome = nome;
this.numero = numero;
this.cpf = cpf;
}


@Override
public boolean equals(Object object){

if (object==null) {
return false;
}
if (!(object instanceof Conta)) {
return false;
}
Conta pessoa =(Conta) object;
return pessoa.getNumero() == this.numero;
}
public int compareTo(Object o){

if (this.getNumero() < ((Conta) o).getNumero()) {
return -1;
}
if (this.getNumero() > ((Conta) o).getNumero()) {
return 1;
}

return 0;

}

public String toString(){

return this.getNome() + " - " + this.getCpf() + " - " + this.getNumero() + "";
}


}


Classe ComparaPorNome.java


import java.util.Comparator;


public class ComparaPorNome implements Comparator{
@Override
public int compare(Conta o1, Conta o2) {
return o1.getNome().compareTo(o2.getNome());
}

}


Classe ComparaPorCpf.java

import java.util.Comparator;


public class ComparaPorCpf implements Comparator {

@Override
public int compare(Conta o1, Conta o2) {
// TODO Auto-generated method stub
if (o1.getCpf() < o2.getCpf()) {
return -1;
}
if (o1.getCpf() > o2.getCpf()) {
return 1;
}

return 0;
}

}
Classe ColecaoArray .java que é classe principal que invoca a ordenação. Alguns comentarios estão presentes devido aos testes do cálculo de tempo de ordenação.
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Arrays;
public class ColecaoArray {
public static void main(String[] args) {
Conta objs[] = new Conta[15];
//Conta aux[] = new Conta[1];
NumberFormat formater = new DecimalFormat("#00");
String nome;
int numero;
long cpf;
// ArrayList conta = new ArrayList;
// estudantes.get(0).getNota();
long t = System.currentTimeMillis();
long startTime = System.nanoTime();
long estimatedTime = 0;
//long init;
//long end = 0;
//long diff;
ColecaoArray imp = new ColecaoArray();  
//init = System.currentTimeMillis();
/* Coloque aqui seu codigo que demora */
////t = System.currentTimeMillis() - t;
estimatedTime = System.nanoTime() - startTime;
//end = System.currentTimeMillis();
for (int i = 0; i < objs.length; i++) {
numero = (int) (Math.random() * 21);
nome = "Nome" + String.valueOf(formater.format(i + 1));
cpf = (long) (11111111111L + (Math.random() * 88888888889L));
objs[i] = new Conta(nome, numero, cpf);
}
imp.imprimir(objs);
Arrays.sort(objs);
 
     imp.imprimir(objs);
     
System.out.println();
ComparaPorCpf cpCpf = new ComparaPorCpf();
Arrays.sort(objs, cpCpf);
imp.imprimir(objs);
 
ComparaPorNome cpPorNome = new ComparaPorNome();
Arrays.sort(objs, cpPorNome);
imp.imprimir(objs);
//System.out.println(t + " milisegundos");
System.out.println(estimatedTime/1000 +" milisegundos");
//diff = end - init;
//System.out.println("Demorou " + (diff / 1000) + " segundos");
// ... the code being measured ...
// Conta[0].ComparaPorCpf(Conta[1]);
}
public void imprimir(Conta objs[]) {
for (int i = 0; i < objs.length; i++) {
System.out.print(objs[i].getNome() + "-" + objs[i].getCpf() + "----"
+ objs[i].getNumero());
System.out.println();
}
System.out.println();
}
}

Programa Java para Validação de Caracteres

Campos em formulário que não devem aceitar caracteres especiais são muito comuns. Abaixo um código para tratar caracteres especiais. O programa possui uma String com caracteres que devem ser bloqueados. Modifique como precisar.


public class ValCarac {

    public static void main(String[] args) {
        // digite a string a ser testada na variavel login
        String login="marc/elo";
       
        boolean testeLogin =false;
        testeLogin = ValCarac.validateCaracters(login);
        if(testeLogin){
            System.out.println("passou");
        }else{
            System.out.println("falhou - nao sao permitidos caracteres especiais");
        }
    }
   
    public static boolean validateCaracters(String login){
        boolean valid=true;
        String nopodi="ƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ/|.!?@#$%¨&*(){}][^~'";
        nopodi += '"';
        for(int j=0; j<login.length(); j++) {
            System.out.print("esse pode ?:"+login.charAt(j));
            System.out.println();
            for(int i=0; i<nopodi.length(); i++) {
                if(login.charAt(j) == nopodi.charAt(i)){
                    System.out.print("Não pode:"+nopodi.charAt(i));
                    System.out.println();
                    valid=false;
                    if(!valid){
                        break;
                    }
                }
            }   
        }
        return valid;
    }
}

Programa Java para Captura de Teclas

O programa abaixo serve de exemplo para capturar teclas que são pressionadas. Copie e cole no Eclipse IDE e é só rodar. Modifique como for necessário.

import java.awt.*;
import java.awt.event.*;

public class KeyPress extends Frame{
    Label label;
    TextField txtField;
    public static void main(String[] args) {
        KeyPress k = new KeyPress();
    }

    public KeyPress(){
        super("Key Press Event Frame");
        Panel panel = new Panel();
        label = new Label();
        txtField = new TextField(20);
        txtField.addKeyListener(new MyKeyListener());
        add(label, BorderLayout.NORTH);
        panel.add(txtField, BorderLayout.CENTER);
        add(panel, BorderLayout.CENTER);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });
        setSize(400,400);
        setVisible(true);
    }

    public class MyKeyListener extends KeyAdapter{
        public void keyPressed(KeyEvent ke){
            char i = ke.getKeyChar();
            String str = Character.toString(i);
            label.setText(str);
        }
    }   
}

Tutorial Shell - Parte 5

Nessa quinta parte do tutorial será mostrado como trabalhar com textos dentro do Shell. Para o Shell, todo o conteúdo do computador é visto como um arquivo texto. E na verdade é, pois até mesmo a memória é armazenada numa forma de texto (numérico) que é o Hexadecimal.
Inicialmente precisamos de um texto, então é necessário criar um em modo lista. Dentro do diretório padrão do sistema /etc/group estão armazenados os grupos de usuários do sistema.
Para exibir na tela: cat /etc/groups
Para exibir na tela com linhas numeradas: cat –n /etc/groups
Para criar um arquivo de texto com a listagem exibida: cat –n /etc/groups > grupos.txt
Com o arquivo criado veremos se possui conteúdo da lista: cat grupos.txt
Vamos usar o pipe “|” para jogar a saída do comando em um novo comando apenas para testar o pipe: cat grupos.txt | more
Através do comando cut faremos um corte vertical no arquivo para testes. Cortando o arquivo nos dois pontos e exibindo a primeira parte: cat grupos.txt | cut –d: -f1
Mostrando a segunda parte agora: cat grupos.txt | cut –d: -f2
Mostrando a terceira parte agora: cat grupos.txt | cut –d: -f3
Mostrando a primeira e a segunda parte agora: cat grupos.txt | cut –d: -f1,2
Mostrando a primeira e a terceira parte agora: cat grupos.txt | cut –d: -f1,3
Mostrando apenas uma coluna, no caso a sexta: cat grupos.txt | cut –d: -c6
Mostrando da coluna 8 até 50: cat grupos.txt | cut –d: -c8-50
Vamos criar um novo arquivo com o ultimo comando: cat grupos.txt | cut –d: -c8-50 > semnumeracao.txt
Usando o mesmo artifício vamos ordenar o novo arquivo por ordem alfabética: cat semnumeracao.txt |  sort
Vamos ordenar pela última coluna. Como a última coluna é numérica então o sort deve vir acompanhado do –n, no caso: cat semnumeracao.txt | sort  -t”:” –k4 -n
O –t devera indicar onde o corte será feito, no caso nos dois pontos. O –k indica qual coluna de corte deverá ser ordenada.
Falta apenas Head e Tail. Para selecionar apenas as 10 primeiras linhas do cabeçalho da mesma lista ordenada pela terceira coluna:  cat semnumeracao.txt | sort  -t”:” –k4 –n | head -10
Para selecionar as 10 ultimas linhas da lista do ultimo arquivo criado: cat semnumeracao.txt | tail -10
Para selecionar o arquivo sem as 10 primeiras linhas e sem as ultimas 10 linhas a sugestão é contar as linhas e fazer uma intersecção entre Head e Tail. Supondo que são 50 linhas de lista (usar o cat com –n para saber) então o comando seria: cat semnumeracao.txt | head -40 | tail -30
O mesmo pode ser jogado num novo arquivo indicando o rodapé: cat semnumeracao.txt | tail -10 > rodape.txt
Busca por palavras usando grep para buscar linhas com a palavra “mail”: cat semnumeracao.txt | grep mail

Tutorial Shell - Parte 4

Nessa quarta parte do tutorial será possível entender como trabalhar com o Shell de forma inteligente utilizando o famoso ShellScript. Um ShellScript nada mais é do que uma seqüência de comandos Shell que foram salvos num arquivo executável de formato  “.sh”.
Existem vários tipos de comandos Shell onde os formatos dos blocos básicos de comando podem sofrer alguma alteração entre uma versão e outra, ou até mesmo entre tipos diferentes. Certa vez eu fiz um ShellScript no Fedora que não rodou no Ubuntu devido ao formato dos blocos de comando (uso de colchetes, ou ponto vírgula, ou parêntesis) mas isso é raridade. O interpretador sendo do mesmo tipo teoricamente tem que funcionar. Então usaremos o formato mais comum de Shell, que é o Bash. Abra um editor de textos e digite logo no inicio o comando que indica o interpretador:
#! /bin/bash
Na segunda linha coloque:
 Echo “Teste de impressão – Olá Mundo!”;
Salve com um nome qualquer e extensão “.sh”.
Mude a permissão do arquivo com o comando: chmod +x meuarquivo.sh
Para executar o arquivo acesse o diretório que ele foi salvo pelo terminal e execute:
./ meuarquivo.sh
A impressão deverá aparecer na tela do terminal.