<?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-724725814352395345</id><updated>2011-12-09T09:52:30.258-08:00</updated><category term='boas práticas'/><category term='greylisting'/><category term='unix-like'/><category term='hello world'/><category term='smtp'/><category term='introduction'/><category term='why perl'/><category term='erlang'/><category term='mysql ndb cluster opinion twitter'/><category term='opinion'/><category term='spam'/><category term='programming'/><category term='tutorial'/><category term='perl'/><category term='email'/><category term='modules'/><category term='functions'/><category term='scripts'/><category term='mysql opinion clustering ndb replication sql relational databases'/><category term='past'/><title type='text'>Geek and Programming Sciences</title><subtitle type='html'>Experiências de um programador, apaixonado por linguagens interpretadas, open-source, sistemas operacionais Unix-like, ViM e muito mais.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-8710745924742113837</id><published>2009-09-13T12:54:00.000-07:00</published><updated>2009-09-13T14:38:48.783-07:00</updated><title type='text'>Migração de Blog (http://blog.emresumo.com)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Estou me dedicando ao novo blog (&lt;a href="http://blog.emresumo.com/"&gt;http://blog.emresumo.com&lt;/a&gt;), e este aqui, que já tinha uma frequência baixa, vai ficar realmente parado. Por favor, quem acessa este blog, veja o novo layout, com novo servidor e com mais pessoas para trazer um bom conteúdo para todos nós.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-8710745924742113837?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/8710745924742113837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=8710745924742113837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/8710745924742113837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/8710745924742113837'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2009/09/migracao-de-blog.html' title='Migração de Blog (http://blog.emresumo.com)'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-6111404290670225617</id><published>2009-04-13T20:17:00.000-07:00</published><updated>2009-04-14T05:52:16.901-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql ndb cluster opinion twitter'/><title type='text'>NDB Cluster: não existe milagre</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Há algum tempo atrás eu estava comentando sobre o NDB Cluster no &lt;a href="http://www.twitter.com/otaviof"&gt;Twitter&lt;/a&gt; e o meu amigo &lt;a href="http://www.twitter.com/leandrod"&gt;@leandrod&lt;/a&gt; (referência em PostreSQL no Brasil) comentou que a &lt;span style="font-weight: bold;"&gt;persistência em disco do MySQL NDB Cluter é ruim&lt;/span&gt;. Eu discordo deste ponto de vista, acredito que &lt;span style="font-weight: bold;"&gt;ela é exatamente o que precisa ser para suprir a solução proposta&lt;/span&gt;. Claro que sim, tudo em tecnologia pode ser melhorado, mas do que jeito que este cluster se encontra, já pode ser utilizado em produção tranqüilamente (&lt;span style="font-style: italic;"&gt;desde que, a sua necessidade se encaixe com o perfil de banco de dados MySQL, e com o NDB Cluster -- acho que não era necessário citar isso&lt;/span&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Na &lt;span style="font-weight: bold;"&gt;versão 5.0&lt;/span&gt; e ancessores, a persistência do banco de dados era &lt;span style="font-weight: bold;"&gt;totalmente feita em RAM&lt;/span&gt;, indicando que este tipo de cluster&lt;span style="font-weight: bold;"&gt; não era confiável para dados importantes&lt;/span&gt;, poderia ser utilizado algo como um cache, talvez. Porem, &lt;span style="font-weight: bold;"&gt;a partir da versão 6.x isso mudou&lt;/span&gt;,  além de todo o seu banco de dados (sim todo ele) ficar sempre disponível na RAM, ele também &lt;span style="font-weight: bold;"&gt;ganha persistência em disco&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Vamos raciocinar um pouco. Se todo o meu DB ficar disponível em RAM, quer dizer, que os meu servidores de NDB Cluster precisam ter memória o suficente para alocar tudo isso, porem, atente que não é cada servidor precisa de 10G (se o meu DB tem este tamanho). A &lt;span style="font-weight: bold;"&gt;RAM de cada servidor&lt;/span&gt; pode ser &lt;span style="font-weight: bold;"&gt;determinada por esta formula simples&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new; font-weight: bold;font-size:100%;" &gt;( ( Tamanho do DB × Número de Réplicas × 1.3 ) / Nós do cluster )&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Então, vamos aos calculos (exemplo):&lt;br /&gt;&lt;br /&gt;Tamanho da minha base de dados: &lt;span style="font-weight: bold;"&gt;10G&lt;/span&gt;&lt;br /&gt;Número de réplicas: &lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;&lt;br /&gt;Quantidade de nós (nodes):&lt;span style="font-weight: bold;"&gt; 6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Portanto:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-size:130%;"&gt;( 10 x 1 x 1.3 ) / 6 == 2.16G RAM&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Agora já sabemos que o nossos servidores&lt;span style="font-weight: bold;"&gt; não vão consumir um absurdo de RAM&lt;/span&gt;, apenas o necessário.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Persistência em disco&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O &lt;span style="font-weight: bold;"&gt;NDB Cluster divide as requisições&lt;/span&gt; através dos seus nodes, onde cada um deles &lt;span style="font-weight: bold;"&gt;r&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;eplica informações&lt;/span&gt; para os outros utilizando o daemon "&lt;span style="font-style: italic;"&gt;ndbd&lt;/span&gt;". &lt;span style="font-weight: bold;"&gt;Cada um destes nós faz persistência em disco&lt;/span&gt; local periodicamente e, &lt;span style="font-weight: bold;"&gt;principalmente, quando o servidor estiver "&lt;span style="font-style: italic;"&gt;idle&lt;/span&gt;"&lt;/span&gt;, ou seja, sempre haverá disponibilidade para processar as chamadas da sua aplicação. O fato de fazer a persistência enquanto "&lt;span style="font-style: italic;"&gt;idle&lt;/span&gt;" &lt;span style="font-weight: bold;"&gt;não indica falta de segurança&lt;/span&gt; neste processo, pelo contrário, o "&lt;span style="font-style: italic;"&gt;ndbd&lt;/span&gt;" é capaz de detectar que um dos nós do cluster não está mais diponsível (através do controlador deste cluster e do processo de replicação) e assim ele forçar uma persistência regular (constante) dos dados.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cálculos apontam que&lt;/span&gt; o NDB Cluster pode ficar &lt;span style="font-weight: bold;"&gt;até sem 40% de suas máquinas&lt;/span&gt;, mantendo a confiabilidade perfeita dos dados (&lt;span style="font-style: italic;"&gt;mas este cálculo fica para um próximo post&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Bibliografia:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/faqs-mysql-cluster.html#qandaitem-23-10-1-11"&gt;http://dev.mysql.com/doc/refman/5.1/en/faqs-mysql-cluster.html#qandaitem-23-10-1-11&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html"&gt;http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-6111404290670225617?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/6111404290670225617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=6111404290670225617' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/6111404290670225617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/6111404290670225617'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2009/04/ndb-cluster-nao-existe-milagre.html' title='NDB Cluster: não existe milagre'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-90091584847335810</id><published>2009-04-11T20:38:00.000-07:00</published><updated>2009-04-13T19:54:42.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql opinion clustering ndb replication sql relational databases'/><title type='text'>MySQL NDB Cluster</title><content type='html'>&lt;div style="TEXT-ALIGN: justify"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Introdução:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É uma tecnologia que provê clustering de databases em principalmente memória RAM, e com persistência em disco, sobre ambiente "shared-nothing", esta arquitetura permite que um sistema trabalhe de uma maneira pouco onerosa para o hardware, apenas, com um mínimo de requisitos específicos.&lt;br /&gt;&lt;br /&gt;MySQL Cluster é designado para eliminar os pontos únicos de falha. Por esta razão, de cada componente é esperado ter seus próprios elementos básicos (disco, memória, CPUs), ou seja, o uso de mecanismos para compartilhamento de informações como storages, NFSs, SANs, não são recomendados para este tipo de arquitetura.&lt;br /&gt;&lt;br /&gt;O cluster consiste em uma série de computadores, cada um rodando um ou mais processos que podem ser um MySQL Server, &lt;span style="FONT-STYLE: italic"&gt;"data node"&lt;/span&gt;, um &lt;span style="FONT-STYLE: italic"&gt;"management server"&lt;/span&gt; e possivelmente programas específicos para acesso aos dados do cluster. A relação entre estes componentes pode ser visto na figura abaixo:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5323644553541712834" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 204px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_HKYMxMA-y_A/SeFig_xL-8I/AAAAAAAAAHM/WeaUEE7ZKZM/s320/cluster-components-1.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Todos estes programas trabalham juntos para formar um MySQL Cluster. Quando os dados são guardados em um &lt;span style="FONT-WEIGHT: bold"&gt;storage engine&lt;/span&gt; -- motor de armazenamento, se preferir -- &lt;span style="FONT-WEIGHT: bold"&gt;NDBCLUSTER&lt;/span&gt;, as tabelas estão alocadas nos data nodes. Cada tabela é diretamente acessível de todos os outros servidores neste cluster, se uma aplicação alterar (INSERT, UPDATE, DELETE), todos os outros nós do cluster terão esta &lt;span style="FONT-WEIGHT: bold"&gt;alteração&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold"&gt;imediatamente&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Os dados armazenados nos &lt;span style="FONT-STYLE: italic"&gt;data nodes&lt;/span&gt; são "espelhados" pelos outros &lt;span style="FONT-STYLE: italic"&gt;nodes&lt;/span&gt;; o cluster pode &lt;span style="FONT-WEIGHT: bold"&gt;gerenciar falhas dos seus servidores sem impacto&lt;/span&gt; sobre a consistência dos dados, este é apenas sensível (depende também do seu &lt;span style="FONT-STYLE: italic"&gt;setup&lt;/span&gt;) ao desempenho do cluster. Outro ponto que pode haver problemas são nas transações, pois, o &lt;span style="FONT-STYLE: italic"&gt;node&lt;/span&gt; que falhou poderia estar gerenciando uma delas, porem, este não deve ser um ponto de extrama preocupação, porque a sua aplicação deverá tratar este tipo de situação adversa.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-size:130%;" &gt;Casos de uso:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta solução &lt;span style="FONT-WEIGHT: bold"&gt;não é simplesmente&lt;/span&gt; a melhor a ser aplicada para &lt;span style="FONT-WEIGHT: bold"&gt;todos os casos&lt;/span&gt;. Temos que lembrar que a &lt;span style="FONT-WEIGHT: bold"&gt;replicação&lt;/span&gt; no MySQL é algo muito &lt;span style="FONT-WEIGHT: bold"&gt;simples&lt;/span&gt; e resolve quase muitos casos onde escalabilidade é a temática central. Veja onde o NDB Cluster é recomendado:&lt;br /&gt;&lt;/div&gt;&lt;ul style="TEXT-ALIGN: justify"&gt;&lt;li&gt;Aplicações que terão crescimento horizontal, tanto para leitura como para escrita;&lt;/li&gt;&lt;li&gt;Arquiteturas onde o tempo de &lt;span style="FONT-STYLE: italic"&gt;downtime&lt;/span&gt; é crucial no servidor de escrita, ou seja, você &lt;span style="FONT-WEIGHT: bold"&gt;não tem tempo&lt;/span&gt; para eleger um SLAVE como um novo MASTER, se uma "tragédia" acontecer;&lt;/li&gt;&lt;/ul&gt;&lt;div style="TEXT-ALIGN: justify"&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-size:130%;" &gt;Onde ele não é recomendado:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sistemas onde o uso de &lt;span style="FONT-WEIGHT: bold"&gt;chave estrageira&lt;/span&gt; não pode ser suprimido pela aplicação. Podemos imaginar que você usa um software de código-fonte fechado e não pode, simplesmente, implementar este recurso;&lt;br /&gt;&lt;br /&gt;Devo lembrar também que subir uma estrutura com estas características não é algo trivial, existem muitos pequenos detalhes a considerar. Se para o seu caso isso é um problema, repense a idéia da replicação, apesar de simples, ela é muito flexível, existem "N" maneiras de replicar um banco de dados MySQL sem perder desempenho e com um tempo de resposta muito baixo.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-size:130%;" &gt;Considerações a respeito de tecnologia:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;MySQL&lt;/span&gt; é um banco de dados &lt;span style="FONT-WEIGHT: bold"&gt;confiável&lt;/span&gt; e robusto, porem, quando nós queremos que ele seja solução &lt;span style="FONT-WEIGHT: bold"&gt;para um ambiente de grande porte&lt;/span&gt;, nem sempre é &lt;span style="FONT-WEIGHT: bold"&gt;simples&lt;/span&gt; cumprir esta tarefa, assim como não seria ao fazê-lo com um de seus concorrentes (Oracle, PostreSQL, etc).&lt;br /&gt;&lt;br /&gt;Na sua concepção, ele foi criado para ser um banco de dados disponível e de manipulação fácil para todos os possíveis usuários, e por este motivo, ele não vem com um belo &lt;span style="FONT-STYLE: italic"&gt;tuning&lt;/span&gt; para &lt;span style="FONT-STYLE: italic"&gt;high-concurrency&lt;/span&gt;, todo este trabalho deve ser feito pelo seu DBA (&lt;span style="FONT-STYLE: italic"&gt;Sim, senhor! Com o MySQL a figura do DBA é necessária também.&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Para ter uma solução eficiente, você deve considerar todos os fatores envolvidos e escolher a melhor ferramenta para o pior problema, lembrando que &lt;span style="FONT-WEIGHT: bold"&gt;&lt;a href="http://en.wikipedia.org/wiki/Silver_bullet"&gt;não existe bala-de-prata&lt;/a&gt;&lt;/span&gt; quando falamos de tecnologia.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-size:130%;" &gt;Bibliografia:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.mysql.com/read.php?12,100670,100670"&gt;http://forums.mysql.com/read.php?12,100670,100670&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-glossary.html"&gt;http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-glossary.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Acho este assunto polêmico? Espero seu comentário.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-90091584847335810?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/90091584847335810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=90091584847335810' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/90091584847335810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/90091584847335810'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2009/04/mysql-ndb-cluster.html' title='MySQL NDB Cluster'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HKYMxMA-y_A/SeFig_xL-8I/AAAAAAAAAHM/WeaUEE7ZKZM/s72-c/cluster-components-1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-9192210861052140764</id><published>2009-01-04T13:01:00.000-08:00</published><updated>2009-01-04T13:36:06.135-08:00</updated><title type='text'>"Variáveis" em Erlang</title><content type='html'>&lt;div style="text-align: justify;"&gt;Um outro ponto muito importante para entendermos Erlang é o conceito de &lt;i&gt;variáveis&lt;/i&gt;, este é muito diferente do que nós estamos acostumados. Vejam:&lt;br /&gt;&lt;br /&gt;As variáveis são estruturas para basicamente, &lt;b&gt;guardarmos um valor&lt;/b&gt; e tornar possível que nós o &lt;b&gt;recuperemos depois&lt;/b&gt;. Exemplo:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;1&gt; X = 272727.&lt;br /&gt;272727&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Primeiro nós guardamos um valor em &lt;i&gt;"X"&lt;/i&gt; e depois ele nos mostra "272727".  Atente que todas as variáveis &lt;b&gt;devem começar com uma letra maiúscula&lt;/b&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Agora, vamos recuperar o valor inserido:&lt;br /&gt;&lt;pre&gt;2&gt; X.&lt;br /&gt;272727&lt;br /&gt;&lt;/pre&gt;Portanto, &lt;i&gt;"X"&lt;/i&gt; contem um valor e nós podemos fazer uso:&lt;br /&gt;&lt;pre&gt;3&gt; X*X*X.&lt;br /&gt;19683&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Os exemplos acima são simples, porem expressam perfeitamente que em Erlang as variáveis tem um &lt;b&gt;conceito análogo ao da Matemática&lt;/b&gt;, quando você associa um valor com uma variável, está fazendo uma &lt;b&gt;"afirmação de um fato"&lt;/b&gt;: esta variável tem este valor (&lt;i&gt;ponto&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;No entanto, se você tentar inserir um novo valor para a nossa velha variável &lt;i&gt;"X"&lt;/i&gt;, terá um erro brutal, como este:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;4&gt; X = 1234.&lt;br /&gt;=ERROR REPORT==== 11-Sep-2006::20:32:49 ===&lt;br /&gt;Error in process &lt;0.31.0&gt; with exit value:&lt;br /&gt;{{badmatch,1234},[{erl_eval,expr,3}]}&lt;br /&gt;** exited: {{badmatch,1234},[{erl_eval,expr,3}]} **&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Para explicar é necessário fazer duas colocações importantes a respeito de &lt;i&gt;"X = 1234."&lt;/i&gt;:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Primeiro, &lt;b&gt;&lt;i&gt;"X"&lt;/i&gt; não é uma variável&lt;/b&gt;, ao menos não como nós a encontraríamos em outras linguagens de programação;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Segundo, &lt;b&gt;&lt;i&gt;"="&lt;/i&gt; não é um operador de atribuição&lt;/b&gt;;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Esta é provavelmente uma das áreas mais difíceis de entender, para quem é novo em Erlang (&lt;i&gt;eu também sou&lt;/i&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Variáveis não são variáveis&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Em Erlang &lt;span style="font-weight: bold;"&gt;variáveis tem uma única atribuição&lt;/span&gt;, e assim como este conceito sugere, um valor só &lt;span style="font-weight: bold;"&gt;pode ser alterado uma única vez&lt;/span&gt;! Se você tentar mudar este valor, você receberá um erro fatal (como mostrado pouco acima). A variável que teve seu valor alterado é chamada &lt;span style="font-weight: bold;"&gt;"bound-variable"&lt;/span&gt; (pode ser traduzido como "variável-vinculada"). Todas as variáveis &lt;span style="font-weight: bold;"&gt;começam como "unbound"&lt;/span&gt; (desvinculadas), até que uma chamada como &lt;span style="font-style: italic;"&gt;"X = 1234."&lt;/span&gt; atribui um valor ao elemento &lt;span style="font-style: italic;"&gt;"X"&lt;/span&gt;. Note que antes de ter um vínculo estabelecido, &lt;span style="font-style: italic;"&gt;"X"&lt;/span&gt; poderia ter qualquer valor, porem, depois disso, ela &lt;span style="font-weight: bold;"&gt;terá o mesmo valor&lt;/span&gt; para sempre (&lt;span style="font-weight: bold;"&gt;até o final da execução&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;A este ponto você deve estar pensando o porque chamar este elemento de &lt;span style="font-style: italic;"&gt;"variável"&lt;/span&gt;, e dá-se por dois motivos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Eles são variáveis, porem, só pode ter seu &lt;span style="font-weight: bold;"&gt;valor alterado uma única vez&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;Eles se &lt;span style="font-weight: bold;"&gt;parecem com variáveis em outras linguagens&lt;/span&gt; convencionais de programação, então é normal que uma linha de código com o padrão &lt;span style="font-style: italic;"&gt;"X = ..."&lt;/span&gt; seja familiar ao conceito;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Na verdade, &lt;span style="font-style: italic; font-weight: bold;"&gt;"="&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; é um operador para "pattern-matching"&lt;/span&gt; (correspondência de padrão), o qual &lt;span style="font-weight: bold;"&gt;comporta-se como um operador de atribuição&lt;/span&gt; quando &lt;span style="font-style: italic;"&gt;"X"&lt;/span&gt; está &lt;span style="font-weight: bold;"&gt;"unbound"&lt;/span&gt; (desvinculado), ou seja, apenas uma única vez durante a vida de uma variável.&lt;br /&gt;&lt;br /&gt;Finalmente, o escopo de uma variável é a unidade léxica no qual ela foi definida. Se &lt;span style="font-style: italic;"&gt;"X"&lt;/span&gt; é utilizado em um bloco de uma função, então, este não será válido fora deste bloco. Em &lt;span style="font-weight: bold;"&gt;Erlang não existem variáveis de contexto global ou privado&lt;/span&gt;, nem mesmo será reutilizada em diferentes blocos de uma função. Se &lt;span style="font-style: italic;"&gt;"X"&lt;/span&gt; ocorrer em diferentes funções, então serão variáveis diferentes, porem com um mesmo nome, e, provavelmente, com valores diferentes &lt;span style="font-weight: bold;"&gt;atribuídos em cada escopo&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Bibliografia:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.pragprog.com/titles/jaerlang/programming-erlang"&gt;&lt;br /&gt;Programming Erlang (Joe Armstrong) &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-9192210861052140764?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/9192210861052140764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=9192210861052140764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/9192210861052140764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/9192210861052140764'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2009/01/variveis-em-erlang.html' title='&quot;Variáveis&quot; em Erlang'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-5394650726725993376</id><published>2008-12-21T17:16:00.001-08:00</published><updated>2008-12-21T17:50:04.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='functions'/><title type='text'>Erlang II</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Näo gosto muito de dar exemplos extremamente técnicos, como o artigo abaixo, mas acredito que é necessário mostrar um pouco da tipagem e do "feeling" de Erlang, depois do post anterior.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Erlang Shell:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Parece-nos um pouco de modismo atual, mas todas as linguagens de programação interpretadas tem um shell para testar os comandos, mas o fato é que esta pratica remonta de muitos anos, a exemplo do Erlang Shell:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;$ erl&lt;br /&gt;Erlang (BEAM) emulator version 5.6.3 [source] [smp:2] \&lt;br /&gt; [async-threads:0] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Eshell V5.6.3  (abort with ^G)&lt;br /&gt;1&gt; 27*2.&lt;br /&gt;54&lt;br /&gt;2&gt;&lt;br /&gt;BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded&lt;br /&gt; (v)ersion (k)ill (D)b-tables (d)istribution&lt;br /&gt;a&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Acima segue um exemplo bem simples de como este shell se parece, também um exemplo de uma operação matemática, veja que os padrões para este tipo de ação é equiparado a todas as outras linguagens, o único exemplo, de destaque de Erlang, é que todas as intruções terminam com um ponto (".").&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Módulos e Funçoes:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Vamos começar com um exemplo para nos acostumarmos um pouco com a tipagem de Erlang, devo dizer que a primeira vista ela não é das mais fáceis, porem, ela privilegia a fluidez deste tipo de software, lembre-se de que será necessário um período de adaptação.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Abra um arquivo com nome de "teste.erl" (sim, a extensão é importante), e acrescente o seguinte conteúdo:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;-module(teste).&lt;br /&gt;-export([double/1]).&lt;br /&gt;double(X) -&gt;&lt;br /&gt;2 * X.&lt;br /&gt;&lt;/pre&gt;Feito isso, vamos chama-lo dentro do Erlang Shell, atente que o shell deve ser chamado no mesmo diretório que você criou o arquivo acima:&lt;br /&gt;&lt;pre&gt;$ erl&lt;br /&gt;1&gt; c(teste).&lt;br /&gt;{ok,teste}&lt;br /&gt;2&gt; teste:double(27).&lt;br /&gt;54&lt;br /&gt;&lt;/pre&gt;Após o comando "c(teste)." o interpretador faz a leitura dos fontes e o compila, gerando um executavel em RAM, logo em seguida ele já está pronto para ser utlizado, sabemos disso através do retorno "{ok,teste}".&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Toda a declaracao de módulos em Erlang é feita com a instruçao "-module(&lt;nome-do-modulo&gt;).", atenção ao detalhe de ser iniciado com "-" e sempre finalizado com ".". Neste exmplo o mais importante é a instrução "-export([double/1]).", esta deixa disponível o método "double" o qual espera um parametro, por isso a presença do "/1" na instrução. Sem o "export" o método "double" só estaria disponível dentro do módulo "teste".&lt;br /&gt;&lt;br /&gt;Outro retorno dos comandos acima é a criação do "teste.beam", este é o resultado do código Erlang compilado há pouco:&lt;br /&gt;&lt;br /&gt;&lt;/nome-do-modulo&gt;&lt;/div&gt;&lt;pre&gt;$ file teste.beam&lt;br /&gt;teste.beam: Erlang BEAM file&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Bibliografia (Links):&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wikipedia (&lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language"&gt;http://en.wikipedia.org/wiki/Erlang_(programming_language)&lt;/a&gt;);&lt;br /&gt;Erlang Getting Started (&lt;a href="http://www.erlang.org/starting.html"&gt;http://www.erlang.org/starting.html&lt;/a&gt;);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-5394650726725993376?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/5394650726725993376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=5394650726725993376' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/5394650726725993376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/5394650726725993376'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2008/12/erlang-ii.html' title='Erlang II'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-5457332893955794961</id><published>2008-11-18T18:22:00.000-08:00</published><updated>2008-11-21T10:55:54.099-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='introduction'/><category scheme='http://www.blogger.com/atom/ns#' term='past'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Introdução a Erlang</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Introdução:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; é uma linguagem de programação de propósito geral, focada em concorrência e sistemas de &lt;a href="http://en.wikipedia.org/wiki/Real-time_computing"&gt;tempo real&lt;/a&gt;. Esta linguagem foi criada pela &lt;a href="http://en.wikipedia.org/wiki/Ericsson"&gt;Ericsson&lt;/a&gt; para &lt;span style="font-weight: bold;"&gt;suportar sistemas tolerantes a falhas, de tempo-real e ininterruptas&lt;/span&gt;. Estes requisitos, na época de sua criação até os nossos dias, é algo muito ousado. Mesmo hoje, temos dificuldades em fazer aplicações com estas características e por este motivo, voltamos um pouco no tempo e queremos &lt;span style="font-weight: bold;"&gt;reaproveitar conceitos que foram forjados pela prática&lt;/span&gt; e obter o melhor resultado possível com as ferramentas atuais.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Concorrência e "Actor Model":&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para concorrência &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; segue o &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;modelo matemático de atores&lt;/a&gt;... Para explicar, vamos criar uma metáfora atribuindo a cada processo determinadas capacidades ou características, neste consenso seria possível para um ator: tomar decisões locais, criar mais atores, enviar mensagens, determinar seu modelo de respostas, entre muitos outros. O "&lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;Actor Model&lt;/a&gt;" foi concebido em 1973 por Carl Hewitt, Peter Bishp e Richard Steiger. Este modelo foi inspirado por leis da física e influenciou fortemente linguagens de programação, por isso, para realmente entender &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;, tenha estes conceitos em mente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Processos e Troca de Mensagens:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A criação e manipulação de processos é algo trivial para &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;, onde, &lt;a href="http://en.wikipedia.org/wiki/Thread_%28computer_science%29"&gt;threads&lt;/a&gt; são consideradas de &lt;span style="font-weight: bold;"&gt;difícil manipulação e inseguras, em muitos sentidos&lt;/span&gt;. Para driblar todos estes problemas, intrínsecos de &lt;a href="http://en.wikipedia.org/wiki/Thread_%28computer_science%29"&gt;threads&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; propõe uma arquitetura &lt;span style="font-weight: bold;"&gt;formada basicamente por processos&lt;/span&gt; (característica também dos SOs unix-like), intercomunicando-se por troca de mensagens ("&lt;a href="http://en.wikipedia.org/wiki/Message_passing"&gt;Message Passing&lt;/a&gt;"). Esta é realizada sem usar &lt;span style="font-weight: bold;"&gt;nenhum tipo de memória ou variáveis compartilhadas&lt;/span&gt;, tornando cada processo uma instância independente também seu modelo de comunicação é assíncrono.  Cada processo tem algo comparavel a uma fila de mensagens, recebidas de outros processos que ainda não foram devidamente tratados.&lt;br /&gt;&lt;br /&gt;Com o uso do "&lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;Actor Model&lt;/a&gt;" podemos perceber um pouco do que nos é possível usando &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;: ter uma &lt;span style="font-weight: bold;"&gt;série de pequenas partes do nosso programa assumindo ações e "tomando" decisões&lt;/span&gt;. Podemos abstrair parte deste conceito pensando em uma fábrica, ou linha de produção, na qual, cada colaborador faz uma parte das rotinas e repassa tratamento a diante, podemos também atribuir as figuras dos inspetores e gerentes, com o papel de atentar ao processo como um todo, orientando as melhoras e corrigindo pequenos problemas em tempo de execução.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Escalabilidade:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Outra face &lt;span style="font-weight: bold;"&gt;incrível&lt;/span&gt; de &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; é a f&lt;span style="font-weight: bold;"&gt;acilidade para fazer uma aplicação horizontalmente escalável&lt;/span&gt;, ou seja, podemos dividir os processos de &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; por vários servidores distintos, e caso seja necessário, adicionar mais um servidor e, simplesmente, dividir a carga entre eles, o único requisito, é ter a Virtual Machine de &lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt; instalada. Este modelo vai deixar as partes da nossa aplicação espalhadas, porem, os processos continuam a se &lt;span style="font-weight: bold;"&gt;comunicar&lt;/span&gt; da mesma forma, e &lt;span style="font-weight: bold;"&gt;com a mesma facilidade&lt;/span&gt;, mesmo estando em máquinas separadas. Esta &lt;span style="font-weight: bold;"&gt;feature&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;reduz drasticamente&lt;/span&gt; a &lt;span style="font-weight: bold;"&gt;complexidade de manutenção&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.erlang.org/"&gt;http://www.erlang.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.erlang.org/doc/getting_started/part_frame.html"&gt;http://www.erlang.org/doc/getting_started/part_frame.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;http://en.wikipedia.org/wiki/Erlang_(programming_language)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Message_passing"&gt;http://en.wikipedia.org/wiki/Message_passing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Real-time_computing"&gt;http://en.wikipedia.org/wiki/Real-time_computing&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-5457332893955794961?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/5457332893955794961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=5457332893955794961' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/5457332893955794961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/5457332893955794961'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2008/11/introduo-erlang.html' title='Introdução a Erlang'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-652616413950657549</id><published>2008-10-04T09:10:00.000-07:00</published><updated>2008-10-21T09:27:30.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scripts'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='unix-like'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='why perl'/><title type='text'>Why Perl</title><content type='html'>&lt;div style="text-align: justify;"&gt;Há alguns anos atrás eu precisava de uma boa ferramenta para concentrar anti-spam, anti-vírus, e muitas outras funções, dentre as possíveis escolhas eu elegi o &lt;a href="http://www.ijs.si/software/amavisd/"&gt;&lt;span style="font-weight: bold;"&gt;Amavisd-new&lt;/span&gt;&lt;/a&gt;, por ser um projeto maduro e com referencias fortes. E, em um determinado momento eu estava cercado por situações nas quais eu não encontrava saída, mesmo nas listas de discussão e documentação, então, senti-me "&lt;span style="font-style: italic;"&gt;obrigado&lt;/span&gt;" a ler os fontes. Inicialmente foi uma das piores experiências da minha vida, o software é todo escrito em &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; (claro!) e na época tinha mais de 18 mil linhas de código... Porem, foi também, uma das melhores oportunidades da minha vida profissional! Vou explicar o porque.&lt;br /&gt;&lt;br /&gt;Para quem não tem muita experiência com a linguagem, &lt;span style="font-weight: bold;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; é um tanto&lt;/span&gt; quanto &lt;span style="font-weight: bold;"&gt;complicado&lt;/span&gt;, pois tem uma estrutura bastante diferenciadas e utiliza elementos que &lt;span style="font-weight: bold;"&gt;não são auto-explicativos&lt;/span&gt;. Ou seja, sem conhecer a linguagem eu não poderia entender como aquele software trabalha.&lt;br /&gt;&lt;br /&gt;Comecei então a procurar um bom artigo ou tutorial sobre introdução e na maioria deles eu era &lt;span style="font-weight: bold;"&gt;redirecionado às &lt;a href="http://en.wikipedia.org/wiki/Manpages"&gt;manpages&lt;/a&gt;&lt;/span&gt;. Na época me parecia estranho aprender uma linguagem de programação através de suas &lt;a href="http://en.wikipedia.org/wiki/Manpages"&gt;manpages&lt;/a&gt;, pois eu nunca havia pensado nisso.  No entanto, segui o conselho e comecei: &lt;span style="font-weight: bold;"&gt;"$ &lt;a href="http://perldoc.perl.org/"&gt;perldoc&lt;/a&gt; perl"&lt;/span&gt;. Devo admitir, &lt;span style="font-weight: bold;"&gt;tudo o que você precisa, quer ou terá necessidade estão em suas &lt;a href="http://en.wikipedia.org/wiki/Manpages"&gt;manpages&lt;/a&gt;&lt;/span&gt;, e todo o conteúdo está  mais do que bem explicado, cheio de exemplos e textos adicionais. Sem dúvida, as &lt;a href="http://perldoc.perl.org/"&gt;manpages do Perl&lt;/a&gt; são mais do que suficientes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;&lt;span style="font-weight: bold;"&gt;Perl&lt;/span&gt;&lt;/a&gt; é uma linguagem &lt;span style="font-weight: bold;"&gt;extremamente poderosa e madura&lt;/span&gt;, criada por &lt;a href="http://en.wikipedia.org/wiki/Larry_Wall"&gt;Larry Wall&lt;/a&gt; em 1987 com o enfoque de ter recursos para processamento de texto, foi principalmente influenciada por &lt;a href="http://en.wikipedia.org/wiki/ANSI_C"&gt;C&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Shell_script"&gt;Shell Script&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Awk"&gt;AWK&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Sed"&gt;Sed&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Lisp"&gt;Lisp&lt;/a&gt;, hoje, &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; encontra-se na versão &lt;a href="http://dev.perl.org/perl5/"&gt;5.10&lt;/a&gt;, e &lt;span style="font-weight: bold;"&gt;está presente em quase todas as plataformas&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Afinal, Porque Perl?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Com mais de 20 anos de idade esta linguagem está mais do que consolidada no mercado, hoje é praticamente impossível ver um sistema operacional unix-like sem o seu interpretador, e mais, sem ter dezenas de scripts para as mais variadas funções, escritos em Perl;&lt;/li&gt;&lt;li&gt;É o canivete-suíço das linguagens de programação pois, comprovadamente, é flexível e adaptável;&lt;/li&gt;&lt;li&gt;Sua sintaxe é inspirada em linguagem C (ANSI), então, é simples, direta e prazerosa de escrever;&lt;/li&gt;&lt;li&gt;Reúne as listas de Lisp, os &lt;a href="http://en.wikipedia.org/wiki/Associative_arrays"&gt;Arrays Associativos&lt;/a&gt; do AWK e as &lt;a href="http://en.wikipedia.org/wiki/Regular_expressions"&gt;Expressões Regulares&lt;/a&gt; do Sed, ou seja, o melhor destes mundos com inúmeras outras inovações;&lt;/li&gt;&lt;li&gt;Também suporta estrutura de dados complexas, &lt;a href="http://en.wikipedia.org/wiki/First_Class_Functions"&gt;First Class Functions&lt;/a&gt; (construção de novas funções em tempo de execução), &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;Closures&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/OOP"&gt;Orientação a Objetos&lt;/a&gt;, bem como a mistura de vários paradigmas, fica a critério do programador, e muito muito mais;&lt;/li&gt;&lt;li&gt;Toda a liberdade ao desenvolvedor, possibilitando escrever instruções complexas em poucas linhas de código (quanto menos linhas de código menos bugs);&lt;/li&gt;&lt;li&gt;É rápido e produtivo, pois provê ao programador todas as ferramentas necessárias para colocar os seus anseios em prática;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"There is more than one way to do it"&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/"&gt;CPAN&lt;/a&gt;, um repositório com milhares de &lt;a href="http://en.wikipedia.org/wiki/Perl_module"&gt;módulos Perl&lt;/a&gt;, largamente utilizados, e conseqüentemente, testados pela comunidade;&lt;/li&gt;&lt;li&gt;Liberdade. Não te prende à burocracia, e subentende de que o desenvolvedor tem consciência do que faz e quer liberdade para isso;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Porem é necessário deixar claro que &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt; é uma linguagem &lt;span style="font-weight: bold;"&gt;voltada às soluções e meios para atingir os objetivos, e, não necessariamente voltada a quem vai desenvolver&lt;/span&gt; estas soluções, ou seja, ela vai exigir dos programadores &lt;span style="font-weight: bold;"&gt;conceitos e disciplina&lt;/span&gt;, na minha opinião, isso é muito bom nos dias de hoje.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;São Paulo Perl Mongers:&lt;/span&gt; &lt;a href="http://sao-paulo.pm.org/"&gt;http://sao-paulo.pm.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Perl Mongers:&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Perl_Mongers"&gt;http://en.wikipedia.org/wiki/Perl_Mongers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Perl 6:&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Perl_6"&gt;http://en.wikipedia.org/wiki/Perl_6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; Programming Perl:&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Programming_Perl"&gt;http://en.wikipedia.org/wiki/Programming_Perl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Perl Foundation:&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/The_Perl_Foundation"&gt;http://en.wikipedia.org/wiki/The_Perl_Foundation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Perl Monks:&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Perl_Monks"&gt;http://en.wikipedia.org/wiki/Perl_Monks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-652616413950657549?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/652616413950657549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=652616413950657549' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/652616413950657549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/652616413950657549'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2008/10/why-perl.html' title='Why Perl'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-3392688391268409909</id><published>2008-09-23T20:16:00.000-07:00</published><updated>2008-09-24T05:38:13.410-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><category scheme='http://www.blogger.com/atom/ns#' term='greylisting'/><category scheme='http://www.blogger.com/atom/ns#' term='boas práticas'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><title type='text'>Greylisting</title><content type='html'>&lt;div style="text-align: justify;"&gt;A pratica dos spams na internet chegou aos seus limites. Temos de um lado &lt;span style="font-weight: bold;"&gt;profissionais capacitados&lt;/span&gt; "vomitando" milhões de mensagens indesejadas; para os que não sabem, é muito complexo enviar uma &lt;span style="font-style: italic;"&gt;grande&lt;/span&gt; quantidade de mensagens, exige muita experiência, técnica para burlar os filtros e RFCs; de outro, pessoas  recebem estes emails e, definitivamente, compram produtos que lhe são oferecidos, desta forma, &lt;span style="font-weight: bold;"&gt;enviar spams é algo lucrativo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Muitas são as maneiras de tentar impedir esta pratica, um delas é a &lt;span style="font-weight: bold;"&gt;Greylisting&lt;/span&gt; (&lt;a href="http://en.wikipedia.org/wiki/Greylisting"&gt;http://en.wikipedia.org/wiki/Greylisting&lt;/a&gt;), a qual consiste em, basicamente, validar um email através das &lt;span style="font-weight: bold;"&gt;tentativas de envio&lt;/span&gt;, partindo do pressuposto: os &lt;span style="font-style: italic;"&gt;"spammers"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;não tentam enviar&lt;/span&gt; uma mensagem &lt;span style="font-weight: bold;"&gt;mais de uma vez&lt;/span&gt;. Dá-se porque o &lt;span style="font-weight: bold;"&gt;lucro&lt;/span&gt; vem da &lt;span style="font-weight: bold;"&gt;quantidade de mensagens entregues&lt;/span&gt;, então este sujeito tenta entregar milhares de mensagens e não quer ficar perdendo preciosos milesegundos, não há (em uma porcentagem considerável dos casos) re-tentativa. Porem, servidores de e-mails convencionais, tentam entregar novamente  em quatro horas.&lt;br /&gt;&lt;br /&gt;Deste cenário vem as práticas de Greylisting, &lt;span style="font-weight: bold;"&gt;validar uma mensagem antes&lt;/span&gt; da sua &lt;span style="font-weight: bold;"&gt;entrada&lt;/span&gt;, e apartir dos dados colhidos (histórico), como re-tentativas, origem (ou até origens), destinatários e muitos outros, definir se este email, bem com a sua origem, &lt;span style="font-weight: bold;"&gt;é valida ou não&lt;/span&gt; e se poderá ser entregue das &lt;span style="font-weight: bold;"&gt;próximas vezes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Devemos reconhecer, a idéia é muito boa e temos ótimas ferramentas para implementa-la, portando, é um recurso considerável. O &lt;span style="font-weight: bold;"&gt;errado&lt;/span&gt; está na forma como algumas empresas o fazem, nestas é aplicado Greylist pra todos, sem distinção. Agora, imagine-se do outro lado, você, um cliente ou um fornecedor, e seu email só será &lt;span style="font-weight: bold;"&gt;entregue com um delay&lt;/span&gt; de possivelmente quatro horas... Muito próximo do inaceitável.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;Porem, você pode &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:verdana;" &gt;lembrar-me&lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt; de que há a &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:verdana;" &gt;Whitelist&lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Mas esta é para os endereços que você já conhece. E quanto aos endereços que você &lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;nunca recebeu mensagens&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;, são válidos e tem um propósito nobre?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;Então Greylist é &lt;span style="font-weight: bold;"&gt;bom mas não deve&lt;/span&gt; ser usado?!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A resposta é &lt;span style="font-weight: bold;"&gt;sim, deve&lt;/span&gt; ser utilizado.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;A utilização da Greylist &lt;span style="font-weight: bold;"&gt;não pode ser política padrão&lt;/span&gt;, senão, podemos &lt;span style="font-weight: bold;"&gt;julgar de forma errônea as novas mensagens&lt;/span&gt;, deve ser um filtro adicional para o nosso anti-spam, ou seja, é recomendável aplicar Greylist para os servidores de SMTP que nós não conhecemos, e, temos &lt;span style="font-weight: bold;"&gt;uma séria suspeita&lt;/span&gt;. Por exemplo:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Redes da Coréia, e alguns outros países asiáticos;&lt;/li&gt;&lt;li&gt;Redes no qual sabemos que são conhecidamente de "spammers", na sua maior parte, leia-se ADSL;&lt;/li&gt;&lt;li&gt;IPs que estão em blacklists públicas, e por motivos comerciais, não podemos simplesmente descartar;&lt;/li&gt;&lt;li&gt;IPs que já tiveram ocorrências esporádicas de spams, ou qualquer outro tipo de mensagem indesejada;&lt;/li&gt;&lt;li&gt;Entre muitas outras possibilidadades.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Atente que a Greylist é uma ferramenta muito útil e que &lt;span style="font-weight: bold;"&gt;deve estar correndo lado-a-lado&lt;/span&gt; às &lt;span style="font-weight: bold;"&gt;regras de negócios&lt;/span&gt; de sua empresa, ou seja, você deve ter em mente quais são os lugares de onde são esperadas novas mensagens e quais os lugares pouco confiáveis. &lt;span style="font-weight: bold;"&gt;Apartir destes pontos definir a sua estratégia&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-3392688391268409909?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/3392688391268409909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=3392688391268409909' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/3392688391268409909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/3392688391268409909'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2008/09/opinio-sobre-greylisting.html' title='Greylisting'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-724725814352395345.post-7925646303931962718</id><published>2008-09-21T11:15:00.000-07:00</published><updated>2008-09-21T11:33:05.568-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hello world'/><title type='text'>Hello World</title><content type='html'>Já faz um bom tempo que a iniciativa de ter um blog, ou alguma oportunidade de disponibilizar conteúdo e idéias, me passa pela cabeça, e finalmente, está aqui a iniciativa! Já fiz artigos para alguns sites, participação em podcast, e outras coisas, agora chegou a hora de ter um "blog".&lt;br /&gt;&lt;br /&gt;O que eu quero passar é conteúdo relacionado aos conceitos de programação, ou seja, tudo o que um programador, faz (ou deveria fazer), pensar, usar e, conseqüentemente, abrir uma margem para discutirmos sobre estes assuntos. E por ter certeza de que nenhum programador é completo (para não dizer "competente") sem ter plenos conceitos de sistemas operacionais, também vai ter muitas coisas relacionadas aos unix-like e projetos open-source. Em todo este processo não pretendo me prender ao "como fazer" (how-tos em geral) mas sim ao porque.&lt;br /&gt;&lt;br /&gt;Ainda não sei a freqüência de publicação dos posts, vamos ver como as coisas vão fluir ;-).&lt;br /&gt;&lt;br /&gt;Todos os comentários e críticas são muito bem vindas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/724725814352395345-7925646303931962718?l=otaviof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://otaviof.blogspot.com/feeds/7925646303931962718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=724725814352395345&amp;postID=7925646303931962718' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/7925646303931962718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/724725814352395345/posts/default/7925646303931962718'/><link rel='alternate' type='text/html' href='http://otaviof.blogspot.com/2008/09/hello-world.html' title='Hello World'/><author><name>Otávio Fernandes ("otaviof")</name><uri>http://www.blogger.com/profile/14657721249210574890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_HKYMxMA-y_A/SaigsIs7oHI/AAAAAAAAAFE/M2NR_nzrO6o/S220/me_at_locaweb.jpg'/></author><thr:total>1</thr:total></entry></feed>
