Archive for agosto, 2007

Perl & C

agosto 26, 2007

Escrever em Perl com sub rotinas C é muito simples, graças ao módulo Inline::C (http://search.cpan.org/~ingy/Inline-0.44/C/C.pod).

Instalando o Módulo:

Como root execute o comando:

#cpan

Agora dentro do Cpan é só mandar instalar:

#cpan> install Inline::C

Criando uma rotina em C no seu script em Perl

#!/usr/bin/perl

use strict;
use warnings;
use Inline C => <<END_OF_C;
int soma(int a, int b) {
return a+b;
}
END_OF_C

print “Digite um Valor: “;
my $a = <STDIN>;
print “Digite outro Valor: “;
my $b = <STDIN>;

print soma($a, $b) . “\n”;

Outra forma seria adicionar a sub rotina do C em um arquivo, deixando seu código mais enxuto:

#!/usr/bin/perl

use strict;
use warnings;
use Inline C => “minha_rotina.c”;

print “Digite um Valor: “;
my $a = <STDIN>;
print “Digite outro Valor: “;
my $b = <STDIN>;

print soma($a, $b) . “\n”;

Você pode integrar o Perl a outras linguagens como C++, Java, Python, entre outras. Com esse módulo fica muito simples você integrar funçoes complexas em C com o Perl, ai depende de sua necessidade.

Anúncios

Ketchup

agosto 25, 2007

Ketchup é uma ferramenta para gerenciar os fontes do Kernel Linux. Essa pequena ferramenta pode checar a versão do kernel, buscar novos patches do kernel, tornando fácil o processo de checagem e aplicação de novas correções em seu sistema. O ketchup sincroniza o kernel local com o kernel.org.

Para instalar basta baixar os fontes no site http://www.selenic.com/ketchup/ ou se você estiver usando o Debian como eu:

aptitude install ketchup

Usando o Ketchup

Descobrindo a última versão do kernel da serie 2.6

ketchup -s 2.6

Agora da serie 2.4

ketchup -s 2.4

Checando a versão do kernel no Makefile dos fontes

ketchup -m

Atualizando pelo última versão

ketchup 2.6-tip

Encontrando uma url de uma determinada versão

ketchup -u 2.6

Atualizando uma versão em particular

ketchup 2.6.11-rc3

Maiores informações : http://www.selenic.com/ketchup

Listando

agosto 19, 2007

Esse é um pequeno exemplo de como listar o conteúdo de um diretório em C e mostrar o tipo do arquivo dentro dele:

#include <stdio.h>
#include <dirent.h>

int main (void)
{
DIR *dirp;
struct dirent *ep;
char *tipo;

dirp = opendir(“/tmp”);
if ( dirp != NULL )
{
while ( ep = readdir (dirp) )
{
switch ( ep->d_type )
{
case DT_BLK:  tipo = “blockdev”;          break;
case DT_CHR:  tipo = “chardev”;           break;
case DT_DIR:  tipo = “directory”;         break;
case DT_FIFO: tipo = “fifo”;              break;
case DT_LNK:  tipo = “symbolic_link”;     break;
case DT_REG:  tipo = “normal”;            break;
case DT_SOCK: tipo = “sock”;              break;
case DT_WHT:  tipo = “whiteout”;          break;
case DT_UNKNOWN: tipo = “unknown”;        break;
}

printf (“%s \t %s \n”, tipo, ep->d_name );

}

}
else
puts (“Não consegui abrir o diretório”);

return 0;
}

AWK na linha

agosto 18, 2007

AWK é um linguagem interpretada, sua principal vantagem e a simplicidade com que trata dados. Porém são poucas as pessoas que utilizam essa ferramenta em seu dia-a-dia, por essa razão passo algumas dicas interessantes para programas em 1 ou 2 linhas em seu shell.

awk ‘{ print $1 }’ /var/log/boot

O comando acima imprime a primeira coluna do conteúdo em /var/log/boot, ou seja, em um arquivo texto podemos considerar cada espaço uma separação, por exemplo:

$1 $2
texto1 texto2

Ou seja, a variável $ seguida de um número “guarda o conteúdo desta coluna”.

awk ‘ length($0) > 20 ‘ /var/log/boot

Este imprime as linhas do arquivo que contiverem mais de 20 caracteres

awk ‘END { print NR }’ /var/log/boot

Esse simplesmente conta o número de linhas de um arquivo

ER

O uso de expressões regulares no awk é passada dentro do //, comparando com cada registro no texto

awk ‘ /GNOME/ ‘ /var/log/boot

O comando acima imprime somente as linhas que contiverem o termo GNOME no arquivo /var/log/boot

Operadores de comparação para expressões regulares são :

~ ex: ~/ER/ retorna verdadeiro se corresponder a ER

!~ ex: !~/ER/ retorna falso se não corresponder a ER

awk ‘$7 ~ /GNOME/ ‘ /var/log/boot

Retorna as linhas onde na coluna 7 conter o termo GNOME

awk ‘$7 !~ /GNOME/ ‘ /var/log/boot

Retorna as linhas que não contém o termo GNOME

Controles

FOR
awk ‘BEGIN { for ( i = 0 ; i<=10; i++ ) print i } ‘

Simplesmente imprime os valores de i até 10

IF
awk ‘BEGIN { for ( i = 0 ; i<=10; i++ ) if ( i > 5 ) print i } ‘

Verifica se i é maior que 5 e imprime

IF/ELSE

awk ‘BEGIN { for ( i = 0 ; i<=10; i++ ) if ( i > 5 ) { print “Mairoes que 5 i } else { print “Não é maior que 5” } } ‘

Essa foi só uma ideia do que é possível fazer com o AWK, sugiro uma percorrida no manual, e brincar um pouco com essa linguagem que gosto tanto.