segunda-feira, 24 de dezembro de 2007

Peczenyj agora é cidadão carioca

Pois é...

Depois de muitas considerações decidi encarar o desafio de me mudar de Porto Alegre para o Rio de Janeiro. Facil não é, tampouco barato.

Recebi uma proposta irrecusável de uma empresa para trabalhar com o middleware de Tv Digital. Vai envolver muitos testes automatizados, java, lua, C, desafios novos, cidade nova, enfim, muita coisa boa. Logo vou postar umas coisas que eu ando aprontando aqui...

terça-feira, 18 de dezembro de 2007

No Rio

3 dias de viagens seguidos. Foi cansativo.

Sábado saimos de Poa para chegar, 9 horas depois, em Curitiba. Muitos desvios na estrada, duas gatas berrando de vez em quando, sol e fome. Chegando, fomos numa churrascaria muito boa chamada Per Tutti e dormimos.

Domingo chegamos em São Paulo - a estrada para lá é hedionda. Depois de descansar um pouco, fomos numa 'lancheria' chamada Fifties, muito boa. Depois tomei um café expresso e dormimos.

Segunda chegamos no Rio. Depois de enfrentar um longo caminho, foi um alívio passar pela Serra das Araras e chegar à cidade. Deixamos nossas duas gatas na avó da Juliana e viemos pra casa, na Tijuca.

Hoje o dia foi cheio, andei um bom pedaço do centro do Rio, andei de metrô, tive conversas interessantes... quinta vou beber com o pessoal do MBB em lugar secreto, até lá terei alguma coisa boa para comemorar (alem de estar na cidade magavilhosa).

Quarta é o dia...

sexta-feira, 14 de dezembro de 2007

Ferias

Estou saindo de férias, quando tiver novidades irei postar :)

segunda-feira, 3 de dezembro de 2007

Testes Unitários com VBScript

Nas ultimas semanas, tive que aprender VBScript por conta de alguns testes que estão por vir. A sintaxe é bem estranha, mas fazer o que...

Entretanto é simples o suficiente para se desenvolver pequenas rotinas e, de quebra, aprender boas praticas de programação, como TDD, no exemplo abaixo:

' Função a ser testada
' EhPrimo determina se um determinado número inteiro é primo ou não
Function EhPrimo(numero)
'
'coloque o codigo aqui :)
'
EhPrimo=false ' so pra retornar algo...
End Function

'Coloquei o nome Test para ficar mais facil :)
Sub Test( objQuery, strMessage )
If Not objQuery Then
WScript.Echo VbCrlf & "ERRO: " & strMessage
WScript.Quit 'no primeiro teste errado...
End If
End Sub

' Testando primos
Primos = array(2,3,5,7,11)
For Each Numero In Primos
Test EhPrimo(Numero),"Numero " & Numero & " deve ser primo!"
Next

' Testando _nao_ primos
NaoPrimos = array(4,6,8,9,10)
For Each Numero In NaoPrimos
Test (Not EhPrimo(Numero)),"Numero " & Numero & " NAO deve ser primo!"
Next

' Testando outras coisas
Test (Not EhPrimo( 0)),"Numero 0 NAO deve ser primo!"
Test (Not EhPrimo( 1)),"Numero 1 NAO deve ser primo!"
Test (Not EhPrimo(-1)),"Numero -1 NAO deve ser primo!"


WScript.Echo VbCrlf & "Pronto, passou tudo!"


Pronto, agora

Qual a vantagem dessa abordagem?
1) vc se obriga a testar o seu código
2) vc descobre quais parametros são uteis nas suas funções
3) vc especifica o comportamento das suas funções ANTES de implementa-la:)

quarta-feira, 28 de novembro de 2007

Evento Tchelinux nesse Sábado

Nerds do Sul!

Sábado (1 de dezembro) haverá mais uma edição do Tchelinux, dessa vez em Porto Alegre.

Será um dia cheio de palestras de workshops, ao custo de 2 kilos de alimentos não pereciveis.

http://www.tchelinux.org/2007/

Inclusive eu irei ministrar uma palestra sobre AWK/SED no começo da tarde. Destaco também a palestra do Carlos Santos sobre "A História do Unix".

Enfim, um dia cheio de Ubuntu, Python, KDE, Kernel, BSD e muito mais!

Apareçam!

sábado, 17 de novembro de 2007

Analise Orientada a Objetos com Java - Parte 1

Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java.

Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa de análise orientada à objetos feita de forma progressiva, comentários são bem vindos.

A primeira proposta foram 2 matrizes bidimensionais, uma com os professores disponíveis naquele dia e outra com as turmas, distribuidas ao longo de uma semana. Eu logo percebi que isso podia ser um problema de modelagem, pois se vc vai utilizar matrizes, paineis, interface textual ou seja lá o que for, isto é apenas uma camada - a visão. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:

class Professor{}
class Disciplina{}
class Turma{
Disciplina disciplina;
Professor professor;
}
public class Main{
public static void main(String[] args) {
Professor oseias = new Professor();
Disciplina matematica = new Disciplina();
Turma matA = new Turma();

matA.disciplina = matematica;
matA.professor = oseias;
}
}


A minha classe Main mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe Professor, uma classe Disciplina e uma classe Turma. Se vc observarem qualquer instituição de ensino vão perceber que uma turma tem-um professor e tem-uma disciplina associados (composição).

Percebam também que eu não fui até uma escola ou universidade e fiquei horas levantando requisitos, criado diagramas uml ou documentos no word - apenas criei uma casca inicial de código (cheio de problemas por sinal). Também não me importo, ainda, com nenhum aspecto temporal. Sem falar que esta escola todos os professores podem dar qualquer disciplina - agora vamos implementar direito.

Vejamos... uma turma não troca de disciplina facilmente, mas de professor sim. Faz sentido, então, ter um setter de professor e um construtor que receba uma disciplina. Outra coisa, eu não defini nada nas outras classes, então está na hora de definir 2 atributos : id (numérico) e nome (String). Vou diferenciar os objetos pelo código, isto é, o seu id, e o nome será utilizado como descrição. Vou sobreescrever os métodos equals e toString.

Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).

class Professor{
long id;
private String nome;
public Professor(long id,String nome){
this.id = id;
this.nome = nome;
}
public long getId(){ return id; }
public String toString(){ return this.nome ; }
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Professor))
test = super.equals(o);
else
test = ((Professor) o).getId() == this.id;
return test;
}
}
class Disciplina{
long id;
private String nome;
public Disciplina(long id,String nome){
this.id = id;
this.nome = nome;
}
public long getId(){ return id; }
public String toString(){ return this.nome ; }
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Disciplina))
test = super.equals(o);
else
test = ((Disciplina) o).getId() == this.id;
return test;
}
}
class Turma{
long id;
private String nome;
private Disciplina disciplina;
private Professor professor;
public Turma(long id, String nome,Disciplina disciplina){
this.id = id;
this.nome = nome;
this.disciplina = disciplina;
}
public void setProfessor(Professor professor){
this.professor = professor;
}
public long getId(){ return id; }
public String toString(){
return this.nome + " [" + this.disciplina
+ "] c/ " + this.professor ;
}
public boolean equals(Object o){
boolean test = false;

if (!(o instanceof Turma))
test = super.equals(o);
else
test = ((Turma) o).getId() == this.id;
return test;
}
}
public class Main {
public static void main(String[] args) {
/* objetos bem comportados */
Professor oseias = new Professor(1L,"Oseias");
Disciplina matematica = new Disciplina(1L,"Matematica");
Turma matA = new Turma(1L,"Matematica A", matematica);
matA.setProfessor(oseias);

System.out.println("Professor " + oseias);
System.out.println("Disciplina " + matematica);
System.out.println("Turma " + matA);

/* objetos mal comportados
* Sujeitos a NullPointerException */
Professor juca = new Professor(2L,null);
Disciplina calculo = new Disciplina(2L,null);
Turma matB = new Turma(2L,"Matematica B", null);
matB.setProfessor(null); // nem precisava mas...
Turma matC = new Turma(3L,"Matematica C",calculo);
Turma matD = new Turma(4L,"Matematica D",calculo);
matD.setProfessor(juca);

System.out.println("Juca? " + juca);
System.out.println("Calculo?" + calculo);
System.out.println("matB? " + matB);
System.out.println("matC? " + matC);
System.out.println("matD? " + matD);
}
}


Mas que raios eu estou fazendo? veja a saída desse programa:

Professor  Oseias
Disciplina Matematica
Turma Matematica A [Matematica] c/ Oseias
Juca? null
Calculo?null
matB? Matematica B [null] c/ null
matC? Matematica C [null] c/ null
matD? Matematica D [null] c/ null


Qual o significado? Bom... eu tenho uma forma razoavel de representar um professor, disciplina e turma, porém não é pratico, o construtor está gigante e, em muitas situações, eu posso ter parâmetros nulos, o que pode ser uma fonte de problemas. Existem muitas formas de refatorar estas classes, eu nem toquei no HashCode, enfim, tem muito pano pra manga.

Apresento a vcs o desenvolvimento em etapas, iterativo. Eu estou chutando requisitos aos poucos, é verdade, mas eu entrego um codigo testável e completo e cada ciclo. Com os usuarios testando esse código (nesse caso, uma API, mas enfim...) eu obtenho um feedback interessante. O que vc acha?

quinta-feira, 8 de novembro de 2007

Nascimentos

Coisas maravilhosas acontecem.

Descubro recentemente que um amigo meu virou papai. A pequena Sophia nasceu prematura, logo deve estar aos cuidados da família coruja. Agora descubro que outro amigo será pai: já está na sétima semana. Eta Canoenses!

É... o tempo passa... quando estamos na faculdade descobri que um colega será pai/mãe é incomum, mas com o passar do tempo temos que escutar "e tu, pra quando vai ser?"...

Na hora certa (espero eu).

terça-feira, 6 de novembro de 2007

Ferramentas de Teste

Excelente comparativo de duas ferramentas gratuitas de teste automatizado para interfaces web.

http://mguillem.wordpress.com/2007/10/29/webtest-vs-selenium-webtest-wins-13-5/

Pelo escore final, creio que muitos projetos web poderiam ser beneficiados pela combinação destas duas ferramentas.

From Nand to Tetris in 12 Steps

Otimo vídeo - Google Tech Talks October 10 ,2007


Link direto aqui.

quarta-feira, 31 de outubro de 2007

AWK e Arrays Associativos

Um grande problema para quem trabalha com arrays associativos no AWK é
com relação a ordem dos elementos quando esta fazendo uma iteração.

