terça-feira, 22 de abril de 2008

Computador de Von Neumann (o seu)


Se por acaso tiver complicado entender, leia este post antes

Nos primórdios da computação, lá pela década de 30, Jon Von Neumman definiu um computador como algo que tivesse uma memória, uma unidade de controle, e uma unidade de lógica e aritmética. A esta espécie de conjunto deu-se o nome de arquitetura de Von Neumann. Até hoje, os computadores são feitos seguindo este princípio.(praticamente sem exceções).
A unidade de controle, a memória e a unidade de logica e aritmética comunicam-se entre si. A memória é algo dividido em bytes. Quero dizer, ela é endereçável, ou seja, ela tem vários e vários bytes de capacidade, mas ela é lida (ou escrita) indicando-se qual byte se
quer lêr naquele momento.
Abaixo, a figura de um arranjo de memória de 12 bytes.


A memória guarda instruções, do tipo "leia o byte que está na posição 2 da memória, some com aquele que está na posição 3 e guarde na posição 4".

"E onde é que se faz essa soma?"
É feita na unidade de lógica e aritmética. E quem comanda esse processo de transferir dados entre a memória e unidade de lógica e aritmética é a unidade de controle. Em resumo, a unidade de controle tem um ciclo infinito de buscar a instrução na memória, vê o que tem nessa instrução, fazer o que a instrução manda e colocar o resultado de volta em algum outro lugar da memória. Obviamente, tem lugares da memória onde se tem instruções, e lugares onde se tem dados.

"Então é só isso um computador?"
Claro que não né? Mas a base é essa aí. Ainda tem a se incluir aí algumas coisas, como por exemplo as placas de vídeo, som, rede, o teclado, o mouse... No fim das contas, é algo mais ou menos assim:


Perceba que atualmente se incorpora a unidade de controle(UC) e a unidade lógica e aritmética(ula) dentro do processador (dentre outras coisas que há dentro de um processador). Pode-se perceber também que há um controlador de memória entre o processador e a memória, e que o controlador de memória está ligado a outro controlador, o de dispositivos. Neste último, estão ligados os controladores de teclado e mouse, vídeo e som e o que mais couber nele. De fato, para o programador, os dispositivos agem como parte da memória. Os primeiros endereços da memória (as primeiras posições) são dos dispositivos. Lêr qualquer dado de um dispositivo usb é como ler da memória. É função do controlador de memória "separar" os acessos da memória dos acessos a dispositivos.

Um pouco mais sobre o processador ...
O processador têm dentro de sí, além de Uc e Ula (como na imagem acima) um conjunto de pequenas porçoes de memória, denominadas de registradores. Mas não são como a memória principal. Os registradores guardam dados auxiliares ao funcionamento do corrente programa em execução. Por exemplo, há um registrador que guarda o endereço de memória onde se inicia aquele programa, e há outro que guarda o endereço de onde se iniciam os dados daquele programa. Há um outro chamado contador de programa que guarda o endereço da proxima istrução que será executada. Em geral ele é incrementado de um em um a cada nova instrução que se executa, no entanto, existem instruções que permitem que se salte para posições específicas para trás ou para frente na memória. Certamente um computador não teria a menor utilidade se não houvessem estas. E há ainda os registradores de uso geral, que são usados ao gosto do programador. Dados são movidos da memória para os registradores auxiliares antes de se fazer qualquer operação, porque dentre outras coisas, a memória é bem mais lenta do que os registradores. Não se faz operações diretamente na memória. A figura abaixo ilustra um processador com as estruturas de registradores de uso geral, e uma memória com seus endereços, e um respectivo programa que calcula o fatorial de 5. Ao final, esse resultado estará armazenado no registrador A.

Só faltou falar que por "mova" deve-se entender "copiar dados daqui palí". No primeiro uso dele, coloca-se valores 5 no registrador A e 0 no B. Decrementar C quer dizer "diminuir C em 1". Usamos uma instrução de salto na 7ª e 8ª instruções. Elas fazem o fluxo do programa saltar para o endereço de memória o qual indicam.

