Posts Tagged ‘how to’

Review receptor ISDB-T DiBcom STK8096GP (TV digital do Brasil)

Sunday, December 13th, 2009

Na visita do Jon “Maddog” ao Brasil para o 4º SoLiSC ele trouxe, como sempre, alguns brinquedinhos comprados nas viagens. Um deles é um receptor de televisão digital para o padrão ISDB-T usado no Brasil e Japão, mais especificamente ao padrão brasileiro. Como ele não tinha tempo para testar eu me ofereci (nerd é a vó).

O produto é chinês, fabricado por uma empresa chamada MyGica. A embalagem é simples, não mostra nem o nome da empresa que fabrica, informação essa que só consta no manual. É bem montado e acabamento aceitável para o preço (algo em torno de $50).

O controle remoto fica na parte de trás da embalagem.

O controle remoto fica na parte de trás da embalagem.

O conteúdo da embalagem é tão completo quanto parece, só vem o essencial:

  • O receptor em formato “dongle”
  • Antena VHF/UHF de alto ganho (diz ela)
  • Adaptador para ligar uma antena externa
  • Controle remoto desenhado para o software Total Media que vem no CD
  • Manual
  • Cd com driver e software de media
Nada mais que o suficiente

Nada mais que o suficiente

Um detalhe estranho, o driver para windows que vem no CD não é o driver correto para o chip de captura. Encontrei o driver correto em um fórum chileno e deixo aqui caso alguém precise.

Não vou cobrir a instalação dele no windows, então vamos ao que interessa, ao plugar ele no seu computador você não vai ter muitas informações.

usb 1-1: new high speed USB device using ehci_hcd and address 6
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: New USB device found, idVendor=10b8, idProduct=1fa0
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: STK8096GP
usb 1-1: Manufacturer: DiBcom
usb 1-1: SerialNumber: 1

Isso não colabora muito mas nos dá o fabricante e o modelo do chip. Com isso é fácil dar uma googlada sobre o funcionamento dele no Linux. A boa notícia é que o fabricante é bonzinho e colaborou com a confecção do driver. Temos por tanto um suporte ainda inicial ao ISDB-T no v4l-dvb. Uma questão de fazer o download, um make, make install e tudo pronto. Para isso basta pegar o trunk (já que é experimental vamos viver perigosamente).

$ hg clone http://www.linuxtv.org/hg/v4l-dvb
$ cd v4l-dvb
$ make
$ su
# make rmmod
# make install

Você pode substituir o su com sudo se preferir. Após instalar os driver ainda precisamos do firmware do dispositivo. Basta fazer o download e colocá-lo em /lib/firmware/ que tudo estará bem. A resposta do dmesg após replugar o dispositivo agora deverá ser algo como:

dib0700: loaded with support for 14 different device-types
dvb-usb: found a 'DiBcom STK8096GP reference design' in cold state, will try to load
a firmware
firmware: requesting dvb-usb-dib0700-1.20.fw
dvb-usb: downloading firmware from file 'dvb-usb-dib0700-1.20.fw'
dib0700: firmware started successfully.
dvb-usb: found a 'DiBcom STK8096GP reference design' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
DVB: registering new adapter (DiBcom STK8096GP reference design)
DVB: registering adapter 0 frontend 0 (DiBcom 8000 ISDB-T)...
DiB0090: successfully identified
input: IR-receiver inside an USB DVB receiver as /devices/...
dvb-usb: schedule remote query interval to 50 msecs.
dvb-usb: DiBcom STK8096GP reference design successfully initialized and connected.
usbcore: registered new interface driver dvb_usb_dib0700

Não é lindo? :)

Com isso nos temos o dispositivo funcionando mas ainda falta o pedaço que me fez perder algumas horas. Escanear os canais para poder ver o Faustão na telinha do seu PC (ele cabe agora que emagreceu). Para isso nos vamos usar as ferramentas que o driver ali em cima já instalou antes junto com os módulos. A aplicação scan fará isso mas ela precisa de informações para fazer seu trabalho, ela precisa de uma lista de freqüências e ranges para poder escanear por recepção. Essa lista eu consegui primeiramente no blog de dougsland (que não parece ter o nome real divulgado no site). Sabendo o que eu estava procurando (frequency table) eu consegui encontrar no excelente wiki do linuxtv.org em http://www.linuxtv.org/wiki/index.php/ISDB-T_Frequency_Table

