Arquivo da tag: linux

downloadsubtitle: script para baixar legendas de filmes automaticamente no shell do GNU/Linux

Me acostumei a usar o legendas.tv para baixar legendas de filmes e acabei nunca me perguntando se haveria um jeito mais fácil de baixá-las. Hoje fui assistir um filme e, ao entrar no navegador para baixar sua legenda, me deparei com a mensagem de que o site estava fora do ar:

legendas

A situação me obrigou a procurar outros sites e outras formas de baixar legendas. Minha primeira ideia foi usar o opensubtitles.org, que já havia usado algumas outras vezes. Chegando lá e procurando pelo filme que eu desejava, vi muitas opções e não estava muito claro que legenda baixar para a versão do filme que eu tinha.

Então resolvi dar uma fuçada na pesquisa avançada do site, onde acabei encontrando uma pesquisa por hash. Hash, em computação, é uma função que “resume” uma informação gigante (tipo um arquivo bem grande) numa informação bem pequena (tipo 16 caracteres) que o represente de forma única (ou quase única). A pesquisa por hash, no caso desse site, consiste em procurar uma legenda utilizando esse “ID” do arquivo (ou seja, não importa seu nome).

Achei a possibilidade tão legal que resolvi fazer um programa para nunca mais precisar abrir o navegador quando eu quiser baixar a legenda de um filme. Escrevi um minúsculo programa em C chamado oshash (de OpenSubtitles Hash) para calcular o hash de um filme de acordo com a especificação do site (que não requer nada, a não ser um compilador de C e a biblioteca padrão) e um script (bem tosco, mas funcional) chamado downloadsubtitle que usa o programa oshash (e pequenos programas que todo mundo tem, tipo grep, sed, wget e unzip) para baixar a legenda.

O funcionamento ficou bem fácil: para baixar uma legenda em qualquer língua, basta você digitar downloadsubtitle arquivo.avi para baixar a legenda do “arquivo.avi” (que já vai ser automaticamente nomeada como “arquivo.srt”). Se você quiser especificar uma língua (por exemplo, português do Brasil), é só digitar downloadsubtitle arquivo.avi pob (pob é o código do português do Brasil). Se você quiser baixar uma legenda em inglês ou espanhol, pode usar downloadsubtitle arquivo.avi eng,esp.

Exemplo de funcionamento

$ ls
Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.mkv
$ downloadsubtitle Amelie\ \[Amélie\ Poulain\].2001.BRRip.x264.AAC\[5.1\]-VLiS.mkv pob
Requested language: pob
Movie hash: bcdc90cf4873c09b
Subtitle ID: 4642726
Subtitle: Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.srt
$ ls
Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.mkv  Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.srt
$ 

E aí o filme está pronto para você assistir com o mplayer ou com o seu programa favorito.

Código

Este é o código inicial. Está aqui para fins históricos. Não será atualizado. Use a próxima seção (Download) para baixar a última versão, com bugs corrigidos, tratamento de erros e possivelmente novas funcionalidades.

oshash.c
#include <stdio.h>
#include <stdlib.h>
 
void usage(char *name) {
    printf("Usage: %s <file>\n", name);
    exit(1);
}
 
int main(int argc, char *argv[]) {
    unsigned long long buf[16384], c = 0;
    FILE *in;
    int i;
    if (argc != 2) {
        usage(argv[0]);
    }
    in = fopen(argv[1], "rb");
    if (in == NULL) {
        usage(argv[0]);
    }
    fread(buf, 8192, 8, in);
    fseek(in, -65536, SEEK_END);
    fread(&buf[8192], 8192, 8, in);
    for (i = 0; i < 16384; i++) {
        c+= buf[i];
    }
    c+= ftell(in);
    fclose(in);
    printf("%016llx\n", c);
    return 0;
}
downloadsubtitle
#!/bin/bash
 
usage() {
    echo "Usage: $0 <file> [lang]"
    echo "Examples:"
    echo "$ $0 movie.avi pob         # brazilian portuguese"
    echo "$ $0 movie.avi por,pob     # any portuguese"
    echo "$ $0 movie.avi eng         # english"
    echo "$ $0 movie.avi all         # any language"
    exit
}
 
