sexta-feira, 5 de março de 2010

Começo a reparar que estava tudo a correr bem demais...

...quando me deparo que há pessoal que ignora princípios básicos de Engenharia de Software para que as coisas corram bem no futuro ou simplesmente tiraram o curso por correspondência!

quinta-feira, 4 de março de 2010

Apercebo-me que estava num ambiente de ditadura...

... pelo som das mensagens a cair no msn de uma pessoa aqui ao lado

sexta-feira, 5 de fevereiro de 2010

Fazer queries a um ficheiro Excel? É possível...

Estava eu certo dia a precisar de arranjar uma forma de extrair, de uma forma dinâmica, umas informações de um ficheiro Excel quando me pus a investigar o que haveria por ai.

Ora, aparentemente alguém com essa mesma necessidade decidiu desenvolver uma framework precisamente para este propósito. Designado por MetaModel esta framework, que segue a 3ª revisão da linguagem SQL, não serve necessariamente só para fazer queries a ficheiros Excel. Suporta também ficheiros CSV (comma separated values), access, SGBD's relacionais por JDBC, etc.

Isto é uma pequena peça de um grande puzzle chamado eobjects. Este site é dedicado ao desenvolvimento de soluções Open Source relacionadas com a temática de Business Intelligence e Data Warehousing. A sua estrela é sem dúvida o DataCleaner. Para mais informações consultar este link: http://eobjects.org/trac/wiki/DataQuality.

Voltando então às queries aos ficheiros Excel com um exemplo básico.

1- Supondo que tenho uma tabela em Excel com os seguintes dados:

Nomes
Talásio
Talassa
Taléia
Tales
Tália
Talásio
Tales
Tales
Talassa
Taléia
Tália

2- e com este pedaço de código:

public static void main(String[] args) {
DataContext data = DataContextFactory
.createExcelDataContext(new File(
"C:\\Documents and Settings\\Rafael\\workspace\\Apache POI\\wb.xls"));
Schema[] schemas = data.getSchemas();
for (int i = 0; i < schemas.length; i++) {
System.out.println("Existing schemas: " + schemas[i]);
}
Table[] sheets = schemas[1].getTables();
for (int i = 0; i < sheets.length; i++) {
System.out.println(sheets[i].getName());
}
Table table = data.getDefaultSchema().getTableByName("new Sheet");
Column colA = table.getColumnByName("Nomes");
Query q = new Query();
q.select(colA);
q.selectDistinct();
q.from(table);
DataSet dataSet = data.executeQuery(q);
while (dataSet.next()) {
System.out.println(dataSet.getRow());
}
}


3- temos este resultado com os nomes distintos da tabela anterior:

Existing schemas: Schema[name=information_schema]
Existing schemas: Schema[name=wb.xls]
new Sheet
Row[values={Talásio }]
Row[values={Talassa }]
Row[values={Tales }]
Row[values={Tália }]
Row[values={Taléia }]


Fantástico não é? Ora tentem fazer isto com as funções do Excel...

sábado, 28 de novembro de 2009

ubuntu + ssh + tunneling = (almost) total privacy

Quem nunca se viu privado de certos sites no seu local de trabalho? Ou até com receio de estarem a interceptar os seus dados e monitorizar os sites que consulta numa rede wireless aberta ou mesmo protegida (ex: sapo wifi) num aeroporto, ou até mesmo no local de trabalho?

Face a este problema decidi utilizar um computador velho que tenho aqui por casa e instalar-lhe Ubuntu. Porquê Ubuntu?

  • Primeiro porque me pareceu uma boa oportunidade de continuar a minha aprendizagem neste Sistema Operativo, que basicamente é a distribuição mais conhecida de Linux.
  • Segundo porque é grátis, poupando assim dinheiro que teria de despender na aquisição de um SO proprietário.
  • E por último, a possibilidade de instalação de servidor SSH. Não querendo entrar em muitos detalhes o SSH é um protocolo existente na camada de aplicação do TCP/IP. Este protocolo tem várias funcionalidades mas neste caso vamos utilizar especificamente o HTTP tunneling com encriptação de dados.

