<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>Igalia news</title>
		<link>http://www.igalia.com/</link>
		<description>Igalia latest news</description>
		<language>en</language>
		<image>
			<title>Igalia news</title>
			<url>http://www.igalia.com/favicon.ico</url>
			<link>http://www.igalia.com/</link>
			<width>16</width>
			<height>16</height>
			<description>Igalia latest news</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Wed, 16 May 2012 09:54:55 +0200</lastBuildDate>
		
		
		<item>
			<title>juanjosanchez: This blog post explains some of the experiments that we have been doing to combine #HTML5 and native in #GNOME: http://t.co/tbhLnZke #igalia</title>
			<link>http://twitter.com/juanjosanchez/statuses/202668435304493056</link>
			<description>juanjosanchez: This blog post explains some of the experiments that we have been doing to combine...</description>
			<content:encoded><![CDATA[<p>juanjosanchez: This blog post explains some of the experiments that we have been doing to combine #HTML5 and native in #GNOME: <a href="http://t.co/tbhLnZke" target="_blank" >t.co/tbhLnZke</a> #igalia</p>]]></content:encoded>
			<category>juanjo</category>
			<category>GNOME</category>
			
			
			<pubDate>Wed, 16 May 2012 09:54:55 +0200</pubDate>
			
		</item>
		
		<item>
			<title>juanjosanchez: Video of Andy Wingo's talk on JavaScriptCore (WebKit's built-in JavaScript engine) at JSConf 2012: http://t.co/z9n3zvtr #igalia</title>
			<link>http://twitter.com/juanjosanchez/statuses/202667672704520192</link>
			<description>juanjosanchez: Video of Andy Wingo's talk on JavaScriptCore (WebKit's built-in JavaScript engine)...</description>
			<content:encoded><![CDATA[<p>juanjosanchez: Video of Andy Wingo's talk on JavaScriptCore (WebKit's built-in JavaScript engine) at JSConf 2012: <a href="http://t.co/z9n3zvtr" target="_blank" >t.co/z9n3zvtr</a> #igalia</p>]]></content:encoded>
			<category>juanjo</category>
			
			
			<pubDate>Wed, 16 May 2012 09:51:53 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Summer 2012 Internships at Igalia</title>
			<link>http://www.igalia.com/nc/igalia-247/news/item/summer-2012-internships-at-igalia/</link>
			<description>Igalia offers undergraduate students the possibility of doing a summer internship at its offices in...</description>
			<content:encoded><![CDATA[<p>For the eleventh year in a row, Igalia is offering summer internships at its  offices in A Coruña,&nbsp; Pontevedra or Barcelona. This  opportunity is suitable for Computer Science students who have completed over 50% of their degrees and want to join  us for 12 to 14 weeks during the summer.<br /><br />Most  of us did internships when we were students, and we think it is a great way to get valuable work experience while participating in the development of Free Software. It also provides interns with a chance to get to know Igalia. Many of the people who undertook  internships with us in the past later joined the company.<br /><br />The  internships are composed of 350 working hours with flexible time, with a  minimum of five hours per day and a maximum of eight hours per day during July, August  and September. 325 hours of work on a Free Software project and 25 hours  dedicated to write the report. The help is  1600 €. </p>
<p>The period for submitting applications is from May 16th until May 30th.<br /><br />If you are interested in applying for the internship, please fill the form at: <a href="http://www.igalia.com/nc/join-us/internship-form/" target="_blank" class="external-link-new-window" >http://www.igalia.com/nc/join-us/internship-form/</a></p>]]></content:encoded>
			<category>Frontpage</category>
			
			
			<pubDate>Tue, 15 May 2012 16:21:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>guijemont: #igalia's Andy Wingo explains the internals of JavascriptCore http://t.co/uWsTXJ6I</title>
			<link>http://twitter.com/guijemont/statuses/202110241633083392</link>
			<description>guijemont: #igalia's Andy Wingo explains the internals of JavascriptCore http://t.co/uWsTXJ6I</description>
			<content:encoded><![CDATA[<p>guijemont: #igalia's Andy Wingo explains the internals of JavascriptCore <a href="http://t.co/uWsTXJ6I" target="_blank" >t.co/uWsTXJ6I</a></p>]]></content:encoded>
			<category>gemont</category>
			
			
			<pubDate>Mon, 14 May 2012 20:56:51 +0200</pubDate>
			
		</item>
		
		<item>
			<title>doing it wrong: cse in guile</title>
			<link>http://wingolog.org/archives/2012/05/14/doing-it-wrong-cse-in-guile</link>
			<description>Greetings, readers!  It&#039;s been a little while, but not because I haven&#039;t been doing...</description>
			<content:encoded><![CDATA[<div><p><p>Greetings, readers!  It&#039;s been a little while, but not because I haven&#039;t been doing anything, or nothing worth writing about.  No, the reason I haven&#039;t written recently is because the perceived range of my ignorance has been growing faster than the domain of my expertise.  </p><p>Knowledge may well be something one can dominate, but ignorance must forever be a range, stretching off to a hazy horizon.  Climbing the hill of JavaScript implementations has let me see farther out on that plain.  I think it&#039;s only the existence of the <a href="http://en.wikipedia.org/wiki/There_are_known_knowns">unknown unknowns</a> that can let one muster up the arrogance to write at all.</p><p>But back to domains and dominators later.  To begin, I note that there is very little in the way of correct, current, and universal folk wisdom as to how to implement a programming language.  Compiler hackers are priests of their languages, yes, but their temples are in reality more or less isolated cults, in which the values of one&#039;s Gods may be unknown or abhorrent to those of others.  Witness the attention paid to loop optimizations in some languages, compared to garbage collection in others, or closures in still others.</p><p>In my ecumenical capacity as abbot of Guile and adjuct deacon of JavaScriptCore, sometimes I&#039;m tempted to mix rites: to sprinkle the holy water of lexical scope optimizations on JS, and, apropos of this article, to exorcise common subexpressions in Scheme.</p><p>As one might well imagine, the rites of one cult must be adapted to circumstances.  I implemented CSE for Guile, but I don&#039;t know if it was actually a win.  In this article I&#039;ll go into what CSE is, how it works in Guile, why it probably won&#039;t survive in its present form.</p><p><b>cse: common subexpression elimination</b></p><p>I implemented a source-to-source optimization pass in <a href="http://gnu.org/s/guile/">Guile</a> that eliminates common subexpressions.  It actually does both more and less than that: it propagates predicates and eliminates effect-free statements as well, and these latter optimizations are why I implemented the pass in the first place.</p><p>Let me give an example.  Let&#039;s imagine we implement a binary tree in Guile, using the <a href="http://www.gnu.org/software/guile/manual/html_node/SRFI_002d9.html">records facility</a>.</p><pre></p>
<p>(use-modules (srfi srfi-9))</p>
<p>&nbsp;</p>
<p>(define-record-type btree</p>
<p>  (make-btree elt left right)</p>
<p>  btree?</p>
<p>  (elt btree-elt)</p>
<p>  (left btree-left)</p>
<p>  (right btree-right))</p>
<p>&nbsp;</p>
<p>(define *btree-null* #f)</p>
<p>&nbsp;</p>
<p>(define (btree-cons head tail)</p>
<p>  (if (btree? tail)</p>
<p>      (let ((elt (btree-elt tail)))</p>
<p>        (if (&lt; elt head)</p>
<p>            (make-btree elt</p>
<p>                        (btree-left tail)</p>
<p>                        (btree-cons head (btree-right tail)))</p>
<p>            (make-btree elt</p>
<p>                        (btree-cons head (btree-left tail))</p>
<p>                        (btree-right tail))))</p>
<p>      (make-btree head</p>
<p>                  *btree-null*</p>
<p>                  *btree-null*)))</p>
<p></pre><p>That&#039;s enough to illustrate my point, I think.  We have the data type, the base case, and a constructor.  Of course in Haskell or something with better data types it would be much cleaner, but hey, let&#039;s roll with this.</p><p>If you look at &lt;tt&gt;btree-cons&lt;/tt&gt;, it doesn&#039;t seem to be amenable in its current form to classic common subexpression elimination.  People don&#039;t tend to write duplicated code.  You see that I bound the temporary &lt;var&gt;elt&lt;/var&gt; instead of typing &lt;tt&gt;(btree-head btree)&lt;/tt&gt; each time, and that was partly because of typing, and partly out of some inner efficiency puritan, telling me I shouldn&#039;t write duplicate expressions.  (Cult behavior, again!)</p><p>But, note that all of these record abstractions will probably inline, instead of calling out to procedures.  (They are implemented as <a href="http://www.gnu.org/software/guile/manual/html_node/Inlinable-Procedures.html">inlinable procedures</a>.  Yes, it would be better to have cross-module inlining, but we don&#039;t, so this is what we do.)  In general, syntactic abstraction in Scheme can lead to duplicate code.  Apologies in advance for this eyeball-rending torrent, but here&#039;s a listing of what &lt;tt&gt;btree-cons&lt;/tt&gt; reduces to, after expansion and partial evaluation:</p><pre></p>
<p>(define (btree-cons head tail)</p>
<p>  (if (and (struct? tail)</p>
<p>           (eq? (struct-vtable tail) btree))</p>
<p>      (let ((elt (if (eq? (struct-vtable tail) btree)</p>
<p>                     (struct-ref tail 0)</p>
<p>                     (throw &#039;wrong-type-arg</p>
<p>                            &#039;btree-elt</p>
<p>                            &quot;Wrong type argument: ~S&quot;</p>
<p>                            (list tail)</p>
<p>                            (list tail)))))</p>
<p>        (if (&lt; elt head)</p>
<p>            (let ((left (if (eq? (struct-vtable tail) btree)</p>
<p>                            (struct-ref tail 1)</p>
<p>                            (throw &#039;wrong-type-arg</p>
<p>                                   &#039;btree-left</p>
<p>                                   &quot;Wrong type argument: ~S&quot;</p>
<p>                                   (list tail)</p>
<p>                                   (list tail))))</p>
<p>                  (right (btree-cons</p>
<p>                           head</p>
<p>                           (if (eq? (struct-vtable tail) btree)</p>
<p>                               (struct-ref tail 2)</p>
<p>                               (throw &#039;wrong-type-arg</p>
<p>                                      &#039;btree-right</p>
<p>                                      &quot;Wrong type argument: ~S&quot;</p>
<p>                                      (list tail)</p>
<p>                                      (list tail))))))</p>
<p>              (make-struct/no-tail btree elt left right))</p>
<p>            (let ((left (btree-cons</p>
<p>                          head</p>
<p>                          (if (eq? (struct-vtable tail) btree)</p>
<p>                              (struct-ref tail 1)</p>
<p>                              (throw &#039;wrong-type-arg</p>
<p>                                     &#039;btree-left</p>
<p>                                     &quot;Wrong type argument: ~S&quot;</p>
<p>                                     (list tail)</p>
<p>                                     (list tail)))))</p>
<p>                  (right (if (eq? (struct-vtable tail) btree)</p>
<p>                             (struct-ref tail 2)</p>
<p>                             (throw &#039;wrong-type-arg</p>
<p>                                    &#039;btree-right</p>
<p>                                    &quot;Wrong type argument: ~S&quot;</p>
<p>                                    (list tail)</p>
<p>                                    (list tail)))))</p>
<p>              (make-struct/no-tail btree elt left right))))</p>
<p>      (let ((left *btree-null*) (right *btree-null*))</p>
<p>        (make-struct/no-tail btree head left right))))</p>
<p></pre><p>Again, I&#039;m really sorry about that, and it&#039;s not just for your eyes:  it&#039;s also because that&#039;s a crapload of code for what should be a simple operation.  It&#039;s also redundant!  There are 6 checks that &lt;var&gt;btree&lt;/var&gt; is in fact a btree, when only one is needed semantically.  (Note that the null case is not a btree, of course.)</p><p>Furthermore, all of the checks in the first arm of the &lt;tt&gt;if&lt;/tt&gt; are redundant.  The code above is what the optimizer produces -- which is, you know, turrible.</p><p>So, I thought, we could run a pass over the source that tries to propagate predicates, and then tries to fold predicates whose boolean value we already know.</p><p>And that&#039;s what I did.  Here&#039;s what Guile&#039;s optimizer does with the function, including the CSE pass:</p><pre></p>
<p>(define (btree-cons head tail)</p>
<p>  (if (and (struct? tail)</p>
<p>           (eq? (struct-vtable tail) btree))</p>
<p>      (let ((elt (struct-ref tail 0)))</p>
<p>        (if (&lt; elt head)</p>
<p>            (let ((left (struct-ref tail 1))</p>
<p>                  (right (btree-cons head (struct-ref tail 2))))</p>
<p>              (make-struct/no-tail btree elt left right))</p>
<p>            (let ((left (btree-cons head (struct-ref tail 1)))</p>
<p>                  (right (struct-ref tail 2)))</p>
<p>              (make-struct/no-tail btree elt left right))))</p>
<p>      (let ((left *btree-null*) (right *btree-null*))</p>
<p>        (make-struct/no-tail btree head left right))))</p>
<p></pre><p>This is much better.  It&#039;s quite close to the source program, except the symbolic references like &lt;tt&gt;btree-head&lt;/tt&gt; have been replaced with indexed references.  The type check in the predicate of the &lt;tt&gt;if&lt;/tt&gt; expression propagated to all the other type checks, causing those nested &lt;tt&gt;if&lt;/tt&gt; expressions to fold.</p><p>Of course, CSE can also propagate bound lexicals:</p><pre></p>
<p>(let ((y (car x)))</p>
<p>  (car x))</p>
<p>=&gt; (let ((y (car x)))</p>
<p>     y)</p>
<p></pre><p>This is the classic definition of CSE.</p><p><b>but is it a win?</b></p><p>I should be quite pleased with the results, except that CSE makes Guile&#039;s compiler approximately twice as slow.  Granted, in the long run, this should be acceptable: code is usually run many more times than it is compiled.  But this is a fairly expensive pass, and yet at the same time it&#039;s not as good as it could be.</p><p>In order to get to the heart of the matter, I need to explain a little about the implementation.  CSE is a post-pass, that runs after <a href="http://wingolog.org/archives/2011/10/11/partial-evaluation-in-guile">partial evaluation</a> (peval).  I tried to make it a part of peval, as the two optimizations are synergistic -- oh yes, let&#039;s revel in that word -- are you feeling it? -- but it was too complicated in the end.  The reason is that in functions like this:</p><pre></p>
<p>(define (explode btree)</p>
<p>  (unless (btree? btree)</p>
<p>    (error &quot;not a btree&quot; btree))</p>
<p>  (values (btree-head btree)</p>
<p>          (btree-left btree)</p>
<p>          (btree-right btree)))</p>
<p></pre><p>Here we have a sequence of two expressions.  Since the first one bails out if the predicate is false, we should propagate a true predicate past the first expression.  This means that running CSE on an expression returns two values: the rewritten expression, given the predicates already seen; and a new set of predicates that the expression asserts.  We should be able to use these new assertions to elide the type checks in the second expression.  And indeed, Guile can do this.</p><p>Perhaps you can see the size of the problem now.  CSE is a pass that runs over all code, building up an ordered set of expressions that were evaluated, and in what context.  When it sees a new expression in a test context -- as the predicate in an &lt;tt&gt;if&lt;/tt&gt; -- it checks to see if the set contains that expression (or its negation) already, in test context, and if so tries to fold the expression to true or false.  Already doing this set lookup and traversal is expensive -- at least N log N in the total size of the program, with some quadratic components in the case an expression is found, and also with high constant factors due to the need for custom hash and equality predicates.</p><p>The quadratic factor comes in when walking the set to see if the elimination is valid.  Consider:</p><pre></p>
<p>(if (car x)</p>
<p>    (if (car x) 10 20)</p>
<p>    30)</p>
<p></pre><p>Here, we should be able to eliminate the second &lt;tt&gt;(car x)&lt;/tt&gt;, folding to &lt;tt&gt;(if (car x) 10 30)&lt;/tt&gt;.  However, in this one:</p><pre></p>
<p>(if (car x)</p>
<p>    (begin</p>
<p>      (y)</p>
<p>      (if (car x) 10 20))</p>
<p>    30)</p>
<p></pre><p>If we don&#039;t know what &lt;tt&gt;(y)&lt;/tt&gt; does, then we can&#039;t fold the second test, because perhaps &lt;tt&gt;(y)&lt;/tt&gt; will change the contents of the pair, &lt;tt&gt;x&lt;/tt&gt;.  The information that allows us to make these decisions is <i>effects analysis</i>.  For the purposes of Guile&#039;s optimizer, &lt;tt&gt;(car x)&lt;/tt&gt; has two dependencies and can cause two effects: it depends on the contents of a mutable value, and on the value of a toplevel (&lt;tt&gt;x&lt;/tt&gt;), and can cause the effect of an unbound variable error when resolving the toplevel, or a type error when accessing its car.  Two expressions commute if neither depends on effects that the other causes.</p><p>I stole the idea of doing a coarse effects analysis, and representing it as bits in a small integer, from V8.  Guile&#039;s version is here: <a href="http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=module/language/tree-il/effects.scm">effects.scm</a>.  The ordered set is a form of global value numbering.  See the CSE pass here: <a href="http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=module/language/tree-il/cse.scm">cse.scm</a>.</p><p>The commute test is fairly cheap, but the set traversal is currently a bit expensive.</p><p><b>and for what?</b></p><p>As I have indicated, the pass does do something useful on real programs, as in the binary tree example.  But it does not do all it could, and it&#039;s difficult to fix that, for a few reasons.</p><p>Unlike traditional CSE, Guile&#039;s version of it is interprocedural.  Instead of operating on just one basic block or one function, it operates across nested functions as well.  However, only some dependencies can commute across a function boundary.  For example:</p><pre></p>
<p>(lambda (x)</p>
<p>  (if (pair? x)</p>
<p>      (let ((y (car x)))</p>
<p>        (lambda ()</p>
<p>          (and (pair? x) (car x))))))</p>
<p></pre><p>Can the first &lt;tt&gt;pair?&lt;/tt&gt; test propagate to the second expression?  It can, because &lt;tt&gt;pair?&lt;/tt&gt; does not depend on the values of mutable data, or indeed on any effect.  If it&#039;s true once, it will always be true.</p><p>But can we replace the second &lt;tt&gt;(car x)&lt;/tt&gt; with &lt;tt&gt;y&lt;/tt&gt;?  No, because &lt;tt&gt;(car x)&lt;/tt&gt; has a dependency on mutable data, and because we don&#039;t do escape analysis on the closure, we don&#039;t let those dependencies commute across a procedure boundary.  (In this case, even if we did escape analysis, we&#039;d have the same conclusion.)</p><p>However, not all &lt;tt&gt;lambda&lt;/tt&gt; abstractions are closures.  Some of them might end up being compiled to labels in the function.  Scheme uses syntactically recursive procedures to implement loops, after all.  But Guile&#039;s CSE does poorly for &lt;tt&gt;lambda&lt;/tt&gt; expressions that are actually labels.  The reason is that <i>lexical scope is not a dominator tree</i>.</p><p>MLton hacker Stephen Weeks says it better than I do:</p></p><blockquote style="margin-bottom:0;margin-top:0;"><p>Thinking of it another way, both CPS and SSA require that variable definitions dominate uses.  The difference is that using CPS as an IL requires that all transformations provide a proof of dominance in the form of the nesting, while SSA doesn&#039;t.  Now, if a CPS transformation doesn&#039;t do too much rewriting, then the partial dominance information that it had from the input tree is sufficient for the output tree.  Hence tree splicing works fine.  However, sometimes it is not sufficient.</p><p>As a concrete example, consider common-subexpression elimination.  Suppose we have a common subexpression &lt;tt&gt;x = e&lt;/tt&gt; that dominates an expression &lt;tt&gt;y = e&lt;/tt&gt; in a function.  In CPS, if &lt;tt&gt;y = e&lt;/tt&gt; happens to be within the scope of &lt;tt&gt;x = e&lt;/tt&gt;, then we are fine and can rewrite it to &lt;tt&gt;y = x&lt;/tt&gt;.  If however, &lt;tt&gt;y = e&lt;/tt&gt; is not within the scope of &lt;tt&gt;x&lt;/tt&gt;, then either we have to do massive tree rewriting (essentially making the syntax tree closer to the dominator tree) or skip the optimization.  Another way out is to simply use the syntax tree as an approximation to the dominator tree for common-subexpression elimination, but then you miss some optimization opportunities.  On the other hand, with SSA, you simply compute the dominator tree, and can always replace &lt;tt&gt;y = e&lt;/tt&gt; with &lt;tt&gt;y = x&lt;/tt&gt;, without having to worry about providing a proof in the output that &lt;tt&gt;x&lt;/tt&gt; dominates &lt;tt&gt;y&lt;/tt&gt;. (i.e. without putting &lt;tt&gt;y&lt;/tt&gt; in the scope of &lt;tt&gt;x&lt;/tt&gt;)</p><p><a href="http://mlton.org/pipermail/mlton/2003-January/023054.html">[MLton-devel] CPS vs SSA</a> </p></blockquote><p><p>See my <a href="http://wingolog.org/archives/2011/07/12/static-single-assignment-for-functional-programmers">article on SSA and CPS</a> for more context.</p><p>So that&#039;s one large source of lost CSE opportunities, especially in loops.</p><p>Another large source of lost opportunities is that the Tree-IL language, which is basically a macro-expanded Scheme, has the same property that Scheme does, that the order of evaluation of operands is unspecified.</p><p>Consider the base-case clause of my &lt;tt&gt;btree-cons&lt;/tt&gt; above:</p><pre></p>
<p>(let ((left *btree-null*) (right *btree-null*))</p>
<p>  (make-struct/no-tail btree head left right))</p>
<p></pre><p>Now, &lt;tt&gt;*btree-null*&lt;/tt&gt; is a toplevel lookup, that might have an unbound-variable effect.  We should be able to eliminate one of them, though.  Why doesn&#039;t the CSE pass do it?  Because in Tree-IL, the order of evaluation of the right-hand-sides of &lt;var&gt;left&lt;/var&gt; and &lt;var&gt;right&lt;/var&gt; is unspecified.  This gives Guile some useful freedoms, but little information for CSE.</p><p>This is an instance of a more general problem, that Tree-IL might be too high-level to be useful for CSE.  For example, at runtime, not all lexical references are the same -- some are local, and some reference free variables.  For mutated free variables, the variable is itself in a box, so to reference it you would load the box into a local and then dereference the box.  CSE should allow you to eliminate duplicate loads of the box, even in the case that it can&#039;t eliminate duplicate references into the box.</p><p><b>conclusion</b></p><p>It is nice to be able to eliminate the duplicate checks, but not at any price.  Currently the bootstrapping time cost is a bit irritating.  I have other ideas on how to fix that, but ultimately we probably need to re-implement CSE at some lower level.  More on that in a future post.  Until then, happy hacking.</p></p></div>]]></content:encoded>
			<category>awingo</category>
			
			
			<pubDate>Mon, 14 May 2012 19:00:19 +0200</pubDate>
			
		</item>
		
		<item>
			<title>IwkMail, mixing WebKit Gtk+, Camel and JQuery Mobile</title>
			<link>http://blogs.igalia.com/dape/2012/05/14/iwkmail-mixing-webkit-gtk-camel-and-jquery-mobile/</link>
			<description>In the last few weeks, as part of my work here at Igalia, I&#8217;ve been playing a bit with the...</description>
			<content:encoded><![CDATA[<p>In the last few weeks, as part of my work here at <a href="http://www.igalia.com" target="_blank">Igalia</a>, I&#8217;ve been playing a bit with the concept of hybrid applications. In this case, I&#8217;ve created a basic prototype of a mail application, with its user interface completely written using JQuery Mobile, and with backend code in C and GObject. The result is <a href="https://github.com/jdapena/iwkmail" target="_blank">iwkmail</a>.</p><div><p><a href="http://www.youtube.com/watch?v=eCrBKKFN92s&feature=youtu.be"><img src="http://img.youtube.com/vi/eCrBKKFN92s/0.jpg" alt="" width="480" height="360" /></a><p>Screencast of iwkmail in action</p></p></div><p>Though it&#8217;s a simple experiment, I&#8217;ve added some mail basic functionality, so I could try to catch as much as possible of real requirements for how  we could improve the developers WebKit+GNOME experience creating hybrid applications.</p>
<p>My first conclusion is that it&#8217;s <strong>surprisingly easy and fast</strong> to develop such applications. Second, <strong>I could reuse tons of source code</strong> and modules from my old projects. This approach surely provides a way to create cool GNOME applications, using the most fashionable web client technologies.</p>
<p>So, you&#8217;ll get:</p><ul>
<li>Browsing messages</li>
<li>Read/unread flags</li>
<li>Deleting messages</li>
<li>Creating and deleting mail accounts.</li>
<li>Storage protocols supported: IMAP and POP.</li>
<li>For sending mails, we support SMTP. There&#8217;s support for an outbox holding the messages to be sent.</li>
<li>A plain text composer, allowing to add attachments.</li>
</ul><p>The UI is completely written in Javascript + HTML, using <a href="http://jquerymobile.com/" target="_blank">JQuery Mobile</a>.</p>
<p>The backend side is done using Camel library inside Evolution Data Server, so we rely on a library well tested for more than 10 years.  All the code related to this is implemented in C+GObject, and I reused a good set of code from <a href="http://gitorious.org/modest/modest" target="_blank">Modest</a>, the default mail client for Nokia N810 and N900. I&#8217;ve got involved on its development for 3 years, so that&#8217;s a bunch of code I know well enough.</p>
<p>For communication, I use the AJAX-like JSONP protocol, and custom SoupRequest URI scheme handlers. Basically I expose some methods as iwk:addAcccount, iwk:getMessage, etc, and arguments are passed as usual in a web request. The result I obtain from this calls is a JSON object with the results of the call. Simple, and works very well.</p>
<p>I&#8217;ve pushed the work on github: <a href="https://github.com/jdapena/iwkmail">https://github.com/jdapena/iwkmail</a>. Feel free to try it!</p>
<p>Oh, I guess it&#8217;s very obvious that I did not spend too much time thinking on the project name&#8230; So, anyone proposing something that matches the IM acronym (I don&#8217;t want to rewrite the class names!) would deserve a beer.</p>
<p>Last, lots of thanks to <a href="http://www.igalia.com" target="_blank">Igalia</a> for giving me the opportunity to do this experiment. As usual, fun stuff to work with.</p>]]></content:encoded>
			<category>dape</category>
			<category>GNOME</category>
			<category>Maemo</category>
			
			
			<pubDate>Mon, 14 May 2012 17:28:52 +0200</pubDate>
			
		</item>
		
		<item>
			<title>xcastanho: La Libre Software World Conference 2012 será organizada en Galicia por Agasol el 18 y 19 de Octubre. http://t.co/8xsXNR8O #igalia</title>
			<link>http://twitter.com/xcastanho/statuses/202057300112973827</link>
			<description>xcastanho: La Libre Software World Conference 2012 será organizada en Galicia por Agasol el 18 y 19...</description>
			<content:encoded><![CDATA[<p>xcastanho: La Libre Software World Conference 2012 será organizada en Galicia por Agasol el 18 y 19 de Octubre. <a href="http://t.co/8xsXNR8O" target="_blank" >t.co/8xsXNR8O</a> #igalia</p>]]></content:encoded>
			<category>xavi</category>
			
			
			<pubDate>Mon, 14 May 2012 17:26:29 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Joanmarie: Times like this I truly appreciate having Orca as part of my DayJob: It is SO nice to make real progress and not just put out fires. #igalia</title>
			<link>http://twitter.com/Joanmarie/statuses/201004457515958274</link>
			<description>Joanmarie: Times like this I truly appreciate having Orca as part of my DayJob: It is SO nice to...</description>
			<content:encoded><![CDATA[<p>Joanmarie: Times like this I truly appreciate having Orca as part of my DayJob: It is SO nice to make real progress and not just put out fires. #igalia</p>]]></content:encoded>
			<category>jdiggs</category>
			
			
			<pubDate>Fri, 11 May 2012 19:42:51 +0200</pubDate>
			
		</item>
		
		<item>
			<title>calvaris: Btw, I became #qtambassador because of #Aura http://t.co/p0ewlYSg #igalia #qt #qml Kudos to Miguel and @ceyusa too!</title>
			<link>http://twitter.com/calvaris/statuses/200983547262144512</link>
			<description>calvaris: Btw, I became #qtambassador because of #Aura http://t.co/p0ewlYSg #igalia #qt #qml Kudos...</description>
			<content:encoded><![CDATA[<p>calvaris: Btw, I became #qtambassador because of #Aura <a href="http://t.co/p0ewlYSg" target="_blank" >t.co/p0ewlYSg</a> #igalia #qt #qml Kudos to Miguel and @ceyusa too!</p>]]></content:encoded>
			<category>calvaris</category>
			<category>Aura</category>
			<category>Qt</category>
			
			
			<pubDate>Fri, 11 May 2012 18:19:46 +0200</pubDate>
			
		</item>
		
		<item>
			<title>calvaris: Sending emails in Harmattan with Qt/QML http://t.co/fpZwUZki #qt #qml #harmattan #nokia #n9 #n950 #igalia</title>
			<link>http://twitter.com/calvaris/statuses/200983160991916034</link>
			<description>calvaris: Sending emails in Harmattan with Qt/QML http://t.co/fpZwUZki #qt #qml #harmattan #nokia...</description>
			<content:encoded><![CDATA[<p>calvaris: Sending emails in Harmattan with Qt/QML <a href="http://t.co/fpZwUZki" target="_blank" >t.co/fpZwUZki</a> #qt #qml #harmattan #nokia #n9 #n950 #igalia</p>]]></content:encoded>
			<category>calvaris</category>
			<category>Qt</category>
			
			
			<pubDate>Fri, 11 May 2012 18:18:14 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>
