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:

Youtube Downloader 2.0

A versão 1.0 foi até pro Dicas-L. Graças a esta exposição percebi que o script é muito útil para quem não tem um plug-in flash (que preste) no browser. É o caso do pessoal que usa Beos, por exemplo.

Reduzi o número de linhas, usei a expansão de variáveis do bash para algumas substituições simples e agora vc pode informar o nome do arquivo que vc quer salvar, senão será usado aquele nada pratico id. A extensão é flv que pode ser visualizado pelo mplayer ou convertido pra mpeg.

$ ./script.sh endereço_do_video nome_do_video

Eis o código
#!/bin/bash
# youtube downloader
test -n "${1}" || { echo -e "Missing url or id!\nUsage: ${0} <url | id> [filename]" ; exit 1; }

set - ${1/*=} ${2:-${1/*=}} "http://www.youtube.com/watch?v=${1/*=}" 'video_id=.+&t=[^\"&]+'

wget -O "${2%.flv}.flv" "${3%/*}/get_video?$(wget -qO - "${3}" | grep -oE "${4}" | sed '1q')"


Tentei usar o curl e não consegui. Quem quiser tentar, faça um curl -I na url final e veja os cabeçalhos -- não sei como ir para o 'Location'. O wget faz isso numa boa, mas seria interessante ter a opção com o curl.

O que seria mais interessante? Baixar uma lista de videos? Baixar os X primeiros videos que aparecem em uma dada pesquisa?

quinta-feira, 5 de julho de 2007

Respostas Claras

Em exemplo interessante de falta de atenção (inspirado em casos reais):

Nome
Idade
Opinião

quarta-feira, 4 de julho de 2007

Curiosidade

Desde que comecei com este blog, não imaginei que receberia visitas do Vietnã e do Hawaii (graças ao Google Analytics).

Aos visitantes de tão longe, assim como os de tão perto, um grande abraço!

terça-feira, 3 de julho de 2007

Linux Ubuntu

Houve um tempo que usar linux era coisa de louco. Era difícil de instalar, as interfaces gráficas eram pobres, poucos programas... era o sistema ideial para programadores e nerds. Quem precisa de Word quando tem o Vi e o LaTeX? Quem precisa de Excel quando tem AWK? Ora... é uma questão de escolha, simples assim.

O que era um projeto de nerds virou um modelo de negócios. Surgiram boas distribuições, inovações como o Linux Mandrake (nunca a instalação de um sistema foi tão fácil e bonita), o StarOffice, o WindowMaker, KDE...

Pois bem, eis que surgiu o Ubuntu Linux. Criado pelo programador E turista espacial Mark Shuttleworth, o Ubuntu é um sistema inteligente, projetado para ser utilizado com simplicidade por qualquer pessoa. O resultado foi uma distribuição extremamente popular, bonita e intuitiva.

Fica ai a dica: façam um test-drive com um LiveCD do Ubuntu (vcs podem pedir CDs de graça no site oficial -- eles entregam no brasil).

A seguir uma breve entrevista do Mark Shuttleworth:

Oportunidades de Emprego (Porto Alegre)

Tens experiência em Java / Oracle / .Net / C / C++ / Javascript / Teste de Software / Gerência de Projetos /Cobol ou Clipper?

Procurando emprego na região de Porto Alegre?


  • Desenvolvedor C# (2 vagas)

  • Desenvolvedor de Testes

  • Analista de Suporte Java

  • Integrador de Sistemas

  • Analista de Sistemas

  • Lider Técnico - Java (mínimo 3 anos de experiência)

  • Desenvolvedor Java/Oracle (4 anos experiência)

  • Desenvolvedor Oracle Developer (Forms/Report) (3 anos de experiência)


Não perca tempo, envie o seu curriculo atualizado para mim informando, principalmente, tempo de experiência, certificações e nível de inglês.

Sugiro também a leitura deste post do blog pythonologia. Muito interessante na hora de redigir um currículo ou email para alguma vaga.

segunda-feira, 2 de julho de 2007

Parâmetros em Shell Script

Meu primeiro artigo, resultado de uma boa noite de insônia.

Direto do CentOSBR: Parâmetros no Shell.

Estou enrolando outros textos tem tempo: vamos ver se agora eu continuo.

Conheça o Incrível Ruby on Rails



Ruby é uma linguagem interpretada orientada à objetos que vem aparecendo no mercado faz tempo. Sua popularidade vem subindo graças ao framework on Rails, que pode acelerar, e muito, o desenvolvimento de aplicações para a web.

Gostou da demonstração? O ponto de partida para um entusiasta pode ser o Ruby on Br, com alguns bons artigos e um forum que une os melhores profissionais no ramo.

Dê uma olhada nos tutoriais do Taq e, se gostar, compre o livro (é muito bom, recomendo). Outro livro muito bom é o do Akita (responsável pela tradução do livro Getting Real by 37 Signals para pt_BR).

Embarque nessa vc também!

Rogue: Muita Ação em 1980

No fim da década de 90, fui o feliz proprietário de um PC 286 dotado de monitor CGA monocromático. Rodando DOS 5.0 no disquete maior, esta pontente maquina possibilitou que eu aprendesse Pascal para a faculdade, alem de testar centenas de sharewares baixados do Sintel.net.

A vontade de jogar era maior do que tudo, obviamente. As limitações do Hardware, entretanto, só foram eliminadas com um jogo extremamente simples, datado da década de 80: Rogue (uma breve história do jogo pode ser encontrada aqui).



Rogue é um jogo simples: tu és um guerreiro (ou alguma coisa parecida) representado por uma carinha ascii (ou uma @, dependendo da versão). Navegando por labirintos cheios de itens mágicos, armas e monstros, vais descendo até encontrar o temível Dragão (representado pela letra D -- após algumas horas de jogo, o alfabeto torna-se incrivelmente ameaçador!).

A complexidade do jogo não é pequena: vc pode usar um anel amaldiçoado (cursed) que te teleporte aleatoriamente até que vc consiga remove-lo com a mágica certa. Um dos monstros pode remover níveis do seu personagem, involuindo-o (letra X se não me engano -- alias esse foi o único jogo que apresentava esse tipo de desafio). Cada jogo é diferente do outro, o que representa centenas de horas de diversão. Para saber mais, começe aqui.

Jogos em modo texto, com este tipo de interface gráfica ou os mais simples como Zork ou Colossal Caves representam um excelente desafio: jogos cujo impacto seja a sua estória, suas possibilidades e a criatividade do autor. Qualquer um que pense em criar jogos (mirabolantes ou não) deveria conhecer estes vovôs dos jogos atuais, e tentar fazer um, inclusive.

Existe espaço até para jogos multiplayers, como no caso dos MUDs. Tem gente jogando a mais de uma década o que os mais novos descobriram no WoW.

ps: eu SEMPRE joguei em modo "Fast Play" (Scroll Lock!), exceto em ambientes grandes e escuros.

O melhor de dois mundos: C e Fortran

C é uma ótima linguagem de programação, simples e clara.
Fortran, para problemas matemáticos, é imbativel!

Que tal usar o melhor dos dois mundos com este tutorial?

Vejamos o exemplo abaixo:

Arquivo testC.cpp

#include 

using namespace std;

extern"C" {
void fortfunc_(int *ii, float *ff);
}

main()
{

int ii=5;
float ff=5.5;

fortfunc_(&ii, &ff);

return 0;
}


Arquivo testF.f
      subroutine fortfunc(ii,ff)
integer ii
real*4 ff

write(6,100) ii, ff
100 format('ii=',i2,' ff=',f6.3)

return
end


Compilando

$ f77 -c testF.f
$ g++ -c testC.cpp
$ g++ -o test testF.o testC.o -lg2c


Executando

$ ./test
ii= 5 ff= 5.500


Aceito sugestões, agora que não tenho muita coisa para fazer em Fortran.

Mono: C# no Linux

Considere este simples código:

using System;

class MainClass {

public static void Main() {
Console.WriteLine("Eu sou um programa feito em C#");
Console.ReadLine();
}
}


Tcharam: um hello world que, no mundo MS, seria compilado no Visual Studio após alguns segundos de espera. Para plataformas abertas, podemos usar o Mono:

$ uname
Linux
$ mcs Example.cs # Mono Compiler Suite
$ mono Example.exe # Mono's ECMA-CLI native code generator
Eu sou um programa feito em C#
[enter]
$


Independente de Ideologias, C# é uma linguagem interessante e seu uso está cada vez mais comum. Para quem não quer ficar fora do mercado de trabalho, o mono pode ser uma ótima oportunidade para praticar. O site java2s possui um tutorial interessante para os curiosos.

Youtube Downloader

Cerca de um ano atras eu pesquisei uma forma de fazer o download automatico de videos do youtube informando o id ou a url inteira. Ele é bem didático, basta ser um pouco nerd e conhecer um pouco de expressões regulares (alias o livro do Aurelio está em promoção).

Minha inspiração para postar este script veio desta notícia, onde Warren Harding baixou um vídeo usando o Lynx e usou o Mplayer para exibir o vídeo no modo ASCII. O resultado é insano, porém divertido.

#!/bin/bash
# youtube downloader
# usage: script
# YouTube URL: http://www.youtube.com/watch?v=[video_id]

[ -z "${1}" ] && { echo 'Error! Missing url or video_id!' ; exit 1 ; }

URL="http://www.youtube.com"

# download link: http://youtube.com/get_video?video_id=[video_id]&t=[t_id]&...

DOWNLOAD=`wget -qO - "${URL}/watch?v=${1/*=}" | grep -oE 'video_id=.*&t=[^\"&]*' | head -1`

wget -O "${1/*=}.flv" "${URL}/get_video?${DOWNLOAD}"


Eu poderia ter feito tudo em uma unica linha usando xargs, porém ficaria um pouco poluído para publicar neste humilde blog, mas fica aí a dica.