jump to navigation

Evitando Captchas Repetidos no Yii Framework 12/02/2011

Posted by pablodurans in Yii framework.
add a comment

Quando estava testando um caso de uso implementado utilizando o Yii, percebi que os captcha’s se repetiam. Considerando que meu objetivo era evitar que o usuário usasse um bot que executasse várias vezes a mesma ação, o captcha, então, não estava servindo a minha necessidade.
Não encontrei nada na web e tive que vasculha o código do framework para resolver este problema.
Para isto, o código abaixo deve ser adicionado antes de chamar o render() da view onde se encontra o captcha.


...
$captchaAct = $this->createAction('captcha');
if($captchaAct != null) $captchaAct->getVerifyCode(true);
...

É importante frisar que ‘captcha’ é o nome da action que foi definido no metodo actions() do controller. No caso em que outro nome tenha sido usado, igual substituição deve ser feita nesse código.

Mesclando Celulas em Tabela do LaTeX 08/05/2010

Posted by pablodurans in Latex.
add a comment

Os editores de texto como o Open Office e o Word oferecem a possibilidade de inserir tabela. Juntamente a esta função, também é possível mesclar varias células de uma tabela dando uma maior liberdade ao usuário. Com esse recurso pode-se listar dados objetos (Como times) agrupando eles por um atributos (Estado). Abaixo é mostrado um exemplo disto:

Nesse exemplo percebe-se que a primeira linha foi toda mesclada para colocar o nome Brasil e que a células que possuem os estados (São Paulo e Rio) são resultado desse artifício.

Para fazer isso no LaTeX é necessários os Comandos \multicolumn e \multirow.

multicolumn

O multicolumn faz junções horizontais. É bastante simples de usar, basta chama-lo passando a quantidade de células e a posição que o texto deve ficar. O código abaixo exemplifica isso

O resultado deste código é:

multirow

Da mesma forma, o multirow faz junções verticais, sendo que os mesmo parâmetros são passados. Novamente outro codigo para demonstrar:

Mas nesse caso, o resultado não é o esperado. As linhas horizontais que dividem as celulas não desaparecem.[Figura abaixo]

Como forma alternativa para resolver esse problema, pode ser usado o \cline que traça uma linha horizontal em apenas algumas colunas. \cline{col Inicio-col Fim}:

Agora sim a tabela ficou como desejada:

Pegando o IP e a porta do canal no JGroups 03/12/2009

Posted by pablodurans in Uncategorized.
add a comment
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 12/11/2009

Posted by pablodurans in linux.
add a comment

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 04/06/2009

Posted by pablodurans in Uncategorized.
add a comment

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 04/06/2009

Posted by pablodurans in linux.
add a comment

Qualquer shell linux possui uma 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, além de comandos e arquivos, ele também completa com interfaces de rede, subcomandos além de,  para alguns comandos, só completar com arquivos que sejam relevantes. 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 herdarão 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 necessite de permissão de sudo)

Teclado Multimidia no Dynabook TX 980LSBB no linux 10/12/2008

Posted by pablodurans in dynabook, linux.
Tags: ,
add a comment

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 12/07/2008

Posted by pablodurans in Linguagem C, linux, Sistema Operacionais.
Tags: , ,
add a comment

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 09/06/2008

Posted by pablodurans in linux.
add a comment

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.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.