if [ $# -lt 1 ]; then
    usage
elif [ $# -gt 2 ]; then
    usage
fi
 
if [ $# = 2 ]; then
    lang=$2
else
    lang="any"
fi
 
echo "Requested language: $lang"
output=$(echo "$1" | sed 's/\.[^.]*$/.srt/')
oshash=$(oshash "$1")
echo "Movie hash: $oshash"
subid=$(wget "http://www.opensubtitles.org/en/search/sublanguageid-$lang/moviehash-$oshash/rss_2_00" -q -O - \
    | grep '<link>.*en/subtitles' | sed 's|.*en/subtitles/||; s|/.*||' | head -n1)
echo "Subtitle ID: $subid"
wget "http://www.opensubtitles.org/en/subtitleserve/sub/$subid" -q -O - | gunzip > "$output" 2> /dev/null
echo "Subtitle: $output"

Download

Criei um repositório no Github para colocar o código: github.com/tmadeira/downloadsubtitle

Para quem tem git, é possível baixar com git clone https://github.com/tmadeira/downloadsubtitle.git

Para quem não tem, dá pra baixar em ZIP daqui: github.com/tmadeira/downloadsubtitle/archive/master.zip

O programa ainda não está empacotado bonitinho (não tem nem Makefile ou instruções de instalação). Se futuramente vier a ter, este post será atualizado. Em resumo, basta compilar o código em C (digitando gcc oshash.c -o oshash) e colocar os arquivos oshash e downloadsubtitle numa pasta do seu $PATH (por exemplo, /usr/local/bin).

Sugestões e correções são bem-vindas.

Dump email addresses from files

ATENÇÃO: Este conteúdo foi publicado há 6 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Suppose you have a lot of .doc, .docx, .xls, .xlsx, .gz, .bz2, .pdf and text in general (.csv, .txt etc.) files and want to dump all the (unique) email addresses from them. How would you do it? Here is a simple solution I’ve just implemented (and probably didn’t test enough, so tell me if you find any bug):

#!/bin/sh
tmp=$(tempfile)
while [ $# -gt 0 ]; do
    if [ -r "$1" ]; then
        ext=$(echo ${1#*.} | tr [A-Z] [a-z])
        case $ext in
            docx | xlsx)
                # requires: http://blog.kiddaland.net/2009/07/antiword-for-office-2007/
                cat_open_xml "$1" >> $tmp
                ;;
            doc)
                # requires: antiword
                antiword "$1" >> $tmp
                ;;
            xls)
                # requires: catdoc
                xls2csv "$1" >> $tmp
                ;;
            gz)
                cat "$1" | gunzip >> $tmp
                ;;
            bz2)
                cat "$1" | bunzip2 >> $tmp
                ;;
            zip)
                unzip -p "$1" >> $tmp
                ;;
            pdf)
                # requires: xpdf-utils
                t=$(tempfile)
                pdftotext "$1" $t
                cat $t >> $tmp
                rm $t
                ;;
            *)
                text=$(file -b --mime-type "$1" | sed -e 's//.*//')
                if [ "z$text" = "ztext" ]; then
                    cat "$1" >> $tmp
                fi
                ;;
        esac
    fi
    shift
done
cat $tmp | grep -o -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}\b' 
         | tr [A-Z] [a-z] | sort -u
rm $tmp

(the email regexp is explained here: regular-expressions.info/email.html)

Colofão

ATENÇÃO: Este conteúdo foi publicado há 7 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Adverte-se aos curiosos que se imprimiu esta obra nas oficinas da gráfica Vida&Consciência em 16 de julho de 2009, em papel off-set 90 gramas, composta em tipologia Walbaum Monotype de corpo oito a treze e Courier de corpo sete, em plataforma Linux (Gentoo, Ubuntu), com os softwares livres \LaTeX, \textrm{DeTeX}, Vim, Evince, Pdftk, Aspell, SVN e TRAC.

Da contracapa de uma bela edição de “Viagem em volta do meu quarto” (Xavier de Maistre) publicada pela Editora Hedra.

Tornou-se instantaneamente minha editora preferida. Não é fantástico (e de evidente bom gosto) os editores usarem e divulgarem Gentoo, LaTeX, Vim e SVN?

Calendário santo-discordiano no Fluxbox

ATENÇÃO: Este conteúdo foi publicado há 7 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Acabei de implementar o calendário santo-discordiano no Fluxbox 1.1.1 (última versão).

Link para download do código: fluxbox-ddate-1.1.1-0.tar.bz2

Se você usa Arch Linux, não precisa baixar e compilar manualmente. Basta usar o pkgbuild que o Rev. Beraldo fez para o AUR: aur.archlinux.org/packages.php?ID=40364.

Se você usa Gentoo, não precisa baixar e compilar manualmente. Basta colocar o ebuild que eu fiz num overlay: fluxbox-ddate no Gentoo.

Versões compiladas .deb, .rpm, .tgz etc. e ebuilds, pkgbuilds etc. são bem vindos! Me passem que eu coloco um link aqui!

Como baixar e descompactar

Como você faria com qualquer outro pacote .tar.bz2…

$ wget http://tiagomadeira.com/wp-content/uploads/2010/08/fluxbox-ddate-1.1.1-0.tar.bz2
$ tar xjvf fluxbox-ddate-1.1.1-0.tar.bz2
$ cd fluxbox-ddate-1.1.1-0

Como compilar

Versão simples:

$ ./configure
$ make
$ make install

Versão complicada:

$ export CFLAGS=-O2 -march=native -msse4.1
$ export CXXFLAGS=$CFLAGS
$ ./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --enable-nls --disable-xinerama --enable-xft --disable-gnome --enable-imlib2 --enable-slit --enable-toolbar --sysconfdir=/etc/X11/fluxbox
$ make -j3
$ make install

Encontre seu meio termo (ou use a simples) e divirta-se!

Como iniciar um Fluxbox

Inicie o X e peça pra ele abrir a versão que você compilou do Fluxbox da seguinte maneira:

