Muito Obrigado Luis! <br><br>Eu não tinha a mínima base de Perl e como gostei do livro de C++ do Deitel, achei que o de Perl poderia ser bom também. <br><br>E outro ponto, não é que eu não corra atrás mas é porque eu não sabia mesmo por onde começar e por isso que postei esse tópico. E se eu postasse todo o código da ferramenta ia ser complicado de vocês me ajudarem. <br>
<br>Da forma como você colocou, você já me deu um caminho. Agora eu vou correr atrás disso e tentar implementar.<br><br>E quanto a minha iniciação cientifica, não se preocupe, eu não uso gírias ,mas me equivoquei, pois pensei que por ser uma lista de emails, eu poderia escrever informalmente. Aprendido!<br>
<br>Abraços<br><br><div class="gmail_quote">2008/2/9 Luis Motta Campos <<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">Matheus Barros wrote:<br>> Obrigado Nilson!<br>><br>> tipow...eu nao sou programador avançado em Perl...tudo q aprendi foi<br>> pelo livro do Deitel... eu utilizo essa linguagem para um trabalho de<br>
> iniciacao cientifica....<br><br></div>Bom, pequenas dicas para enriquecer a sua iniciação científica e o seu<br>CV: não use gíria, que aqui não é apropriado. Regionalismos passam, mas<br>a gente tem potencial para ter problemas sérios para se entender. Tem<br>
programadores Perl lendo isto de todas as partes do Brazil, até onde eu<br>tenho notícias.<br><br>Outra coisa: o Deitel é um bom /teaser/, ele consegue provocar vontade<br>de ler. Mas isso não quer dizer que ele é uma boa fonte de aprendizado.<br>
A gente costuma recomendar o Livro do Camelo:<br><br>Programming Perl<br>Larry Wall, Tom Christiansen, Jon Orwant<br>O'Reilly, Jul/2000<br>ISBN 0-596-00027-8<br><a href="http://www.oreilly.com/catalog/pperl3/" target="_blank">http://www.oreilly.com/catalog/pperl3/</a><br>
<br>Sim, tem traduções em Português, se você preferir.<br>Sim, você vai conseguir encontrar ele na biblioteca da faculdade. :)<br>Sim, você pode usar seus privilégios de Aluno de Iniciação Científica<br>para descolar uma cópia para você.<br>
<br>E uma última coisa: não peça desculpas por não saber: até onde eu sei,<br>não saber não é crime. Ninguém aqui nasceu sabendo Perl. A gente aprende<br>e ensina, não necessáriamente mais uma coisa ou outra, e não<br>necessáriamente nesta ordem ;)<br>
<div class="Ih2E3d"><br>> Se você tivesse algum exemplo eu agradeceria.<br><br></div>Bom, você pode começar com o que o MDA(1) mandou para você no outro<br>email, lendo sobre "Inter Process Communication" ("perldoc perlipc" no<br>
shell do seu *nix);<br><br>Depois, tem o CPAN (2), de onde você pode puxar peças úteis como esta:<br><br><a href="http://search.cpan.org/%7Eehood/Proc-Daemon-0.03/Daemon.pm" target="_blank">http://search.cpan.org/~ehood/Proc-Daemon-0.03/Daemon.pm</a><br>
<br>(leia o manual do módulo "CPAN" com o comando "perldoc CPAN" para<br>entender como obter software a partir do CPAN).<br><br>Assim, a tua interface com o usuário fica separada (confinada do sistema<br>
de CGI), e não precisa fazer trabalho pesado. Ela apenas recebe os dados<br>iniciais do usuário (um genoma para ser comparado, por exemplo), guarda<br>eles de alguma forma (ou transmite diretamente para o "Daemon" que você<br>
tem rodando na máquina) e diz para o usuário "ok, eu aceitei a tarefa<br>que você me deu. Volta mais tarde que eu tenho resultado". Não se<br>esqueça de providenciar um número para identificar a tarefa que foi<br>
recebida.<br><br>Quando o Daemon vê uma nova tarefa de comparação de genoma vindo do<br>programa CGI, ele cria um novo processo (com "fork()", leia a<br>documentação com o comando "perldoc -f fork" no seu shell), passa o<br>
genoma que ele recebeu, e volta a aguardar um novo pedido.<br><br>O processo "filho" (que foi criado sob demanda pelo Daemon para atender<br>à tarefa) faz a comparação do genoma apresentado com os que ele tem<br>
armazenados (deve ser uma base de dados, não?), chega no resultado que<br>ele precisa, armazena este resultado em algum lugar (de onde o CGI vai<br>conseguir pegar mais tarde para mostrar ao usuário) e termina.<br><br>Finalmente, quando o usuário volta com a identificação de tarefa dele, o<br>
CGI pode encontrar o resultado final do processamento para aquela tarefa<br>e mostrar o resultado, quantas vezes forem necessárias.<br><br>Finalmente, ação:<br><br>#!/usr/bin/perl<br>use strict;<br>use warnings;<br><br>use Proc::Daemon;<br>
Proc::Daemon::Init;<br># Deste ponto em diante, somos um "Daemon Unix": não tenho acesso<br># a I/O para terminais, e apenas posso abrir e fechar arquivos<br># e iniciar processos novos.<br><br># eu sento num loop e olho a vida passar:<br>
while( sleep $tempo ){<br> # Olho para a base de dados para saber se tem novas tarefas<br> my @new_jobs = check_for_new_jobs;<br> # para cada nova tarefa que tem, crio um processo filho<br> foreach my $job ( @new_jobs ) {<br>
# Os processos-filho se encarregam de executar a comparação<br> my $process_id = fork_child_to_process( $job );<br> # mantenha algum controle sobre os teus processos-filho.<br> # Este é simples e bobo. Você precisa de coisa melhor aqui.<br>
push @running_jobs, $process_id;<br> }<br>}<br><br># Olha para um banco de dados para saber se tem novas tarefas<br># EU NAO TRATEI ERROS DE BASE DE DADOS E NAO FIZ LOGGING DE ATIVIDADE<br># VOCE PRECISA IMPLEMENTAR ESTAS COISAS OU VAI FICAR LOUCO<br>
sub check_for_new_jobs {<br><br> # rotina básica de base de dados:<br> my $dbi = DBI->connect( $dsn, $user, $password );<br> my $sth = $dbi->prepare( q{SELECT * FROM Jobs WHERE status = 'new'} );<br> $sth->execute;<br>
<br> # Isto é didático, mas podia ter sido feito em uma linha.<br> my @jobs;<br> while( my $job_info = $sth->fetchrow_arrayref ) {<br> push @jobs, $job_info;<br> }<br> return @jobs;<br>}<br><br>sub fork_child_to_process {<br>
my $job = shift;<br> if( my $pid = fork ){<br> # sou o pai, tenho um Process ID.<br> return $pid;<br> }else{<br> # Eu sou o filho, executo a tarefa<br> execute_job( $job );<br> }<br>}<br><br>sub execute_job {<br>
my $job = shift;<br> # Job é uma linha da base de dados que contém<br> # a especificação do que eu tenho de fazer.<br><br> # Aqui você precisa implementar o teu processo de<br> # comparação de genoma, eu não sei que método você está usando,<br>
# e assim não vou escrever nada nesta função.<br><br> return $resultado;<br>}<br><br>__END__<br><br>Eu espero que isso te ajude.<br>Eu sei que você vai ter milhões de perguntas depois de ler isso. E eu<br>sei também que isso "parece" praticamente todo o teu trabalho de<br>
iniciação científica. Mas não é. Ainda tem muita coisa para resolver e<br>muita coisa para implementar. Não se empolgue muito, e continue<br>perguntando na lista.<br><br>Ah, e pare de ler a !@#$@%&* do livro do Deitel. :)<br>
<br>Quando você perguntar coisas daqui para frente, tenha certeza de que<br>você tem algum código para mostrar também. ;) Estimula a gente saber que<br>você está tentando se virar.<br><br>Boa sorte.<br>Putamplexos!<br>--<br>
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,<br>Perl fanatic evangelist, and amateur {cook, photographer}<br><br>(1) Marco A P D'Andrade, um dos caras que respondeu para você.<br>(2) Comprehensive Perl Archive Network - Um monte de bibliotecas muito<br>
úteis e que resolvem 90% dos problemas, organizadas de uma maneira mais<br>ou menos útil. E viva a "preguiça" (do tipo saudável!)<br><a href="http://search.cpan.org/" target="_blank">http://search.cpan.org/</a><br>
<div><div></div><div class="Wj3C7c">_______________________________________________<br>Cascavel-pm mailing list<br><a href="mailto:Cascavel-pm@pm.org">Cascavel-pm@pm.org</a><br><a href="http://mail.pm.org/mailman/listinfo/cascavel-pm" target="_blank">http://mail.pm.org/mailman/listinfo/cascavel-pm</a><br>
</div></div></blockquote></div><br>