Traduções no seu gmail ou gtalk

Junho 4, 2009 por pablodurans

Quem nunca teve dificuldades com inglês e não conseguiu um dicionário de inglês.

Na internet possui varios tradutores, mas nenhum que esteja aberto quase sempre. Mas isso foi antes do google criar os boot de tradução do gtalk. É fácil ter, basta adicionar pt2en@bot.talk.google.com e en2pt@bot.talk.google.com
a sua lista de contatos e pronto, tudo que você manda pra eles, eles mandam de volta traduzido.

Auto Complet Terminal Ubuntu

Junho 4, 2009 por pablodurans

Qualquer shell linux possui um habilidade bastante útil que é completar os comandos quando apertamos em <TAB>, então o restante do comando pode ser completado com um comando que esteja no path ou com um arquivo que esteja na pasta atual.

No caso do ubuntu, alem de comandos e arquivos, ele também completa com interfaces de rede, subcomandos alem de para alguns comandos, só completar com arquivos que sejam relevantes pro comando. Exemplo:

$ unzip <Tab> (Só completará com arquivos que tenham a extensão .zip)

Alguns comandos, embora conveniente, não possuem essa qualidade, um exemplo é o g++. No meu caso, só queria que ele completasse com arquivos de extensão cpp ou c .

Pesquisando onde provavelmente implementaria essas funções(o arquivo ~/.bashrc) encontrei que para isso ele executa o script /etc/bash_completion . Minha solução para adicionar esse conveniência ao g++ foi adicionar a seguinte linha nesse script.

complete -f -X ‘!*.@(cpp|c)’ g++

Também poderia colocar esta linha no ~/.bashrc, mas colocando no /etc/bash_completion, todos os usuários herdaram essa função.

Quando você abrir o /etc/bash_completion você verá que comandos como unzip, xpdf, gunzip, entre outros também estarão lá. Assim você poderá alterar eles também, por isso, cuidado ao alterar esse arquivo(talvez por isso ele necesite de permissão de sudo)

Teclado Multimidia no Dynabook TX 980LSBB no linux

Dezembro 10, 2008 por pablodurans

Já tenho esse notebook a 2 anos e nunca tinha conseguido fazer com que o linux(especificamente o ubuntu) reconhecer alguma hotkey. Hoje, resolvi depois de tanto tempo, vê se havia alguma atualização para minha BIOS(provavelmente). Foi só eu atualizar a BIOS que baixei nesse site: http://cdgenp01.csd.toshiba.com/content/support/downloads/ta7i0v600.exe . Então as teclas responsáveis pelo player, luminosidade do lcd e o mudo começaram a funcionar.

Eu sei que é um executavel que estou mandando baixar, mas percebam que o dominio é toshiba.com qualquer coisa, procurem isso pelo site http://www.csd.toshiba.com/cgi-bin/tais/support/jsp/modelContent.jsp?ct=DL&os=&category=&moid=1358998&rpn=PSAA8U&modelFilter=A100-ST8211&selCategory=3&selFamily=1073768663&selModel=1358998|PSAA8U# .

Implementando um pipe para Unix/Linux

Julho 12, 2008 por pablodurans

Suponhamos que você deseja implementar seu proprio shell. Uma das tarefas mais difícil que você terá será para implementar o pipe.

Pipe é o redirecinamento da saída padrão de um programa para a entrada padrão de outro.[http://pt.wikipedia.org/wiki/Pipe]

Este Artigo demonstra como isso pode ser feito de um forma interativa(usando for, while ou do…while) e não recursiva.

Comunicar 2 processos irmão

A primeira coisa a se entender é como comunicar irmãos. Uma boa alternativa é criar um tunel no pai e os filhos herdaram esse tunel. Pra criar tunel, precisamos da chamada ao sistema chamada pipe. essa chamada ao sistema recebe um vetor de inteiro e depois de executada na posição 0 conterá um descritor de Stream que pode apenas ser lido e na posição 1 conterá um descritor onde pode-se escrever.


int fd[2];
pipe(fd);
if(!fork()){
close(fd[1]);

}
else if(!fork()){
close(fd[0]);

}


else {close(fd[0]); close(fd[1]);}

Nesse caso o primeiro processo criado lerá o que o segundo escrever nesse tunel criado.

Fazer pipe entre 2 processos irmãos

No exemplo passado, apenas fizemos um tunel entre os processos, mas a comunicação ainda não é feita pela saida padrão para a entrada padrão. Para isso usaremos a função dup2 que é uma implementação da chamada ao sistema dup. A função dup2 recebe o identificador de 2 descritores e ela faz uma copia do primeiro no lugar do segundo.


int fd[2];
pipe(fd);
if(!fork()){
close(fd[1]);
dub2(fd[0], 0);//0 é o identificador do fluxo STDIN
}
else if(!fork()){
close(fd[0]);
dub2(fd[1], 1);//1 é o identificador do fluxo STDOUT

}
else{close(fd[0]); close(fd[1]);}

Neste caso, o primeiro processo lerá através da entrada padrão a saida padrão do segundo processo.

Fazer pipe entre n processos

Já conseguimos fazer o pipe entre 2 processos, mas muitas vezes precisamos fazer pipes entre vários processos, um exemplo é:

$ cat arquivo | grep palavra | sort | more

Nesse exemplo ele mostrará na tela todas as linhas do arquivo que contenha um certa palavra, de forma ordenada e com pausas quando a tela estiver cheia.

Isso só prova a necessidade de uma interação no código. Abaixo mostro o código onde consegui fazer isso.

int fd[2];//contem os tuneis
int past;//contem a saida do tunel anterior
int i=0;

for(; i<cmd.size()-1; i++){
pipe(fd);//cria o tunel que é herdado pelo filho
if(!fork()){//para o novo processo
if(i!=0){//se não for o primeiro comando
dup2(past, 0);//recebe como entrada a saida do tunel passado
}

dup2(fd[1], 1);//a saida vai para o novo tunel

execvp(cmd[i][0],cmd[i]);//especializa o novo processo
}
close(fd[1]);//fecha o tunel para o pai
if(i!=0) close(past);//fecha o tunel passado para o pai
past = fd[0];//o tunel atual agora é o passado
}

if(!fork()){//executado para o ultimo processo
if(i!=0){//se ele tb não for o primeiro
dup2(past, 0);//coloca a entrada para a saida do tunel
}
execvp(cmd[i][0],cmd[i]);//especializa este processo
}

Obs: cmd é um vector de arrays de arrays de characters(Declaração vector<**char> ou vector<char[] [] > )

Instalar VMWare no kernel 2.6.24-18-generic

Junho 9, 2008 por pablodurans

Quando passei do Ubuntu 7.10 para o 8.04, acabou que o kernel tb foi atualizado, e depois disso, não consegui mais instalar o VMWare, coisa que eu já tinha feito do ubuntu 7.10.

O erro que aparecia era:

Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config0/vmmon-only’
make -C /lib/modules/2.6.24-16-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-16-generic’
CC [M] /tmp/vmware-config0/vmmon-only/linux/driver.o
CC [M] /tmp/vmware-config0/vmmon-only/linux/hostif.o
CC [M] /tmp/vmware-config0/vmmon-only/common/comport.o
CC [M] /tmp/vmware-config0/vmmon-only/common/cpuid.o
In file included from include/asm/bitops.h:2,
from /tmp/vmware-config0/vmmon-only/./include/vcpuset.h:74,
from /tmp/vmware-config0/vmmon-only/./include/modulecall.h:23,
from /tmp/vmware-config0/vmmon-only/common/vmx86.h:18,
from /tmp/vmware-config0/vmmon-only/common/hostif.h:18,
from /tmp/vmware-config0/vmmon-only/common/cpuid.c:14:
include/asm/bitops_32.h:9:2: error: #error only <linux/bitops.h> can be included directly
make[2]: *** [/tmp/vmware-config0/vmmon-only/common/cpuid.o] Error 1
make[1]: *** –_module_/tmp/vmware-config0/vmmon-only– Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic’
make: *** http://vmmon.ko Error 2
make: Leaving directory `/tmp/vmware-config0/vmmon-only’
Unable to build the vmmon module.

Procurando nos foruns do vmware, acabei descobrindo uma maneira bem fácil de conseguir instalar o vmware.

_______________________________________________________________________

Primeiramente rode o instalador do vmware

$ vmware-player-distrib/vmware-install.pl

quando perguntar se você quer rodar o vmware-config.pl, ponha no.

Tem-se que agora alterar o arquivo vmmon-only/include/vcpuset.h dentro de  /usr/lib/vmware/modules/source/vmmon.tar . Execute os comandos a seguir(como super usuário).

$ cd /tmp

$ cp /usr/lib/vmware/modules/source/vmmon.tar .

$ tar -xvvf vmmon.tar

Editando o arquivo usando gedit(ou editor de sua preferencia)

$gedit vmmon-only/include/vcpuset.h

Altere a linha 74 colocando linux/bitops.h no lugar de asm/bitops.h

salve o arquivo e feche o editor.

Agora só falta subtituir pelo antigo, lembrando de salvar uma copia do antigo

$ tar cvf vmmon.tar vmmon-only
$ mv /usr/lib/vmware/modules/source/vmmon.tar /usr/lib/vmware/modules/source/vmmon.tar.orig
$ cp vmmon.tar /usr/lib/vmware/modules/source

agora entre no diretorio que você descompatou o instalador do VMware para rodar o vmware-config.pl .

$ cd bin

$ ./vmware-config.pl

Pronto, agora você tem o VMWare instalado na sua maquina.