Ex:

$ gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'
1
3
5
4
2


Eu inseri, nessa ordem, 5, depois 4, depois 2... porém o acesso aos
elementos de um array em um for do tipo
for( variavel in array)

é imprevisive / incontrolável.

Agora vejamos isto:

$ WHINY_USERS=1 gawk 'BEGIN{ split("5 4 2 1 3",T) ; for(i in T) print T[i]}'
5
4
2
1
3


WOW! Através da variavel de ambiente do unix WHINY_USERS agora eu consigo acessar os elementos na ordem em que eles foram inseridos no array!

E para acessar os valores na ordem crescente:
$ WHINY_USERS=1  gawk 'BEGIN{ split("5 4 2 1 3",T)
asort(T) ; for(i in T) print T[i] }'
1
2
3
4
5


A variavel de ambiente WHINY_USERS não esta documentada no man, muito menos na documentação que consegui a respeito do gawk. Descobri esta dica no comp.lang.awk e, por incrivel que pareça, tive que vasculhar o codigo fonte do gawk (graças a deus podemos fazer isso) para entender melhor o que essa variavel poderia fazer.

Enfim, fica a dica.

terça-feira, 30 de outubro de 2007

Tchelinux 2007 - Chamada de trabalhos

Seja bem-vindo à chamada de trabalhos do 2º Seminário do Software Livre Tchelinux que irá acontecer dia 1º de Dezembro de 2007 na UFRGS em Porto Alegre, RS. Antes de enviar sua proposta de palestra, recomendamos que leia atenciosamente o regulamento abaixo:

Sobre o Temário:

A equipe de avaliação de propostas irá selecionar 10 palestras técnicas sobre Software Livre dentro dos seguintes temas:

Sistemas Operacionais
Desktop baseado em Software Livre
Aplicativos Gráficos
Jogos e Multimídia
Linguagens de programação
Ferramentas para desenvolvimento
Banco de dados
Administração de Sistemas
Redes e Segurança da Informação

Sobre as Apresentações:

- Cada palestrante terá 75 minutos para apresentar seu trabalho
- Os recursos disponíveis serão projetor multimídia e micro-computador rodando Ubuntu Gutsy
- O palestrante deverá permitir que os slides de sua palestra seja publicada no site do grupo
- Não haverá nenhuma remuneração ou reembolso de despesas para palestrantes

http://www.tchelinux.org/papers/

Participem!

quarta-feira, 24 de outubro de 2007

Entendendo Ponteiros na linguagem C

Entender ponteiros (e ponteiros para ponteiros) nem sempre é facil quando estamos vendo C ou C++ pela primeira vez. O conceito é absurdamente simples, assim como os operadores * e &, mas pelo menos para mim demorou um tempão para a ficha cair (e olha que eu utilizava arrays direto e nem me ligava nesse detalhe).

Com auxilio do pre-processador C, vejamos se este exemplo que pode ser elucidativo:

#include "pointer.h" 
int main ()
{
int x = 0; // variavel de exemplo
pointer(int) y; // ponteiro

y = address(x); // y aponta para o endereco de x

x++; // incrementamos o valor de x
value(y)++; // incremento indireto (via ponteiro)

printf("value %d %d\n",x, value(y) );
printf("address %p %p\n",address(x), y );

return 0;
}


Ou seja, a criação de um ponteiro para uma variavel do tipo inteira é através da macro pointer. Outra macro, address, retorna o endereço de uma variavel e, assim, tenho uma referência aquela variavel. Posso então ter acesso ao valor e até mesmo manipular a variavel original.

Vejamos agora o resultado da execução:
$ ./a.out
value 2 2
address 0xbfffeaa4 0xbfffeaa4


Perceba que eu consegui incrementar a variavel duas vezes (através das duas formas disponíveis). Perceba também que o ponteiro y tem como valor o mesmo endereço de memória que a variavel x, razão pela qual consigo alterar o seu valor.

O codigo gerado pelas macros

int main () 
{
int x = 0; // variavel de exemplo
int * y; // ponteiro

y = (&(x)); // y aponta para o endereco de x

x++; // incrementamos o valor de x
(*y)++; // incremento indireto (via ponteiro)

printf("value %d %d\n",x, (*y));
printf("address %p %p\n",(&(x)), y);

return 0;
}


Eu recomendo que, uma vez que o conceito tenha ficado claro, que não se use mais este header sob pena de criar arquivos ilegíveis. Por exemplo, tente compilar com a opção de gerar os simbolos para debug (-g) e depois tente debugar esse programa: perceberão que o gdb, por exemplo, não mostra o codigo fonte com tanta clareza.

Para fazer este exemplo, utilizamos este arquivo header:

#define pointer(type)                    type *
#define value(var) (*(var))
#define address(var) (&(var))

domingo, 7 de outubro de 2007

Tropa de Elite 2 - Dia de Treinamento Java

Seguimos com novos exemplos inspirados na triste realidade da polícia carioca.

/*
* O Bope foi criado para atuar quando a policia perde o controle
* E no rio de janeiro isso acontece com bastante frequencia
*/
class Bope{
private String nome;
private int qtdeVitimas = 1; // ja começa bem!

public Bope(String nome){
this.nome = nome;
}
// sobrecarga do método ondeTaOBaiano
public void ondeTaOBaiano(Estudante e){
e.sabeVoarEstudante();
}
public void ondeTaOBaiano(Traficante t){
t.levaSacoNaCabeca();
}
// exemplo de método final!
public final Doze encontreiOBaiano(Baiano b){
return b.naCaraNaoQueEhPraNaoEstragarVelorio();
}
}

public class Treinamento{
public static void main(String [] xxx){
// Apresento o capitão nascimento
Bope instrutor = new Bope("Capitao Nascimento");
try{
// de cada 100 policiais que fazem o curso do Bope,
// so se formam 5, e eu, quando me formei parceiro,
// eramos apenas 3.
Turma.tentaFazerCursoBopeCom(capitao);
} catch (PolicialCorruptoEncontrado pce){

} catch (PolicialFracoEncontrado pfe){

} catch (PolicialSemABandoleiraNessaAlturadoCampeonato e){

}
}
}


SEUS FANFARRÕES!
VCS TEM 10 SEGUNDOS PARA COMPLETAR ESSE CÓDIGO!

- O zero-dois NÃO está escrevendo!
- SEU zero-dois, porque o senhor não escreveu nenhuma linha?
- A-a minha IDE não terminou de carregar, senhor...
- Agora a sua IDE ja carregou, seu zero-dois?
- S-sim senhor...
- Então, seu zero-dois, termine o seu programa, senão todos os seus colegas terão que usar o EDIT do MS-DOS até o fim do curso E A CULPA EH DO ZERO-DOIS!



HOMEM DE PRETO QUAL É A SUA MISSÃO?
É APRENDER JAVA SEM PRECISAR DE CERTIFICAÇÃO!
HOMEM DE PRETO O QUE É QUE VC FAZ?
FAÇO CODIGO FONTE QUE ASSUSTA O SATANÁS!


Estratégia, do inglês, Strategy...

- Senhor, o zero-cinco está dormindo...

quinta-feira, 4 de outubro de 2007

Aprendendo Conceitos antes de Sintaxe

O homem aprende por dois motivos: por gosto ou por necessidade.

Depois de passar um semestre brincando com Pascal na era pré-google ( quando não encontravamos uma pagina através do yahoo ou cadê, tentavamos urls aleatórias como www.pascal.org - que era a pagina da família pascal ), tive uma disciplina cujo professor só sabia Fortran e C.

Através do MOO descobri o curso on-line da UFMG, e pude dar os primeiros passos em C. Entretanto o foco dessa disciplina não era fazer agenda ou video-locadora - eram programas científicos. Linux, gnuplot, maple... foi um mundo muito divertido.

É claro que algumas coisas eu simplesmente não compreendia: os tais dos ponteiros, por exemplo. Era só ver um * que não fosse multiplicação que eu já tinha dor de cabeça. E assim se passaram alguns anos onde eu apenas reproduzia os comandos que tinha aprendido.

Anos depois, conversando com o CaSantos caímos em uma micro-aula de programação. Eis que ele profere sabias palavras: Ao estudar uma linguagem de programação, a primeira coisa que se precisa estudar são os conceitos e, por último, a sua sintaxe.

Toda a vez que eu entrava em uma lista de discussão ou forum e via as perguntas dos novatos eu lembrava dessa frase. Coisas como dizer que os arquivos .h do C são bibliotecas, colocar system("pause") pro programa não "fechar do nada" e por ai vai. O tipo da coisa que, quem conhece o conceito, não perguntaria.

Por que razão não se ensina os conceitos de uma linguagem logo no começo? Eu só posso pensar que é para os alunos aprenderem de forma intuitiva no começo e resgatar isso mais tarde (talvez em uma cadeira de compiladores, sei lá), mas será que isso acontece?

Geralmente o trabalho de fim de semestre dessas cadeiras é um CRUD em C com listagem (ou relatório) de alguma coisa ordenada de uma ou mais formas. Cadastrar alunos ou contas bancárias, salvando em arquivo.

Pois bem, se é uma disciplina introdutória, por que raios alguem iria pedir um CRUD?? Meu deus, os alunos mal sabem como compilar o programa, tampouco debuga-lo - No maximo enchem de printf("passei por aqui") - e pedem um programa com 'menu interativo'! Ai o camarada perde metade do tempo fazendo 'menuzinho' com asteriscos ou outro caracter e não consegue implementar a lógica. Quando implementa é aquela maçaroca. O que isso ensina?

Eu daria uma sugestão: quer ensinar C ou Java ou Snobol 4, ensine. Mas não peça um programa CRUD cheio de frescura - peça uma biblioteca. De um arquivo header ou uma interface java e diga: implementem essas funções/metodos ai. Eu vou testar o meu programa com essa biblioteca e espero que tudo funcione.

videolocadora.h

int cadastra_video(char *nome, int preco, int categoria);
int cadastra_cliente(char *nome, char *cpf, char *endereco);
int aluga_video(...);


Enfim, não consigo pensar num exemplo melhor. A ideia é introduzir um desenvolvimento em camadas, deixando o aluno pensar em como ele vai gravar, ler e ordenar os dados sem frescuras de tela, ensinando a fazer testes e também a debugar a aplicação.

