terça-feira, 23 de março de 2010

Ruby on Rails para Javaneses

Há pouco tempo entrei em um projeto voluntário para Web com Ruby on Rails. Legal né?? O problema é que nunca tinha mexido com RoR ou qualquer coisa parecida. Meu forte sempre foi Java, C# e outras linguagens "estáticas". Para quem vem do Java, Ruby é assustador. De cara já tive uma sensação do tipo: "aqui pode tudo", muito diferente do "quase tudo é proibido" do Java.
Passado o perído do "nossa! o que é isso??" logo me entusiasmei com RoR. Tive a sensação de estar com um microfone passando instruções para meu querido PC, pois, com Ruby é assim mesmo "Você fala, Ruby escuta".
Abaixo listo algumas diferenças substanciais que senti entre Ruby e Java.

Instalação - A instalação do conjunto Ruby + gem + Rails é quase mágica. No Windows, na forma mais complicada, a instalação é uma "sequência de Next, executa UM script, executa UM comando". Mas você também pode optar por um pacote "One-click" onde com poucos clicks você já está com tudo rodando perfeitamente. No linux, o processo é igualmente simples. A facilidade da instalação me fez lembrar como apanhei para instalar o JDK pela primeira vez. (instala pacote, configura PATH, configura variáveis de ambiente, bla, bla bla). 


Não há tipos primitivos - Em Ruby "Tudo é um objeto", até mesmo aquele seu Int que é um objeto da classe FixNum. Ou seja, você fazer 4.div(2) que o interpretador irá aceitar normalmente. 
 
Threads independentes de Sistema Operacional - A implementação de threads é feita diretamente no Kernel do Ruby, o que permite rodar processos paralelos em qualquer SO, inclusive no DOS.
Tipagem dinâmica - Não é necessário definir o tipo do objeto antes de instância-lo. Como na grande maioria das linguagens de scripts os  tipos de objetos são definidos em tempo de execução.  Porém, apesar disso Ruby também é fortemente tipado, assim como Java.
Definição de métodos - chega de public boolean blablabla() { } . Em Ruby métodos são iniciados com: def nome() terminados em end e a ultima expressão avaliada sempre é retornada, embora seja possível colocar um return em qualquer parte do código.
          Veja um exemplo:
           def modelo()
            @modelo
           end

           O código acima é a mesma coisa que:
            public String modelo() {
                             return this.modelo;
                        }
           Sentiu a diferença??
 

Parametros default - Parâmetros podem receber um valor default que será assumido caso o método seja chamado sem parâmetros.

def marca(tipo=1) 
                @tipo = tipo
         end


Você pode chamar o método acima tanto com marca(9999) quanto com marca() . No último caso o valor de tipo será 1. Em java você seria obrigado a implementar no minimo dois métodos.

Gets e Setters - Existem 3 formas de definir métodos getters e setters.

          Forma 1:
          #declaração da variável
                      @marca 


          #método get                      
                      def marca
                           @marca
                      end


          #método set
                      def marca = (marca)
                            @marca = marca
                      end


             Forma 2:
             #declaração de variável e getter.
                       attr_reader :marca, :modelo


             #declaração de variável e setter. 
                        attr_writer :cor.


             Forma 3:
             #declaração de variável, getter e setter.
                        attr_accessor :marca, :modelo, :cor.


Lembra do que eu falei no início?? "Você fala, Ruby escuta".
           
Giorge Henrique Abdala 



#################################################
Referência: http://eustaquiorangel.com/downloads/tutorialruby.pdf

Leia Mais…

domingo, 21 de março de 2010

Apagando arquivos de Log

Recentemente precisei escrever um script simples para apagar logs de acesso de um sistema debian. Não é nada comparado com qualquer log cleaner, mas, deu pro gasto.

Segue código:

#!/bin/bash

USUARIO=$1
IP=$2

MESSAGES=/var/log/messages
FTP=/var/log/vsftpd.log
LOGIN=/var/log/wtmp
AUTH=/var/log/auth.log


if [ $# -lt 1 ] ; then
    echo "uso: clean usuario [arquivo]"
    exit;
fi


if [ $USUARIO == root ] ; then
    echo "deletando /root/.bash_history"
    rm -f /root/.bash_history
else
    echo "deletando /home/"$USUARIO"/.bash_history"
    rm -f /home/$USUARIO/.bash_history
fi

echo "Limpando entradas em" $MESSAGES "que correspondem ao usuario" $USUARIO
cat $MESSAGES | grep -v $USUARIO > $MESSAGES

echo "Limpando entradas em" $FTP "que correspondem ao usuario" $USUARIO
cat $FTP | grep -v $USUARIO > $FTP

echo "Limpando entradas em" $LOGIN "que correspondem ao usuario" $USUARIO
cat $LOGIN | grep -v $USUARIO > $LOGIN

echo "Limpando entradas em" $AUTH "que correspondem ao usuario" $USUARIO
cat $AUTH | grep -v $USUARIO > $AUTH

if [ $# == 2 ] ; then
    echo "Limpando linhas em "$AUTH "que correspondem a" $2
    cat $AUTH | grep -v $2 > $AUTH

O que o script faz é o seguinte:

 primeiro ele apaga .bash_history no diretório:

   /root - caso o usuário especificado como parametro seja root.

   /home/usuario - caso usuário passado como parametro seja diferente de root.

Após isso, o script faz uma busca em alguns arquivos e apaga todas as linhas que combinam com o usuário passado com parâmetro. Os arquivos procurados são os seguintes:

/var/log/messages   -  registrar todas as operações do sistema ou de programas do mesmo.
/var/log/vsftpd.log  - registrar todas as operações logon/logoff realizadas pelo daemon de ftp.

/var/log/wtmp - registrar os logons de usuários. É um arquivo binário que trabalha em conjunto com a função who para a identificação do usuário.

/var/log/auth.log - Registra operações de autenticações.

Lembrando que você ainda pode especificar, no lugar do usuário, qualquer string que deseja retirar dos arquivos mencionados a cima.  Se você desejar adicionar um outro arquivo para realizar a limpeza é só passar o diretório como segundo parâmetro, assim:

giorge#: clean root /var/log/dmesg

O script é bem básico mesmo e só faz o feijão com arroz. Se você precisar de algo mais elaborado melhor procurar pelo ZAP ou pelo hideme.c.

Abraços

Giorge Henrique Abdala

Leia Mais…