Pegando o IP e a porta do canal no JGroups

Dezembro 3, 2009 por pablodurans
Durante um trabalho da cadeira Sistemas Distribuídos, necessitei em um momento obter o IP e a Porta em que o canal estava aberto. A primeira vista achei que fosse fácil, afinal, minha aplicação foi quem criou o canal, eu podia ter essa informação em algum lugar, mas após uma analise, verifiquei 2 coisas:
- Minha maquina pode ter mais de uma interface de rede, em qual será que o canal foi criado?
- Passo para o JGroups uma porta preferencial, mas caso ela esteja em uso, ele abrirá o canal em outra porta
Procurei por metodos no canal que me indicassem o IP, não achei, depois de muito fuçar, encontrei uma maneira até profissional de obter isso. O codigo simples está mostrado abaixo(exemplo para canal usando TCP):

Onde gameChannel é um Channel.
Para quem quiser entender o codigo, quem realmente tem conhecimento das informações da rede são os protocolos de transporte(TCP ou UDP). Logo é só encontra-los na pilha de protocolos e depois só pegar o ip e a porta pelos metodos acima.

Editando pdfs com PDF-JAM

Novembro 12, 2009 por pablodurans

O pdf-jam é um pacote de comandos na linha de comando do linux que fazem edições simples em pdfs. Ele vem com 3 comandos:

pdfjoin

faz concatenação de um ou mais pdf’s, a forma simples de usar é:

$ pdfjoin file1.pdf file2.pdf … –outfile file_result.pdf

pdf90

rotaciona em 90 graus um arquivo pdf, forma simples de usar é:

$pdf90 file.pdf

Isso vai criar um arquivo file-rotated.pdf

pdfnup

tem como função principal juntar uma serie de paginas em uma só(em forma de grid),  mas também pode ser usado para incluir só algumas paginas no arquivo resultante. Uma forma simples de usar é:

pdfnup file.pdf –nup 3×2 –pages 1,4,7-10

Isto vai gerar um pdf com 6 paginas(3×2) com as paginas 1,4,7,8,9,10

Para mais informações:

http://www2.warwick.ac.uk/fac/sci/statistics/staff/academic/firth/software/pdfjam

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.