Quer ensinar a fazer telinha? Ensina em outra disciplina, nesse caso ensinando técnicas de design apropriadas. Começando pela linha de comando do unix: como pode um aluno se formar sem nunca ter criado o seu próprio grep? Criar interfaces com o usuário não é algo facil, requer muito estudo, principalmente de usabilidade.

Alias fazer "telinhas" geralmente supõe colocar um programa em um estado. Quem aprende o conceito de maquina de estados no momento que esta fazendo esse cadastro? Posso apostar que esse pessoal não sabe o que é stateless e statefull e o professor nem pensa q isso seja importante (aqui eu lembro da agenda de telefones que eu fiz em pascal).

Fica aqui a minha sugestão. Espero que faça sentido :)

segunda-feira, 1 de outubro de 2007

Convertendo Números

Um dos meus primeiros desafios na área de programação foi fazer um conversor de números decimais para romanos. Eu estava aprendendo Turbo Pascal e usava um potente 286 com 1MB de memória - sem HD.

Fiz a maior sequencia de ifs da minha vida. Hoje estava relembrando e resolvi fazer uma versão SED.

/[0-9]*[5-9]...$/q
s/1...$/M&/;s/2...$/MM&/;s/3...$/MMM&/;s/4...$/MMMM&/
s/6..$/DC&/;s/7..$/DCC&/;s/8..$/DCCC&/;s/9..$/CM&/
s/1..$/C&/;s/2..$/CC&/;s/3..$/CCC&/;s/4..$/CD&/;s/5..$/D&/
s/6.$/LX&/;s/7.$/LXX&/;s/8.$/LXXX&/;s/9.$/XC&/
s/1.$/X&/;s/2.$/XX&/;s/3.$/XXX&/;s/4.$/XL&/;s/5.$/L&/
s/1$/I/;s/2$/II/;s/3$/III/;s/4$/IV/;s/5$/V/
s/6$/VI/;s/7$/VII/;s/8$/VIII/;s/9$/IX/
s/[0-9]//g


Tendo um número por linha ja basta.

$ echo '3999' | sed -f other.sed
MMMCMXCIX


O sed é realmente fantástico! Pena que acima de 5 mil tem que colocar uma barra em cima dos números.

domingo, 30 de setembro de 2007

Aprenda Java com os melhores versão Tropa de Elite

Exatamente: Não vem com essa que vc é istudante, vai tomar tapa na cara se não aprender Java. Saiba que, de cada 100, só 5 terminam o curso. Nem na Sun se treina programador assim.

/*
* O Bope foi criado para atuar quando a policia perde o controle
* E no rio de janeiro isso acontece com bastante frequencia
*/
class Bope{

private String nome;
private int vitimas;

public Bope(String nome){
this.nome = nome;
this.vitimas =0;
}

public void matou(int tantas_vitimas_agora){
this.vitimas = this.vitimas + tantas_vitimas_agora;
}

public int quantas_vitimas(){
return this.vitimas;
}
}

public class Programa{
public static void main(String [] xxx){
// Apresento o capitão nascimento
Bope capitao = new Bope("Capitao Nascimento");

// quando o capitão sobe a favela, é pra matar, não pra morrer
capitao.matou(1000);

// agora ele subiu o morro de novo, com ele não tem erro.
capitao.matou(2000);

// e a farda dele não é azul, é PRETA
System.out.println("O Bope matou: " + capitao.quantas_vitimas());
}
}


Entendeu? Não?

ENTÃO PEDE PRA SAIR, GUERREIRO!
TU É CORRUPTO, TEU LUGAR É COM .NET, É COM VB! JOCKEY DE IDE! PEDE PRA SAIR AGORA!

sexta-feira, 28 de setembro de 2007

Ruby e o method_missing

Os objetos em Ruby possuem um método chamado 'respond_to?' para verificar se o objeto possui (ou melhor, se ele responde a) um determinado método. Em uma linguagem dinâmica como o ruby, onde podemos incluir um método numa classe em runtime, é um recurso muito necessário, ainda mais se pensarmos em termos de Duck Typing.

Em caso de dúvida, basta fazer um if, afinal chamar um método que não existe causa um NoMethodError, certo?

Depende. Observe:

class A
def xxx()
puts "xxx"
end
def method_missing(m, *args)
puts "nao tenho esse metodo: #{m}"
end
end

a = A.new
a.xxx
# aqui normalmente daria erro e o script seria abortado
# sem o rescue adequado
a.yyy


Resultado:
~> ruby A.rb
xxx
nao tenho esse metodo: yyy


Eu sobreescrevi o método 'method_missing', que como o próprio nome indica, intercepta uma chamada a um método inexistente. Divertido, não?

segunda-feira, 24 de setembro de 2007

Ruby e suas travessuras

irb(main):001:0> def some(thing)
irb(main):002:1> puts "some#{thing}"
irb(main):003:1> end
=> nil
irb(main):004:0> some "thing"
something
=> nil
irb(main):005:0> some = "thing"
=> "thing"
irb(main):006:0> some(some)
something
=> nil

sábado, 22 de setembro de 2007

Ajude para ser ajudado.

Não é incomum encontrarmos pedidos de ajuda (as vezes em caps lock, com a palavra "urgente" e com açassinatos ao idioma corrente) em listas de discussão ou foruns.

Por exemplo:

no postgresql o comando sql abaixo funciona perfeitamente

"SELECT c.descricao, u.nome, v.data_venda ,"
+ "v.valor_total, v.condicao_pagamento, v.codigo"
+ "from venda v, carro c, usuario u"
+ "where v.carro = c.codigo and v.usuario = u.codigo";

mas quando executo no java ocorre erro


Não vejo diferença entre falar apenas isso e esta conversa pelo telefone:

- Alo, consultório médico
- Doutor, é a primeira vez que ligo, nunca nos vimos...
- Pronto, me diga o que esta sentindo.
- me sinto mal...
- Ah, tome um chá de joaçaba com mel e 2 anti-coagulantes
- Certo, e quanto a isso aqui na minha perna?
- Humm... vamos ter que operar. Ou espera uma semana que passa...


Enfim...

Resumo do primeiro Chopp on Rails de Poa

O pessoal da lista rails-rs organizou um encontro em um local com bastante cerveja.

Acho que a melhor descrição do que poderia ter sido é esta:

terça-feira, 18 de setembro de 2007

Curso de Ruby on Rails em Porto Alegre

Uma oportunidade imperdível!

A Tech Office IT realiza no período de 24 a 28 de setembro de 2007 em Porto Alegre, o curso presencial Ruby on Rails, voltado a desenvolvedores Ruby que desejam conhecer mais sobre Rails e desenvolvedores de outras linguagens que tenham interesse em ingressar no RoR. O curso objetiva auxiliar o aluno a entender o Ruby on Rails e possibilitar a criação de aplicações o utilizando, além de expor suas vantagens e limitações.

Após o curso o aluno estará apto a desenvolver aplicações WEB utilizando o Ruby On Rails, saberá onde procurar mais recursos para acelerar o desenvolvimento e adicionar recursos na aplicação desenvolvida.

Com carga horária de 20 horas/aula, o treinamento será 100% prático e ministrado em laboratório. Durante o curso, os participantes desenvolverão uma loja de DVDs completa que poderá ser utilizada como exemplo ou como base para o desenvolvimento de uma aplicação mais complexa pós-curso. Mais informações poderão ser obtidas através do site www.techoffice.com.br ou e-mail contato (at) techoffice (.) com (.) br, além do telefone 51.3012.8241.

Mais detalhes sobre o curso de Ruby on Rails

Clique aqui para se inscrever no curso de Ruby On Rails

Se alguem não sabe o poder do Ruby on Rails, veja esse video:

Vagas Abertas!

Pessoal, trago aqui pelo menos 5 oportunidades de ingressar em uma das maiores empresas de tecnologia do mundo. O ambiente de trabalho é excelente, as condições são muito boas e existem muitas possibilidades de crescimento. Todas as vagas são para trabalhar em Porto Alegre/RS.

Desenvolvedor C# - 3 vagas
Experiência em desenvolvimento/programação de SW em C# e .Net
Conhecimentos sobre UML e OO e design patterns
Conhecimentos sobre XML e XPATH
Inglês avançado/fluente

Desenvolvedor/Testador - 2 vagas
Experiência na área de teste de software
Conhecimento de WebServices e protocolos SOAP e HTTP
Conhecimento de XML, XPATH e alguma linguagem Script
Experiência em OO
Inglês fluente

É claro, caso alguem queira ingressar na área de informática, eu sugiro que pense nessa vaga:
Testador de Software
Experiência na área de teste de software
Conhecimentos em Banco de Dados e SQL (select, update, insert,delete)

Aos interessados enviar email com currículo para tiago (.) peczenyj (at) gmail (.) com

quarta-feira, 29 de agosto de 2007

Die Working Hardly

Sensacional Filme sobre efeitos especiais... sem efeitos especiais.

Foi dirigido pelo Zach Lipovsky, para concorrer no On The Lot, um dos programas mais inteligentes dos ultimos tempos: um reality show sobre cinema e o vencedor ganhou um contrato com a Dreamworks e foi trabalhar com o Steven Spielberg (entretanto não foi o Zach que ganhou)!

Quem não gostaria de fazer isso no seu proprio ambiente de trabalho?



Link aqui.

terça-feira, 28 de agosto de 2007

Metaprogramação com awk e sed

Criar um programa que cria programas é simples nas linguagens interpretadas.

Criamos o programa em uma string e executamos via eval() ou então gravamos em arquivo e executamos novamente.

Me deparei com o seguinte problema: inverter as palavras de uma frase ou arquivo mantendo a ordem em que aparecem.

É claro que eu pensei em usar o rev, mas ele inverte a linha como um todo. Depois de fazer um laço for muito feio em awk, fiquei pensando em como resolver de forma mais legível.

Tive esta ideia: vou fazer uma lista de palavras, inverte-las com o rev e, para cada palavra, vou substitui-la pela palavra invertida. Beleza, o sed faz isso com um pé nas costas.

Eu tenho um arquivo (poderia ser um named pipe) chamado 'direito' que contem uma lista de palavras sem repetição, com uma palavra por linha. Outro arquivo, com o mesmo conteudo mas revertido via 'rev'.

Uso o paste para colocar os arquivo lado a lado e uso o awk para gerar comandos como este:

s/\bpalavra\b/palavra_revertida/g;


Usei o awk pq a sintaxe fica mais clara, o sed ficou muito poluído. Perceba que eu uso o recurso de borda das expressões regulares. Isso me garante que vou trocar uma palavra inteira, e não um pedaço da string.

