<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0"><channel><title>Tiago, O Irrepupável</title><link>http://blog.irrepupavel.com/</link><description>Tiago Cogumbreiro loves to talk about Python, GNOME, web development, and Open Source; with a bit of nonsense here and there.</description><language>en</language><managingEditor>noreply@blogger.com (Tiago Cogumbreiro)</managingEditor><lastBuildDate>Mon, 08 Feb 2010 05:20:28 PST</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">136</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="irrepupavel" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://irrepupavel.blogspot.com/feeds/posts/default" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">irrepupavel</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://irrepupavel.blogspot.com/feeds/posts/default" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Firrepupavel.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item><title>OpenCL review</title><link>http://blog.irrepupavel.com/2010/01/opencl-review.html</link><category>multicore</category><category>opencl</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Tue, 02 Feb 2010 01:19:27 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-4955203240993233811</guid><description>&lt;p&gt;OpenCL is an open standard being created by the Khronos Group, pushed by Apple and AMD. This technology features data parallelism and task parallelism. It is supposed to target a varied range of devices, for example, there is an embedded profile for mobile devices. MacOS X 10.6 has support for OpenCL. There is support for Linux and Windows in x86 and x86-64 architectures via AMD.&lt;/p&gt;

&lt;p&gt;OpenCL may be touted as being in relation to multicores as OpenGL is in relation GPUs. But in fact, OpenCL is a broader technology than OpenGL is, since it targets not only multicores but GPUs as well. Additionally, there is a tight coupling between both of these technologies, e.g. it is possible to share a buffer between an OpenCL operation and an OpenGL operation.&lt;/p&gt;

&lt;p&gt;In OpenCL there is a concept of &lt;em&gt;kernel&lt;/em&gt; that is akin to SIL places. A kernel consists of a C program whose entry point is a function. Kernels communicate via shared memory (&lt;em&gt;buffers&lt;/em&gt;). A &lt;em&gt;work-item&lt;/em&gt; is composed by one ore more kernels that are executed sequentially. Each kernel may be target of data parallelization. A work-item may be target of task parallelization. Work-items are executed on a &lt;em&gt;device&lt;/em&gt; (e.g. a CPU, a GPU) that consists of one or more processing unit.&lt;/p&gt;

&lt;p&gt;Technically kernels are C string that must be compiled every time the program loads. Notice that the OpenCL runtime may cache compilation.&lt;/p&gt;

&lt;p&gt;The site HPC Wire published a very good insight from a person with experience with HPC (OpenMP in particular) &lt;a href="http://www.hpcwire.com/features/Compilers-and-More-OpenCL-Promises-and-Potential-58625442.html?page=1"&gt;“Compilers and More: OpenCL Promises and Potential”&lt;/a&gt; from which I would like to quote two paragraphs:
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
So, are OpenCL programs going to be performance portable or not? Sadly, not. [...] An optimized kernel for one device may or may not perform well on another, but is unlikely to be optimal for that second device.
&lt;/p&gt;

&lt;p&gt;
The intent is apparently that OpenCL will support an ecosystem of tools, middleware and applications, not to be the portable parallel abstraction. Even though the kernels are not performance portable, even if you have to tune your kernels for each device, the ability to write your kernels for different devices in the same language is a great leap forward from where we are today.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.khronos.org/files/opencl-quick-reference-card.pdf"&gt;OpenCL Quick Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.khronos.org/registry/cl/specs/opencl-1.0.43.pdf"&gt;Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Performance/Conceptual/OpenCL_MacProgGuide/Introduction/Introduction.html"&gt;MacOSX Programming Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.amd.com/GPU/ATISTREAMSDKBETAPROGRAM/Pages/default.aspx"&gt;Linux and Windows OpenCL SDK (by AMD)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.amd.com/documentation/videos/InsideTrack/Pages/default.aspx#opencl"&gt;Introductory video by AMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ati.amd.com/technology/streamcomputing/intro_opencl.html"&gt;An introduction to OpenCL by AMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.nvidia.com/object/get-opencl.html"&gt;NVIDIA's OpenCL for Linux and Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nvidia.com/object/cuda_learn_products.html"&gt;NVIDIA devices that support OpenCL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-4955203240993233811?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Revisão da linguagem Go</title><link>http://blog.irrepupavel.com/2009/12/revisao-da-linguagem-go.html</link><category>go</category><category>google</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 07 Dec 2009 06:38:31 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7200748815070373455</guid><description>&lt;p&gt;Podemos pensar no Go como um C mais limpo: estruturas (&lt;i&gt;structs&lt;/i&gt;) como no C, libertação automática de memória (há &lt;i&gt;garbage collection&lt;/i&gt;), referências (sem aritmética de ponteiros) e valores, funções e os tipos de dados usuais. As funções podem retornar tuplos, mas os tuplos não são valores de primeira-classe, i.e. não podem ser alocados ou guardados numa variável.&lt;/p&gt;

&lt;p&gt;Exemplo de uma função que retorna um tuplo:&lt;/p&gt;

&lt;pre&gt;
func foo(int v) (int v1, int v2) {
return v, v*2
}

a, b = foo(3);
&lt;/pre&gt;

&lt;p&gt;
Temos a palavra chave &lt;code&gt;func&lt;/code&gt;, o nome da função &lt;code&gt;foo&lt;/code&gt;, os parâmetros da função &lt;code&gt;(int v)&lt;/code&gt; e os parâmetros de saída &lt;code&gt;(int v1, int v2)&lt;/code&gt;. É o regresso dos parâmetros de saída no sentido em que podemos manipulá-los, mas sintacticamente não estão ao lado dos parâmetros de entrada, o que me parece uma boa escolha. O mesmo exemplo pode ser reescrito assim (mais estranho na minha opinião):
&lt;/p&gt;
&lt;pre&gt;
func foo(int v) (int v1, int v2) {
v1 = v;
v2 = v * 2;
return;
}

a, b = foo(3);
&lt;/pre&gt;

&lt;p&gt;
Existem dois conceitos que merecem realce: &lt;em&gt;métodos&lt;/em&gt; e &lt;em&gt;interfaces&lt;/em&gt;. Os métodos são funções que se associam a um tipo de dados e são utilizados como os métodos do C++ ou do Java. Não podem ser associados a interfaces; podem ser associados tipos, por exemplo a uma estrutura. A definição de um método é isolada, não é feita na definição do tipo ao qual está associada.
&lt;/p&gt;

&lt;p&gt;Exemplo ilustrativo de um método que calcula a norma sobre o tipo de dados ponto:&lt;/p&gt;
&lt;pre&gt;
// Disclairmer: o exemplo foi feito por mim sem testar se funciona
struct Point {
int x;
int y;
}

func (Point self) Magnitude() int {
return Math.sqrt(self.x * self.x + self.y * self.y)
}

Point p = Point{0, 0};
p.Magnitude(); // returns 0
p.x = 2;
p.Magnitude(); // returns 2
&lt;/pre&gt;