Copie o conteúdo e cole em um ch.conf então rode o comando scan para gerar a lista de canais disponíveis:

$ scan ch.conf > channels.conf

Isso gerará um monte de erros como:

>>> tune to: 503142857:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_3_4:FEC_AUTO:QAM_
AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_NONE

Mas não se preocupe, são normais. Se você tem recepção no meio desse monte de erros você verá um:

Network Name 'RBS TV FLOPS'
0x0000 0xdc60: pmt_pid 0x0101 (null) -- RBS TV HD (???)
0x0000 0xdc78: pmt_pid 0x1fc8 (null) -- RBS TV 1seg (???)

E então seu arquivo channels.conf terá as informações de canais para que você possa vê-los. Se você está em Florianópolis Santa Catarina Brasil por volta do ano de 2009 você terá somente dois canais, um 1 seg e outro full seg que são, infelizmente:

RBS TV HD:587142857:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_3_4:FEC_AUTO:QAM
_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_NONE:273:274:
56416
RBS TV 1seg:587142857:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_3_4:FEC_AUTO:QAM
_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_NONE:529:530:
56440

Afinal a Band ainda tem as madrugadas de sábado pra animar a garotada. Com isso nós ficamos no ultimo passo: assistir televisão. Mas antes, uma explicação rápida antes sobre a zona toda de TV digital (não achou que eu ia te liberar agora né?).

O mundo todo usa os tais dos DVB-S, DVB-T, DVB-S, DVB-C e ATSC, o Japão  criou e usa o ISDB-T, o Brasil adotou ele e o usa para transmissão, inclusive usa o mesmo range de freqüências, se as tabelas não são iguais elas são muito parecidas. A transmissão digital usa 13 segmentos, 1 deles esse padrão deixou reservado para transmissão de baixa qualidade para dispositivos móveis, com telas pequenas, ou baixa capacidade. Sim, esse é o tal do 1seg que você vai ver bastante. O resto é transmitido em 12 segmentos (full-seg) e nesses estão as transmissões standard e hd. O codec de audio usado é o AAC e o de vídeo e o H264.

Toda a parte anterior está resolvida pelo driver, linda e funcional, um charme tecnológico. Mas… a questão do codec ainda não. Apesar do MPlayer ter colocado suporte por agora ainda não está bom até a redação desse texto. A unica alternativa viável por agora é o VLC que tem suporte a h264 e AAC. Além de se entender com o DVB.

Para fazer funcionar basta você clicar em Exibir > Lista de Reprodução, clicar no mais, adicionar o channels.conf que você criou, dar dois cliques e pronto, simples assim.

No fantástico =

No fantástico =)

Mas vamos ao que interessa, e o HD??? Bom, veja bem. O h264 garante uma alta compressão com pouca perda de qualidade, mas isso tem um custo, um rim. Digo, um processador, você precisa ter uma máquina BOA para descodificar o vídeo em HD 1080p. Tanto que no linux eu não consegui tocar direito por conta da implementação do h264, no áudio é perfeito sem nenhum problema, vídeo vai travando, inclusive no poderoso windows (por conta do meu proc dai). Pra ser sincero, no VLC eu não consegui visualizar nem o 1seg direito por conta da descodificação do h264 o vídeo fica com frames repetidos (falha na interpolação ou algo por ai). Você pode ter mais sorte em uma versão mais nova ou melhor do VLC (não desista padawan).

Quero ver você pegar momento melhor pro screenshot.

Quero ver você pegar momento melhor pro screenshot.

Sobre o controle remoto, ele funciona e o driver reconhece mas eu não tive tempo de fazer ele fazer algo útil. A prova são as mensagens que o driver põe no kernel. Basta tratá-las e usar, mas não é algo que um usuário comum faria, então fica pra outra hora (talvez nunca :P ).

dib0700: Unknown remote controller key: 0000 20 df
dib0700: Unknown remote controller key: 0000 20 df

Todo o processo acima foi feito em cima de um Slackware Linux com versão entre 12.2 e current pré 13.1. (sim, uma zona).

