sábado, 31 de julho de 2010

Várias Maneiras de Matar uma Aplicação

A verdade é a seguinte: embora o Kernel do Linux seja a coisa mais estável do mundo (impressionantemente estável como poucas coisas na vida!!), as aplicações que nós rodamos muitas vezes não têm esta mesma propriedade (nem tempo de desenvolvimento, já que o Kernel é de fato bem velhinho...). Assim, acontece o inesperado: as aplicações travam!! E a gente tem que pedir ao Kernel que as "mate", ou seja, interrompa os seus processos, nem que seja bruscamente, e recupere (às vezes chamado "reivindique") a memória usada por elas. Não preciso nem dizer que, o que quer que estes programas estejam fazendo, vai para o espaço, e, uma vez tendo a memória que ocupam ao rodarem reivindicada, eles viram meras vagas lembranças...
Bom, este é o cenário deste artigo: como matar um programa no Linux?? As instruções servem tanto para programas rodando normalmente quanto para aqueles que travaram e não respondem. Qualquer programa pode ser matado porque quem mata é o Kernel, e com o Kernel ninguém pode (lembrem-se de que estamos falando de sistemas de verdade, e não de sistemas com falhas de proteção entre as camadas básicas, como o Windows e alguns sistemas embarcados muito simples...)


  • Matando Bruscamente

Matar bruscamente um programa é a última coisa que fazemos, recurso somente utilizado quando nada mais é possível e o programa não responde mais. A maneira mais simples é digitar o comando kill. Este comando precisa do argumento referente ao PID (identificador do processo) do programa e do tipo de sinal a ser enviado. Para achar o PID de seu programa, veja o número da primeira coluna deste comando:

ps -e

(a opção "-e" exige que se mostrem todos os processos).
Em geral isto exibe uma lista enorme. Então, se você sabe qual programa matar, resuma a saída com o comando grep (exemplo, vamos matar o kedit):

ps -e | grep kedit
20128 pts/0 00:00:00 kedit

Viu?? Apenas uma linha, que informa que o PID do kedit é 20128. Felizmente, só temos uma instância do kedit rodando. Agora vamos matar esse camarada (coitado, aqui ele tava rodando direitinho, mas foi eleito como bode expiatório deste tutorial... a vida nem sempre é justa...):

kill -9 20128

Isto mata exatamente aquela instância. Se houver mais de uma instância do kedit, elas terão identificadores diferentes (PIDs diferentes) e você conseguirá matar apenas a instância que você quer. Não se esqueça de usar o "-9", pois esta opção indica ao Kernel que realmente mate o programa, ou seja, que envie o sinal denominado "SIGKILL" para o processo.
Peraí!! O que é esse negócio de sinal?? É a maneira como o Kernel elenca os estados dos processos, e sabe o que fazer com cada um. Existem diversos estados, apesar de quase nunca precisarmos pensar nisso... mas o Kernel precisa controlar os sinais para que seus componentes saibam como tratar o processo. Por isso, o comando kill, apesar do nome, nunca mata realmente o processo, mas apenas solicita ao Kernel que troque o estado daquele programa, ou seja, que envie um determinado sinal para ele, o referente à sua morte, seu letal fim...
Quer saber quantos sinais existem?? Digite:

kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Sua lista de sinais vai ser parecida com esta acima... Ainda bem que o Kernel gerencia isto tudo sozinho...


  • Matando Graficamente



ProcessTable: o gerenciador de processos do KDE.

Se você usa o KDE, então existe uma maneira de matar graficamente um aplicativo!! Aperte CTRL + ESC. Isto abrirá o ProcessTable, o gerenciador de processos gráfico do KDE. Identifique o nosso bode expiatório (kedit) na tabela, clique nele e aperte o botão "matar".
O ProcessTable faz o mesmo que o comando kill, porém de forma gráfica. Se essa for a sua preferência e se houver interface gráfica rodando, o procedimento pode ser feito tranqüilamente desta maneira sem nenhuma perda de eficiência.


  • Quem Pode Matar??

Todos os usuário podem matar seus processos, ou seja, não precisa ser root para matar um processo. No entanto, um usuário sem preferências de administrador não pode matar o processo do outro. Apenas o root (ou alguém com privilégios como tal) pode matar qualquer processo da máquina, porque, afinal de contas, o root é o root...


  • Matando Suavemente Um Serviço