Agora vem o pulo do gato: mando estes comandos via stdin para o sed, fazendo uso de um pipe. eu informo para o sed que os comandos virão pela stdin passando a opção -f -

Vejam o resultado abaixo, espero que seja útil para alguem :)

$ cat stuff
Nosso fórum principal.

Problemas com hardware em geral,

temperaturas, comparação de desempenho,

compatibilidades de componentes, etc.

$ LC_ALL=pt_BR grep -oE '\w+' stuff | sort -u | tee direito | rev > reverso

$ paste direito reverso | awk '{
printf "s/\\b%s\\b/%s/g;\n",$1,$2 # facil, não?
}' | sed -f - stuff
ossoN muróf lapicnirp.

samelborP moc erawdrah me lareg,

sarutarepmet, oãçarapmoc ed ohnepmesed,

sedadilibitapmoc ed setnenopmoc, cte.

Como o arquivo possui acentos, precisei setar a variavel LC_ALL para pt_BR, caso contrario a expressão regular \w+ não iria casar com todas as palavras.

Ps: Julio, que tal chamar isso de "Inversor do Tiago"?

Extended Globbing

Não sei se é conhecimento de todos mas o Bash possui, alem do globbing normal (a expansão * ? e [a-z] de nomes de arquivos e diretórios), um globbing extendido.

Acho que, em alguns casos, podera ser BEM util, eliminando um pipe para um grep por exemplo.

São eles (direto do man)

?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches exactly one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns

Para poder utiliza-lo precisa executar o shopt conforme o exemplo abaixo

$ shopt -s extglob

$ ls
file filename filenamename fileutils

$ ls file?(name) # padrão pode aparecer 0 a 1 vezes

file filename

$ ls file*(name) # padrão pode aparecer 0 a N vezes
file filename filenamename

$ ls file+(name) # padrão pode aparecer 1 a N vezes
filename filenamename

$ ls file@(name) # padrão deve aparecer 1 unica vez
filename

$ ls file!(name) # divertido esse! padrão NÃO deve aparecer
file filenamename fileutils

$ ls file+(name|utils) # cada padrão pode aparecer 1 a N vezes
filename filenamename fileutils

$ ls file@(name|utils) # "lembra" um file{name,utils} ;-)
filename fileutils

sábado, 18 de agosto de 2007

JEDI - Java Education and Development Initiative

JEDI e o ensino de Java gratuito

Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystems, nasce através do Java Research & Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.

A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.

Tecnologia Java

A tecnologia Java está presente, hoje, em 2 bilhões de dispositivos tecnológicos em todo o planeta - e também fora dele, já que podemos localizar dispositivos Java rodando até em Marte. Existem hoje, no mundo, cerca de 579 milhões de celulares com Java, 93 operadoras de telefonia móvel, 750 milhões de cartões SmartCard (do tipo JavaCard) distribuídos, 650 milhões de computadores pessoais e com 2 milhões de cópias da plataforma empresarial J2EE. Por isto, 68% das novas aplicações, hoje, são desenvolvidas em Java, que substituiu o C++ como a competência mais procurada pelos profissionais. É executado em múltiplas plataformas e em uma ampla gama de dispositivos, indo de um pequeno chip em SmartCards aos servidores dos Grandes Data Centers.

Demanda por Profissionais

Com tudo isso, existe hoje, uma demanda por 2 milhões de novos profissionais de TI a cada ano. Desenvolvedores Java, devem prover soluções nas mais diversas áreas de tecnologia. Torna-se crescente a necessidade, por exemplo, do desenvolvimento de soluções para aparelhos celulares que demandam uma integração com sistemas legados, de maneira a fornecer soluções corporativas. A partir disto, o conhecimento de Java e de sistemas abertos, são imprescindíveis para profissionais de TI.

Além da demanda, a tendência é um outro fator motivador para este mercado. No Brasil, esta aponta para direção de trabalhos realizados para clientes de fora do país - o outsourced. É crescente a procura por parte das organizações, o desenvolvimento de projetos baseados em tecnologia Java, distribuindo-se as aplicações desenvolvidas aqui pela Internet.

Todavia, a busca do mercado por esse perfil de profissional vai de encontro com a capacidade de fornecimento do conhecimento Java. O fato é que, o mercado tem dificuldade em encontrar desenvolvedores com competência nos fundamentos de Tecnologia da Informação, orientação a objetos, conhecimento e experiência em Java avançado, competência em comunicação e nas relações interpessoais.

A industria de software supre o despreparo dos profissionais formados pelo mercado, com a necessidade de re-treinamento interno dos novos contratados, muitos graduados sem conhecimento em TI. A grande maioria não tem uma certificação, que tem um valor adicional no mercado, especialmente para trabalhos executados fora do pais. Outro fator que colabora para o despreparo do profissional é fato do treinamento oficial Java da Sun ser relativamente caro e os programas de treinamento interno das empresas atuais serem pouco abrangentes. Disso resulta uma contratação de apenas 5% dos currículos recebidos nas empresas.

Academicamente o treinamento é, muitas vezes gratuito e de boa qualidade, é acessível. Contrastando, os professores não possuem experiência prática das demandas da indústria e não há, por parte de centros acadêmicos, a compreensão com respeito ás preocupações da industria de software, que não conseguem cobrir as necessidades que o mercado exige. Aliado a isso, está a dificuldade de alterar os currículos acadêmicos.

E o JEDI ?

O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais, slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas. Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.

Na Filipinas já existe uma estrutura acadêmica dividida em fases. Na primeira fase foram disponibilizados os cursos de Introdução a programação I (versão 1.3); Introdução a Programação II (versão 1.1) e Estruturas de Dados (versão1.1). Na segunda fase os cursos de Engenharia de software (versão 1.0); Desenvolvimento de aplicações móveis (versão 1.0); Programação Web (versão 1.0). Na terceira fase, os cursos de Web Services; Segurança em Java e Programação, modelagem e análise orientada à objetos. Completando quatro semestres de curso com: Sistemas operacionais; Gerenciamento de projetos orientados à objetos e Inteligência artificial. Todo este material está atualmente disponível para download, em Inglês, no site Java.net.

A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas através de JP Petines (Java champion), no Brasil através de Daniel deOliveira (Java champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.

Hoje o JEDI concentra o maior número de membros nas Filipinas. Desde fevereiro de 2005 até abril de 2006 são 110 escolas - 10% de todas as universidades e faculdades das Filipinas aderentes ao programa; Foram realizados 13 treinamentos e formados 207 instrutores multiplicadores, que formaram 1.318 instrutores que atendem a 48.205 estudantes.

Países de Língua Portuguesa

O Brasília Java Users Group - DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Angola, Cabo Verde, Guiné-Bissau, Brasil, Moçambique, Portugal, São Tomé e Príncipe; Timor Leste serão países que poderão fazer o treinamento em língua nativa, com todos os recursos que a iniciativa provê. O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que fornece ao grupo apoio logístico, administrativo e jurídico.

Atualmente, o Brasil conta, segundo a SUN Microsystems, com 70 mil desenvolvedores Java e 43 grupos de usuários Java, com mais de 25 mil membros participantes. É através do apoio destes grupos distribuídos em todos os estados da nação que esta iniciativa espera se consolidar, para elevar o nível de aprendizado Java, provendo melhores profissionais para atender as exigências do mercado mundial.

Como participar do JEDI ?

No momento estamos trabalhando na tradução e adaptação do material utilizado na Filipinas. Um vez que este esteja concluído, os cursos poderão ser acessados pelo site. Ao concluir o processo cada aluno terá que fazer uma prova presencial para obter a sua certificação, que será oferecida agentes que serão certificados em todo Brasil.

O DFJUG necessita de pessoas para corrigir e dar opiniões sobre todo o material produzido e realizar testes de Stress no site aonde o JEDI será hospedado, isso é um trabalho que somente poderá ser realizado com o apoio de toda a comunidade javanesa existente no Brasil. Quem quiser participar da iniciativa, no Brasil, deve acessar a página do DFJUG (www.dfjug.org) e entrar em contato com o grupo. Junte-se a nós, participe no instrutor ou como aluno desta iniciativa, poderemos assim enriquecer o conhecimento da linguagem e difundi-la de uma forma totalmente gratuita, voluntária e colaborativa, no Brasil e em diversos paises de língua portuguesa, será seu trabalho e seu empenho que ajudará elevar o Brasil ao hall dos melhores desenvolvedores JAVA no mundo.

quinta-feira, 16 de agosto de 2007

I Jornada em Defesa do Pensamento Científico

A disciplina de Metodologia Científica do curso de Geociências e
Educação Ambiental do Instituto de Geociências da USP e a Sociedade
Brasileira de Céticos e Racionalistas
realizarão a I Jornada em Defesa
do Pensamento Científico.

Abaixo mais detalhes e a programação:
—————
Data: 18 de setembro (terça-feira)
Local: IGc/USP - R. do Lago, 562 - Cid. Universitária - Butantã - São
Paulo - SP

Programação:
09h10 a 09h30: Abertura Prof. Drs. Arlei Benedito Macedo (USP) e
Renato Sabbatini (Unicamp).
09h40 a 10h20: Analfabetismo científico, Prof. Dr. Renato Sabbatini
(Unicamp).
10h20 a 10h40: Café.
10h40 a 11h20: Criacionismo, Prof. Dr. Mário de Pinna (USP).
11h30 a 12h10: Como vender o pensamento não-científico, Prof. Dr.
Francisco Stefano Wechsler (UNESP)
12h10 a 14h00: Almoço.
14h00 a 14h40: Sensacionalismo e Jornalismo Científico, - Ulisses
Capozzoli - Astronomy Brasil).
14h50 a 15h30: Pensamento Crítico - Panorama da América Latina - Sr.
Alejandro J. Borgo (Pensar - CFI/Argentina)
15h30 a 15h50: Café
15h50 a 16h30: A defesa do pensamento científico nas universidades e
centros de pesquisa (mesa-redonda).
16h40 a 17h10: Resultados preliminares da pesquisa sobre
Pseudociências (alunos do LIGEA)
19h00 a 19h40: Ilusões e equívocos do pensamento humano, - Dr. Sérgio
Navega - (Intelliwise Research and Training).
19h40 a 20h00: Sumário e encerramento, - Prof. Dr. Francisco Stefano
Wechsler - UNESP).

Taxa de inscrição: R$ 60,00
Mais informações: palestrasreflexoes2007@gmail.com

sábado, 11 de agosto de 2007