Enfim, isto é um pouco de
programação de baixo nível para computadores. Espera-se que tenha dado pra se entender. Se uma hora eu estiver com mais disposição, pego essa figura daí de cima e faço um gif animado pra mostrar o funcionamento passo a passo do negócio.
A propósito, à essa linguagem de programação de baixo nível, chama-se assembly. Existem também as linguagens de programação de alto nível, que servem pra fazer coisas com menor trabalho. Outra hora explicaremos isso.

segunda-feira, 21 de abril de 2008

Guia Rápido - Pepinos da hora da impressão

Todos nós, alguma hora já passamos por situações onde queremos a todo custo cancelar uma impressão que está acontecendo, e por nada nesse mundo a impressão pára. E vai gastanto seu papel (naquela hora que você está com as folhas contadas) e sua tinta e seu tempo e sua paciência.
Fiz um guia em formato de tirinha pra ajudar esse pessoal. Taqui. Clique na imagem pra vê-la em tamanho grande.


Free Image Hosting at www.ImageShack.us

QuickPost

O citado acima reinicia o sistema de impressão do windows sem precisar reiniciar a máquina. No mundo unix, se acaso isso fosse necessário:

#> /etc/rc.d/init.d/cupsd restart

E morreu muderno!

ps.: Como bem lembrado por Dalton

Devo lembrar apenas que o exato comando mostrado no artigo tem variações de acordo com a distribuição. No Debian e derivados, como o Ubuntu, seria:

sudo /etc/init.d/cupsys restart

Na distribuição Foresight, por exemplo, já seria sudo service cups restart

domingo, 20 de abril de 2008

Codecs e Formatos de Video


Aprenda a escolher os tipos de vídeo

Aí pela net afora temos vários vídeos (gratuitos, pagos e pirateados) que estão nos mais diversos formatos: .avi, .ogm, .mkv, .rmvb... E ainda, quando se baixa um deles, de repente não conseguimos rodar porque falta um determinado codec.

"Peraê! Que diabos são codecs? Qual a diferença entre codecs e formatos? Não são a mesma coisa?"
Não senhor! Um codec é uma ténica utilizada pra comprimir um arquivo de audio ou de vídeo. Um formato, é algo chamado também de container. É um envelope onde se coloca aqueles arquivos de audio e vídeo que você compactou usando um codec qualquer que você tenha escolhido.

Codecs são utilizados porque arquivos de vídeo ou de audio puro, sem qualquer compactação, são bastante grandes pra ser armazenados ou transmitidos. Se por acaso já tiveste a oportunidade de comparar um tamanho de um arquivo .bmp com o mesmo arquivo em .jpg, deves ter notado uma diferença bastante grande de tamanho entre um e outro, mais ou menos da ordem de 20:1 ou maior. Se você ainda não teve a oportunidade de reparar isso, crie um desenho tosco no paint do windows e depois peça pra salvar nos dos formatos e compare. Pois é, um arquivo de bitmap, é um arquivo sem compactação. Num .bmp, cada pixel, é representado por um número de 3 bytes (um byte pra cada cor primária). Numa imagem de 640x480 pixels por exemplo, temos 307200 pixels total, multiplicados por 3 bytes, dá 900 e poucos kbytes. Se for salva em .jpg, dá pra cair pra algo proximo de 40kbytes. Impressionante, não? Quem sabe numa próxima, possamos explicar por alto como se consegue compactar desta maneira. Mas enfim, não é que se use a força pra expremer um arquivo até ele ficar pequeno. Procura-se representar a mesma coisa com menos bytes, só isso. Nem que pra isso, seja necessário diminuir a qualidade da fotografia.
Para se conseguir fazer um vídeo, coloca-se várias imagens estáticas em sequência, numa velocidade de mais ou menos 25 a 30 imagens por segundo (os famosos frames por segundo, ou fps). Isso é o suficiente para a visão do homem pensar que está vendo algo em movimento contínuo. Isso acontece porque uma imagem demora alguns milisegundos antes de vir outra. Graças a deus, porque se seu olho fosse mais esperto, os requerimentos tecnológicos pra assistir televisão seriam muito maiores =). Agora imagine que fôssemos assistir pela net um vídeo de 30 quadros por segundo e cada quadro fosse de 900Kbytes, como no exemplo acima? Precisaríamos de uma conexão de 27 megabytes , ou 27*8 = 216 megabits por segundo pra conseguir assistir isso .Do mesmo modo, não seria legal um filme em seu pc desta maneira consumiria 1,6 gigabytes para cada minuto de vídeo. Ah sim! E isto é so para o vídeo!
Voltando aos codecs e formatos...
Deve-se entender que um filme é formado por uma trilha de vídeo, uma trilha de audio, ou, várias trilhas de vídeo e várias trilhas de audio e de legendas e o que mais o formato permitir. Estas trilhas dentro do formato, é que podem ser comprimidas por um determinado codec. Por exemplo, pode-se ter um filme com uma trilha de vídeo compactada com o codec xvid e a trilha de som em mp3 dentro de um container avi. Assim como, este mesmo avi poderia ter a trilha sonora em codec ogg vorbis o vídeo em codec dvix.