Muitos programas, como deamons e serviços, têm toda uma rotina de clean-up (descarrego e limpeza) que é executada ao ser descarregado. Normalmente estas rotinas ficam em scripts e mesmo os scripts de shutdown do sistema (desligamento) estão encadeados em ordem, de forma que um só pode ser executado ao final da conclusão de outro. Para permitir uma morte mais limpa a estes programas especiais e evitar que, por algum motivo (e isto já vi várias vezes!!), o desligamento da máquina páre bruscamente no meio do procedimento, caindo num terminal em modo texto, esperando a conclusão de um processo que pendurou e nunca vai terminar, é possível fazer uma morte suave, mais tranqüila, que não interrompe o descarrego do serviço (e do sistema, conseqüentemente).
Vamos supor que o KDM tenha travado durante o desligamento do sistema. Assim, precisamos matá-lo. Porém, o seu processo implica em scripts que, se forem interrompidos bruscamente, como o foram, paralizam o desligamento, caindo num terminal em modo texto. Então, matamos o KDM desta maneira:

ps -e | grep kdm
2882 ? 00:00:00 kdm
kill -HUP 2882

A opção "-HUP" concede ao KDM uma morte suave, talvez até com opção de realizar o último desejo...


  • Matando de uma vez Todas as Instâncias de uma Aplicação

Se você tem várias instâncias de uma aplicação e quer matar todas elas, ou mesmo se só tem uma instância, mas não quer se preocupar em buscar o PID da mesma, basta usar o comando killall. Vamos ao exemplo, matando nosso pobre kedit:

killall kedit

Dessa, nenhum kedit que o referido usuário esteja rodando escapa...
CUIDADO: se você digitar um comando como este usando privilégios de root, você vai matar todas as instâncias de todos os usuários do referido programa, o que pode causar problemas sérios, especialmente se estiver no contexto de um servidor...


  • Resumindo...

Existem várias maneiras de se matar aplicativos no Linux. A notícia boa é que, por mais que as aplicações travem, o sistema é estável, permitindo-se recuperar o controle. Usar um método ou outro depende de sua situação: um usuário doméstico, rodando sobre interface gráfica, tenderá a considerar cômodo o ProcessTable. Um administrador de sistemas, logado remotamente e preocupado com os serviços que precisa manter no ar, vai mergulhar nas opções dos comandos kill e ps. Em suma: a gama de opções nos dá ferramentas para o uso mais apropriado em diversas situações.

Gostou deste tutorial?? Ajudou em alguma coisa?? Detestou completamente???? Então: COMENTE!!!!!!

segunda-feira, 26 de julho de 2010

Atualizando o Flash Player no Firefox

O Flash Player é um plugin para o Firefox. Ao atualizar o Firefox, muitas pessoas devem ter recebido a mensagem de que o plugin do Flash está desatualizado. De fato, existe uma versão mais nova (neste momento em que escrevo, a versão 10.1 substituiu a 10.0), que pode ser baixada do site oficial gratuitamente e instalada de diferentes maneiras, dependendo do formato do arquivo baixado (tar.gz, deb, etc.).


  • Instalando a Versão .deb

Esta é a mais fácil!! Basta baixar do site aí em cima o arquivo .deb e instalar com o comando (como root!!)

dpkg -i install_flash_player_10_linux.deb

Depois disso, reinicie o firefox.


  • Problemas e Observações Importantes:

1- Note que este procedimento acima instala sem o apt-get, aptitude ou qualquer outro gerenciador de pacotes moderno e sofisticado, logo, assume que você está baixando o arquivo correto para a sua distribuição. Se não for o arquivo correto, torna-se uma questão de sorte: o procedimento de instalação pode funcionar ou não, e, caso não funcione, você deve remover a instalação mal-sucedida deste pacote (que pode ser feita com o seu gerenciador de pacotes preferido, ou o apt-get).

2- Note que isto instala a biblioteca do Flash Player (que, na verdade, é apenas um arquivo, denominado "libflashplayer.so") no sistema, ou seja, na pasta "plugins" do local onde o seu Firefox ou Iceweasel está instalado. Isto pode não funcionar, porque o Firefox tem uma arquitetura que privilegia os arquivos encontrados na pasta pessoal do usuário em detrimento aos instalados no sistema.

