segunda-feira, 25 de junho de 2007

Classificação do Brasileiro via Shell Script

Querendo saber a classificação do seu time no campeonato brasileiro de 2007.

O bom e velho lynx + grep resolve.

$ URL=http://esportes.terra.com.br/futebol/brasileiro2007/classificacao/
$ lynx --dump ${URL} | grep '%'

Colocação Time PG J V E D GP GC SG %
1º Botafogo 17 7 5 2 0 18 7 11 81%
2º Paraná 14 7 4 2 1 14 9 5 67%
3º São Paulo 13 7 4 1 2 7 2 5 62%
4º Goiás 12 7 4 0 3 13 9 4 57%
Fluminense 12 7 3 3 1 11 6 5 57%
Corinthians 12 6 3 3 0 7 2 5 67%
7º Atlético-PR 11 7 3 2 2 12 10 2 52%
Atlético-MG 11 7 3 2 2 11 9 2 52%
Vasco 11 7 3 2 2 11 10 1 52%
10º Cruzeiro 10 7 3 1 3 16 15 1 48%
Figueirense 10 7 3 1 3 13 14 -1 48%
12º Grêmio 9 7 3 0 4 5 12 -7 43%
13º Palmeiras 8 7 2 2 3 9 12 -3 38%
14º Juventude 7 7 2 1 4 9 11 -2 33%
Internacional 7 7 2 1 4 8 12 -4 33%
Santos 7 7 2 1 4 7 11 -4 33%
17º Flamengo 6 6 1 3 2 11 15 -4 33%
18º Sport 5 7 1 2 4 9 13 -4 24%
Náutico 5 7 1 2 4 9 15 -6 24%
20º América-RN 4 7 1 1 5 6 12 -6 19%

quinta-feira, 21 de junho de 2007

The Linux Documentation Project

Muitos guias, tutoriais e Howtos aqui.

O 'Advanced Bash-Scripting Guide' do Mendel Cooper merece destaque especial -- um livro excelente, assim como o 'Bash Guide for Beginners' do Machtelt Garrels e o 'Linux From Scratch' Gerard Beekmans.

Pesquisando um pouco conseguimos ate encontrar o Linux Portuguese-HOWTO escrito em 1997 pelo CaSantos.

Boa leitura!

quarta-feira, 20 de junho de 2007

Entrevista com Matthew Smith

Uma entrevista com o criador do "Maniac Miner" para ZX Spectrum



Maniac Miner foi um grande sucesso na epoca. Percebam como o Matthew Smith ficou loucão depois de uma temporada na holanda tomando todo o tipo de drogas com o dinheiro ganho com os jogos.

Agradecimentos ao Thielo por ter me mostrado o video.

terça-feira, 19 de junho de 2007

NUTS - Amendoins para Salvar Jericho!

Devido à baixa audiência, o canal CBS cancelou a série que conta o ponto de vista da pequena cidade de Jericho em um futuro próximo, onde um devastador ataque nuclear varre as principais cidades americanas. Muita paranóia, caos e personagens interessantes, temos ai um bom clima para uma série muito interessante e ousada.

Seria mais um caso como tantas outras séries sendo canceladas se não fosse a persistencia dos fãs. Bem organizados, uma verdadeira chuva de emails, petições e campanhas foram organizadas, não dando tregua a CBS. Qualquer um poderia achar um exagero, afinal isso raramente dá certo.

Entretanto mais de 7 toneladas de amendoins foram enviadas à CBS sob forma de protesto, graças ao site Nuts on Line.

Nuts! Assim terminou a primeira temporada da série de TV americana Jericho (terminou de forma totalmente aberta, diga-se de passagem). Um termo, à principio sem sentido, é explicado pelo site Poltrona.tv:

A frase "Nuts!" é atribuída ao general norte-americano Anthony Clement McAuliffe durante a II Guerra Mundial. Cercado por alemães ao fim da Batalha do Bulge, na França, McAuliffe soltou a frase sem nenhum sentido aparente para afirmar que não se renderia.

Deu certo. A CBS encomendou 7 novos episódios -- e existe a possibilidade da série continuar dependendo da audiência. Uma boa noticias aos fãs tão ousados e persistentes (ou, nas palavras da CBS: P.S. Please stop sending us nuts )

Vamos torcer para que passe no Brasil logo!

Canivete Multifunções do Shell

O Aurelio (verde) levou algum tempo juntando excelentes dicas sobre shell script que podem ser vistas aqui: o famoso Canivete Suiço do Shell.

Facil de consultar, é extremamente útil para qualquer administrador ou usuário experiente de algum sabor de *nix (ou mesmo no Windows, via Cygwin).

Bebendo da Fonte quando o assunto for WEB

