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 &lt;<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>&gt;:<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>&gt; Obrigado Nilson!<br>&gt;<br>&gt; tipow...eu nao sou programador avançado em Perl...tudo q aprendi foi<br>&gt; pelo livro do Deitel... eu utilizo essa linguagem para um trabalho de<br>
&gt; 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&#39;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>&gt; 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 &quot;Inter Process Communication&quot; (&quot;perldoc perlipc&quot; 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 &quot;CPAN&quot; com o comando &quot;perldoc CPAN&quot; 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 &quot;Daemon&quot; que você<br>
tem rodando na máquina) e diz para o usuário &quot;ok, eu aceitei a tarefa<br>que você me deu. Volta mais tarde que eu tenho resultado&quot;. 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 &quot;fork()&quot;, leia a<br>documentação com o comando &quot;perldoc -f fork&quot; no seu shell), passa o<br>
genoma que ele recebeu, e volta a aguardar um novo pedido.<br><br>O processo &quot;filho&quot; (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 &quot;Daemon Unix&quot;: 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> &nbsp; # Olho para a base de dados para saber se tem novas tarefas<br> &nbsp; my @new_jobs = check_for_new_jobs;<br> &nbsp; # para cada nova tarefa que tem, crio um processo filho<br> &nbsp; foreach my $job ( @new_jobs ) {<br>
 &nbsp; &nbsp; # Os processos-filho se encarregam de executar a comparação<br> &nbsp; &nbsp; my $process_id = fork_child_to_process( $job );<br> &nbsp; &nbsp; # mantenha algum controle sobre os teus processos-filho.<br> &nbsp; &nbsp; # Este é simples e bobo. Você precisa de coisa melhor aqui.<br>
 &nbsp; &nbsp; push @running_jobs, $process_id;<br> &nbsp; }<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> &nbsp; # rotina básica de base de dados:<br> &nbsp; my $dbi = DBI-&gt;connect( $dsn, $user, $password );<br> &nbsp; my $sth = $dbi-&gt;prepare( q{SELECT * FROM Jobs WHERE status = &#39;new&#39;} );<br> &nbsp; $sth-&gt;execute;<br>
<br> &nbsp; # Isto é didático, mas podia ter sido feito em uma linha.<br> &nbsp; my @jobs;<br> &nbsp; while( my $job_info = $sth-&gt;fetchrow_arrayref ) {<br> &nbsp; &nbsp; push @jobs, $job_info;<br> &nbsp; }<br> &nbsp; return @jobs;<br>}<br><br>sub fork_child_to_process {<br>
 &nbsp; my $job = shift;<br> &nbsp; if( my $pid = fork ){<br> &nbsp; &nbsp; # sou o pai, tenho um Process ID.<br> &nbsp; &nbsp; return $pid;<br> &nbsp; }else{<br> &nbsp; &nbsp; # Eu sou o filho, executo a tarefa<br> &nbsp; &nbsp; execute_job( $job );<br> &nbsp; }<br>}<br><br>sub execute_job {<br>
 &nbsp; my $job = shift;<br> &nbsp; # Job é uma linha da base de dados que contém<br> &nbsp; # a especificação do que eu tenho de fazer.<br><br> &nbsp; # Aqui você precisa implementar o teu processo de<br> &nbsp; # comparação de genoma, eu não sei que método você está usando,<br>
 &nbsp; # e assim não vou escrever nada nesta função.<br><br> &nbsp; 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 &quot;parece&quot; 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 !@#$@%&amp;* 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&#39;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 &quot;preguiça&quot; (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>