&lt;p&gt;
Resumindo, para definir um método temos a keyword &lt;code&gt;func&lt;/code&gt;, entre
parêntises o tipo ao qual o método vai estar associado e o nome da
variável (neste caso usei &lt;code&gt;self&lt;/code&gt;), de seguida os parâmetros e o tipo de
retorno (ou parâmetros de saída).

Um interface identifica (estruturalmente) tipos que tenham um dado
conjunto de métodos associados. Ou seja, se dois valores tiverem pelo
menos os mesmos métodos que um dado interface, então são considerados
daquele interface. A associação a um dado interface é implicita, não
existe associação, &lt;i&gt;e.g.&lt;/i&gt; &lt;code&gt;T1 implements ISomeInterface&lt;/code&gt;.

&lt;h3&gt;Concorrência&lt;/h3&gt;

&lt;p&gt;
Existe paralelismo de tarefas, nesta linguagem é feita através de uma
&lt;code&gt;goroutine&lt;/code&gt; (semelhantes a &lt;code&gt;threads&lt;/code&gt; ou &lt;code&gt;tasks&lt;/code&gt;). As &lt;i&gt;goroutines&lt;/i&gt; são (pretendem ser) leves. Para criar uma &lt;i&gt;goroutine&lt;/i&gt;, colocamos a keyword &lt;code&gt;go&lt;/code&gt; antes de uma chamada de uma função:
&lt;/p&gt;

&lt;pre&gt;
go LongComputation();
&lt;/pre&gt;

&lt;p&gt;
A comunicação entre tarefas parelelas é feita através de memória
partilhada ou através de canais. Por exemplo, para criar um canal que transmite inteiros e associá-lo a uma variável &lt;i&gt;c&lt;/i&gt;, faz-se:
&lt;/p&gt;

&lt;pre&gt;
c := make(chan int)
&lt;/pre&gt;

&lt;p&gt;
Podemos usar esse canal no exemplo seguinte em que criamos duas tarefas paralelas (&lt;i&gt;goroutines&lt;/i&gt;) uma envia mensagem pelo canal &lt;i&gt;c&lt;/i&gt; e a outra tarefa recebe mensagens pelo mesmo canal, mostrando o valor recebido no ecrã.&lt;/p&gt;

&lt;pre&gt;
func client() {
  c&amp;lt;- 10;
}

func server() {
  for { // this for is equivalente to C's for (;;) 
    msg := &amp;lt;-c;
    fmt.Printf("received %d\n", msg);
  }
}
&lt;/pre&gt;

&lt;p&gt;O &lt;code&gt;select&lt;/code&gt; da linguagem é muito poderoso e podem fazer-se servidores/clientes mais complicados com brevidade. O seguinte exemplo está na especificação da linguagem.&lt;/p&gt;
&lt;pre&gt;
var c, c1, c2 chan int;
var i1, i2 int;
select {
case i1 = &amp;lt;-c1:
 print("received ", i1, " from c1\n");
case c2 &amp;lt;- i2:
 print("sent ", i2, " to c2\n");
default:
 print("no communication\n");
}

for {  // send random sequence of bits to c
 select {
 case c &amp;lt;- 0:  // note: no statement, no fallthrough, no folding of cases
 case c &amp;lt;- 1:
 }
}
&lt;/pre&gt;
&lt;p&gt;
Num &lt;code&gt;select&lt;/code&gt; com várias operações de recepção (&lt;code&gt;&amp;lt;-c&lt;/code&gt;) e/ou de envio (&lt;code&gt;c&amp;lt;-&lt;/code&gt;) de mensagem é tratada de cima para baixo o primeiro ramo que esteja activo. Caso não hajam expressões de envio/recepção de mensagem activas, é avaliado o caso &lt;code&gt;default&lt;/code&gt;. Se o ramo &lt;code&gt;default&lt;/code&gt; não estiver definido, então o &lt;code&gt;select&lt;/code&gt; fica bloqueado até uma expressão de envio/recepção esteja activa. No exemplo acima, o primeiro &lt;code&gt;select&lt;/code&gt; tenta receber uma mensagem pelo canal &lt;code&gt;c1&lt;/code&gt;. Caso não haja mensagem para se receber no canal &lt;code&gt;c1&lt;/code&gt;, o &lt;code&gt;select&lt;/code&gt; tenta enviar uma mensagem pelo canal &lt;code&gt;c2&lt;/code&gt;. Se não houver transmissão da mensagem, então é avaliado o ramo &lt;code&gt;default&lt;/code&gt; e mostra-se no ecrã &lt;code&gt;no communication&lt;/code&gt;. De seguida temos um &lt;code&gt;select&lt;/code&gt; dentro de um ciclo, o Go alterna de uma forma uniforme e justa (não está provado) entre os vários ramos activos, enviando por este motivo ora o valor &lt;code&gt;1&lt;/code&gt; ora o valor &lt;code&gt;0&lt;/code&gt; pelo canal &lt;code&gt;c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;
Como os canais são valores, podem ser enviados através de um canal. Existe primitivas de comunicação síncrona e assíncrona. É possível tipificar canais, especificando o
tipo de valores comunicado e se é de entrada ou de saída. Não há
suporte para &lt;a href="http://www.dcs.gla.ac.uk/~simon/publications/TR-2003-133.pdf"&gt;tipos de sessão&lt;/a&gt;.
&lt;/p&gt;

&lt;h3&gt;Conclusão&lt;/h3&gt;

&lt;p&gt;
O Go é vendida como uma linguagem de sistemas (concorrência incluida).
Se me dessem para escolher C ou Go ignorando o contexto de utilização,
escolheria Go sem piscar os olhos. Escolheria também Go ao invés do C++.
Acho que tem uma elegância sintática razoável (para uma linguagem que segue a sintaxe do C) e que faz um bom compromisso nas primitivas e abstracções escolhidas: gosto muito do sistema de interfaces mas sinto falta de excepções.
&lt;/p&gt;