Se existe um (bom) ponto de partida para todos os programandores e/ou web-designers no que diz respeito às principais tecnologias, siglas, formatos e padrões Web, este é o site do w3schools.

Começando pelo extremamente simples learn HTML, podemos ver um pouco de Javascript, XML, Ajax e ate PHP e SQL. Muito útil e simples, fica aí a dica.

segunda-feira, 18 de junho de 2007

O Desenvolvimento da Linguagem C

Um texto cativante e histórico (por Dennis M. Ritchie):

http://cm.bell-labs.com/cm/cs/who/dmr/chistPT.html

a Linguagem C e o Sistema Operacional Unix foram revolucionários, trazendo conceitos usados até hoje. Qualquer um que queira se aventurar no mundo da informática, seja como hobbie ou profissão, tem que conhece-los ao menos um pouco.

sexta-feira, 15 de junho de 2007

Closures em Shell

Uma das coisas mais impressionantes (pelo menos para mim) da linguagem Ruby são os Closures:

$ ruby -e 'r=0...3 ; r.each { puts "oi"}
oi
oi
oi


em um objeto do tipo Range eu tenho um método chamado each que recebe um bloco de código como argumento. Este bloco pode até ser parametrizado, por exemplo:

$ ruby -e 'r=0...3 ; r.each { |i| puts 2*i}'
0
2
4


O que o metodo each faz é passar este bloco de código para 'dentro de si' e aplica-o em cada elemento do objeto 'range'. Pode ser para imprimir o resultado ou efetuar uma operação matemática, até mesmo substituindo um laço for simples. A verdade é que os Closures são bem mais do que isso e permitem fazer scripts bem interessantes.

Sera que poderiamos ter o mesmo em BashScript ? Bem... vou simular aqui

$ each(){ 
local F="${@}"
while read i ; do
set - $i
eval "${F}"
done
}

$ seq 3 | each '{ echo "encontrei $1" ; }'
encontrei 1
encontrei 2
encontrei 3


Simples heim? Eu crio uma variavel local dentro de uma função e 'executo-a' para cada resultado via comando eval. Se este tipo de construção for util para alguem, fica aí a dica!

quarta-feira, 13 de junho de 2007

Avaliando Espaço em Disco

Um problema comum de qualquer administrador é o espaço em disco. As politicas de quotas geralmente resolvem boa parte destes problemas, é claro, mas nem sempre são suficientes.

O caso: pensando de forma genérica, diversas pessoas criam diretórios de trabalho dentro do bom e velho/local e, com o passar do tempo, esta partição pode lotar e comprometer o trabalho de todos. Politicas de uso racional do espaço em disco podem ser aplicadas mas as vezes a coisa pode sair do controle -- nesse caso o prejuizo pode ser grande.

Os diretorios possuem o seguinte formato:

/local/diretorio/algum_nome_identificador.vws


Vamos recorrer ao bom e velho Shell-Script para investigar se existe algum problema em andamento!

$ df /local
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 35001508 11330452 21893064 35% /local


Vejam só: apenas 35% da partição está sendo ocupada e isso não representa risco neste momento. Se estivesse acima de 80% alguma medida perventiva deveria ser tomada. Como podemos fazer este teste? Existem varias formas, vou usar o poder das expressões regulares para isso!

$ seq -f"%g%%" 10 5 100 | grep -E '(100|[89][0-9])%'

80%
85%
90%
95%
100%


A expressão usada no grep casa com valores de porcentagem acima de 80% (inclusive), logo podemos usar em um teste simples

 if df /local | grep -qE '(100|[89][0-9])%' ; then
echo '/local [quase] lotado!'
else
echo '/local seguro (menos de 80%)'
fi


Simples, não? Poderia ter usado os operadores && e || mas não queria sacrificar a legibilidade do código.

Agora vem a parte divertida: e se o /local estiver ficando cheio, vamos fazer o que?

Quando vc não tem a responsabilidade de apagar arquivos desnecessários, o maximo que vc pode fazer é avisar os responsáveis. Elaborar um relatório com os 'problemas' encontrados e enviar por email usando shell script é simples.

Vamos usar o du para calcular o espaço gasto em cada diretório e o sort para ordenar do maior para o menor tamanho total.