Ps. Gostaria de agradecer a Douglas Conrad que me deixou ficar com o equipamento por uns dias para testes. Foi divertido :P

Chromium e Slackware

Wednesday, September 30th, 2009

Chromium

Finalmente após anos de tortura tendo que aguentar as travadas do Firefox chegou o momento de ter um browser leve, rápido e com renderização de fontes decente no linux. Chegou a vez do Chromium, projeto open source do Google que é a fonte do browser Chrome. Um amigo meu estava usando ele no ubuntu eu resolvi rodar ele no Slackware. Descreverei o processo de instalação e a minha análise sobre esse beta.

Primeiro instale o mozilla-nss a provável unica dependência que você vai precisar.

Eu não criei um pacote para o chromium, talvez eu o faça no futuro. Até lá baixe o ultimo tarball e rode só pro seu usuário, caso você tenha problemas com os nomes estranhos criados pelo pessoal que empacota para o debian (alguém faz ideia de por que o .d??) faça o seguinte que tirei daqui.

ln -s /usr/lib/libplds4.so /usr/lib/libplds4.so.1d
ln -s /usr/lib/libnss3.so /usr/lib/libnss3.so.1d
ln -s /usr/lib/libsmime3.so /usr/lib/libsmime3.so.1d
ln -s /usr/lib/libssl3.so /usr/lib/libssl3.so.1d
ln -s /usr/lib/libnssutil3.so /usr/lib/libnssutil3.so.1d
ln -s /usr/lib/libnspr4.so /usr/lib/libnspr4.so.0d
ln -s /usr/lib/libplc4.so /usr/lib/libplc4.so.0d
ln -s /usr/lib/libplds4.so /usr/lib/libplds4.so.0d

Tente rodar o chrome primeiro, pode ser que tenha mudado no ultimo build. And there you go. :)

Usando um tema escuro pra ficar mais discreto.

Usando um tema escuro pra ficar mais discreto.

A análise: é rápido, muito rápido. Tem corretor ortográfico . E tudo que tem na versão windows. Ainda não tem sua ferramenta que substitui o Firebug madura o suficiente para ser usada ao invés do inseto flamejante mas da pro gasto em toda a parte de navegação. Outro contra é a falta de gears mas dizem que o próprio html 5 terá suporte para armazenagem, aguardaremo então até o Chromium e o GMail darem suporte para isso. :/

Guardando Windows no Armário e Restaurando

Sunday, September 20th, 2009
Autochk.exe Not Found, Lembra de mudar o tipo da partição.

Autochk.exe Not Found, Lembre-se de mudar o tipo da partição.

Todo nerd sabe que partições ocupadas são tão tentadoras a formatação pra instalação de novos sistemas quanto as vazias, se não mais. A uns 4 meses atrás eu estava com um windows xp em uma partição de 30G. Queria formatar testar o kde4 do slackware current mas não podia perder meu progresso no CS Condition Zero e no Abe’s Exodus então eu resolvi colocar a partição pra dormir no hd externo. Pra isso eu usei o dd pra fazer um backup em arquivo.

# dd if=/dev/sda1 of=/mnt/data/windows.img

Formatei a partição e instalei o Slackware 13.0. Isso manteve meu windows dormindo por 4 meses quando bateu aquela vontade de jogar um CS. Pensei tudo bem, como as partições não haviam mudado de tamanho bastava um dd denovo e tudo estaria devolta. Ledo engano, apesar de o $ dd if=/mnt/data/windows.img of=/dev/sda1 ter sido um sucesso, descomentei as linhas do lilo.conf que colocavam o windows devolta no boot e reiniciei, tela de boot. Então uma rápida mensagem avisando que faltava um tal de autochk.exe uma tela azul (bsod pros intimos) e um restart. Depois de um tempo pesquisando eu peguei o pulo do gato. Quanto eu formatei minha partição para instalação do slackware seu tipo mudou de HPFS NTFS para Linux. Rodei o cfdisk mudei pra 0×07 (HPFS NTFS) e rebootei. Bingo, tudo funcionou, meu cs ta la como antes :D .

