domingo, 13 de setembro de 2009

Internet 3G Vivo com modem MF100 no Opensuse Linux

Depois de Meses sem colocar nada nesse blog, aproveito pra escrever algo que é de extrema utilidade, que com certeza ajuda bastante gente, e que é algo que faz muito perderem algumas horas de labuta até que se consiga fazer funcionar. Eu mesmo perdí bastante tempo, consultei vários posts de vários forums, consultei o guiadohardware e, enfim, eles foram úteis, mas a maioria deles so falava de alguns modems específicos em algumas distribuições específicas. Ou melhor, quase que na totalidade, falavam sobre ubuntu 9.x.x e modem MF626, que é do mesmo fabricante do aqui tratado MF100, mas que não é exatamente o mesmo. O MF100 é este exibido na foto que se segue
E que os leitores, é claro, me perdoarão pela edição medíocre.
Devo dizer que este tutorial foi feito baseado em meus procedimentos numa distro opensuse 11.1 de 64 bits, o que no entanto não quer dizer que não funcione em outras variantes mais antigas desta distro, ou em sistemas de 32 bits, já que não se necessita de drivers - ou melhor, o único necessário já está embutido no sistema - e o esqueleto geral dos arquivos e dispositivos do opensuse mudou muito pouco (se mudou) desde que se começou a usar o udev lá pela versão 10.

A princípio, quando meteres o dito modem na usb, ele o reconhecerá como um cdrom usb, igualzinho como ocorre no windows. Daí ele monta e lá tem um softwarezinho que é pra ser igualzinho a aquele que tem pro windows mesmo, de conexão, que cria um ícone na sua área de trabalho e talz.. Meu conselho é que se ignore este, por que eu mesmo não o ví em sequer um instante funcionar. Primeiro tens que instalar uma biblioteca do qt3 pra ele mostrar a cara e depois ele não vai funcionar mesmo! Fica lá a vida toda tentando conectar e nunca conecta.

Então, o que primeiro vais precisar, é, lógico, daqueles pacotes básicos de conexão, tais quais o pppd e wvdial. Eles já vem como default na maioria das instalações, e se não vieram, não se preocupe, pois eles estão disponíveis nos repositórios padrões. Precisarás também de um pequeno software chamado usb_modeswitch que foi feito independentemente por um cara aí, e que serve pra fazer teu sistema parar de enxergar o modem como um cd, e passar a enxergar como um modem mesmo. Como indica o nome. Ele está disponível nos repositórios padrões do opensuse, bastando, como root, executar num terminal qualquer:
#>zypper in usb_modeswitch

E obviamente, confirmar a instalação. Ou se preferires, vai pelo Yast mesmo e instala isso aí.
O usb_modeswitch tem um arquivo de configuração, a saber /etc/usb_modeswitch.conf
Neste, haverá linhas comentadas (com '#' ou ';') e linhas descomentadas. Isto é, este arquivo deve estar coerente com o tipo de modem que tu tens, já que esse usb_modeswitch serve pra vários e vários modems. Minha experiência mostra que o MF100 é similar a um outro modelo, o MF628+, que por sua vez é similar ao MF628 e portanto, comentando tudo neste arquivo e deixando a sessão do MF628+ descomentada, teu modem irá funcionar. O arquivo ficaria assim:
Depois, tens que instalar uma regra para o udev rodar o usb_modeswitch automaticamente a cada vez que tu plugares o modem. Lí em muitos lugares, configurações milaborantes, mas pra mim bastou (e funfou) criar o arquivo /etc/udev/rules.d/95-ZTE-MF100.rules com o seguinte conteúdo:

SUBSYSTEM=="usb", SYSFS{idProduct}=="2000", SYSFS{idVendor}=="19d2", RUN+="/usr/sbin/usb_modeswitch"



Rodas um /etc/init.d/haldaemon restart para que ele carregue essas configurações. Ou reinicia mesmo (to na duvida se isso é realmente necessário).
Daí agora, o sistema deve entener que se plugou um modem usb no sistema, e deverá carregar seu driver(usbserial) automaticamente. Se isto não ocorrer, poderá usar ao invés da linha citada acima, esta:

SUBSYSTEM=="usb", SYSFS{idProduct}=="2000", SYSFS{idVendor}=="19d2", RUN+="/usr/sbin/usb_modeswitch", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x2000"

Só a título de curiosidade, esses parâmetros '2000' e '19d2' são conseguidos através do comando lsusb. Se teu modem for diferente, quem sabe analisando a identificação no lsusb e modificando o arquivo citado de acordo, funcione...
Serão criados os devices /dev/ttyUSB0, /dev/ttyUSB1 e /dev/ttyUSB0. Se deres um ls em /dev e aparecer esses três aí, tá tudo Ok e agora podes finalmente configurar seu discador predileto para acessar a internet. Aqueles mesmo que você usava nos tempos de internet discada. Os discadores devem ser configurados para usar o modem em /dev/ttyUSB2. Abaixo, uma configuração para o wvdial,(/etc/wvdial.conf) funcionou assim:

[Dialer Defaults]
Modem = /dev/ttyUSB2

Baud = 921600

DialCommand = ATDT
Check Def Route = on

FlowControl = Hardware(CRTSCTS)
Username = vivo

Password = vivo

Phone = *99#

Stupid mode = 1

Auto Reconnect = on
Auto DNS = on

Init1 = ATZ

Init2 = ATQ0 V1 E1 S0=0 &C1 &D2

Init3 = AT+CGDCONT=1,"IP","zap.vivo.com.br"

ISDN = 0
Modem Type = Analog Modem


A terceira linha do init (Init3) não me foi estritamente necessária, mas há quem diga que é. Eu particularmente não gosto muito do wvdial porque tem que ser rodado num terminal e como root (posso estar enganado novamente). Usei o kppp, mas antes de poder usá-lo, o sistema diz que o executável /usr/sbin/pppd deve ter o bit setuid setado, o que pode ser feito com:

>#chmod u+s /usr/sbin/pppd

Daí agora, jaz! Toda a configuração que eu fiz para o kppp foi baseada neste arquivo do wvdial e pode ser resumida pelos dois screenshots que se seguem.




Se depois disso,quiseres ainda experimentar usar o discador da vivo (que tem a vantagem de permitir o envio de sms), faz antes um backup do wvdial.conf, porque o programinha da vivo sobrescreve ele.

sexta-feira, 16 de janeiro de 2009

Como escrever em japonês no linux

Assim como muitos, (na verdade, acho que são poucos) eu ando aprendendo japonês devagarinho através da Internet, catando um material aqui, outro acolá e tal. Conseguir digital japonês no computador é uma coisa que ajuda bastante. No Windows Xp, acho que boa parte do pessoal consegue. Mas eu sempre tive uma dorzinha de cabeça em fazer isso funcionar no Linux, porque, como sabemos, no linux as coisas são um pouco mais complicadas por conta de que não temos um sistema com tudo unificado como é no Windows. Cada coisa no sistema é um programa e não ta tudo exatamente interligado. Daí tem que se caçar direitinho como se funcionam as coisas, mas com um pouco de fé tudo se resolve.
Pra se digitar japonês em linux, precisa-se de:

  • Um X Input Method, ou xim para os íntimos. Como sabemos, o X é o servidor gráfico dos unixes, ou seja, o programa responsável por fazer com que o ambiente gráfico exista. O input method, é um programa responsável por fazer a "injeção" de caracteres dentro do servidor X, assim como temos o IME pra Windows.
  • Uma engine (um backend) de conversão para o xim. Pode-se instalar alguns ao invés de um, e trocar entre um e outro durante a digitação.
  • Tabelas de conversão de caracteres para o(s) backends de conversão.
  • Um "switch engine" pra trocar entre os backends.
Em geral, usando-se os gerenciadores de pacotes de sua distro preferida, isto implica em escolher uns três ou quatro pacotes e o resto vem sozinho como dependencias. Existem uma meia dúzia de xim's disponíveis por aí, tais quais: Nicolatter, kinput2, xcin, scim. Utilizarei aqui o Scim. Ele tem a vantagem de suportar vários backends e/ou vários idiomas de entrada. O kinput2 por exemplo só serve pra japonês. Com o Scim, pode-se escrever em japones, coreano, chines e mais outros tantos idiomas. O melhor backend de conversão pra japonês que eu achei foi o Anthy. Muito embora eu tenha instalado aqui o Anthy e mais o Canna e SKK e você pode conviver harmoniosamente com todos eles. Instalei ainda as tabelas que tem o nome de scim-tables-ja. Existem ainda outras tabelas pra outros idiomas. Em resumo, pra conseguir uma instalação funcional pra Kde e Gnome, é suficiente instalar:

  • scim
  • scim-anthy
  • anthy
  • scim-tables-ja
  • im-switch
  • skim
O scim instala por padrão um frontend para gnome afim de realizar suas configurações. Ele fica como um icone no tray do sistema.O skim, é o frontend para Kde equivalente. Taí o iconezinho do gnome

Ele muda para o icone do backend asssim que vc ativar a escrita pelo scim, coisa que normalmente é feita pelo atalho ctrl+space. Mas isso será exposto depois, porque agora vem a parte chata.


Para que funcione a contento, é necessário dizer ao X que ele deve usar um xim. Isto é feito normalmente adicionando-se algumas linhas a algum arquivo de configuração de inicialização do X. Eu tive a oportunidade de fazê-lo em duas distribuições. Usando opensuse 11.1 (acho que a partir da versão 9 em diante já é assim) bastou-me editar o arquivo ~/.profile e adicionar a seguinte linha

export INPUT_METHOD=scim

já no debian e outros, esse arquivo de configuração muda e em geral devem ser adicionadas mais linhas. Aqui por exemplo diz como se faz a configuração no ubuntu. Este outro link dá instruções para o mandriva. Mas a página em si é bastante interessante pra qualquer um por indicar o processo de forma meio genérica, em especial nesta parte de "environmental variables" que tem as variáveis de ambiente que a maioria das distros usa. Pra fazer o sistema funcionar no debian, devo dizer que não pude muito me c
onfiar no google. Foi difícil saber como é que era e foi mais por fuçação e experimentação. Mas descobri que no debian existia já as linhas que eu queria em determinado arquivo que fica em /etc/X11/xinit/xinput.d/ja_JP. O problema é que o debian não lia isso porque ele sempre lê um arquivo deste mesmo diretório, só que chamado "default". Então, o mais prático neste caso é renomear o arquivo default pra um outro nome qualquer, e depois copiar o arquivo ja_JP pra default. Isso se resume a essas poucas linhas no terminal

># cd /etc/X11/xinit/xinput.d/
>#mv default default.bak

>#cp ja_JP default

Obviamente, deves estar como root pra fazer isso. Depois disso, basta reiniciar o X e se tudo deu certo, o incone que postei ai em cima deve aparecer em seu icon tray. Daí agora, podes experimentar abrir um gedit ou kwrite e pressionar ctrl+espaço e digitar seus primeiros hiraganas. Clicando com o botao esquerdo do mouse sobre o ícone do scim, pode-se escolher entre os vários idiomas de entrada ou backends de conversão. Clicando-se com o botão direito, pode-se configurar dentre outras coisas, os atalhos de teclado
para as funções do scim. Pode-se por exemplo mudar as teclas de ativação (em trigger) e o que faz mudar de engine (Next input Method).
Usando-se o anthy, pode-se ainda criar atalhos para trocar de katakana pra hiragana e vice-versa (indo naquela aba alí do anthy). E como no windows, digitando qualquer coisa e pressionando a barra de espaço, ele faz a conversão dos caracteres em kanjis, com direito a escolha de candidatos. A entrada default e em hiragana, mas pressionando-se F7 muda-se o que ta escrito pra katakana.
Bem, é isso aí! Espero que tenha sido de alguma valia. Para maiores detalhes:
  • http://www.h4.dion.ne.jp/~apricots/scim-anthy/howto.html
  • http://www.scim-im.org/
  • www.google.com.br

sábado, 11 de outubro de 2008

Redes de comunicação mundiais

Pouca gente sabe, mas existem fibras opticas submarinas (isso mesmo, embaixo dos oceanos). A maioria pensa que as comunicações entre países e continentes são feitos somente por satélite. Mas se isso fosse verdade, hoje teríamos uma precariedade muito grande nas comunicações, por que os satelites introduzem uma latencia relativamente grande, e relativa pouca largura de banda, se comparada com outros meios. Uma única fibra optica, na tecnologia atual permite o tráfego de terabits/s, sem qualquer latência (já que o tráfego é na velocidade da luz) e sem interferencias (já que se usa luz ao invés de pulsos elétricos). No vídeo que se segue, é explicado como são colocadas as fibras opticas submarinas. O vídeo está em ingles. Eu entendo pouco de ingles, mas deu pra escutar algumas coisas, por exemplo:

  • São cerca de 4.000 km de fibra ligando a França aos EUA
  • As fibras, são da espessura de um fio de cabelo. Várias delas (centenas) são trançadas juntas naquele cabo branco, juntamente com aço e condutores
  • O navio anda a menos de 1km/h
  • 8% das comunicações do mundo, trafegam nessas fibras
  • Demora-se 3 semanas para encher o navio com aquele cabo
  • A cada mais ou menos 50km, vai um troço branco daquele, que é um repetidor, porque o sinal se degrada com a distancia, e precisa de reforço pra continuar. Cada repetidor pesa meia tonelada
Esse ultimo ítem, me faz pensar que o sistema eletrico que alimenta esses cabos deve ser algo gigantesco, pois a potencia também vai se perdendo com a distancia.

domingo, 4 de maio de 2008

Taxa de Atualização do Monitor

Os monitores de computador, assim como as televisões, "piscam" determinada quantidade de vezes por segundo. Na verdade, eles mostram uma sequência de imagens estáticas a uma determinada quantidade de vezes por segundo. Na televisão convencional, essa taxa é de 60 quadros por segundo (por quadro, entenda-se, uma imagem estática). Já nos monitores de computador, essa taxa é configirável.
"Porque Alterar a quantidade de quadros por segundo?"
Porque seus olhos podem agradecer. A cintilância (o efeito das sucessivas piscadas da tela) causa incômodo e cansaço visual. Então, aumentando a taxa de quadros por segundo de sua tela, seus olhos percebem menos a troca de imagens, e por consequência, o incômodo visual é menor. O único problema é que os monitores tem limites, ou seja, cada monitor suporta até tantos quadros por segundo. E ainda, esse tanto de quadros por segundo depende da resolução que se está usando. Para resoluções menores, pode-se configurar uma taxa de quadros maior. Para monitores de 15 polegadas por exemplo, em 800x600 consegue-se até 80 a 85 quadros por segundo, e para 1024x768 consegue-se tipicamente 60 a 72 quadros por segundo.
Para monitores de 17 polegadas, tipicamente os monitores suportam até 85 quadros por segundo para uma resolução de 1024x768. Seja lá qual for seu caso, configure para o maior número possível. Segue o processo para configurá-lo no windows xp:
Free Image Hosting at www.ImageShack.us

QuickPost

Lembrando que hertz, é justamente a quantidade de quadros por segundo. Os bits de cor representam a quantidade de cores diferentes que serão exibidos. Quanto mais bitz, melhor a qualidade.
Muitas vezes, especialmente quando se troca de monitor, após a inicialização, a tela fica preta. Muitos imaginam ser defeito da placa de vídeo e coisa e tal, mas pode ser simplemente a taxa de atualização que está alta demais para aquele monitor. Para resolver este problema, basta ir pressionando F8 na inicialização do windows (nas barrinhas brancas) e escolher "modo vga". Depois, seguir os passos indicados acima para acertar a taxa de quadros por segundo e reinciar o windows normalmente.

Para linux, também pode-se ajustar a taxa de quadros por segundo. A maneira mais fácil de se fazer isso é através de um apliativo gráfico chamado Xrandr

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.