sábado, 30 de agosto de 2008

Recuperando o grub

Eu uso muito pouco os produtos da M$ em casa. E tempos atrás o Windows deu pau pra variar. Fosse outra época, eu gastaria dias recuperando o sistema, os documentos, etc... Mas já faz muito tempo que não tenho saco pra ele.

Existem uns pouquíssimos motivos para eu continuar com ele na minha máquina, mas ele ainda é necessário sim. Pois bem, depois de muito postergar resolvi meter a mão na massa e fazer o odioso ritual do formata-e-instala.

Qual minha surpresa quando vou procurar no meio dos CDs e lembro que joguei fora o CD de instalação do Windows. Solução: deixar a madrugada inteira baixando um torrent. Terminado o download, vejo que o arquivo de imagem não era uma iso e sim um nrg, que é um formato de imagem proprietária do Nero, e não dava pra gravar direto pelo meu querido K3B. Nada de mais, uma googlada e pronto, eis uma linha de comando para fazer a conversão. Isso mesmo. Com uma linha deu pra fazer a conversão de nrg para iso, e enfim gravar a imagem num CD.

Ah sim a linha em questão é:
$dd bs=1k if=imagem.nrg of=imagem.iso skip=300

Enfim, comecei a via sacra... formata, instala, instala drivers, aplicativos básicos, aplicativos de segurança, configura uma coisa, configura outra, restaura os backups...

Hora de restaurar o grub, o bootloader do Linux, para que eu pudesse deixar a máquina novamente com dual boot.

Vou dar o boot com o CD do Linux e trava. Tento de novo e de novo e nada. O CD foi pro espaço tbm. Solução: baixar o Linux, gravar num CD e daí sim recuperar o meu mojo.

Depois de iniciar o boot com o CD do Linux, abri um terminal e fiz:

$sudo grub
>find /boot/grub/stage1

daí usei a saída do comando acima no comando abaixo

>root (hd0,0)
>setup (hd0)
>quit

Reiniciei e pronto. Tudo funcionando como deveria ser, nos trilhos.

E agora consegui passar as fotos do meu aniversário para o PC (sim, a minha câmera é um dos motivos para eu ainda manter o Rwindows aqui).

Hasta la vista.
-----------
keepReading

sábado, 16 de agosto de 2008

IFS - Internal Field Separator

No post anterior, eu disse que o script reconhecia nomes de arquivos que incluiam espaços e outros caracteres especiais, mas não escrevi sobre como fiz isso. Aliás, este foi um dos passos que mais me deu dor de cabeça durante o desenvolvimento do script.

Voltando um pouco na causa... minha esposa e eu temos o costume de renomear em massa os arquivos e as cópias que ela faz, usando espaços nos nomes, tanto dos arquivos quanto dos diretórios. Porém quando fui criar o script me deparei com o problema. A saída do comando find. Sempre que havia um espaço em branco nos nomes de diretórios e arquivos, era como se fosse um valor diferente para o loop for.

Após muita pesquisa, vi que o problema era uma variável especial do shell, o IFS. Ela é uma variável criada pelo shell (builtin) e é extensivamente usada para reconhecimento e expansão de strings. Seu valor padrão é "", e ela afeta o comportamento de vários outros comandos, como grep, cut, ls... Assim, "o pulo do gato" foi definir o valor dessa variável para "".

Bem, além de mais elegante e eficiente, esse tipo de tranformação ajuda a diminuir o tempo de execução, o que pode tornar o uso racional desse recurso muito interessante quando temos de lidar com grandes quantidades de dados, por exemplo importação/exportação de valores em bancos de dados.

Agora cabe algumas observações sobre o uso do IFS.
- É recomendável que você guarde o valor antigo e retorne ele ao normal no final do script.
- Definir o novo valor de forma direta funciona apenas para a atual instância do shell onde se trabalha. Se você cria subshells, você deve usar o comando (também builtin) export.
- Essa é uma variável existente para vários sabores de shell (sh, dash, bash, ksh, zsh).

E para fechar, dois links para aprofundar a leitura:
- http://www.dicas-l.com.br/cantinhodoshell/cantinhodoshell_20070103.php
- http://nixshell.wordpress.com/2007/09/26/ifs-internal-field-separator/

See ya.
-----------
keepReading

quinta-feira, 7 de agosto de 2008

Script para remover arquivos duplicados

Fala pessoal, tudo certo?

Venho postar aqui pela primeira vez um presente meu para vocês: um scriptzinho (em shell script) para remover arquivos duplicados. O link é esse aqui. Tá no 4shared, então não tem complicação para fazer o download.

O uso do mesmo é bem simples.
$./check_dups.sh /dir/to/scan/ /another/dir/to/scan/ /and/one/more/


O script lê todos os arquivos dentro dos diretórios passados, inclusive nos seus subdiretórios. Reconhece arquivos que contenham caracteres especiais no nome como espaço e parênteses. Remove os duplicados (com base no hash MD5 deles), deixando apenas um, e gera um log no formato HTML, com o arquivo que ficou, e quais que tinham o mesmo conteúdo que foram removidos. Tudo organizadinho.

Esse script me custou umas boas horas e eu realmente tinha a necessidade dele. Como não achei nada que fizesse isso, criei e agora espero que seja útil para alguém.

Críticas e sugestões são bem-vindas.

Abraços.
-----------
keepReading

quarta-feira, 6 de agosto de 2008

Um pouquinho de velocidade

Fala pessoal.

Como sempre venho trazer alguma coisa para vocês, baseada em erros comuns que vejo. E hoje trago algumas dicas de como melhorar o desempenho em bancos de dados.

Tempos atrás eu já tinha publicado algo sobre isso em relação ao Postgre aqui.

Bem, negócio seguinte, quando tratamos com uma quantidade grande de dados (1GB ou mais), algumas mudanças podem e devem ser feitas para acelerar o andamento das atividades (importar, exportar, selecionar, filtrar, pesquisar, etc...).

Primeiro em relaçãoà modelagem de dados. Veja se a estrutura não precisa de modificações, como por exemplo partições nas tabelas, índices, etc...

Depois, veja se a tabela está em dia. Um ANALYZE TABLE faz milagres. Agendar ele no CRON para rodar todo dia num horário de pouco uso, nem se fala.

Se tem uma opção mais eficiente que essa, é o OPTIMIZE TABLE do MySQL.

Para importar/exportar quantidades muito grandes de informação, evite usar alguma linguagem de programação. Faça pela linha de comando, usando recursos do próprio banco de dados. Prepare scripts para automatizar estas tarefas. Se for necessária alguma verificação, faça com stored procedures. Isso aumenta absurdamente a performance.

Outra coisa, em caso de queries complexas, use o EXPLAIN. Aprenda a otimizar suas queries com ele (a ordem dos joins importa, assim como a sua quantidade e o método usado).

Por último, nos casos mais críticos, verifique a condição física da máquina. Se a operação que está sendo executada começa a usar espaço em disco (swap/arquivo de paginação) é hora de rever alguns parâmetros do banco de dados, do sistema operacional ou mesmo instalar mais memória.

[]'s

-----------
keepReading