Implementando um Corretor Ortográfico

O maluco do Peter Norvig (google) publicou no seu site o artigo How to Write a Spelling Corrector. Impressionante o que 21 linhas de Python são capazes de fazer!

>>> correct('speling')
'spelling'
>>> correct('korrecter')
'corrector'


Não é atoa que o Google é o que é hoje em dia.

Linux para Leigos

Vamos analisar a condição de leigo.

Eu já vi centenas de leigos que, ao sentar no computador, baixavam músicas, videos e jogos com os mais diversos programas, conectavam no irc, msn, icq, colocavam luzinhas e bichinhos animados para acompanhar o cursor do mouse, trocavam as fontes e os temas, procuravam os mais bizarros jogos, encontravam videos extremamente incomuns (sem youtube), etc. Para o que não presta, os leigos tem uma criatividade impressionante!

Quando falamos em um sistema pra leigos não precisamos pensar que as usuarios tem preguiça mental. Eles até podem ter, mas aí cabe aos projetistas desafiar e exercitar essa criatividade do mal e tranformar em criatividade do bem. Qualquer pessoa que senta na frente de um browser vai acabar nas paginas mais escabrosas mesmo que não sabia o que é 'google'. Vai me dizer que, nesse caso, a linha de comando é ameaçadora ou difícil?

Das duas, uma: ou pensamos em uma camada de software para permitir que um usuario abstraia o sistema operacional e as configurações (normalmente se faz isso em sistemas "embarcados") e use todos os recursos multimídia e de troca de informação com a facilidade de um pensamento OU pensamos em sistemas mais inteligentes, com documentação adequada e, com a ajuda da comunidade, divulgamos as informações e conceitos corretos. O Linux só é seguro porque o usuario comum, que vai fazer besteira, não tem a senha de root.

Não podemos fazer sistemas operacionais à prova de gente sem noção ou que sejam capazes de oferecer tanta intuitividade sem sacrificar a segurança, por exemplo.

Puxa, não tem nada mais fácil que usar a linha de comando (ok, sou suspeito pra falar). As pessoas não usam [o shell] pois não tem como acessar o orkut, ver vídeo do youtube, etc, de um jeito bonitinho. Alem de tudo, tá em inglês, ECA. Hoje em dia existem shells para pessoas iniciantes que ajudam, colorem o texto e sugerem mudanças praticas, como o fish.

É assim que fazemos um sistema pra leigos -- temos que desafia-los a usar a criatividade que normalmente é usada pra criatividade do MAL e mostrar que um PC com linux não é um playstation. Quer usar um browser de verdade e usar o orkut e o youtube? PO! não tem nada mais facil que instalar um ubuntu da vida e clicar no icone do firefox!

Não vamos tomar atitudes de forma a não desafiar intelectualmente os usuários. Eles merecem todo o nosso respeito. Agora quem quer que o usuário não pense que faça uma camada de software que abstraia o Sistema Operacional. Existe mercado para ambas as coisas.

Entretanto acho mais humano que a gente exercite os cérebros atrofiados dos empurradores de mouse. Há 20 anos as pessoas usavam computadores com 32 kb de RAM e carregavam os jogos de uma fita K7 e ninguem morreu por isso -- pelo contrário desenvolveram skills hoje necessárias em muitos cargos importantes e empresas como algumas multinacionais procuram desesperadamente.

sexta-feira, 10 de agosto de 2007

Torvalds - A Microsoft simplesmente não me interessa


Será que Linus Torvalds e a comunidade do software livre podem vencer esta guerra contra as legiões de Bill Gates?

Linus Torvalds - Não vejo isso como uma “batalha”. Faço o que faço porque gosto e acho que vale à pena, e não estou nessa por causa de nenhuma cruzada anti-Microsoft. Usei alguns produtos da Microsoft ao longo dos anos, mas nunca nutri uma forte antipatia contra eles. A Microsoft simplesmente não me interessa. E o movimento de código aberto não é um movimento anti-Microsoft, apesar de haver certos grupos que talvez participem devido aos seus sentimentos anti-Microsoft.

O código aberto é um modelo sobre como fazer coisas, e eu acredito que este é um jeito muito melhor de fazer as coisas. O código livre vai tomar conta do mercado não por causa de nenhuma “batalha”, mas simplesmente porque jeitos melhores de fazer as coisas eventualmente tomam o lugar de métodos inferiores.

Por acaso a “ciência” é uma batalha contra a “ignorância”? Não, a ciência simplesmente é. E ela funciona tão bem que assume o lugar de velhas noções ignorantes. Não precisamos nos preocupar com gatos pretos cruzando a nossa frente, passar por baixo de escadas ou espelhos quebrados, pois hoje sabemos como o mundo funciona, e nos demos conta de que gatos pretos não são mais um sinal de perigo.

Fonte: idgnow

Sem mais palavras...

terça-feira, 7 de agosto de 2007

Google Wars

Inutilidade Pública: veja o que/quem possui mais resultados no google?

./GoogleWars.sh  superman batman
batman 48500000
superman 33700000

./GoogleWars.sh gremio inter
inter 213000000
gremio 5560000

./GoogleWars.sh hp ibm
hp 379000000
ibm 147000000

./GoogleWars.sh cobol java fortran perl ruby lisp haskell
java 272000000
perl 103000000
ruby 101000000
lisp 21400000
fortran 17400000
haskell 15400000
cobol 10900000

O script é simples, abusando um pouco do SED e do AWK, com um toque de SORT ;-)

#!/bin/bash
COR=`echo -ne '\e[31;1m'`
END=`echo -ne '\e[m'`
CORSED="1s/.*/${COR}&${END}/"
GOOGLE='http://www.google.com/search'

[[ $2 ]] || { echo "usage: $0 item item2 [ ... item n]" ; exit 0 ; }

SEDCMD='/did not match any documents/{s/.*/0/g;p;q}
/Results/{s/.* about[ ]\+\([0-9,.]\+\).*/\1\n/;p;q}'
AWKCMD='{ result[$1]=$2 ; x = length($1) ; if(x > max) max=x }
END{ for(i in result) printf "%-"max"s\t%s\n",i,result[i]}'

for i in "$@" ; do echo -ne "${i}\t"
lynx -dump "${GOOGLE}?q=${i}" | tr -d '\n.,' | sed -n "${SEDCMD}"
done | awk -F '\t' "${AWKCMD}" | sort -nr -t $'\t' -k 2 | sed "${CORSED}"


Quem quiser melhora-lo, sinta-se à vontade :)

Edit: ja lancei uma versão .02 com umas correções cosméticas aqui -- não resisti...

segunda-feira, 6 de agosto de 2007

Considerações de Segurança

Me irrita profundamente usar um script que pressupõe certas definições no meu ambiente sem aviso prévio. O caso mais comum é, em algum *nix, acreditar que o diretório corrente faz parte do PATH -- contrariando uma regra básica de segurança, inclusive.

Não é dificil fazer ./programa (na verdade com o tempo isso vira padrão até). Fica uma dica importante: nunca façam suposições a respeito do ambiente, variaveis, estruturas de diretórios sem documentar ou fazer os testes necessários (pelo menos quando for fora de algum padrão).

sexta-feira, 3 de agosto de 2007

Nightwish - Wishmaster Versão Alternativa

Sensacional esta 'versão':



Hamster - Apprendice - HeartBurn - Seven Seagals - Mario - this Apple - in me - Jewish Master !

Se não conseguiu visualizar clique aqui.

Caçadores da Classe Perdida

Eu já tinha feito algo parecido mas este post do Claudio Miranda reavivou a minha memória.

#!/bin/bash
[[ $2 ]] || { echo "Uso: ${0} diretorio classe" ; exit 1 ; }
find "${1}" -name \*.jar -print | xargs -n 1 unzip -l 2>&- | awk -v class="${2}" '
BEGIN { IGNORECASE=1 }
/^Archive/ { file="\nArquivo:\n\t"$NF": \nClasses:\n\t" }
/class$/ && $NF ~ class { print file,$NF ; file="\t"; total++ }
END { print "\nTotal",total + 0,"classes encontradas!" }'


Informando como parâmetros um diretório de partida e um fragmento do nome da classe, o find localizará todos os arquivos com extensão jar e vai mandar pro nosso amigo xargs. Este envia um a um para o unzip que lista (-l) o conteúdo de cada arquivo. Eu poderia procurar a classe que eu quero com o grep, mas o awk foi a escolha para formatar melhor a saída de dados.

Perceba que a variavel IGNORECASE tem valor diferente de 0, assim eu posso procurar por um trecho do tipo xml ou XML. Eu preciso saber o nome do arquivo 'corrente' e isso é informado pela linha que começa com 'Archive'. Quando eu encontro uma linha que termina com 'class' e o ultimo campo ( $NF ) 'casa' com o fragmento de nome (alias pode ser uma expressão regular!) eu imprimo esta linha.

Eu fiz uma sacanagem pra saída de dados ficar 'bonitinha', que é imprimir o 'cabeçalho' apenas uma vez, depois eu troco por tab (\t) -- e no final eu mostro um sumário com o número de referências encontradas.

Este script pode ser modificado para outros propósitos. Note que eu procuro tanto no nome da classe quando no nome dos pacotes (diretórios), assim xml poderia casar com XMLHelper.class ou /java/xml/foobar.jar -- mas basta ser criativo para resolver isso!

quinta-feira, 2 de agosto de 2007

Powders Graduation

Os programas de tradução estão cada vez melhores.

Pós Graduação = Powders Graduation

Graduação em Pó? Pulverizada?

São 22 resultados no google até o momento!

Usando o curl com Endereços IPv6

Hoje em dia usar endereçamento IPv6 parece um pouco exótico, porém aos poucos ele começa a aparecer em algumas redes internas e logo será a unica saída quando todos os 32 bits do IPv4 estiverem em uso, previsto para 2012.

Diga adeus ao "206.45.32.234" - longa vida ao "2001:bce4:5641:3412:341:45ae:fe32:65". Perceba como agora utilizamos a representação hexadecimal e cada quarteto é separado por um ':' -- o que torna mais fácil a sua memorização (e viva o DNS). Um bom artigo introdutório pode ser lido aqui.

Pois bem, imagine agora que precisamos acessar uma pagina em um servidor (por enquanto interno) através de um endereço IPv6. A url ficaria assim, por exemplo:

http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php


