<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Glider</title>
	<atom:link href="http://maleiria.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://maleiria.wordpress.com</link>
	<description>Amen, in Javadocs we trust!</description>
	<lastBuildDate>Tue, 25 Oct 2011 18:57:12 +0000</lastBuildDate>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='maleiria.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Glider</title>
		<link>http://maleiria.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://maleiria.wordpress.com/osd.xml" title="Glider" />
	<atom:link rel='hub' href='http://maleiria.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Lei de Demeter</title>
		<link>http://maleiria.wordpress.com/2011/05/04/lei-de-demeter/</link>
		<comments>http://maleiria.wordpress.com/2011/05/04/lei-de-demeter/#comments</comments>
		<pubDate>Wed, 04 May 2011 16:30:42 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=86</guid>
		<description><![CDATA[Um método f de uma classe C  só deve chamar métodos de: C Um objecto criado por f Um objecto passado como argumento para f Um objecto guardado numa variável de instância de C<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=86&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um método <em>f</em> de uma classe <em>C  </em>só deve chamar métodos de:</p>
<ul>
<li><em>C</em></li>
<li>Um objecto criado por <em>f</em></li>
<li>Um objecto passado como argumento para <em>f</em></li>
<li>Um objecto guardado numa variável de instância de <em>C</em></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=86&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2011/05/04/lei-de-demeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Kerberos MIT</title>
		<link>http://maleiria.wordpress.com/2011/04/21/kerberos-mit/</link>
		<comments>http://maleiria.wordpress.com/2011/04/21/kerberos-mit/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 14:02:20 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Kerberos]]></category>
		<category><![CDATA[kerberos]]></category>
		<category><![CDATA[single sign on]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=67</guid>
		<description><![CDATA[Como funciona: O Kerberos foi desenvolvido a pensar em autenticação e não em autorização.  Podemos comparar o Kerberos a uma espécie de serviço supremo que nos diz: &#8220;sim, podes confiar em mim e esta pessoa é quem ela diz que é&#8221;. Kerberos só trabalha a parte da autenticação. Não faz autorização (conceder ou negar acesso [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=67&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://maleiria.files.wordpress.com/2011/04/dog-ring.jpg"><img class="alignnone size-full wp-image-68" title="Kerberos" src="http://maleiria.files.wordpress.com/2011/04/dog-ring.jpg?w=170&#038;h=178" alt="Kerberos" width="170" height="178" /></a></p>
<p><strong>Como funciona:</strong></p>
<p>O Kerberos foi desenvolvido a pensar em autenticação e não em autorização.  Podemos comparar o Kerberos a uma espécie de serviço supremo que nos diz: &#8220;sim, podes confiar em mim e esta pessoa é quem ela diz que é&#8221;.</p>
<p>Kerberos só trabalha a parte da autenticação. Não faz autorização (conceder ou negar acesso a serviços baseados no desejo de o utilizador usá-los) e também não trata a parte de gestão de contas, ou seja, não guarda nenhuma informação relacionada com UIDs, GIDs, <em>home paths</em>.</p>
<p>Sendo Kerberos um protocolo, têm várias implementações, desenvolvidas para vários propósitos:</p>
<ul>
<li><strong>Kerberos MIT:</strong> O original. Devido a restrições de exportação da tecnologia de encriptação, foi desenvolvido na Europa o Kerberos Heimdal</li>
<li><strong>Kerberos Heimdal: </strong> A versão Suiça do Kerberos. É compatível com o Kerberos MIT. As restrições do Kerberos MIT foram levantadas em 2000 de forma que ambas as implementações coexistem em larga escala.</li>
<li><strong>Active Directory: </strong> Não é propriamente uma implementação do Kerberos. É um diretório Microsoft com uma implementação Kerberos e mais alguns serviços associados (LDAP). Não é directamente compatível com o Kerberos MIT ou Heimdal.</li>
<li><strong>TrustBroker: </strong>Uma implementação comercial do protocolo Kerberos, desenvolvida pela CyberSafe. Suporta uma série de sistemas operativos (Windows, Linux, Unix,&#8230;) e oferece interoperabilidade com outras implementações.</li>
<li><strong>Shishi: </strong>Uma implementação do Kerberos 5 para GNU.</li>
</ul>
<div>Feita a introdução, vamos avançar para os detalhes de funcionamento. Vamos só falar em Kerberos V5.</div>
<div><strong>Ticket Exchange Service:</strong></div>
<div><strong><br />
</strong></div>
<div>A comunicação no Kerberos é construída à volta do protocolo <a title="Needham-Shroeder" href="http://en.wikipedia.org/wiki/Needham-Schroeder_protocol" target="_blank">Needham-Shroeder</a>  (NS protocol), desenhado de forma a providenciar um serviço de autenticação seguro e distribuído, através da criptografia de uma chave secreta.</div>
<div>Todas as chaves são secretas, partilhadas pelas extremidades de uma ligação Kerberos. Difere dos sistemas assimétricos onde existe uma chave pública que toda a gente sabe e uma chave privada que permanece num servidor.</div>
<div>Para um utilizador, a chave secreta é a sua password em <em>hash</em>(a password é convertida numa string utilizando uma função de um caminho hash [<em>one way hash function</em>], string essa que passa a ser utilizada como chave), normalmente guardada no <em><strong>Key Distribution Center</strong></em> (KDC).</div>
<div>Para um serviço, a chave é uma sequência gerada aleatoriamente que também é guardada no KDC e num ficheiro chamado <em><strong>keytab</strong></em> na máquina onde se encontra o serviço.</div>
<div>De forma a que este sistema funcione, os clientes e os serviços têm ambos de confiar num terceiro serviço externo, o servidor Kerberos, que seja capaz de providenciar as chaves a pedido.</div>
<div>A comunicação Kerberos é construída à volta de <strong><em>tickets</em></strong> . Os tickets são uma esquema de dados encriptados transmitidos pela rede e guardados no lado do cliente (a forma como são guardados depende do sistema operativo do cliente e de outras configurações). Tradicionalmente, são guardados num ficheiro em /tmp.</div>
<div>A parte central de uma rede baseada no protocolo Kerberos é o <strong><em>Key Distribution Center </em></strong>(KDC). Consiste em três partes:</div>
<div>
<ul>
<li>Um <strong><em>Authentication Server</em></strong> que responde a pedidos de autenticação por parte dos clientes. Aqui estamos na fase de <strong>AS_REQUEST</strong> e <strong>AS_REPLY</strong>, onde o cliente recebe um <strong><em>Ticket Granting Ticket </em></strong>(TGT)</li>
<li>Um <strong><em>Ticket Granting Server</em></strong>, que emite <strong><em>Ticket Granting Service </em></strong>(TGS) para um cliente. Esta é a fase <strong>TGS_REQUEST</strong> e <strong>TGS_REPLY </strong>onde o cliente recebe um TGS que vai permiti-lo autenticar-se junto de um serviço acessível na rede.</li>
<li>Uma base de dados que guarda todas as chaves secretas (dos clientes e dos serviços) e mais alguma informação relacionada com as contas Kerberos (datas de criação, políticas&#8230;)</li>
</ul>
<div>Normalmente o KDC é uma máquina dedicada apenas a servir serviços Kerberos (por questões de segurança).</div>
<div>As contas Kerberos chamam-se <strong><em>principals</em></strong> (é o equivalente a um username nas contas Unix).</div>
</div>
<div>O sistema de criptografia Kerberos é DES e suas variantes como o 3DES</div>
<div><strong>Mecanismo de autenticação &#8211; Ticket Granting Tickets :</strong></div>
<div><strong><br />
</strong></div>
<div>O mecanismo de autenticação é o primeiro passo a ser executado num ambiente Kerberos. Ele providencia o utilizador com um <strong>Ticket Granting Ticket </strong>(TGT) que serve de pós- autenticação  para mais tarde aceder a serviços específicos, Single Sign On.</div>
<div><strong>-&gt; Pré-Autenticação</strong></div>
<div>Este método veio colmatar uma falha de segurança no Kerberos 4 e no fundo, este passo implica que o cliente primeiro que tudo tem de se identificar junto do KDC antes de obter um TGT.</div>
<div><strong>-&gt; 1º passo: Authentication Service Request &#8211; AS_REQUEST</strong></div>
<div>Esta é a primeira mensagem enviada ao KDC. Contém:</div>
<div>
<ul>
<li>O principal nome do cliente</li>
<li>O principal Ticket Granting Server (chamado &#8220;krbtgt principal&#8221;) que vai ser necessário mais tarde para obter o TGS.</li>
<li>O timestamp do cliente</li>
<li>O tempo de vida do ticket pedido (normalmente entre 8 a 10 horas)</li>
</ul>
<div>O KDC recebe esta mensagem, verifica se o principal do cliente existe na sua base de dados e, se o timestamp entre a máquina do cliente e do KDC estiver próximo (tipicamente entre 3 a 5 minutos). Esta verificação do timestamp é somente para avisar o cliente, caso haja alguma de-sincronização temporal, antes de avançarem mais no processo de autenticação.</div>
</div>
<div>Se a pré-autenticação for obrigatória, o KDC não retorna um TGT. Em vez disso ele envia uma mensagem NEEDED_PREAUTH e pede ao cliente para enviar alguns dados pré-autenticação antes de entregar o TGT. Tradicionalmente o método usado é o PA-ENC-TIMESTAMP, onde o timestamp corrente é encriptado usando a chave do utilizador. conhecida no lado do cliente através da password.</div>
<div>Neste caso, o cliente reenvia uma mensagem AS_REQUEST mas desta vez incluindo o timestamp encriptado. Se a pré-autenticação for bem sucedida, o KDC retorna um TGT. Este é o passo AS_REPLY.</div>
<div><strong>-&gt; 2º passo: Authentication Service Reply &#8211; AS_REPLY</strong></div>
<div>Após verificação, o Authentication Server gera uma chave de sessão aleatória (&#8220;short term&#8221; key). O KDC faz duas cópias: uma é para o cliente e é adicionada à mensagem AS_REPLY; a segunda cópia fica disponível no Ticket Granting Server. Esta última chave é para ser usada em negociações posteriores para outros tickets relacionados com serviços kerberizados.</div>
<div>Então, partindo do princípio que o cliente é autenticado com sucesso, o KDC envia uma mensagem AS_REPLY contendo o Ticket Granting Ticket. Será guardado numa espécie de cache de credenciais para ser usado mais tarde. A mensagem é encriptada com a chave do utilizador.</div>
<div>A mensagem AS_REPLY é formada por duas camadas: a primeira é encriptada com a chave do cliente enquanto que a segunda camada é o próprio TGT, primeiro encriptado com a chave do Ticket Granting Server  e depois reencriptado com a chave do utilizador. Desta forma só o utilizador autenticado é que vai conseguir desencriptar a mensagem para obter o TGT.</div>
<div>O conteúdo da mensagem AS_REPLY é o seguinte:</div>
<div>
<ul>
<li>encriptado com a chave do utilizador</li>
<ul>
<li>uma cópia da chave da sessão para o utilizador</li>
<li>o tempo de duração do ticket</li>
<li>o nome principal do krbtgt</li>
</ul>
<li>primeiro encriptado com a chave do Ticket Granting Server e depois com a chave do utilizador.Este é o TGT</li>
<ul>
<li>uma cópia da chave de sessão</li>
<li>o tempo de vida do ticket</li>
<li>o timestamp do KDC</li>
<li>o principal do cliente</li>
<li>o endereço IP do cliente</li>
</ul>
</ul>
<div>NOTA: apesar do TGT ser desencriptado e colocado na cache no lado do cliente, o seu conteúdo não pode ser lido no lado do cliente porque o mesmo está encriptado com a chave do Ticket Granting Server que só é conhecida pelo Ticket Granting Server.</div>
<div>Resumindo, podemos representar o mecanismo de autenticação desta forma:</div>
<div><a href="http://maleiria.files.wordpress.com/2011/04/tgt_delivery.png"><img class="alignnone size-medium wp-image-71" title="Kerberos V5 Authentication Service - TGT delivery" src="http://maleiria.files.wordpress.com/2011/04/tgt_delivery.png?w=400&#038;h=284" alt="Kerberos V5 Authentication Service - TGT delivery" width="400" height="284" /></a></div>
<div><strong>Mecanismo do Serviço &#8211; Ticket Granting Service</strong></div>
<div><strong><br />
</strong></div>
<div>Partindo do princípio que o cliente já passou pelo mecanismo de autenticação e já tem o Ticket Granting Ticket (TGT), o que ele quer agora é pedir acesso a um determinado serviço que está kerberizado na rede (pode ser um web server, um file sharing&#8230;). Para alcançar este objetivo, o cliente vai pedir um Ticket Granting Service (TGS).</div>
<div>Mais uma vez este pedido é dividido em dois passos: o TGS_REQUEST e o TGS_REPLY. Ambas as mensagens estão encriptadas por motivos de segurança.</div>
<div><strong>-&gt; 1º passo: Ticket Granting Service Request &#8211; TGS_REQUEST</strong></div>
<div>Quando um utilizador quer aceder a um serviço kerberizado, primeiro tem de se identificar junto dele. Este pré requisito necessita de uma ligação separada ao Ticket Granting Server: o TGS_REQUEST.</div>
<div>A mensagem enviada pelo cliente é composta por vários elementos:</div>
<div>
<ul>
<li>o próprio pedido do TGS, contendo o serviço principal e o tempo de vida pedido.</li>
<li>o TGT adquirido anteriormente (após uma autenticação bem sucedida)</li>
<li>um autenticador</li>
</ul>
<div>O autenticador é a mensagem ecnriptada com a chave de sessão adquirida durante o processo AS e contém o principal do utilizador e um timestamp. Assim, o KDC assegura que esta mensagem única vem da pessoa certa: primeiro verificando a chave temporária de sessão negociada anteriormente e segundo através do timestamp que detecta respostas fraudulentas. O objectivo do autenticador é frustar respostas.</div>
</div>
<div>Após um pedido válido (um TGT válido e um autenticador correcto), o Ticket Granting Server vai retornar o TGS.</div>
<div><strong>-&gt; 2º passo: Ticket Granting Service Reply &#8211; TGS_REPLY</strong></div>
<div>Neste passo, o servidor vai gerar um novo conjunto de chaves de sessão.</div>
<div>A mensagem de resposta do servidor está encriptada com a chave de sessão adquirida através do processo AS, de forma que só o cliente que efetivamente se tinha autenticado anteriormente no KDC é que vai conseguir ler o seu conteúdo e extrair o TGS guardado.</div>
<div>A mensagem forma o TGS_REPLY e contém</div>
<div>
<ul>
<li>encriptada com a chave de sessão adquirida durante o processo AS:</li>
<ul>
<li>cópia de uma nova chave de sessão para o utilizador</li>
<li>tempo de vida efetivo do ticket</li>
<li>nome do serviço principal</li>
</ul>
<li>primeiro encriptado com a chave do serviço de longo termo, depois com a chave de sessão actual. Isto é o TGS:</li>
<ul>
<li>cópia de uma nova chave de sessão, para o serviço</li>
<li>tempo de vida efetivo do bilhete</li>
<li>KDC timestamp</li>
<li>principal do cliente</li>
<li>endereço IP do cliente</li>
</ul>
</ul>
<div><strong>-&gt; 3º passo: Contactar o serviço</strong></div>
<div>Assim que o cliente tiver obtido o seu TGS, irá usá-lo para se autenticar diretamente junto do serviço requisitado. Este passo depende muito do tipo de serviço que pediu ajuda ao Kerberos de forma que não dá para detalhar muito.</div>
</div>
<div>O serviço tem acesso ao seu keytab, um ficheiro que guarda a sua chave de longo termo. Esta chave é que vai permitir ao serviço desencriptar o TGS enviado pelo cliente e obter todas as informações necessárias para criar um contexto de segurança</div>
<div>Esquematicamente,</div>
<div><a href="http://maleiria.files.wordpress.com/2011/04/tgs_delivery.png"><img class="alignnone size-medium wp-image-75" title="Kerberos V5 Ticket Granting Service - TGS delivery" src="http://maleiria.files.wordpress.com/2011/04/tgs_delivery.png?w=400&#038;h=293" alt="Kerberos V5 Ticket Granting Service - TGS delivery" width="400" height="293" /></a></div>
<div><strong>Conclusão:</strong></div>
<div>Podemos dividir o protocolo Kerberos em três passos fundamentais:</div>
<div>
<ol>
<li>Processo de autenticação onde o utilizador (e anfitrião) obtém um Ticket Granting Ticket (TGT) como um token de autenticação.</li>
<li>Processo de requisito de um serviço, onde o utilizador obtém um Ticket Granting Service (TGS) para aceder ao serviço.</li>
<li>Acesso ao serviço, onde o utilizador (e anfitrião) utilizam o TGS para se autenticarem e acederem a determinado serviço.</li>
</ol>
</div>
<div><a href="http://maleiria.files.wordpress.com/2011/04/ticketsnegotiationmechanism.png"><img class="alignnone size-medium wp-image-77" title="Kerberos V5 Tickets Negociation Mechanism" src="http://maleiria.files.wordpress.com/2011/04/ticketsnegotiationmechanism.png?w=400&#038;h=285" alt="Kerberos V5 Tickets Negociation Mechanism" width="400" height="285" /></a></div>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=67&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2011/04/21/kerberos-mit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>

		<media:content url="http://maleiria.files.wordpress.com/2011/04/dog-ring.jpg" medium="image">
			<media:title type="html">Kerberos</media:title>
		</media:content>

		<media:content url="http://maleiria.files.wordpress.com/2011/04/tgt_delivery.png?w=300" medium="image">
			<media:title type="html">Kerberos V5 Authentication Service - TGT delivery</media:title>
		</media:content>

		<media:content url="http://maleiria.files.wordpress.com/2011/04/tgs_delivery.png?w=300" medium="image">
			<media:title type="html">Kerberos V5 Ticket Granting Service - TGS delivery</media:title>
		</media:content>

		<media:content url="http://maleiria.files.wordpress.com/2011/04/ticketsnegotiationmechanism.png?w=300" medium="image">
			<media:title type="html">Kerberos V5 Tickets Negociation Mechanism</media:title>
		</media:content>
	</item>
		<item>
		<title>Problema da Distância Documental</title>
		<link>http://maleiria.wordpress.com/2011/04/19/problema-da-distancia-documental/</link>
		<comments>http://maleiria.wordpress.com/2011/04/19/problema-da-distancia-documental/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 10:48:10 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[algoritmos]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=47</guid>
		<description><![CDATA[Motivação: Dados dois documentos, quão semelhantes eles são? Idênticos? Modificados ou relacionados (plágio, DNA&#8230;) Como exemplo prático vamos brincar com o velho e o novo Testamento mas antes há-que introduzir algumas definições: Palavra: sequência de caracteres alfanuméricos (por exemplo, a frase &#8220;666.6 é quase o número da besta&#8221; tem 8 palavras). Frequência de palavras: Definimos a frequência [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=47&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Motivação: Dados dois documentos, quão semelhantes eles são?</strong></p>
<ul>
<li><strong>Idênticos?</strong></li>
<li><strong>Modificados ou relacionados (plágio, DNA&#8230;)</strong></li>
</ul>
<div>Como exemplo prático vamos brincar com o velho e o novo Testamento mas antes há-que introduzir algumas definições:</div>
<div>
<ol>
<ol>
<li><strong>Palavra</strong>: sequência de caracteres alfanuméricos (por exemplo, a frase &#8220;666.6 é quase o número da besta&#8221; tem 8 palavras).</li>
<li><strong>Frequência de palavras: </strong>Definimos a frequência de uma palavra , <em>D(w) </em>como o número de vezes que ela ocorre num documento <em>D</em>.</li>
<li><strong>Distância Métrica: </strong>A distância métrica entre documentos é definida como o produto interno entre os vectores <strong><em>D1 </em></strong>e <em><strong>D2</strong></em> que contêm as frequências de todas as palavras nos dois documentos. Matematicamente,<br />
<em><strong>D1 . D2 = ∑</strong>w<strong>[D1</strong>(w).<strong>D2</strong>(w)<strong>]          </strong></em>(1)</li>
<li><em><strong>Ângulo Métrico:</strong></em> o ângulo entre os vectores <em><strong>D1 </strong></em>e<em><strong> D2 </strong></em>dá-nos uma indicação da sobreposição dos dois documentos. Matematicamente,<br />
θ(<em><strong>D1.D2</strong></em>) = <em>arccos(<strong>D1.D2 / ||D1|| * ||D2||</strong>)          </em>com   0 ≤ θ ≤ π<em>/2. </em>Um ângulo métrico de 0 significa que os dois documentos são idênticos enquanto que um ângulo métrico de π/2 indica-nos que não há palavras em comum.</li>
<li><em><strong>Número de palavras em um Documento:</strong></em> a magnitude do vector <strong><em>D</em></strong> que contém frequências de palavras de todas as palavras no documento.. Matematicamente, <em>N(<strong>D</strong>) = ||<strong>D|| = √</strong>(<strong>D.D</strong>)</em></li>
</ol>
</ol>
<div>No fundo, o que estamos a fazer aqui é calcular o produto interno entre dois vectores. Para uma melhor compreensão, ver <a title="Dot Product" href="http://mathworld.wolfram.com/DotProduct.html" target="_blank">Dot Product</a></div>
<div>Uma boa fonte para livros em formato txt é <a title="Gutenberg" href="http://www.gutenberg.org/wiki/Main_Page" target="_blank">Gutenberg</a></div>
<div>Resumindo, para calcular a distância entre dois documentos,</div>
<div>     <strong>Para cada um dos dois ficheiros:</strong></div>
<div><em>          - Ler o ficheiro</em></div>
<div><em>          - Fazer uma lista de palavras</em></div>
<div><em>          - Contar as frequências</em></div>
<div><em>          - Ordenar</em></div>
<div><strong>     Uma vez obtidos os vectores <em>D1 </em>e <em>D2</em>:</strong></div>
<div>          Calcular o ângulo θ</div>
<div>Vamos ver o código:</div>
</div>
<div>
<pre>/**
 * @author Manuel Leiria
 *
 */
public class DocumentMatcher {
	private Map&lt;String, Integer&gt; mapWordFrequencyDoc1 = 
             new TreeMap&lt;String, Integer&gt;();
	private Map&lt;String, Integer&gt; mapWordFrequencyDoc2 = 
             new TreeMap&lt;String, Integer&gt;();

	/**
	 * @return the mapWordFrequencyDoc1
	 */
	public Map&lt;String, Integer&gt; getMapWordFrequencyDoc1() {
		return Collections.unmodifiableMap(mapWordFrequencyDoc1);
	}
	/**
	 * @return the mapWordFrequencyDoc2
	 */
	public Map&lt;String, Integer&gt; getMapWordFrequencyDoc2() {
		return Collections.unmodifiableMap(mapWordFrequencyDoc2);
	}
	/**
	 *
	 * @param file1
	 * @param file2
	 */
	public DocumentMatcher(final String file1, final String file2) {
		buildFrequencyMap(file1, mapWordFrequencyDoc1);
		buildFrequencyMap(file2, mapWordFrequencyDoc2);
		synchronizeWordMaps();
	}
	/**
	 * Constroi um Mapa na forma [palavra, num. de vezes que
         *  ela ocorre no documento]
	 * @param file
	 * @param mapWordFrequency
	 */
	private void buildFrequencyMap
             (final String file, Map&lt;String, Integer&gt; mapWordFrequency){
		try{
			Scanner input = new Scanner(new File(file));
			while(input.hasNextLine()){
			    final String line = input.nextLine();
			        StringTokenizer parser = 
                                 new StringTokenizer(line, ",.;:()-!?' ");
			    while(parser.hasMoreTokens()){
			        final String word = 
                                    parser.nextToken().toUpperCase();

				Integer listing = mapWordFrequency.get(word);
				if(listing == null){
				    listing = 1;
				}else{
				    listing += 1;
				}
				mapWordFrequency.put(word, listing);
			    }
			}
		input.close();
		}catch(IOException e){
			System.out.println(e);
		}
	}
	/**
	 * Adiciona as palavras que nao existem nos respectivos mapas
	 */
	private void synchronizeWordMaps(){
		for(final Map.Entry&lt;String, Integer&gt; entry : 
                  mapWordFrequencyDoc1.entrySet()){
		    if(!mapWordFrequencyDoc2.containsKey(entry.getKey())){
		      mapWordFrequencyDoc2.put(entry.getKey(), 0);
		    }
		}
		for(final Map.Entry&lt;String, Integer&gt; entry : 
                  mapWordFrequencyDoc2.entrySet()){
		    if(!mapWordFrequencyDoc1.containsKey(entry.getKey())){
		      mapWordFrequencyDoc1.put(entry.getKey(), 0);
		    }
		}
	}
	/**
	 *
	 * @return o angulo theta entre os dois documentos
	 * Um theta = 0 =&gt; documetos identicos
	 * Um theta = pi/2 =&gt; Nao ha palavras em comum
	 */
	public double getTheta(){
		double [] frequency1 = 
                  new double[mapWordFrequencyDoc1.size()];
		double [] frequency2 = 
                  new double[mapWordFrequencyDoc2.size()];
		int cnt = 0;
		for(final Map.Entry&lt;String, Integer&gt; entry : 
                  mapWordFrequencyDoc1.entrySet()){
			frequency1[cnt] = entry.getValue();
			cnt++;
		}
		cnt = 0;
		for(final Map.Entry&lt;String, Integer&gt; entry : 
                  mapWordFrequencyDoc2.entrySet()){
			frequency2[cnt] = entry.getValue();
			cnt++;
		}
		double theta = 0;
		for(int i=0,n=frequency1.length;i&lt;n;i++){
			theta += frequency1[i]*frequency2[i];
		}
		return Math.acos(theta / 
                (getNorm(mapWordFrequencyDoc1) * 
                  getNorm(mapWordFrequencyDoc2)));
	}
	/**
	 * Calcula a norma de D(w)
	 * @param vector
	 * @return ||D(w)||
	 */
	private double getNorm(Map&lt;String, Integer&gt; vector ){
		double norm = 0.0;
		for(final Map.Entry&lt;String, Integer&gt; entry : 
                  vector.entrySet()){
			norm += Math.pow(entry.getValue(), 2);
		}
		return Math.sqrt(norm);
	}
	/**
	 * Escreve o resultado para um ficheiro
	 * @param file
	 * @param mapWordFrequency
	 */
	public void writeString(final String file, 
          final Map&lt;String, Integer&gt; mapWordFrequency){
		try {
			final PrintWriter output = new PrintWriter(file);
			for(final Map.Entry&lt;String, Integer&gt; entry : 
                          mapWordFrequency.entrySet()){
				output.println(entry);
			}
			output.close();
		} catch (FileNotFoundException e) {
			System.out.println(e);
		}
	}
}
public class TestDocumentMatcher {

	public static final String PATH =
		"/home/manuel/Documentos/Books/";
	public static final String IN_FILE_1 =
		"New_Testament.txt";
	public static final String IN_FILE_2 =
		"Old_Testament.txt";

	public static final String OUT_FILE_1 =
		"New_Testament.out";
	public static final String OUT_FILE_2 =
		"Old_Testament.out";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		long initTime = Calendar.getInstance().getTimeInMillis();
		DocumentMatcher dc =
			new DocumentMatcher(PATH + IN_FILE_1, 
                          PATH + IN_FILE_2);

		dc.writeString(PATH + OUT_FILE_1, 
                  dc.getMapWordFrequencyDoc1());
		dc.writeString(PATH + OUT_FILE_2, 
                  dc.getMapWordFrequencyDoc2());

		System.out.println("THETA--&gt;" + dc.getTheta());
		System.out.println("Pi/2--&gt;" + Math.PI/2);
		long elapsedTime =
			Calendar.getInstance().
                          getTimeInMillis() - initTime;
		System.out.println("TIME ELAPSED--&gt;" + 
                  elapsedTime/1000 + " seconds");
	}
}
THETA--&gt;0.2850240436473282
Pi/2--&gt;1.5707963267948966
TIME ELAPSED--&gt;1 seconds</pre>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=47&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2011/04/19/problema-da-distancia-documental/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>1 &#8211; Probabilidade e Valor Expectável no Poker Holdem</title>
		<link>http://maleiria.wordpress.com/2011/03/07/1-probabilidade-e-valor-expectavel-no-poker-holdem/</link>
		<comments>http://maleiria.wordpress.com/2011/03/07/1-probabilidade-e-valor-expectavel-no-poker-holdem/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 00:24:43 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[poker]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=37</guid>
		<description><![CDATA[Vamos começar pelos conceitos mais básicos e a partir daí construir as fundações da teoria matemática para (tentar) analisar um jogo de poker na variante Holdem. Vão ser muitos posts A ideia vai ser apresentar a  teoria e de seguida concretizar com um exemplo de uma situação real num jogo de poker. Probabilidade Se n [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=37&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vamos começar pelos conceitos mais básicos e a partir daí construir as fundações da teoria matemática para (tentar) analisar um jogo de poker na variante Holdem. Vão ser muitos posts <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>A ideia vai ser apresentar a  teoria e de seguida concretizar com um exemplo de uma situação real num jogo de poker.</p>
<p><strong>Probabilidade</strong></p>
<p>Se <em>n </em>tentativas de um experimento (tal como dar uma mão de holdem) produzir <em>n0 </em>ocorrências de  um evento <em>x</em>, definimos a probabilidade <em> p </em>de <em>x </em> ocorrer <em>p(x) </em> como</p>
<p><em>p(x) = lim(n→∞) n0/n</em></p>
<p>Comecemos com uma pergunta muito simples: Qual é a probabilidade de sair um ás?</p>
<p>Temos 4 ases num baralho de 52 cartas, ou seja, 4 chances em 52: p(A)=4/52=1/13. Note-se que estamos a somar as probabilidades individuais (a probabilidade de sair um ás mais a probabilidade de sair outro ás&#8230;) porque são mutuamente exclusivas, i.e., uma carta não pode ser ao mesmo tempo um ás de copas e um ás de espadas.</p>
<p><strong>Eventos Independentes</strong></p>
<p>Consideremos agora os seguintes eventos:</p>
<ul>
<li>A carta é uma copa : <em>p(H) = 13/52=1/4 </em>(há 13 copas possíveis num baralho de 52 cartas)</li>
<li>A carta é um ás: <em>p(A) = 4/52=1/13 </em>(há 4 ases possíveis num baralho de 52 cartas)</li>
</ul>
<p>mas neste caso, se quisermos calcular a probabilidade de sair um ás ou uma copa, não podemos adicionar como anteriormente porque pode sair uma carta que seja um ás e uma copa (um ás de copas).</p>
<p>Podemos então lançar a ideia de eventos independentes: se a probabilidade de dois eventos ocorrerem for igual ao produto das probabilidades individuais =&gt; os eventos são <em><strong>independentes</strong></em>. Neste caso, a probabilidade de <em>A </em>e <em>B </em> ocorrerem chama-se <em><strong>probabilidade conjunta</strong></em>.</p>
<p>A probabilidade conjunta de uma carta ser uma copa e um ás é 1/4 * 1/13</p>
<p><strong>Eventos Dependentes</strong></p>
<p>Para introduzir este conceito, consideremos os seguintes eventos:</p>
<ul>
<li>B: a primeira carta a sair é um ás</li>
<li>A: a segunda carta a sair é um ás</li>
</ul>
<p>e façamos a seguinte pergunta: qual a probabilidade de A acontecer sabendo que B aconteceu (ou seja, qual é a probabilidade de sair um ás na segunda carta sabendo que já saiu um ás na primeira carta)?. A isto chama-se <em><strong>probabilidade condicional. </strong></em>É fácil ver que os eventos são independentes se a probabilidade condicional de <em>A </em> dado <em>B</em> for igual à probabilidade de <em>A </em>(o fato de <em>B</em> ter acontecido não influencia em nada o <em>A</em>).</p>
<p>Vamos utilizar a seguinte notação:</p>
<ul>
<li><em>p(A </em>U <em>B) = </em>Probabilidade de <em>A </em>ou <em>B </em>ocorrerem</li>
<li><em>p(A ∩ B)</em> = Probabilidade de <em>A </em>e <em>B </em>ocorrerem</li>
<li><em>p(A|B) = </em>Probabilidade de <em>A </em>ocorrer dado que <em>B </em>já ocorreu</li>
</ul>
<p><strong><em>Eventos mutuamente exclusivos:</em></strong></p>
<ul>
<li><em><em>p(A </em>U <em>B) = p(A) + p(B)          (1.1)</em></em><em><br />
</em></li>
</ul>
<p><em><strong>Eventos independentes</strong></em></p>
<ul>
<li>p(A ∩ B) = p(A)p(B)          (1.2)</li>
</ul>
<p><em><strong>Para todos os eventos</strong></em></p>
<ul>
<li><em><em>p(A </em>U <em>B) = p(A) + p(B) - <em>p(A ∩ B)          (1.3)</em></em><br />
</em></li>
</ul>
<p><em><strong>Para eventos dependentes</strong></em></p>
<ul>
<li><em>p(A ∩ B) = p(A)p(B|A)          (1.4)</em></li>
</ul>
<p>Podemos ver que a eq.(1.1) é um caso especial da eq.(1.3).</p>
<p>Podemos ver que a eq.(1.2) é um caso especial da eq(1.4). Facilmente concluímos que, para eventos independentes, p(B|A) = p(B).</p>
<p>Com os dois eventos definidos anteriormente, façamos a seguinte pergunta: com que frequência uma mão de holdem contém dois ases?</p>
<p><em>p(A) = 1/13</em></p>
<p><em>p(B) = 1/13</em></p>
<p>no entanto os eventos são dependentes! Se</p>
<p><em>p(A ∩ B) = p(A)p(B|A) = 1/13 * 1/17 = 1/221</em></p>
<p>Antes de avançarmos com uma pergunta bem mais interessante, vamos expor algumas propriedades das probabilidades (para ver algo mais formal sobre este assunto, consultar por exemplo <a href="http://mathworld.wolfram.com/Probability.html">Probability</a>). Definimos <em>C </em>como o evento certo e <em>I</em> o evento impossível. Então,</p>
<ul>
<li>0 <em>≤</em><em>p(A) <em>≤ 1 qualquer que seja o evento A</em></em></li>
<li><em><em>p(C) = 1</em></em></li>
<li><em><em>p(I) = 0</em></em></li>
<li><em><em>p(A) + p(‾A) = 1</em></em></li>
</ul>
<p>Já temos material suficiente para conseguirmos responder à seguinte questão: Tendo uma mão do mesmo naipe, qual a probabilidade de sair um flush no flop?</p>
<p>Com duas cartas no mesmo naipe na mão, sobram 11 cartas do mesmo naipe no baralho. Consideremos os 3 eventos:</p>
<ul>
<li>A: a primeira carta do flop ser uma carta de flush</li>
<li>B: a segunda carta do flop ser uma carta de flush, sabendo que a primeira carta é de flush</li>
<li>C: a terceira carta do flop ser uma carta de flush sabendo que as duas anteriores são cartas de flush</li>
</ul>
<p>Na notação definida anteriormente, o que queremos calcular é a <em>p(A <em>∩ B <em>∩ C). </em></em></em>Temos os seguintes dados:</p>
<ul>
<li><em>p(A) </em>= <em>11/50 </em>(há 11 cartas possíveis do mesmo naipe que as que temos na mão em 50 cartas)</li>
<li><em>p(B\A) = 10/49 </em>(como já sairam 3 cartas do mesmo naipe, sobram 10 cartas em 49 possíveis)</li>
<li><em>p(C|(A <em>∩ B) = 9/48 (há 9 cartas possíveis em 48)</em></em></li>
</ul>
<p>Da eq.(1.4), <em>p(A ∩ B) = p(A)p(B|A) = 11/50 x 10/49 = 11/245</em></p>
<p>Definimos <em>D = A <em>∩ B. </em></em>Então, <em>p(D <em>∩ C) = p(D)p(C\D)</em></em></p>
<p>Reunindo  tudo, <em>p(A <em>∩ B <em>∩ C) = <em>p(C|(A <em>∩ B) p(<em><em><em><em>A <em>∩ B) = 9/48 * 11/245 = 33/3920 (um pouco menos de 1%)</em></em></em></em></em></em></em></em></em></em></p>
<p><strong>Distribuições de Probabilidades</strong></p>
<p>Quando uma distribuição de probabilidades tem valores numéricos associados às possíveis saídas, podemos encontrar o <em><strong>valor expectável</strong> <strong>(EV) </strong></em> dessa distribuição, que é o valor de cada saída multiplicada pela sua probabilidade, tudo somado no fim. De outra forma, podemos dizer que para uma distribuição de probabilidades <em>P</em> onde cada uma das <em>n </em> saídas tem um valor <em>xi </em>e uma probabilidade <em>pi, </em> então o valor expectável de <em>P </em>é</p>
<p><em>&lt;P&gt; = ∑ pi * xi</em></p>
<p>e esta é uma ideia central do poker: para ganhar é necessário estar constantemente a maximizar o valor expectável.</p>
<p>Há uma propriedade importante do valor expectável: O <em>EV </em> é aditivo, i.e., de <em>n </em>apostas diferentes em linha, o <em>EV </em> é igual à soma dos <em>EVs </em> individuais para cada aposta.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=37&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2011/03/07/1-probabilidade-e-valor-expectavel-no-poker-holdem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Quatro gatinhos</title>
		<link>http://maleiria.wordpress.com/2010/05/24/quatro-gatinhos/</link>
		<comments>http://maleiria.wordpress.com/2010/05/24/quatro-gatinhos/#comments</comments>
		<pubDate>Mon, 24 May 2010 22:17:06 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=33</guid>
		<description><![CDATA[Sr. Félix: Querida, quantos gatinhos tivemos na última ninhada? Sra. Félix: Quatro. Sr. Félix:e quantos machos. Sra. Félix: ainda não sei. Sr. Félix: é pouco provável que sejam todos machos. Sra. Félix: tão-pouco provável que sejam todos fêmeas Sr. Félix: Não é assim tão difícil de calcular. Há 50% de probabilidades de cada gatinho ser [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=33&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sr. Félix: Querida, quantos gatinhos tivemos na última ninhada?<br />
Sra. Félix: Quatro.</p>
<p>Sr. Félix:e quantos machos.<br />
Sra. Félix: ainda não sei.</p>
<p>Sr. Félix: é pouco provável que sejam todos machos.<br />
Sra. Félix: tão-pouco provável que sejam todos fêmeas</p>
<p>Sr. Félix: Não é assim tão difícil de calcular. Há 50% de probabilidades de cada gatinho ser macho ou fêmea. Por isso, o resultado mais provável são dois machos e duas fêmeas.</p>
<p>Será que o pensamento do Sr. Félix está correcto??<br />
Analisemos as combinações possíveis:</p>
<table>
<tbody>
<tr>
<td>M</td>
<td>M</td>
<td>M</td>
<td>M</td>
</tr>
<tr>
<td>M</td>
<td>M</td>
<td>M</td>
<td>F</td>
</tr>
<tr>
<td>M</td>
<td>M</td>
<td>F</td>
<td>M</td>
</tr>
<tr>
<td>M</td>
<td>M</td>
<td>F</td>
<td>F</td>
</tr>
<tr>
<td>M</td>
<td>F</td>
<td>M</td>
<td>M</td>
</tr>
<tr>
<td>M</td>
<td>F</td>
<td>M</td>
<td>F</td>
</tr>
<tr>
<td>M</td>
<td>F</td>
<td>F</td>
<td>M</td>
</tr>
<tr>
<td>M</td>
<td>F</td>
<td>F</td>
<td>F</td>
</tr>
<tr>
<td>F</td>
<td>M</td>
<td>M</td>
<td>M</td>
</tr>
<tr>
<td>F</td>
<td>M</td>
<td>M</td>
<td>F</td>
</tr>
<tr>
<td>F</td>
<td>M</td>
<td>F</td>
<td>M</td>
</tr>
<tr>
<td>F</td>
<td>M</td>
<td>F</td>
<td>F</td>
</tr>
<tr>
<td>F</td>
<td>F</td>
<td>M</td>
<td>M</td>
</tr>
<tr>
<td>F</td>
<td>F</td>
<td>M</td>
<td>F</td>
</tr>
<tr>
<td>F</td>
<td>F</td>
<td>F</td>
<td>M</td>
</tr>
<tr>
<td>F</td>
<td>F</td>
<td>F</td>
<td>F</td>
</tr>
</tbody>
</table>
<p>Só dois em dezasseis casos é que são todos do mesmo sexo. Então, a probabilidade disso acontecer será 2/16 = 1/8. É muito pouco provável que sejam todos do mesmo sexo.</p>
<p>Analisemos a hipótese de dois machos e duas fêmeas. Ocorre 6 vezes, ou seja a probabilidade é de 6/16 = 3/8. É, sem dúvida superior a 1/8.</p>
<p>Então, até agora, podemos dizer que é mais provável o casal ter dois machos e duas fêmeas do que quatro machos ou quatro fêmeas.<br />
Mas a parte mais interessante é esta: consideremos 3 de um sexo e um de outro. Esta possibilidade ocorre em oito casos e a respectiva probabilidade é 8/16=1/2 o que é claramente superior à do caso 2-2</p>
<p>Quase toda a gente se surpreende com o facto de em famílias com quatro filhos ser mais provável haver três do mesmo sexo e um do outro do que dois de cada sexo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=33&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2010/05/24/quatro-gatinhos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Calculadora RPN</title>
		<link>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/</link>
		<comments>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 11:23:57 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[reverse polishnotation]]></category>
		<category><![CDATA[rpn]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=22</guid>
		<description><![CDATA[Uma expressão aritmética está em notação postfix (também chamada reverse polish notation ou RPN)se cada operador for colocado depois dos seus operandos. Por exemplo 3*(4+5) fica 3 4 5 + *. A notação 3*(4+5) chama-se infix. As expressões quando estão em notação postfix, são mais fáceis de serem processadas pelos computadores do que as expressões [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=22&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uma expressão aritmética está em notação postfix (também chamada <a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation">reverse polish notation</a> ou <i>RPN</i>)se cada operador for colocado depois dos seus operandos. Por exemplo 3*(4+5) fica 3 4 5 + *. A notação 3*(4+5) chama-se infix. As expressões quando estão em notação postfix, são mais fáceis de serem processadas pelos computadores do que as expressões infix.<br />
A seguinte classe processa expressões <i>rpn</i> e efectua as respectivas operações aritméticas. O centro nevrálgico do programa é o interface <b>Deque</b> e a classe <b>ArrayDeque</b>. Um deque é uma queue com duas saídas, ou seja, é uma estrutura linear que permite inserções e remoções só  nos dois extremos (<a href="http://java.sun.com/javase/6/docs/api/java/util/Deque.html">Deque</a>).<br />
Então, temos:</p>
<pre>
/**
 * Esta classe faz o parsing de expressões em postfix
 * (reverse polish notation)
 * e efectua as respectivas operações aritméticas
 *
 * @author Manuel
 *
 */
public class RPNCalculator {

	private static Deque stack =
		new ArrayDeque();
	/**
	 *
	 * @param input
	 */
	public static void calculate(String input) {
		char ch = input.charAt(0);
		if (ch == '+' || ch == '-' || ch == '*'
			|| ch == '/') {
			double y =
			  Double.parseDouble(
                                          stack.pop());
			double x =
			  Double.parseDouble(
			    stack.pop());
			double z = 0.0;
			switch (ch) {
			case '+':
				z = x + y;
				break;
			case '-':
				z = x - y;
				break;
			case '*':
				z = x * y;
				break;
			case '/':
				z = x / y;
				break;
			}
			System.out.printf
			  ("\t%.2f %c %.2f = %.2f%n",
			    x, ch, y, z);
			stack.push(new Double(z).toString());
		} else {
			stack.push(input);
		}
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (true) {
			String input = in.nextLine();
			calculate(input);
			if(input.equalsIgnoreCase("q"))
				break;
		}
	}
}
</pre>
<p>A parte chata é que para fazer uma qualquer operação, temo primeiro que converter a expresão para a sua correspondente versão RPN. Segue um programa que faz isso mesmo:</p>
<pre>
public class ConvertInfixToPostfix {

	public static void main(String[] args){

		Deque stack =
			new ArrayDeque();
		String line =
			new Scanner(System.in).nextLine();
		System.out.println(line);
		Scanner scanner = new Scanner(line);
		while(scanner.hasNext()){
			if(scanner.hasNextInt()){
				System.out.print(
				  scanner.nextInt() + " ");
			}else{
				String str = scanner.next();
				if("+-*/".indexOf(str) &gt;= 0){
					stack.push(str);
				}else if(str.equals(")")){
				  System.out.print(
				    stack.pop() + " ");
				}
			}
		}
		while(!stack.isEmpty()){
			System.out.print(stack.pop() + " ");
		}
		System.out.println();
	}
}</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=22&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/17/calculadora-rpn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Dicas: pesquisa binária e pesquisa sequêncial</title>
		<link>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/</link>
		<comments>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 11:42:24 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[algoritmos]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=20</guid>
		<description><![CDATA[/** * Pesquisa um numero x num array ordenado.É * muito mais eficiente do que a pesquisa sequencial * mas requer que os elementos do array estejam ordenados. * Ele repetidamente divide a sequência em dois e em cada * vez restringe a pesquisa à metade que contém o elemento. * * Este algoritmo corre [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=20&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<pre>
/**
 * Pesquisa um numero x num array ordenado.É
 * muito mais eficiente do que a pesquisa sequencial
 * mas requer que os elementos do array estejam ordenados.
 * Ele repetidamente divide a sequência em dois e em cada
 * vez restringe a pesquisa à metade que contém o elemento.
 *
 * Este algoritmo corre no tempo O(log(n)) o que quer dizer que
 * em média, o tempo de execução é proporcional ao logaritmo
 * do número de elementos no array.
 *
 *
 * @return o indice do numero x ou -1 se não encontrou
 */
public int binarySearch(int[] a, int x){

	int low = 0;
	int high = a.length;

	while(low &lt; high){
		int i = (low + high) / 2;
		if(a[i] == x){
			return i;
		}else if(a[i] &lt; x){
			low = i + 1;
		}else{
			high = i;
		}
	}
	return -1;
}
/**
 * Pesquisa sequencial (ou pesquisa linear) é o algoritmo
 * de pesquisa mais simples mas também é o menos eficiente.
 * Ele examina cada elemento sequencialmente começando
 * pelo primeiro elemento até chegar ao fim do array(se
 * eu estiver à procura de alguém num combóio, utilizo a
 * pesquisa sequencial)
 *
 * Este algoritmo corre no tempo O(n) o que quer dizer que
 * em média, o tempo de execução é proporcional ao número
 * de elementos no array.
 *
 * @return o indice do elemento a pesquisar ou 0 se não
 * o encontrar
 */
public int sequentialSearch(int[] a, int x){
	for(int i = 0, n = a.length; i &lt; n; i++){
		if(a[i] == x){
			return i;
		}
	}
	return -1;
}
/**
 * O algoritmo de binarysearch pode encontrar elementos rapidamente
 * num array que já está ordenado o que sugere que devamos ter os
 * elementos ordenados no array.No entanto, inserir novos elementos
 * num array ordenado é difícil pois temos de transladar os elementos
 * maiores para arranjar espaço para o novo elemento.Podemos faze-lo
 * assim:
 * @param a o array
 * @param n o numero de elementos que já estão ordenados no array
 * @param x o elemento a ser inserido no meio dos elementos
 */
void insert(int[] a, int n, int x){
  /**PreCondicao: a[0] &lt;= ... &lt;= a[n-1], e n &lt; a.length */
  /**PosCondicao: a[0] &lt;= ... &lt;= a[n], e x está entre eles */
  int i = 0;
  while(i &lt; n &amp;&amp; a[i] &lt;= x){
  	i++;
  }
  System.arraycopy(a, i, a, i+1, n-i);
  a[i] = x;
}
</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/20/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/20/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=20&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/05/dicas-pesquisa-binaria-e-pesquisa-sequencial/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Brincadeiras matemáticas 2</title>
		<link>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/</link>
		<comments>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 07:05:12 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[probabilidades]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=17</guid>
		<description><![CDATA[Este também é interessante: Provar que qualquer número a é igual a um número menor b: Sejam a, b, c quaisquer números tais que a = b + c então, multiplicando os dois lados por a &#8211; b, obtemos a (a &#8211; b) = (b + c)(a &#8211; b) a^2 -ab = ba &#8211; b^2 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=17&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este também é interessante:</p>
<p>Provar que qualquer número <em>a</em> é igual a um número menor <em>b</em>:<br />
Sejam <em>a, b, c</em> quaisquer números tais que<br />
<em><br />
a = b + c<br />
</em><br />
então, multiplicando os dois lados por <em>a &#8211; b</em>, obtemos<br />
<em><br />
a (a &#8211; b) = (b + c)(a &#8211; b)<br />
a^2 -ab = ba &#8211; b^2 + ca &#8211; cb<br />
</em><br />
passemos <em>ac</em> para o lado esquerdo,<br />
<em><br />
a^2 &#8211; ab -ac = ab &#8211; b^2 &#8211; bc<br />
</em><br />
factorizar,<br />
<em><br />
a(a &#8211; b &#8211; c) = b(a &#8211; b &#8211; c)<br />
</em><br />
dividindo ambos os lados por <em>a &#8211; b &#8211; c</em> obtemos</p>
<p><em>a = b</em></p>
<p>e esta?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=17&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/05/brincadeiras-matematicas-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Brincadeiras matemáticas</title>
		<link>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/</link>
		<comments>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 12:43:21 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Matemática]]></category>
		<category><![CDATA[probabilidades]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=16</guid>
		<description><![CDATA[Eu tenho dois filhos e pelo menos um deles é rapaz.Qual é a probabilidade do outro ser rapaz?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=16&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eu tenho dois filhos e pelo menos um deles é rapaz.Qual é a probabilidade do outro ser rapaz?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=16&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/06/04/brincadeiras-matematicas/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
		<item>
		<title>Singleton: duas abordagens</title>
		<link>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/</link>
		<comments>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/#comments</comments>
		<pubDate>Thu, 15 May 2008 18:52:15 +0000</pubDate>
		<dc:creator>maleiria</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://maleiria.wordpress.com/?p=15</guid>
		<description><![CDATA[Um Singleton é uma classe que só pode ser instanciada exactamente uma vez. Temos duas abordagens possíveis. Em ambas mantemos o construtor privado e providenciamos membros to tipo public static de forma a que os clientes possam aceder a uma e uma só instância da classe. O membro public static é uma variável do tipo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=15&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um <i>Singleton</i> é uma classe que só pode ser instanciada exactamente uma vez.<br />
Temos duas abordagens possíveis. Em ambas mantemos o construtor privado e providenciamos membros to tipo <i>public static</i> de forma a que os clientes<br />
possam aceder a uma e uma só instância da classe.</p>
<ol>
<li>
O membro <i>public static</i> é uma variável do tipo <i>final</i>:<br />
<code><br />
//Singleton com uma variável final<br />
public class A {<br />
  public static final A INSTANCE = new A();<br />
  private A() {}<br />
}<br />
</code><br />
O construtor privado é chamado uma única vez para inicializar a variável <font color="gray">A.INSTANCE</font> que é do tipo <i>public static final</i>.
</li>
<li>
Providenciamos um método do tipo <i>public static</i> em vez da variável.<br />
<code><br />
// Singleton with static factory<br />
public class A {<br />
private static final A INSTANCE = new A();<br />
  private A() {}<br />
  public static A getInstance() {<br />
    return INSTANCE;<br />
  }<br />
}<br />
</code><br />
Todas as chamadas ao método estático <font color="gray">a.getInstance()</font><br />
retornam uma referência ao mesmo objecto e não é possível criar mais nenhuma<br />
instância de <font color="gray">A</font>
</li>
</ol>
<p>A primeira abordagem deverá ser usada se tivermos a certeza absoluta que a classe<br />
<font color="gray">A</font> será um <i>Singleton</i> para toda a vida enquanto que<br />
a segunda abordagem dá-nos alguma flexibilidade no código, no sentido em que<br />
agora a classe é do tipo <i>Singleton</i> mas mais tarde poderemos alterar esta<br />
propriedade sem termos que alterar a API.
<p>
Uma nota sobre a serialização de <i>Singletons</i>:para tornarmos uma classe<br />
<i>singleton serializable</i>, não é condição suficiente implementar o<br />
<i>interface Serializable</i> á declaração da classe, i.e.,<br />
<font color="gray">public class A implements Serializable</font>, temos de<br />
implementar o método <font color="gray">readResolve()</font> caso contrário,<br />
cada deserialização da instância irá resultar na criação de uma nova instância.<br />
Para prevenir isto, deveremos adicionar o seguinte método à classe<br />
<font color="gray">A</font>:<br />
<code><br />
// metodo readResolve para preservar a propriedade singleton<br />
private Object readResolve() throws ObjectStreamException {<br />
  /*<br />
  * Retorna a unica classe A e deixa o garbage colector<br />
  * tratar do resto<br />
  */<br />
  return INSTANCE;<br />
}<br />
</code> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/maleiria.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/maleiria.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/maleiria.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/maleiria.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/maleiria.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=maleiria.wordpress.com&amp;blog=3539639&amp;post=15&amp;subd=maleiria&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://maleiria.wordpress.com/2008/05/15/singleton-duas-abordagens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b5c2dfcf32905915a493c229c342f5b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">maleiria</media:title>
		</media:content>
	</item>
	</channel>
</rss>