$ startx /usr/local/bin/fluxbox -- :1

(Lembre-se de mudar /usr/local para o --prefix que usou no ./configure)

Esta linha funciona dentro de uma sessão do X (abre outra), por causa do -- :1.

Como usar a data discordiana

Clique com a tecla direita no relógio do seu Fluxbox e Edit clock format. Se você usar um formato de data convencional, do falso calendário (como deve estar usando no momento), nada de especial acontecerá. O segredo está no |fnord|.

Quando você coloca um |fnord| no formato, o Fluxbox interpretará tudo que veio antes como formato de data discordiano.

(Para escolher o formato de data ideal, você pode digitar man ddate num terminal.)

Exemplos de uso:

  • Formato: %c → Saída: Sat 28 Aug 2010 11:50:26 PM BRT
  • Formato: %e of %B of %Y|fnord| → Saída: 21st of Bureaucracy of 3176
  • Formato: %d %b %Y|fnord|, %H:%M:%S → Saída: 21 Bcy 3176, 23:50:26
  • Formato: %.|fnord| → Saída: All Hail Discordia!

Dúvidas, sugestões?

Contate a glândula pineal.

Como funciona o código?

O Fluxbox usa a função strftime para formatar a data do relógio. Isso acontece na linha 274 do arquivo src/ClockTool.cc. Modifiquei este trecho do código adicionando cerca de 23 linhas que separam a string do formato de data no |fnord| e passam o que vem antes dele como parâmetro para uma chamada de sistema pro ddate (sim, de fato pra próxima versão é melhor copiar o código do ddate ou reimplementar pra não ter este overhead) e o que vem depois continua indo pro strftime.

Ficou assim:

char s[255], u[255];
strcpy(s, m_timeformat->c_str());
char *t = strstr(s, "|fnord|");
time_string_len = 0;
if (t != NULL) {
	*t = '�';
	sprintf(u, "ddate +'%s'", s);
	FILE *ddate = popen(u, "r");
	if (fgets(time_string, 255, ddate)) {
		time_string_len = strlen(time_string);
		time_string[--time_string_len] = '�';
		fclose(ddate);
	}
	t+= 7;
} else {
	t = s;
}
time_string_len+= strftime(&time_string[time_string_len], 255 - time_string_len, t, time_type);

Known bugs

  1. Colocar ‘ (aspas simples) no lado esquerdo do |fnord| faz com que a data discordiana não apareça.
  2. Requer util-linux-ng e faz uma chamada de sistema ao ddate uma vez por segundo.
  3. Não trabalha ainda com horas métricas.
  4. … me informe se achar mais algum!

Screenshots

Screenshot 0

Screenshot 1

Screenshot 2

Diagnóstico de Alice

ATENÇÃO: Este conteúdo foi publicado há 8 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

O problema do meu Amazon PC Slim L92 é uma incompatibilidade da sua placa-mãe com seu processador.

Fontes afirmam que testes realizados na Amazon PC revelaram que trocando o meu processador (Merom T5750) por um Penryn T8100 (US$ 230 nos EUA) ou T9300 (US$ 350 nos EUA) não há mais problema pra usar o computador com 4GB de memória RAM e um sistema operacional de 64 bits.

É evidente que a culpa originalmente não era da Amazon PC, mas da Compal, que foi capaz de fabricar e vender um laptop com processador incompatível com a placa-mãe. Porém, a Amazon PC não só não testou suficientemente o produto, como sua política de solução do problema foi escondê-lo aplicando este hack no software.

Exijo que a Amazon PC reverta a sua política de esconder o problema assumindo a culpa e consertando ou trocando o meu laptop por um com configuração igual ou superior, pois foi ela que me vendeu o produto e ela que me deve a garantia (ora, se vender laptops fosse só comprar de fora e colocar um preço eu também venderia laptops). Sugiro ainda ao pessoal da Amazon PC que eles reclamem e peçam indenização da Compal, mas isso já está fora da minha jurisdição.

Informo a todos os leitores que tomarei todas as providências que estiverem ao meu alcance pra que isto aconteça e que atualizarei este blog quando houver novas informações sobre o caso.

[update 27/ago/2009] O pessoal do Fórum Clube do Hardware afirma que a Intelbras resolveu o problema trocando por Penryn T6400. Este é melhor porque é mais barato que os sugeridos pela Amazon. Estou convencido que qualquer Penryn resolve o problema.

Sobre os meus 5²³ problemas com meu laptop

ATENÇÃO: Este conteúdo foi publicado há 8 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Comprei na Fnac no dia 15 de janeiro deste ano um Amazon PC Slim L92 12” com as seguintes especificações:

  • Processador: Intel(R) Core(TM)2 Duo CPU T5750 @ 2.00GHz
  • Placa-mãe: Compal JFT00 (versão da bios: 1.05A)
  • Disco rígido: Samsung HM250JI (250GB)
  • Memória RAM: 4GB DDR2 SODIMM (dois pentes de 2GB)

O resto é irrelevante para este post, mas pros geeks desocupados deixo aqui o lspci e o lsusb:

root@alice ~ # lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub [8086:2a00] (rev 03)
00:02.0 VGA compatible controller [0300]: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller [8086:2a02] (rev 03)
00:02.1 Display controller [0380]: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller [8086:2a03] (rev 03)
00:1a.0 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 [8086:2834] (rev 03)
00:1a.7 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 [8086:283a] (rev 03)
00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) HD Audio Controller [8086:284b] (rev 03)
00:1c.0 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 [8086:283f] (rev 03)
00:1c.1 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 [8086:2841] (rev 03)
00:1c.2 PCI bridge [0604]: Intel Corporation 82801H (ICH8 Family) PCI Express Port 3 [8086:2843] (rev 03)
00:1d.0 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 [8086:2830] (rev 03)
00:1d.1 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 [8086:2831] (rev 03)
00:1d.2 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 [8086:2832] (rev 03)
00:1d.7 USB Controller [0c03]: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 [8086:2836] (rev 03)
00:1e.0 PCI bridge [0604]: Intel Corporation 82801 Mobile PCI Bridge [8086:2448] (rev f3)
00:1f.0 ISA bridge [0601]: Intel Corporation 82801HEM (ICH8M) LPC Interface Controller [8086:2815] (rev 03)
00:1f.1 IDE interface [0101]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller [8086:2850] (rev 03)
00:1f.2 SATA controller [0106]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller [8086:2829] (rev 03)
00:1f.3 SMBus [0c05]: Intel Corporation 82801H (ICH8 Family) SMBus Controller [8086:283e] (rev 03)
01:00.0 Ethernet controller [0200]: Atheros Communications Inc. AR242x 802.11abg Wireless PCI Express Adapter [168c:001c] (rev 01)
02:00.0 Ethernet controller [0200]: Marvell Technology Group Ltd. 88E8055 PCI-E Gigabit Ethernet Controller [11ab:4363] (rev 12)
root@alice ~ # lsusb
Bus 002 Device 002: ID 0bda:0158 Realtek Semiconductor Corp. Mass Stroage Device
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 04f2:b052 Chicony Electronics Co., Ltd 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 147e:2016  
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Alice (é o nome do laptop) veio com Windows Vista 64 bits e a primeira coisa que notei nela foi um estranho desligamento do nada (no seu primeiro dia de vida), antes mesmo de eu instalar Linux! (ou seja, nos seus primeiros minutos, pois obviamente a primeira coisa a fazer quando se recebe um computador com Windows é instalar um Linux)

Compal JFT00

Pensei ser problema do sistema operacional e não dei bola. Mas aí a coisa ficou estranha: coloquei um CD minimal do Gentoo amd64 e quando ele iniciava o computador desligava do nada.

Para não precisar resolver o problema na hora, instalei um Ubuntu 32 bits (que, estranhamente, não desligava) e entrei na internet para pesquisar.