"Não to entendendo nada!".
Olhe a figura:


Um container faz o que se chama de mux , ou seja, ele junta as várias trilhas em um só arquivo (ou fluxo para transmissão). Geralmente isso é feito intercalando-se quadros de video e quadros de audio no referido arquivo. Existe uma diversidade imensa de codecs. Dê uma olhada em www.free-codecs.net que você acha um monte. Em geral, eles vem em pacotes. Recomendo o ffdshow se você for usar somente com o intuito de assitir filmes, e o Ace Mega Codecs Pack pra quem vai converter e editar. Os codecs ficam guardados nas pastas de sistema do windows e podem ser usados por uma série de programas compatíveis, como o virtualdub ou o Nero vision.
No entanto, existem programas que usam codecs "embutidos" neles mesmos, como o vlc (que não só toca tudo como serve pra converter também), e para pessoas corajosas que gostam de usar a linha de comando (exemplo: eu) tem o ffmpeg. Ainda sim, fizeram frontends para o ffmpeg como o ffmpegGUI para facilitar a vida das pessoas.
Como deu pra perceber, o codec é algo separado do formato. No entanto, alguns formatos são amarrados a determinados codecs. É o caso do wmv da microsoft. Aliás, wmv é tanto o nome de um codec de vídeo como de um formato. Usa-se alguma versão do codec windows media video com algum do windows media audio. O mesmo serve para o .mpg, no qual se usa mp2v (mpeg 2 video) para o video e mpga (mpeg audio) para o som. Devo lembrar que volta e meia um arquivo tem um formato e somente uma trilha dentro. O mp4 por exemplo foi feito pra carregar som e vídeo (nos celulares, por exemplo), mas frquentemente é usado só com musicas. O mp4 está atrelado ao aac e a uns 3 ou 4 codecs diferentes de vídeo. Também se encontra avi's que só tenham vídeo, assim como se encontra trilhas solitárias .m2v, .mp3, .aac, .m4a , sem necessariamente estarem dentro de um container.

"Sim, mas qual codec/formato eu escolho?"
Se a preocupação for compatibilidade, use o avi com divx e mp3. Tem até dvdplayers domesticos que rodam isso aí. O avi não está amarrado a codecs, e portanto você pode escolher entre uma gama enorme deles. O divx codifica rapido, o sigma rmp4 vai no mesmo nível de velocidade do divx porém um pouco melhor em qualidade. O rmvb não é aceito por todos os players, muito menos por todos os programas codificadores. Tem alguns poucos que fazem isso, como o Easy RMP. Para linux, não há nenhum programa, e até pra assistir é chatinho.Também, nos programas que o fazem, demora-se o dobro de tempo para codificar do que se fosse avi+divx. No entanto, o rmvb é adorado pelo pessoal que baixa seriados e animes em geral porque consegue o mesmo que o aví+divx só que com a metade do tamanho dele.

Mas o filé mesmo é usar o formato matroska (.mkv) com codec x264 no vídeo e aac para o som. O mkv é o melhor container (na minha opnião, e na de muita gente) pois não se amarra a codecs, tem mais recursos, e gera menos overhead de processamento do que o avi. Ah sim! E é livre de patentes! O mkv aceita legendas por exemplo! Coisa que no avi tu tem que fazer colocando um .txt, .sub ou .srt junto ao arquivo. Também aceita divisão do filme em capítulos. Existe uma série de programas nesta página para se trabalhar com arquivos .mkv. Alguns deles, permitem se trabalhar com .mkv e .avi como o avimux-gui. Inclusive neste, pode-se inserir uma série de tipos de legendas diferentes (.sub, .ssa, .srt), colocar várias triilhas diferntes de som/video/audio , colocar/retirar atraso entre elas e etc. Pena que o pessoal da insudtria dos eletrônicos ainda não fez player domestico que rode .mkv. O aac é um codec de audio que consegue superioridade em relação ao mp3, quando usado o mesmo bitrate. Ele pode ser usado também em .avi's. O x264 (ou h264) é um codec de vídeo que consegue superioridade em qualidade, em relação ao rmvb e com o mesmo tamanho que ele. Pode ser usado em avi ou mkv, ou ainda, em mp4. A codificação de um video com x264 é demorada como a do rmvb. Transmissões digitais de tv tem sido feitas usando x264+aac no brasil. Tem sido usado também em ripagem de blu-rays. O x264 também é livre de patentes.
Um ultimo detalhe, é que na hora da codificação pode-se definir o bitrate tanto pra video quanto pra audio, e que o tamanho do arquivo final depende desta relação. Obviamente, quanto menor o bitrate, menor o arquivo de saida. Pode-se escolher um bitrate menor quando a resolução do vídeo for baixa. Por hoje é só! Sugiro a quem queira brincar com isso, que baixe o virtualdub-mpeg2 e/ou o avimux-gui. Links aí em cima.


sexta-feira, 18 de abril de 2008

Porque os computadores funcionam ??

A mágica que faz os computadores funcionarem

Como raios um compuador funciona? Como pode um equipamento eletrônico "ser inteligente", a ponto de fazer contas, dentre otras coisas? Se alguma vez perguntate es
sas coisas a si próprio e não achaste resposta, aqui vai a explicação, para vossa felicidade.
Resposta curta: computadores funcionam porque inventaram transistores.

"Certo. Mas o que raios são transistores?"
É esse carinha da foto aqui embaixo














Se fostes um bom estudante de física, saberás que alí em cima tem um resistor, e que antes dele tem um Vcc+ que representa um polo positivo e cá embaixo tem três tracinhos que represen
tam um polo negativo.

"Sim, e daí?"
E daí que os transistores funcionam de certa forma como chaves. Como um interruptor de luz. Basta que tu olhes na figura acima onde tem um Vin e saber que quando se aplica uma tensão nele, o circuito passa a conduzir energia entre os outros dois terminais que existem ali, o coletor e o emissor. No caso dessa figura por exemplo, se aplicada uma tensão em Vin o circuito ia passar a conduzir entre o Vout e o terra. Aí alguém resolveu pegar isso aí e começar a fazer portas lógicas. Antes de aprender portas lógicas, aprenda um tiquin de binária.
Em eletrônica digital, lida-se com valores 0 e 1. Por isso, chamado de binária - tem dois valores. Um '1' representa uma tensão alta, e o '0' uma tensão baixa. Em geral, uma tensão alta quer dizer 5 volts, e uma tensão baixa quer dizer zero volts. Por sinal, é justamente isto que é um bit: um valor de tensão 0 ou 1. É a menor unidade de informação que temos. Não confundir com byte. Um byte é um conjunto de oito bits. A figura abaixo tentar ilustrar que num sistema digital, os pulsos de onda são (mais ou menos) quadrados. Ao lado esquerdo dos pulsos quadrados, há um pulso de onda senoidal, só pra efeito de comparação.



Uma série de bits um atrás do outro
, como por exemplo uma sequência 1001 pode representar alguma coisa útil. Representa-se por exeplo, números. Esse daí por exemplo representa um cinco.
"Como assim?"

Assim ó! Usando a matematica cuja base é dois. Geralmente as pessoas entendem melhor olhando uma figura como esta do que lendo qualquer tamanho de texto. Aqui está representado o número 45 em base decimal e base binária.

Entendeu? Agora, suponha apenas números de 1 bit apenas, e finalmente, vamos às portas lógicas. Elas são construídas a partir de transistores.Uma porta lógica ordinária tem duas entradas, onde se coloca cada uma um bit, e uma saída, que dá como resultado a operação da porta lógica. Existe uma meia dúzia ou pouco mais que isso de portas lógicas diferentes. Todas elas derivam de tipos mais básicos acrescentados de mais alguma coisinha. Finalmente estamos chegando na parte interessante. Vou explicar só as portas AND, NOT , OR e XOR. Traduzindo, porta e, não, ou, e ou exclusivo. "que é que elas fazem?". Fazem a operação indicada por seus nomes. Se tiveres por exemplo uma porta AND, a saída dela vai dar 1 se uma entrada tiver em 1 E a outra também estiver. Se uma das duas ou as duas estiverem em 0, a saída é 0. Uma porta OR vai dar 1 em sua saida se uma entrada OU a outra estiverem em 1. É zero na saída somente se as duas estiverem em 0. Ja a XOR, só da 1 na saída quando somente uma das duas estiver em 1. Ou seja, ou uma ou outra, não as duas. Para as duas em 0 ou as duas em 1, a saida da porta XOR é 0. A porta NOT, ao contrário das outras, recebe só uma entrada, e dá o seu valor inverso em sua saída. Se entra um 0, ela dá um 1 e vice-versa. Abaixo, esta um exemplo de como se fazer portas AND (à esquerda) e OR (à direita). Todas as outras, são feitas de forma parecida com essas duas. Entenda que V1 e V2 são as entradas, e Vout é a saída, e que as tensões fluem do terra ao vcc.












Pra efeitos de simplificar nossa vida, representa-se as portas lógicas através de símbolos nos quais se omite os transistores, o Vcc e o terra. Só são mostradas as entradas e saídas das portas. Aqui a representação das mais famosas:






A propósito, um N na frente do nome das portas representa um NOT concatenado com essa porta. Uma bolinha branca em qualquer entrada ou saída dessas portas representa que alí tem um inversor nela. Bem, a partir daí, pode-se começar a construir circuitos concatenando umas e outras portas dessas. Quer um exemplo? Uma porta XOR funciona perfeitamente como uma somadora pra dois bits. Aliás, em binária:
0 + 0 =0 0 + 1 = 1 1 + 1 = 0 e vai um (
assim como na base decimal você pode pegar o 45 e somar com 5. 5 + 5 = 10 e vai 1 pro quatro). Pra finalizar, abaixo um exemplo de um meio somador e de um somador completo. Um meio somador soma dois bits e tem uma saída de 'vai 1' que é comumente chamada de carry out. O somador completo não só soma dois bits e gera o "vai um" como também tem uma entrada pra somar com um vai um que veio de outro somador ou meio somador. Assim, através do uso de somadores completos, pode-se somar numeros de mais de um bit (um somador pra cada).

















São só dois circuitos simples pra servir de exemplo (os quais eu imagino, sejam fáceis de entender). Juntando uma porção de coisas como multiplicadores, subtratores, tudo isso feito com portas lógicas, consegue-se fazer um computador direitinho. Ou ao menos uma calculadora. Mas enfim, nosso intuito não é dar uma aula completa de como isso tudo funciona. Era só pra dar uma noção por alto de como funciona a eletrônica que faz um computador funcionar. Aceito comentários!