Ai fica a dica, se quiser guardar seu windows ou outro sistema no armário por um tempo execute os dois comandos acima quando julgar necessário. E atente ao tipo da partição quando for restaurar de Linux para Windows e vice-versa. Para verificar o tipo é só rodar um fdisk -l /dev/xxx onde xxx é seu disco. Ex:

root@theguide:~# fdisk -l /dev/sda

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0xc6c894fd

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        3824    30716248+   7  HPFS ou NTFS
/dev/sda2            3825        7648    30716280   83  Linux
/dev/sda3            7649       14465    54757552+  83  Linux
/dev/sda4           14466       14593     1028160   82  Linux swap

Magia Negra das Threads em Python

Thursday, September 17th, 2009
Python Threads

Python Threads

Certo dia estava eu a pensar sobre a vida o universo e tudo mais e antes que 42 viesse a minha mente foi pedido que eu implementasse um disparador de SMS’s. Para isso eu precisava fazer disparos simultâneos em X canais gsm. Requisito óbvio: preciso de threads. PHP, a linguagem que usamos para quase tudo na aplicação não tem um suporte bom a threads então fui atrás de outra linguagem para o fazer.

Python atravessou meu caminho e nas minhas brincadeiras com a cobra (ui!) eu apanhei, jesus sabe que eu apanhei dessa pseudo-linguagem medonha e caracu (eu xinguei de coisa pior enquanto era humilhado pela até então ignorância na linguagem). Eu apanhei por que o mau costume de só ter usado Java (pausa para uivos e pedras….) para trabalhar com threads me deixou preguiçoso e mau acostumado a uma declaração bem mais simples de sincronismo entre métodos, bastava um synchronized e tudo estava funcionando.

Python ao contrário de Java não é nada thread-safe. Todas as chamadas simples podem ser desastrosas se mexem com recursos compartilhados entre as threads.

Sincronizando

Já que a python não é thread-safe temos que assumir essa responsabilidade no lugar da linguagem e sincronizar as chamadas com Locks, Semáforos e afins. Não é o fim do mundo, mas que é chato, é. Se quizermos por exemplo fazer a inserção de dados no banco de dados e ter o resultado disso logo após cada insert devemos sincronizar os inserts e commits já que o componente MySQLdb não faz esse controle para nós.

class Inserter(object):
    def __init__(self, lck,db):
        self.lock = lck;
        self.db = db
 
    def insert(self, insert):
        cursor = self.db.cursor()
        try:
            self.lock.acquire()
            cursor.execute(insert)
            cursor.execute("commit")
        finally:
            self.lock.release()

Queue

Outro componente muito útil quando se utiliza threads são as Filas. Filas são fifos (first-in first-out) que enfileiram ações que você gostaria que fossem executadas em paralelo por threads ou que simplesmente sejam executadas em determinada ordem.

# Importamos o módulo
from Queue import Queue
 
def run(self):
        while True:
            try:
                self.lock.acquire();
                if self.fila.empty():
                    break
                item = self.fila.get()
            finally:
                self.lock.release()
 
            self.printer.imprime(item)

Uma nota sobre Filas é que não se deve usar um if not queue.empty() e depois tentar dar um queue.get() já que no tempo entre esses dois acessos aos métodos outra thread pode pegar o ultimo elemento. É necessário que você simplesmente pegue o elemento e trate a exceção ou use Lock nessa parte do método.

ps. estranho, mas python implementa LIFO (pilha) no modulo Queue. :P

Atualizando Slackware 12.2 para 13.0

Monday, August 31st, 2009

Dia 26 de agosto foi lançada a versão numero 13.0 do Slackware Linux. Com kde 4, novo sistema de pacotes e toneladas de mudanças a atualização pode confundir algumas pessoas. Aqui fica meu passo a passo de como atualizar:

  1. Edite seu /etc/slackpkg/mirrors e coloque o repositório do 13.0
  2. slackpkg update

Aqui vem o macete. Primeiro atualize esses dois indivíduos e instale esse outro:

  1. slackpkg install xz
  2. slackpkg upgrade pkgtools
  3. slackpkg upgrade slackpkg

Por fim, é só executar o de sempre:

  1. slackpkg install-new
  2. slackpkg upgrade-all

Have fun com seu Slackware 13.0 :)