&lt;p&gt;A resposta à concorrência é insuficiente. Um slogan do Go é, e passo a citar:&lt;/p&gt;
&lt;blockquote source="http://golang.org/doc/effective_go.html#concurrency"&gt;Do not communicate by sharing memory; instead, share memory by communicating.&lt;/blockquote&gt;
&lt;p&gt;
Mas entre o que se apela e o que se faz vai um grande passo. Por mais que existam canais e de existir o &lt;i&gt;slogan&lt;/i&gt;, continua a ser possível trabalhar com memória partilhada sem qualquer protecção do sistema de tipos. Além disso comprometem-se com uma memória com um espaço global de endereços &lt;em&gt;único&lt;/em&gt;, em contraste com um &lt;a href="http://en.wikipedia.org/wiki/Partitioned_global_address_space"&gt;um espaço global de endereços particionado&lt;/a&gt;, não se preparando para sistemas mais esotéricos com modelos de memória diferentes. Para a omissão de excepções é dada a justificação &lt;a href="http://golang.org/doc/go_lang_faq.html#exceptions"&gt;que não é um problema bem resolvido&lt;/a&gt;, ignorando o bom trabalho desenvolvido na &lt;a href="http://x10.codehaus.org/"&gt;linguagem X10&lt;/a&gt;. Para a concorrência é feito o inverso: albergam ambos os idiomas e promovem timidamente a concorrência por passagem de mensagem.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7200748815070373455?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><title>Quick update</title><link>http://blog.irrepupavel.com/2009/11/quick-update.html</link><category>mil</category><category>phd</category><category>callas</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 16 Nov 2009 02:39:23 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-6285026991865394485</guid><description>&lt;p&gt;
Time for a quick recap of what's been life like. I finished my masters on informatics, &lt;a href="http://homepages.lasige.di.fc.ul.pt/~cogumbreiro/cogumbreiro-msc-thesis.pdf"&gt;the thesis is online&lt;/a&gt;. The work is the formalization of a compiler from the &amp;pi;-calculus into a multithreaded &lt;acronym title="Typed Assembly Language"&gt;TAL&lt;/acronym&gt;. I've learned a lot these past two years! Particularly in the value of (provable) specification for an algorithm.
&lt;/p&gt;

&lt;p&gt;On another front I have been working on &lt;a href="http://www.dcc.fc.up.pt/callas/"&gt;Callas&lt;/a&gt; (which needs a big brush up on its site). Once again, I have been defining a translation function, this time from Callas (a functional, declarative language with modules) to a byte-code language based on Java (with some simplifications). I now have a more influent position and am giving some (small) input on the design of the language.
&lt;/p&gt;

&lt;p&gt;Meanwhile work has continued on the &lt;a href="http://gloss.di.fc.ul.pt/mil/"&gt;MIL&lt;/a&gt;. We have released a new version of the interpreter, which includes a deadlock checker. Technically this amounted to integrate the typechecker with a Prolog engine (we are using &lt;a href="http://jlogic.sourceforge.net/"&gt;JLog&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Finally, I am eager for the acceptance of my PhD application in &lt;a href="http://www.di.fc.ul.pt/Informatica/Doutoramento_em_Inform%C3%A1tica"&gt;&lt;acronym title="Faculdade de Ciências da Universidade de Lisboa"&gt;FCUL&lt;/acronym&gt;&lt;/a&gt;. The acceptance process usually takes one month (&lt;em&gt;sigh&lt;/em&gt;), so I should know the results any time soon.&lt;/p&gt;

&lt;p&gt;
All in all things are working out smoothly ;-)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-6285026991865394485?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>An applet for MIL and the simply typed π-calculus compiler</title><link>http://blog.irrepupavel.com/2009/07/applet-for-mil-and-simply-typed.html</link><category>pi-to-mil</category><category>mil</category><category>applet</category><category>tutorial</category><category>pi-calculus</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 02 Jul 2009 09:20:56 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7710504262323621823</guid><description>&lt;p&gt;
In an effort to showcase my &lt;acronym title="Master of Science"&gt;MSc&lt;/acronym&gt; work, I have developed an applet that contains the &amp;pi;-calculus compiler along with the MIL interpreter. You can try out either MIL our the simply-typed &amp;pi;-calculus and run it online. Our article about &lt;a href="http://dx.doi.org/10.1016/j.entcs.2009.06.004"&gt;compiling the &amp;pi;-calculus into a multithreaded typed assembly language&lt;/a&gt; is an useful reference.&lt;/p&gt;

&lt;p style="text-align:center;"&gt;
&lt;a href="http://gloss.di.fc.ul.pt/mil/applet/"&gt;&lt;img src="http://gloss.di.fc.ul.pt/mil/applet.png" alt="Try MIL and the pi-calculus compiler on-line!" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The &amp;pi;-calculus consists of processes that run concurrently—you may read processes as tasks or threads, although they sit at a much higher level. The simplest process is the inactive one that finishes, we represent it by a zero &lt;code&gt;0&lt;/code&gt;. The basis of the &amp;pi;-calculus is communication; it is so important that the fundamental step of computation is the communication of sequences of values (integers, strings, and channels). Processes synchronize (and communicate) by message-passing, using channels. To send a message &lt;code&gt;10&lt;/code&gt; through a channel &lt;code&gt;x&lt;/code&gt; we write the output process &lt;code&gt;x&amp;lt;10&gt;&lt;/code&gt;. To receive a message through a channel &lt;code&gt;x&lt;/code&gt; and store it in a name &lt;code&gt;y&lt;/code&gt; that is visible in process &lt;code&gt;P&lt;/code&gt; we write the input process &lt;code&gt;x(y).P&lt;/code&gt;, notice that process &lt;code&gt;P&lt;/code&gt; is not a variable, it must be replaced with an actual process, like the inactive process &lt;code&gt;0&lt;/code&gt;. If we want to receive a message repeatedly, like a server does, we just write a bang (&lt;code&gt;!&lt;/code&gt;) in front of an input process, for example &lt;code&gt;!x(y).P&lt;/code&gt;. To execute process &lt;code&gt;P&lt;/code&gt; in parallel with process &lt;code&gt;Q&lt;/code&gt; we write the parallel process &lt;code&gt;P | Q&lt;/code&gt;, or to remove ambiguity we may use parenthesis &lt;code&gt;(P | Q)&lt;/code&gt;. To use a channel &lt;code&gt;x&lt;/code&gt; in a process &lt;code&gt;P&lt;/code&gt;, we must first declare it along with its type &lt;code&gt;T&lt;/code&gt; by writing &lt;code&gt;new x:T P&lt;/code&gt;. A type &lt;code&gt;T&lt;/code&gt; is not a variable, it can be either an integer type &lt;code&gt;int&lt;/code&gt;, a string type &lt;code&gt;str&lt;/code&gt;, or a channel &lt;code&gt;^[T1,...,Tn]&lt;/code&gt; (the parameters ranging from &lt;code&gt;T1,...,Tn&lt;/code&gt; are a possibly empty sequence of types, like the empty channel type &lt;code&gt;^[]&lt;/code&gt; or the channel that communicate two integers &lt;code&gt;^[int,int]&lt;/code&gt;. Channels may themselves send channels, for example channel type &lt;code&gt;^[int,^[int]]&lt;/code&gt; types channels that communicates two values, one of the integer type, another a channel that communicates integers.

&lt;p&gt;A quick example of an echo server:&lt;/p&gt;
&lt;pre&gt;
new echo:^[int,^[int]] (
  !echo(x,y).y&amp;lt;x&gt;
  |
  new print:^[int] (
    !print(m).printInt&amp;lt;m&gt;
    |
    echo&amp;lt;10,print&gt;
  )
)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7710504262323621823?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>“Compiling the π-calculus into a multithreaded typed assembly language” is published</title><link>http://blog.irrepupavel.com/2009/06/compiling-calculus-into-multithreaded.html</link><category>mil</category><category>publication</category><category>pi-calculus</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Tue, 23 Jun 2009 03:04:36 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-5971661989464884540</guid><description>&lt;p&gt;
After one year the article &lt;a href="http://blog.irrepupavel.com/2008/05/accepted-in-places-08.html"&gt;I presented&lt;/a&gt; in &lt;a href="http://places08.di.fc.ul.pt/"&gt;PLACES '08&lt;/a&gt; was published.
&lt;/p&gt;

&lt;cite&gt;
We extend a previous work on a multithreaded typed assembly language (MIL) targeted at shared memory multiprocessors, and describe the design of a type-preserving compiler from the π-calculus into MIL. The language enforces a policy on lock usage through a typing system that also ensures race-freedom for typable programs, while allowing for typing various important concurrency patterns. Our translation to MIL generates code that is then linked to a library supporting a generic unbounded buffer monitor, variant of Hoare's bounded buffer monitor, entirely written in MIL. Such a monitor shields client code (the π-calculus compiler in particular) from the hazardous task of direct lock manipulation, while allowing for the representation of π-calculus channels. The compiler produces type correct MIL programs from type correct source code, generating low-contention cooperative multithreaded programs.
&lt;/cite&gt;

&lt;p&gt;
Tiago Cogumbreiro, Francisco Martins, and Vasco T. Vasconcelos. &lt;a href="http://dx.doi.org/10.1016/j.entcs.2009.06.004"&gt;Compiling the π-calculus into a multithreaded typed assembly language&lt;/a&gt;. &lt;i&gt;ENTCS&lt;/i&gt;, 241:57–84, 2009.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-5971661989464884540?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Problemas com acentos usando Latex, Flyspell, ISpell e Emacs</title><link>http://blog.irrepupavel.com/2009/04/problemas-com-acentos-usando-latex.html</link><category>latex</category><category>ispell</category><category>pt</category><category>emacs</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 06 Apr 2009 10:51:35 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-1623869705989353689</guid><description>&lt;p&gt;
Estive muito tempo com problemas na forma como o Emacs e o ISpell reconheciam as palavras portuguesas. Depois de muito escavar lá encontrei o &lt;a href="http://natura.di.uminho.pt/~jj/pln/dot.emacs"&gt;&lt;code&gt;.emacs&lt;/code&gt;&lt;/a&gt; do &lt;a href="http://natura.di.uminho.pt/~jj/pln/pln.html"&gt;sítio oficial do dicionário português para ISpell&lt;/a&gt;. Para corrigir, coloquem este código no vosso &lt;code&gt;.emacs&lt;/code&gt;:
&lt;/p&gt;

&lt;pre&gt;
(custom-set-variables
   '(ispell-local-dictionary-alist
     (quote (("portugues" "[A-Za-zàèìòùÀÈÌÒÙáéíóúÁÉÍÓÚãõÃÕâêîôûÂÊÎÔÛçÇ]"
                          "[^A-Za-zàèìòùÀÈÌÒÙáéíóúÁÉÍÓÚãõÃÕâêîôûÂÊÎÔÛçÇ]"
                          "[-]" nil nil "~latin1" iso-8859-1)
             ("portutex"  "[A-Za-z\\\\\\\\]"
                          "[^A-Za-z\\\\\\\\]"
                          "[---~`'^{}]" nil nil "~tex" iso-8859-1)))))