Como o caracter ':' é usado em uma url para separar o servidor da porta (é claro que isso é omitido na maioria dos casos, quando usamos a porta 80), e tiveram que proteger o ip entre [colchetes]. Um browser como o Firefox consegue entender esta url facilmente, entretanto não tive a mesma sorte ao usar os browsers modo texto mais comuns - lynx e o curl.

Não subestime a importância destes browsers! Muitas vezes nos encontramos em um sistema com poucos recursos ou precisamos efetuar certas ações via algum script e eles caem como uma luva -- principalmente o curl, que simplesmente transfere informações de/para um servidor web, fazendo GET, POST, HEAD, upload de arquivos, etc.

No man do curl descobri que o mesmo depende da libcurl ser capaz de resolver endereços ipv6 - inclusive posso forçar a usar apenas ipv6 com a opção -6.

Entretanto o curl tem outra interpretação dos colchetes em uma url -- elas são um recurso de sequência para multiplos downloads (da mesma forma como o bash faz, porém é interno ao curl), como nesse exemplo:

curl 'http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html'


Para desabilitar este "URL globbing parser" basta usar a opção -g, o que nos leva a solução completa:

curl -6g 'http://[2001:bce4:5641:3412:341:45ae:fe32:65]:8000/index.php'


Caso não queria desabilitar o globbing, basta 'escapar' os colchetes usando a contra-barra antes. O curl é um programa extremamente versátil, um verdadeiro canivete suíço na linha de comando, vale a pena estuda-lo em algum tempinho livre.

quinta-feira, 26 de julho de 2007

Barbosa

Trinta e oito anos depois da Copa do Mundo de 1950, um homem volta no tempo a fim de impedir o gol que derrotou o Brasil, destruiu seus sonhos de infância e acabou com a carreira do goleiro Barbosa.

Premiadíssimo curta de Jorge Furtado e Ana Luiza Azevedo, de 1988, unindo ficção científica e futebol de uma forma incrivelmente brasileira. Com Antônio Fagundes e Zé Vitor Castiel.

Para saber mais: CASACINEPOA

Assista aqui. Vale a pena!

Resolvendo Problemas Comuns 7 - open failed: |

Imagine um arquivo com algumas linhas duplicadas:

$ cat arquivo
permission denied
bad interpreter
missing separator
set correct localle
parameter list too long
unary operator expected
parameter list too long
bad interpreter


Obter as linhas distintas pode ser feito com a ajuda do sort + uniq

$ cat arquivo | sort | uniq
bad interpreter
missing separator
parameter list too long
permission denied
set correct localle
unary operator expected


- Puxa! Que ótima combinação! Vamos guarda-la?

Bom, podemos querer guardar este e outros comandos em uma variável de ambiente também, afinal, deve funcionar sem maiores problemas, certo?
$ CMD="sort | uniq"
$ cat arquivo | $CMD
sort: open failed: |: No such file or directory


- OPA! Eu sabia, maldito shell, encrenca com tudo!

Tsc... isso acontece porque o pipe | não foi informado como um 'pipe' e sim como a string "|" -- e o sort não conseguiu abrir o arquivo "|".
Este tipo de problema pode ser resolvido pelo eval -- ele interpreta novamente as strings na linha de comando.
$ eval "cat arquivo | $CMD"
bad interpreter
missing separator
parameter list too long
permission denied
set correct localle
unary operator expected


- Ah, agora funciona. Mas esse eval ai ficou feio...

Então vamos criar um alias para o comando!
$ alias cmd="sort | uniq"
$ cat arquivo | cmd
bad interpreter
missing separator
parameter list too long
permission denied
set correct localle
unary operator expected


Perceba que o comportamento do alias é diferente de uma variavel de ambiente. Devemos ficar atento à correta interpretação da nossa linha de comando pelo shell corrente, senão vamos ter resultados nem sempre amigáveis.

Ah, sim, o cat nesse exemplo é completamente supérfluo, poderia ser assim: 'sort arquivo | uniq'

- E o uniq precisa do sort ?

Sim... sem o sort ele fatalmente vai se perder, e é muito mais facil eliminar linhas repetidas que estejam em sequencia do que aleatórias. É bom dar uma lida no man destes comandos pois possuem opções muito poderosas!

Resolvendo Problemas Comuns 6 - unary operator expected

Uma desatenção, muito comum quando trabalhamos com variáveis de ambiente no shell é que, quando elas não foram setadas ainda, o shell expande elas para... nada.

$  [ $XALALA == "oi" ] && echo 'ok' || echo 'nok'
-bash: [: ==: unary operator expected
nok


Nesse caso o (resultado do) teste da variável até pode fazer sentido, porém troque o == por um != e veja o resultado. A solução é proteger a variável com aspas!

$  [ "$XALALA" != "oi" ] && echo 'ok' || echo 'nok'
ok


Simples e rápido!

Resolvendo Problemas Comuns 5 - The parameter list is too long

Essa é raro, mas acontece

$ cd /meu/diretorio
$ rm *.dll
Error: The parameter list is too long


- O que? Eu não posso apagar todos os meus 3459834574935734957 arquivos?

Bom, primeiro vamos analisar o que aconteceu: a linha de comando 'rm *.dll' é expandida pelo shell corrente a 'rm arquivo1.dll arquivo2.dll ... arquivoN.dll' e, nesse caso, esta lista de parâmetros foi demais pro probrezinho do rm.

Com o xargs é facil de resolver!
$ find /meu/diretorio -name '*.dll' -print | xargs rm


O que ele faz? o xargs recebe pela stdin toda uma lista de parâmetros que será entregue ao programa rm. Se esta lista extender o limite do sistema, então o xargs, inteligentemente, irá executar o rm uma vez, com a lista que for possível e, depois, executar de novo, até que todos os parâmetros sejam lidos. Aliás o xargs possui muitas opções interessantes, vale a pena dar uma estudada nele.

E assim todas as dll's são apagadas -- em definitivo, pois com rm 'tr00' não tem undelete ;-)

Resolvendo Problemas Comuns 4 - Corrigindo o localle

Precisamos estar atento que as variáveis de ambiente de localização podem atrapalhar, e muito, o comportamento de algumas expressões regulares.

Por exemplo, se eu quero encontrar uma palavra que começe com a e termine com o (ex: ação)

$ cat arquivo
luz, camera, ação
$ grep -oE 'a\w+o' arquivo # nao mostra nada!

Antes de sair dizendo que o linux, grep ou as expressões regulares não prestam, vamos testar o mesmo comando no nosso 'idioma'
$ LC_ALL=pt_BR grep -oE 'a\w+o' arquivo
ação

Ahá! Agora vamos ver um exemplo mais interessante:
$ tr '[:lower:]' '[:upper:]' < arquivo
LUZ, CAMERA, AçãO
$ LC_ALL=pt_BR tr '[:lower:]' '[:upper:]' < arquivo
LUZ, CAMERA, AÇÃO

Perceberam como a variavel altera o comportamento das ERs?

Como ultima dica: sempre que precisarem comparar textos independente da 'caixa' (se maiúscula ou minúscula), usem os recursos de ignorecase da ferramenta utilizada. Converter um texto todo para minúscula pode não apenas ser afetado pela localização como existem idiomas onde alguns caracteres não tem o exato correspondente entre uma caixa e outra como nós pensamos -- é o caso do idioma Turco, onde o 'i' maiúsculo não é 'I'. E, principalmente, não tente fazer isso.

Mais informações em 'man locale' ;-)

Resolvendo Problemas Comuns 3 - missing separator

O make é um comando incrivelmente poderoso, principalmente para programadores, permitindo que tarefas sejam organizadas de acordo com dependências, por exemplo.

Um caso básico seria construir um grande programa, composto de diversos arquivos-fonte. O Makefile permite que vc compile apenas os arquivos que vc alterou desde o ultimo build, por exemplo, comparando o timestamp do fonte com o codigo objeto gerado.

Bom, ai um Makefile poderoso foi editado num editor de texto profissional e, na hora de testar, nos deparamos com:

$ make    
Makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.

$ cat Makefile # nome padrão de arquivo para o make.
# um makefile comum
all:
@echo "oi mundo"


Puxa, parece tudo certo... entretanto ai vai um pequeno detalhe: para cada target do makefile, os comandos que vem a seguir devem começar por um TAB (alias a mensagem de erro é bem clara nesse sentido, certo?). Vamos conferir:

$ cat -A Makefile   # é mais pontente que o -v
# um makefile comum$
all:$
@echo "oi mundo"$


Tcharam! Se a linha do echo iniciasse com um TAB, como deveria ser, apareceria um ^I no inicio da linha. Provavelmente a origem disso é um editor de texto que transforma os TABS em 8 espaços por questões estéticas. Vamos corrigir o Makefile?

$ sed  -i 's/^\ \{8\}/\t/' Makefile
$ cat -A Makefile
# um makefile comum$
all:$
^I@echo "oi mundo"$
$ make
oi mundo


Pronto, basta substituir os espaços por TAB. Outra solução corrigir em um editor de textos mas sem a opção de expansão dos TABs -- no vim basta fazer

:set noexpandtab


e editar numa boa.

Resolvendo Problemas Comuns 1 - Permission denied

Não é incomum, quando não temos experiência em shell, passar por uma situação dessas:

$ ./script.sh
-bash: ./script.sh: Permission denied


Antes de sair olhando se há algo errado com o script, vamos analisar a mensagem de erro em pt_BR: Permissão negada. Diferente de outros sistemas operacionais, no mundo *nix o que faz de um arquivo um programa executável não é a sua extensão e sim as suas permissões.

Resumidamente, existem 3 permissões básicas quando se trata de arquivos: ler, escrever e (finalmente) executar (representado pelas letras r,w e x, respectivamente). Isto é o que impede um usuário de conseguir ler os documentos de outro, por exemplo. Então, um programa, para ser executado, precisa ter esta permissão correspondente, e ai entra o comando chmod.

$ ls -l script.sh
-rw-r--r-- 1 peczenyj users 22 2007-07-26 11:08 script.sh
$ chmod +x script.sh # vamos ativar o bit de execução (x)
$ ls -l script.sh
-rwxr-xr-x 1 peczenyj users 22 2007-07-26 11:08 ./script.sh
$ ./script.sh #agora sim!!!
oi


Problema resolvido.

Resolvendo Problemas Comuns 2 - bad interpreter

Seguindo na nossa sessão de dicas, quem nunca passou por isso?

$ ./script.sh
: bad interpreter: No such file or directory

$ cat script.sh
#!/bin/bash
echo "oi"

- Hein? Mas está tudo certo, eu tenho um /bin/bash, o que está acontecendo?