$ du -bs /local/diretorio/* 2>&- | sort -nr 
3765643919 /local/diretorio/nonono001.vws
2290883178 /local/diretorio/nonono002.vws
2067295469 /local/diretorio/nonono003.vws
932165874 /local/diretorio/nonono004.vws
...
267271 /local/viewstore1/nonono999.vws


Facil heim ? Se vc se dá ao trabalho de ler as man pages do du e do sort, basta fazer algumas experiências até obter o resultado que mais lhe agrada. Por exemplo, uma atitude interessante seria listar os X maiores diretórios e enviar por email para o administrador.

$ du -bs /local/diretorio/* 2>&- | sort -nr | head -10 > /tmp/arquivo.log 
$ mailx -S "Lista dos 10 maiores diretorios" "administrador@server" < /tmp/arquivo.log


Talvez vc pergunte o motivo pelo qual eu utilizo um arquivo temporário: caso o envio do email dê algum problema, é possivel recuperar a lista.

Um script para rodar na cron e enviar o email de forma automatizada teria este formato:

#!/bin/bash
# Autor: Tiago Peczenyj - 13/jun/2007
# Script parametrizado para avaliar tamanho de alguns diretorios

X=10
DIR=/local/diretorio
EMAIL=administrador@server
SUBJECT="Lista dos ${X} maiores diretorios em $(date +"%Y%m%d" )"
if df ${DIR} | grep -qE '(100|[89][0-9])%' ; then
du -bs ${DIR}/* 2>&- | sort -nr | head -${X} > /tmp/arquivo.log
mailx -S "${SUBJECT}" ${EMAIL} < /tmp/arquivo.log
fi


O script parece simples, entretanto algo simples como informar o usuario dono de cada diretório é muito mais complexo. A minha solução foi esta:

paste -d '\t' <(du -bs /local/viewstore1/* 2>&-) \
<(ls -l /local/viewstore1 | awk '/^d/{print $3}') | awk '{
OFS="\t" ; print $1,$3,$2
}'| sort -nr

Utilidade Pública

Tirado do blog Gambiarra!



Uma utilíssima maquina de dobrar camisas!

terça-feira, 12 de junho de 2007

Um Caracter Inconveniente

Não é incomum passar pelo problema de tentar apagar um arquivo cujo nome começa com o caracter '-', como no exemplo abaixo:

$ rm -arquivo.txt
rm: invalid option -- a


Não adianta proteger a string pois não é o Shell que atrapalha a ação, e sim o próprio programa que reconhece o símbolo - de uma forma diferente. O programa rm aceita, alem de uma lista de arquivos para apagar, uma série de opções que modificam o seu funcionamento. As mais comuns são:

  -f  ignore nonexistent files, never prompt
-i prompt before any removal
-r remove the contents of directories recursively
-v explain what is being done


As opções normalmente pode ser colocadas em qualquer lugar da lista de parâmetros.

$ rm -v a.out
removed `a.out'

$ rm a.out -v
removed `a.out'


Quem avalia os parâmetros normalmente é uma função chamada getopt (presente em várias linguagens, inclusive no Bash). Bom, vimos que o - é um caracter especial para o getopt, mas existe alguma forma de burlar isso?

Sim! O proprio getopt prove essa funcionalidade: o uso dos simbolos '--'. Eles interrompem a expansão de parâmetros e tudo o que vier depois desses dois caracteres será interpretado literalmente pelo programa.

Assim sendo:

$ rm -v -- -arquivo.txt
removed `-arquivo.txt'


Esta dica está no help do comando rm e vale para todos os programas que usem getopts.

Transformers

Estréia em Julho:



More Than Meet The Eyes!

segunda-feira, 11 de junho de 2007

Ola Mundo!

Quando aprendemos uma nova linguagem de programação, normalmente o primeiro exemplo é o famoso "Hello World!", ou seja, um pequeno código que imprime uma mensagem na tela do computador.

Em C, ele seria assim:

/* Um comentário */
#include <stdio.h>

int main ()
{
puts ("Hello world!");
return 0;
}


As vezes o puts é substituido pelo multifacetado printf no exemplo, mas o efeito é o mesmo. Vejamos como seria em Java.

/* Comentarios, igual ao C */
package Hello;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world");
}
}


As diferenças são várias, apesar da estrutura ser semelhante. Em C nós temos funções parametrizadas, enquanto em Java nós temos objetos (System.out) e métodos (println).

Por fim, vamos ver um exemplo em Shell Script

#!/bin/bash
# comentario
echo "Hello World!"


Diferente de uma linguagem de programação, aqui o interpretador de comandos (normalmente) chama um programa capaz de escrever mensagens para o usuario. Ou seja, alguem ja escreveu um "Hello World!" genérico o suficiente para nós.

Cada linguagem possui um propósito. Enquanto vc projeta sistemas operacionais e drivers em C, Java ocupa uma área no desenvolvimento de grandes sistemas corporativos enquanto o shell está presente na administração de determinadas tarefas de um servidor (normalmente rodando algum sabor de *nix).

Não basta comparar um hello world, pois é preciso ver muito além da sintaxe e recursos da linguagem, mas normalmente se começa por ele.

Outros exemplos podem ser encontrados aqui.

Abraços