Vamos então por as mãos na massa e passar ao que interessa:
  1. Instalar uma distribuição qq de linux (recomendo Ubuntu porque não tem muito que se lhe diga e existe bastante info ai pela net). Está máquina irá ser o servidor que irá escutar pelos pedidos de ligação via SSH, portanto irá ter que estar 24h ligada. Há uma excepção a esta regra, para quem tiver uma placa de rede WOL (Wake On Lan) que assim que puder irei tentar por em prática e depois deixar aqui alguma info :).

  2. Instalar SSH.

    sudo apt-get install openssh-server


  3. Criar uma cópia de segurança do ficheiro sshd_config.

  4. sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup


  5. Editar o ficheiro sshd e mudar umas parametrizações de forma a que o servidor fique sem vulnerabilidades de segurança.

  6. sudo nano /etc/ssh/sshd_config


    Recomendo a alteração imediata destes parâmetros:

    O porto 22 é convencionalmente utilizado pelos servidores SSH logo é o porto mais susceptível a ataques por outros utilizadores, logo é recomendável a utilização de outro que não esteja a ser utilizado por nenhum serviço (ex: 2222).
    # What ports, IPs and protocols we listen for
    Port 22


    Penso que este opção esteja a "yes" por defeito. Tem de ser mudada para "no" para não permitir a autenticação através de password, mas somente por chave publica ou RSA
    # Change to no to disable tunnelled clear text passwords
    PasswordAuthentication no


    Para mais informações sobre a melhores práticas consultar este site:
    http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html

  7. Como o meu objectivo (e possivelmente de muita gente) é ligar-me a partir de um cliente windows (PC do trabalho, portátil, etc.) vamos ter que instalar o putty.

  8. Download aqui:
    http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

    É necessário fazer download do putty.exe (basicamente este é a aplicação que se vai ligar ao nosso servidor SSH) como do puttygen.exe (aplicação que vai gerar a chave pública e privada para encriptar os dados entre o cliente (nosso pc numa rede não amistosa) e servidor (ponto seguro)).

  9. De seguida vamos então gerar a chave com o puttygen.exe. Este processo pode ser feito usando a máquina cliente, usando portanto o Windows para executar-lo.

    Clicar em "generate" para começar o processo de criação das chaves:


    Passar o ponteiro do rato sobre a barra de progressão para ir gerando a chave aleatóriamente:


    Chegando a barra ao fim o aspecto final é este:


  10. Salvar a chave privada (carregar em save private key):

    Muito importante! Atribuir uma password à chave privada. Assim se eventualmente alguém tiver acesso ao teu cliente e roubar a chave privada esta vai estar protegida com password.


  11. Na máquina com o servidor SSH colar o que está na primeira caixa de texto


    De seguida colar a chave publica no editor de texto e salvar:
    cd ~
    sudo nano .ssh/authorized_keys


    Finalmente fazer restart ao servidor SSH:
    sudo service ssh restart

    E assim damos por terminado a configuração do servidor SSH


  12. Vamos passar à configuração do PUTTY na máquina cliente:

    Em primeiro definimos o hostname ou IP da servidor SSH (eu utilizo o dyndns para ficar sempre com o meu IP associado a um url).


    Em segundo indicar a localização do ficheiro que contém a chave privada salva no ponto 7. do tutorial.


    E finalmente configurar o "tunnel". Para o browser adicionei o porto 5555 como dynamic. O porto pode ser um qualquer, desde que não esteja a ser utilizado por mais nenhum serviço. Podem adicionar este como um número superior. Aqui podemos utilizar o tunnel para mais serviços como ligação remota. O porto 5900 por exemplo é para me ligar remotamente via VNC ao servidor SSH.


  13. Se carregarem em "open", inserirem o username e password adicionada no puttygen aquando a geração da "private key" deverão ter acesso ao terminal do vosso servidor SSH.

  14. De seguida vamos configurar o firefox de acordo inserindo o porto adicionado no putty (Ferramentas>Opções>Avançado>Rede>Definições).


    ... e voilá, os dados que passam entre o cliente e o servidor ficam encriptados.


olá