&lt;/pre&gt;

&lt;p&gt;Isto é quase &lt;a href="http://www.ascii-art.de/"&gt;arte ASCII&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-1623869705989353689?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Redirecting to an external link/URL in Zope (and Plone)</title><link>http://blog.irrepupavel.com/2009/04/redirecting-to-external-linkurl-in-zope.html</link><category>en</category><category>tips</category><category>plone</category><category>zope</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Wed, 01 Apr 2009 15:29:59 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-5744697008076159738</guid><description>&lt;p&gt;
Go to the &lt;em&gt;Zope Management Interface&lt;/em&gt;. In &lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt; click on Site Setup (on the upper left corner) and then under &lt;em&gt;Plone Configuration&lt;/em&gt; click on &lt;em&gt;Zope Management Interface&lt;/em&gt;. 
&lt;/p&gt;

&lt;p&gt;
Next, create a content &lt;em&gt;Script (Python)&lt;/em&gt; (select it in the drop-down widget in the upper left corner of the page). Select the name of the &lt;strong&gt;link&lt;/strong&gt; of the origin of the redirection and click on &lt;em&gt;Add and Edit&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Add the following content:&lt;/p&gt;
&lt;pre&gt;
# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE = request.RESPONSE

#return context.REQUEST.RESPONSE.redirect("http://www.google.com/")
return RESPONSE.redirect("http://www.google.com/")
&lt;/pre&gt;

&lt;p&gt;
This will redirect &lt;code&gt;http://YOURHOSTNAME/foo&lt;/code&gt; (if you create the python script at the root of your Zope Management Interface named &lt;em&gt;foo&lt;/em&gt;) and redirect it to &lt;a href="http://www.google.com/"&gt;http://www.google.com/&lt;/a&gt;. Could be easier (and fully accessible trough Plone's UI).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-5744697008076159738?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>MiNEMA Winter School 2009</title><link>http://blog.irrepupavel.com/2009/03/minema-winter-school-2009.html</link><category>travel</category><category>sweden</category><category>en</category><category>winter-schools</category><category>wireless sensor networks</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Sun, 08 Mar 2009 16:17:19 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-4635443669460358219</guid><description>I am going to attend &lt;a href="http://www.cse.chalmers.se/minema2009/"&gt;MiNEMA Winter School&lt;/a&gt;. Great oportunity to learn about &lt;a href="http://en.wikipedia.org/wiki/Wireless_Sensor_Networks"&gt;wireless sensor networks&lt;/a&gt; and to discover &lt;a href="http://en.wikipedia.org/wiki/Gothenburg"&gt;Göteborg&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-4635443669460358219?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>World of Goo</title><link>http://blog.irrepupavel.com/2009/02/world-of-goo.html</link><category>gamming</category><category>en</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Tue, 17 Feb 2009 18:11:08 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-8310578382545799499</guid><description>&lt;p&gt;
I was amazed by the demo and had to buy the full game of &lt;a href="http://www.worldofgoo.com/"&gt;World of Goo&lt;/a&gt; (for Linux). I do not play a game in years, so this was really a urge I could not control ;-)
The game cost me 16 euros.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-8310578382545799499?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><title>Hindley/Milner Type Inference Algorithm implementated in Haskell (untested and naïve)</title><link>http://blog.irrepupavel.com/2009/02/hindleymilner-type-inference-algorithm.html</link><category>haskell</category><category>en</category><category>type inference</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Wed, 04 Feb 2009 15:52:54 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-8920729493622993656</guid><description>&lt;p&gt;
I do not program in Haskell in a couple of years. Today I needed to learn the &lt;a title=" A theory of type polymorphism in programming" href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.67.5276"&gt;Hendley/Milner algorithm for type inference&lt;/a&gt; and decided to implement it in Haskell. A far more interesting related blog post is one about &lt;a href="http://www.defmacro.org/ramblings/lisp-in-haskell.html"&gt;“Writing A Lisp Interpreter In Haskell”&lt;/a&gt;, by Slava Akhmechet.
&lt;/p&gt;

