Conheça o Brain Fuck :)

<!--
TITLENL Conheça o Brain Fuck :)
-->
<A NAME="200710271958"></A>
Brain Fuck é uma linguagem de programação criada por Urban Müller  com o foco de ter o compilador mais simples simples possível ,e de fato deu certo. Um típico compilador do Brain Fuck tem 200 byte de tamanho, 200 BYTES, menor que esse post :)

A linguagem tem apenas 8 comandos, são eles > < , . [] + –

veja um simples hello world nessa linguagem:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++++++++++ +++++.>.+++.——.——–.>+.>.

É por isso que ela se chama Brain Fuck, qualquer operação simples gera muito código, essa linguagem é mais complicada que Assembly, duvida ?

Uma série de links interessantes :

http://roesler-ac.de/wolfram/hello.htm

http://www.esolangs.org/wiki/Brainfuck

http://www.muppetlabs.com/~breadbox/bf/

Recuperando dados deletados de uma partição reiserfs


Assunto delicado, perder um dado importante ou todos os dados de uma partição ou uma partição inteira é como um incêndio na casa de um geek…. Eu mesmo já surtei inúmeras vezes nessa lista por ter perdido partições inteiras ao instalar uma distro nova (Conectiva 7 e depois nunca mais usei conectiva), ao dar um comando errado na hora errada na partição certa ou por falha de disco…. alias meu HD aqui já tem 3 anos……
Bom Após passar 2 semanas puxando um game de playstation ( Valkyrie Profile= RPG ambientado nas culturas nórdicas, asgard, odim, vicking e tals…) para curtir nas férias, hoje finalmente o jogo veio ! Tava puxando por bittorrent e no ápice do meu egoísmo, fui deletar o torrent para não fazer mais upload |:-> mas cai na pegadinha do tab-completion do shell que completou com o arquivo rar em vez do torrent X-(
Digamos que nenhuma política de backup poderia ter me salvado dessa tragédia…
Então vou descrever aqui como recuperar dados deletados de uma partição reiserfs incluindo os passos que dei para recuperar meus dados 🙂

Lascou-se ! Tudo deu errado ! Deletou tudo ! TIRE SEU MICRO DA TOMADA IMEDIATAMENTE, isso ai puxe o fio ! Não dê shutdown !
Parece loucura, afinal , tirar o micro da tomada não é nenhum procedimento técnico não é mesmo ? Mas isso impede que o sistema operacional grave arquivos no disco… Ao deletar um arquivo na verdade o sistema operacional apenas realoca seu espaço ocupado para novos arquivos, se por um acaso o SO gravar um novo arquivo ele pode sobre-escrever seu precioso arquivo com algum arquivo temporário ou um importante log do sistema :-/

Muita calma nessa hora o computador está desligado, seu arquivo está seguro ! Para religar todo cuidado é pouco, um erro e todos seus arquivos deletados podem ir para o limbo ! Será nescessário religar seu sistema em modo reparo com as partições em RO (read-only), como fazer ?
Se vc usa lilo/yaboot, dê um tab no prompt descubra o nome do Label do seu sistema e acrescente “ro init=/bin/bash”, por exemplo :

Linux ro init=/bin/bash

Se vc usa grub, no menu de opções aperte “e” no item que corresponde a sua distro, “e” na linha do kernel e adicione “ro init=/bin/bash no final…. então aperte ESC e b para bootar.

Isso vai fazer com que o sistema monte a partição root em modo ro e vai iniciar o processo bash como processo número 1 no lugar do init…. Pode acontecer do diretório dev não ser populado ou seja não será possível montar outras partições se nescessário… se isso acontecer, vc deve remontar a partição / para leitura e escrita (mount -o rw,remount /) e rodar o comando udevstart (ou devfsd para quem usa sistemas antigos como debian sarge desatualizado e etc…) e rezar para dar certo.

Se tudo der errado, a única forma é iniciar o sistema no runlevel 1 , mas isso pode ser uma péssima idéia em algumas distros… várias delas escrevem no disco antes de entrar em modo de manutenção, entre elas : Fedora, Ubuntu, gentoo… deve haver uma porção delas por ai… Tenho quase certeza que slackware e debian não o fazem.

Na distro em questão (gentoo) isso ocorreu, o sistema escreveu no disco e não foi pouco : as consequencias serão descritas no final…..

Bom com o sistema montado em ro e com o bash em mãos é hora de agir ! O sistema de arquivos reiserfs peca por não ter uma ferramenta para recuperar arquivos deletados…. ou pior se ela existe não é livre (várias ferramentas de sistema do reiserfs não são livres….), mas tem uma gambiarra que funciona bem….É o comando
reiserfsck !

Use :

reiserfsck –rebuild-tree -S /dev/PARTICAO

Esse comando vai buscar por todos os arquivos e diretórios e vestígios dos mesmos na partição e vai criar um diretório chamado “lost+found” no topo da partição…
dentro desse diretório vc vai encontrar uma porção de arquivos cujo o nome são apenas números… no meu caso tive que procurar por um arquivo grande, e achei, depois para confirmar usei o programa “file” para identificar o conteúdo ,tá lá ! Arquivo RAR na cabeça, então foi só renomear….
Tive a sorte de ser um arquivo grande , fácil de identificar… mas e se fosse um arquivo pequeno ? Bem mais complicado, não tem jeito é garimpar até achar…. No caso de diretórios inteiros ou partições a sistuação é mais grave, todos eles vão ter números como nomes e muitas vezes arquivos aparecem fora de seus diretórios …. uma zona.

Bom, e como meu sistema inicializou em init 1 e escreveu no disco não deu outra, ele corrompeu partes do meu arquivo e só pude recuperar 30% do meu arquivo original, bom melhor que nada :-/

Funções no bash



Funções no bash são uma verdadeira mão na roda, vc pode automatizar uma porção de comandos longos e repetitivos. O Aurélio (verde) e o Tobias (http://thobias.org/) criaram uma biblioteca de funções úteis como consultar cotação de moedas, pronuncia de palavras em inglês etc…Seu nome é .
Criar uma função no bash é muito simples, abra seu editor favorito e digite :


function digaoi()
{
echo 'filma eu galvão !!!';
}

Para carregar sua função no shell atual digite :


source arquivo.func

Onde arquivo.func é o nome do arquivo onde vc digitou os comandos 🙂
Pode conferir, agora no seu shell existe o comando digaoi, experimente executa-lo. Como vc percebeu ele imprime na tela a frase “filma eu galvão!!!”

Agora vamos tentar um comandinho mais útil, eu particularmente adoro animes, e muitas vezes estes vem encodados com codecs pesados demais para máquinas humildes então frequentemente eu converto um vídeo ou outro para um formato mais leve. Resumidamente (a original é 3 vezes maior ) a linha de comando que eu uso é :


mencoder -o arquivosaida.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 arquivodeentrada.mkv

E teve um dia que eu me embananei e sobescrevi o arquivo original, tive que baixar o desenho de novo ….. Pra evitar problemas criei a seguinte função :


function ..pramaquinavelha () {
mencoder -o $1.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 $1
}

O nome da função é “..pramaquinavelha”, ela chama o mencoder com os parametros que eu quero, por exemplo:


..pramaquinavelha ghost-in-the-shell-01.mkv

E como saída ele gera o arquivo “ghost-in-the-shell-01.mkv.avi”.
Como vc observou, eu passei um parâmetro para a função, para isso basta usar a variável $1, seu valor é a primeira string passada logo após o comando principal, no meu caso, o nome do arquivo que eu queria converter, ghost-in-the-shell-01.mkv.
“Mas porquê $1 ?Não poderia ser outro número ?” você pergunta. Sim ! Os números vão de 0 até infinito (nem tanto), vc pode passar multiplos parâmetros para uma função, como por exemplo o bitrate do vídeo além do nome do arquivo.A variável $0 é o próprio comando, e os parâmetros são numerados de $1 até $N, exemplo:


comando parametro1 parametro2 ... parametroN
$0 $1 $2 $N

Um outro tipo de função que eu uso bastante é um script que lista as dependêncas de um binário e quais pacotes suprem essas depências, segue a listagem :


..showdeps (){
[ "$1" ] || { echo 'uso: ..showdeps arquivo_binário'; return; }
rpm -qf `ldd $1 | awk '{print$3}'` | sort | uniq
}

Nesse exemplo alé da variável de argumento ($1), também fiz uso do comando de testes “[” e “]” e de um operador lógico “ou” (“||”). As chaves testam se algum parâmetro foi passado e caso positivo prossegue com a função, se não imprime uma mensagem ensinando ao usuário como usar a dita função. O resto da função é pauta para outro post, o que vale dessa vez é a idéia, funções são poderosas, implemente as suas, e divida com os amigos 🙂

Para ter suas funções favoritas sempre carregadas no shell, adciona a linha “source arquivo.func” à configuração do seu shell, por exemplo ~/.bashrc.

Depois falo mais de shell e seus truques.

Rodando o Parallels em um HackIntel (iPC) AMD



Fiquei muito triste quando fui instalar o parallels no meu hackintel, ele dizia que minha máquina não tinha os requisitos mínimos… Bom, eu tenho 1Gb de ram 420 gb de hd, qual seria o requisito ? “Só pode ser o processador, claro !”
Então entrei na imagem dmg, e verificando o programa de instação encontrei dentro do script Parallels-Desktop.pkg/Contents/Resources/InstallationCheck , isso :

#!/bin/bash

PKMKSHELLUTILITY=$1/Contents/Resources/pkmkshellutility
RESULT=$PKMKSHELLUTILITY --sysctl machdep.cpu.vendor
if [ $RESULT != 'GenuineIntel' ];
then exit 97
fi
exit 0

Ele diz o seguinte se não for intel, termine o instalador .

Procurei pela string GenuineIntel em outros arquivos, e encontrei no arquivo Parallels-Desktop.pkg/Contents/Info.plist , em :

<string>GenuineIntel</string>

Então, para descobrir qual era o meu processador, para os scripts do parallels, executei o comando (no terminal) :

 Parallels-Desktop.pkg/Contents/Resources/pkmkshellutility --sysctl machdep.cpu.vendor 

e ele devolveu :

 AuthenticAMD 

Então bastou trocar a string GenuineIntel pelo AuthenticAMD. Mas como a imagem dmg em questão é read-only, copie todo o conteúdo da imagem para um diretório qualquer. Altere o conteúdo desses dois arquivos que mencionei, trocando GenuineIntel por AuthenticAMD usando um editor de textos qualquer. Pra trocar as strings eu usei o sed, da seguinte forma :

 
sed -i .bak "s/GenuineIntel/AuthenticAMD/g" Parallels-Desktop.pkg/Contents/Info.plist 
sed -i .bak "s/GenuineIntel/AuthenticAMD/g" Parallels-Desktop.pkg/Contents/Resources/InstallationCheck 

Feito isso, pude desfrutar do parallels como em um legítimo macintel 🙂

Tutorial Objective-C



Objective-C é uma linguagem de programação orientada a objetos derivada do C, é a principal linguagem de programação do projeto gnustep e dos sistemas NeXT e Mac Os X. Um velho amigo macmaniaco (Algol) escreveu esse pequeno tratado sobre a linguagem, e quero dividir esse tesouro com vocês :

http://www.astro.iag.usp.br/~algol/computacao/ObjCtutorial.html