A página que melhor refletiu esse problema foi essa: 64-bit Intrepid automatic permanent reboot loop related to having exactly 4GB of memory (Ubuntu Bug #272530) e talvez também essa.

Como o laptop estava com lacres de garantia, ao invés de abrir e tirar 2GB de memória pra testar levei-a até a divisa entre Florianópolis e São José (um local lá perto de onde o Peterson vive) para a Wil Informática, única autorizada da Amazon PC na região.

Lá chegando o cara do suporte falou que tinha outros laptops da Amazon dando problema e que podia ser devido aos 4GB de memória. Trocou os pentes e pensou que funcionaria. Funcionou por alguns minutos na mão dele. Chegando em casa notei que o problema continuava e, como não tinha mais lacres, tirei um pente.

O laptop com 2GB de memória RAM não teve problema algum. Instalei Gentoo, pesquisei mais um pouco e encontrei a opção mem=4000M que deveria passar para o Kernel só reconhecer 3 e com isso funcionar com 64 bits.

amazonPC

Continuei pesquisando, entrei em contato com a Amazon (que não ajudou em nada a não ser sugerir algo equivalente a mem=4000M pra Windows) e troquei e-mails com o Wil (que prometeu passar minha queixa para a Amazon trocar minha placa-mãe e desde 9 de fevereiro não me respondeu). No fim, não tive opção senão ficar com o laptop e, como ele não dava problemas com 3GB, resolvi deixar pra lá.

Há cerca de dois meses, porém, o laptop começou a apresentar outro problema. De vez em quando (quando eu fazia-o processar muito), ele desligava do nada. Quem tem noção de como é o Gentoo sabe que fazer o computador processar muito faz parte do dia-a-dia.

Estranhando o comportamento, mas atribuindo-o a eu estar usando versões bleeding edge (hard masked) de Kernel, GCC & etc, resolvi usar um Ubuntu 32 bits por um tempo até ter disponibilidade pra reinstalar um Gentoo com carinho.

Nos primeiros dias de Ubuntu ele travava com frequência, mas acreditei que fosse por culpa da placa de vídeo (tinha duas opções no Ubuntu: usava Compiz — blacklisted pa minha placa de vídeo — ou tinha um lag infernal pra trocar de área de trabalho no Gnome. Fiquei com a primeira), então não dei bola. Curiosamente os problemas cessaram e continuei usando o Ubuntu [razoavelmente-]feliz por mais algum tempo. De vez em quando o computador desligava quando eu fazia operações bastante pesadas e eu estranhava, mas pensava que era coincidência.

Funtoo

Nesse fim de semana ouvi falar do Funtoo e, mesmo com a agenda cheia, resolvi parar de usar Ubuntu de uma vez e fazer a Alice voltar a ter um sistema firme e forte. Baixei o stage 3 do ~core2_32, caprichei nos arquivos de configuração e quando rodei um emerge -DN world surpresa! O laptop desligou.

Superaquecimento? Podia ser, o cooler fazia um barulho desumano, embora o tempo em São Paulo fosse muito frio. O ACPI não me ajudava, porque a temperatura da thermal zone ficava oscilando entre 42, 55, 63, 68, 73 e 79 graus celsius o tempo todo, assim como o barulho do cooler.

Deixei-a desligada por um dia, coloquei-a com as pontas apoiadas em livro, super ventilada, e fui compilar o Gentoo. Novamente, o laptop desligou.

Só pode ser o problema da BIOS, pensei. Vou ver se tem uma versão nova… E não é que tem?

Windows Vista = shit

Ótimo, sofro um pouco mas instalo o Vista, atualizo a BIOS e depois isso vai estar corrigido. Alterei minha tabela de partições, criei uma partição primária especialmente pro Windows (porque sei que ele é chato com isso), iniciei com enorme desgosto a instalação do Vista e depois de digitar a product key mais de uma vez cheguei a conclusão que não ia conseguir instalá-lo. E depois ainda dizem que Linux é que é difícil…

Bom… Vou tentar instalar o Gentoo 64 bits, afinal ele já tinha funcionado no início do ano. Baixei e queimei um system rescue cd, o stage 3 do ~core2 e fui à luta. Resultado: desligamento sempre que tentava compilar alguma coisa pesada. Notava uma mensagem estranha muitas vezes: gcc internal compiler error

Está trabalhando demais? Vou tentar compilar com MAKEOPTS=”-j1″. Porém, mesmo resultado.

Resolvi voltar lá, configurei o Kernel e fui compilar. Em vários pontos dava essa segmentation fault (eu ia retirando as partes que davam esse erro), um deles (o último que eu anotei, aí resolvi desistir) foi no reiserfs:

fs/reiserfs/dir.c:231: internal compiler error: Segmentation fault

Pensei que só podia ser porque estava usando versões de Kernel e GCC muito novas, potencialmente instáveis (2.6.30-gentoo-r5 e 4.4). Mas por via das dúvidas resolvi procurar na internet. Eis o que encontrei:

- Random segfaults during compilation. These are signalled by compilation
  failing at undetermined points. Often trying to recompile will succesfully
  compile the file it was complaining about, but will fail for another. This is
  in general a sign of hardware problems.
...
There are multiple causes that can cause the above symptoms:
- Flaky hardware. This is showstopper number one. The cause can be either:
  - Insufficient power supply. To detect this try to unplug as many auxiliary
    devices (like cd-players, usb devices, etc.)  as possible and see whether
    the problem persists
  - Overclocked memory or CPU's can show random anomalous behaviour. Worse some
    hardware has these problems even at "factory speed". Lowering the clockspeed
    would be the solution to this problems
  - Overheated CPU's. CPU's have several calculation units which have a specific
    location on the chip. Compilation tends to intensively use a few of those
    units. This can cause heat problems within these units even when the overall
    chip temperature is within limits. If overheating is a problem a better cpu
    cooler often works. (Underclocking also works as heat increases with
    frequency)
  - Broken chipsets. There are some chipsets on motherboards which are broken.
    sometimes the os (read linux kernel) can work around some of these bugs,
    sometimes the only solution is a new motherboard.

Resolvi ainda testar o Funtoo estável pra desencargo de consciência, mas dessa vez o system rescue cd não bootou!!! Suponho então Broken chipset ou overclocked memory or CPU. Qual dessas? Apostaria na primeira, mas de fato não faço muita ideia, porque não entendo nada de hardware.

Resignado, ontem enviei e-mails detalhados para quatro assistências técnicas de São Paulo. Acabou o horário comercial há duas horas e nenhuma delas me respondeu.

Minha grande dificuldade é explicar isso pras assistências técnicas que, em geral, são compostas por pessoas que não entendem nada de Linux, nada de compilação e não compreendem nem mesmo o problema que tenho. Não que a última seja fácil, nem eu entendo esse problema (mas eu pelo menos sei que há algo errado). Elas testam deixando o computador ligado por algumas horas e, notando que ele não desliga, pensam que está tudo normal.

that-damntechsupportguy

Creio inclusive que há outros Compal JFT00 (a Intelbras produziu vários desses, além da Amazon) com o mesmo defeito, mas usuários comuns de computador nem devem notar.

Solução? Amanhã telefonarei pra Amazon e incomodarei eles até eles consertarem Alice de vez ou me prometerem um laptop novo. Por sorte Alice ainda está na garantia, que vai até janeiro de 2010. Espero que até lá eu já tenha resolvido tudo isso…

Meu projeto para o GSoC

ATENÇÃO: Este conteúdo foi publicado há 9 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Acabei de enviar um projeto para o Google Summer of Code: Escrever um software chamado “G-PEAR” para instalar pacotes do PEAR de uma forma mais gentooniana (análogo ao G-CPAN para o CPAN).

A idéia é de Anant Narayanan e li na wiki do Gentoo. Ainda em abril meu projeto será avaliado.

Download: G-PEAR Project (inglês, pdf, 84kb)

Como baixar e assistir filmes completos na internet

ATENÇÃO: Este conteúdo foi publicado há 9 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Todo mundo gosta de assistir filmes, principalmente durante férias ou feriados chuvosos. Se você não tem dinheiro para comprar filmes, acha caro e chato sair para alugar um filme, seus problemas acabaram: ao fim deste artigo você estará qualificado para ser capaz de baixar e assistir qualquer filme (inclusive ainda não lançados aqui no Brasil) sem levantar da sua confortável cadeira de computador.

P2P

Disponibilizar um filme na internet é crime, violação de direitos autorais. Então se você quisesse baixar algum filme que não está disponível sob uma licença livre, você não encontraria o filme que quer baixar simplesmente procurando no Google por “Baixar filme do Harry Potter” ou “Baixar Shrek 3”. Ao invés de procurar na internet convencional, você teria que aprender a se conectar a outras pessoas. Isso é feito através de P2P, peer-to-peer, e existem vários programas neste ramo: Napster (um dos primeiros – acho que o programa não existe mais, mas a rede OpenNap ainda existe), Kazaa (bastante popular, sua rede FastTrack tem um bom conteúdo), Gnutella (rede livre – GNU – onde funcionam vários programas: Limewire, Frostwire, gtk-gnutella, entre vários outros), OpenFT, Ares, etc, etc, etc

Depois de usar durante bastante tempo o giFT, que já foi capaz de se conectar ao mesmo tempo nestas cinco redes (OpenNap, FastTrack, Gnutella, OpenFT e Ares), descobri um novo protocolo, novo e bem mais eficaz: o Bittorrent.

Bittorrent

Segundo a Wikipedia, BitTorrent é um protocolo que permite às utilizadoras e aos utilizadores fazerem download de arquivos indexados em websites. Essa rede introduziu o conceito “partilhe o que já descarregou” maximizando muito o desempenho e possibilitando downloads rápidos e imediatos. Foi criado por Bram Cohen em 2003 e tem sido o alvo nº1 de empresas que lutam em defesa da propriedade intelectual, devido a alegações de violação de copyright de alguns arquivos transmitidos pela rede.

O Bittorrent é provavelmente o mais inteligente dos partilhadores de arquivo da internet. Ele fragmenta os arquivos em pequenos pedaços e você ao mesmo tempo baixa e compartilha o seu arquivo (chamado torrent, com extensão .torrent).

Existem diversos clientes de Bittorrent, entre quais posso recomendar os três que eu já usei: Bittorrent (o original, de Bram Cohen), Azureus (provavelmente o mais pop. Multiplataforma, feito em Java, muitos sites partem do princípio de que você usa ele para distribuir seu torrent) e Deluge (parecido com o Azureus, mas em GTK)

Para baixar seu filme, você deve baixar um destes clientes (programas que abrem os arquivos .torrent).

Encontrando o filme e escolhendo a versão

Existe uma porção de sites que arquivam os .torrent disponibilizados internet a fora. Eu costumo usar o Mininova, mas ao fim deste artigo você encontra outros links interessantes.

Entre no Mininova e procure por “harry potter and the order of the phoenix” em filmes (movies). Sua busca retornou 74 resultados.

Como escolher qual baixar? Seeders são pessoas que estão compartilhando o arquivo, leechers são os que estão baixando. O mais importante é baixar um que tenha bastante seeders, para que seu download não falhe (não acabe de baixar) por falta de partilhadores. Em segundo lugar, veja que existem vários formatos diferentes de vídeo e tamanhos. Você pode optar por um vídeo que caiba num CD, por exemplo (700mb).

Escolhido seu torrent, clique nele, faça download do .torrent e abra com o seu cliente que você baixou no passo anterior. Em algumas horas, dias, meses, anos ou décadas (dependendo da velocidade da sua conexão e do número de seeders e de leechers) o seu filme estará baixado.

Também é bastante fácil baixar livros, seriados americanos, softwares e outros materiais ilegais em redes de torrent.

Encontrando e baixando a legenda

Existem vários sites para baixar legendas (subtitles) dos vídeos que você baixa na internet. Um deles é o Opensubtitles e outro é o Legendas.TV (em geral, é o que eu uso). Crie uma conta lá e procure pelo filme que você quer.

Procure pela mesma versão que você baixou o filme (o nome completo, exemplo nome-Xvid-aXXo-mavericK…), porque aí não há risco da legenda ficar mal sincronizada. Se não achar, não se preocupe: o player pode ressincronizar a legenda.

Usando o MPLAYER para assistir o vídeo

% mplayer [ARQUIVO DO FILME]

» Legenda

Para adicionar a legenda ao seu filme basta usar a opção -sub [ARQUIVO DA LEGENDA] ao comando do mplayer:

% mplayer -sub [ARQUIVO DA LEGENDA] [ARQUIVO DO FILME]

O mplayer é um programa muito mais versátil do que parece. É possível mudar a fonte, a cor e a posição da legenda, ente muitas outras coisas. A maioria dessas opções de legenda são alteradas usando o ASS. Eu costumo assistir os filmes com uma legenda grande amarela embaixo da área do filme widescreen (na faixa preta, porque a leitura torna-se mais fácil):

% mplayer -ass -ass-color FFFF0000 -ass-font-scale 1.2 
-ass-force-style FontName=Arial,Default.Bold=1 -ass-use-margins 
-ass-bottom-margin 80 -sub [ARQUIVO DA LEGENDA] 

[ARQUIVO DO FILME]

Se a legenda estiver fora do tempo do filme, use as teclas x e z dentro do mplayer para alterar o delay.

» Tela cheia

Adicionando -fs -zoom ao comando mplayer você executa o vídeo em tela cheia:

% mplayer -fs -zoom [ARQUIVO DO FILME]

» Meu comando completo

% mplayer -fs -zoom -ass -ass-color FFFF0000 -ass-font-scale 1.2 
-ass-force-style FontName=Arial,Default.Bold=1 -ass-use-margins 
-ass-bottom-margin 80 -sub [ARQUIVO DA LEGENDA] 

[ARQUIVO DO FILME]

Dicas para uma melhor sessão de cinema

  • Tem um amplificador ou um aparelho de som? Compre adaptadores pra ligar a saída da sua placa de som neles. São baratos e o som fica muito melhor.
  • Se você tiver um laptop ou um computador com uma placa de vídeo que tenha saída S-VIDEO, ligue o computador na TV. A imagem fica ótima e você se sente assistindo a um DVD de verdade.

Links úteis relacionados

  • Cinecombo (site brasileiro com vários torrents para legenda e um sistema de pedidos de filmes)
  • Bittorrent.com (site do cliente oficial e também busca torrents)
  • Mininova (indexador de torrents)
  • TorrentSpy (outro bom indexador e buscador de torrents)
  • Legendas.tv (baixe legendas em português do Brasil)
  • Mplayer (player de vídeo para Linux)

Importante! Não seja um fora-da-lei.

Não use o que eu escrevi neste artigo para baixar ilegalmente filmes, livros e outros conteúdos protegidos por copyright.

Como recuperar a inicialização do Linux depois de instalar Windows

ATENÇÃO: Este conteúdo foi publicado há 9 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Esse é um problema super comum que já resolvi para dezenas de pessoas e resolvi escrever aqui pra não ficar tendo que repetir a resolução toda vez que alguém me perguntar.

O caso é o seguinte: você tem Linux numa das suas partições e por algum motivo estranho instala Windows (ou reinstala) na outra. O Windows, como todo sistema operacional para idiotas, simplesmente limpa sua MBR (master boot record do HD) sem lhe perguntar nada e com isso deleta seu gerenciador de boots (neste post estarei tratando o Grub e o Lilo).

Aí você se vê triste, desiludido e em muitos casos resolve reinstalar o Linux só pra recuperar o boot. Péssimo, não? Mas não se preocupe: seus problemas acabaram.

Tudo o que você precisará para recuperar sua MBR (com Grub ou Lilo) é:

  1. Um livecd (não precisa ser um daqueles pesadões, um disco 1 do Slackware ou Gentoo Minimal resolve) com a mesma arquitetura do seu Linux. Se você não tem, sugiro o Gentoo Minimal porque é leve: o download você faz aqui. Se você não sabe o que é arquitetura, você provavelmente usa x86.
  2. Saber em que partição se encontra seu Linux (tipo: /dev/hda1, /dev/sda1, ou algo do gênero) e em que HD ele se encontra (tipo: /dev/hda, /dev/sda… é só tirar o número da partição)

Se você não sabe em que partição/hd está seu Linux, é fácil descobrir através do comando fdisk -l

Boote o livecd (considerarei que você sabe fazer isso, do contrário não teria conseguido instalar o Windows) e abra um terminal se seu livecd for gráfico (é aquela telinha preta, também pode ser chamado de Console).

Agora o que vamos fazer é montar a partição root do seu Linux (e considerarei que /boot não está numa partição separada, se estiver monte ela também), entrar nela e reinstalar o Grub ou o Lilo.

Se o seu terminal terminar com um caractere $ (cifrão), digite “sudo su” para virar root. Agora pode digitar o que segue:

# mkdir linux
# mount /dev/hda1 linux
# mount -o bind /dev linux/dev
# mount -t proc none linux/proc
# chroot linux /bin/bash
# source /etc/profile
# cat /proc/mounts > /etc/mtab

Não se esqueça de substituir /dev/hda1 pela partição do seu Linux.

Agora, se você usa Grub (se não, provavelmente esse comando não dará problema, então se você estiver na dúvida pode chutar esse):

# grub-install --recheck /dev/hda

(substituindo /dev/hda pelo device do seu hd)

Ou se você usa Lilo:

# lilo

E pronto! Limpando a sujeira…

# exit
# umount linux/proc
# umount linux/dev
# umount linux

E pode rebootar pro seu velho Linux.

Se você não tinha Windows antes, o Windows não vai por mágica aparecer nas suas opções de boot. Então, no seu velho Linux, é só editar o arquivo /boot/grub/menu.lst (pra quem usa Grub) ou /etc/lilo.conf (pra quem usa Lilo) e colocar linhas para bootar o Windows, respectivamente:

title Windows
rootnoverify (hd0,1)
makeactive
chainloader +1

e

other=/dev/hda2
label=Windows

(assumindo que seu Windows está em /dev/hda2)

É importante que você note que o Grub inicia suas contagens a partir do 0. hda1 é (hd0,0), hda2 é (hd0,1), hdb1 é (hd1,0), hdc2 é (hd2,1). Deu pra entender? Letra antes da vírgula (a = 0, b = 1, c = 2, …) e número depois da vírgula (1 = 0, 2 = 1, 3 = 2, …)

Para editar um arquivo como root, escreva “su” para virar root e use “vim”, ou, se você não sabe fazer isso, sua distribuição provavelmente permite que você digite algo como: “sudo gedit arquivo” ou “sudo kwrite arquivo”.

Se você usa Lilo, é necessário que depois de salvar o arquivo você entre no terminal como root e digite:

# lilo

… para salvar suas alterações na MBR.

É isso. Reinicie seu computador e divirta-se com seu gerenciador de boots funcionando novamente. Qualquer dúvida, escrevam comentários.

HOWTO: Como usar Pandora Radio no Brasil

ATENÇÃO: Este conteúdo foi publicado há 10 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

O projeto Pandora é uma rádio on-line que funciona como um catálogo bem categorizado de milhares de CDs e é capaz de reproduzir músicas parecidas com o tipo que você diz para ele que gosta. Ficou confuso? É assim: eu entro lá e escrevo que gosto de Chico Buarque. Aí ele me diz: vamos tocar uma música do Chico que tem suas características principais como canto em português, violão leve, etc. Responda se você gostou ou não e baseado nessa escolha tocaremos outro estilo ou continuaríamos no mesmo.

É uma idéia muito legal porque no fim você ouve apenas o que gosta, mas também descobre novas músicas (porque ele não fica repetindo artista, álbum, música, mas só as características da música ou do artista que você selecionou a princípio).

Fazia tempo que eu não usava o Pandora porque num esforço comunitário de minha família, digitalizamos algumas centenas de CDs criando uma biblioteca de 35 gb em MP3. Porém, meu desktop (Durion 1.1) que era meu servidor de música (MPD) recentemente morreu (a placa-mãe deu pau) e, cansado de ouvir as poucas músicas que tinha aqui no laptop, resolvi ver como andava o Pandora.

Porém, fui surpreendido por uma mensagem dizendo que por causa de copyright brasileiros não podem mais usar o Pandora. Isso é um problema que eles dizem estar conversando com as autoridades para resolver, mas por hora não podem aceitar IPs brasileiros, o que me levou a buscar uma solução.

A primeira coisa que pensei foi procurar um servidor de proxy nos Estados Unidos. É fácil se você entrar no Public Proxy Servers, mas a velocidade deles realmente não me agrada, ainda mais pra ouvir uma rádio on-line. Então, pesquisei um pouco e depois de algum tempo encontrei a solução: SSH tunneling (túneis de SSH?)

Eu uso SSH todo dia e nunca tinha me dado conta que ele tem uma opção super interessante que é numa dada porta criar um tunelamento que pode ser usado como servidor SOCKS (proxy). Aí você pensa: mas qual a vantagem? De qualquer jeito você terá que usar um servidor proxy e ficar com a internet mais lenta. Sim, é verdade, mas o meu servidor na Dreamhost é sem dúvidas muito mais rápido que um proxy público e eu tenho certeza que minhas informações ficam seguras. Aliás, é por segurança que a maioria das pessoas usa SSH tunneling (ex.: pessoas com laptop numa rede wireless pública)

Vamos ao prático:

$ ssh -C -D 666 -N user@host

E configure seu navegador para usar Socks (eu usei V5, mas a V4 deve funcionar também) para o endereço: 127.0.0.1 (isso mesmo, não é o host que você colocou no SSH, é a sua máquina, porque ela que criou o servidor) na porta que você especificou com o parâmetro -D (nesse caso 666)

As opções do SSH que eu utilizei no exemplo são:

  • -C: comprime entrada e saída. Nos exemplos que eu peguei vinha, acredito que seja pras transferências serem mais rápidas.
  • -D [bind:]port: porta (e um endereço opcional) pro servidor rodar
  • -N: não executa nenhum comando (ie não abre um shell)

Esta dica funciona em sistemas operacionais que tem SSH (Linux, FreeBSD e provavelmente qualquer outro Unix-like). Para usá-la no Windows, você deve usar o PuTTy.