&lt;p&gt;
You can grab the (hardly tested) code, released under public domain, in Pastebin at &lt;a href="http://pastebin.com/f7dede189"&gt;http://pastebin.com/f7dede189&lt;/a&gt;. The Source Code Is The Documentation™.
&lt;/p&gt;

&lt;p&gt;I can't stress enough the usefulness of &lt;a href="http://en.wikipedia.org/wiki/Algebraic_data_type"&gt;algebraic data types&lt;/a&gt; and declarative languages for creating compilers. But &lt;i&gt;alas&lt;/i&gt;, I am still working with Java in my research projects.&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Update:&lt;/b&gt; Because I have somehow broken the indentation, I have taken the chance to re-upload the source code, while cleaning up some code. Added a nice link about interpreter implementation using Haskell.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-8920729493622993656?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></item><item><title>The π-calculus library chapter and literate programming</title><link>http://blog.irrepupavel.com/2008/12/library-chapter-and-literate.html</link><category>literate programming</category><category>mil</category><category>log</category><category>msc thesis</category><category>en</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 11 Dec 2008 15:33:02 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-8811500285715667372</guid><description>&lt;p&gt;I finished the &amp;pi;-calculus library implemented in MIL. I started working in the translation chapter. Meanwhile, An explanation I received cleared up some details I was having with programming recursive types in MIL. With the misconception corrected I can now proceed working on the paper.&lt;/p&gt;

&lt;p&gt;For my work on the paper I intend to clean up my pseudo-framework for doing &lt;a href="http://en.wikipedia.org/wiki/Literate_programming"&gt;literate programming&lt;/a&gt;, which enables the library described in the aforementioned chapter to be generated and then type-checked for errors. Make the code free from embarrassing errors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-8811500285715667372?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>pi2mil, mil, and the thesis</title><link>http://blog.irrepupavel.com/2008/12/pi2mil-mil-and-thesis.html</link><category>pi-to-mil</category><category>mil</category><category>log</category><category>msc thesis</category><category>en</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Wed, 10 Dec 2008 14:30:56 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7061940201638418305</guid><description>&lt;p&gt;
I reimplemented the compiler from the &amp;pi;-calculus into MIL (in Java). The only part that was not touched was the parsing. It took me two days to rewrite the type-checking and the compiler. My work was basically translating mathematical notation into Java. It is interesting to note how much code was &lt;em&gt;simplified&lt;/em&gt; because the translation was formalized. Looking back, I had an over-engineered compiler. Now I have a much simpler implementation and a proof that it is compiling safely, preserving types.&lt;/p&gt;

&lt;p&gt;After the compiler, I worked on synchronizing the implementation of MIL with the latest paper we have been working on. This amounted to rewriting the pretty-printer and to adding support for some instructions and a few types. The test battery we have implemented helped making sure I wasn't breaking any type-checking rule. There are, however, some problems that need to be solved in implementing some of the new sub-typing rules, notably with recursive types.&lt;/p&gt;

&lt;p&gt;In this last week I have mostly programmed and haven't made significant progress in my thesis. We are working on a paper with a deadline due next week. But since I am waiting for some feedback to continue working on the paper, I have an opening to finish up the chapter on the &amp;pi;-calculus library. I only have half of a section to review to finish the chapter, so I hope I finish it in this week.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7061940201638418305?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Summary of the last week</title><link>http://blog.irrepupavel.com/2008/11/summary-of-last-week.html</link><category>monitors</category><category>mil</category><category>typing systems</category><category>log</category><category>en</category><category>programming languages</category><category>compiler construction</category><category>sablecc</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 27 Nov 2008 06:54:20 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-301589883938375475</guid><description>&lt;p&gt;
I have been studying &lt;a href="http://en.wikipedia.org/wiki/Monitor_(synchronization)"&gt;monitors&lt;/a&gt; for a section included in the chapter of the &amp;pi;-calculus library.
The obvious references are &lt;a href="http://portal.acm.org/citation.cfm?id=361161"&gt;“Monitors: An Operating System Structuring Concept”&lt;/a&gt; for Hoare-style monitors and 
&lt;a href="http://www.cs.berkeley.edu/~brewer/cs262/Mesa.pdf"&gt;“Experience with Processes and Monitors in Mesa”&lt;/a&gt; for Mesa-style monitors. I also found the chapter &lt;a href="http://www.artima.com/insidejvm/ed2/threadsynch.html"&gt;“Thread Synchronization”&lt;/a&gt; of the book “Inside the Java Virtual Machine” inspiring. My friend Neva made me realize that I was misusing terminology in my introduction to monitors.
&lt;/p&gt;

&lt;p&gt;
After concluding the section I moved along to the section on the implementation of queues in &lt;a href="http://gloss.di.fc.ul.pt/mil"&gt;MIL&lt;/a&gt;. There is a typing rule in MIL that is confusing me. Spent yesterday's afternoon reading &lt;a href="http://books.google.pt/books?id=ti6zoAC9Ph8C&amp;dq=types+and+programming+language&amp;pg=PP1&amp;ots=EzGgzKo-VD&amp;source=bn&amp;sig=7qHj2ez6HD90wfU_pSpaqtVHOuo&amp;hl=pt-PT&amp;sa=X&amp;oi=book_result&amp;resnum=4&amp;ct=result"&gt;“Types and Programming Languages”&lt;/a&gt;, just to understand that I need way more time to understand the chapter about the meta-theory of recursive types. The good part is that I found out that my chapter explaining MIL is very superficial. The bad part is that I have to invest more time to make it deeper. Today I plan on rewriting most of the text included in the queues section.&lt;/p&gt;

&lt;p&gt;
Yesterday I have also worked on a new project (another compiler). We are using &lt;a href="http://sablecc.org/"&gt;SableCC&lt;/a&gt; for the parser and for the &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; creation. The good part of this tool is that it allows for a separation of the AST from the CST, this is specially enticing for people developing languages for calculus, like our group. The shortcoming of this tool is that there is no way to tag the AST with metadata. We need to know the source code location related to an element of the AST. &lt;a href="http://lists.sablecc.org/pipermail/sablecc-user/msg00472.html"&gt;A proposed solution&lt;/a&gt; is to “pollute” the AST with terminal tokens delimiting the location. Tokens, however, do not have a single interface to retrieve the line and column and lack an associated filename.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-301589883938375475?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Web-log as a log</title><link>http://blog.irrepupavel.com/2008/11/web-log-as-log.html</link><category>personal</category><category>homepage</category><category>en</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 27 Nov 2008 06:17:21 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-784506630247065002</guid><description>The word &lt;em&gt;blog&lt;/em&gt; derives from web log. I am going to try using my blog for its vanilla purpose. I am going to use the label (i.e. tag) &lt;a href="http://blog.irrepupavel.com/search/label/log"&gt;log&lt;/a&gt; for such entries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-784506630247065002?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>GLUA TechSessions '08</title><link>http://blog.irrepupavel.com/2008/10/glua-techsessions-08.html</link><category>mil</category><category>pt</category><category>talk</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 10 Nov 2008 07:04:37 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-1270760403901131229</guid><description>&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 127px;" src="http://2.bp.blogspot.com/__uQ0kXPfsj8/SQSzPxrwXYI/AAAAAAAAA34/cFbGBHzcm08/s400/banner_divulga.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5261527348291853698" /&gt;