O que isto quer dizer????
Bom, observe que você tem um diretório, em sua área pessoal (/home/usuario), denominado ".mozilla". Neste diretório são colocadas todas as preferências pessoais suas (temas, configurações, favoritos, etc.), que devem ser prioridades em relação aos padrões do sistema, ou seja, devem sobrescrever os padrões do sistema no momento em que o Firefox se carrega. Dentre estas opções, existe uma pasta denominada ".mozilla/plugins", onde os seus plugins pessoais podem ser carregados. Desta maneira, é possível instalar um plugin que tenha efeito apenas para um usuário (ou então, um usuário que não tem prioridade de administrador do sistema pode instalar seus plugins favoritos). O problema se inicia se você tem aí uma versão antiga do plugin do Flash. No momento em que o navegador se carrega na memória, ele vai dar preferência a esta versão antiga, deixando de lado a versão novinha instalada pelo root...

Como corrigir isto???
Há duas maneiras: a primeira, mais fácil, é remover o plugin antigo, deixando o Firefox carregar o plugin instalado no sistema. A segunda, é esta abaixo:


  • Instalando o Plugin na Pasta Pessoal do Usuário (versão .tar.gz)

Também é simples: basta baixar a versão do arquivo no formato .tar.gz e descomprimi-la:

tar -zxvf install_flash_player_10_linux.tar.gz

Surgirá o arquivo "libflashplayer.so". Agora, basta copiá-lo para o diretório de plugins desejado, que pode ser inclusive o diretório pessoal do Firefox, na sua área de usuário:

cp libflashplayer.so /home/usuario/.mozilla/plugins

Reinicie o Firefox!!


Para verificar a versão dos plugins, vá em Ferramentas -> Complementos -> Plugins e veja, na lista que surge, qual a versão do plugin do Flash que foi carregada!! Outra opção é você utilizar as facilidades do Pajé Online e clicar no botão "Plugins" da seção "Navigator" aí do lado direito.
Claro, se tudo der certo, faça logo o backup da sua pasta .mozilla, de forma a não perder as suas configurações!!
Bom, espero ter ajudado!! Qualquer coisa, vocês já sabem qual é a dança do Pajé: COMENTEM!!!!!

quarta-feira, 21 de julho de 2010

Sincronizando Pen-Drive com o Comando diff

A invenção do pen-drive é fabulosa: portátil, fácil, leve! Porém, é também um perigo para quem pretende usá-lo como backup e não tem muita organização para manter seus dados sincronizados. Uma má sincronia entre os dados que você tem no pen-drive e os dados dos HDs das máquinas que você acessa pode facilmente te levar ao descuido de sobrescerver uma versão nova de um ou mais arquivos por uma versão antiga do mesmo.
Pensando neste problema, este artigo mostra como a sincronia pode ser facilmente verificada com um único comando: o comando diff.


  • Verificando a Sincronia dos Dados

Primeiramente, é preciso montar o pen-drive. Isto pode ser feito com o comando mount, embora, hoje em dia, qualquer um que use uma distro do Linux minimamente atualizada e com interface gráfica pode montar facilmente o pen-drive com poucos cliques.
Supondo que a pasta cuja sincronia deva ser verificada se chame "dados", basta digitar, no terminal:

diff -r /media/KINGSTON/dados /home/usuario/dados

Note que:
/media/KINGSTON - deve ser substituído pelo caminho que corresponde ao seu pen-drive montado.
/home/usuario - deve ser substituído pelo caminho onde se localiza a versão da pasta no HD (ou em outro local).
-r - instrui o comando diff a verificar recursivamente, ou seja, em todos os diretórios e subdiretórios que ele encontrar.


  • Trocando em Miúdos

O comando diff faz dois tipos de comparação: binária e textual. Quando arquivos em modo texto puro (ou no máximo Unicode) existem, ele compara todo o conteúdo reportando, na tela, todos os conflitos entre um e outro. Quando se trata de arquivos binários, o diff faz uma leitura binária de cada arquivo e, havendo um bit diferente, ele reporta (embora, neste caso, não possa indicar em que lugar do arquivo houve o conflito).
Somente são reportados problemas (conflitos) entre as pastas. Assim, tudo que é idêntico não será indicado (quer dizer que, se não há saída, é porque as pastas têm exatamente o mesmo conteúdo). Note que o comando diff também acusa se algum arquivo existir somente em uma das pastas.
Havendo colhido o relatório do comando diff, agora entre em seu gerenciador de arquivos favorito (Koqueror, etc...) e copie os arquivos conforme desejar, atentando apenas aos que foram reportados no relatório.