Bom, vamos ver mais de perto:
$ cat -v script.sh  # 'show nonprinting'
#!/bin/bash^M
echo "oi"^M


Ahá! Tem um ^M no final das linhas atrapalhando.
- Mas o que é isso?
Muito provavelmente a origem desde script é uma maquina windows. A explicação é o caracter newline. O windows precisa de 2 caracteres para simbolizar o fim de uma linha em um arquivo texto puro, a dupla \r\n (veja link para a wikipedia), porém os *nix não precisam do \r -- que o cat gentilmente mostrou como um ^M. Este caracter a mais atrapalha o interpretador, que não recebe um /bin/bash e sim /bin/bash\r -- e isso realmente não existe.

Como resolver? Existem dois programas para este fim: unix2dos e dos2unix (as vezes aparecem como unixtodos e dostounix) que convertem os finais de linha em casos como este. Se vc abrir um arquivo texto do *nix em um bloco de texto vai ver todas as quebras de linha substituidas por um quadrado preto e todas as linhas em uma só.

Caso vc não tenha um programa conversor, pode usar o SED
$ sed -i 's/\r$//' script.sh
$ ./script.sh
oi


O tr também poderia ser usado, mas não é tão amigável.
$ tr -d '\r' < script.sh > novo_script.sh


Este detalhe pode ser muito importante um dia!

Tio Maneco

Quem se lembra do Tio Maneco?

Pois bem, descobri que foi aprovada a captação de recursos para a produção do filme "As aventuras de Reina Caiman em o resgate do Maneco" (RF Cinema e TV Ltda).

Pra mim, este é o filme mais esperado de todos os tempos, mal posso esperar para ver o Flávio Migliaccio de novo, em um dos papeis mais legais e inteligentes da tv brasileira -- afinal os filmes são impossiveis de serem achados e a série original foi apagada acidentalmente pela tv cultura.

(se alguem tiver mais informações, please, me avise!!!)

Calculando Números Primos usando Shell

Será possivel determinar se um número é primo, ou não, usando o bom e velho shell?

A resposta está no comando factor

seq 1 250 | factor | awk -F \: '$1 == $2{ print $1}' | column -x
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241


A ideia é simples: se um número é primo ele possui apenas um único fator -- ele mesmo. Basta detectar esses casos via awk (ou grep, sed, existem varias formas). Usei aqui o seq para gerar uma seqüência e o column para tabular os resultados.

Identificando linhas repetidas em varios arquivos

Vamos imaginar dois arquivos bem simples e tres formas de identificar as linhas que aparecem em ambos:

$ cat arq1
oi
awk
ciencia
oi zoi

$ cat arq2
luxo
awk
oi
luxo


Simples de perceber que as linhas 'oi' e 'awk' se repetem. Poderiamos pensar em uma poderosa união de sort + uniq
$ sort <(sort arq1 | uniq) <(sort arq2 | uniq) | uniq -d
awk
oi


Ou podemos abordar arrays em AWK (elegante, não?)
$ awk 'NR==1{ base=FILENAME } 
base == FILENAME {linhas[$0]++}
base != FILENAME && linhas[$0] { print }' arq1 arq2
awk
oi


Ou podemos usar o bom e velho grep:
$ grep -xf arq1 arq2
awk
oi

Qual a melhor abordagem? Ai depende de cada um :)

Veja toda a aula que deu origem à estes scritps aqui.

quarta-feira, 18 de julho de 2007

As Origens do Caos Aereo Brasileiro

O dia 17 de julho será lembrando, infelizmente, como a data do pior desastre aéreo em território Brasileiro. Todos os meios de comunicação enviam maciçamente informações, fotos e, sobretudo, opiniões de especialistas sobre o assunto. Não há como não se envolver -- principalmente no Rio Grande do Sul, o estado de origem da maioria dos passageiros.

As opiniões se dividem: terá sido erro do piloto (que não está aqui para se defender), a pista estava com problemas ou terá sido um acidente inevitável?

Independente da resposta, a explicação do inegável Caos Aéreo Brasileiro não está em uma Caixa-Preta, ou em Tapes de Conversa de pilotos com a torre, não foi culpa dos Controladores de Vôo muito menos do Clima. Engana-se quem acha que tudo começou com o acidente da Gol.

A resposta vem em uma apresentação do presidente da Andep (Associação Defesa dos Direitos dos Passageiros do Transporte Aéreo) Cláudio Candiota Filho, na CPI do Apagão Aéreo. Especialista no ramo que, humildemente, cedeu uma cópia para que todos possam ver o inegável desmantelamento do setor aéreo e a fome de cargos corrupta que aniquilou o sistema de aviação civil brasileiro.



Link direto para a apresentação: aqui.

Minhas condolências a todos que perderam um ente querido ou sofreram com este terrível acidente.

Baixando musicas do iJigg

O iJigg é um youtube de mp3, basicamente. É interessante para trocar músicas ou mesmo colocar um pequeno player no seu site, como este:


Escolhi a musica Surfista Calhorda, dos Replicantes. Conheci este site graças a esta dica do dicas-l.

Como todo bom nerd, decidi melhorar a dica, provendo um script para isso.