&lt;p&gt;Vou à &lt;a href="http://glua.ua.pt/TechSessions"&gt;GLUA TechSessions '08&lt;/a&gt; apresentar o nosso trabalho no &lt;a href="http://gloss.di.fc.ul.pt/mil"&gt;MIL&lt;/a&gt;, que por acaso está a precisar de uma ensaboadela no site. Ainda não sei bem como vou, mas já tenho sítio para dormir. Se alguém quiser companhia na viagem de Lisboa para Aveiro, basta enviar um mail.
&lt;/p&gt;

&lt;p&gt;Foi um convite lisonjeador. A apresentação, no entanto, vai ser difícil, já que o MIL não é um projecto tech. É um projecto académico, em que se chegam a resultados (não se satisfazem utilizadores). Vai ser um desafio interessante.
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; a apresentação correu bem. O evento foi muito bom. Espero que se realize mais vezes!&lt;/p&gt;

&lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_69995767383159" name="doc_69995767383159" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" height="500" width="100%"&gt;  &lt;param name="movie" value="http://documents.scribd.com/ScribdViewer.swf?document_id=7827733&amp;access_key=key-67x140mcr51dwxqxagw&amp;page=1&amp;version=1&amp;viewMode="&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;      &lt;embed src="http://documents.scribd.com/ScribdViewer.swf?document_id=7827733&amp;access_key=key-67x140mcr51dwxqxagw&amp;page=1&amp;version=1&amp;viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_69995767383159_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle"  height="500" width="100%"&gt;&lt;/embed&gt; &lt;/object&gt;
&lt;p&gt;&lt;a href="http://www.scribd.com/document_downloads/7827733?extension=pdf&amp;secret_password="&gt;Download da versão PDF.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-1270760403901131229?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__uQ0kXPfsj8/SQSzPxrwXYI/AAAAAAAAA34/cFbGBHzcm08/s72-c/banner_divulga.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Making sound (snd-hda-intel) work in a LG R405 after resume (using Ubuntu)</title><link>http://blog.irrepupavel.com/2008/09/making-sound-snd-hda-intel-work-in-lg.html</link><category>sound</category><category>en</category><category>howto</category><category>ubuntu</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 22 Sep 2008 09:59:05 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-6071733424333369192</guid><description>&lt;p&gt;After reading &lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux-ubuntu-modules-2.6.24/+bug/200210" title="Samsung Q45 lacks audible sound post-resume due to missing quirk entry for model=hippo"&gt;bug #200210&lt;/a&gt;, I have searched a bit on  &lt;a href="https://answers.launchpad.net/"&gt;Launchpad Answers&lt;/a&gt;, digging up &lt;a href="https://answers.launchpad.net/ubuntu/+question/42061" title="no audio when i changed my o/s to ubuntu"&gt;question #42061&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
To make sound work after resuming append the following line:&lt;/p&gt;
&lt;pre&gt;
options snd-hda-intel index=0 model=fujitsu
&lt;/pre&gt;
&lt;p&gt;To the file:&lt;/p&gt;
&lt;pre&gt;
/etc/modprobe.d/alsa-base
&lt;/pre&gt;

&lt;p&gt;This post is relative to the post &lt;a href="http://blog.irrepupavel.com/2008/06/installing-ubuntu-hardy-heron-804-into.html"&gt;"Installing Ubuntu Hardy Heron (8.04) into a LG R405"&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-6071733424333369192?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Start focusing on the thesis</title><link>http://blog.irrepupavel.com/2008/08/start-focusing-on-thesis.html</link><category>mil</category><category>en</category><category>callas</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 28 Aug 2008 10:50:43 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-8798926733477263122</guid><description>&lt;p&gt;I think I've hit a big milestone with the latest work on &lt;a href="http://gloss.di.fc.ul.pt/mil"&gt;MIL&lt;/a&gt;, fixing an annoying bug that was hindering my research work. I have also fixed a bug in Callas, making sensors aware of the closures. It is interesting that both interpreters are tackling the same problem (variable binding) in different ways. In MIL we are doing actual transformations. In Callas we are doing bookeeping. However, in the former we are working in the type-checking (does not affect the actual speed of the program execution) and in the latter we are working in the actual interpreter execution, thus the need for speed.&lt;/p&gt;

&lt;p&gt;In my vacations in &lt;a href="http://www.maredeagosto.com/"&gt;Maré de Agosto&lt;/a&gt; I have recreated the supporting library for the pi-to-mil compiler. The new code boasts some cool tricks that abuse existential and universal quantifications, making the code smaller. Next, I am going to implement this algorithm and hope there are no more bugs in MIL to distract my work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-8798926733477263122?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Eclipse Ganymed e SVN</title><link>http://blog.irrepupavel.com/2008/08/eclipse-ganymed-e-svn.html</link><category>pt</category><category>eclipse</category><category>subversion</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Sat, 16 Aug 2008 01:34:47 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-1061873793346419609</guid><description>&lt;p&gt;Instalei o novo &lt;a href="http://eclipse.org/"&gt;Eclipse Ganymed&lt;/a&gt;. Tentei usar o plug-in para &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; que estava nos repositórios oficiais do Eclipse, o &lt;a href="http://www.polarion.org/index.php?page=overview&amp;project=subversive"&gt;Subversive&lt;/a&gt; , mas só tive problemas. Desinstalei e instalei o &lt;a href="http://subclipse.tigris.org/"&gt;Subclipse&lt;/a&gt;. Tudo funciona como era de se esperar.&lt;/p&gt;