Bom, essa dica foi rápida... qualquer coisa: COMENTEM!!! E vamos parar de perder arquivos no pen-drive por descuido!!

sexta-feira, 16 de julho de 2010

Alterando o Volume e Ganho com JavaSound

Não foi incomum que algumas pessoas me perguntassem como alterar o volume de um Clip ou uma Stream de Áudio usando a API de som do Java, o JavaSound. Vamos à explicação rápida!!

  • Qual a Diferença Entre Volume e Ganho??

Muitas bibliotecas de execução e manipulação de som (especialmente as mais baixo nível) não têm controle de volume, mas sim de ganho. Ganho é a medida em deciBels (dB) que regula a intensidade do som (mais detalhes aqui). Volume é uma medida adimensional e escalar de intensidade de som.
Tudo estaria resolvido se o ganho variasse da mesma maneira que o volume, já que os dois medem, na prática, a mesma coisa. Porém, o ganho é uma medida logarítmica, ou seja, ela varia muito mais numa extremidade e muito menos na outra, dados os cálculos em exponensiais. O volume é uma interpretação desta variação, porém de maneira escalar, de forma que varie sempre da mesma forma.


  • Implementando Mudaças de Volume em JavaSound

Primeiramente, é preciso se obter o controle de ganho (MASTER_GAIN). Depois, é preciso que se transforme o valor do volume (uma simples percentagem, ou seja, um número entre 0 e 1) em deciBels, usando a fórmula logarítmica abaixo. Com este valor em deciBel, basta agora atribuí-lo ao controle de ganho.