#!/bin/bash
[ -z "${1}" ] && { echo "usage: $0 < ijigg URL | ID >" ; exit 1 ; }
ID=${1##*/}
CMD='/Location\|Title/{s/<[^>]\+>//g;p}'
URL="http://www.ijigg.com/cgi-bin/loadSongData.cgi?songID=${ID}"

set - $( wget -q -O - "${URL}" | sed -n "${CMD}" | tr '\n ' '\t_' )

wget ${1} -O "${2%.mp3}.mp3"


Ao executar e passar a URL ou ID da música como argumento, eu faço uma busca no site atras de informações sobre a mesma (veja variavel URL). Esta consulta é um xml que retorna a localização do arquivo mp3 e do seu nome. Faço uns malabarismos com SED -- que nem são tão complicados assim -- e obtenho a url direta para baixar o arquivo e o seu nome em um bom formato (troco os espaços do nome por '_' -- para permanecer os espaços no nome tem q fazer mais uns malabarismos...).

Nesse caso:
$ ./ijigg.sh http://www.ijigg.com/songs/V2DA7ADPD
--15:10:05-- http://staticmdb-001.ijigg.com/songdata04/...
=> `Replicantes_-_Surfista_calhorda.mp3'
...
15:10:55 (33.26 KB/s) - `Replicantes_-_Surfista_calhorda.mp3' saved

Agora basta ouvir no seu player preferido.

segunda-feira, 16 de julho de 2007

Battlestar Galactica

Simplesmente a melhor série de ficção científica dos ultimos anos. A série é um remake de um clássico dos anos 70 -- surgida na esteira de Star Wars, mostrando os últimos humanos percorrendo as profundezas do espaço atras da mitológica Terra. O diferencial eram as batalhas dos caças Vipers contra as forças robóticas Cylons -- com o temível olho vermelho cintilante.

A nova série possui um grande diferencial: a ausência total de tecnobobagem e o clima extremamente realista e muito similar ao nosso mundo. Tirando o fato de usarem naves, eles fumam, sofrem, amam, brigam, morrem... até as armas são metralhadoras e pistolas comuns.

Isso prova que a boa ficção não são efeitos especiais ou badulaques e sim a força dos seus conceitos. Estes sobreviventes veneram os deuses gregos, mas são tão imperfeitos quanto nós. Destaque para o General Tigh com seu péssimo humor e alcoolismo crônico. Não é uma série que eles usam difratores de fótons ligados numa matriz parabólica -- eles gritam "MORRAM TORRADEIRAS" e mandam bala nos robos assassinos [quando não usam ogivas atômicas -- alguma graça tinha que ter].

Alias, robôs estes que estão muito diferentes, lembrando muito Blade Runner - aliás o novo Capitão Adama é o ator Edward James Olmos, que interpretou o enigmático Gaff no filme de Ridley Scott.

É uma série com muita energia, desespero, ação e roteiros muito inteligêntes. Temas incomuns como tortura, esquadrões da morte e estupro ja foram abordados, mostrando que é possivel ser adulto no universo FC. As filmagens no espaço são muito realistas e é a unica série de naves que as pessoas fazem sexo!

Se vc não se importa em ver uns spoilers da terceira temporada, veja a cena que, na minha opinião, e a melhor de todos os tempos!


Passa na Tv a Cabo e os DVDs estão a venda -- começe pelo piloto de 3 horas e não vai se arrepender.

Frente quer proibir aborto em caso de estupro

Sinto muito mas... isso me deixa indignado.

Criada em abril passado, a Frente Parlamentar Contra a Legalização do Aborto - Pelo Direito à Vida tornou-se um dos grupos mais atuantes do Congresso Nacional. Os 199 parlamentares, entre deputados e senadores - o que representa 33,5% das duas Casas - têm agitado os corredores da Câmara e prepara uma nova ofensiva: a distribuição de uma cartilha intitulada "Por que Somos Contra o Aborto", com 30 mil exemplares. A versão preliminar da cartilha, editada pelo presidente da frente, deputado Leandro Sampaio (PPS-RJ), não só combate a legalização do aborto como critica a autorização para a interrupção da gravidez nos casos de estupro, como prevê a lei atual. O aborto em caso de risco para a mãe, outra hipótese permitida pelo Código Penal, é questionado na cartilha, com o argumento de que os avanços da medicina permitem salvar vidas mesmo em casos de extrema gravidade. O debate em torno do aborto ganhou força desde que o ministro da Saúde, José Gomes Temporão, considerou a prática um problema de saúde pública e lançou a proposta de que a sociedade discuta uma nova legislação sobre o tema. Hoje, tramitam na Câmara 19 projetos sobre aborto.

Sinceramente... que p$#@$ de país é esse? Não basta termos um investimento ridículo em educação e cultura, deixar os investimentos em ciências à beira do ridículo, termos um dos piores sistemas de saúde do mundo, leis que não funcionam, etc, e ainda temos q ver mais um retrocesso?

Sério... todo o brasileiro que chega a idade adulta é um milagre, ja dizia o Pasquim -- graças à políticos como estes. O que virá depois: Criacionismo nas escolas?

Obrigado, Brasil.

domingo, 15 de julho de 2007

Lucas 14 anos - urgente - Doadores Porto Alegre

Lucas 14 anos - urgente - Doadores Porto Alegre

Repassando o apelo de André Parodi: O meu sobrinho Lucas,fez uma cirurgia no cerebro,e precisa URGENTE de doadores de sangue de qualquer tipo, pois, ele faz um tratamento com plaquetas ( 1 bolsa a cada 8 horas ),precisamos de 42 doadores.A Familia esta mobilizada.Contamos com a sua ajuda.
Hospital da PUC Sao lucas / Banco de Sangue 2 andar
Paciente: LUCAS PARODI SPIER AS FAMILIAS PARODI SPIER AGRADECEM


Doar sangue é uma das coisas mais bonitas que podemos fazer - ajudará não apenas esse garoto como muitas outras pessoas com o plasma, por exemplo. Vamos difundir esta mensagem tanto quanto difundimos os nossos sistemas operacionais, browsers e gadgets preferidos.

sexta-feira, 13 de julho de 2007

Piadas de Programador

Why do programmers always get Christmas and Halloween mixed up?
Because DEC 25 = OCT 31

Essas e outras vc encontra em profession jokes.

O que mais falta inventar...


You are Amiga OS. Ahead of your time.  You keep a lot of balls in the air.  If only your parents had given you more opportunities to suceed.
Which OS are You?



You are Smalltalk. You like to treat everyone the same way, but this lack of individuality makes everyone feel like objects.
Which Programming Language are You?



You are .gif Sometimes you are animated, but usually you just sit there and look pretty.
Which File Extension are You?

quinta-feira, 12 de julho de 2007

Introdução aos Device Drivers no Linux

Vamos fazer um /dev/hello_word ?

Aprenda a fazer um neste fascinante artigo -- nunca se sabe quando será util!

Printf Format Specifications Quick Reference

Tudo o que vc sempre quis saber sobre o printf mas tinha medo de perguntar:
http://www.pixelbeat.org/programming/format_specs.html

Bases Numericas em Bash

Com Bash, podemos representar números nas mais variadas bases, desde 2 até 64 usando o operador # como no exemplo abaixo:


X=101
for BASE in 2 8 10 16 32 64 ; do
echo "$X na base $BASE eh $(( ${BASE}#${X} ))" # conversao pra decimal
done
101 na base 2 eh 5
101 na base 8 eh 65
101 na base 10 eh 101
101 na base 16 eh 257
101 na base 32 eh 1025
101 na base 64 eh 4097

echo $((16#FF)) $((32#V))
255 31

echo $((64#z)) $((64#Z)) $((64#@)) $((64#_)) # atenção nos 2 ultimos!
35 61 62 63

Além de ser possível usar a notação de octal e hexa do C (iniciar a expressão com 0 e 0x, respectivamente)
echo $((10)) $(( 010 )) $(( 0x10 )) $((10 + 010 + 0x10))
10 8 16 34

Bastante útil para pequenas conversões. Agora se quisermos converter um numero de uma base qualquer para outra, o nosso amigo bc pode servir:

bc <<< 'ibase = 8 ; obase = 16 ; 1027'
2A3

Onde ibase é a base de entrada (input) e a obase é a de saída (output). A diferença fica nas bases muito altas (32 ou 64) onde não são usados os caracteres minúsculos, maiusculos e especiais.

Esta dica foi tirada do Advanced Bash Scripting Guide.


Contador de visitas

Sindicato dos Messias

Basta de oligopólios monoteístas!

O Sindicato dos Messias ® é uma tradicional sociedade de Messias, Profetas, Avatares e Deuses, que remonta, neste plano, aos tempos de antes do Grande Uósh que escaramurfou as Formas de Vida Errantes da Terra. Fora deste Universo o Sindicato dos Messias existe desde antes do ínicio do Tempo como o conhecemos, e mesmo antes do surgimento do Primeiro Deus, sendo que os registros mais antigos remontam ao tempo em que nem o Nada existia ainda, só havia o conceito idealizado do Sindicato dos Messias, e mais um bando de idéias bizarras boiando num mar de Coisas Inexistentes Inimagináveis.

Continua...

quarta-feira, 11 de julho de 2007

StarCraft 2



O que eu posso dizer...

...YEAAAAAAAAAAAAAAAAAAAHHH!!! StarCraft 2 está chegando!!!

Vejam a primeira apresentação para o publico: ainda é Beta, mas ja temos ideia de como serão algumas unidades, principalmente as Protoss.

Alguem mais alem de mim achou sensacional o buraco negro que a nave mãe gera?

Bad Astronomy

Não posso deixar de recomendar o ótimo site do Astrônomo Phil Plait: badastronomy.com

Phil é uma daquelas pessoas que se dedicam a informar, acabando com boatos e inverdades científicas - em especial na sua área, a astronomia. Também é escritor do (excelente) livro Bad Astronomy - Misconceptions and Misuses Revealed, from Astrology to Moon Landing "Hoax".

Um link realmente importante é sobre a "Fraude" da ida à lua. Com uma linguagem clara e muitos exemplos, fotos e diagramas, ele refuta todos os mais absurdos comentários sobre a impossíbilidade da missão Apollo ter descido até o nosso satélite natural. Confiram para ver.

Um artigo na mesma linha (em pt_BR) está presente no ótimo site do Projeto Ockham, escrito pelo engenheiro Widson Porto Reis.

Ps: se ouvirem falar de um filme chamado "What the Bleep do We Know", leiam este guia cético bem humorado (e informado).

Paz, Amor & Linux

Hacker é como Punk, Ateu ou Geek -- um rótulo.

Uma hora a mídia fala q ser Hacker é ruim. Outra hora fala q não são Hackers, são os Crackers que são a ameaça. Acho que falta um pouco de romantismo na nossa vida...

Proponho uma revolução no mundo digital através do amor. Vamos deixar comentarios no codigo fonte repleto de belas mensagens, poemas e juras de amor eterno. Vamos visitar o apartamento frio e escuro dos nossos amigos mais anti-sociais e levar bolos, café e carinho. Vamos fazer divertidas obras de arte como borboletas e caras-de-gatos com os DVDs do windows vista e distribuir para os nossos amigos.

Bigodinho e chifres nas fotos do Bill Gates e Steve Ballmer nunca mais! Vamos colocar coraçõezinhos e flores coloridas e passar muita energia positiva. Sejamos francos e sinceros. Vamos usar de adjetivos angelicais e fala suave para que amor sempre venha a tona.

Assim, o codigo fonte sera alvo do nosso tórrido amor. Interfaces apaixonadas e Algoritmos envolventes serão o nosso legado.

E assim o amor triunfa. Nada de esmurrar o teclado. No lugar do café: flores. No lugar do ódio: Linux.

Sugestões de Leitura

Ja ouviu falar na tal Web 2.0? Veja os slides da apresentação do Philip Calçado.

Quer dominar o Vi/Vim? Veja este pequeno guia.

Se inglês não é problema, vc pode aprender Java, C++ ou Programação Avançada em Linux usando livros gratuitos e de ótima qualidade.

No site da InfoQ vc ainda pode baixar livros de SOA, Scrum & XP, Domain Driven e Dicas de Visual Studio .NET.

E, se vc se interessa por Gerência de Projetos, vai gostar desse artigo.

Boa leitura!

O Último Guerreiro Estelar




Saudações, Guerreiro Estelar! Você foi recrutado pela Liga Estelar para defender a Fronteira contra XUR e a Armada Ko-Dan!

Assim começa o jogo na (antiga) maquina de Arcade. Alex Hogan é apenas um adolescente morando em um conjunto de trailers na california, mas é o melhor jogador de todos os tempos, atingindo o recorde da maquina.

Seria mais um filme nerd bobo se não fosse pelas consequências: o video-game é, na verdade, uma maquina caça-talentos e descobre um promissor piloto espacial! Uma noite Alex recebe a visita de um homem chamado Centauri e, então, sua vida muda completamente, conhecendo o espaço, suas maravilhas e perigos.

Uma premissa interessante: quem não gostaria de ver o seu jogo favorito se tornar realidade? Entretanto, nada é facil para Alex, que resolve desistir quando sente a responsabilidade -- quando se torna, literalmente, o último guerreiro das estrelas.

The Last Starfighter entrou para a história do cinema por usar intensamente cenas feitas em CGI pela primeira vez -- tornando as batalhas impressionantes para a época. Destaque para a cena final com o uso da "Arma da Morte" com a classica fala "We Die".

Vai bem com um balde de pipoca, em um aparelho de DVD mais perto de vc.

terça-feira, 10 de julho de 2007

Ansi C orientado à objetos

Divertido! Compila e não gera nenhum warning.


#include <stdio.h>

struct {
struct {
int (*println) (const char *);
} out;
} System = { {puts} };


int main (void){

System.out.println("ola mundo");

return 0;
}


Achei um pdf no google sobre o assunto chamado Orientação A Objetos em C Ansi. Neste caso, eu criei um ponteiro para a função puts (presente na libc), chamado println. Criei uma variavel chamada System, que é uma estrutura que possui uma variavel chamada out que, por sua vez, possui o ponteiro println.

sábado, 7 de julho de 2007

Falando em Feira da Fruta...

Uma imagem fala mais o que mil palavras.


Stênio Garcia e Antonio Fagundes, quem diria, deram uma de super-heróis. E se vestiram, justamente, de Batman e Robin. No episódio de sexta-feira de "Carga pesada", Bino (Stênio) e Pedro são assaltados por uma quadrilha e largados, sem nada, num galpão abandonado. Lá, eles encontram as fantasias, que quebram um galho no momento de aperto.


Essa trama de serem trancados em um galpão lembra muito McGyver ou Esquadrão Classe-A :)

Como aprender...

Para aprender C, leia o curso da UFMG.

E Linux ?, um bom começo é o Guia Foca Linux.

Quer ir mais longe e aprender criptografia ou fazer o seu proprio bootloader ? O lugar é o aldeia numaboa.

Ou quem sabe ler um delicioso artigo sobre programação orientada à aspectos?

Se vc souber pesquisar, vai encontrar muitos tutoriais escritos no seu idioma. Mas os melhores textos ainda estão escritos em inglês. Não se pode virar as costas à este fato, porém não é de todo ruim. Aprender coisas novas mantém o cérebro ágil e jovem.

Não importa o assunto, a internet está ai: pesquise. Isso pode tanto fazer um diferencial competitivo na hora de arrumar um (novo) emprego, quanto prover uma melhor qualidade de vida.

Afinal, se não fosse pela internet não teriamos o classico Batimã: Feira da Fruta.

sexta-feira, 6 de julho de 2007

Bunny Suicides

Conheça os adoraveis coelhos suicidas.

Pra bom entendedor...

Coitado do latinha nesse universo amálgama: