<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10657935</id><updated>2011-04-22T00:07:49.782+01:00</updated><title type='text'>webservcga</title><subtitle type='html'>acompanhamento do desenvolvimento do projecto WebServCGA, projecto de fim de curso de Informática - Ramo Tecnológico na Universidade do Algarve - ano lectivo 2004-05</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10657935.post-113580124491912284</id><published>2005-12-28T19:51:00.000Z</published><updated>2005-12-28T20:20:44.930Z</updated><title type='text'>The end!</title><content type='html'>Já algum que estava para colocar aqui este post. &lt;br /&gt;A partir deste momento declaro encerrado este blog até algum motivo especial o faça. A apresentação teve lugar no passado dia 14 e terminei com a classificação de 16 valores. Ficou fora das minhas expectativas, porque contava ter pelo menos 18 para conseguir atingir média de 13. Sendo assim, devo ter ficado muito perco dos 12,5, mas não o suficiente para permitir o arredondamento para mais uma unidade.&lt;br /&gt;A apresentação propriamente não correu pelo melhor, visto que ficou muito longa e passou do tempo predefinido, que consistia em 20 minutos. Entrei a todo o gás na apresentação e não consegui concluír toda a apresentação dentro do tempo pré-estabelecido, de modo que quando fui advertido que tinha excedido o tempo, fui obrigado a expôr tudo o resto de seguida.&lt;br /&gt;Durante a discussão, não fui capaz de responder às questões colocadas, de modo que tudo se reflecte na classificação final obtida.&lt;br /&gt;Acabou a minha vida de estudante universitário, vou iniciar uma nova fase na minha vida...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-113580124491912284?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/113580124491912284/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=113580124491912284' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113580124491912284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113580124491912284'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/12/end.html' title='The end!'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-113414053114023426</id><published>2005-12-09T14:57:00.000Z</published><updated>2005-12-09T15:02:11.150Z</updated><title type='text'>Data de apresentação e discussão</title><content type='html'>Quem estiver interessado a estar presente na apresentação do meu projecto de fim de curso de Informática - Ramo Tecnológico, na Universidade do Algarve, esta vai ter lugar no próximo dia 14 de Dezembro, 4ª Feira, às 10h00 da manhã na sala 2.21 do Complexo Pedagógico do Campus de Gambelas. O tema do meu projecto intitula-se "Processamento distribuído do algoritmo Genético compacto através de Web Services" e foi orientado pelo prof. Fernando Lobo. Para além do orientador, irão integrar o júri de discussão os  prof. Patrício Serendero, como director de curso e o prof. José Valente de Oliveira, na qualidade de arguente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-113414053114023426?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/113414053114023426/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=113414053114023426' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113414053114023426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113414053114023426'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/12/data-de-apresentao-e-discusso.html' title='Data de apresentação e discussão'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-113346422450081952</id><published>2005-12-01T18:08:00.000Z</published><updated>2005-12-01T22:49:59.726Z</updated><title type='text'>Já terminou !</title><content type='html'>Na realidade ainda não! Mas estive toda a semana de volta do relatório porque era obrigatório de acordo &lt;a href="http://www.fct.ualg.pt/intranet/regulamentos/reg_est_ped.pdf"&gt;com o regulamento de estágios e projectos&lt;/a&gt; proceder à entrega de toda e qualquer documentação necessário para a discussão do projecto até ao dia de ontem. O relatório foi uma chatice, como sempre, mas tinha de ser! Ao todo fiquei quase duas semanas de volta do dito cujo, escrevendo, escrevendo, até me fartar! Mas não podia-me fartar, por que tinha de ser! Após muitas horas de desgaste, litros de café, e noites mal dormidas, lá consegui pôr a versão definitiva nas mãos do meu orientador, sob a forma de três cópias para cada um dos membros do júri que vão assistir à apresentação oral do projecto, a combinar em princípio para um dia entre 12 e 15 de Dezembro, sendo este o último dia possível, porque é a data final para a notar ser lançada nos serviços académicos.&lt;br /&gt;Após cerca de cinco meses de esforço contínuo em volta deste tema, mesmo assim muita coisa ficou por concretizar, como a ideia original de distribuir o algoritmo através da Internet através de um cliente que fosse atractivo tipo um applet de java, que era o mais provável, ou um screensaver como a ideia original do seti@home. Isto devido à altura tardia em que iniciei o projecto, depois ter andado durante um ano inteiro com seis disciplinas mais chatas, que se não as tivesse à perna, teria investido muito mais tempo naquilo que realmente interessava. O relatório foi todo escrito usando &lt;A href="http://pt.wikipedia.org/wiki/LaTeX"&gt;LaTeX&lt;/A&gt;, uma linguagem de processamento gráfico para a elaboração de documentos para publicações científicas. Foi fixe aprender LaTeX, mas depois de o ter experimentado, confesso que não morri de amores por ele, apesar de ser verdade que cumpre aquilo que promete. Algumas coisas chateam, como por exemplo páginas apenas com uma linha, fazer quadros com pseudo-código é impossível porque não faço ideia como modificar o tipo de letra predifinido para código, entre muitas outras coisas que só muito mais tempo de "mexeriquice" com o LaTex me iria dar.&lt;br /&gt;Fazer um applet ou um screensaver teria sido uma coisa gira, mas assim não sucedeu. Em vez de usar a Internet, lá tive que me desenrascar com as threads de Java para ter um efeito semelhante ao de ter multiplos computadores ligados a colaborar no algoritmo!&lt;br /&gt;Mas o que foi foi, e já não se pode fazer nada para o alterar. Deixo &lt;a href="http://www.deei.fct.ualg.pt/~a18778/index.php?dir=webservcga/&amp;file=relatorio.pdf"&gt;aqui uma versão do relatório&lt;/a&gt; para quem estiver interessado em consultá-la. &lt;br /&gt;Agora as boas notícias, abri uma conta no &lt;A href="http://sourceforge.net" &gt;Sourceforge&lt;/A&gt;, o conhecido sistema de apoio a projectos OpenSource, e agora sou mais um! Vou colocar lá o código todo, e se tiver tempo no futuro, prometo continuar aquilo que eu não consegui concretizar nos cinco meses findos. O endereço da nova casa do WebServCGA é &lt;PRE&gt;&lt;A href="http://webservcga.sourceforge.net"&gt;webservcga.sf.net&lt;/A&gt;&lt;/PRE&gt;.&lt;br /&gt;Provisoriamete, também, mas não deve ficar lá muito tempo vou disponbilizar na minha &lt;A href="http://www.deei.fct.ualg.pt/~a18778/webservcga/"&gt;área pessoal da universidade&lt;/A&gt; a mesma informação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-113346422450081952?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/113346422450081952/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=113346422450081952' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113346422450081952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113346422450081952'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/12/j-terminou.html' title='Já terminou !'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-113260152981687647</id><published>2005-11-21T19:13:00.000Z</published><updated>2005-11-21T19:32:09.830Z</updated><title type='text'>Últimos resultados</title><content type='html'>Aqui vão os últimos resultados disponíveis do meu projecto. Os gráficos foram elaborados com o GnuPlot e estão aproximadamente na mesma escala que os gráficos &lt;a href="http://w3.ualg.pt/~flobo/papers/gecco04-pcga-lbp.pdf"&gt;do artigo sobre a paralelização&lt;/a&gt;. Os meus resultados parecem confirmar em tudo os gráficos do artigo. A silhueta do traçado é em quase tudo semelhante, mesmo com um número menor de execuções (+-10 no meu projecto, 30 no artigo).&lt;br /&gt;Aqui vão os gráficos dos resultados, conjuntamente com os gráficos do artigo original, para uma comparação directa:&lt;br /&gt;&lt;div align="center"&gt;&lt;B&gt;NÚMEROS DE CÁLCULOS DE FITNESS POR THREAD&lt;/B&gt;&lt;/div&gt;&lt;br /&gt;Resultados do projecto&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/my-fe.0.png"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7072/692/320/my-fe.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Resultados do artigo&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/evalsPerThread-article.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;"  alt="" src="http://photos1.blogger.com/blogger/7072/692/320/evalsPerThread-article.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;COMUNICAÇÕES POR THREAD&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Resultados do projecto&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/my-cs.png"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7072/692/320/my-cs.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Resultados do artigo&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/commsPerThread-article.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;"  alt="" src="http://photos1.blogger.com/blogger/7072/692/320/commsPerThread-article.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-113260152981687647?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/113260152981687647/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=113260152981687647' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113260152981687647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113260152981687647'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/11/ltimos-resultados.html' title='Últimos resultados'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-113132718765025272</id><published>2005-11-07T00:50:00.000Z</published><updated>2005-11-07T01:33:07.676Z</updated><title type='text'>Eles aí estão, quentinhos...</title><content type='html'>Acabei de pôr à prova o meu programa, e para isso durante todo este fim-de-semana usei o computador Gazela no laboratório de projectos da Universidade, mais o computador Girafa. O Gazela, uma vez que tem um processador rápido (AMD Athlon 1800+) com 768 MB de RAM era o candidato óbvio para correr o cliente, devido a ficar encarregue de fazer "todo o trabalho" de desenvolvimentos dos indivíduos, a sua avaliação e competição. O servidor, ao contrário do que é usual, era somente passivo nesta questão, uma vez que o seu trabalho era simplesmente receber as diferenças do último vector população e actualizá-lo, verificando se entretanto não teria convergido. Com apenas 192 MB de RAM, também não era preciso muito, apesar do servidor de JSP Tomcat ser um bocado pesado, já que, sendo uma aplicação concebida em JAVA, que é um devorador de recursos em qualquer máquina.&lt;br /&gt;Mas o que importa é que, depois de uma série de contratempos e de ter tentado pôr o meu trabalho a usar a Internet "a sério", com o servidor no meu servidor/gateway Linux caseiro a fazer de servidor, e uma máquina qualquer na Universidade a fazer de cliente, podia ter uma aproximação mais próxima da realidade, se é que alguma vez o meu trabalho venha a ser usado na Internet, tenho esperanças de que sim :).&lt;br /&gt;Enfim, vamos mas ao que interessa, aqui estão os gráficos das experiências que fiz durante o fim de semana. Segui quase à risca as mesmas condições do artigo &lt;a href="http://w3.ualg.pt/~flobo/papers/gecco04-pcga-lbp.pdf"&gt;Referência fundamental para o projecto : Lobo F. G., Lima C. F. &amp; Mártires H. (2004). An Architecture for Massive Parallelization of the Compact Genetic Algorithm. (PDF) &lt;/a&gt;na página 8, e experimentei combinações de valores de &lt;i&gt;m&lt;/i&gt; (máximo de execuções da função de fitness entre cada comunicação com o servidor) no intervalo {8,80,800,8000,80000} com números de threads (equivalente a processadores) no intervalo {1,2,4,8,16,32,64}. O artigo tem gráficos que vão até 1028, mas como a partir de 64, os gastos de RAM dispendida para a criação de threads são enormes, decidi deixá-los para outra ocasião. Os resultados apresentados resultam da média calculada da execução de 6 experiências para todas as combinações possíveis aos pares entre os valores dos dois intervalos. Excepto para &lt;i&gt;m&lt;/i&gt;=8, em que a execução do cliente é extremamente demorada para poder obter um número de experiências em tempo útil. Para ter uma ideia do que tou a falar, a execução do cliente com m=8 mesmo com 64 threads precisou de 7550 segundos (um pouco mais de 2 horas) para se poder completar. Para este caso, apenas procedi (por enquanto) apenas a uma 1 execução para cada valor de threads possíveis no intervalo indicado.&lt;br /&gt;Aqui estão os gráficos, elaborados com a ajuda do Excel, precedido do respectivo gráfico do artigo supracitado, cujos resultados pretende reproduzir:&lt;br /&gt;&lt;BR /&gt;&lt;BR/&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;NÚMEROS DE CÁLCULOS DE FITNESS POR THREAD&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/evalsPerThread-article.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/evalsPerThread-article.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/EvalsPerThread.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/EvalsPerThread.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;COMUNICAÇÕES POR THREAD&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/commsPerThread-article.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/commsPerThread-article.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/CommsPerThread.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/CommsPerThread.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Não pretendo ficar por aqui, pretendo pelo menos completar a metade direita do gráfico que ficou de fora assinalada pelo quadrado colorido, se tiver a gana, mas também o hardware para poder fazer isso. Fiquem a aguardar as notícias dos próximos capítulos :)&lt;br /&gt;&lt;b&gt;P.S.:&lt;/b&gt;Estes não são os gráficos definitivos que pretendo colocar no relatório.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-113132718765025272?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/113132718765025272/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=113132718765025272' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113132718765025272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/113132718765025272'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/11/eles-esto-quentinhos.html' title='Eles aí estão, quentinhos...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112818528605437391</id><published>2005-10-01T17:08:00.000+01:00</published><updated>2005-10-02T14:33:01.160+01:00</updated><title type='text'>Agora já bate tudo certo (ou quase...)</title><content type='html'>Depois de,&lt;a href="http://webservcga.blogspot.com/2005/09/implementao-no-muito-famosa.html"&gt; na semana passada&lt;/a&gt;, os resultados experimentais do cGA que eu implementei não parecerem &lt;a href="http://webservcga.blogspot.com/2005/09/implementao-no-muito-famosa.html"&gt;estar muito famosos&lt;/a&gt;, eis que agora, não sei bem como, tudo está conforme (aproximadamente) o &lt;a href="http://w3.ualg.pt/~flobo/papers/html/cGA/node8.html"&gt;que seria de esperar&lt;/a&gt;. Também é verdade que agora os resultados que apresento como gráficos no Excel foram feitos usando a média aritmética dos valores obtidos em 30 execuções do algoritmo, usando uma vez mais, como teste, a aplicação de usar uma função de trap's múltiplos concatenados.&lt;br /&gt;O único senão é no total de cálculo da função de fitness, os resultados excedem ligeiramente os resultados apresentados &lt;a href="http://w3.ualg.pt/~flobo/papers/html/cGA/compact-GA.html"&gt;no artigo citado&lt;/a&gt;. Mas, mesmo assim, de resto, todos os resultados são bastante satisfatórios. Os melhores são os que registam o número de building blocks no fim do algoritmo, o troço do gráfico segue quase a par os dos gráficos do artigo. Para além disso, de salientar que desta vez experimentar também com populações de 100 e 200, para ver como o algoritmo progride para pequenas alterações nesta gama de valores. E de facto, nota-se, quer tanto para s=4 e s=8 (s é a pressão de selecção), uma pequena subida quando se passa de popsize=8 para popsize=100 (popsize é o tamanho da população). O que não seria possível de verificar se não tivesse experimentado com esses valores.&lt;br /&gt;Não consigo perceber a razão para os resultados agora estarem com esta qualidade, a única alteração que fiz no código foi na parte para seleccionar o melhor indivíduo, e estava relacionado com uma variável (que guarda o melhor fitness até o momento dentro de um loop que percorre todos os indivíduos gerados dentro de um array) em vez de ser inicializada com zero com estava dantes, passou a ser feita com menos infinito (ou melhor, o valor de &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#NEGATIVE_INFINITY"&gt;Double.NEGATIVE_INFINITY &lt;/a&gt;), e para além disso, estive a documentar o código todo com &lt;a href="http://java.sun.com/products/jdk/javadoc/"&gt;javadoc&lt;/a&gt;'s e não me parece que fossem os comentários que fizessem com que o compilador percebesse também melhor o código :)&lt;br /&gt;Aqui ficam os resultados obtidos:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/bbs_s22.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/bbs_s22.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/eval_s21.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/eval_s21.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/bbs_s41.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/bbs_s41.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/eval_s41.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/eval_s41.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/bbs_s82.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/bbs_s82.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/eval_s81.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/eval_s81.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112818528605437391?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112818528605437391/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112818528605437391' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112818528605437391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112818528605437391'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/10/agora-j-bate-tudo-certo-ou-quase.html' title='Agora já bate tudo certo (ou quase...)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112792964436372317</id><published>2005-09-28T18:36:00.000+01:00</published><updated>2005-10-01T18:01:18.850+01:00</updated><title type='text'>Implementação não muito famosa</title><content type='html'>Estive a experimentar a implementar a função de multiplos traps concatenados para diferentes valores da pressão de selecção. Os resultados ficaram aquém dos que se encontram no &lt;A href="http://w3.ualg.pt/~flobo/papers/html/cGA/node8.html"&gt;artigo do cGA&lt;/A&gt;. Os gráficos abaixo foram gerados com o auxílio do &lt;A href="http://www.gnuplot.info"&gt;GNUPlot&lt;/A&gt;. Ambos os gráficos indicam o número de vezes que o fitness foi calculado até atingir a convergência, em função de vários valores para o tamanho da população (experimentei 8,500,1000,1500,2000,2500 e 3000 como vinha no artigo). Em ambos os casos o número de vezes ultrapassa largamente aquele que se encontra no artigo. Estava também para mostrar os resultados para s=2, mas a minha implementação do cGA nem sequer termina dentro de tempo útil, não foi possível determinar um gráfico.&lt;br /&gt;&lt;br /&gt;&lt;H3&gt;TOTAL DE CÁLCULOS DE FITNESS&lt;/H3&gt;&lt;br /&gt;&lt;TABLE border="0" width="400"&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;strong&gt;S=4&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/selection8.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/selection8.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;strong&gt;S=8&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/selection41.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/7072/692/320/selection41.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/TR&gt;&lt;br /&gt;&lt;/TABLE&gt;&lt;br /&gt;Elaborei também gráficos para a quantidade de "building blocks" completos que aparecem na solução final. E os resultados também estão muito longe de satisfazer.&lt;br /&gt;&lt;TABLE border="0" width="400"&gt;&lt;br /&gt;&lt;H3&gt;NÚMERO DE "BUILDING BLOCKS" CORRECTOS OBTIDOS&lt;/H3&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;STRONG&gt;s=4&lt;/STRONG&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/bbs4.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7072/692/320/bbs4.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/TR&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;STRONG&gt;s=8&lt;/STRONG&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/7072/692/1600/bbs8.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7072/692/320/bbs8.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/TR&gt;&lt;br /&gt;&lt;/TABLE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112792964436372317?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112792964436372317/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112792964436372317' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112792964436372317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112792964436372317'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/09/implementao-no-muito-famosa.html' title='Implementação não muito famosa'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112647623650126776</id><published>2005-09-11T22:17:00.000+01:00</published><updated>2005-09-11T23:03:56.506+01:00</updated><title type='text'>Vai indo tudo nos eixos...</title><content type='html'>Enfim, o projecto tem vindo a evoluir perfeitamente dentro dos eixos: desenvolvi um cliente de WS que lança varias threads, sendo possível assim simular um efeito parecido ao caso real em que pudessemos ter muitos clientes a correr em máquinas diferentes em simultâneo. Como não tenho possibilidades (nem remotas) de poder vir a testar o trabalho em semelhantes condições, as threads em Java, servem perfeitamente para esse efeito.E o JAVA, como linguagem recente que é, já suporta threading de raíz, e assim, em vez de termos um único programa, que segue a sequência predeterminada das linhas do código, é possível termos diferentes cópias do mesmo programa, a correrem como que ao mesmo tempo (como o meu portátil só tem um processador, o multiprocessamento real é ilusório). Assim, pus várias threads a descarregar o vector população do WS, usando a função já conhecida DownloadPopulationVector. Quando o trabalho é completado ao fim do número de iterações especificado pelo WS, o vector é transmitido "de volta" ao WS, que assim actualiza o vector população que detém para o último que lhe foi transmitido pelo último cliente (que neste caso é uma thread). Os testes que fiz foram muito simples, usando sempre a função One-Max, testei até ao máximo de 3 threads, com um limite de 5 e 10 iterações entre ciclos envio/pedido do vector população. Fiz algumas experiências, incluindo colocar cada thread a arrancar depois de outra com um intervalo de dois segundos entre lançamentos sucessivos e os resultados estão perfeitamente dentro do esperado. Andei a variar o tamanho da população e o comprimento da população por forma a aumentar o tempo que leva para resolvar o problema. Mas como a função é a one-max, é extremamente simples de resolver. Penso que o trabalho só deverá começar a dar resultados úteis a partir do momento em que deverei começar a aplicação o algoritmo genético compacto a algum tipo de aplicação em que o tempo dispendido no cálculo da função de avaliação (em inglês, fitness) seja de tal forma oneroso que faça com que valha realmente a pena usar o resultado destre trabalho para algo de interesse no futuro.Começam é a surgir na minha mente algumas questões que realmente devem importar como por exemplo:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;uma sugestão dada pelo artigo que estou a seguir na implementação refere que o vector, depois de processado, deve ser reenviado de volta à fonte apenas com as &lt;I&gt;diferenças&lt;/I&gt; entre o vector original e o novo prestes a ser enviado. Ora pessoalmente em que consiste fazer a diferença entre o novo vector e o antigo  em termos de tamanho ? Como a estrutura de dados que estou a usar é basicamente um array, de que forma codifico as diferenças entre dois arrays? De certeza não será enviando apenas as diferenças literalmente entre as posições do vector população que viram o seu valor de frequência ser alterado. Um exemplo para clarificar aquilo que estou a pensar:&lt;br /&gt;Suponhamos que originalmente o cliente descarrega do Web Service o seguinte vector população, correspondente a um problema em que se um cromossoma de cinco posições para uma população total de 20 elementos:&lt;br /&gt;&lt;TT&gt;&lt;br /&gt;10;10;10;10;10&lt;/TT&gt;&lt;br /&gt;&lt;br /&gt;O cliente então começa a correr o algoritmo para um problema qualquer, que pode ser o one-max, e depois, ao terminar o número de iterações requerido envia o vector já com este aspecto:&lt;br /&gt;&lt;TT&gt;&lt;br /&gt;10;14;16;12;10&lt;/TT&gt;&lt;br /&gt;&lt;br /&gt;A diferença "literal", posição a posição, entre os dois seria:&lt;br /&gt;&lt;br /&gt;&lt;TT&gt;&lt;br /&gt;0;4;6;2;0&lt;/TT&gt;&lt;br /&gt;&lt;br /&gt;Em termos de memória, o efeito ganho em usar semelhante representação é nulo, de forma que, enviar o vector população só com as diferenças ou tal e qual como está, vai acabar por dar na mesma. &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Outra forma de resolver o problema anterior seria enviar apenas as posições que foram alteradas, mas duvido que tal tenha algo de útil, porque duvido que sejam muitas as posições que fiquem idênticas entre o princípio e o fim do ciclo. E, mesmo utilizando semelhante esquema, teria que indicar os índices das posições efectivamente modificadas &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Em princípio, ainda vou ver se descubro neste enorme manancial de informação que se chama internet duas coisas: uma possível solução para o problema anterior e encontrar um problema que use o CGA de forma que seja digno de ser implementado neste projecto, ou melhor, esse problema é que devia tornar o meu trabalho digno de obter alguma resultado prático. A ver vamos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112647623650126776?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112647623650126776/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112647623650126776' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112647623650126776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112647623650126776'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/09/vai-indo-tudo-nos-eixos.html' title='Vai indo tudo nos eixos...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112596208923776789</id><published>2005-09-05T23:52:00.000+01:00</published><updated>2005-09-06T00:24:12.956+01:00</updated><title type='text'>Acabaram-se os caminhos tortuosos (pelo menos até agora...)</title><content type='html'>Pois é, consegui finalmente aquilo que tanto queria: gerar todo o código em JAVA necessário para a implementação do serviço e do cliente usando o utilitário WSDL2Java. Consegui finalmente acertar com o WSDL correcto para poder fazer com que o serviço fizesse a coisa mais simples que eu pretendia: descarregar um vector população simples em &lt;b&gt;conjunto&lt;/b&gt; com o parâmetro que indica o número de iterações (e, como a partir de agora, como passei a usar frequências absolutas em vez de relativas, o tamanho da população). Antes, a única que estava a conseguir efectuar era apenas entregar o vector população sob a forma de uma string. Mas era uma coisa "feita em cima do joelho", para desenrascar, e sem usar o WSDL. A questão é que em vez de usar um dos tipos primitivos como int, float, boolean ou string, o Web Service devia devolver um &lt;b&gt;objecto&lt;/b&gt;. E aqui a porca torce o rabo, como raio é que consigo transmitir um objecto complexo através do SOAP ? Graças ao código gerado pelo WSDL2JAVA, fica tudo muito simples, e agora que finalmente consegui perceber para que raio é que server cada um dos ficheiros que o WSDL2JAVA gera, consegui escrever um cliente em menos de nada. Afinal os ficheiros de código gerados automaticamente e agora só percebi isso, facilitam realmente a vida, porque uma pessoa não precisa de estar a perder-se com pormenores mesquinhos e permite concentrar no essencial. No cliente invoco o nome da função "downloadPopulationVector" como se estivesse a acedê-la directamente (a configuração dos parâmetros é idêntica!). Deixo aqui o extracto do código SOAP do Web Service que envia um vector população de 5 posições, com frequências iniciais ajustadas a 10, para correr inicialmente 10 iterações e com uma população de 20 indivíduos:&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;response xmlns=""&amp;gt;&lt;br /&gt;&amp;lt;pv&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;10&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;10&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;10&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;10&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;array&amp;gt;10&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;/array&amp;gt;&lt;br /&gt;&amp;lt;/pv&amp;gt;&lt;br /&gt;&amp;lt;n&amp;gt;10&amp;lt;/n&amp;gt;&lt;br /&gt;&amp;lt;popsize&amp;gt;20&amp;lt;/popsize&amp;gt;&lt;br /&gt;&amp;lt;/response&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112596208923776789?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112596208923776789/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112596208923776789' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112596208923776789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112596208923776789'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/09/acabaram-se-os-caminhos-tortuosos-pelo.html' title='Acabaram-se os caminhos tortuosos (pelo menos até agora...)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112508088740404356</id><published>2005-08-26T18:57:00.000+01:00</published><updated>2005-08-26T19:28:07.413+01:00</updated><title type='text'>Depois do descanso...</title><content type='html'>...pois é, após cerca de 13 dias de paragem por causa de ser o mês de Agosto, com o meu aniversário pelo meio e mais umas quantas ocorrências muito dificilmente iria ter tempo e disponibilidade mental para voltar a pegar nisto.&lt;br /&gt;Da última vez que tinha pegado nisto estava com uns problemas de, ao, utilizar o &lt;i&gt;One-Max&lt;/i&gt;, porque raio é que a população (ou melhor, o vector população) não convergia para frequências (estou a usar frequências absolutas) idênticas ao valor da população (estive a experimentar com cromossomas de comprimento 10 e população 40). Estou a fazer o cliente ir buscar um VP (vector-população) ao WS (Web Service), e correr apenas uma iteração do CGA (Compact Genetic Algorithm), de modo, que podia ir acompanhando passo a passo a intercomunicação entre o cliente e o servidor. Aqui um pequeno reparo: ao contrário de pôr o número máximo de iterações a ser executado em cada ciclo de obter/enviar a ser indicado pelo servidor, como era suposto a princípio, estou a fornecer esse limite directo no código do cliente. Por agora, o servidor de WS limita-se a fazer "eco" do VP que o cliente lhe envia, mandando, sem quaisquer alterações, de novo, o VP que tinha acabado de receber. Até agora, ainda não pus mais do que um cliente a correr ao mesmo tempo. Espero vir a fazê-lo em breve, com a ajuda do &lt;a href="http://java.sun.com/docs/books/tutorial/essential/threads/"&gt;Multi-Threading de Java&lt;/a&gt;.&lt;br /&gt;Mas,como estava dizendo, a dificuldade que vinha tento prendia-se com o facto de a população convergir precocemente antes do que era suposto, por exemplo, para um VP de 10 posições e população de tamanho 40, começa normalmente com:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;20;20;20;20;20;20;20;20;20;20&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;mas depois em vez de dar no fim&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;40;40;40;40;40;40;40;40;40;40&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;estava a dar:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;20;28;20;36;26;35;19;20;20;32&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Achei estranho, e decidi investigar, descobri então, que eram gerados dois indivíduos do vector população, em cada iteração, estavam &lt;b&gt;sempre a ser gerados os mesmos indivíduos&lt;/b&gt; a partir do vector população. Tal devia-se ao facto de o gerador de o números aleatórios estar sempre a ser inicializado com a mesma &lt;i&gt;seed&lt;/i&gt;, o que fiz para resolver foi pôr uma &lt;i&gt;seed&lt;/i&gt; diferente de cada vez que o algoritmo corre, seed essa dada pela hora do sistema, através da função &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#currentTimeMillis()"&gt;System.currentTimeMillis()&lt;/a&gt;. Assim resolveu os problemas, pelo menos, por enquanto. Os meus passos seguintes deverão ser em princípio compreender melhor o Axis, para pôr o WS a devolver dois objectos em vez de apenas um, que é o necessário para se obter não só o VP mas o também o parâmetro &lt;i&gt;m&lt;/i&gt; que indica o número de gerações que o cliente deve correr antes de devolver o VP ao servidor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112508088740404356?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112508088740404356/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112508088740404356' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112508088740404356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112508088740404356'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/08/depois-do-descanso.html' title='Depois do descanso...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112388660231582324</id><published>2005-08-12T23:17:00.000+01:00</published><updated>2005-08-12T23:43:22.323+01:00</updated><title type='text'>Já entrega...</title><content type='html'>Enfim, depois de ter dado o passo principal e que consistia em pôr o WS a enviar o vector população "novinho em folha" para o cliente o poder processar para o problema em questão (eu experimentei o &lt;em&gt;OneMax &lt;/em&gt;e a calcular o máximo do seno para um intervalo. Em ambos os casos, o cliente processava o vector população completamente até atingir a convergência, ao fim dos quais enviava o vector com a solução para o servidor invocando a função &lt;em&gt;SendPopulationVector&lt;/em&gt;, devolvendo um inteiro que indica o estado de sucesso da operação (por enquanto limita-se a devolver 1).&lt;br /&gt;Também, e como já tinha referido no post anterior, os problemas que estou a usar são simples e são resolvidos com poucas iterações. Por exemplo, para os testes que estive a usar, usei um vector de população que representa uma população de 40 indivíduos, cada um com um comprimento de 10 genes. Para o problema &lt;em&gt;One-Max&lt;/em&gt; leva 100 gerações, enquanto para encontrar o máximo do seno leva 300. Nada que a minha máquina não resolva numa fracção de segundo.&lt;br /&gt;Para problemas mais sérios terei mais tarde que um número máximo de iterações, o problema é que ainda não consegui descobrir como pôr o WS a devolver não apenas o vector população mas também esse valor, representado por &lt;em&gt;m. &lt;/em&gt;É algo que terei que descobrir como se faz, tal como também mandar o vector população como deve ser com uma representação em array adequada de acordo com os standards do SOAP, e não a forma feita em cima do joelho, usando uma string. São ideias para desenvolver mais tarde, por enquanto interessa-me começar a desenvolver o trabalho no sentido de ficar o mais parecido com o que se pretende no enunciado do trabalho, mesmo que esteja implementado com coisas feitas em cima do joelho...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112388660231582324?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112388660231582324/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112388660231582324' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112388660231582324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112388660231582324'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/08/j-entrega.html' title='Já entrega...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112378285208515356</id><published>2005-08-11T18:39:00.000+01:00</published><updated>2005-08-11T21:57:27.873+01:00</updated><title type='text'>Finalmente alguma coisa a funceminar...</title><content type='html'>Enfim, finalmente e após cerca de três semanas de férias e algumas dores de cabeça consegui desencalhar do ponto de não progressão em que estava também porque nos últimos tempos considerava que também estava de férias de forma que não estava a adiantar nenhum, e por outro lado também tenho ocupado os tempos com o meu vício quando não tenho mais nada para fazer - jogar &lt;a href="http://www.blizzard.com/war3/"&gt;Warcraft 3&lt;/a&gt;.&lt;br /&gt;A minha dificuldade estava em fazer a coisa mais simples possível, que era pôr o Axis a devolver um vector população simples, através do uso de uma função também simples, que devolvia um array de floats e o mandava para o cliente, que a única coisa era simplesmente imprimir depois o conteúdo do vector que recebesse. Claro que estou a proceder ao desenvolvimento e teste na própria máquina (localhost), mas a minha maior dificuldade era a respeito de como transmitir o referido vector população através da rede. Como os Web Services utilizam SOAP para comunicar informação, e é baseado em XML, a dificuldade estava na forma como definir esse vector população de forma a ser transferido usando SOAP, ou seja, de que forma o vector população devia ser codificado em termos de SOAP de forma a ser transmitido efectivamente.&lt;br /&gt;Aqui residia o maior problema, uma vez que o vector de população é um vector de números não inteiros e dessa forma teria de especificar um array quanto muito de double's. Acontece no entanto que o "array de float" não está nos tipos predefinidos que podem ser usados facilmente durante a descrição do serviço através do ficheiro WSDL. Eu julgava que o WSDL fosse a "base de tudo" para começar a definir os serviços a partir daí, mas afinal acabou por não ser assim.&lt;br /&gt;&lt;br /&gt;O primeiro &lt;a href="http://blog.digfish.org/upload/webservcga.wsdl"&gt;ficheiro WSDL que eu defini&lt;/a&gt;, que foi feito à "pata", através de exemplos no &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0672326418/002-4229972-7472853?v=glance"&gt;livro que ando a seguir&lt;/a&gt;, e de uns quantos mais, dava sempre erro quando eu tentava fazê-lo passar no &lt;a href="http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL"&gt;WSDL2Java&lt;/a&gt;, que gera o código JAVA necessário para a implementação do Web Service de forma imediata tendo por partida apenas o WSDL e estava a usar esta ferramenta para não só gerar o código mas também verificar a síntaxe do WSDL. Acontece que estava sempre a falhar no momento em procedia a este último teste. Fartei-me de fazer aquilo manualmente e acabei por felizmente, após busca na net, &lt;a href="http://www.capescience.com/soa/index.shtml"&gt;um programa em JAVA chamado SOA Editor que permite rapidamente escrever o WSDL sem problemas&lt;/a&gt;. Daí a nada, tinha o WSDL que semprei quis ter, e finalmente o WSDL2Java gerou o tão ansiado código que já tinha perdido as esperanças alguma vez de o ver a conseguir obter.&lt;br /&gt;Acontece depois que estive a ler o código gerado e não me agradou muito aquilo que vi, em vez de ser uma coisa simples por onde podia começar, era um código complexo, pronto para usar por pessoas já entendidas no assunto.&lt;br /&gt;Não sabendo o que fazer com aquilo, desisti de usar o WSDL e andei nos últimos 10 dias a tentar encontrar uma solução simples que me permitisse enviar facilmente o vector população.&lt;br /&gt; Sempre achei que o problema devesse estar no array de float's que tinha de definir como um "XML Schema" incorporado dentro do WSDL (no elemento &lt;types&gt;).&lt;br /&gt; Ou não estava a definir muito bem, porque não percibia muieo disso, ou era o código gerado que não era suficiente esclarecedor. De modo que resolvi o problema da seguinte forma: para poder evitar estar a usar tipos não predefinidos, decidi representar o vector população sob a forma de uma string em que cada elemento do vector é separado do seguinte por ";". Desta forma simplificava a minha vida, e por outro lado, decidi trocar os números decimais por inteiros,  uma vez que cada posição do vector população no caso dos números decimais representa a frequência relativa de uma alelo para aquele locus em toda a população, eu podia usar perfeitamente números inteiros, que representavam as frequências absolutas. E, ainda outra simplificação, omiti o parâmetro &lt;em&gt;m&lt;/em&gt;, que indica o número de iterações a serem executadas entre cada "envio" do vector população ao servidor. Tudo para bem da simplicidade e da autodidáctica. E no fim, lá consegui, seguindo a par os &lt;a href="http://ws.apache.org/axis/java/user-guide.html"&gt;exemplos patentes no manual do Axis&lt;/a&gt; e sem precisar de WSDL nenhum (aliás, o Axis gera-o automaticamente para o caso de ser necessário!) lá consegui finalmente ver o vector população enviado pelo servidor a ser recebido pelo cliente!&lt;br /&gt;Depois pus o cliente a enviar para o servidor o vector população, também o recebia perfeitamente!&lt;br /&gt;Agora o que me falta fazer é começar a pôr cada cliente a trabalhar em cada vector população que lhe é enviado. Começo no entanto a dar com um problema, todos os exemplos simples que tenho tentado, como contar o número de bits a 1 num cromossoma, encontra extremos num intervalo de uma função real de variável real, ou usar "traps", são problemas que se resolver num abrir e fechar de olhos e, de facto, não são nada úteis para testar a potência do trabalho. Tenho que encontrar um problema que seja realmente útil e bastante apelativo e que possa ser resolvido através da aplicação do meu projecto. A questão vai ser encontrá-lo. Mas, por enquanto, importa não pôr a carroça à frente dos bois e vou pensar em pôr tudo o que for Web Services a funcionar! Desejem-me sorte !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112378285208515356?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112378285208515356/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112378285208515356' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112378285208515356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112378285208515356'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/08/finalmente-alguma-coisa-funceminar.html' title='Finalmente alguma coisa a funceminar...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-112264069368060448</id><published>2005-07-29T13:25:00.000+01:00</published><updated>2005-08-09T16:54:52.406+01:00</updated><title type='text'>Mas que raio é WSDL ?</title><content type='html'>WSDL, é de acordo com o &lt;A href="http://www.w3schools.com/wsdl/default.asp"&gt;tutorial patente nos W3Schools&lt;/A&gt;, &lt;em&gt;Web Services Description Language&lt;/em&gt;, e serve para descrever em detalhe e pormenor todas as características de um Web Services, o protocolo de suporte para transmissão da informação (HTTP,SMTP,etc), quais os parâmetros necessários para invocar o Web Service (WS), assim como os parâmetros de retorno esperados. Ao fim e ao cabo, o WS pode ser visto como se fosse uma função de Linguagem de Programação, sendo que nós (o cliente) temos que pedir com o nome do WS e os parâmetros necessários (ou sem eles, como acontece num caso concreto em que estou a trabalhar), sendo-nos facultada uma resposta pedida.&lt;br /&gt;Por exemplo, podemos ter um WS que devolva a data actual, e vamos imaginar que o WS se chama &lt;em&gt;GetDate&lt;/em&gt;. Como é natural, não são necessários quaisquer parâmetros neste caso, e o nosso programa-Cliente cria uma mensagem SOAP para ser enviada por HTTP para o Fornecedor do WS (que vou designar por WSP, do inglês &lt;em&gt;Web Service Provider&lt;/em&gt;). Este último, deve então, enviar, também através de SOAP, a informação requerida. Ora, então, o WSDL é o ficheiro que descreve em XML tudo que acabei de descrever.&lt;br /&gt;Aqui fica um WSDL simples para o exemplo que estive a referir, supondo que o URL do WSP é http://www.getdate.com/getDate/ (não usem este endereço porque ele não existe é claro!)&lt;br /&gt;&lt;PRE&gt;&lt;SPAN style="quote"&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;definitions&lt;br /&gt;    name=&amp;quot;WebServCGA&amp;quot;&lt;br /&gt;    targetNamespace=&amp;quot;http://www.getdate.com/getdate&amp;quot;&lt;br /&gt;    xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot;&lt;br /&gt;    xmlns:tns=&amp;quot;http://www.getdate.com/getdate/getdate.wsdl&amp;quot;&lt;br /&gt;    xmlns:wsdl=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot;&lt;br /&gt;    xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;MESSAGE name = &amp;quotgetDateRequest&amp;quot&amp;gt;&lt;br /&gt;&amp;lt;/MESSAGE&amp;gt;&lt;br /&gt;&amp;lt;MESSAGE name = &amp;quotgetDateResponse&amp;quot&amp;gt;&lt;br /&gt;     &amp;lt;PART name = &amp;quotdate&amp;quot type = &amp;quotxsd:dateTime&amp;quot &amp;gt;&lt;br /&gt;&amp;lt;/MESSAGE&amp;gt;&lt;br /&gt;&amp;lt PORTTYPE name=&amp;quotgetDatePortType&amp;quot &amp;gt;&lt;br /&gt;&amp;lt;OPERATION name=&amp;quotgetDateOperation&amp;quot&amp;gt;&lt;br /&gt;    &amp;lt;INPUT message=&amp;quotgetDateRequest&amp;quot /&amp;gt;&lt;br /&gt;    &amp;lt;OUTPUT message=&amp;quotgetDateResponse&amp;quot /&amp;gt;&lt;br /&gt;&amp;lt;/OPERATION&amp;gt;&lt;br /&gt;&amp;lt/PORTTYPE&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;binding name=&amp;quot;getdateBinding&amp;quot; type=&amp;quot;tns:getdatePortType&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;soap:binding style=&amp;quot;document&amp;quot; &lt;br /&gt;&lt;br /&gt;transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;operation name=&amp;quot;getDateOperation&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;soap:operation&lt;br /&gt;                soapAction=&amp;quot;http://www.getdate.com/getdate/&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;input&amp;gt;&lt;br /&gt;                &amp;lt;soap:body parts=&amp;quot;&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/input&amp;gt;&lt;br /&gt;            &amp;lt;output&amp;gt;&lt;br /&gt;                &amp;lt;soap:body parts=&amp;quot;&amp;quot; use=&amp;quot;literal&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/output&amp;gt;&lt;br /&gt;        &amp;lt;/operation&amp;gt;&lt;br /&gt;    &amp;lt;/binding&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;service name=&amp;quot;getdate&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;port binding=&amp;quot;tns:getdateBinding&amp;quot; name=&amp;quot;getdatePort&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;soap:address location=&amp;quot;http://www.getdate.com/getdate&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/port&amp;gt;&lt;br /&gt;    &amp;lt;/service&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/definitions&amp;gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;De acordo com o que ficou antes expresso, podemos olha para os elementos MESSAGE&lt;br /&gt;como especificando cada uma das "funções" de que o WS é composto, ou melhor: a função&lt;br /&gt; de que podíamos pensar como analogia de acordo com o exemplo acima, é partida em&lt;br /&gt; duas: uma para enviar (GetDateRequest) e outra para receber (GetDateResponse).&lt;br /&gt;&lt;br /&gt;Estas duas partes são "incorporadas" numa OPERATION, que especifica qual a MESSAGE de INPUT e qual a de OUTPUT. O elemento PORTTYPE permite incorporar várias OPERATIONs (se houver mais do que uma). Os PORTTYPE caracterizam o WS em abstracto, coisa que o BINDING se encarrega de fazer em concreto, ao especificar através do protocolo SOAP o meio através do qual o WS é transmitido. Finalmente, o SERVICE permite especificar qual o URL através do qual o WSP pode ser acedido, isto partindo do princípio que estamos a transmitir SOAP sobre HTTP, que é, aliás, o mais frequente.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-112264069368060448?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/112264069368060448/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=112264069368060448' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112264069368060448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/112264069368060448'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/07/mas-que-raio-wsdl.html' title='Mas que raio é WSDL ?'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-111885349037906507</id><published>2005-06-15T17:37:00.000+01:00</published><updated>2005-06-16T19:01:16.093+01:00</updated><title type='text'>Mas o que raio é SOAP (I) ?</title><content type='html'>&lt;IMG src="http://img53.echo.cx/img53/3203/soappackage6pq.jpg" border="0" align="right" /&gt;&lt;br /&gt;Para quem anda a iniciar-se no fantástico mundo dos Web Services, começa a levar com uma "palete" de siglas e acrónimos, dos quais os que sobressaem mais são dois: WSDL e SOAP. Sobre WSDL vou-me debruçar num artigo seguinte, por enquanto vou ocupar-me do SOAP. Ao contrário do que se possa pensar, SOAP não tem nada a ver com "sabão", mas provavelmente foi escolhido com o propósito de ficar com um signficado sugestivo. SOAP quer dizer &lt;i&gt;Simple Object Access Protocol&lt;/i&gt; e é um protocolo baseado em XML, tal como todos os protocolos que se usam nos Web Services. Este protocolo foi criado para definir as mensagens que os Web Services usam . Apesar de usar XML, e por via disso vir num formato de texto que é legível por seres humanos, tal permite a sua flexibilidade e extensibilidade a toda uma variedade de necessidades diferentes. A mensagem SOAP é constituída por duias partes: um "envelope" que define toda a mensagem e que se separa em duas partes: &lt;b&gt;Cabeçalho&lt;/b&gt; (Headers) e &lt;b&gt;Corpo&lt;/b&gt; (Body).&lt;br /&gt;&lt;br /&gt;Um pequeno exemplo do que pode ser o aspecto duma mensagem SOAP aparece de seguida:&lt;br /&gt;&lt;br /&gt;&lt;DIV style="border-style: outset;color=black;background=yellow"&gt;&lt;span style="font-family:courier new;font-size:90%;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;SOAP-ENV:&lt;b&gt;Envelope&lt;/b&gt;&lt;br /&gt;&lt;SPAN style="background-color:#00FFFF "&gt;&lt;br /&gt;   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&lt;br /&gt;   xmlns:xsd="http://www.w3.org/2001/XMLSchema"&lt;br /&gt;   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&lt;br /&gt;   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;br /&gt;&lt;SPAN style="background-color:#FF00FF "&gt;&lt;br /&gt;   &amp;lt;SOAP-ENV:&lt;b&gt;Body&lt;/b&gt;&amp;gt;&lt;br /&gt;      &amp;lt;doCheck&amp;gt;&lt;br /&gt;         &amp;lt;arg0 xsi:type="xsd:string"&amp;gt;947-TI&amp;lt;/arg0&amp;gt;&lt;br /&gt;         &amp;lt;arg1 xsi:type="xsd:int"&amp;gt;1&amp;lt;/arg1&amp;gt;&lt;br /&gt;      &amp;lt;/doCheck&amp;gt;&lt;br /&gt;   &amp;lt;/SOAP-ENV:Body&amp;gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;br /&gt;&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;O cabeçalho contém normalmente informação sobre os XML Schemas&lt;br /&gt;que definem os namespaces em utilização na mensagem e o corpo&lt;br /&gt;contém a informação propriamente dita.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-111885349037906507?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/111885349037906507/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=111885349037906507' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111885349037906507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111885349037906507'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/06/mas-o-que-raio-soap-i_15.html' title='Mas o que raio é SOAP (I) ?'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-111430129364838744</id><published>2005-04-24T00:40:00.000+01:00</published><updated>2005-04-24T01:08:13.650+01:00</updated><title type='text'>Para que servem os web services (parte 2)</title><content type='html'>&lt;img src="http://img44.echo.cx/img44/9665/webservices7fu.jpg" align="right" /&gt; Um bom exemplo para ajudar a perceber o que são e para que servem os Web Services era por exemplo o caso que se quiséssemos directamente o serviço de pesquisa de sites do Google no nosso site, tipo mostrar os resultados do Google na nossa página directamente usando algum assunto que estivesse relacionado com o conteúdo da página. Assim, por exemplo, poderíamos estar interessados em fazer uma pesquisa intensiva no Google para saber o nosso pagerank, ou para saber qual a ordem em que o nosso site, aparecia no nosso site. Poderíamos usar scripts em PHP que fizessem isso, de forma automática, a executar de x em x tempo através do uso do Crontab e podia-se também mandar os resultados para uma base de dados, para mais tarde poder fazer comparação de dados ao longo do tempo, como por exemplo saber como estaria a evoluir o nosso site ao longo do tempo na ordem de resultados do Google. Mas de um momento para o outro os webmasters do Google decidiam mudar o design (que na realidade não tem mudado muito nos últimos anos!!!) da página de resultados. Então, chapéu, os nossos scripts que estavam a fiar-se no anterior design do Google deixariam pura e simplesmente de funcionar, e lá teríamos de andar sempre atrás da vontade dos webmasters do Google, quando eles quisessem mudar a estrutura lá nós teríamos que fazer isso. Tudo isto dá para ter uma ideia até que ponto o HTML é imperfeito, uma vez que se trata de uma linguagem orientado para a formatação de páginas para leitores humanos e não é ideal como suporte para a transmissão pura e simples de informação. É aqui que entra em jogo o XML como veículo ideal para a transmissão de informação sem quaisquer preocupações no que toca à apresentação.&lt;br /&gt;Na realidade, se nós quisermos usar o Google para apresentar os seus resultados na nossa página tal já existe: são as &lt;a href="http://www.google.com/apis/"&gt;Web APIs do Google&lt;/a&gt;, se bem que ainda em fase experimental, estando limitada se não me engano ao máximo de 100 acessos por dia, com isso já podemos mostrar os resultados do Google na nossa página sem quaisquer encargos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-111430129364838744?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/111430129364838744/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=111430129364838744' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111430129364838744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111430129364838744'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/04/para-que-servem-os-web-services-parte.html' title='Para que servem os web services (parte 2)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-111421692341459108</id><published>2005-04-23T01:09:00.000+01:00</published><updated>2005-04-23T01:42:03.416+01:00</updated><title type='text'>Para que servem Web Services (parte 1)</title><content type='html'>Após a leitura completa do primeiro capítulo do &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0672326418/002-9985643-4826416?v=glance"&gt;livro&lt;/a&gt; que referi no post anterior, deu para ter uma ideia bem... para falar a sério, no meio de tamanho emaranhado teórico, blablah e esquemas deu para perceber algumas coisas importantes, que me afloram neste momento à mente, acima de outras:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;os web services são úteis para interligar toda uma panóplia de serviços que, de outra maneira não seria possível. Deste modo, é possível usar Web Services para as mais variadas utilizações, que podem perfeitamente interagir através do uso de uma interface que é facilmente descrita usando o WSDL, que é comunicado aos clientes.&lt;/li&gt;   &lt;li&gt;para os potenciais clientes dos Web Services, existe um serviço tipo "páginas amarelas" ou directório, que permite a interligação entre todo o manancial de Web Services existentes na Internet. Foi desenvolvido um &lt;a href="http://en.wikipedia.org/wiki/UDDI"&gt;sistema chamado UDDI&lt;/a&gt;, especificamente para esse efeito&lt;/li&gt;   &lt;li&gt;Os Web Services podem ser clientes de outros Web Services, e graças ao Web Services Registries, é possível, vamos imaginar, que quando um Web Service deixe de estar disponível, seja imediatamente substituído por outro ofereça uma função semelhante&lt;br /&gt; &lt;/li&gt;   &lt;li&gt; Oferecendo uma interface comum, que é descrita em XML, uma vez que é um formato de texto facilmente legível por humanos e de fácil edição, é sem dúvida o principal responsável por essa universalidade dos Web Services.&lt;/li&gt;   &lt;li&gt;Os Web Services podem utilizar não apenas o protocolo HTTP para a sua distribuição, mas também muito bem usar outros protocolos como o FTP e o SMTP.&lt;br /&gt; &lt;/li&gt; &lt;/ul&gt; A ver bem, o JAVA é mesmo a linguagem de eleição para usar Web Services, porque graças à sua quase universalidade a nível de suporte, permite que praticamente todas as plataformas como Sistemas operativos ou arquitecturas possam interagir entre si.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-111421692341459108?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/111421692341459108/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=111421692341459108' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111421692341459108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111421692341459108'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/04/para-que-servem-web-services-parte-1.html' title='Para que servem Web Services (parte 1)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-111305499629795418</id><published>2005-04-09T14:13:00.000+01:00</published><updated>2005-04-09T15:04:10.716+01:00</updated><title type='text'>O projecto não acabou ... :)</title><content type='html'>&lt;a href="http://img25.exs.cx/my.php?loc=img25&amp;image=javawsbook9dw.gif" target="_blank"&gt;&lt;br /&gt;&lt;img src="http://img25.exs.cx/img25/8884/javawsbook9dw.th.gif" border="0" align="right" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Estou a mandar este post cerca de um mês após o último post. Só para dizer que o meu projecto não acabou, tem andado "emperrado" por culpa de ter ainda duas disciplinas para além do projecto, nomeadamente Inteligência Artificial (que ficou pendurada do ano passado) e Programação Funcional e Lógica. Também pudera, devido à grande complexidade dos Web Services em Java e mais propriamente do engine Axis, atraves do qual são "distribuídos" os Web Services. Entretanto, pelo meio, arranjei, através do meu orientador, &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0672326418/002-4229972-7472853?v=glance"&gt;este livro&lt;/a&gt;, dos autores do Axis, e que, por aquilo que já vi, espero que me venha auxiliar bastante na elaboração do projecto. Até agora, por aquilo que já li, não fiquei nada aborrecido na escolha do livro, o problema está sobretudo relacionado com a quantidade de conceitos que eu terei de adquirir para me poder lançar no projecto, é que isto dos Web Services joga com tanta coisa, é com cada sigla maluca: XML, XML-RPC, SOAP, WSDL, UDDI, JWS, JSP . Vamos a ver como me desenrasco disto tudo! Desejem-me sorte! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-111305499629795418?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/111305499629795418/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=111305499629795418' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111305499629795418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/111305499629795418'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/04/o-projecto-no-acabou.html' title='O projecto não acabou ... :)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110964159671758877</id><published>2005-03-01T01:34:00.000Z</published><updated>2005-03-01T01:46:36.720Z</updated><title type='text'>Uma menção honrosa ;)</title><content type='html'>Qual não foi o meu espanto hoje quando recebi uma mensagem do meu orientador dizendo que o meu blog, tinha sido encontrado pelo grande David Goldberg, talvez um dos nomes que vem logo à cabeça de quando se fala de Algoritmos Genéticos, a par de David Holland, encontrou o meu blog, enquanto andava na net, e colocou &lt;a href="http://illigal.blogspot.com/2005/02/catching-portugese-digital-fish.html"&gt;esta referência&lt;/a&gt; no blog do IlliGAL (&lt;em&gt;Illinois Genetic Algorithms Laboratory &lt;/em&gt;, em português, Laboratório de Algoritmos Genéticos da Universidade de Illinois). Só tive pena é de realmente o meu blog não ter nada em inglês, mas quando eu tive a ideia de conceber este blog, fi-lo apenas com a intenção que ele servisse como uma forma dos meus colegas e outros potenciais interessados podessem ir acompanhando o decorrer do meu trabalho. Não sei, mas a possibilidade de fazer em inglês não deixa de ser uma hipótese, mas não tenho grande vocação para me expressar na língua de Shakespeare (percebo perfeitamente inglês, agora para mim expressá-lo a conversa é completamente diferente!), e isso por outro lado, ia de certo modo contra a intenção original com que criei este blog. Mas realmente, talvez comece a considerar a hipótese de começar a fazer alguns post's em inglês, isto se o meu blog começar a despertar interesse não só entre os meus colegas, como em geral toda a Internet. Vamos ver o que o tempo dirá :).&lt;br /&gt;Aproveito para referir que o IlliGAL, que é o laboratório onde o prof. Lobo andou a trabalhar nos Estados Unidos (assim como o meu colega Cláudio Lima, que está a tirar o doutoramento esta área), também possui o seu próprio &lt;a href="http://illigal.blogspot.com/"&gt;blog&lt;/a&gt;, apesar de ser um tanto recente, mas é bastante intessante, porque ele tenta dá um apanhado de tudo o que vai encontrando na net e que tem a ver com a aplicação dos algoritmos genéticas. Deixe também um link para a &lt;a href="http://www-illigal.ge.uiuc.edu/"&gt;home page do IlliGAL&lt;/a&gt;. Eu só gostava de saber era onde eles se lembraram de ir criar esta sigla :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110964159671758877?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110964159671758877/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110964159671758877' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110964159671758877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110964159671758877'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/03/uma-meno-honrosa.html' title='Uma menção honrosa ;)'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110954383292806100</id><published>2005-02-27T22:05:00.000Z</published><updated>2005-02-27T22:37:12.933Z</updated><title type='text'>Ponto de não progressão!</title><content type='html'>Pois é, desde que iniciei em termos efectivos o projecto desde já quase há um mês (5 de Fevereiro) atingi um ponto que se pode considerar como de não progressão, e isto porque, apesar do código do CGA já estar num nível que eu poderei considerar de certo modo aceitável -com uma nova classe MyRandom para gerar numeros aleatórios inspirado num código em C++ que me foi cedido pelo meu orientador e que se baseia em grande parte neste artigo da ACM - &lt;a href="http://portal.acm.org/citation.cfm?id=63042"&gt;&lt;em&gt;Random number generators: good ones are hard to find&lt;/em&gt;&lt;/a&gt;, da autoria de S. K. Park e K. W. Miller. O problema agora trata-se de experimentar pela primeira vez os Web Services, e o que eu quero fazer pela primeira é uma coisa mínima, fazer com que um cliente (&lt;em&gt;worker&lt;/em&gt;, melhor dizendo) descarregue um vector-população a partir do &lt;em&gt;manager&lt;/em&gt;, mas para conseguir fazer isso vou ter que mexer em classes de JAVA como a &lt;a href="http://java.sun.com/xml/jaxrpc/overview.html"&gt;JAX-RPC&lt;/a&gt;, que, como de acordo com o que está no &lt;em&gt;link&lt;/em&gt; anterior, se trata de uma biblioteca de JAVA que permite evitar ao programador o acesso directo ao protocolo SOAP. Como ainda não estudei a fundo a API do XML-RPC, não posso estar por aqui a dar detalhes. Tenho andado a tentar seguir este &lt;a href="http://java.sun.com/webservices/docs/1.3/tutorial/doc/index.html"&gt;tutorial&lt;/a&gt;, que se baseia no TomCat, ao contrário do &lt;a href="http://java.sun.com/webservices/docs/1.5/tutorial/doc/index.html"&gt;último&lt;/a&gt;, que usa ao invés um webserver qualquer da Sun, que já tive oportunidade de experimentar e que é muito pesado, por isso optei por não o seguir, não se fiz mal, mas as diferenças não são grandes. O problema é que os passos descritos são para ser usados para o caso em que se usa directamente o TomCat directamente para implementar os Web Services, e não por intermédio do Axis, como pretendia inicialmente. O problema é que ainda não encontrei um tutorial de Axis verdadeiramente condigno que me explicasse as coisas são assim, assim e assado, e tens que fazer estes passos para chegar lá. Só encontrei &lt;a href="http://www.ammai.com/modules.php?op=modload&amp;name=Sections&amp;amp;amp;file=index&amp;req=printpage&amp;amp;artid=4"&gt;um&lt;/a&gt; que me explicava as coisas, mas tratava-se de usar ficheiros JWS, que são no entanto Web Services demasiado básicos para o meu gosto e que no fundo parecem mais receitas rápidas para demonstrar que o &lt;em&gt;Axis&lt;/em&gt; funciona, do que bons exemplos que permitam Web Services mais complexos e aceitáveis. Por isso, que pelos vistos, vou ter que fazer um meio-termo entre o tutorial da Sun e o &lt;a href="http://ws.apache.org/axis/java/user-guide.html"&gt;manual do Axis &lt;/a&gt;. O Axis permite simplificar a vida, permitindo gerar o código JAVA directamente a partir do WSDL, graças à ferramenta &lt;a href="http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL"&gt;WSDL2Java&lt;/a&gt;, existindo também a recíproca, &lt;a href="http://ws.apache.org/axis/java/user-guide.html#Java2WSDLBuildingWSDLFromJava"&gt;Java2WSDL&lt;/a&gt; . Para além de tudo isto, ainda por cima, chega finalmente a 3ª semana do 2º semestre, em que acho que o "2º semestre" vai começar a doer, em que as disciplinas de &lt;a href="http://www.sep.ualg.pt/horarios/disciplinas.phtml?disciplina=IAr&amp;var=&amp;ano_lectivo=2004/2005&amp;numero_ordem=2&amp;tipo_periodo=S"&gt;Inteligência Artificial &lt;/a&gt;e &lt;a href="http://www.sep.ualg.pt/horarios/disciplinas.phtml?disciplina=PFL&amp;var=&amp;ano_lectivo=2004/2005&amp;numero_ordem=2&amp;tipo_periodo=S"&gt;Progtamação Funcional e Lógica &lt;/a&gt;me vão dar água pela barba que chegue!!! De modo que acho, que se isto começar a dar problemas, o projecto vai ter que ficar em banho maria!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110954383292806100?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110954383292806100/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110954383292806100' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110954383292806100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110954383292806100'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/ponto-de-no-progresso.html' title='Ponto de não progressão!'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110900674117331228</id><published>2005-02-21T17:25:00.000Z</published><updated>2005-02-21T17:25:41.173Z</updated><title type='text'>Mas que raio de WSDL...</title><content type='html'>Agora que j&amp;aacute; consegui realizar uma primeira implementa&amp;ccedil;&amp;atilde;o do CGA em JAVA, falta interligar com a outra parte do projecto e que tenho vindo a aprender por custo pr&amp;oacute;prio aos poucos: fazer o algoritmo gen&amp;eacute;tico circular pela rede, ou seja, p&amp;ocirc;r clientes a trabalhar num vector popula&amp;ccedil;&amp;atilde;o e criar um servidor que gira (de gerir) o trabalho de todos os clientes, distribuindo por todos os clientes o vector popula&amp;ccedil;&amp;atilde;o que necessitam para por o CGA a trabalhar. Basicamente, trata-se de uma arquitectura "worker-manager" que &amp;eacute; explicada neste &lt;a href="http://w3.ualg.pt/~flobo/papers/gecco04-pcga-lbp.pdf"&gt;artigo&lt;/a&gt;. Tenho, portanto, de p&amp;ocirc;r um &lt;i&gt;manager&lt;/i&gt; (ou servidor) e &lt;i&gt;workers&lt;/i&gt; (ou clientes) a comunicarem entre si atrav&amp;eacute;s de Web Services. E para definir Web Services &amp;eacute; necessario criar um ficheiro XML que descreva os Web Services atraves de um formato conhecido por &lt;a href="http://www.w3schools.com/w3c/w3c_wsdl.asp"&gt;WSDL&lt;/a&gt;. Atraves deste formato sao descritas coisas como o nome da API (fun&amp;ccedil;&amp;atilde;o), como os seus par&amp;acirc;metros, o seu tipo assim como o tipo de retorno da fun&amp;ccedil;&amp;atilde;o que o cliente necessita de invocar do motor de Web Services (eu chamo-lhe &lt;i&gt;motor&lt;/i&gt; porque &amp;eacute; um m&amp;oacute;dulo que roda num servidor Web, ou seja, &amp;eacute; um componente do servidor e n&amp;atilde;o um servidor por si pr&amp;oacute;prio, que neste caso concreto &amp;eacute; o Apache Axis). Deste modo, &amp;eacute; definida uma interface do Web Service (WS), que pode ser explorada por toda uma diversidade de clientes, escritos nas mais variadas linguagens. Pois &amp;eacute; assim mesmo que deve ser: uma vez que na Internet coexistem a mais diversas plataformas e linguagens, um formato universal que permita descrever a interface do WS de modo que permita que qualquer cliente o possa utilizar. De modo que neste momento as d&amp;uacute;vidas &amp;eacute; que se p&amp;otilde;em est&amp;atilde;o relacionadas sobre quais devem ser as APIs a utilizar, eu pensei nas seguintes, n&amp;atilde;o sei se ser&amp;atilde;o as melhores, mas em minha opini&amp;atilde;o acho que n&amp;atilde;o desagradam:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;DownloadPopulationVector&lt;/u&gt; - o &lt;i&gt;worker&lt;/i&gt; pede ao &lt;i&gt;manager&lt;/i&gt; um vector popula&amp;ccedil;&amp;atilde;o com o qual possa come&amp;ccedil;ar a trabalhar. Este passo &amp;eacute; feito no princ&amp;iacute;pio por um novo &lt;i&gt;worker&lt;/i&gt; disposto a iniciar um novo trabalho ou ent&amp;atilde;o na ocasi&amp;atilde;o em que estando completo o trabalho depois de cumpridas &lt;i&gt;&lt;b&gt;m&lt;/b&gt;&lt;/i&gt; itera&amp;ccedil;&amp;otilde;es do algoritmo - que &amp;eacute; por outro lado, um par&amp;acirc;metro da resposta enviada pelo &lt;i&gt;manager&lt;/i&gt; ao &lt;i&gt;worker&lt;/i&gt; quando &amp;eacute; descarregado o vector popula&amp;ccedil;&amp;atilde;o para o &lt;i&gt;worker&lt;/i&gt; - de modo que o &lt;i&gt;worker&lt;/i&gt; possa saber quando a fase presente de trabalho terminou e pode enviar o resultado obtido para o &lt;i&gt;manager&lt;/i&gt;. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;u&gt;SendPopulationVector&lt;/u&gt; - o &lt;i&gt;worker&lt;/i&gt; completou finalmente o seu trabalho e est&amp;aacute; disposto a enviar o vector popula&amp;ccedil;&amp;atilde;o &lt;u&gt;apenas com as diferen&amp;ccedil;as&lt;/u&gt; entre o &amp;uacute;ltimo vector popula&amp;ccedil;&amp;atilde;o que recebeu do &lt;i&gt;manager&lt;/i&gt; e o estado em que ficou o VP (vector popula&amp;ccedil;&amp;atilde;o) depois de cumpridas as tais &lt;b&gt;&lt;i&gt;m&lt;/i&gt;&lt;/b&gt; itera&amp;ccedil;&amp;otilde;es estabelecidas pelo &lt;i&gt;manager&lt;/i&gt;. A esta solicita&amp;ccedil;&amp;atilde;o o &lt;i&gt;manager&lt;/i&gt; deve responder - depois de verificar se o VP j&amp;aacute; atingiu alguem crit&amp;eacute;rio que permita terminar o algoritmo -  com uma resposta que informe a conclus&amp;atilde;o do trabalho ou ent&amp;atilde;o. No caso da resposta ser negativa, ou seja que o VP ainda n&amp;atilde;o convergiu, ent&amp;atilde;o o cliente tem o dever de invocar a API anterior para que possa descarregar um novo VP e prosseguir o seu trabalho.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;At&amp;eacute; agora, &amp;eacute; este o "estado do arte", que, no entanto, ainda nem comecei a implementar!!! &amp;Eacute; apenas, por enquanto, e ainda, uma declara&amp;ccedil;&amp;atilde;o de inten&amp;ccedil;&amp;otilde;es.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110900674117331228?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110900674117331228/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110900674117331228' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110900674117331228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110900674117331228'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/mas-que-raio-de-wsdl_110900674117331228.html' title='Mas que raio de WSDL...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110876429001982746</id><published>2005-02-18T17:42:00.000Z</published><updated>2005-06-11T22:04:46.306+01:00</updated><title type='text'>Numeros aleatorios muito pouco aleatorios</title><content type='html'>Nos algoritmos em que ando a trabalhar, é indispensável o uso de números aleatórios durante para gerar a população inicial, ou no caso concreto do CGA, para gerar os cromossomas dos indivíduos que se confrontam. A utilização de um gerador fidedigno é essencial para o bom funcionamento. E o que deve ser um gerador &lt;em&gt;fidedigno&lt;/em&gt; ? Por poucas palavras, é um gerador em que, dado um determinado intervalo dentro do qual se pretenda obter os valores aleatórios, a probabilidade de sair um número é exactamente idêntica à de outro qualquer. Para melhor compreender estes assuntos, suponhamos um intervalo entre 0 e 1, dividido em 100 partes, assim em princípio, se pedirmos ao gerador para criar um número aleatório 100 vezes, a probabilidade de calhar um número em cada um desses intervalos é de 1%. Se forem 1000 vezes, a frequência absoluta é de 10 e 10000 de 100. Quanto maior for a amostragem, mais as probabilidades de cada intervalo se equilibram entre si.&lt;br /&gt;Deste modo, decidi correr um programa para decidir se o gerador era o mais fiável possível baseado no exemplo que descrevi acima, isto apesar de acordo, com a teoria, &lt;a href="http://portal.acm.org/citation.cfm?id=63042"&gt;geradores aleatórios perfeitos são coisas que não existem&lt;/a&gt;. Submeti então ao programa o gerador de números aleatórios baseados no &lt;a href="http://w3.ualg.pt/~flobo/sga/cpp/"&gt;código que o meu orientador me forneceu&lt;/a&gt;, assim como o &lt;a href="http://java.sun.com/j2se/1.3/docs/api/java/util/Random.html"&gt;gerador que vem com a biblioteca da Java&lt;/a&gt;.&lt;br /&gt;Deixo aqui uma imagem que ilustra o resultado do programa para algoritmo extraído do SGA e baseado no livro do Goldberg: &lt;IMG src="http://www.digfish.org/images-blog/grafico-myrandom2.jpg" align="center"&gt;&lt;br /&gt;&lt;br /&gt;Acho que se pode concluir que o gerador não é assim tão mau !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110876429001982746?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110876429001982746/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110876429001982746' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110876429001982746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110876429001982746'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/numeros-aleatorios-muito-pouco.html' title='Numeros aleatorios muito pouco aleatorios'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110834003547311142</id><published>2005-02-13T23:55:00.000Z</published><updated>2005-02-14T00:40:59.996Z</updated><title type='text'>Qual o melhor IDE ?</title><content type='html'>Como nestes próximos tempos vou estar bastante ocupado no projecto programando em JAVA, ando à procura de um &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDE (Integrated Development Environment)&lt;/a&gt; - ou Ambiente de Desenvolvimento Integrado, na língua de Camões - que me permita potenciar a produtividade, e para mim, os aspectos essenciais que me dão mais jeito são:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Em primeiro lugar, que me dê a capacidade de aceder à documentação de JAVA da forma mais rápida e eficiente possível sem ter que estar a perder tempo a perder tempo a fazer cliques para encontrar o documento referentre à classe da biblioteca de Java de que preciso.&lt;/li&gt;&lt;li&gt;Que seja initituitivo, isto é, que eu não ande perdido uma eternidade à procura como se faz uma "merdazinha" que se faz num instante num outro IDE a que eu já esteja acostumado&lt;/li&gt;&lt;li&gt;Permita detectar erros que normalmente não se detectam entquanto se está a escrever o código, isto que só são detectados em tempo de execução, ou seja.&lt;/li&gt;&lt;li&gt;Capacidade de auto-completar expressões bastante vulgares como por exemplo escrever automaticamente as duas expressões mais compridas e vulgares que existem em Java e que são:&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;public static void main(String[] args)&lt;br /&gt;{&lt;br /&gt;//...&lt;br /&gt;}&lt;/pre&gt;e&lt;br /&gt;&lt;pre&gt;System.out.println("blablabla");&lt;br /&gt;&lt;/pre&gt;&lt;li&gt;Eu sou uma pessoa que se chateia com facilidade com repetições, nem as posso ver à frente, e um IDE que me permita evitar chatices é um passo decisivo para entrar nos meus gostos.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Tenho andado a experimentar três IDEs: o &lt;a href="http://www.jcreator.com/"&gt;JCreator&lt;/a&gt;, o &lt;a href="http://www.netbeans.org"&gt;Netbeans&lt;/a&gt; e o &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;. De todos o que eu uso há mais tempo é o JCreator, pois é escrito em C++, tendo um tempo de arranque bem mais curto que os outros dois, é intuitivo e facilita imenso a navegação nos javadocs, mas não tem capacidade de detectar erros que normalmente só se encontram em tempo de execução, coisa que os outros dois IDEs - o Netbeans e o Eclipse - sabem fazer e bem. Por outro lado, estes dois últimos têm uma capacidade de integração com CVS bastante avançada (o JCreator só incluiu esta propriedade na última versão - a 3.5) e o NetBeans traz já integrado um editor ao estilo de Visual Basic para quem gosta de desenhar caixas, janelas e botões para o Swing (a biblioteca para criação de GUIs do Java), para não falar de trazer um servidor de JSP - o Tomcat. O Eclipse é que não traz de raíz um editor gráfico - mas essa falha pode-se corrigir, puxando o respectivo plug-in. Mas, falando a sério, o Eclipse não é editor exclusivo para JAVA, a sua extensibilidade é muito maior. Aliás o Eclipse, é de acordo com a IBM, que o criou e depois o libertou para o movimento open-source, um "meta-IDE", ou melhor, uma espécie de ambiente de criação de IDEs, uma vez que pode ser facilmente integrado com qualquer linguagem, havendo já plug-ins para C++, Perl, Python, Bash e PHP. É verdadeiramente um IDE "multi-plataforma". Apesar da grande sofisticação destes dois últimos IDE's, não estando em nada abaixo de IDEs mais profissionais e comerciais como o &lt;a href="http://msdn.microsoft.com/vstudio/"&gt;Visual Studio .NET da Microsoft&lt;/a&gt;, o preço a pagar por esse facto e por serem escritos em JAVA é o tempo de arranque e o gasto de recursos: tanto o NetBeans como o Eclipse são dois devoradores de memória e levam mais de um minuto a arrancar desde o momento que clico no icone até ser possível escrever alguma coisa. Quanto ao gasto de RAM, eles começam de mansinho nos 50 MB, mas dali a dez minutos já andam nos 100 MB. Não, recomendo, por isso, a utilização destes IDEs a quem tiver um computador mais lento que 1 GHz e menos de 256 MB de RAM (o meu tem 1800 GHz e 384 MB).&lt;br /&gt;Apesar de tudo, os IDEs baseados em JAVA tem a vantagem que é o grande slogan da linguagem criada pela Sun: &lt;i&gt;Compile one time, run everywhere&lt;/i&gt;, pode-se trabalhar em qualquer SO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110834003547311142?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110834003547311142/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110834003547311142' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110834003547311142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110834003547311142'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/qual-o-melhor-ide.html' title='Qual o melhor IDE ?'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110825185675642254</id><published>2005-02-12T23:44:00.000Z</published><updated>2005-02-12T23:58:14.856Z</updated><title type='text'>JGAP!</title><content type='html'>Quando andei na net à procura de possíveis problemas que possam ser resolvidos por meio de algoritmos genéticos, deparei-me com &lt;a href="http://jgap.sourceforge.net/index.html"&gt;este projecto&lt;/a&gt; hospedado no Sourceforge que dá pelo nome de JGAP (ou &lt;em&gt;JAVA Genetic Algorithms Package&lt;/em&gt;), uma biblioteca em JAVA que dá para ser utilizado livremente em qualquer outro projecto, desde que cumpra os requisitos da &lt;a href="http://jgap.sourceforge.net/index.html#license"&gt;licença&lt;/a&gt; estipulada no Web Site. Tive a experimentar como funcionava, experimentando com a mais simples das funções de Algortimos Genéticos, o &lt;em&gt;One-Max&lt;/em&gt; (que devolve o número de uns existentes num cromossoma) e funcionava. Engraçado é que aquilo, pelo menos porque tive oportunidade de ver a &lt;a href="http://jgap.sourceforge.net/javadoc/2.0"&gt;documentação&lt;/a&gt; ainda um tanto superficialmente não tem um critério de convergência para paragem do algoritmo quando for atingida a "melhor solução". Mas deve andar para lá. Aqui fica uma lista de &lt;a href="http://jgap.sourceforge.net/doc/references/References.html"&gt;trabalhos científicos&lt;/a&gt; que citam o JGAP. Deixo também um &lt;a href="http://jgap.sourceforge.net/doc/contrib/contributors.html"&gt;link para uma página que apresenta a equipa por trás do projecto&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110825185675642254?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110825185675642254/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110825185675642254' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110825185675642254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110825185675642254'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/jgap.html' title='JGAP!'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110816924792760630</id><published>2005-02-12T00:30:00.000Z</published><updated>2005-02-12T01:06:08.766Z</updated><title type='text'>CVS = Concurrent Versions System</title><content type='html'>Pois é ! Tenho andado a aproveitar estas férias que estão quase terminadas da melhor maneira ! Ando a aplicar-me e decidi finalmente embalar-me e tentar perceber que raio é isso que provavelmente alguns de vocês já terão tropeçado e que dá pelo nome de &lt;a href="https://www.cvshome.org/"&gt;CVS&lt;/a&gt;. Provavelmente alguns de vocês já depararam nisso enquanto estiveram a explorar algum IDE (Ambiente de Desenvolvmento) numa opção chamada "CVS". Pois bem: o CVS serve para que em empresas com equipas de vários programadores possam desenvolver em grupo diferentes porções do projecto comum em que estão envolvidos. Deste modo enquanto um colega edita um ficheiro A, outro programador pode estar a trabalhar no mesmo ficheiro e é usado um &lt;B&gt;repositório&lt;/B&gt; onde são guardadas todas as versões passadas e conhecidas de todos os ficheiros que alguma vez fizeram parte desse projecto. É possível também recuperar versões antigas de determinado ficheiro, se for caso disso. A mim isto interessa-me para o projecto porque assim posso estar a trabalhar nisso em qualquer lugar. Através de um repositório guardado no computador do laboratório 2.56 que me foi adjudicado, posso importar os ficheiros e trabalhar em qualquer outro computador da universidade, basta apenas ter um &lt;A href="http://www.gnu.org/software/cvs/"&gt;cliente de CVS&lt;/A&gt; instalado na máquina para onde desejo ir trabalhar. Por outro lado, é bom, porque dá um &lt;I&gt;aspecto profissional&lt;/I&gt; a toda a cena. O CVS é praticamente universal, sendo praticamente o software "standard" usado em todo o mundo por grupos de programação dedicadas a produção de software "a sério". O Sourceforge.net suporta CVS para todos os membros de um projecto, deixo aqui o &lt;a href="http://cvs.sourceforge.net/viewcvs.py/vnc-tight/"&gt;link&lt;/a&gt; para um dos projectos (o &lt;a href="http://www.tightvnc.com/"&gt;TightVNC&lt;/a&gt;) de maior saída e que são um bom exemplo daquilo que o Open Source é capaz. Deixo também aqui um link para o &lt;a href="http://cvs.php.net/"&gt;repositório do PHP&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110816924792760630?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110816924792760630/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110816924792760630' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110816924792760630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110816924792760630'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/cvs-concurrent-versions-system.html' title='CVS = Concurrent Versions System'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110807824247194103</id><published>2005-02-10T23:30:00.000Z</published><updated>2005-02-11T01:41:09.566Z</updated><title type='text'>Java server pages, SAAJ, JAX-RPC, tudo uma grande confusão...</title><content type='html'>Pois é, nestes últimos tenho-me aventurado pelo grande mundo das Java Server Pages (JSP). Para alguém, como eu, que vinha do PHP e, pensava que todos os geradores dinâmicos de páginas fossem todos do género da simplicidade do PHP para configurar e começar a programar vaiam tirando o cavalinho da chuva. Para correr JSP é necessário um web server próprio, para além, de é claro, uma máquina virtual java com compilador instalada na mesma máquina onde esteja a correr o servidor de JSP, que, no meu caso, é o &lt;a href="http://jakarta.apache.org/tomcat/"&gt;Apache Tomcat &lt;/a&gt;, e, uma vez por aquilo que li é, de entre todos os servidores de JSP, o mais chato de configurar porque é tudo feito via ficheiros do configuração, como o seu irmão mais velho, &lt;a href="http://httpd.apache.org/"&gt;o servidor Web Apache&lt;/a&gt; propriamente dito. Acontece que o Tomcat é &lt;em&gt;standalone&lt;/em&gt;, quer dizer, não depende da existência de outro servidor HTTP na mesma máquina, e corre numa porta própria: por defeito a 8080. É no entanto, possível interligar os dois através de dois módulos do Apache: um é o &lt;a href="http://httpd.apache.org/docs/mod/mod_proxy.html"&gt;mod_proxy&lt;/a&gt;, outro é o &lt;a href="http://jakarta.apache.org/tomcat/connectors-doc/"&gt;mod_jk&lt;/a&gt;. Um ou outro, como tive oportunidade de testar funcionam bem: o melhor é o segundo, porque foi especialmente desenvolvido para esse efeito.&lt;br /&gt;O problema é com Apache e Tomcat na mesma máquina o consumo na mesma máquina (eu testei em Windows) vai para cima dos 50 MB e o Tomcat como é escrito em JAVA, demora meio-minuto a arrancar completamente, mas depois, já de pé, não fica em nada atrás do Apache. O problema é que para depois tar a configurar aquilo tudo como deve de ser, não é nada simples para quem, como eu, está habituado ao "velho" Apache. As JSP é um mundo muito próprio que fala a sua própria língua.&lt;br /&gt;Assim, por exemplo, em JSP, e ao contrário do PHP em que só existe dois tipos de tags : &lt;strong&gt;&amp;lt;? ?&amp;gt;&lt;/strong&gt; e &lt;strong&gt;&amp;lt;?= ?&amp;gt;&lt;/strong&gt; no PHP existem até quatro, parecidas com ASP: &lt;strong&gt;&amp;lt;% %&amp;gt;&lt;/strong&gt;, &lt;strong&gt;&amp;lt;%= %&amp;gt;&lt;/strong&gt;, &lt;strong&gt;&amp;lt;%! %&amp;gt;&lt;/strong&gt;, e &lt;strong&gt;&amp;lt;%@ %&amp;gt;&lt;/strong&gt;. Enquanto as duas primeiras têm practicamente a mesma finalidade das que lhe são idênticas em PHP, as duas últimas são específicas, a terceira é para declarar código Java de forma livre e a última é para declarar directiva, do estilo de import's, ao que parece, ainda não naveguei nisto a fundo para perceber isto ? Mas para que raio eu preciso de saber isto tudo ? Acontece que estou pensando em escrever Web Services usando JAVA, daí que precise de usar JSP. O Axis, motor que eu pretendo usar sobre o Tomcat, é escrito em JSP, e posso vir a precisar de saber JSP para saber como escrever os Web Services. Ainda não sei como isso se faz, mas espero vir a saber.&lt;br /&gt;&lt;br /&gt;Entretanto, a implementação do CGA em JAVA vai "nos eixos": tem passado em quase todos os testes. Nem era de surpreender, dada a sua simplicidade, depois de usar o One-Max, a mais simples das funções em Algoritmos Genéticos, tentei experimentar com a Trap Function, mas acho que não sei muito bem como aquilo se define. Para determinar o máximo de funções reais de variável real é que tem funcionado perfeitamente !!! Agora espero conseguir resolver outros problemas com o meu CGA em Java. Net aí vou eu....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110807824247194103?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110807824247194103/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110807824247194103' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110807824247194103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110807824247194103'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/java-server-pages-saaj-jax-rpc-tudo.html' title='Java server pages, SAAJ, JAX-RPC, tudo uma grande confusão...'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110783094057617541</id><published>2005-02-08T02:36:00.000Z</published><updated>2005-02-08T02:49:00.576Z</updated><title type='text'>Primeira implementação concluída</title><content type='html'>Consegui terminar a primeira implementação do CGA em Java. Comecei por fazer tudo numa única classe e no método main, seguindo a passo a descrição existente no &lt;a href="http://w3.ualg.pt/~flobo/papers/html/cGA/compact-GA.html"&gt;artigo original&lt;/a&gt; do meu orientador. Já com o algoritmo e tudo a funcionar comecei por experimentar pela função mais básica quando se trata deste campo dos algoritmos genéticos - a one-max, que consiste em simplesmente contar o número de uns presentes no cromossoma. Até aqui tudo bem, mas quando fui usar com a função trap, é que as coisas já não correram tão bem de feição. Provavelmente eu não me recordo é perfeitamente de como se constrói a função trap.&lt;br /&gt;Após ter tudo a funcionar comecei a modulizar e a organizar o código: o algoritmo genético compacto passou a classe abstracta, de modo que para ser implementado é necessário fazer uma subclasse descendente que implemente a função fitness. Deste modo é possível fazer a reeutilização de código de acordo com o tipo de problema. E estou já em querer imaginar um tipo de problema concreto que eu possa utilizar para utilizar o algoritmo. É bom ver o meu trabalho começar já a dar os seus frutos.&lt;br /&gt;A outra parte vai ser como aprender a desenvolver os Web Services. Esta parte vou ter eu que aprender inteiramente sozinho, mas a minha intenção é usar o motor  &lt;a href="http://ws.apache.org/axis/"&gt;Apache Axis&lt;/a&gt;, baseado em JAVA, que para funcionar precisa do suporte do &lt;a ref="http://jakarta.apache.org/tomcat/"&gt;Tomcat&lt;/a&gt;, que é um servidor Web baseado em JAVA desenvolvido pela Apache Foundation que serve para albergar JSP (Java Server Pages). Eu neste momento ignoro quase a 95% o que eu vou ter que fazer para por os Web Services a funcionar, quanto mais interligar o algoritmo genético compacto com os Web Services. Até agora só vi a parte emersa do iceberg, agoro vou querer ver os restantes 95% que estão debaixo da superfície!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110783094057617541?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110783094057617541/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110783094057617541' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110783094057617541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110783094057617541'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/primeira-implementao-concluda.html' title='Primeira implementação concluída'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10657935.post-110768943903667529</id><published>2005-02-06T11:26:00.000Z</published><updated>2005-02-06T11:49:16.930Z</updated><title type='text'>Primeiro post</title><content type='html'>Este é o primeiro post neste blog, que temporariamente irá receber o nome de &lt;strong&gt;WebServCGA&lt;/strong&gt;, contracção de &lt;em&gt;Web Services for Compact Genetic Algorithm&lt;/em&gt;. Enquanto não encontrar nada de melhor, vou usar precisamente este nome. Diaria ou semanalmente, espero eu, vou dando aqui as impressões da forma como o trabalho vai decorrendo. Espero que, quando chegar ao fim deste projecto, eu possa, ao rever todo este blog do princí­pio, os sacrifícios que fiz até ter conseguido alcançar um resultado que espero que seja o mais frutuoso possível.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10657935-110768943903667529?l=webservcga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webservcga.blogspot.com/feeds/110768943903667529/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10657935&amp;postID=110768943903667529' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110768943903667529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10657935/posts/default/110768943903667529'/><link rel='alternate' type='text/html' href='http://webservcga.blogspot.com/2005/02/primeiro-post.html' title='Primeiro post'/><author><name>digfish</name><uri>http://www.blogger.com/profile/16871450870490452509</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_ZnABZjNG97E/S4A2CRQhrlI/AAAAAAAAC6Q/TyrO0tRFNuo/s1600-R/digfish.gif'/></author><thr:total>0</thr:total></entry></feed>