public void setVolume(int percent) {
FloatControl gainControl =
(FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
double gain = percent/100; // deve ser entre 0 (mudo) e 1 (mais forte)
float dB = (float) (Math.log(gain) / Math.log(10.0)*20.0);
gainControl.setValue(dB);
}

Cuidado: não tente obter o controle VOLUME, a não ser que você saiba o que está fazendo, já que ele não costuma existir em muitos sistemas de som, vindo a retornar uma referência nula.


  • Trocando Entre Mudo e Não-Mudo

A rigor, definir o valor como mudo significa simplesmente atribuir valor zero para o ganho. Mas, existe uma maneira mais simples para se trocar entre mudo e audível, mantendo o ganho inicial:

BooleanControl muteControl =
(BooleanControl) clip.getControl(BooleanControl.Type.MUTE);
muteControl.setValue(true); // Define como mudo
muteControl.setValue(false); // Retorna para audível

É isso aí, gente!! Agora ficou fácil!! Claro, é bom lembrar: COMENTEM!!!

sábado, 10 de julho de 2010

Como Detectar Informações do Navegador via JavaScript

Olá Pessoal. Esta é a dica que cria o código daquele quadradinho ali, à direita, na parte de baixo da coluna. Note que ele informa um monte de coisas sobre seu sistema e seu navegador... isto não é invasão de privacidade, nem nenhum código malicioso, mas sim o acesso ao objeto navigator do JavaScript, que permite recuperar várias informações de seu navegador e de seu sistema. Basicamente, é através de acessos a objetos como este que as ferramentas de estatísticas dos portais que você acessa (como o Google Analytics, o Source Forge, etc.) fazem as estatísticas de seu acesso.
Vamos entender este código. Primeiramente, é preciso que se crie a estrutura em HTML onde as informações vão aparecer. Veja que somente criei campos vazios, identificados com IDs, para que possam ser populados dinamicamente, via JavaScript. (No exemplo, troquei as tags para que começassem e terminassem com colchetes, já que o blog não suporta impressão de sinais de maior e menor).

[div id="navegador"]
[p align="center"][b]Configuração do Seu Navegador:[/b][/p]
[p]
[b]Código do Navegador:[/b] [span id="appCode"][/span][br/]
[b]Nome do Navegador:[/b] [span id="appName"][/span][br/]
[b]Versão do Navegador:[/b] [span id="appVersion"][/span][br/]
[b]Cookies Habilitado?[/b] [span id="cookieEnabled"][/span][br/]
[b]Linguagem:[/b] [span id="language"][/span][br/]
[b]Linguagem do Sistema:[/b] [span id="systemLanguage"][/span][br/]
[b]Linguagem do Usuário:[/b] [span id="userLanguage"][/span][br/]
[b]User Agent:[/b] [span id="userAgent"][/span][br/]
[b]Plataforma:[/b] [span id="platform"][/span][br/]
[input type="button" value="Tipos MIME" onclick="getMime();"/]
[input type="button" value="Plugins" onclick="getPlugin();"/][br/]
[/p]
[/div]
[script type="text/javascript"]
populateBrownserInfo();
[/script]

Observe que neste mesmo código já coloquei as chamadas às funções que vão popular a tela. Apenas nos últimos campos (tipos MIME e Plugins) eu não deixei espaço, mas sim um botão. Fiz isso para não poluir a tela. Como estas opções costumam gerar grande quantidade de caracteres em suas saídas, eu as deleguei para uma janela POP-UP. Se seu navegador não bloquear POP-UPs, então elas vão aparecer preenchidas com as informações tão logo os respectivos botões sejam acionados.
Vamos às funções:

function populateBrownserInfo() {
var appCode = document.getElementById("appCode");
var appName = document.getElementById("appName");
var appVersion = document.getElementById("appVersion");
var cookieEnabled = document.getElementById("cookieEnabled");
var language = document.getElementById("language");
var systemLanguage = document.getElementById("systemLanguage");
var userAgent = document.getElementById("userAgent");
var userLanguage = document.getElementById("userLanguage");
var platform = document.getElementById("platform");

// Imprimindo os valores
if(appCode != null) {
appCode.innerHTML = navigator.appCodeName;
}
if(appName != null) {
appName.innerHTML = navigator.appName;
}
if(appVersion != null) {
appVersion.innerHTML = navigator.appVersion;
}
if(appVersion != null) {
if (navigator.cookieEnabled) {
cookieEnabled.innerHTML = "Claro, xará!!";
} else {
cookieEnabled.innerHTML = "Meu Deus, não!";
}
}
if(language != null) {
if (navigator.language == null) {
language.innerHTML = "Não Sei!!";
} else {
language.innerHTML = navigator.language;
}
}
if(systemLanguage != null) {
if (navigator.systemLanguage == null) {
systemLanguage.innerHTML = "Não Sei!!";
} else {
systemLanguage.innerHTML = navigator.systemLanguage;
}
}
if(userLanguage != null) {
if (navigator.userLanguage == null) {
userLanguage.innerHTML = "Não Sei!!";
} else {
userLanguage.innerHTML = navigator.userLanguage;
}
}
if(userAgent != null) {
userAgent.innerHTML = navigator.userAgent;
}
if(platform != null) {
if(navigator.platform == null) {
platform.innerHTML = "Não Sei!!";
} else {
platform.innerHTML = navigator.platform;
}
}
}
Uma maneira de popular dados em uma tag span é utilizar a sua propriedade span.innerHTML, recuperando o que há nela ou reescrevendo o seu conteúdo. A lista de propriedades do navegador recuperada via código é:

navigator.appCodeName = Um nome em código para o navegador.
navigator.appName = O nome "real" do navegador.
navigator.appVersion = Versão do navegador e demais informações correlatas.
navigator.cookieEnabled = Boolean. Indica se os cookies estão ou não habilitados.
navigator.language = Língua padrão do navegador (só existe no Netscape e Firefox).
navigator.systemLanguage = Linguagem do sistema operacional (só existe no IE).
navigator.userLanguage = A linguagem selecionada pelo usuário (só existe no IE).
navigator.userAgent = Um cabeçalho indicando o user agent.
navigator.platform = A plataforma do sistema operacional.

Existem ainda outras propriedades do objeto navigator, muitas pouco comuns ou úteis. As seguintes, todavia, talvez tenham boa aplicação:

function getMime() {
var mimes = "";
if(navigator.mimeTypes == null) {
mimes = "Não Sei!!";
} else {
var types = navigator.mimeTypes;
mimes = types[0].type;
for (i = 1; i < types.length; i++) {
mimes = mimes + ", " + types[i].type;
}
}
var mimeWindow =
window.open("", "MIMEs", "menubar=no,location=no,status=no,scrollbars=yes");
mimeWindow.document.body.innerHTML = mimes;
}

function getPlugin() {
var plugins = "";
if(navigator.plugins == null) {
plugins = "Não Sei!!";
} else {
var pluginsArray = navigator.plugins;
plugins = pluginsArray[0].name + " (arquivo: " + pluginsArray[0].filename
+ ", descrição: " + pluginsArray[0].description + ")";
for (i = 1; i < pluginsArray.length; i++) {
plugins = plugins + ", " + pluginsArray[i].name + " (arquivo: " +
pluginsArray[i].filename + ", descrição: " + pluginsArray[i].description + ")";
}
}
var pluginWindow =
window.open("", "Plugins", "menubar=no,location=no,status=no,scrollbars=yes");
pluginWindow.document.body.innerHTML = plugins;
}

navigator.mimeTypes = Uma lista com todos os tipos MIME suportados pelo navegador (Somente Netscape e Firefox).
navigator.plugins = Uma lista em HTML de todos os plugins instalados no navegador (Somente Netscape e Firefox). Observe que esta lista é em HTML, ou seja, pode conter links, quebra de linhas, etc.
Por serem longas e/ou formatadas, estas opções abrirão em nova janela.
A nova janela é criada com a função window.open. Esta função retorna uma referência para a janela recém-criada e, com isto, podemos popular todo o seu código HTML dinamicamente!! Basta acessar:

var novaJanela = window.open("", "Plugins", "menubar=no");

Observe que deixamos vazio o lugar onde seria colocado o arquivo HTML da janela. No entanto, este arquivo é criado na memória com apenas a estrutura DOM básica. É o suficiente para injetarmos conteúdos nele, recuperando o seu objeto document, de onde podemos recuperar o objeto body e toda a estrutura DOM da página da janela:

var conteudo = [obtém todo o conteúdo da janela no formato de String];
novaJanela.document.body.innerHTML = conteudo;

Pessoal, espero ter ajudado!! Claro, como não custa nada: COMEEEEENNTEEEEMMM!!!!!

quarta-feira, 7 de julho de 2010

Firefox e Flash sem Som no Linux (sem áudio)

Não é raro mas, com a grande diversidade de distribuições de Linux, suas versões, além das várias versões do Firefox, do Flash e tudo o mais, em muitos casos as pessoas se deparam com o Firefox funcionando quase perfeitamente no Linux, com o único problema de que: o Flash não toca!! O Firefox não consegue tocar nada... o que pode ser isto, Meu Deus????
Bom, primeiramente, para você ficar feliz, corrija o problema. Possivelmente o que você vai precisar é digitar, como root, o seguinte comando:

usermod -a -G audio [nome de seu usuário]

onde [nome de seu usuário], evidentemente, é o nome de seu usuário, aquele que você usa para fazer login no sistema. Se você não sabe isto ou está em dúvidas, basta digitar, no terminal, o comando whoami.
Agora feche o Firefox e todos os programas e faça logoff (fechar a seção). Não precisa reiniciar a máquina (lembre-se: não é Windows!!). Depois que encerrar a seção, faça o login de novo, abra o Firefox e teste algum site com som, como o Youtube. Possivelmente funcionará!!


  • Por Que o Firefox Não Toca??

O que acontecia antes da correção foi o seguinte: você provavelmente usava um usuário que não estava no grupo de áudio, denominado "audio" em praticamente todas as distros Linux. O comando que você digitou adiciona seu usuário ao grupo "audio". Para ter certeza, se você for chato, digite estes comandos:

groups [nome de seu usuário]
ls -l /dev/dsp

O primeiro informará todos os grupos a que seu usuário pertence. O segundo listará o dispositivo de som (o /dev/dsp), informando, dentre muitas coisas, em que grupo ele se encontra (possivelmente, será o grupo "audio"). Assim, se o seu usuário passa a fazer parte do grupo do dispositivo de som, ele será capaz de "enxergar" este dispositivo, escrever e ler dele. Muito bom!!

Se esta dica não resolveu o problema, existe um fórum cheio de possibilidades de soluções com milhares de pessoas que tiveram este mesmo contratempo e corrigiram por diferentes mecanismos. Basta acessar aqui.


  • Links Úteis

Se você quer saber como instalar o Flash no Linux e no Firefox, visite nosso artigo sobre isto!!
Quero saber mais sobre usuários e grupos no Linux!! Caaaalmaa.... temos um artigo completo sobre isto também!!

É isso aí, camarada!! Volte sempre!!