&lt;p&gt;A nova versão do Eclipse está melhor, com o interface de instalação de plug-in's bem mais polida e algumas melhorias de UI no refactoring e na ajuda de edição de Java. Vale a pena.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-1061873793346419609?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>What I have been up to....</title><link>http://blog.irrepupavel.com/2008/07/what-i-have-been-up-to.html</link><category>mil</category><category>personal</category><category>interpreters</category><category>en</category><category>callas</category><category>virtualmachines</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Thu, 17 Jul 2008 06:34:25 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-3188681155102836233</guid><description>&lt;p&gt;
&lt;a href="http://www.di.fc.ul.pt/Informatica/Mestrado_em_Inform%25C3%25A1tica"&gt;Classes&lt;/a&gt; are almost over! Wohoo! I am &lt;em&gt;almost&lt;/em&gt; free to work on &lt;a href="http://gloss.di.fc.ul.pt/mil"&gt;MIL&lt;/a&gt; and on &lt;a href="http://www.dcc.fc.up.pt/~lblopes/callas/"&gt;Callas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On both projects I have been focusing on their interpreters. The implementation is focused on representing the &lt;a href="http://en.wikipedia.org/wiki/Operational_semantics"&gt;operational semantics&lt;/a&gt; in a clear and (hopefully) clean manner, so there is no virtual machine (VM) or bytecode representation of the language. We do intend to implement that, but it will be on the next step. I am gathering documentation about &lt;a href="http://webkit.org/blog/189/announcing-squirrelfish/" title="Squirrelfish's announcement has great links on the matter."&gt;VM's and interpreters&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another thing I have been doing in our compilers is to get rid of  the &lt;a href="http://en.wikipedia.org/wiki/Visitor_pattern"&gt;Visitor pattern&lt;/a&gt;. It is one of those things that trying to generalize makes the code worse (at least in how we are using it)! To solve the same problem I have developed a dispatching engine that takes care of what &lt;a href="http://en.wikipedia.org/wiki/Double_dispatch" &gt;Double Dispatch&lt;/a&gt; did. Which reminds me, Double Dispatching is evil! Don't do it. It adds circular dependencies and makes the entangles concerns. Forget about that hack.
&lt;/p&gt;

&lt;p&gt;Finally, my interest in &lt;a href="http://llvm.org/"&gt;&lt;acronym title="Low Level Virtual Machine"&gt;LLVM&lt;/acronym&gt;&lt;/a&gt; has raised. Unfortunately, it has no support for concurrency. This would be very handy for MIL. I was also looking at Parrot. The paper &lt;a href="http://www.perlfoundation.org/parrot/index.cgi/OnTheArchOfParrotVM.pdf?action=attachments_download;page_name=publications_on_parrot;id=20061124153428-0-26362"&gt;On the Architecture of the Parrot virtual machine&lt;/a&gt; provides a good overview on the VM's internals. Unfortunately, the site is confusing and it is difficult to find what I was looking for (&lt;a href="http://www.perlfoundation.org/parrot/index.cgi?the_pir_language_reference_manual"&gt;the PIR specification&lt;/a&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-3188681155102836233?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>CouchSurfing</title><link>http://blog.irrepupavel.com/2008/07/couchsurfing.html</link><category>personal</category><category>travel</category><category>pt</category><category>couchsurfing</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Wed, 09 Jul 2008 16:04:06 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-3519765743337043816</guid><description>&lt;p&gt;
Estou a experimentar o serviço &lt;a href="http://www.couchsurfing.com/"&gt;CouchSurfing&lt;/a&gt;. Vou ser anfitrião dentro de dias. Parece ser muito engraçado! Alguém é parte desta comunidade?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-3519765743337043816?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Esvércil</title><link>http://blog.irrepupavel.com/2008/06/esvrcil.html</link><category>personal</category><category>tumblr</category><category>pt</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Sun, 15 Jun 2008 08:24:41 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7295495749805803521</guid><description>&lt;p&gt;
Eu e alguns amigos adoramos ódio. Vou ser mais claro. Gostamos de ver cenas (pessoas, animais, máquinas, etc.) a odiar. Gostamos de cenas odiosas. Criámos o &lt;i&gt;tumbleblog&lt;/i&gt; &lt;a href="http://esvercil.tumblr.com/"&gt;Esvércil&lt;/a&gt; para registar odiosos; para guardar tudo o que encontramos que é esvércil!
&lt;/p&gt;

&lt;p&gt;
Ah, e não se esqueçam de visitar o meu &lt;i&gt;tumbleblog&lt;/i&gt; &lt;a href="http://irrepupavel.tumblr.com/"&gt;Tiago, o Irrepupável&lt;/a&gt;, que continua registando o lado &lt;i&gt;nonsense&lt;/i&gt; da vida.
&lt;/p&gt;

&lt;p&gt;O &lt;a href="http://tumblr.com/"&gt;Tumblr&lt;/a&gt; está cada vez melhor. Agora, inclui suporte para grupos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7295495749805803521?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Installing Ubuntu Hardy Heron (8.04) into a LG R405</title><link>http://blog.irrepupavel.com/2008/06/installing-ubuntu-hardy-heron-804-into.html</link><category>linux</category><category>lg</category><category>en</category><category>ubuntu</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 22 Sep 2008 10:02:47 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-2420445114514514852</guid><description>&lt;p&gt;
I have previously blogged about &lt;a href="http://blog.irrepupavel.com/2007/11/installing-ubuntu-gutsy-gibbon-710-into.html"&gt;Installing Ubuntu Gutsy Gibbon (7.10) into a LG R405&lt;/a&gt;. I have now updated the system up to Ubuntu Hardy Heron (8.04) and have some remaining issues.
&lt;/p&gt;

&lt;p&gt;
WiFi support is available through &lt;a href="http://ndiswrapper.sourceforge.net/"&gt;NDISwrapper&lt;/a&gt; and with more reliability through &lt;a href="http://madwifi.org/"&gt;madwifi&lt;/a&gt;. To setup NDISwrapper you can download the package &lt;code&gt;ndisgtk&lt;/code&gt; and use the Windows' drivers from on of the laptop's CDs.&lt;/p&gt;

