<?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>Aletéia</title>
	<atom:link href="http://aleteia.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://aleteia.wordpress.com</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 11:54:08 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='aleteia.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Aletéia</title>
		<link>http://aleteia.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://aleteia.wordpress.com/osd.xml" title="Aletéia" />
	<atom:link rel='hub' href='http://aleteia.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Comparação entre Lua e JavaScript</title>
		<link>http://aleteia.wordpress.com/2011/08/28/comparacao-entre-lua-e-javascript/</link>
		<comments>http://aleteia.wordpress.com/2011/08/28/comparacao-entre-lua-e-javascript/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 16:45:43 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=536</guid>
		<description><![CDATA[Sexta-feira assisti a uma palestra sobre a linguagem Lua. Enquanto assistia, não pude deixar de notar a existência de paralelos entre as tabelas de Lua e os objetos de Javascript. Este artigo não procura ilustrar todas as diferenças entre as linguagens, apenas as que se referem a tabelas, objetos e a orientação a objetos a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=536&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sexta-feira assisti a uma palestra sobre a linguagem Lua. Enquanto assistia, não pude deixar de notar a existência de paralelos entre as tabelas de Lua e os objetos de Javascript. Este artigo não procura ilustrar <strong>todas</strong> as diferenças entre as linguagens, apenas as que se referem a tabelas, objetos e a orientação a objetos a partir de protótipos.</p>
<p><span id="more-536"></span>Antes de continuar, apenas um aviso: durante o texto, utilizarei as palavras tabela e objeto intercambiavelmente. Cabe ao leitor saber que o termo técnico correto é objeto em JavaScript e tabela em Lua. Quando realmente for necessário fazer uma diferenciação, utilizarei os termos com inicial em maiúscula e em inglês.</p>
<h2>Tabelas, arrays e objetos</h2>
<p><strong>Nas duas linguagens se cria um objeto vazio com <tt>{}</tt></strong>. Além disso, por padrão, toda variável é global nas duas linguagens, a não ser que se especifique o contrário. Isso é feito através da palavra-chave <tt>local</tt> em Lua e <tt>var</tt> em JavaScript.</p>
<pre>
-- Lua
variavelGlobal = {}
local variavelLocal = {}

// Javascript
variavelGlobal = {}
var variavelLocal = {}
</pre>
<p>Criada a tabela, podemos acessar e criar novos campos através da notação de <em>records</em> ou de <em>arrays:</em></p>
<pre>
-- Lua
a = {}
a.x = 5
a["y"] = 10

// JavaScript
a = {}
a.x = 5
a["y"] = 10
</pre>
<p>Outra forma de criar campos em um objeto é já especificá-los na sua criação. Aqui, a sintaxe muda apenas sutilmente:</p>
<pre>
-- Lua
b = { x = 5, y = 10 }

// JavaScript
b = { x: 5, y: 10 }
</pre>
<p>Por outro lado, <strong>Tables em Lua possuem algumas das características de Arrays em JavaScript</strong>. Novamente, existem diferenças sutis entre as linguagens. Primeiramente, em Lua tabelas-array são inicializadas com chaves, como qualquer Table, enquanto que em JavaScript Arrays (que herdam de Object) são inicializados com colchetes. Outra diferença é um açúcar sintático que não existe (que eu saiba) em JavaScript, mas que existe em Lua e que nos permite já criar um campo na sua inicialização. Por fim, talvez a diferença mais chata seja que <strong>arrays em Lua são indexados a partir de 1</strong>. Sabendo disso, podemos enumerar os dias da semana e definir que dia é hoje da seguinte forma:</p>
<pre>
-- Lua
semana = { "Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"; hoje = "Sábado" }

// JavaScript
semana = [ "Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado" ]
semana.hoje = "Sábado"
</pre>
<p>Nas duas linguagens, podemos escolher iterar apenas na parte array ou iterar por todos os campos do objeto. Isso é feito da seguinte forma:</p>
<pre>
-- Lua: apenas array
for i, v in ipairs(semana) do
    print(i, v)
end

-- Lua: tudo
for i, v in pairs(semana) do
    print(i, v)
end

// JavaScript: apenas array
for(var i = 0 ; i &lt; semana.length; i++) {
    console.log(i + &quot;\t&quot; + semana[i])
}

// JavaScript: tudo
for(var i in semana) {
    console.log(i + &quot;\t&quot; + semana[i])
}
</pre>
<h2>Metatabelas e Protótipos</h2>
<p>Aqui, o como-fazer começa a se diferenciar entre as duas linguagens; por isso, tratá-las-ei separadamente, começando pelo JavaScript. No entanto, o como-funciona guarda muitas semelhanças, que irei resgatar quando chegar à explicação sobre Lua.</p>
<p><strong>Em JavaScript</strong>, se quisermos alterar o estado de um objeto através de um método, usamos a palavra-chave <tt>this</tt>.</p>
<pre>
var obj = { value: 0, inc: function () { this.value += 1 } }
obj.inc()
</pre>
<p>No entanto, a notação para se criar um novo objeto usando chaves funciona bem quando se está criando um <em>singleton</em>. Quando se quer um objeto que servirá de base para outros, de forma similar a uma classe, o melhor é usar a notação abaixo.</p>
<pre>
// JavaScript
function Shape(color) {
    this.color = color || "none"
    this.printColor = function () { console.log(this.color) }
}

var s1 = new Shape()
var s2 = new Shape("red")
s2.printColor()
</pre>
<p>Feito isso, se quisermos criar uma nova classe que herda comportamento da classe <tt>Shape</tt>, usamos a palavra <tt>prototype</tt>.</p>
<pre>
// JavaScript
function Square(color, size) {
    this.color = color || "none"
    this.size = size || 1
    this.getArea = function () { return this.size * this.size }
}
Square.prototype = new Shape()
var s = new Square("blue", 5)
s.getArea()
s.printColor()
</pre>
<p>O que está acontecendo aqui? Embora não tenha sido definida uma função <tt>printColor</tt> na classe <tt>Square</tt>, uma função é chamada, e, curiosamente, essa função faz exatamente o que se esperava que fizesse. A mágica está no uso de <tt>prototype</tt> – quando o interpretador do JavaScript percebe que não existe um campo (seja ele uma variável ou uma função) em um objeto, ele procura em seu protótipo. Se essa variável não for encontrada no protótipo, ela será procurada no protótipo do protótipo. Esse processo continuará indefinidamente até que a variável efetivamente seja encontrada ou até que não existam mais protótipos onde se procurar.</p>
<pre>
// JavaScript
function WeightedSquare(color, size, weight) {
    this.color = color || "none"
    this.size = size || 1
    this.weight = weight || 0
    this.getWeight = function () { return this.weight }
}
WeightedSquare.prototype = new Square()
w = new WeightedSquare("green", 3, 2)
w.getArea()
w.printColor()
</pre>
<p>O problema desse modo de orientação a objetos é que ele não cria um encapsulamento das variáveis. Assim, <tt>w.color = "purple"</tt> funcionará perfeitamente.</p>
<p><strong>Em Lua</strong>, podemos fazer as mesmas coisas de modo similar. No entanto, como Tables são abstrações mais genéricas que Objects (já que, por exemplo, podem cumprir o papel de um Array também), às vezes precisamos de um ou dois passos a mais.</p>
<p>Criar um <em>singleton</em> pode ser feito de forma muito similar, com a diferença de que a referência a si mesmo é explícita em Lua, e se chama <tt>self</tt> em vez de <tt>this</tt>. Há, no entanto, um açúcar sintático para isso, também mostrado abaixo.</p>
<pre>
-- Lua
obj = { value = 0, inc = function (self) self.value = self.value + 1 end }
obj.inc(obj)

-- Lua com açúcar sintático
obj = { value = 0 }
function obj:inc() self.value = self.value + 1 end
obj:inc()
</pre>
<p>Novamente, se quisermos usar um objeto como base para outros objetos, precisaremos de uma outra notação. Aqui também já aparece o primeiro uso da ideia de metatabelas e metamétodos. Assim como Tables são mais genéricas que Objects, Metatables são mais genéricas que Prototypes. Por um lado, isso significa que usar Tables e Metatables como Objects e Prototypes dá um pouco mais de trabalho; por outro, isso significa que Tables e Metatables têm mais casos de uso (embora não serão mostrados aqui).</p>
<pre>
-- Lua
Shape = { color = "none" }
function Shape:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

function Shape:printColor() print(self.color) end

local s1 = Shape:new()
local s2 = Shape:new({ color = "red" })

s2:printColor()
</pre>
<p>Como isso funciona? Primeiro, é criada uma Table que servirá de base para os objetos da classe <tt>Shape</tt>. Depois, é criado um novo método, chamado <tt>new</tt>, que usa uma Table passada como argumento como base ou cria uma nova. Esse método também estabelece que a metatabela desse objeto <tt>o</tt> é a classe <tt>Shape</tt> e que o metamétodo <tt>__index</tt> dessa metatabela é a própria classe <tt>Shape</tt>. O papel desse metamétodo <tt>__index</tt> é ditar o que acontece quando se tenta acessar um índice inexistente; se for utilizada uma tabela em vez de uma função, o interpretador procurará a variável que não foi encontrada nessa tabela.</p>
<p>Portanto, quando é chamado o método <tt>s2:printColor()</tt>, o interpretador percebe que não há nenhum campo na tabela <tt>s2</tt> com esse nome; então ele procura na metatabela associada a ela a definição de <tt>__index</tt> para saber o que fazer. Ele encontra a definição, que diz que o interpretador deve continuar procurando na tabela <tt>Shape</tt> (que era o <tt>self</tt> quando <tt>Shape:new</tt> foi chamado) e finalmente encontra o que estava procurando.</p>
<p>Percebe-se que esse processo é muito similar ao que acontece quando chamamos um método que não existe em um Object em JavaScript, mas que existe em seu Prototype. A grande diferença é que esse processo já se inicia logo na primeira classe do processo, e não somente quando começamos a usar herança.</p>
<pre>
-- Lua
Square = { size = 1 }
setmetatable(Square, Shape)
function Square:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
function Square:getArea() return self.size * self.size end
s = Square:new({color = "red", size = 5})
</pre>
<p>A herança em si não acrescenta nada de novo, exceto que, assim como protótipos em JavaScript, o processo de busca por uma variável pode continuar a busca na metatabela da metatabela e assim sucessivamente.</p>
<pre>
-- Lua
WeightedSquare = { weight = 0 }
setmetatable(WeightedSquare, Square)
function WeightedSquare:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
function WeightedSquare:getWeight() return self.weight end
w = WeightedSquare:new({ color = "green" })
w:printColor()
</pre>
<p>Novamente, o problema desse método é que ele não cria um encapsulamento. Podemos, assim como em JavaScript, alterar <tt>w.color = "purple"</tt> sem problemas.</p>
<p>No entanto, diferentemente do que acontece com JavaScript, é possível criar um sistema de herança múltipla em Lua. Basta que o metamétodo <tt>__index</tt> seja efetivamente uma função, em vez de uma tabela, e que essa função percorra uma tabela de tabelas procurando uma que contenha o método necessário. Exemplo de classes que façam isso ficam como exercício para o leitor (ou então leiam o capítulo 16.3 de Programando em Lua).</p>
<h2>Encapsulamento</h2>
<p>Antes de começarmos com o encapsulamento, vejamos que ambas linguagens suportam <em>closures</em>:</p>
<pre>
-- Lua
function makeInc(init, step)
    local state = init or 0
    local inc = step or 1
    return function()
        state = state + inc
        return state
    end
end

//JavaScript
function makeInc(init, step) {
    var state = init || 0
    var inc = step || 1
    return function () {
        state = state + inc
        return state
    }
}
</pre>
<p>Em JavaScript, o uso de <em>closures</em> mais o uso de <em>singletons</em> dá origem ao <a href="http://www.yuiblog.com/blog/2007/06/12/module-pattern/">Module Pattern</a>. Esse padrão pode ser facilmente traduzido para Lua.</p>
<pre>
-- Lua
function newAccount (initialBalance)
    local self = {balance = initialBalance}

    local withdraw = function (v)
                         self.balance = self.balance - v
                     end

    local deposit = function (v)
                        self.balance = self.balance + v
                    end

    local getBalance = function () return self.balance end

    return {
        withdraw = withdraw,
        deposit = deposit,
        getBalance = getBalance
    }
end

// JavaScript
function newAccount(initialBalance) {

    return {
        withdraw: withdraw,
        deposit: deposit,
        getBalance: getBalance
}
</pre>
<p>(Exemplo retirado do capítulo 16.4 do livro <em>Programming in Lua</em>). A diferença de se usar esse padrão em Lua é que, apesar de estarmos lidando com objetos com estado, esse estado está contido na <em>closure</em>, e não mais sendo passado como argumento. Portanto, para chamar esses métodos usamos ponto e não dois-pontos. </p>
<br />Filed under: <a href='http://aleteia.wordpress.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/536/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/536/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=536&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2011/08/28/comparacao-entre-lua-e-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Ubuntu, você traiu o movimento</title>
		<link>http://aleteia.wordpress.com/2011/08/21/ubuntu-voce-traiu-o-movimento/</link>
		<comments>http://aleteia.wordpress.com/2011/08/21/ubuntu-voce-traiu-o-movimento/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 20:36:55 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=522</guid>
		<description><![CDATA[The nice thing about standards is that you have so many to choose from. – Andy Tanenbaum Anarquia De maneira geral, o ecossistema do software livre é anárquico. Falo isso não como crítica ­– tampouco como elogio –, mas sim como um fato. Como exemplo, veja os gerenciadores de pacotes: cada um com seu formato [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=522&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>The nice thing about standards is that you have so many to choose from. – <a href="http://en.wikiquote.org/wiki/Andrew_S._Tanenbaum">Andy Tanenbaum</a></p></blockquote>
<h2>Anarquia</h2>
<p>De maneira geral, o ecossistema do software livre é anárquico. Falo isso não como crítica ­– tampouco como elogio –, mas sim como um fato. Como exemplo, veja os gerenciadores de pacotes: cada um com seu formato de arquivo e sua(s) interface(s) (gráfica ou não), cada qual com suas nomenclaturas e padronizações. Isso acontece quando a “comunidade” não consegue escolher um campeão e a utilização de um ou de outro torna-se uma questão de gosto.</p>
<p>Esse é um caso extremo, onde vários programas de funções similares disputam entre si o cinturão de Melhor Gerenciador de Pacotes™, e não há a menor interoperabilidade entre eles. Claro, existem ferramentas que convertem um <tt>.deb</tt> em um <tt>.rpm</tt>, mas esses programas só tiram proveito do fato que dois pacotes para um mesmo programa terão de armazenar de alguma forma os mesmos arquivos e metadados. À parte da conversão, um gerenciador funciona sem levar em consideração a existência de outros gerenciadores – ele não tentará descobrir se tal pacote está instalado naquele sistema, a não ser que ele mesmo o tenha instalado. Por isso, ter um sistema que conte com dois ou mais gerenciadores de pacote é pedir por problemas.</p>
<p>Mas nem sempre as coisas precisam ser assim complicadas…</p>
<h2>Meritocracia</h2>
<p>Às vezes aparece um campeão. Até a chegada do Chrome, o Firefox carregava o cinturão de Melhor Navegador Livre™. Isso não significa que não existiam alternativas, apenas que entre Konqueror, Epiphany e <tt>lynx</tt>, o Firefox era o favorito de nove entre dez pessoas.</p>
<p>Mas nem sempre as coisas são assim simples…</p>
<h2>Diplomacia</h2>
<p>Outra possibilidade é o surgimento de um protocolo de interoperabilidade. Não existe órgão capaz de verificar e obrigar todo desenvolvedor a seguir esses padrões, mas quando os padrões são sensatos, sua desobediência faz com que os usuários do programa infrator o olhem torto.</p>
<p>Talvez um dos melhores exemplos disso seja a variável <tt>XDG_CONFIG_HOME</tt>, que diz onde arquivos de configuração devem ser criados. Por padrão, essa variável tem como valor <tt>~/.config</tt> e é aí que todos os programas deveriam criar seus arquivos de configuração. Quando algum programa não segue esse padrão, os usuários xingam muito no Twitter e na <em>mailing list</em> do projeto.</p>
<p>Mas nem sempre a vida é assim bela… Quando surge um padrão que não é bem aceito, o problema não é resolvido e continuamos na anarquia.</p>
<h2>Notificações</h2>
<p>Notificações deveriam ser um caso de diplomacia. Estabelecido o padrão de que a forma de comunicação entre processos é usando o <tt>d-bus</tt> (dando fim ao <tt>dcop</tt> utilizado pelo KDE), bastava apenas criar uma <a href="http://www.galago-project.org/specs/notification/0.9/x408.html#command-notify">API padrão para a exibição de notificações</a>. Essa API foi criada e, pasme, bem aceita. Sendo assim, agora eu posso criar um programa que use notificações (um gerenciador de Downloads que avise quando terminou de baixar seus pacotes, por exemplo) e ele irá exibir as notificações padrões do ambiente em que está, seja no KDE, no Gnome ou numa casinha de sapê.</p>
<p>Bem, talvez eu tenha faltado com a verdade quando disse que a API fora bem aceita. Visando ser a Apple do software livre, a Canonical achou por bem desenvolver um outro daemon de notificações, para unificar a experiência entre os desktops. Afinal, &lt;sarcasmo&gt;o Gnome, o KDE e o XFCE são tão parecidos, só faltava isso mesmo&lt;/sarcasmo&gt;.</p>
<p>Superficialmente, esse novo daemon segue a API criada; porém, alguns parâmetros são ignorados. Por quê? Porque os desenvolvedores da Canonical se acham mais espertos que você, e que o controle deve ficar nas mãos deles. Se escrevi um pequeno verificador para minha caixa de entrada, qual o problema de que a duração da notificação seja de apenas um segundo? É mais do que suficiente para que eu possa reconhecer o ícone e saber do que se trata. No entanto, a Canonical acha melhor <a href="https://bugs.launchpad.net/ubuntu/+source/notify-osd/+bug/390508">ignorar o parâmetro que determina o tempo de duração de uma notificação</a> e usar um tempo absurdamente grande para esse tipo de notificação.</p>
<p>A solução? Um <a href="https://launchpadlibrarian.net/35990442/notify-osd_timeout.patch">patch que acrescenta doze linhas ao código original</a>. Não dói aplicá-lo e recompilar o programa, mas é um incômodo saber que esse problema poderia estar resolvido há dois anos.</p>
<br />Filed under: <a href='http://aleteia.wordpress.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/522/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/522/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=522&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2011/08/21/ubuntu-voce-traiu-o-movimento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Funções anônimas em C</title>
		<link>http://aleteia.wordpress.com/2011/07/28/funcoes-anonimas-em-c/</link>
		<comments>http://aleteia.wordpress.com/2011/07/28/funcoes-anonimas-em-c/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 00:37:40 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=502</guid>
		<description><![CDATA[Quem conhece funções anônimas (também conhecidas por expressões lambda) de outras linguagens, talvez já tenha sentido sua falta quando resolvendo certos problemas em C ou em C++. A eventual chegada do padrão C++0x promete resolver esse problema, finalmente trazendo as funções lambda à linguagem. No entanto, isso se refere somente ao C++; mesmo o vindouro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=502&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quem conhece funções anônimas (também conhecidas por expressões lambda) de outras linguagens, talvez já tenha sentido sua falta quando resolvendo certos problemas em C ou em C++.</p>
<p>A eventual chegada do padrão <a href="http://pt.wikipedia.org/wiki/C%2B%2B0x">C++0x</a> promete resolver esse problema, finalmente trazendo as funções lambda à linguagem. No entanto, isso se refere somente ao C++; mesmo o vindouro padrão <a href="http://en.wikipedia.org/wiki/C1X">C1X</a> não faz referência a uma eventual chegada da ferramenta ao bom e velho C.</p>
<p>Porém, se seu projeto só será compilado usando o compilador GNU, uma boa parte de seus problemas pode ser resolvida com a utilização de um macro e de duas extensões. O uso dessas extensões significa que seu código deixará de seguir o padrão ISO e, portanto, <strong>deixará de ser portável</strong>. Se isso é um problema ou não, você que deverá julgar.</p>
<p><span id="more-502"></span>Comecemos pelo macro:</p>
<p><pre class="brush: cpp;">
#define lambda(return_type, args_and_body) \
    ({                                     \
        return_type __fn__ args_and_body   \
        &amp;__fn__;                           \
    })
</pre></p>
<p>Pouco da mágica realmente acontece nele, ele serve apenas para facilitar um pouco nosso trabalho. Abaixo, um exemplo de como chamá-lo e no que ele se expande:</p>
<p><pre class="brush: cpp;">
int (*max)(int, int) = lambda(int, (int a, int b) {
         return a &gt; b ? a : b;
    });

int (*max)(int, int) = ({
    int __fn__ (int a, int b) {
        return a &gt; b ? a : b;
    }
    &amp;__fn__;
    });
</pre></p>
<p>Analisando o código de cima para baixo, encontramos o par de caracteres <tt>({</tt>, fechado na última linha do código por seu inverso, <tt>})</tt>. Isso faz parte da primeira extensão usada, <a href="http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html">Statements and Declarations in Expressions</a>. Com ela, podemos criar um novo escopo, da forma similar ao que acontece quando usamos <tt>{ }</tt>, com a diferença de que o último <em>statement</em> será usado como valor de retorno (apesar de não usarmos a palavra-chave <tt>return</tt>).</p>
<p>Logo em seguida, vemos a definição de uma função, chamada <tt>__fn__</tt>, de tipo <tt>return_type</tt> e definida por <tt>args_and_body</tt>. No entanto, só podemos defini-la aí por causa da segunda extensão utilizada, <a href="http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html">Nested Functions</a>. Com essa extensão, podemos definir funções dentro de outras funções, funções dentro de <tt>ifs</tt>, dentro de expressões compostas (como neste caso) etc.</p>
<p>Juntando tudo, o que estamos fazendo é definindo uma nova função, <tt>__fn__</tt>, que tem como escopo apenas um pequeno bloco e retornando seu endereço com <tt>&amp;__fn__</tt>.</p>
<p>Porém, esta solução não “captura” as variáveis num escopo léxico (não cria uma <em>closure),</em> o que pode trazer alguns problemas. Por exemplo, o código abaixo funciona sem problemas, já que a função lambda é executada enquanto a variável <tt>soma</tt> ainda está dentro de seu escopo.</p>
<p><pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#define lambda(return_type, body_and_args) \
    ({                                     \
        return_type __fn__ body_and_args   \
            &amp;__fn__;                       \
    })

void map(int array[], int n, int (*fn)(int)) {
    int i;
    for(i = 0; i &lt; n; i++)
        array[i] = (*fn)(array[i]);
}

int main() {
    int array[] = {1, 2, 3, 4};
    int soma = 0;

    map(array, 4, lambda(int, (int x) {
                soma += x;
                return x;
            }));
    printf(&quot;%d\n&quot;, soma);

    return 0;
}
</pre></p>
<p>Por outro lado, a função abaixo não funcionará:</p>
<p><pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#define lambda(return_type, body_and_args) \
    ({                                     \
        return_type __fn__ body_and_args   \
            &amp;__fn__;                       \
    })

int (*adder(int what))(int) {
    return lambda(int, (int x) {
            int __inc = what;
            return x + __inc;
        });
}

int main() {
    int (*inc1)(int) = adder(1);
    printf(&quot;%d\n&quot;, inc1(1));
    printf(&quot;%d\n&quot;, inc1(1));
    return 0;
}
</pre></p>
<p>Quando <tt>inc1</tt> é chamada, <tt>adder</tt> já terminou de ser executada e <tt>what</tt> não está mais em escopo. O resultado, portanto, é indefinido. Aqui, a primeira chamada funciona normalmente, mas a segunda causa uma <em>segmentation fault.</em></p>
<p>Na lista de discussão <tt>comp.lang.c</tt> (segundo link das fontes), há uma outra forma de se tentar fazer isso (SPOILER: que também não funciona).</p>
<p>Fontes:<br />
<a href="http://walfield.org/blog/2010/08/25/lambdas-in-c.html">lambdas-in-c</a><br />
<a href="http://groups.google.com/group/comp.lang.c/browse_thread/thread/fd82dc3d97ea87ff/8b01e62f2feae4f0?lnk=gst&amp;pli=1">Lambda&#8217;s in GCC</a></p>
<br />Filed under: <a href='http://aleteia.wordpress.com/category/programacao/c/'>C</a>, <a href='http://aleteia.wordpress.com/category/programacao/'>Programação</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/502/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/502/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/502/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=502&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2011/07/28/funcoes-anonimas-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Um pequeno serviço D-Bus em Python</title>
		<link>http://aleteia.wordpress.com/2010/12/25/um-pequeno-servico-d-bus-em-python/</link>
		<comments>http://aleteia.wordpress.com/2010/12/25/um-pequeno-servico-d-bus-em-python/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 14:52:02 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[dbus]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=459</guid>
		<description><![CDATA[Dentre os métodos para se fazer comunicação entre processos no Linux, o D-bus é provavelmente o que vem ganhando maior destaque recentemente. Aqui vou mostrar como implementar um serviço simples que poderá ser chamado de outros processos, demonstrando sua utilização a partir do Emacs; no entanto, nada impede que os métodos desse serviço sejam chamados [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=459&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dentre os métodos para se fazer comunicação entre processos no Linux, o D-bus é provavelmente o que vem ganhando maior destaque recentemente.  Aqui vou mostrar como implementar um serviço simples que poderá ser chamado de outros processos, demonstrando sua utilização a partir do Emacs; no entanto, nada impede que os métodos desse serviço sejam chamados de outra linguagem em que existam <em>bindings</em> para o D-Bus (o próprio Python, C/C++, C#, Perl, Ruby, PHP, Haskell, &#8230;).  Aliás, é possível que em alguns casos seja mais simples fazer a integração entre processos escritos em linguagens diferentes através do D-Bus que usar <em>foreign functions</em>.</p>
<p><pre class="brush: python;">
#!/usr/bin/env python2

import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import gobject

class Greeter(dbus.service.Object):
    def __init__(self, Name=&quot;&quot;):
        bus_name = dbus.service.BusName('org.local.greeter',\
                                            bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, '/%s' % Name)

    @dbus.service.method('org.local.greeter')
    def hello(self, Name=&quot;world&quot;):
        print &quot;Hello, %s!&quot; % Name
        return &quot;Hello, %s!&quot; % Name 

DBusGMainLoop(set_as_default=True)
myGreeters = [Greeter(&quot;A&quot;), Greeter(&quot;B&quot;)]

myLoop = gobject.MainLoop()

try:
    myLoop.run()
except KeyboardInterrupt:
    myLoop.quit()
    print &quot;Bye!&quot;
</pre></p>
<p>Começamos o arquivo importando os módulo necessários.  Em vez de importar o módulo <tt>gobject</tt>, alguns tutoriais usam o módulo <tt>gtk</tt>.  A função dos dois será a mesma: implementar o loop principal do serviço (tanto que o loop principal do <tt>gtk</tt> é implementado sobre o loop principal do <tt>gobject</tt>, apenas com alguns tratadores a mais).  Como não iremos usar nenhum componente gráfico neste exemplo, não há a necessidade de se usar o <tt>gtk</tt>.</p>
<p>Em seguida criamos a classe que implementará o serviço, a classe <tt>Greeter</tt>.  No construtor (<tt>__init__</tt>), definimos o nome do serviço — no caso, <tt>org.local.greeter</tt> —, e dizemos que ele é um <em>Session Bus</em> em vez de um <em>System Bus</em> (este reservado para serviços de mais baixo nível, como o HAL e o NetworkManager.  No construtor também iniciamos o objeto, informando o nome que definimos anteriormente e lhe dando um caminho (<em>path</em>).  O caminho é útil em casos onde se que o mesmo serviço dê acesso a vários objetos parecidos — por exemplo, o Emacs poderia dar acesso via D-Bus a cada um de seus buffers através do caminho <tt>/Emacs/Buffers/&lt;Nome do Buffer&gt;</tt>.</p>
<p>Depois, definimos um método.  Note a presença do decorador (<tt>@dbus.service.method('org.local.greeter')</tt>).  De certa forma, esse decorador estabelece que o método a seguir é “público”, ou seja, que pode ser acessado por processos externos.  Para termos uma melhor organização do código, podemos criar outros métodos que não queremos que sejam acessíveis externamente; nesses casos, basta não usar o decorador.  O método em si é bastante simples: ele imprime uma mensagem no terminal em que o serviço estiver rodando e retorna para o processo que o chamou essa mesma mensagem.  Na prática, geralmente desejaremos que o serviço retorne alguma coisa em vez de imprimir, mas deixei assim para mostrar que existem as duas possibilidades.</p>
<p>Então temos o código para fazer o serviço executar.  Criamos um novo <tt>DBusGMainLoop</tt> e o definimos como Loop padrão.  Seguindo a documentação, atualmente não faz sentido criar mais de um loop, já que ainda não há suporte para isso (ao menos não no Python).  Na linha seguinte são criados dois objetos da classe <tt>Greeter</tt>, cada um com um <em>path</em> diferente, <tt>/A</tt> e <tt>/B</tt>; fiz assim para demonstrar como isso é utilizado.  E então criamos o loop principal e o executamos.</p>
<p>Do lado do cliente — no caso, o Emacs —, o código fica:</p>
<pre>(require 'dbus)
(dbus-list-known-names :session)
(dbus-call-method :session "org.local.greeter"
                           "/A"
                           "org.local.greeter"
                           "hello"
                           "Emacs")
</pre>
<p>Caso se queira chamar o objeto <tt>/B</tt>, basta trocar o path na função <tt>dbus-call-methor</tt>.</p>
<hr />
<p>Comparado ao COM do Windows, eu considero o D-Bus mais “limpo”.  Mesmo quando se implementa um serviço COM em Python, sempre fico com a impressão de que certas coisas poderiam ser abstraídas de maneira melhor (CLSIDs, por exemplo).</p>
<p>Ainda assim, embora o D-Bus seja uma alternativa à altura (ou até melhor) que o COM, ele não substitui o DCOM.  Nada impede que a comunicação entre processos seja feita entre diferentes máquinas, o problema é que, ao menos por enquanto, o D-Bus não implementa nenhum sistema de segurança — tanto de autenticação de usuário como de criptografia de dados.</p>
<p><a href="http://excid3.com/blog/2010/05/an-actually-decent-python-dbus-tutorial/">Fonte</a></p>
<br />Filed under: <a href='http://aleteia.wordpress.com/category/programacao/'>Programação</a> Tagged: <a href='http://aleteia.wordpress.com/tag/dbus/'>dbus</a>, <a href='http://aleteia.wordpress.com/tag/python/'>python</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/459/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=459&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2010/12/25/um-pequeno-servico-d-bus-em-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Calculando quadrados com somas</title>
		<link>http://aleteia.wordpress.com/2010/02/02/calculando-quadrados-com-somas/</link>
		<comments>http://aleteia.wordpress.com/2010/02/02/calculando-quadrados-com-somas/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 12:43:51 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Matemática]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=446</guid>
		<description><![CDATA[Esses dias, enquanto lia mensagens na UseNet [1], deparei-me com a seguinte sequência: 1² = 1 + 2.0 = 1 2² = 2 + 2.1 = 4 3² = 3 + 2(2+1) = 9 4² = 4 + 2(3+2+1) = 16 5² = 5 + 2(4+3+2+1) = 25 &#8230; ou, genericamente: A primeira coisa que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=446&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Esses dias, enquanto lia mensagens na UseNet [1], deparei-me com a seguinte sequência:</p>
<p>1² = 1 + 2.0 = 1<br />
2² = 2 + 2.1 = 4<br />
3² = 3 + 2(2+1) = 9<br />
4² = 4 + 2(3+2+1) = 16<br />
5² = 5 + 2(4+3+2+1) = 25<br />
&#8230;</p>
<p>ou, genericamente:</p>
<p><img src='http://s0.wp.com/latex.php?latex=n%5E2+%3D+n+%2B+2%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D+i&amp;bg=f7f7f7&amp;fg=242424&amp;s=0' alt='n^2 = n + 2&#92;sum_{i=0}^{n-1} i' title='n^2 = n + 2&#92;sum_{i=0}^{n-1} i' class='latex' /></p>
<p>A primeira coisa que me perguntei foi se isso é válido para qualquer n. Fiz um programa rapidinho em Haskell para calcular para mim:</p>
<pre>
square :: Integer -&gt; Integer
square x = x + (2 * (foldl (+) 0 [1..(x-1)]))

test :: [Integer] -&gt; Bool
test [] = True
test (x:xs) = if (square x) == (x*x)
              then test xs
                   else False
</pre>
<p>Testei de 1 a algum número bem grande. 100k ou 1M, não me lembro bem. O resultado foi <tt>True</tt>, significando que a equação é válida para pelo menos um número grande de ns. Ainda assim, fica a pergunta: é válida para <em>qualquer</em> n? E, a questão fundamental, por quê?</p>
<p>A prova por indução nos garante que sim, essa equação é válida para qualquer n, e também dá uma ideia de porque é válida. Se alguém conseguir fazer uma figura com a interpretação geométrica desse resultado, seria interessante.</p>
<p><img src='http://s0.wp.com/latex.php?latex=%5Cleft%28n%2B1%5Cright%29%5E2+%3D+n%5E2+%2B+2n+%2B+1+%5C%5C+%5Cleft%28n%2B1%5Cright%29%5E2+%3D+%5Cleft%28n+%2B+2%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D+i%5Cright%29+%2B+2n+%2B+1+%5C%5C+%5Cleft%28n%2B1%5Cright%29%5E2+%3D+n+%2B+1+%2B+2n+%2B+2%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D+i+%5C%5C+%5Cleft%28n%2B1%5Cright%29%5E2+%3D+%5Cleft%28n%2B1%5Cright%29+%2B+2%5Cleft%28n+%2B+%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D+i%5Cright%29+%5C%5C+%5Cleft%28n%2B1%5Cright%29%5E2+%3D+%5Cleft%28n%2B1%5Cright%29+%2B+2%5Csum_%7Bi%3D0%7D%5E%7B%28n%2B1%29-1%7D+i+&amp;bg=f7f7f7&amp;fg=242424&amp;s=0' alt='&#92;left(n+1&#92;right)^2 = n^2 + 2n + 1 &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n + 2&#92;sum_{i=0}^{n-1} i&#92;right) + 2n + 1 &#92;&#92; &#92;left(n+1&#92;right)^2 = n + 1 + 2n + 2&#92;sum_{i=0}^{n-1} i &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n+1&#92;right) + 2&#92;left(n + &#92;sum_{i=0}^{n-1} i&#92;right) &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n+1&#92;right) + 2&#92;sum_{i=0}^{(n+1)-1} i ' title='&#92;left(n+1&#92;right)^2 = n^2 + 2n + 1 &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n + 2&#92;sum_{i=0}^{n-1} i&#92;right) + 2n + 1 &#92;&#92; &#92;left(n+1&#92;right)^2 = n + 1 + 2n + 2&#92;sum_{i=0}^{n-1} i &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n+1&#92;right) + 2&#92;left(n + &#92;sum_{i=0}^{n-1} i&#92;right) &#92;&#92; &#92;left(n+1&#92;right)^2 = &#92;left(n+1&#92;right) + 2&#92;sum_{i=0}^{(n+1)-1} i ' class='latex' /></p>
<p>[1] Sim, ela ainda existe e é bastante ativa.</p>
<br />Filed under: <a href='http://aleteia.wordpress.com/category/matematica/'>Matemática</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/446/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=446&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2010/02/02/calculando-quadrados-com-somas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Curiosidade: milhas, quilômetros e Fibonacci</title>
		<link>http://aleteia.wordpress.com/2010/01/24/curiosidade-milhas-quilometros-e-fibonacci/</link>
		<comments>http://aleteia.wordpress.com/2010/01/24/curiosidade-milhas-quilometros-e-fibonacci/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 13:05:36 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=439</guid>
		<description><![CDATA[Vejam a seguinte tabela. Isso lembra alguma coisa? Milhas Quilômetros 3 5 5 8 8 13 13 21 Exatamente, são os números de Fibonacci. Claro que essa tabela de conversão não é exata, mas é uma aproximação muito boa ao resultado correto. No entanto, não há surpresa nenhuma; se calcularmos a razão entre dois números [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=439&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vejam a seguinte tabela. Isso lembra alguma coisa?</p>
<table>
<tbody>
<tr>
<td><strong>Milhas</strong></td>
<td><strong>Quilômetros</strong></td>
</tr>
<tr>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>8</td>
</tr>
<tr>
<td>8</td>
<td>13</td>
</tr>
<tr>
<td>13</td>
<td>21</td>
</tr>
</tbody>
</table>
<p>Exatamente, são os números de Fibonacci. Claro que essa tabela de conversão não é exata, mas é uma aproximação muito boa ao resultado correto. No entanto, não há surpresa nenhuma; se calcularmos a razão entre dois números de Fibonacci consecutivos, teremos <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Bu_%7Bk%2B1%7D%7D%7Bu_k%7D+%3D+%5Cvarphi+%3D+1.6180...+&amp;bg=f7f7f7&amp;fg=242424&amp;s=0' alt='&#92;frac{u_{k+1}}{u_k} = &#92;varphi = 1.6180... ' title='&#92;frac{u_{k+1}}{u_k} = &#92;varphi = 1.6180... ' class='latex' />, sendo <img src='http://s0.wp.com/latex.php?latex=%5Cvarphi+&amp;bg=f7f7f7&amp;fg=242424&amp;s=0' alt='&#92;varphi ' title='&#92;varphi ' class='latex' /> a proporção áurea. Por acaso, esse valor é muito próximo à relação entre milhas (terrestres) e quilômetros; uma milha é igual a 1,609344 quilômetros.</p>
<br />Publicado em Uncategorized  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/439/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=439&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2010/01/24/curiosidade-milhas-quilometros-e-fibonacci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Folha de São Paulo: malícia ou incompetência?</title>
		<link>http://aleteia.wordpress.com/2009/12/24/folha-de-sao-paulo-malicia-ou-incompetencia/</link>
		<comments>http://aleteia.wordpress.com/2009/12/24/folha-de-sao-paulo-malicia-ou-incompetencia/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 21:14:35 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Críticas]]></category>
		<category><![CDATA[imprensa]]></category>
		<category><![CDATA[media]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=436</guid>
		<description><![CDATA[Ultimamente tenho notado uma tendência da Folha de São Paulo em responsabilizar tudo que acontece na Interwebs como fruto de “piratas virtuais”. Eu estaria disposto a considerar isso simples incompetência, não fosse a confusão que isso gera e a frequência com que acontece. Aos iniciados nas artes da informática, essa “confusão” da imprensa tem uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=436&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ultimamente tenho notado uma tendência da Folha de São Paulo em responsabilizar tudo que acontece na <em>Interwebs</em> como fruto de “piratas virtuais”. Eu estaria disposto a considerar isso simples incompetência, não fosse a confusão que isso gera e a frequência com que acontece.</p>
<p>Aos iniciados nas artes da informática, essa “confusão” da imprensa tem uma desgostosa sensação de <em>déjà vù</em>. Com o início da propagação dos computadores pessoais, surgiram os <em>hackers</em>. Em inglês, o sufixo <em>-er</em> significa ”aquele que faz”, semelhante ao nosso “-eiro”: sapateiro, costureiro, &#8230; Já <em>hack</em> nada mais é que a nossa velha conhecida gambiarra. O motivo pelo qual hoje associamos a palavra <em>hacker</em> a malfeitores virtuais foi justamente a incompetência, ou talvez malícia, da mídia, que usava essa inocente palavra “aquele-que-faz-gambiarras” como sinônimo para ”aquele-que-quebra”, os <em>crackers</em>. Hoje em dia, corrigiu-se o problema usando a terminologia “<em>white hat</em>” e “<em>black hat</em>”. Os <em>hackers</em> bonzinhos são os de chapéu branco e os malvados são os de chapéu preto. Claro que na vida nada é tão simples assim e existem os “<em>grey hats</em>”, “<em>red hats</em>”, “<em>blue hats</em>”, “<em>polka-dot hats</em>”, &#8230;</p>
<p>Confusão similar faz a Folha ao usar o mesmo termo para designar quem infringe direitos autorais e <em>hackers</em>, seja lá qual for a cor de seu chapéu. É importante que o nome “pirata” esteja o mais livre possível de preconceitos em uma época em que o Partido Pirata sueco chegou ao parlamento e que o embrião de um partido pirata brasileiro começa a se formar. Mais importante ainda se nos lembrarmos de que o que está em jogo não é apenas o direito ou não de se baixar arquivos da internet, mas também uma legislação que englobe e entenda a Internet. Segundo a constituição brasileira, por exemplo, qualquer cidadão tem direito de se expressar livremente, salvo em anonimato (artigo 5º, inciso IV); uma demonstração de que mesmo algumas das leis básicas não são válidas na rede.</p>
<p>A Folha, ao tratar ambos como a mesma coisa, confunde e desinforma ao invés de cumprir seu papel como fonte de informação.</p>
<br />Publicado em Críticas Tagged: imprensa, media <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/436/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=436&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2009/12/24/folha-de-sao-paulo-malicia-ou-incompetencia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Gerador de Markov</title>
		<link>http://aleteia.wordpress.com/2009/11/08/gerador-de-markov/</link>
		<comments>http://aleteia.wordpress.com/2009/11/08/gerador-de-markov/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 14:38:11 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=431</guid>
		<description><![CDATA[Gerador de Markov Um dos sites mais úteis que existem é o Gerador de Lero-lero. Não tenho certeza se o algoritmo usado é um Gerador de Markov mesmo, mas se não for, a idéia é bem parecida. Gerador de Markov é um programa que analisa um texto procurando as combinações de palavras mais comuns e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=431&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gerador de Markov</p>
<p>Um dos sites mais úteis que existem é o <a href="http://padrelevedo.hpg.ig.com.br/lerolero/lerolero.html">Gerador de Lero-lero</a>. Não tenho certeza se o algoritmo usado é um Gerador de Markov mesmo, mas se não for, a idéia é bem parecida.</p>
<p>Gerador de Markov é um programa que analisa um texto procurando as combinações de palavras mais comuns e então gera um texto usando as mesmas combinações em um texto que é estatisticamente similar ao anterior. Como essa análise será feita depende da implementação. Eu escolhi usar combinações de 3 palavras, ou seja, uma palavra do texto gerado depende das duas anteriores a ela. Variando a quantidade de palavras usadas em cada combinação, altera-se o texto resultante: se eu escolhesse combinações de uma palavra, o texto gerado seria completamente aleatório, se eu escolhesse combinações de dez palavras, o texto resultante ficaria mais parecido com o original.</p>
<p>A implementação de um Gerador é relativamente simples, clique em “Ler o resto do artigo” para ter acesso ao código em Common Lisp. O código está bem dividido e cada função tem uma função clara (evidentemente).</p>
<p>Primeiramente, criamos uma hash-table que conterá as combinações de palavras. Usamos uma hash-table por ela ser mais eficiente. Se usássemos listas ou árvores, teríamos de fazer buscas toda vez que o Gerador fosse adicionar uma nova palavra ao texto. Logo no começo também, inicializamos o gerador de números aleatórios.</p>
<p>Para que possamos analisar as combinações de palavras, precisamos primeiro dividir a string em uma lista de strings. A função &#8220;space-position&#8221; se ocupa de descobrir onde fica o próximo &#8220;divisor de palavras&#8221;, ou seja, um espaço, um tab ou uma quebra de linha. O que vier antes será o delimitador. Se houver vários espaços em sequência, nós teríamos uma lista com algumas strings vazias, mas o &#8220;cond&#8221; na função &#8220;split-string&#8221; detecta isso com &#8220;(= pos 0)&#8221; e evita que isso aconteça.</p>
<p>Logo em seguida vem algumas funções auxiliares. &#8220;Last-two&#8221; retorna os dois últimos elementos de uma lista qualquer. Precisaremos dela mais tarde. &#8220;Random-elt&#8221; e &#8220;random-key&#8221; retornam um elemento aleatório de uma lista e uma chave aleatória de uma hash-table respectivamente. &#8220;List-triples&#8221; retorna os trios que podem ser formados de uma lista. Note que ela não gera todos os arranjos possíveis, apenas as combinações sequenciais. Imagine que existe um bloco com espaço para três &#8220;coisas&#8221;. Esse bloco percorre a lista sequencialmente gerando os trios. Assim, a lista &#8216;(1 2 3 4 5) seria percorrida como: &#8216;((1 2 3) 4 5), &#8216;(1 (2 3 4) 5) e &#8216;(1 2 (3 4 5)). Portanto, (list-&gt;triples &#8216;(1 2 3 4 5)) retornaria &#8216;((1 2 3) (2 3 4) (3 4 5)). &#8220;String-&gt;symbol&#8221; retorna um símbolo com o mesmo nome que o conteúdo da string passada como argumento. Não me pergunte porque eu preferi usar símbolos ao invés de strings mesmo. Talvez o gerador ficaria melhor assim, já que ele saberia diferenciar quando uma palavra está iniciando uma frase pela letra maiúscula, ou talvez isso não mudasse lá grande coisa.</p>
<p>&#8220;Insert-triple-into-table&#8221; é a função que faz o trabalho sujo: ela é a responsável por inserir os trios gerados por &#8220;list-&gt;triples&#8221; na hash-table que críamos no começo do programa. Ela é feia, não é uma função que me orgulho de ter escrito, mas ela funciona. Perceba que cada entrada na hash-table inicial é, por sua vez, outra hash-table. Essa segunda hash-table guarda uma lista com as possíveis palavras que podem ser usadas.</p>
<p>&#8220;Insert-string-into-table&#8221; organiza o trabalho de separar uma string em uma lista de strings, transformá-las em símbolos, gerar os trios e inserí-los na hash-table.</p>
<p>&#8220;Insert-file-into-table&#8221; foi uma função que deu trabalho escrever. Inicialmente, ela seria a função responsável por abrir um arquivo, salvá-lo como uma string e então passar para &#8220;insert-string-into-table&#8221;. Porém, a forma com que fiz isso era péssima, o consumo de memória ia para as alturas e o tempo de execução também. Em uma das tentativas, reimplementei boa parte da &#8220;insert-string-into-table&#8221; em &#8220;insert-file-into-table&#8221;, mas acabei deixando as duas funções mesmo assim, já que as duas são úteis. Depois, consegui implementar esta função segundo a idéia original com um desempenho muito melhor.</p>
<p>Finalmente, a parte interessante: &#8220;generate&#8221; gera um texto com no máximo o número específicado de palavras. Não há garantias de que ele gerará o número máximo, já que algumas combinações podem fazer com que ele não consiga gerar mais nada.</p>
<p>Só para me exibir, resolvi colocar alguns trechos que o Gerador criou tendo como base o texto deste artigo (um artigo recursivo):</p>
<p>&#8220;logo no começo também, inicializamos o gerador de markov mesmo, mas se não for, a idéia é bem parecida.&#8221;</p>
<p>&#8220;gerador de markov é um gerador de markov&#8221;</p>
<p>&#8220;se houver vários espaços em sequência, nãs teríamos uma lista e uma chave aleatória de uma lista e uma chave aleatória de uma lista com algumas strings vazias, mas o &#8220;cond&#8221; na função &#8220;split-string&#8221; detecta isso&#8221;</p>
<p>Eu o tenho usado nas conversas de MSN com sucesso. Ele detecta que a outra pessoa falou &#8220;oi :)&#8221; e gera o texto &#8220;olá =]&#8221; ou variação. Depois ele detecta a combinação &#8220;tudo bom?&#8221; e responde &#8220;sim, e contigo?&#8221;. Depois ele passa o comando para mim. OK, isso não é sério&#8230; ainda. Preciso aprender a fazer plugins para o Pidgin ainda (o bitlbee seria mais interessante nesse aspecto).</p>
<p><span id="more-431"></span></p>
<pre>
(defparameter *table* (make-hash-table))
(setq *random-state* (make-random-state t)) ; Random seed

(defun space-position (string)
  "Finds the position of a 'space' character in a string. By 'space' I mean a
newline, space or tab character."
  (let ((sp (position #\Space string))
        (nlp (position #\Newline string))
        (tp (position #\Tab string)))
    (let ((values-list (remove-if #'null (list sp nlp tp))))
      (if values-list
          (apply #'min values-list)
          nil))))

(defun split-string (string)
  "Splits a string into a list of strings use spaces as delimeters."
  (let ((pos (or (space-position string) -1)))
    (cond ((= pos -1) (list string))
          ((= pos 0)  (split-string (subseq string (1+ pos))))
          (t (append (list (subseq string 0 pos))
                     (split-string (subseq string (+ pos 1))))))))

(defun last-two (list)
  "Returns the last two elements from a list."
  (let ((l (length list)))
    (if (&gt; l 1)
        (list (nth (- l 2) list) (nth (- l 1) list))
        nil)))

(defun random-elt (list)
  "Returns a random element from a list"
  (let ((l (length list)))
    (if (= l 0)
        nil
        (nth (random (length list)) list))))

(defun random-key (table)
  "Returns a random key from table"
  (random-elt (loop for key being the hash-keys of table collect key)))

(defun list-&gt;triples (list)
  "Returns sequencial triples from a list."
  (if (&lt; (length list) 3)
      nil
      (append (list (list (nth 0 list) (nth 1 list) (nth 2 list)))
              (list-&gt;triples (cdr list)))))

(defun string-&gt;symbol (string)
  "Convert a string into a symbol"
  (intern (string-upcase string)))

(defun insert-triple-into-table (triple)
  "Insert a triple of symbols in the table"
  (if (hash-table-p (gethash (first triple) *table*))
      (progn
        (setf (gethash (second triple) (gethash (first triple) *table*))
              (push (third triple) (gethash (second triple) (gethash (first triple) *table*)))))
      (progn
        (setf (gethash (first triple) *table*) (make-hash-table))
        (setf (gethash (second triple) (gethash (first triple) *table*))
              (list (third triple))))))

(defun insert-string-into-table (string)
  "Inserts the string into a hash table."
  (mapcar #'insert-triple-into-table
          (list-&gt;triples (mapcar #'string-&gt;symbol (split-string string)))))

(defun insert-file-into-table (filename)
  (let ((str ""))
    (with-open-file (f filename :direction :input)
      (loop for line = (read-line f nil 'eof) until (eq line 'eof)
         do (setq str (concatenate 'string str '(#\newline) line))))
    (insert-string-into-table str)))

(defun generate (words)
  "Generate a text with 'words' words."
  (let* ((first-word (random-key *table*))
         (second-word (random-key (gethash first-word *table*)))
         (text (list second-word first-word))) ;;; This list will be reversed
    (dotimes (i words)
      (let ((first-table (gethash (second text) *table*)))
        (if (hash-table-p first-table)
            (push (random-elt (gethash (first text) first-table)) text))))
    (format t "~(~{~a ~}~)" (reverse text))))
</pre>
<br />Publicado em Lisp, Programação  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/431/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=431&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2009/11/08/gerador-de-markov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>Streams (listas infinitas) em C</title>
		<link>http://aleteia.wordpress.com/2009/10/10/streams-listas-infinitas-em-c/</link>
		<comments>http://aleteia.wordpress.com/2009/10/10/streams-listas-infinitas-em-c/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 15:58:46 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=423</guid>
		<description><![CDATA[Ultimamente tenho feito duas coisas: lido sobre Haskell e não postado no blog (além das outras coisas do dia-a-dia, claro). Programas em Haskell são preguiçosos. Isso significa que quando uma variável é definida, ela só será computada quando seu valor for necessário. Assim, se fizermos um programa similar ao de baixo, fatorial de 1000 nunca [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=423&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ultimamente tenho feito duas coisas: lido sobre Haskell e não postado no blog (além das outras coisas do dia-a-dia, claro).</p>
<p>Programas em Haskell são preguiçosos. Isso significa que quando uma variável é definida, ela só será computada quando seu valor for necessário. Assim, se fizermos um programa similar ao de baixo, fatorial de 1000 nunca será calculado, já que o seu valor não é necessário para calcular 1+1.</p>
<p><code>x = factorial 1000<br />
putStrLn $ show (1+1)</code></p>
<p>Extrapolando essa mesma ideia* para outras definições, podemos definir uma lista de infinitos uns:</p>
<p><code>uns = repeat 1</code></p>
<p>Ou então com todos os números naturais:</p>
<p><code>naturais = [1..]</code></p>
<p>Com um pouco mais de perspicácia, é possível criar listas contendo todos os números de Fibonacci, ou então todos os fatoriais:</p>
<p><code>fibs = 1:1: (zipWith (+) fibs (tail fibs))<br />
facs = 1:(zipWith (*) facs [1..])</code></p>
<p>Se quisermos 10 elementos de cada, fazemos:</p>
<p><code>dezFibs = take 10 fibs<br />
dezFacs = take 10 facs</code></p>
<p>Essa implementação é bastante eficiente : se precisamos do fatorial de 10 e logo em seguida o de 11, não precisamos calcular 11×10×9×&#8230;×1, basta calcular 11×10!, que já havia sido computado. Melhor ainda : se uma hora precisarmos do fatorial de 7, ele já estará calculado, pronto para ser utilizado. </p>
<p>Agora sim a parte interessante, em que C entra nessa história. Embora minha implementação não seja nem de longe tão interessante como a utilizada pelo Haskell, ela serve de base para mostrar como uma implementação de <em>stream</em> ou listas infinitas pode ser feita em C.</p>
<p>A grande diferença entre listas e <em>streams</em> é que não trabalharemos com a idéia de um ponteiro para o próximo elemento, mas sim com uma expressão que ao ser executada nos dará o próximo elemento. Ou seja, ao invés de um ponteiro para outro elemento do mesmo tipo, nós temos um ponteiro para uma função.</p>
<p><pre class="brush: cpp;">
typedef struct {
    int i;
    int (*cont)(int);
} stream;
</pre></p>
<p>Isso altera a forma como acessamos o próximo elemento. Não podemos mais utilizar o famoso <tt>ptr = ptr-&gt;prox</tt> porque estaremos apontando para uma função. Por isso, abstraí o processo de chamar a função com o valor da <em>stream</em> em uma função chamada <tt>proximo</tt>, que retorna uma nova <tt>struct</tt> com seu valor <tt>i</tt> atualizado pela função <tt>cont</tt>, o que dá a impressão de que avançamos na lista.</p>
<p><pre class="brush: cpp;">
stream proximo(stream inicio)
{
    stream tmp;

    tmp.i = (*inicio.cont)(inicio.i);
    tmp.cont = inicio.cont;

    return(tmp);
}
</pre></p>
<p>Para exemplificar o uso de <em>streams</em>, criei a função <tt>pega</tt> que é similar à função <tt>take</tt> no Haskell, mas que no caso não retorna os valores, só os imprime.</p>
<p><pre class="brush: cpp;">
void pega(int elementos, stream inicio)
{
    int i;
    stream atual = inicio;

    for(i = 0; i &lt; elementos; i++)
    {
        printf(&quot;%d\n&quot;,atual.i);
        atual = proximo(atual);
    }
    printf(&quot;.\n.\n.\n\n&quot;);
}
</pre></p>
<p>Por fim, criei duas <em>streams</em> e duas funções auxiliares (que falta fazem expressões lambda). O código completo se encontra abaixo:</p>
<p><pre class="brush: cpp;">
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

typedef struct {
    int i;
    int (*cont)(int);
} stream;

stream proximo(stream inicio)
{
    stream tmp;

    tmp.i = (*inicio.cont)(inicio.i);
    tmp.cont = inicio.cont;

    return(tmp);
}

int soma_um(int i)
{
    return(i+1);
}

int repete(int i)
{
    return(i);
}

void pega(int elementos, stream inicio)
{
    int i;
    stream atual = inicio;

    for(i = 0; i &lt; elementos; i++)
    {
        printf(&quot;%d\n&quot;,atual.i);
        atual = proximo(atual);
    }
    printf(&quot;.\n.\n.\n\n&quot;);
}       

int main(int argc, char *argv[])
{
    stream naturais, identidade;

    naturais.i = 1;
    naturais.cont = &amp;soma_um;

    identidade.i = 1;
    identidade.cont = &amp;repete;

    pega(10, naturais);
    pega(10, identidade);
    return 0;
}
</pre></p>
<p>*eu escrevi “idéia” mas aparentemente os verificadores ortográficos já aderiram todos às novas regras ortográficas&#8230; fica assim mesmo.</p>
<br />Publicado em C, Programação  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/423/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=423&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2009/10/10/streams-listas-infinitas-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
		<item>
		<title>C: Hash tables, arrays associativos, dicionários&#8230;</title>
		<link>http://aleteia.wordpress.com/2009/08/09/c-hash-tables-arrays-associativos-dicionarios/</link>
		<comments>http://aleteia.wordpress.com/2009/08/09/c-hash-tables-arrays-associativos-dicionarios/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 16:29:33 +0000</pubDate>
		<dc:creator>André Ramaciotti</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://aleteia.wordpress.com/?p=411</guid>
		<description><![CDATA[Não sei quantos nomes existem para descrever esta forma de organizar séries de dados na memória, esses três do título foram as que eu consegui pensar em 5 segundos. :P Enfim, comecemos pela forma mais simples de armazenar séries de dados na memória, arrays, seguiremos para listas, árvores, e então chegaremos às hash tables. Se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=411&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Não sei quantos nomes existem para descrever esta forma de organizar séries de dados na memória, esses três do título foram as que eu consegui pensar em 5 segundos. :P</p>
<p>Enfim, comecemos pela forma mais simples de armazenar séries de dados na memória, arrays, seguiremos para listas, árvores, e então chegaremos às <em>hash</em> tables. Se tudo que você quer é um exemplo de implementação, vá ao fim do artigo.<br />
<span id="more-411"></span></p>
<h1>Arrays</h1>
<p>Internamente, quando se declara um array, um bloco de memória contínuo é alocado. Isso significa que elementos de um array estão sempre próximos entre si e que percorrer todo um array é relativamente rápido. O ponto fraco dos arrays é não serem flexíveis: Um array de tamanho 5 tem tamanho 5 e pronto, acabou. É possível criar um array <em>b</em> com tamanho 6 e copiar os 5 primeiros elementos de <em>a</em> para <em>b</em>, mas o array <em>a</em> continua tendo tamanho 5. No entanto, se esse tipo de operação começa a se tornar frequente demais, a vantagem de performance do array começa a desaparecer.</p>
<p>Primeiro, é necessário alocar o novo array e copiar os elementos. Depois, é necessário limpar o array anterior, ou daremos início a um gasto desnecessário de memória.</p>
<p>Com o problema da flexibilidade em mente [1], foi criado um novo método para lidar com séries de dados, as listas ligadas/<em>linkadas</em>.</p>
<h1>Listas</h1>
<p>Listas ligadas recebem esse nome porque cada nó (<em>node</em>) se liga a outro. Existem algumas formas diferentes de se implementar isso, como:</p>
<ul>
<li>Cada elemento aponta para o próximo. O último aponta para <tt>NULL</tt>. É assim que funcionam as <em>cons cells</em> em Lisp, Haskell e aposto que em várias outras linguagens.</li>
<li>Cada elemento aponta para o próximo e o anterior. Isso facilita algumas operações, mas complica outras. Há um aumento no consumo de memória também, já que são necessários dois ponteiros.</li>
</ul>
<p>Existem outras formas, assim como variações dessas. Lembre-se que há sempre uma troca entre consumo de memória e eficiência no processamento. Existem formas de usar listas que apontam para o próximo elemento e para o anterior usando apenas um ponteiro, mas para isso é necessária uma operação a mais (XOR).</p>
<p>Um detalhe sobre listas: geralmente os novos elementos dela são &#8220;empurrados&#8221; (<em>push</em>) no começo da lista, ao invés de adicionados (<em>append</em>) ao fim da mesma. O código fica muito mais rápido assim, já que não é necessário percorrer toda a lista para adicionar um novo elemento.</p>
<p>Existem também as árvores binárias, que estruturalmente são parecidas com listas, mas que apresentam outras vantagens e desvantagens.</p>
<h1>Árvores binárias</h1>
<p>Árvores binárias facilitam muito nas buscas: Se a condição <em>c</em> for verdadeira, siga à esquerda, senão, siga à direita. Isso significa que mesmo em árvores muito grandes, o número de &#8220;passos&#8221; dados é relativamente pequeno. Para se ter uma idéia, em uma árvore com 100.000 elementos, no máximo 17 &#8220;passos&#8221; terão de ser dados (<img src='http://s0.wp.com/latex.php?latex=%5Clog_2+100.000+%3D+16%2C6+&amp;bg=f7f7f7&amp;fg=242424&amp;s=0' alt='&#92;log_2 100.000 = 16,6 ' title='&#92;log_2 100.000 = 16,6 ' class='latex' />). No entanto, para que isso seja verdade, a árvore tem de estar bem equilibrada (tanto o lado esquerdo como o direito terem o mesmo número de níveis). Existem algoritmos para isso, mas não entrarei nesses detalhes.</p>
<p>Toda essa agilidade em buscas vem com um preço: a inclusão de novos elementos em uma árvore é mais próxima da função <em>append</em> em uma lista que um <em>push</em>. Apesar de não ser necessário atravessar a árvore toda, ainda é necessário fazer comparações e tomar decisões a partir daí. Além disso, árvores consomem um pouco mais de memória, já que são necessários dois ponteiros (esquerda e direita) ao invés de só um (próximo) como geralmente é o caso em listas.</p>
<p>Por fim, existem as <em>hash tables</em>, que mistura arrays com listas e tem bom desempenho em buscas.</p>
<h1><em>Hash tables</em></h1>
<p><em>Hash tables</em> são arrays de pequenas listas. No entanto, esse array não é acessado sequencialmente. Para ficar mais claro, vou começar com a função que dá nome a esse método: a função de <em>hash</em>.</p>
<p><strong>Função hash</strong><br />
Esta função tem por objetivo associar um número a uma &#8220;coisa&#8221;. No exemplo que darei mais a diante, a função hash associa um número a uma pessoa a partir de seu nome. É esse número que nos dirá em que posição do array a &#8220;coisa&#8221; será armazenada; por isso, é preciso levar duas coisas em consideração: seu tempo de execução, já que ela será executada na adição de novos elementos e na busca por elementos já existentes, e a probabilidade de ela gerar o mesmo número para representar objetos diferentes.</p>
<p><strong>Colisões</strong><br />
Se por um acaso a função hash gerar o mesmo número <em>n</em> para dois elementos, o programa não travará, nem o elemento anterior será apagado. O que ocorrerá é que a posição <em>n</em> deixará de conter unicamente um elemento, agora ela contém uma pequena lista de dois elementos.</p>
<p>Por que todo esse alarde sobre funções hash que gerem números diferentes? Pelo simples fato de que se você incluiu 10 elementos em um array com 10 posições, era de se esperar que em geral cada posição tivesse apenas um elemento. No entanto, com uma função hash ruim, pode acontecer de uma única posição ter, por exemplo, oito elementos. Analisando a performance deste caso, parece muito mais uma lista que uma <em>hash table</em>.</p>
<p>Lembre-se de que a função hash não pode ser aleatória ou depender do tempo, por exemplo, ou você não irá encontrar o elemento na hora de fazer uma busca!</p>
<p><strong>O Array</strong><br />
O número de colisões entre os números não depende exclusivamente da função hash. É evidente que se o programa for salvar 1000 elementos em um array de 10 posições, haverá várias colisões. Pelo outro lado, salvar 10 elementos em um array de 1000 posições é um desperdício enorme de memória.</p>
<p><strong>O código</strong></p>
<p>Creio que o código esteja bastante claro, mas qualquer coisa perguntem. Se vocês quiserem &#8220;ver&#8221; um caso de colisão, troque o 5 na linha <tt>#define REGISTROS 5</tt> por 4.</p>
<p><pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

/* Define o numero de posicoes no array. Note que esse nao eh o limite maximo */
#define REGISTROS 5

/* Abstracao de uma pessoa. Apenas para exemplo. */
typedef struct Pessoa Pessoa;
struct Pessoa {
    char *nome;
    char *profissao;
    unsigned short idade;
    unsigned short senha;
    Pessoa *proxima;
};

/* Onde os registros serao salvos */
Pessoa *pessoas[REGISTROS];

unsigned int hash(const char *nome);
unsigned int registrar_pessoa(Pessoa *p);
Pessoa *achar_pessoa(const char *nome);

int main(int argc, char *argv[])
{
    /* Exemplos */
    Pessoa joao = { &quot;Joao Ninguem&quot;, &quot;Bohemio&quot;, 21, 6969, NULL };
    Pessoa jose = { &quot;Jose Pessoa&quot;,  &quot;Nerd&quot;, 12, 1234, NULL };
    
    
    registrar_pessoa(&amp;joao);
    registrar_pessoa(&amp;jose);

    achar_pessoa(&quot;Joao Ninguem&quot;);
    achar_pessoa(&quot;Jose Pessoa&quot;);
    achar_pessoa(&quot;Maria Pessoa&quot;);

    return 0;
}

/* Dado um nome, retorna um numero no intervalo [0,REGISTROS[ */
unsigned int hash(const char *nome)
{
    char *p = nome;
    unsigned int soma = 0;

    while(*p != 0) /* caractere nulo indica fim da string */
    {
        soma += *p;
        p++;
    }
    
    return(soma % REGISTROS);
}

/* Registra uma pessoa no array */
unsigned int registrar_pessoa(Pessoa *p)
{
    unsigned int posicao;
    if(p == NULL)
        exit(1);

    posicao = hash(p-&gt;nome);
    
    /* Posicao vazia, basta incluir a pessoa aqui */
    if(pessoas[posicao] == NULL)
    {
        pessoas[posicao] = p;
    }

    /* Houve uma colisao entre as posicoes, devemos usar o campo &quot;proxima&quot; */
    else
    {
        Pessoa *tmp = pessoas[posicao];
        while(tmp-&gt;proxima != NULL) tmp = tmp-&gt;proxima;
        tmp-&gt;proxima= p;
    }

    printf(&quot;registrado em %u.\n&quot;, posicao);
    return(posicao);
}    

Pessoa *achar_pessoa(const char *nome)
{
    unsigned int posicao = hash(nome);
    Pessoa *p = pessoas[posicao];

    for(; p!=NULL ; p = p-&gt;proxima)
    {
        /* Nome foi encontrado */
        if(strcmp(p-&gt;nome, nome) == 0)
        {
            printf(&quot;pessoa encontrada em %u.\n&quot;, posicao);
            return(p);
        }
    }

    /* Se a funcao chegar aqui, o loop terminou sem encontrar a pessoa, entao
     * ela nao existe */
    printf(&quot;pessoa nao encontrada.\n&quot;);
    return(NULL);
}

</pre></p>
<p>[1] Não tenho certeza se historicamente os arrays se desenvolveram antes das listas, eu creio que sim.</p>
<br />Publicado em C, Programação  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aleteia.wordpress.com/411/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aleteia.wordpress.com/411/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aleteia.wordpress.com/411/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aleteia.wordpress.com&amp;blog=1012158&amp;post=411&amp;subd=aleteia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aleteia.wordpress.com/2009/08/09/c-hash-tables-arrays-associativos-dicionarios/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">_andre</media:title>
		</media:content>
	</item>
	</channel>
</rss>