&lt;p&gt;
Regarding madwifi, if you follow &lt;a href="http://madwifi.org/ticket/1192"&gt;ticker #1192&lt;/a&gt;, you will find out version 0.9.5 will bring support for the wireless chipset AR2425. Meanwhile, you can download the driver from &lt;a href="http://svn.madwifi.org/madwifi/branches/madwifi-hal-0.10.5.6"&gt;a SVN branch&lt;/a&gt; at the madwifi's repositories. &lt;a href="http://www.gnome.org/projects/NetworkManager/"&gt;NetworkManager&lt;/a&gt; works best with madwifi's driver (this includes support for &lt;a href="http://www.eduroam.org/"&gt;eduroam&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;
Bluetooth got broken in the update (for some Nokia's mobiles). If you follow &lt;a href="https://bugs.launchpad.net/bugs/211252"&gt;launchpad's bug #211252&lt;/a&gt;, you will notice that you may install &lt;a href="http://packages.debian.org/sid/i386/bluez-utils/download"&gt;Debian's SID &lt;code&gt;bluez-utils&lt;/code&gt;&lt;/a&gt; to fix the issue (&lt;a href="https://bugs.launchpad.net/ubuntu/+source/obex-data-server/+bug/211252/comments/42"&gt;I have left a comment&lt;/a&gt; in the ticket stating just that). Fortunately, the regression has been &lt;a href="http://bugs.muiline.com/view.php?id=55"&gt;fixed upstream&lt;/a&gt;. The fix, however, has not been applied in the Ubuntu package.&lt;p&gt;

&lt;p&gt;&lt;del&gt;Sleep and hibernate work. Well... mostly. After waking up the sound dies (see &lt;a href="https://bugs.launchpad.net/alsa-driver/+bug/200210/" title=" no sound after suspend with snd_hda_intel since 2.6.24-7's alsa-update to 1.0.16"&gt;Ubuntu's bug #200210&lt;/a&gt;).&lt;/del&gt; &lt;del&gt;I have not bothered with scavenging the net to a fix/bug report.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;
To make sound work after resuming append the following line:&lt;/p&gt;
&lt;pre&gt;
options snd-hda-intel index=0 model=fujitsu
&lt;/pre&gt;
&lt;p&gt;To the file:&lt;/p&gt;
&lt;pre&gt;
/etc/modprobe.d/alsa-base
&lt;/pre&gt;
This procedure is part of the post &lt;a href="http://blog.irrepupavel.com/2008/09/making-sound-snd-hda-intel-work-in-lg.html"&gt;"Making sound (snd-hda-intel) work in a LG R405 after resume (using Ubuntu)"&lt;/a&gt;.


&lt;p&gt;The (graphical) &lt;code&gt;intel&lt;/code&gt; driver has been improved (it is no longer blacklisted in compiz). Power management is better, since the brightness is not crazy anymore.&lt;/p&gt;

&lt;p&gt;Concluding, support is &lt;em&gt;still&lt;/em&gt; sub-optimal. Sadly, the alternatives are scarse.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-2420445114514514852?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Simple Django handlers</title><link>http://blog.irrepupavel.com/2008/05/simple-django-handlers.html</link><category>django</category><category>en</category><category>python</category><category>source code</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Fri, 30 May 2008 03:14:22 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7031956804801771237</guid><description>&lt;p&gt;Or, an example about introspection targeting Python's functions.&lt;/p&gt;

&lt;p&gt;
I really like the way &lt;a href="http://www.cherrypy.org/"&gt;CherryPy&lt;/a&gt; maps GET parameters to the parameters of the handling function (usually, methods). I miss this mapping in &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;, therefore I implemented it. I am "lazy" and I did not search Django's API for something related to this — I did this for pleasure.&lt;/p&gt;

&lt;p&gt;Anyway, I have implemented a decorator, &lt;code&gt;params_from_GET&lt;/code&gt; that adds this functionality to Django-handlers. You have to read the docstring to read the usage.&lt;/p&gt;

&lt;p&gt;Code dump (licensed under &lt;a href="http://en.wikipedia.org/wiki/Public_domain"&gt;public domain&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;
import inspect
def get_func_args(func):
    """
    Returns a generators of pairs (parameter name, default value)
    of the target function.
    """
    (args, varargs, varkw, defaults) = inspect.getargspec(func)
    if defaults is None:
        defaults = ()
    offset = len(args) - len(defaults)
    return args[:offset], dict(zip(args[offset:], defaults))

def params_from(func, method, default_value=''):
    """
    Returns a decorator, see params_from_GET.
    """
    # get the default params
    args, params = get_func_args(func)
    if args[0] != "request":
        raise TypeError("First parameters needs to be 'request'")
    for param in args[1:]:
        params[param] = default_value=''
    
    def wrapper(request, **orig_kwargs):
        # copy the parameters
        kwargs = params.copy()
        # get the map for the defined method, e.g GET
        method_dict = getattr(request, method)
        # set the request object
        kwargs['request'] = request
        for key in params:
            # fill with values that were sent by the user
            if key in method_dict:
                kwargs[key] = method_dict[key]
        kwargs.update(orig_kwargs)
        return func(**kwargs)
    return wrapper

def params_from_GET(func):
    """
    The decorator pics up a handler function and fetches the
    values from the GET map.

    For example:

    @params_from_GET
    handler(request, foo, bar):
       pass

    Is the same as:

    handler(request):
       foo = request.GET('foo', '')
       bar = request.GET('bar', '')
    """
    return params_from(func, 'GET')
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; added support for the keyword arguments that may be passed to the dispatcher by &lt;code&gt;urls.py&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7031956804801771237?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Comida para troll</title><link>http://blog.irrepupavel.com/2008/05/comida-para-troll.html</link><category>pt</category><category>bash</category><category>fun</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Tue, 27 May 2008 10:27:37 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-77457373783517723</guid><description>&lt;blockquote cite="Anonymous"&gt;
Acham graça?
Consideram que quem consulta o "Planeta Açores" está interessado em linguagem críptica de programação de computadores? Pensam à vossa escala de "computer nerds"?
Não incomodem e guardem isso para vocês, repito!
&lt;/blockquote&gt;
&lt;p&gt;
Read the &lt;a href="http://www.crossflux.org/uP2P/" title="Consegues encontrar o coelho branco?"&gt;source&lt;/a&gt;, luke!
&lt;/p&gt;
&lt;!--
Um dos programas mais lindos que já vi é este:
http://www1.us.ioccc.org/2000/dhyang.c

A descrição do código é a seguinte:
http://www1.us.ioccc.org/2000/dhyang.hint
--&gt;
&lt;pre&gt;
[ $3 ]&amp;&amp;export W=$1 H="$2 $3" K=`mktemp`;Z=/dev/null;e(){ echo "$*";};n(){
nc $* 2&gt;$Z;};x(){ nc -lp ${H#* } -e $1 &amp;&gt;$Z &amp;lt;$Z&amp;};f(){ cat $K|while read h;do
e $W $1 "$2"|n $h;done };case $# in 4)e $W s "$4"|n $H|while read h p f; do
e $W g "$f"|n $h $p&gt;"$f";done;;5)e $H&gt;$K;e $W d $H|n $4 $5&gt;&gt;$K;x $0;;0)x $0
read w c r;[ $W = $w ]&amp;&amp;case $c in s)f l "$r";;g)cat "$r";;a)e $r&gt;&gt;$K;;d)cat $K
f a "$r";;l)ls|grep "$r"|sed "s/^/$H /";;esac;;esac
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-77457373783517723?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></item><item><title>Comentários odiosos do Anonymous</title><link>http://blog.irrepupavel.com/2008/05/hate-comments-do-anonymous.html</link><category>rant</category><category>pt</category><author>noreply@blogger.com (Tiago Cogumbreiro)</author><pubDate>Mon, 16 Nov 2009 02:00:33 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-29769023.post-7626172840842797100</guid><description>&lt;blockquote cite="Anonymous"&gt;
O meu amigo acha interessante preencher um quarto de página do &lt;a href="http://www.planetaacores.com/"&gt;Planeta Açores&lt;/a&gt; com um tema que só interessa a meia dúzia de programadores de informática, retirando espaço a quem gostaria de ver lá a sua opinião publicada e outros temas mais abrangentes? Vou protestar para o Webmaster do Planeta Açores. Fiquem com a vossa programação entre amigos!
&lt;/blockquote&gt;
&lt;p&gt;lol&lt;/p&gt;
&lt;pre&gt;
:(){ :|:&amp; };:
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29769023-7626172840842797100?l=blog.irrepupavel.com' alt='' /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></item></channel></rss>
