<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6003917</id><updated>2012-01-30T23:39:14.764Z</updated><category term='cocoa'/><category term='emacs'/><category term='patterns'/><category term='user interface'/><category term='apple'/><category term='mac'/><category term='PhD'/><category term='ubiquity'/><category term='web applcations'/><category term='lisp'/><category term='graphs'/><category term='mozilla'/><category term='functionality dependency'/><title type='text'>Carpathian Cloud</title><subtitle type='html'>We were both silent for a while, and as I looked towards the window I saw the first dim streak of the coming dawn. There seemed a strange stillness over everything. But as I listened, I heard as if from down below in the valley the howling of many wolves. The Count's eyes gleamed, and he said:&lt;br/&gt;
&lt;b&gt;"Listen to them, the children of the night. What music they make!"&lt;/b&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default?start-index=101&amp;max-results=100'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>107</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6003917.post-6324857683371359201</id><published>2010-07-02T11:49:00.000+01:00</published><updated>2010-07-02T11:50:10.761+01:00</updated><title type='text'>Blogspot #fail acknowledge</title><content type='html'>&lt;p&gt;I'll keep this short. I'm tired of workarounds to post what I want the way I want in this blog system. So while this is going to be kept alive on Blogger for reference purposes, I'm going to start using Posterous to publish my random thoughts, academic/professional facts and/or opinions. Thank you for having read along. If you have been enjoying the content, please head on to &lt;a href="http://edgargoncalves.posterous.com"&gt;http://edgargoncalves.posterous.com&lt;/a&gt;, and update your feeds to that blog's.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6324857683371359201?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6324857683371359201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6324857683371359201'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/07/blogspot-fail-acknowledge.html' title='Blogspot #fail acknowledge'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4800203142865176311</id><published>2010-06-18T02:40:00.002+01:00</published><updated>2010-06-18T02:42:46.992+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>How I live with cold starts on GAE's JVM</title><content type='html'>&lt;p&gt;It has come to my attention the (obvious and logical) fact that loading the JVM is expensive, time-wise. And Google's Application Engine (GAE) makes no exception, so whenever one servlet is "hit" long after any previous server interaction, a JVM is started. In practice, this means that we're looking at a "loading..." spinning wheel with a duration of about 10s, +-5s. That's kind of a bother, but that's not the worse. If we're talking about a single-page modeled web app, the user is bound to leave it opened for some time (minutes, not to say hours, before he is able to gather all the info to fill in that devilish form!). And after that time, when he is eager to finish up his task (that has already took him enough time outside the browser window), guess what? That's right, wait another 10s for the server's JVM to wake up. Off course this is a non-issue for heavy-traffic web apps, but this platform is great for experiments and small business products, and it's this niche I'm worried with (perhaps because I'm also targeting it :) )&lt;/p&gt;
&lt;p&gt;Today's scenario is yet a bit worse. The time it takes for a GAE JVM to get drowsy is often shorter than 5 minutes (&lt;a href="http://blog.sarathonline.com/2010/04/appengine-cold-startups-rendezvous-with.html"&gt;here&lt;/a&gt; are some conclusions about timings, as well as other suggestions to alleviate the problem - but insufficient, still). I could only imagine Google is having a hard time escalating their servers to everyone, but they should get a solution to this. Otherwise people will start hacking this problem subversively. In fact, they're already doing it: exploits are there to make a repeated task that keeps the JVM in question alive - a ping, let's call it that! But as soon as this hack becomes mainstream and widespread, Google will hog down with requests. So I'm sort of against it. But since there is no viable solution so far, I started reconsidering things.&lt;/p&gt;
&lt;p&gt;What I ended up was a compromise. For applications like the ones I'm developing there will be only 3 or 4 users, and their request will be very scarce and scattered. So I will not use a frequent and constant ping bot. Instead, I made a client-side that does that pinging, but only while the application is opened. So yes, the user has to wait some seconds to fire up the application for the first time. But afterwards, a background (i.e., asynchronous) periodic request keeps the JVM ready to listen for the application's demands.&lt;/p&gt;
&lt;p&gt;Here's a possible Javascript code to make this happen. The trick here is to create a script dynamically (i.e., appending it to the body), and setting its source to any servlet's served URL (in this case, a ping one).&lt;/p&gt;
        &lt;script src="http://gist.github.com/443075.js?file=Periodic_server_pings.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4800203142865176311?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4800203142865176311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4800203142865176311'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/06/how-i-live-with-cold-starts-on-gae-jvm.html' title='How I live with cold starts on GAE&amp;#39;s JVM'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-3779177301194723851</id><published>2010-06-07T09:50:00.005+01:00</published><updated>2010-06-07T20:00:46.377+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>International Lisp Conference 2010</title><content type='html'>&lt;p&gt;I was asked to spread the word about the upcoming &lt;a href="http://www.international-lisp-conference.org/2010/index"&gt;International Lisp Conference 2010&lt;/a&gt; (ILC-2010). So here you have the Call for &lt;span style="text-decoration: line-through;"&gt;Arms&lt;/span&gt; Papers (from the &lt;a href="http://cl.ly/cde4cce2593155d79ec3"&gt;original attachment&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; International Lisp Conference 2010 &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; October 19-21, 2010 &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; John Ascuaga's Nugget (Casino) &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; Reno/Sparks, Nevada, USA (near Lake Tahoe) &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; Collocated with SPLASH 2010 (OOPSLA &amp;amp; DLS &amp;amp; more) &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; see also &lt;a href="http://splashcon.org"&gt;http://splashcon.org&lt;/a&gt; as well as&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.dynamic-languages-symposium.org/dls-10/"&gt;http://www.dynamic-languages-symposium.org/dls-10/&lt;/a&gt; &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; In association with ACM SIGPLAN (PENDING) &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;The Association of Lisp Users is pleased to announce that the 2010&lt;/p&gt;

  &lt;p&gt;International Lisp Conference will be held in Reno, Nevada, in&lt;/p&gt;

  &lt;p&gt;collocation with SPLASH 2010. The scope includes all areas related to&lt;/p&gt;

  &lt;p&gt;the Lisp family of programming languages.&lt;/p&gt;

  &lt;p&gt;Accepted papers will be published in the ACM Digital Library (PENDING).&lt;/p&gt;

  &lt;p&gt;Extended Abstracts and Papers must be written in English and submitted&lt;/p&gt;

  &lt;p&gt;electronically at http://www.easychair.org/conferences?conf=ilc2010 in&lt;/p&gt;

  &lt;p&gt;PDF or WORD format. If an Extended Abstract is submitted, it must be&lt;/p&gt;

  &lt;p&gt;between 2 and 4 pages, with full paper to follow before final deadline.&lt;/p&gt;

  &lt;p&gt;Final submissions must not exceed 15 pages and need to use the ACM&lt;/p&gt;

  &lt;p&gt;format, for which templates which can be found at:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;http://www.acm.org/sigs/pubs/proceed/template.html&lt;/b&gt;.&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Important Dates:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;* Deadline for Abstract Submission: August 1, 2010&lt;/p&gt;

  &lt;p&gt;* Deadline for Paper Submission: September 6, 2010&lt;/p&gt;

  &lt;p&gt;* Author notification: September 20, 2010&lt;/p&gt;

  &lt;p&gt;* Final paper due (in electronic form): October 5, 2010&lt;/p&gt;

  &lt;p&gt;* Conference: October 19-21, 2010&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Scope:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;Lisp is one of the greatest ideas from computer science and a major&lt;/p&gt;

  &lt;p&gt;influence for almost all programming languages and for all&lt;/p&gt;

  &lt;p&gt;sufficiently complex software applications.&lt;/p&gt;

  &lt;p&gt;The International Lisp Conference is a forum for the discussion of&lt;/p&gt;

  &lt;p&gt;Lisp and, in particular, the design, implementation and application of&lt;/p&gt;

  &lt;p&gt;any of the Lisp dialects. We encourage everyone interested in Lisp to&lt;/p&gt;

  &lt;p&gt;participate.&lt;/p&gt;

  &lt;p&gt;We invite high quality submissions in all areas involving Lisp&lt;/p&gt;

  &lt;p&gt;dialects and any other languages in the Lisp family, including, but&lt;/p&gt;

  &lt;p&gt;not limited to, ACL2, AutoLisp, Clojure, Common Lisp, ECMAScript,&lt;/p&gt;

  &lt;p&gt;Dylan, Emacs Lisp, ISLISP, Racket, Scheme, etc.&lt;/p&gt;

  &lt;p&gt;Topics may include any and all combinations of Lisp and:&lt;/p&gt;

  &lt;p&gt;* Language design and implementation&lt;/p&gt;

  &lt;p&gt;* Language critique&lt;/p&gt;

  &lt;p&gt;* Language integration, inter-operation and deployment&lt;/p&gt;

  &lt;p&gt;* Applications (especially commercial)&lt;/p&gt;

  &lt;p&gt;* 'Pearls' (of wisdom)&lt;/p&gt;

  &lt;p&gt;* Experience reports and case studies&lt;/p&gt;

  &lt;p&gt;* Reflection, meta-object protocols, meta-programming&lt;/p&gt;

  &lt;p&gt;* Domain-specific languages&lt;/p&gt;

  &lt;p&gt;* Programming paradigms and environments&lt;/p&gt;

  &lt;p&gt;* Parallel and distributed computing&lt;/p&gt;

  &lt;p&gt;* Software evolution&lt;/p&gt;

  &lt;p&gt;* Theorem proving&lt;/p&gt;

  &lt;p&gt;* Scientific computing&lt;/p&gt;

  &lt;p&gt;* Data mining&lt;/p&gt;

  &lt;p&gt;* Semantic web&lt;/p&gt;

  &lt;p&gt;We also encourage submissions about known ideas as long as they are&lt;/p&gt;

  &lt;p&gt;presented in a new setting and/or in a highly elegant way.&lt;/p&gt;

  &lt;p&gt;Authors concerned about the appropriateness of a topic may communicate&lt;/p&gt;

  &lt;p&gt;by electronic mail with the program chair prior to submission.&lt;/p&gt;

  &lt;p&gt;Each paper should explain its contributions in both general and&lt;/p&gt;

  &lt;p&gt;technical terms, identifying what has been accomplished, explaining&lt;/p&gt;

  &lt;p&gt;why it is significant, and comparing it with previous work. Authors&lt;/p&gt;

  &lt;p&gt;should strive to make their papers understandable to a broad audience.&lt;/p&gt;

  &lt;p&gt;Each paper will be judged according to its significance, novelty,&lt;/p&gt;

  &lt;p&gt;correctness, clarity, and elegance.&lt;/p&gt;

  &lt;p&gt;The official language of the conference is English. Some further&lt;/p&gt;

  &lt;p&gt;information is available at the conference web site, with more details&lt;/p&gt;

  &lt;p&gt;added later. See: &lt;a href="http://www.international-lisp-conference.org"&gt;http://www.international-lisp-conference.org&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Technical Program:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;Original submissions in all areas related to the conference themes are&lt;/p&gt;

  &lt;p&gt;invited for the following categories.&lt;/p&gt;

  &lt;p&gt;* Papers: Technical papers of up to 15 pages that describe original&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; results or explain known ideas in new and elegant ways, or extended&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; abstracts of 4 pages soon followed by the corresponding full paper.&lt;/p&gt;

  &lt;p&gt;* Demonstrations: Abstracts of up to 4 pages for demonstrations of&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; tools, libraries, and applications.&lt;/p&gt;

  &lt;p&gt;* Tutorials: Abstracts of up to 4 pages for in-depth presentations&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; about topics of special interest for at least 90 minutes and up to&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; 180 minutes.&lt;/p&gt;

  &lt;p&gt;* Workshops: Abstracts of up to 4 pages for groups of people who&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; intend to work on a focused topic for half a day.&lt;/p&gt;

  &lt;p&gt;* Panel discussions: Abstracts of up to 4 pages for discussions about&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; current themes. Panel discussion proposals must mention panel&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; members who are willing to partake in a discussion.&lt;/p&gt;

  &lt;p&gt;* Lightning talks: Abstracts of up to one page for talks to last for&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; no more than 5 minutes.&lt;/p&gt;

  &lt;p&gt;Depending on the technical content, each submitted paper will be&lt;/p&gt;

  &lt;p&gt;classified by the program committee as either a technical paper or as&lt;/p&gt;

  &lt;p&gt;an experience paper; and authors will be informed about this&lt;/p&gt;

  &lt;p&gt;classification. Note that all interesting submissions are considered&lt;/p&gt;

  &lt;p&gt;valuable contributions to the success of the ILC series of&lt;/p&gt;

  &lt;p&gt;conferences. As in past ILC's since 2007, accepted papers in both&lt;/p&gt;

  &lt;p&gt;categories will be presented at the conference, included in the&lt;/p&gt;

  &lt;p&gt;proceedings, and submitted to the ACM digital library.&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Organizing Committee:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;* General Chair:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; JonL White - The Ginger IceCream Factory of Palo Alto, ALU&lt;/p&gt;

  &lt;p&gt;* Program Chair:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; Antonio Leitao - Instituto Superior Tecnico/INESC-ID&lt;/p&gt;

  &lt;p&gt;* Conference Treasurer:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; Duane Rettig - Franz, Inc., ALU Director&lt;/p&gt;

  &lt;p&gt;* Publicity Chair:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; Daniel Herring - ALU Director&lt;/p&gt;

  &lt;p&gt;* ALU Treasurer:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp; Rusty Johnson - TASC, Inc., ALU Director&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Program Committee:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;* Antonio Leitao - Instituto Superior Tecnico/INESC-ID, Portugal&lt;/p&gt;

  &lt;p&gt;* Alex Fukunaga - University of Tokyo, Japan&lt;/p&gt;

  &lt;p&gt;* Charlotte Herzeel - Vrije Universiteit Brussel, Belgium&lt;/p&gt;

  &lt;p&gt;* Christophe Rhodes - Goldsmiths College, University of London, UK&lt;/p&gt;

  &lt;p&gt;* Didier Verna - EPITA Research and Development Laboratory, France&lt;/p&gt;

  &lt;p&gt;* Duane Rettig - Franz, Inc., USA&lt;/p&gt;

  &lt;p&gt;* Giuseppe Attardi - University of Pisa, Italy&lt;/p&gt;

  &lt;p&gt;* Jeff Shrager - Symbolic Systems Program, Stanford University, USA&lt;/p&gt;

  &lt;p&gt;* Joe Marshall - Google, Inc., USA&lt;/p&gt;

  &lt;p&gt;* Julian Padget - University of Bath, UK&lt;/p&gt;

  &lt;p&gt;* Keith Corbett - Clozure Associates, USA&lt;/p&gt;

  &lt;p&gt;* Kent Pitman - PTC, USA&lt;/p&gt;

  &lt;p&gt;* Manuel Serrano - INRIA Sophia Antipolis, France&lt;/p&gt;

  &lt;p&gt;* Marc Feeley - University of Montreal, Canada&lt;/p&gt;

  &lt;p&gt;* Marie Beurton-Aimar University of Bordeaux 1, France&lt;/p&gt;

  &lt;p&gt;* Mark Stickel - SRI International, USA&lt;/p&gt;

  &lt;p&gt;* Matthias Felleisen - Northeastern University, USA&lt;/p&gt;

  &lt;p&gt;* Scott McKay - ITA Software, USA&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;Contacts:&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;&lt;b&gt;~~~~~~~~~&lt;/b&gt;&lt;/p&gt;

  &lt;p&gt;* Questions: ilc10-organizing-committee at alu.org&lt;/p&gt;

  &lt;p&gt;* Program Chair: ilc2010 at easychair.org&lt;/p&gt;

  &lt;p&gt;For more information, see &lt;a href="http://www.international-lisp-conference.org"&gt;http://www.international-lisp-conference.org&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm curious about when are "clojurers" going to join forces with the rest of lispers on these kind of conferences. Specially since this one is collocated with SPLASH 2010, maybe it isn't such a bad idea to start doing it now :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-3779177301194723851?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3779177301194723851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3779177301194723851'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/06/international-lisp-conference-2010.html' title='International Lisp Conference 2010'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-997983329167071814</id><published>2010-05-31T13:19:00.001+01:00</published><updated>2010-05-31T13:20:50.648+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Yet another Clojure + Compojure + Google App Engine post</title><content type='html'>&lt;p&gt;Have I mentioned I'm kinda late to this show? Well, better late than sorry. Anyway, I think you can't have too much of these, specially in times where google application engine (GAE) is growing and so is Clojure.&lt;/p&gt;
&lt;p&gt;The scenario was like most others: I wanted to build my webapp using GAE and clojure, and also stay on the bleeding edge of each technology. So lets see what I've got. I started by taking a look at the "literature" available as blog posts and group discussions (such as &lt;a href="http://www.hackers-with-attitude.com/2010/04/clojure-google-app-engine-setup-update.html"&gt;this&lt;/a&gt; and &lt;a href="http://compojureongae.posterous.com/"&gt;this&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I installed lein, and created a standard project.clj (By force of habit, forgot to use "lein new", but it's practically the same). I added the following directives on defproject:&lt;/p&gt;
&lt;pre&gt;
:source-path "src"
:compile-path "war/WEB-INF/classes/"
:library-path "war/WEB-INF/lib/"
;; namespaces will trigger AOT compilation to bytecode. you want this!
:namespaces       [ginasiosunderground.servlet]
&lt;/pre&gt;My goal is to produce a war directory, to upload to gae servers. So I told lein to compile to war/WEB-INF/classes, using war/WEB-INF/lib as a classpath dir. (More to come later on that :namespaces directory). The final project.clj is the following:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/419749.js?file=gistfile1.clj"&gt;&lt;/script&gt;
&lt;br /&gt;
You can see the list of dependencies. I'm using the latest clojure 1.2, compojure 0.4, hiccup 0.2.4, a ring 0.2 (specifically adapted to use with gae servers) and appengine-clj (from &lt;a href="http://github.com/r0man/appengine-clj/"&gt;r0man's fork&lt;/a&gt;). I also use clojure-json (to make my life easier on jQuery client side ajax calls). I'd like to mention the libraries from google. As of now, a default lein setup can't find those up to date versions (they are available, but I didn't want to toy around with maven repositories to make the magic happen). So I got those jars from the gae java sdk (download it from gae's site) and placed them on my war/WEB-INF/lib folder. Now be ware, you should have a copy of them somewhere else, because each lein clean you do will delete them from the lib directory! (eventually I'll get around to automate this process. I also know there's a "lein gae" plugin somewhere, but haven't tried yet, I'm not sure if it does what I want). One last thing about lein, you'll have to remove commons-fileupload-1.2.1.jar from your lib dir, otherwise gae will complain about it (it did, for me!).&lt;br /&gt;
Let's move on, then. my-app.servlet loads some stuff I need for the servlet, generates an HttpServlet class, and imports some classes so that I may load a jetty server and use gae's services (datastore, etc) in interactive mode (read, using SLIME with swank-clojure). Here's the namespace:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/419756.js?file=gistfile1.clj"&gt;&lt;/script&gt;
&lt;br /&gt;
The magic that's left is, after issuing the defroutes and defservice command, the following (thanks to r0man for the tip!):&lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/419761.js?file=gistfile1.clj"&gt;&lt;/script&gt;
&lt;br /&gt;
So here we are, running a webapp that can be deployed to gae (if you have read the linked posts, you'll see that you also need a web.xml and a appengine-web.xml to deploy, and you'll also need to comment out the ring.adapter.jetty from your namespace - gae already has its own application server :). Now by running the local server via (start-server) and not via gae's dev_appserver.sh shell script, you can happily work, on slime, redefine your servlet actions and refresh the browser to see your changes. Yay!&lt;br /&gt;
One problem, though. How do I use google's services? appengine-clj to the rescue, browse the code (see the test-suite for examples, specially on how you can test them locally using macros like appengine-clj.users/with-user-info). I was basically a happy camper until I got to try out user logins. GAE has this method, createLoginURL and createLogoutURL (applied to a UserService and a destination page string), that takes us to a dummy login screen. To be able to use this Service, I wrote the following code (loaded before starting the jetty server!):&lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/419774.js?file=gistfile1.clj"&gt;&lt;/script&gt;
&lt;br /&gt;
But while this compiles perfectly, I noted that the login screen is not loaded, i.e., clicking the login link yields a 404 page. Not good. But it should be loadable, since the dev_server has it. Google's documentation isn't much help here, and I can't seem to find how on earth I access that screen (I need it to try out administration pages!). So feel free to drop a comment if you happen to know the solution for this!&lt;br /&gt;
To conclude, I'm not going to publish my application as a "blank example", as there are already some around. That said, if you have a question about this setup, just ask and I'll be as helpful as I can!
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-997983329167071814?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/997983329167071814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/997983329167071814'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/05/yet-another-clojure-compojure-google.html' title='Yet another Clojure + Compojure + Google App Engine post'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-9200170899372403507</id><published>2010-05-28T14:44:00.001+01:00</published><updated>2010-05-28T14:44:24.232+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>On Clojure error messages, II: ask and ye shall receive</title><content type='html'>&lt;p&gt;I now realize my &lt;a href="http://carpathia.blogspot.com/2010/05/on-clojure-error-messages.html"&gt;previous post&lt;/a&gt; carried some strong emotions, most of them not too good, and I want to humbly apologize for it. Let me state (again) that I'm enjoying working with clojure (for the most part, at least).&lt;/p&gt;
&lt;p&gt;I wrote about the useless (wrong?) error messages, specifically when passing a list instead of a vector (ISeq) as arguments for a defn. After experimenting a bit, I was even more confused: (defn x () 1) complaints about the integer, so does (defn x () [] 1) and (defn x () [1]), clojure just doesn't know how to create an ISeq from that integer. I now understand this makes sense because you can specify multiple arity functions, like this:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;(defn x&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;([] (x 0)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;([x] (+ x 1)))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So in this case, if a vector isn't found where the arguments are expected, clojure complains, as he can't make an ISeq.&lt;/p&gt;
&lt;p&gt;But none of this matters anymore (to the language user). &lt;a href="http://twitter.com/stuarthalloway"&gt;Stuart Halloway&lt;/a&gt; (author of the book that I used to learn about &lt;a href="http://pragprog.com/titles/shcloj/programming-clojure"&gt;Programming Clojure&lt;/a&gt;, which by the way I advise you to read, if you haven't already) was almost to fast picking up this issue! I have just received his &lt;a href="http://twitter.com/stuarthalloway/status/14902284771"&gt;tweet&lt;/a&gt; with a &lt;a href="http://github.com/richhickey/clojure/commit/d694d6d45fb46195ae4de01aab9a2b9f9c06355f"&gt;fix&lt;/a&gt; to this problem: clojure (the snapshot version) now detects if the arguments are a proper vector, and if not warns us with a much clearer message: "Parameter declaration arg1 should be a vector". This should satisfy all with the same issue I tackled on the previous post; more advanced users dealing with multiple arity defns should already be aware of the syntax, so it's safe for both cases.&lt;/p&gt;
&lt;p&gt;This was a positive outcome in more than one way. Not only clojure got a bit better, but I got reminded of how I should had followed a much nicer "netiquette". I made a public complaint, and Stuart was impeccable to pick it up, hacking a fix and letting me know about it (everyone should learn from him, including myself!). But instead of posting my complaint (again, sorry if my tone was to harsh), I should had (1) ask on a &lt;a href="http://groups.google.com/group/clojure"&gt;discussion list&lt;/a&gt; or on other social platform about this; (2) take a look into the &lt;a href="http://github.com/richhickey/clojure/"&gt;source code&lt;/a&gt;, see where the issue could be fixed, write a patch, and submit it to approval to the developers - alternatively, take the oportunity to learn how to do those things, and at least let the maintainers know about it, so a bug report is issued. This is the organization that most projects require to evolve properly.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-9200170899372403507?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/9200170899372403507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/9200170899372403507'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/05/on-clojure-error-messages-ii-ask-and-ye.html' title='On Clojure error messages, II: ask and ye shall receive'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6146635673722900504</id><published>2010-05-27T12:51:00.001+01:00</published><updated>2010-05-27T12:51:22.154+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>On Clojure error messages.</title><content type='html'>&lt;p&gt;I know. I'm late to this train. And there are lots of resources to clarify this. But I have to manifest myself somewhere (and &lt;a href="http://twitter.com/edgargoncalves"&gt;twitter&lt;/a&gt;'s char limit won't do this time).&lt;/p&gt;
&lt;p&gt;Here's the deal. I know I've written a fair share of &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; lines of code. But I come from the land of the ancient parenthesis (specifically, Scheme, Common Lisp). So whenever I try to teach clojure to someone, it's inevitable to tell them that it's a Lisp, so it's ok to see those rounded delimiters everywhere.&lt;/p&gt;
&lt;p&gt;This is where I start by asking them to define a simple function, and instead of defun/define, use defn. Something like this will do:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;(defn xpto ()&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;(+ 2 3))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Simple enough, right? Wrong. (I know it's wrong, now, off course). But for the beginner, the first thing to do is to read the error message. So let's take a look:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Don't know how to create ISeq from: clojure.lang.Symbol&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;[Thrown class java.lang.IllegalArgumentException]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeeeah, isn't that obvious? Clojure wants to make a sequence and I'm trying to use a symb... wait, what?? the only symbol I know I'm using is xpto, and that's about right on the syntax! The Java exception isn't much help either. What argument? The ones I'm not using on the functions (but weren't those parameters?) Or the ones I'm using on the function call (but 2 and 3 are numbers, not strings!! *help*!) Ok, breath. let's take a look into the stack trace, it is usually helpful on java, at least to trace where the error is:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Backtrace:&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;0: clojure.lang.RT.seqFrom(RT.java:469)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;1: clojure.lang.RT.seq(RT.java:450)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;2: clojure.lang.RT.first(RT.java:538)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;3: clojure.core$first.invoke(core.clj:53)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;4: clojure.core$sigs$asig__3331.invoke(core.clj:202)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;5: clojure.core$sigs.invoke(core.clj:214)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;6: clojure.core$defn.doInvoke(core.clj:268)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;7: clojure.lang.RestFn.invoke(RestFn.java:495)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;8: clojure.lang.Var.invoke(Var.java:381)&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&amp;nbsp;9: clojure.lang.AFn.applyToHelper(AFn.java:180)&lt;/p&gt;

  &lt;p&gt;10: clojure.lang.Var.applyTo(Var.java:482)&lt;/p&gt;

  &lt;p&gt;11: clojure.lang.Compiler.macroexpand1(Compiler.java:5215)&lt;/p&gt;

  &lt;p&gt;12: clojure.lang.Compiler.macroexpand(Compiler.java:5270)&lt;/p&gt;

  &lt;p&gt;13: clojure.lang.Compiler.eval(Compiler.java:5338)&lt;/p&gt;

  &lt;p&gt;14: clojure.lang.Compiler.eval(Compiler.java:5320)&lt;/p&gt;

  &lt;p&gt;15: clojure.core$eval.invoke(core.clj:2366)&lt;/p&gt;

  &lt;p&gt;16: swank.commands.basic$eval_region.invoke(basic.clj:47)&lt;/p&gt;

  &lt;p&gt;17: swank.commands.basic$eval_region.invoke(basic.clj:37)&lt;/p&gt;

  &lt;p&gt;18: swank.commands.basic$eval801$interactive_eval__802.invoke(basic.clj:66)&lt;/p&gt;

  &lt;p&gt;19: clojure.lang.Var.invoke(Var.java:365)&lt;/p&gt;

  &lt;p&gt;20: myproject.core$eval3896.invoke(NO_SOURCE_FILE)&lt;/p&gt;

  &lt;p&gt;21: clojure.lang.Compiler.eval(Compiler.java:5353)&lt;/p&gt;

  &lt;p&gt;22: clojure.lang.Compiler.eval(Compiler.java:5320)&lt;/p&gt;

  &lt;p&gt;23: clojure.core$eval.invoke(core.clj:2366)&lt;/p&gt;

  &lt;p&gt;24: swank.core$eval_in_emacs_package.invoke(core.clj:94)&lt;/p&gt;

  &lt;p&gt;25: swank.core$eval_for_emacs.invoke(core.clj:241)&lt;/p&gt;

  &lt;p&gt;26: clojure.lang.Var.invoke(Var.java:373)&lt;/p&gt;

  &lt;p&gt;27: clojure.lang.AFn.applyToHelper(AFn.java:169)&lt;/p&gt;

  &lt;p&gt;28: clojure.lang.Var.applyTo(Var.java:482)&lt;/p&gt;

  &lt;p&gt;29: clojure.core$apply.invoke(core.clj:536)&lt;/p&gt;

  &lt;p&gt;30: swank.core$eval_from_control.invoke(core.clj:101)&lt;/p&gt;

  &lt;p&gt;31: swank.core$spawn_worker_thread$fn__453$fn__454.invoke(core.clj:300)&lt;/p&gt;

  &lt;p&gt;32: clojure.lang.AFn.applyToHelper(AFn.java:159)&lt;/p&gt;

  &lt;p&gt;33: clojure.lang.AFn.applyTo(AFn.java:151)&lt;/p&gt;

  &lt;p&gt;34: clojure.core$apply.invoke(core.clj:536)&lt;/p&gt;

  &lt;p&gt;35: swank.core$spawn_worker_thread$fn__453.doInvoke(core.clj:296)&lt;/p&gt;

  &lt;p&gt;36: clojure.lang.RestFn.invoke(RestFn.java:398)&lt;/p&gt;

  &lt;p&gt;37: clojure.lang.AFn.run(AFn.java:24)&lt;/p&gt;

  &lt;p&gt;38: java.lang.Thread.run(Thread.java:637)&lt;/p&gt;&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read it all? Want your 3 minutes back? (ok, 30 if you actually went looking for &lt;a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/defn"&gt;documentation on the API&lt;/a&gt;, the source of Compiler, core.clj or worse if you went looking for slime's or Thread :) ). Sick, isn't it? not a single line is useful for our cause.&lt;/p&gt;
&lt;p&gt;I'm afraid I have no good news for you, except to tell you what the problem was and hope you'll never forget that. I know I didn't. (until I swapped to a bunch of different programming languages, including common lisp, for a while, and returned with my auto-pilot coding style turned on :) ).&lt;/p&gt;
&lt;p&gt;The problem is that clojure expects a sequence of parameters, not a list. And thus, the proper syntax is to use [] instead of (). I know, a list is not a symbol. Or so I thought... I could even go theorize about () being translated to nil in compile time, and so it was a symbol. But evaluating (symbol? nil) quickly clarifies that for us...&lt;/p&gt;
&lt;p&gt;Pledge - please, oh please start adding useful semantic to clojure's core language errors... The language entry barrier will lower significantly, I'm sure!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6146635673722900504?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6146635673722900504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6146635673722900504'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2010/05/on-clojure-error-messages.html' title='On Clojure error messages.'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6250333856303132007</id><published>2009-08-20T12:35:00.001+01:00</published><updated>2009-08-20T12:39:16.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Aperture: scripting takes you where automator doesn't</title><content type='html'>&lt;p&gt;Like some unfortunate people, I've suffered from data loss. Mainly by distraction and a trigger-happy finger on the delete key. So I've embraced backup strategies, and my last acquisition was a &lt;a href="http://www.wdc.com/en/products/products.asp?driveid=586"&gt;Western Digital MyBook World Edition&lt;/a&gt; with 1TB hard disk inside. I keep it connected to my router, so it's always available from a wireless laptop in the house. I'm happy and comfortable with the setup, so the next step is, no surprise, figure out what I'm going to put there. And, most importantly, how I'm going to do that.&lt;/p&gt;&lt;img src="http://consumeroo.com/uploads/aperture-icon.png" width="71" height="71" alt="94FBE960-6C44-4B8C-A854-26859D14C22D.jpeg" style="float:right; margin-left:10px;" /&gt;
&lt;p&gt;My first use case was my photography collection. I've recently started using Apple's &lt;a href="http://www.apple.com/aperture/" title="Aperture"&gt;Aperture&lt;/a&gt; to handle my pretty basic photography sets. I don't own a SLR, yet, but I have a &lt;a href="http://www.canon-europe.com/For_Home/Product_Finder/Cameras/Digital_Camera/PowerShot/PowerShot_S50/"&gt;Canon Powershot S50&lt;/a&gt;, which allows to manually configure the machine to take some interesting photos. And it shoots RAWs (albeit in a Canon proprietary CRW format, that can be batch-translated to &lt;a href="http://www.adobe.com/products/dng/"&gt;DNG&lt;/a&gt; using the freeware &lt;a href="http://www.adobe.com/support/downloads/detail.jsp?ftpID=4519"&gt;converter&lt;/a&gt; from Adobe). So after my photo workflow I end up with an hierarchy with folders (for project types like "Trips and Events", "Experimentations", "Personal", "Work", etc), inside which i have projects.&lt;/p&gt;&lt;img src="http://www.macsparky.com/wp-content/uploads/2007/11/automator-icon.png" width="210" height="210" alt="automator-icon.png" style="float:right; margin-left:10px;" /&gt;
&lt;p&gt;What I wanted to achieve was a threefold backup: Save the project itself (so that i may open it in other aperture libraries, both on my macbook pro and my desktop mac); Save the masters, raw files; Save the versions, in JPEG. I figured I'd try Apple's little &lt;a href="http://en.wikipedia.org/wiki/Marvin_the_Paranoid_Android"&gt;Marvin&lt;/a&gt;, the &lt;a href="http://developer.apple.com/macosx/automator.html"&gt;Automator&lt;/a&gt;, to help me easily do it. I got excited to see that there were some export actions available for use in workflows! That, however, proved to be insufficient, as there is no action to get the currently selected project. This was the first applescript i used on the workflow, to get just that, and place in a variable to pass on later. The code looks something like this:&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 83.2px; text-indent: -83.2px; font: 12.0px Verdana"&gt;&lt;span style="color: #2900ff"&gt;&lt;b&gt;tell&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;application&lt;/span&gt; "Aperture"&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #0000ff"&gt;activate&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #4c4e4e"&gt;&lt;span style="color: #000000"&gt;--&lt;/span&gt; identify currently selected image(s) project&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #0000ff"&gt;&lt;span style="color: #2900ff"&gt;&lt;b&gt;set&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #408000"&gt;x&lt;/span&gt; &lt;span style="color: #2900ff"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt; selection&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana"&gt;&lt;span style="color: #2900ff"&gt;&lt;b&gt;set&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #408000"&gt;x&lt;/span&gt; &lt;span style="color: #2900ff"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;item&lt;/span&gt; 1 &lt;span style="color: #2900ff"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #408000"&gt;x&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #0000ff"&gt;&lt;span style="color: #2900ff"&gt;&lt;b&gt;tell&lt;/b&gt;&lt;/span&gt; library &lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 166.5px; text-indent: -166.5px; font: 12.0px Verdana"&gt;&lt;span style="color: #2900ff"&gt;&lt;b&gt;set&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #408000"&gt;ap_proj&lt;/span&gt; &lt;span style="color: #2900ff"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt; (&lt;span style="color: #2900ff"&gt;&lt;b&gt;get&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; &lt;span style="color: #2900ff"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;other tag&lt;/span&gt; "MasterProject" &lt;span style="color: #2900ff"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt; &lt;span style="color: #408000"&gt;x&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #2900ff"&gt;&lt;b&gt;end&lt;/b&gt; &lt;b&gt;tell&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #2900ff"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;b&gt;end&lt;/b&gt; &lt;b&gt;tell&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 124.8px; text-indent: -124.9px; font: 12.0px Verdana; color: #2900ff"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;I was pleased with the result, as the MasterProject tag on the currently selected image would tell us the project id, not its name (like we would get if we selected from the entire project list on aperture). But then i found out two drawbacks:There's no way to export a project bundle directly via an action. There's also no way to get the project name to pass as input to the export versions/masters actions, as they require a list of images. So after a visit to the Aperture dictionary on Script Editor (just open the application with it, and browse around), i found out i could export a project bundle via applescript (great), and produce a list of the images in it (also great). But not everything is that easy, as I found out that not only the Export actions don't like to accept input from a "run applescript" action (they require a variable to be set and then got, for them to receive data flow), but when the script is saved (or exported to a plugin), the flow is broken and the export actions cease to work!&lt;br /&gt;
&lt;br /&gt;
I ended up giving up the entire workflow, and scripted the whole thing. I only kept the automator workflow file so that i could easily add stuff like growl warnings. You can download it from &lt;a href="http://dl.getdropbox.com/u/103378/projects/Workflows/Export%20Current%20Aperture%20Project" title="Export Aperture Project"&gt;here&lt;/a&gt; and give it a try. Oh, and if you know an easy way to find out the folder a project is in, to put the bundle in that directory, please, leave a comment or tweet &lt;a href="http://twitter.com/edgargoncalves" title="edgargoncalves"&gt;me&lt;/a&gt;!&lt;br /&gt;
With this script (with a small adaptation) it's also easy for me to loop through all projects and perform a complete backup of the library. This sure beats the workflow-actions way, as there's no amount of variables and loops that can make you run through a list of projects. For these reasons, I believe Automator needs a 3.0 update. Maybe Marvin could take some anti-depressives, and leave the paranoia behind? :)

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6250333856303132007?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6250333856303132007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6250333856303132007'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/08/aperture-scripting-takes-you-where.html' title='Aperture: scripting takes you where automator doesn&amp;#39;t'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4242798852418490975</id><published>2009-06-15T01:30:00.001+01:00</published><updated>2009-06-15T01:35:32.830+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><category scheme='http://www.blogger.com/atom/ns#' term='ubiquity'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Mouse-driven love to buyers on Firefox</title><content type='html'>&lt;p&gt;&lt;br /&gt;
&lt;img src="http://www-archive.mozilla.org/party/1999/mozilla2.gif" alt="Mozilla" style="float:left; margin-right:10px;" width="199" height="199" /&gt;&lt;/p&gt;
&lt;p&gt;A while ago I was amazed by the truly great work that the &lt;a href="https://wiki.mozilla.org/Labs"&gt;Mozilla Labs&lt;/a&gt; &lt;a href="https://wiki.mozilla.org/Labs#Team"&gt;team&lt;/a&gt; did on their project &lt;a href="http://labs.mozilla.com/projects/ubiquity/"&gt;Ubiquity&lt;/a&gt;. If I ever thought about a web-based operating system, this all-in-one launcher is anything I'd ever need: fast, useful and easy to extend. Right now the development is going towards a better integration with the "normal" browser usage, melting it's UI with the amazing toolbar.&lt;/p&gt;
&lt;p&gt;There are, however, a huge piece of the user pie that aren't that fond of writing, or using the keyboard, unless absolutely required. I've heard about some prototypes with a mouse-driven ubiquity, but as far as I know that idea never took off. There's still time, though, and all these firefox extra-functionality are pretty much in early development stages.&lt;/p&gt;
&lt;p&gt;So it was half surprised and half amazed that I watched as two of the master-minds behind Ubiquity (&lt;a href="http://www.azarask.in/blog/"&gt;Aza Raskin&lt;/a&gt; and &lt;a href="http://www.toolness.com/wp/"&gt;Atul Varna&lt;/a&gt;) releasing another revolutionary project from their labs: &lt;a href="https://jetpack.mozillalabs.com/"&gt;Mozilla Jetpacks&lt;/a&gt;. Jetpacks are a way to extend the browser by using a set of Javascript instructions. The main motivation is that up until now we had to grasp the &lt;a href="https://developer.mozilla.org/En/XUL"&gt;XUL&lt;/a&gt; doctrine just to make a popup message greeting the user, and it's easily seen that the amount of Web developers that already tamed some Javascript is growing by the minute.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;img name="Jetpack.png" height="233" width="486" src="http://gallery.techarena.in/data/516/Jetpack.png" style="" id="Jetpack.png" /&gt;&lt;/p&gt;
&lt;p&gt;Wait a bit, I was babbling something about mouse-lovers getting some attention, and I was just getting carried away... That's true: Jetpacks architecture allows certain Javascript objects/functions to interact with certain browser features (statusbar, menus, making HTTP requests, etc.) One of the newcomers into the recent feature-list on its &lt;a href="https://jetpack.mozillalabs.com/api.html"&gt;API&lt;/a&gt; is called the Slidebar. It's just like a Firefox sidebar, but it stays hidden unless we hover on a small arrow on the top-left corner - then it slides and shows us icons for each slidebar jetpack we have installed. The first slidebar I've seen was the Wikipedia, allowing users to select some text, click on the Wikipedia icon, and see the mobile Wikipedia page for the selection on the slidebar. Pretty sleek - specially if you don't want to fire up Ubiquity, type "wi" and watch the preview window assuming the "wikipedia it" completion and showing up the results inline. And I know there's people like that :)&lt;/p&gt;
&lt;p&gt;I quickly thought to myself that most reference websites would be much easier to access there (as opposed to, e.g., the search-bar, where I find it clumsy to switch between search-engines). But I've also thought it would bring some advantage to Ubiquity in one simple aspect: user input. We're confined to a single sentence on Ubiquity. And despite being oh-so-cool to parse natural language and extract the right meaning out of it (because it is!), some things take more than one sentence to say clearly, and there's no way around it.&lt;/p&gt;&lt;img name="moneybag_large.png" height="100" width="100" src="http://0.static.getsatisfaction.com/uploaded_images/0246/6227/moneybag_large.png" style="margin-right: 6px; float: left;" id="moneybag_large.png" /&gt;
&lt;p&gt;I thought about the &lt;a href="http://gist.github.com/66959"&gt;command&lt;/a&gt; I've made for Ubiquity to add financial transactions to &lt;a href="https://www.buxfer.com/"&gt;Buxfer&lt;/a&gt;. The syntax I accept on it is "BUXFER-SPEND &amp;lt;amount&amp;gt; in &amp;lt;description&amp;gt;", where &amp;lt;description&amp;gt; may be a set of words with arbitrary length. My problem with this is twofold. First, it's not easy to extend this with other parameters (like the date of the transaction, its tag(s) ...). Then, a technical issue makes the command keep presenting one completion suggestion per word on the description. (it has to do with not being the direct complement, i think. And doing a manual parser is *not* fun to developer on a sunny afternoon!) And that just sucks...&lt;/p&gt;
&lt;p&gt;So my idea was to take advantage of a slidebar to show a form, already filled with the selected text on the browser. The form has the focus on an amount text field, and a submit button (extra fields are easy to add later. Just ask me if you need any particular data to be posted, and I'll look at it). I picked up my ubiquity command &lt;a href="http://gist.github.com/66959"&gt;code&lt;/a&gt; out of my &lt;a href="http://sites.google.com/site/edgargoncalves/work/software/ubiquity"&gt;shelf&lt;/a&gt;, and used most of it to connect to Buxfer (using its API). Besides the command itself, I had to use a different message display mechanism. I was thinking about giving Yip a try, but it turns out the notification system on Jetpack is perfect as it is - Growl and toaster goodness for everyone (don't know about linux, feel free to show me screenshots with their standards notifications!). Sorry Abi, I'll keep Yip to use on web apps, for now :)&lt;/p&gt;&lt;img src="http://www.darioferrer.com/archivos/articulos/2009/02/jquery-logo.jpg" width="72" height="72" alt="jquery-logo.jpg" style="float:left; margin-right:10px;" /&gt;
&lt;p&gt;One thing that slowed me down a bit was to find out the Utils object we have on Ubiquity is not on the Jetpack API. But that's pretty much ok, since we have the &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; framework at our disposal. This way, instead of using the JSON decoding mechanism i used on Ubiquity, I used the jQuery &lt;a href="http://docs.jquery.com/Ajax/jQuery.ajax#options"&gt;ajax()&lt;/a&gt; and &lt;a href="http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback"&gt;getJSON()&lt;/a&gt; functions to return native objects instead of JSON strings. And all is good in the world!&lt;/p&gt;
&lt;p&gt;Some conclusions out of this fun experiment - great frameworks allow doing great features easily and, more importantly, they allow to have fun when programming them.Just the &lt;a href="https://bespin.mozilla.com/"&gt;Bespin&lt;/a&gt; being there for anyone to give it a quick &lt;a href="https://jetpack.mozillalabs.com/tutorial.html"&gt;test-drive&lt;/a&gt; is enough to capture youngster's attention (I just keep trailing back the text to my &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; buffer using the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4125"&gt;It's All Text!&lt;/a&gt; addon). So I give 10/10 to the Jetpack/Ubiquity efforts (taking into account their early state of development, obviously). Also, I ask those projects developers to unify their support as much as they can. Ultimately, I think an Ubiquity command should be one of the ways a Jetpack could extend the browser!&lt;/p&gt;
&lt;p&gt;Without further ado, you can find my command, Buxfer Jetpack &lt;a href="http://files.getdropbox.com/u/103378/projects/buxferjetpack/buxferjetpack.html" title="Buxfer Jetpack"&gt;here&lt;/a&gt;. It should "just work" if you have &lt;a href="http://www.mozilla.com/en-US/firefox/firefox.html"&gt;Firefox&lt;/a&gt; with Jetpack installed. If you run into any issues, tell me, so that I may learn what they are and how to fix them. And prevent their repetition!&lt;/p&gt;
&lt;p&gt;It's running late, but it has sure been fun to do this. The best part? I may be using this jetpack myself, complementing ubiquity's command. And that makes me being feeding myself with my own dog food.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4242798852418490975?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4242798852418490975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4242798852418490975'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/06/mouse-driven-love-to-buyers-on-firefox.html' title='Mouse-driven love to buyers on Firefox'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4844290790679636123</id><published>2009-06-01T21:10:00.001+01:00</published><updated>2009-06-02T11:11:43.248+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>ELS 2009 - my impressions</title><content type='html'>&lt;p&gt;I've finally got to attend an international Lisp meeting — one more item crossed off the checklist!&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://bimib.disco.unimib.it/elswiki/index.php/Home"&gt;European Lisp Symposium 2009&lt;/a&gt; was held in Milan, Italy, during the 27-29 of May. The program featured some interesting presentations, and while I'm not going to go a complete overview of them all, in this post I'll go over the bits that got into my head the most. This means, don't be offended or ignored if your work (or the work you were expecting to read about) isn't mentioned here. It probably means my mindset isn't properly configured, yet :)
&lt;/p&gt;
&lt;p&gt;The first day of the conference was just the reception, where I got to meet great people. Among the entire conference I got to meet people I've already read about in the web-o-sphere such as Stellian Ioanescu, Scott McKay, Mark Tarver, Nikodemus Siivola, Pascal Constanza and Christopher Rhodes. I also got to know some nice people I didn't know, including Didier Verna, Jim Newton, Claus Brod and Edward Dogde. António Leitão, my PhD supervisor and program commitee chair, introduced me to Mark Feeley, from Termite and &lt;a href="http://dynamo.iro.umontreal.ca/%7Egambit/wiki/index.php/Main_Page"&gt;Gambit Scheme&lt;/a&gt;, who told me about a Gambit package, &lt;a href="http://dynamo.iro.umontreal.ca/%7Egambit/wiki/index.php/Dumping_Grounds"&gt;JSS&lt;/a&gt; (a multithreaded javascript compiler), which I must try when I get back home. Most of all, despite some ideological divergences between some of the participants, the mood was quite pleasant, and joyful. After all, Lisp is supposed to bring happiness to those who use it.&lt;/p&gt;
&lt;p&gt;The second day started with a Scott McKay talk on his life's experiences, and mistakes. He has grown a pretty strong aversion to incremental code fixes to correct fundamental problems. Pretty much all he's done made him believe that full rewrites gives us the opportunity to think better about the design, and that we cannot try to simplify the code by extending it. He is also concerned about the current "big thing": concurrency. May languages are addressing it, and Common Lisp is getting behind each day that passes. &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; tackled it, but it carries the known set of burdens. Scott recognizes the great one-man effort, but wonders if it's easier to improve Clojure or to design a new Lisp and get it right from design. This could rapidly solve, for instance, the namespaces Common Lisp problem (instead of having symbols, packages, labels, macros, symbol-macros, etc, etc (Pascal counted 9 different namespaces), we could have one single namespace). The same goes to the type system, *everything* should inherit from the same root object type.&lt;/p&gt;
&lt;p&gt;Mark Tarver gets an almost similar position, but he "strayed away" from Common Lisp, and went looking for answers on both Scheme and Python. Because he couldn't find them, he designed &lt;a href="http://en.wikipedia.org/wiki/Qi_%28programming_language%29"&gt;Qi&lt;/a&gt;, a language that is supposed to offer what he believes to be the best language features.&lt;/p&gt;
&lt;p&gt;I found the presentation on hygienic macros for the unhygienic world quite motivating. By using a few helper macros, Pascal Constanza demoed how we can emulate the former on Common Lisp, which is quite useful, specially if you come from the Scheme world. All at the expense of a few extra language constructs, but not too distracting ones.&lt;/p&gt;
&lt;p&gt;Charlotte Herzeel presented an interesting approach to implement Software Transactional Memory (STM): she implemented a (limited, not feature-complete) Scheme interpreted within Common Lisp. Doing this allowed her to have access each memory access point easily (she only has to address cell and vectors accesses. The thing is, by having her interpreter, she easily tapped to the code segments where data access is done, via reflection. So it becomes easy to experiment with STM algorithms.
&lt;/p&gt;
&lt;p&gt;I found out the industry is not sticking to widespread CL implementations. At least three different companies (mostly related to the CAD/graphics world, but I think it's a coincidence) rely on SKILL, or some adaptation of it. &lt;a href="http://en.wikipedia.org/wiki/Cadence_SKILL"&gt;SKILL&lt;/a&gt; is a small footprint Lisp-like scripting language, and that makes it appealing for many industrial domains. However, it appears to be quite obsolete, undocumented and unsupported. It was nice, though, to see some successful uses of Lisp.&lt;/p&gt;
&lt;p&gt;I was kinda disappointed not to see Kent Pitman, I believe he canceled at the last minute. I was also looking forward to see some &lt;a href="http://ccl.clozure.com/"&gt;Clozure CL&lt;/a&gt; people there, I'd like to hear about what they have in mind about Cocoa and iPhone development. They already have a great Objective C bridge, but as a Common Lisp, things are entitled to be much easier, specially in order to produce competitive small products (there's a big niche for small simple applications on MacOS, due to Apple's design principles)&lt;/p&gt;
&lt;p&gt;Marco Antoniotti was a great host on Milan. He organized a great banquet at &lt;em&gt;&lt;a href="http://www.osteriadeltreno.it/"&gt;Osteria del Treno&lt;/a&gt;&lt;span style="font-style: normal;"&gt;, where we all got to share some more insightful comments about the entire conference and more. The day after that, Marco wore the cicerone cap and took everyone that was still in Milan for a great &lt;em&gt;&lt;a href="http://www.futurismo.milano.it/"&gt;Futurismo Exhibit&lt;/a&gt;&lt;/em&gt;, where we got to learn some amazing bits of the Italian cultural inheritance (definitely not my area of expertise, but it was quite interesting to try to interpret some works and sell my ideas to the guide, despite failing most of the times :) ). That afternoon we visited the&lt;/span&gt; Duomo&lt;span style="font-style: normal;"&gt;, a massive cathedral on the center of Milan. The most impressive thing for me was to realize the wow-factor was even greater from inside of it (on it's roofs), than from the outside!&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All in all, it was a memorable experience, everything went great (i wasn't even bugged with the wireless access difficulties that so many people were forced to have, since i had the eduroam credentials already set up on my machine!). Next year it'll be in Lisbon, so I'll be attending to. Meanwhile, I'll look forward to go to Italy again on July for the &lt;a href="http://elw2009.bknr.net/home"&gt;6th European Lisp Workshop&lt;/a&gt; (within ECOOP).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4844290790679636123?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/4844290790679636123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=4844290790679636123' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4844290790679636123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4844290790679636123'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/06/els-2009-my-impressions.html' title='ELS 2009 - my impressions'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1853770917474801197</id><published>2009-03-05T22:34:00.000Z</published><updated>2009-03-05T22:35:16.022Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubiquity'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>Ubiquity in Portugal's Portuguese</title><content type='html'>&lt;p&gt;I've been keeping up with some of the stirring around &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity/" title="Ubiquity"&gt;Ubiquity&lt;/a&gt; development, and one aspect that caught my attention was the adaptation of that amazing interpreter to multiple languages. I've commented &lt;a href="http://www.azarask.in/blog/post/scaling-ubiquity-to-60-languages-we-need-your-help/"&gt;before&lt;/a&gt; on &lt;a href="http://www.azarask.in"&gt;Aza Raskin&lt;/a&gt;'s blog about the implications of using Ubiquity in native portuguese. Mozilla's &lt;a href="http://mitcho.com/"&gt;Mitcho Erlewine&lt;/a&gt; and &lt;a href="http://felipe.wordpress.com/about/"&gt;Felipe Gomes&lt;/a&gt; have brought up the &lt;a href="http://felipe.wordpress.com/2009/03/03/thinking-ubiquity-in-portuguese/"&gt;issue&lt;/a&gt; &lt;a href="http://mitcho.com/blog/link/ubiquity-in-portuguese/"&gt;again&lt;/a&gt;. This time things appear to be moving on in Mozilla Labs for Portuguese language in Ubiquity, which is great! But please, hear me out first for a few small — but relevant — points that need to be considered. In the remainder of this post I'd like to clear them out. Note that these will be personal opinions, and I'm not a linguistics expert, only an interested software engineer.&lt;/p&gt;
&lt;p&gt;Felipe's entire post is clear and understandable. But his ideas work for the &lt;a href="http://en.wikipedia.org/wiki/Brazilian_Portuguese"&gt;Brazilian&lt;/a&gt; variant of the &lt;a href="http://en.wikipedia.org/wiki/Portuguese_language"&gt;Portuguese&lt;/a&gt; language. Being a native Portuguese (and while not having any kind of grudge against non-native Portuguese), it's somehow odd (even repulsive, pardon me!) to read some of the Brazilian syntax — it's just looks badly written. One simple example is the "gimme a map" command, that Felipe translates to Brazilian as "me dê um mapa", and native Portuguese would translate it as "dê-me um mapa". But this simple example presents other cultural divergences, like the friendly/respectful tone. The English expression "give me" can be translated into "dá-me" or "dê-me" (friendly/respectful, in that order). And the same goes to the command verb "map", that would be translated into "mapeie/mapeia".&lt;/p&gt;
&lt;p&gt;Felipe's offers the great suggestion of detecting the word's root, e.g., "map" in "mapeie". And this will work for almost every verb. Except some crucial ones, that are irregular! (I honestly hate grammar irregularities...). Take the verb "to go" (e.g., can be used in a command to go to a specific page/tab/section/&amp;lt;somethingelse&amp;gt;). So one could say "go to gmail". In native portuguese, Felipe's suggestion fails in that the same verb translates into "ir", and is used in a commands such as "vai para o gmail", or "vá para o gmail". Note that not only these commands cannot be easily traced into their infinitive form ("ir"), but both possible tones are different (the accented "a" in "vá" is very much relevant).&lt;/p&gt;
&lt;p&gt;I'm really sorry to be a spoil-sports, but this is won't work so simply. Obviously, the set of irregular verbs are finite, and we could add the correct usages to a syntactic rules table. I expect the final code to be optimizable into a feasible speed of interpretation. But I'm not so sure that this rules can be, as Mitcho so desires, reduced to a common denominator to all languages (again, don't get me wrong, I'd love that to be possible, I just don't have a useful knowledge-base of other languages to believe that to be feasible).&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;And this is why I'm so fond of using some webapps' names as commands, even in portuguese. "twitter &amp;lt;message&amp;gt;", "google &amp;lt;query&amp;gt;" or "wikipedia &amp;lt;expression&amp;gt;" will be understood perfectly in Portugal (and Brazil, for that matter). I know, Ubiquity's future is about natural language interpretation, whatever idiom you may prefer. And that's really something special. But I can't stop but to feel that every language is either going to require a complex interpreter suited for itself, or suffer from aggravated &lt;a href="http://en.wikipedia.org/wiki/Syntactic_sugar"&gt;syntactic-sugar&lt;/a&gt; syndrome.&lt;/p&gt;
&lt;p&gt;If any point I've covered can be countered somehow, just consider, in following blog posts/projects/etc to remember to identify what Portuguese idiom are you referring to when you discuss grammar rules. Again, it's not a matter of any kind of discrimination, but one of correctness, and everybody deserves that.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1853770917474801197?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1853770917474801197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1853770917474801197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1853770917474801197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1853770917474801197'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/03/ubiquity-in-portugal-portuguese.html' title='Ubiquity in Portugal&amp;#39;s Portuguese'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6672414465147621995</id><published>2009-01-28T15:44:00.001Z</published><updated>2009-01-28T15:44:37.505Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='PhD'/><title type='text'>Lisp macros, eval and packages</title><content type='html'>&lt;p&gt;Today I spent about an hour trying to find out the source of a bug in the code for my PhD prototype. To make the context short, I need to have a class definition to be stored, and loaded afterwards. And I was using Gary King's time-saver &lt;a href="http://common-lisp.net/project/metatilities/" title="Metatilities"&gt;metatilities:defclass*&lt;/a&gt; to reduce the required coding. The problem was when I wanted to load such a definition in a generic method, I was evaluating the definition expression - one of the acceptable uses of `eval', correct me if I'm wrong, is to interpret something that was just read (in this case, from a serialized string, from other servers). The code in question was something like this:&lt;/p&gt;

&lt;pre&gt;
(&lt;span class="keyword"&gt;defmacro&lt;/span&gt; &lt;span class="function-name"&gt;load-data&lt;/span&gt; (name attributes)
  &lt;span class="doc"&gt;"Defines a domain concept, using metatilities:defclass* syntax."&lt;/span&gt;
  `(&lt;span class="keyword"&gt;progn&lt;/span&gt;
     (metatilities:defclass* ,name (data-item)
       (,@attributes)
       (&lt;span class="builtin"&gt;:metaclass&lt;/span&gt; profiled-metaclass)
       (&lt;span class="builtin"&gt;:name-prefix&lt;/span&gt;  ,(format nil &lt;span class="string"&gt;"~(~A~)"&lt;/span&gt; name)))
     (info &lt;span class="string"&gt;"Data type loaded: ~A"&lt;/span&gt; ',name)))

(&lt;span class="keyword"&gt;defmethod&lt;/span&gt; &lt;span class="function-name"&gt;load-definition&lt;/span&gt; ((def data-item-definition))
  (eval (macroexpand `(load-data ,(definition-name def)
                                                     ,(data-item-definition-attributes def)))))
&lt;/pre&gt;

&lt;p&gt;What I was getting as a result is that the auxiliary methods created as accessors by defclass* weren't being imported in my packaged, but in CL-USER. Hence, lots and lots of compiler warnings and subsequent errors when trying to use those accessors. I fiddled around, tried to see if I could remove the eval, but the solution, so obvious as I know can see, is quite simple. Just place your evaluated expression after setting the package. The fixed method is the following:&lt;/p&gt;

&lt;pre&gt;
(&lt;span class="keyword"&gt;defmethod&lt;/span&gt; &lt;span class="function-name"&gt;load-definition&lt;/span&gt; ((def data-item-definition))
  (eval `(&lt;span class="keyword"&gt;progn&lt;/span&gt; (&lt;span class="keyword"&gt;in-package&lt;/span&gt; &lt;span class="builtin"&gt;:dshow&lt;/span&gt;)
                ,(macroexpand `(load-data ,(definition-name def)
                                          ,(data-item-definition-attributes def))))))
&lt;/pre&gt;

&lt;p&gt;Hope you can see this before spending too much time on a similar bug!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6672414465147621995?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/6672414465147621995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=6672414465147621995' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6672414465147621995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6672414465147621995'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/01/lisp-macros-eval-and-packages.html' title='Lisp macros, eval and packages'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-2937990327617501920</id><published>2009-01-26T19:03:00.001Z</published><updated>2009-01-26T19:07:45.188Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Quick Emacs nicity</title><content type='html'>&lt;p&gt;I can’t remember from whose configuration I got this piece of code. But it makes my lispy screen a little bit cuter, by turning all “(lambda” into the greek character. I tested on aquamacs, and on the Windows GNU Emacs, and it works. If anyone knows the original author of the idea, send him/her my thanks :)&lt;/p&gt;&lt;br /&gt;


&lt;pre&gt;
&lt;span class="comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="comment"&gt;Make lambdas appear as the character &amp;#187; (saves space!!)
&lt;/span&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;pretty-lambdas&lt;/span&gt; ()
  (interactive)
  (font-lock-add-keywords
   nil `((&lt;span class="string"&gt;"(&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="regexp-grouping-backslash"&gt;\\&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="regexp-grouping-construct"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;lambda\\&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="regexp-grouping-backslash"&gt;\\&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="regexp-grouping-construct"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;
          (0 (&lt;span class="keyword"&gt;progn&lt;/span&gt; (compose-region (match-beginning 1) (match-end 1)
                                    ,(make-char 'greek-iso8859-7 107))
                    nil))))))
(add-hook 'lisp-mode-hook 'pretty-lambdas)
(add-hook 'emacs-lisp-mode-hook 'pretty-lambdas)
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-2937990327617501920?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/2937990327617501920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=2937990327617501920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2937990327617501920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2937990327617501920'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/01/quick-emacs-niceity.html' title='Quick Emacs nicity'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-195530218063862740</id><published>2009-01-02T13:26:00.001Z</published><updated>2009-01-02T13:26:44.561Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>On iPhone SDK and its pretty icons on tab bar items</title><content type='html'>&lt;p&gt;After having made some experimentation around the iPhone SDK, I have now a simple - but useful - native application. I focused on the functionality, and up until now, I had a tab-bar with no icons. But that's not the Apple-way to present things. iPhone apps are pretty, and have simple but elegant icons with a gray tone that turn blue when selected. So i looked upon a library/bundle for some of those standard buttons, and found... none! Ok, no worries, let's find out how to make them. Wait. There isn't a specification for them! Yes, it's a shame, but Apple's iPhone SDK documentation is still a bit unfinished. The good news is that what is done, is easy to read and helpful. I ended up looking at other apps resources, found out they were 32x32 png images, and figured they had to have at least an alpha channel outside the image itself. So I fired Gimp, made a plain brush doodle and removed the background white, saved and tested. And it simply works! All colors are turned into the desired gray tone, and automatically swap to a smooth blue with a top glare when selected. Conclusion: the trick is to experiment. Chances are that what you want to do is *that* simple!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-195530218063862740?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/195530218063862740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=195530218063862740' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/195530218063862740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/195530218063862740'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2009/01/on-iphone-sdk-and-its-pretty-icons-on.html' title='On iPhone SDK and its pretty icons on tab bar items'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1471323719646189983</id><published>2008-10-25T22:20:00.000+01:00</published><updated>2008-10-25T22:21:10.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>Milky love for lispers</title><content type='html'>&lt;p&gt;I've just updated my "&lt;a href="http://www.rememberthemilk.com/" title="Remember The Milk"&gt;Remember The Milk&lt;/a&gt;"-talking lisp library. Now you can access their API with a simple CLOS-based object model.&lt;/p&gt;
&lt;p&gt;You can fetch the latest version by direct download, SVN and/or by asdf-install from the project &lt;a href="http://code.google.com/p/rtm-lisp-api/" title="RTM-Lisp-API"&gt;page&lt;/a&gt;, where I have the important updates:&lt;/p&gt;
&lt;p&gt;Recent Changes&lt;/p&gt;
&lt;p&gt;* Added an object bridge to make the API even more integrated with the language.&lt;/p&gt;
&lt;p&gt;* Methods and functions were coded to be easier to manage a local state of the RTM user data.&lt;/p&gt;
&lt;p&gt;Future Work&lt;/p&gt;
&lt;p&gt;* Improve synchronization and bandwidth usage by fetching only recently updated data;&lt;/p&gt;
&lt;p&gt;* Provide offline work for the local data&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1471323719646189983?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1471323719646189983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1471323719646189983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1471323719646189983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1471323719646189983'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/10/milky-love-for-lispers.html' title='Milky love for lispers'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1734091093867562423</id><published>2008-10-12T14:27:00.001+01:00</published><updated>2008-10-12T14:27:45.272+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>Having a cow aiding getting your things done</title><content type='html'>I have finally stopped to upgrade my &lt;a href="http://www.rememberthemilk.com/" title="Remember The Milk"&gt;Remember the Milk&lt;/a&gt; (RTM) usage to something more GTD-ish (for David Allen’s “Getting Things Done” approach). I already knew about RTM’s organizing abilities. Succinctly, we can have tasks in our inbox, in lists (hard to move from, usability-wise), and have them assigned one or more tags, easily exchangeable and searchable. What I was looking for was a way to have my tasks split into contexts (like calls to make, errands to do, things to do at the computer, things to see, read or listen). Also, I need to see what I can do next, what I have to do someday, and things I must hold on pending, waiting for something/someone. With these two axis for plotting my tasks, I can add stuff to RTM as they come up in my life (via many different ways like their website, Twitter, quicksilver, a Dashboard widget, iPhone...), and they will get placed into Inbox. At the start of the morning, I have to process that list, placing tasks into a proper context List (I prefix those with a @, to visually identify them at a glance). I also tag each task with a “next”, “someday” and “waiting” tag. The final visual output is clean enough for me to feel organized:

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3223/2934551618_5c2c65efc9_o.png" width="600" height="248" alt="GTD-RTM.png" /&gt;&lt;br /&gt;
Let’s get the webpage hacks discussed first. It’s simple enough, but important for me. The default tag strip wouldn’t do it for me. So I got this amazing Greasemonkey script, called &lt;a href="http://userscripts.org/scripts/show/32518"&gt;A Bit Better RTM&lt;/a&gt;. Three simple features that make all the difference!&lt;/p&gt;Step one, projects. I followed many advices at the RTM forum, and created a list called Projects, where I place project titles (prefixed by a dot, for visual identification), and tag them with a “p-PROJECTNAME” tag. This way, I can easily click that tag and access all tasks (from one or more contexts). It’s really handy.

&lt;p&gt;Step two, smart lists. These are simply saved searches, and we have a decent set of &lt;a href="http://www.rememberthemilk.com/help/answers/search/advanced.rtm"&gt;search operators&lt;/a&gt; to use. Here’s some I have installed:&lt;br /&gt;
• &lt;strong&gt;-&amp;gt;Next:&lt;/strong&gt; (tag:next AND NOT dueAfter:"1 week of today") OR dueBefore:"1 week of today"&lt;br /&gt;
• &lt;strong&gt;-&amp;gt;Someday:&lt;/strong&gt; tag:someday&lt;br /&gt;
• &lt;strong&gt;-&amp;gt;Waiting:&lt;/strong&gt; tag:waiting&lt;br /&gt;
• &lt;strong&gt;-&amp;gt;Tickler:&lt;/strong&gt; NOT due:never&lt;br /&gt;
• &lt;strong&gt;PhD:&lt;/strong&gt; tag:PhD OR tagContains:phd&lt;br /&gt;
• &lt;strong&gt;Fun&lt;/strong&gt;: tag:entertainment OR tag:game OR tag:movie OR tag:night&lt;br /&gt;
• &lt;strong&gt;unTagged:&lt;/strong&gt; isTagged:false OR (NOT (tagContains:"next" OR tagContains:"someday" OR tagContains:"waiting"))&lt;/p&gt;
&lt;p&gt;Tickler is a must see every day, to keep myself from forgetting due tasks. Phd looks for tags like p-phd-thesis, thus looking for all projects related to my Ph.D.. unTagged is a reminder tool. It often happens that I move a task from inbox into a given list, and forget to tag it (all tasks should have a next/someday/waiting tag on it).&lt;/p&gt;
&lt;p&gt;Don’t forget that tasks can easily be assigned a priority with a 1-4 key press. Also, I have locations set up so that they appear in the task cloud. This way I can look at all the calls I have to make at the office, for instance.&lt;/p&gt;
&lt;p&gt;So with this I feel almost at ease. But I’m kind of a control freak, and I like to add tasks in the easier way I can. After having played with Firefox’s ubiquity to write &lt;a href="http://sites.google.com/site/edgargoncalves/work/software/twixfer" title="Twixfer Homepage"&gt;Twixfer&lt;/a&gt;, I started jotting down a quick way to add a task to RTM. The initial ubiquity command was usable, right until it popped up a new tab with a RTM task properties form. I didn’t need that. But someone felt the same, and spared my the effort. &lt;a href="http://garyhodgson.com/ubiquity/rtm-v2.html"&gt;rtm-v2&lt;/a&gt; is a command set that logs in, and gives proper feedback of your RTM lists and tasks. If you’re into speed task jotting, it’s worth a try.&lt;/p&gt;That’s my rtm tips for today. Do it like me? Have a better system? Drop me a comment!

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1734091093867562423?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1734091093867562423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1734091093867562423' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1734091093867562423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1734091093867562423'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/10/having-cow-aiding-getting-your-things.html' title='Having a cow aiding getting your things done'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-3186474069316645333</id><published>2008-09-07T20:25:00.001+01:00</published><updated>2008-09-09T01:51:18.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>Love Buxfer. Use Twitter. So why not Twixfer?</title><content type='html'>&lt;p&gt;Today I sat down to find out a different use for Javascript. Browsed through my everyday task list, found out a couple of candidates, and targeted &lt;a href="http://www.buxfer.com" title="Buxfer"&gt;Buxfer&lt;/a&gt; transaction creation. I'm also growing fond of &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity/" title="Ubiquity"&gt;Ubiquity&lt;/a&gt;, for the Firefox browser (and is now the most important reason I'm not moving to Google's Chrome, but I digress). This post, despite being about a Buxfer contribution, will be more about the Ubiquity development process I underwent.&lt;/p&gt;
&lt;p&gt;So let me explain what I aimed for. Ubiquity allows to enter text controls, with auto completion in a &lt;span class="caps"&gt;HUD&lt;/span&gt; over the Firefox window. So I wanted to do something similar to what &lt;a href="http://www.brunomlopes.com/" title="Bruno Lopes' Homepage"&gt;Bruno Lopes&lt;/a&gt; did with his &lt;a href="http://www.brunomlopes.com/software/buxfersubmit" title="BuxferSubmit"&gt;BuxferSubmit&lt;/a&gt; Dashboard widget (for Mac &lt;span class="caps"&gt;OSX&lt;/span&gt;) - plain simple addition of a Buxfer transaction, with a description and an amount. All I have to do is (after having Ubiquity installed and running) to setup a Javascript file with a piece of code I'll explain hereafter.&lt;/p&gt;
&lt;p&gt;The heart of a Ubiquity command is defined with the commandfunction CmdUtils.CreateCommand(argument-object). This is, in fact, the only call you have to make in that file to set things up. So what's in an argument literal object? the basic attributes, like the name of the command, it's description or the icon to identify it (quite useful!). But there are a few arguments that deserve special attention&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;execute&lt;/strong&gt;. This must be a function with no arguments that is responsible for doing whatever the command is supposed to do after &amp;lt;return&amp;gt; is pressed.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;preview&lt;/strong&gt;. This is the function that is called at each key press on the Ubiquity &lt;span class="caps"&gt;HUD,&lt;/span&gt; to compute the string that appears to help the user find out what the command is going to do.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;takes&lt;/strong&gt;. A description of the words the command receives, and a type for them. Each type can be specified by hand, but several are already provided, like noun_arb_text for arbitrary text or noun_type_date for a date string.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;modifiers&lt;/strong&gt;. These are words that offer secondary semantics to the command, and are specified just like the “takes” argument elements. Think of examples like “list-birthdays” for today's birthdays and “list-birthdays for next week”. The modifier “for” would be assigned to “next week”, and a special type can be setup to parse the string and compute the date from today.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find examples about how to use the CreateCommand, load the following URI in Firefox: &lt;a href="chrome://ubiquity/content/builtincmds.js"&gt;chrome://ubiquity/content/builtincmds.js&lt;/a&gt; (obviously only after having ubiquity up and running).&lt;/p&gt;
&lt;p&gt;That's about it. What I found out was that the presence of a preview functionality can often be more useful than the execution of the command! Think about a currency conversion, or an algebraic expression calculation. I don't want to perform anything upon a &amp;lt;return&amp;gt;, except perhaps have the result copied to the clipboard. What I really want is to have the result appear in the &lt;span class="caps"&gt;HUD&lt;/span&gt; and change dynamically as I keep filling in the command text.&lt;/p&gt;
&lt;p&gt;Let's move on to the implementation itself. One thing I found out quickly was that the Buxfer's APi needed a username and password to be able to post a transaction. That would be the case in most web applications I know about. But this &lt;span class="caps"&gt;API&lt;/span&gt; doesn't offer, for now, any means to open a page to ask for credentials - nor would I desire that, since I'm typing a textual command to keep the input at a minimum! Ubiquity doesn't have a thorough documentation, yet, and browsing the javascript &lt;span class="caps"&gt;XUL&lt;/span&gt; files within the chrome “filesystem” of a Firefox add-on is not something I like to call user-friendly. Why is this important? I thought the command could take a peek into the Firefox's secured passwords and use the Buxfer, without the user having to care a bit about it. But then again, an exception would have to be made in order for first timers be able to use the command… I was about to set up a proxy web service in Google's &lt;a href="http://code.google.com/appengine/" title="Google App Engine"&gt;App Engine&lt;/a&gt; when I remembered two happy coincidences:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Buxfer allows &lt;a href="http://twitter.com/" title="Twitter"&gt;Twitter&lt;/a&gt; messages to be sent with the same syntax as those we can send from an &lt;span class="caps"&gt;API&lt;/span&gt; (or from a cell phone).&lt;/li&gt;

  &lt;li&gt;Twitter has a nice &lt;span class="caps"&gt;API,&lt;/span&gt; that does exactly what I was aiming for: it points it's requests to they're site, and if you're not logged in, it asks for your credentials using &lt;a href="http://en.wikipedia.org/wiki/Basic_authentication_scheme" title="HTTP Basic Authentication"&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; Basic Authentication&lt;/a&gt;. This way, Firefox aks you if it may remember the password, and actually does it :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result: I ended up with two commands, one using the Buxfer &lt;span class="caps"&gt;API,&lt;/span&gt; and another using Twitter's. But since Twitter's the most user friendly (easier and faster to use), I'm switching my transaction input to the brand new Twixfer (It's weekend, my imagination needs some more rest to come up with a better name!). Feel free to take a peak into the &lt;a href="http://sites.google.com/site/edgargoncalves/work/software/twixfer" title="Twixfer Homepage"&gt;homepage&lt;/a&gt;. The source consists of a couple of files, so I thought a Google Code project would be over-killing it… But if this thing starts to get any sort of user input/contributions, I'll gladly move it there. For now, leave comments at the Twixfer site. As usual, feel free to leave feedback about anything.&lt;/p&gt;
&lt;p&gt;[EDIT: Today I had a tip from a &lt;a href="http://abcdefu.wordpress.com/"&gt;gentle soul&lt;/a&gt; about retrieving password from Firefox's session. So Buxfer API is usable by itself, now. Check the same link and update your command, if needed. It has lots of cleaning up and code re-factoring done. Nevertheless, it was fun to toy around with the Twixfer concept!]&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-3186474069316645333?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/3186474069316645333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=3186474069316645333' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3186474069316645333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3186474069316645333'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/09/love-buxfer-use-twitter-so-why-not.html' title='Love Buxfer. Use Twitter. So why not Twixfer?'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1266540391901197769</id><published>2008-09-02T23:56:00.002+01:00</published><updated>2008-11-06T14:11:49.312Z</updated><title type='text'>Getting Things Done - the flow-chart</title><content type='html'>&lt;div style='margin-top: 25px; border: 0px; min-height:50px; overflow: auto; font-size: 11px; width: 456px; line-height: 16.8px; float: none'&gt;Here&amp;apos;s David Allen&amp;apos;s graph for Getting Things Done (GTD). Though to use, but has nice results!&lt;IMG class="yoono-image" style="width: 412px; height: 470px;border: 0px; padding: 5px;" src="http://lifedev.net/wp-content/uploads/2007/02/gtd-workflow.gif"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1266540391901197769?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1266540391901197769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1266540391901197769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1266540391901197769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1266540391901197769'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/09/i-love.html' title='Getting Things Done - the flow-chart'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-2748490142436093945</id><published>2008-04-14T00:17:00.001+01:00</published><updated>2008-04-14T00:41:38.216+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>Moooing away in Common Lisp</title><content type='html'>&lt;p&gt;I'v recently found myself needing to use a task manager to make some bulk operations (to be more precise, I wanted to copy all of my tasks to a device with no built-in synchronization mechanism for those). I happen to make use of the great &lt;a href="http://www.rememberthemilk.com/" title="Remember The Milk"&gt;Remember The Milk&lt;/a&gt; Web application (I've previously worked with &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/PlannerMode"&gt;Planner&lt;/a&gt;, but I had to drop it in favor of a more mobile version of my life).&lt;/p&gt;
&lt;p&gt;Enter Common Lisp. Perhaps the fastest way to do some scripting in my mind, but I've yet to make a library to use a Web-based API. Turned out it was quite clean, and in about 5 hours of work I had the whole API grokked, coded, tested and hosted in GoogleCode &lt;a href="http://code.google.com/p/rtm-lisp-api/"&gt;here&lt;/a&gt;. (I looked into cl.net, but found the google's approach to hosting much more featured for the fast start I was looking for. If this has enough momentum I can look into it again, with more time - the main advantage would be asdf-installability, I suppose.)&lt;/p&gt;
&lt;p&gt;I already had experience making project "skeletons" (&lt;a href="http://cliki.net/asdf"&gt;asdf&lt;/a&gt; project file, package declaration, etc.). So the hardest thing I had to do was look into the web API call mechanism and into the md5 encryption. If you don't need the detailed description, tha answers are, respectively, &lt;a href="http://weitz.de/drakma/"&gt;Drakma&lt;/a&gt; and &lt;a href="http://method-combination.net/lisp/ironclad/"&gt;Ironclad&lt;/a&gt;. ( I also use cl-json to parse RTM's responses into a lisp-friendly format.)&lt;/p&gt;
&lt;p&gt;To call a Web-based method, we need to make an HTTP request, and be able to read the response. using drakma (asdf installable and loaded in the usual way), all I had to do was something like:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;(http-request rtm-api-endpoint :method :post :parameters '(("param-name" . "param-value")))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With some parameter abstractions, RTM's was easily tamed. A call to one of their methods is now made with the following macro:&lt;/p&gt;
&lt;table width="100%" class="paste-area"&gt;&lt;tr&gt;&lt;td bgcolor="#F4F4F4" colspan="2" width="100%"&gt;&lt;tt&gt;&lt;span class="paste"&gt;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_defun.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;defun&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; rtm-api-call-method &lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/t_method.htm" class="symbol"&gt;method&lt;/a&gt; &amp;amp;optional key-value-pairs &amp;amp;key &lt;i&gt;&lt;span class="symbol"&gt;with-timeline&lt;/span&gt;&lt;/i&gt; &lt;i&gt;&lt;span class="symbol"&gt;with-authentication&lt;/span&gt;&lt;/i&gt; &lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_format.htm" class="symbol"&gt;format&lt;/a&gt; &lt;span class="string"&gt;"json"&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="string"&gt;"Calls `METHOD'.&lt;br&gt;&amp;nbsp;- Optionally passes pairs of strings in `KEY-VALUE-PAIRS' in the form&lt;br&gt;of (`PARAMETER' . `VALUE').&lt;br&gt;&amp;nbsp;- Keyword `WITH-TIMELINE', if not null, allows the method to be called within&lt;br&gt;the `*CURRENT-TIMELINE*'.&lt;br&gt;&amp;nbsp;- Keyword `WITH-AUTHENTICATION', if not null, allows the method call to be&lt;br&gt;authenticated with a valid `*RTM-API-TOKEN*'.&lt;br&gt;&amp;nbsp;- Keyword `FORMAT' is one of &lt;/span&gt;&lt;span class="string"&gt;\"&lt;/span&gt;&lt;span class="string"&gt;json&lt;/span&gt;&lt;span class="string"&gt;\"&lt;/span&gt;&lt;span class="string"&gt; (the default value) or &lt;/span&gt;&lt;span class="string"&gt;\"&lt;/span&gt;&lt;span class="string"&gt;rest&lt;/span&gt;&lt;span class="string"&gt;\"&lt;/span&gt;&lt;span class="string"&gt;, and&lt;br&gt;specifies the server reply format."&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/s_declar.htm" class="symbol"&gt;declare&lt;/a&gt; &lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/d_specia.htm" class="symbol"&gt;special&lt;/a&gt; &lt;span class="special"&gt;*current-timeline*&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;let*&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; &lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;span class="paren4"&gt;(&lt;span class="paste"&gt;parameters `&lt;span class="paren5"&gt;(&lt;span class="paste"&gt;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"api_key"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;. ,rtm-api-key&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"method"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. ,&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/t_method.htm" class="symbol"&gt;method&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"format"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. ,&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_format.htm" class="symbol"&gt;format&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,@&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_when_.htm" class="symbol"&gt;when&lt;/a&gt; &lt;i&gt;&lt;span class="symbol"&gt;with-timeline&lt;/span&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;i&gt;&lt;span class="symbol"&gt;with-timeline&lt;/span&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"timeline"&lt;/span&gt; . ,&lt;span class="special"&gt;*current-timeline*&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,@&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_when_.htm" class="symbol"&gt;when&lt;/a&gt; &lt;i&gt;&lt;span class="symbol"&gt;with-authentication&lt;/span&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;`&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"auth_token"&lt;/span&gt; . ,&lt;span class="special"&gt;*rtm-api-token*&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,@key-value-pairs&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;api-sig &lt;span class="paren5"&gt;(&lt;span class="paste"&gt;compute-rtm-api-sig parameters&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_multip.htm" class="symbol"&gt;multiple-value-bind&lt;/a&gt; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;result&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren4"&gt;(&lt;span class="paste"&gt;http-request rtm-api-endpoint&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;:method&lt;/span&gt; &lt;span class="keyword"&gt;:post&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;:parameters&lt;/span&gt; `&lt;span class="paren5"&gt;(&lt;span class="paste"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;,@parameters&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"api_sig"&lt;/span&gt; . ,api-sig&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;let*&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; &lt;span class="paren5"&gt;(&lt;span class="paste"&gt;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;response &lt;span class="paren1"&gt;(&lt;span class="paste"&gt;json-bind &lt;span class="paren2"&gt;(&lt;span class="paste"&gt;rsp&lt;/span&gt;)&lt;/span&gt; result rsp&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;stat &lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_assocc.htm" class="symbol"&gt;assoc&lt;/a&gt; &lt;span class="keyword"&gt;:stat&lt;/span&gt; response&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren5"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_cond.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;cond&lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_stgeq_.htm" class="symbol"&gt;string=&lt;/a&gt; &amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_car_c.htm" class="symbol"&gt;cdr&lt;/a&gt; stat&lt;/span&gt;)&lt;/span&gt; &lt;span class="string"&gt;"ok"&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_rest.htm" class="symbol"&gt;rest&lt;/a&gt; response&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="paren6"&gt;(&lt;span class="paste"&gt;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_stgeq_.htm" class="symbol"&gt;string=&lt;/a&gt; &amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_car_c.htm" class="symbol"&gt;cdr&lt;/a&gt; stat&lt;/span&gt;)&lt;/span&gt; &lt;span class="string"&gt;"fail"&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;let&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; &lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;err-info &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_car_c.htm" class="symbol"&gt;cdr&lt;/a&gt; &lt;span class="paren5"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_assocc.htm" class="symbol"&gt;assoc&lt;/a&gt; &lt;span class="keyword"&gt;:err&lt;/span&gt; response&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/a_error.htm" class="symbol"&gt;error&lt;/a&gt; &lt;span class="string"&gt;"RTM error code ~a: ~a~%"&lt;/span&gt; &lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_car_c.htm" class="symbol"&gt;cdr&lt;/a&gt; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_assocc.htm" class="symbol"&gt;assoc&lt;/a&gt; &lt;span class="keyword"&gt;:code&lt;/span&gt; err-info&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_car_c.htm" class="symbol"&gt;cdr&lt;/a&gt; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/f_assocc.htm" class="symbol"&gt;assoc&lt;/a&gt; &lt;span class="keyword"&gt;:msg&lt;/span&gt; err-info&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;With this (rather big, for the sake of readability, or mayhap due to my lack of experience in mental pretty printing) function, I define a call to an RTM module simply by coding:&lt;/p&gt;
&lt;table width="100%" class="paste-area"&gt;&lt;tr&gt;&lt;td bgcolor="#F4F4F4" colspan="2" width="100%"&gt;&lt;tt&gt;&lt;span class="paste"&gt;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_defun.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;defun&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; rtm-api-tasks-complete &lt;span class="paren2"&gt;(&lt;span class="paste"&gt;list-id taskseries-id task-id&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;rtm-api-call-method &lt;span class="string"&gt;"rtm.tasks.complete"&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;&lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"list_id"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. ,list-id&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"taskseries_id"&lt;/span&gt; . ,taskseries-id&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;&lt;span class="string"&gt;"task_id"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. ,task-id&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;:with-authentication&lt;/span&gt; &lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/a_t.htm" class="symbol"&gt;t&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;:with-timeline&lt;/span&gt; &lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/a_t.htm" class="symbol"&gt;t&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The only call in the first function definition that cannot be easily guessed how they work is the compute-rpm-api-sig-parameters. This is the function that performs the algorithm required by RTM to encode all parameters and guarantee authenticity in each request (along with a masked API key). Basically it does some mambo-jumbo concatenation with each parameter's name and value, and then performs an MD5 to get the equivalent hash code. Easy, right? But I'm a lazy programmer. That, and I truly believe there's no point in reinventing the wheel, so I looked for encryption functions in Lisp, and I found Ironclad, a collection of most of these functions in Lisp. So producing an md5 functions was as easy as the following:&lt;/p&gt;
&lt;table width="100%" class="paste-area"&gt;&lt;tr&gt;&lt;td bgcolor="#F4F4F4" colspan="2" width="100%" &gt;&lt;tt&gt;&lt;span class="paste"&gt;&lt;span class="paren1"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/m_defun.htm" class="symbol"&gt;&lt;i&gt;&lt;span class="symbol"&gt;defun&lt;/span&gt;&lt;/i&gt;&lt;/a&gt; md5 &lt;span class="paren2"&gt;(&lt;span class="paste"&gt;&lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/a_string.htm" class="symbol"&gt;string&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="string"&gt;"MD5 uses ironclad to encode `STRING' into an hexadecimal digest string."&lt;/span&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span class="paren2"&gt;(&lt;span class="paste"&gt;ironclad:byte-array-to-hex-string&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="paren3"&gt;(&lt;span class="paste"&gt;ironclad:digest-sequence &lt;span class="keyword"&gt;:md5&lt;/span&gt; &lt;span class="paren4"&gt;(&lt;span class="paste"&gt;ironclad:ascii-string-to-byte-array &lt;a href="http://www.lispworks.com/reference/HyperSpec/Body/a_string.htm" class="symbol"&gt;string&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;And that's about it. The rest was toying around, the API works perfectly (kudos to the RTM dev team!), and I was thrilled to have my tasks exported in a jiffy. If you want to find more info, feel free to snoop through the code (it's quite easy to grasp, I think, and relatively small), in the Google Code site: http://code.google.com/p/rtm-lisp-api/ . So now, what would you, gentle reader, do with this API? Drop me some comments with your ideas.&lt;/p&gt;
&lt;p&gt;Until the next time!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-2748490142436093945?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/2748490142436093945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=2748490142436093945' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2748490142436093945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2748490142436093945'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/04/moooing-away-in-common-lisp.html' title='Moooing away in Common Lisp'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-908664776128756328</id><published>2008-03-13T19:20:00.001Z</published><updated>2008-03-13T19:20:20.976Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Cocoa development, using a Lisp bridge</title><content type='html'>&lt;p&gt;Let's get a bit away from my PhD for a while. In my spare time, I've been looking at some graphic libraries to make some applications. In the past I've looked for Operating System portability for those apps. I've also delved into the Web world for interfaces. Right now, I've settled for making pretty looking gui's. If you add my new acquisition - a Macbook Pro, my first mac ever! - and I obviously had to try to make a MacOS Cocoa application. They're fashion, they're usable, they mingle with the rest of the desktop manager, and I was just tempted to try to use Lisp to make something like it.&lt;/p&gt;
&lt;p&gt;Fortunately, this wasn't so hard, has OpenMCL has a great step by step tutorial (to be taken with a few glasses of water and with the Cocoa / Interface Builder tutorials made available by Apple). This tutorial has detailed instructions of how one can build the Interface with the WYSIWYG tool that comes with Xcode. Then it tells you how to setup the connection points between the interface and the application code. These are called outlets, for the variables in the code that represent a given object (so that you may, for instance, retrieve the text in a text field) and actions, for the functions that are called when something happens in the interface (e.g., user click in a button). After creating the necessary objects (basically you must make them belong to a specific metaclass in order for them to be exported as an ObjectiveC class), all you have to do is call a function that binds together the compiled code, the Interface files (in the nib format) and places a nice application bundle in the directory of your choice. It can't get any easier, you think. And yes, you may code interface changes in you lisp code. But it's extremely easier to follow in Interface Builder guidelines and helpers... You just can't go wrong!&lt;/p&gt;
&lt;p&gt;You may find the tutorial at the OpenMCL wiki: &lt;a href="http://trac.clozure.com/openmcl/wiki/AppleCurrencyConverter"&gt;http://trac.clozure.com/openmcl/wiki/AppleCurrencyConverter&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/6003917-908664776128756328?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/908664776128756328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=908664776128756328' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/908664776128756328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/908664776128756328'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/03/cocoa-development-using-lisp-bridge.html' title='Cocoa development, using a Lisp bridge'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6096085468262075539</id><published>2008-02-01T18:29:00.001Z</published><updated>2008-12-09T09:34:12.341Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='PhD'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>User interface paradigms for data search and offline data access</title><content type='html'>&lt;p&gt;I've stumbled upon this interesting and illustrated article on data lookup user interface design patterns (on both web and desktop applications, finally we seem to be starting to forget there's a difference!):&lt;/p&gt;
&lt;blockquote cite="http://theresaneil.wordpress.com/2008/01/29/seek-or-show-two-design-paradigms-for-lots-of-data/"&gt;
  &lt;p&gt;Here are two design paradigms for handling large amounts of data, not to be confused (or combined) as web design meets desktop in rich Internet applications.&lt;/p&gt;[From &lt;a href="http://theresaneil.wordpress.com/2008/01/29/seek-or-show-two-design-paradigms-for-lots-of-data/"&gt;&lt;cite&gt;Seek or Show: Two Design Paradigms for Lots of Data « Theresaneil’s Weblog&lt;/cite&gt;&lt;/a&gt;]
&lt;/blockquote&gt;
&lt;p&gt;The post describes two main groups of patterns, based on the way a user chooses what he/she wants to search (pictures linked from the article mentioned above):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The Seek Paradigm&lt;/strong&gt; - The user has to input a search criteria in order to access some search results.&lt;br /&gt;
  &lt;img src="http://3.bp.blogspot.com/_eoZrdRaegvU/R56lzUb1x_I/AAAAAAAAAGQ/gA51rwCjMs0/s320/Picture+1.png" /&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;The Show Paradigm&lt;/strong&gt; - The user is presented with several search results (or categories), and he may drill-down the search by clicking on the desired categories or selecting certain results to eliminate unwanted items.&lt;br /&gt;
  &lt;img src="http://4.bp.blogspot.com/_eoZrdRaegvU/R56wUkb1yUI/AAAAAAAAAI4/X6sP2JKwXEo/s320/Picture+22.png" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This got me thinking in terms of offline work, and I can easily qualify both approaches as orthogonal to the online vs. offline decision. It is merely a user interface option, which is a good thing. To understand this, picture a lookup for book titles on a library. To go offline, one would have the client application to fetch them all from the server, thus making both kind of interface patterns possible without contacting the server. Similarly, if we wanted to know how many clients had already rented a book (assuming the algorithm implied a run through each client's details to look for their rental - I know, it's not the smartest way to do that, but it's only an illustrative example!), the client wouldn't be able to fetch all the other clients' details, hence not being able to use any of the search paradigms.&lt;/p&gt;
&lt;p&gt;So the effort that has to be done, from the application logic design point of view, is related to how the services (those accessed by the user interface) access the information stored in the database. Let's draw some pseudo-code* for the book rental example above (the second example).&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Approach 1: &lt;strong&gt;The all-powerful service&lt;/strong&gt;. This is the kind of service we would have written up until a few months ago, considering any sort of offline execution to be an academic dream or an edgy unfeasible mostly unsuccessful experiment. Basically it assumes that it is being executed with super-user privileges, hence able to access all stored data at any time with no constraints whatsoever.&lt;/li&gt;

  &lt;li&gt;Aproach 2: &lt;strong&gt;The helpful, aware and conscious service.&lt;/strong&gt; This is the service that knows that its code may be executed in many places, and so it tries to make a scarce usage of the stored data as much as it can.&lt;/li&gt;

  &lt;li style="list-style: none"&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using approach 1 we could code a service like this:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;pre&gt;
(define-service get-number-of-book-rentals (book)&lt;br /&gt;  (let ((all-clients (get-storage-data "clients"))&lt;br /&gt;        (result 0))&lt;br /&gt;    (dolist (client all-clients)&lt;br /&gt;      (set result (+ result&lt;br /&gt;                     (client-book-rentals client book))))&lt;br /&gt;    result))&lt;br /&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you can see, while this would work perfectly on the server, the client would never be able to to the &lt;span style="font-family: 'Andale Mono';"&gt;(get-storage-data "clients")&lt;span style="font-family: Helvetica;"&gt;call, given its lack of permission to fetch them all to the client-side storage. This is the sort of services that must be thought over and rewritten - or, better yet, automatically translated to something more useful!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;By using approach 2, we would instead code something in the lines of:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;pre&gt;
(define-service get-number-of-book-rentals&lt;br /&gt;  (:inputs (book)&lt;br /&gt;   :storage-data (books-rent-by-all-clients (get-total-rentals-from-clients)))&lt;br /&gt;  (let ((number-of-books 0))&lt;br /&gt;    (dolist (client-rentals (filter book-rent-by-all-clients &lt;br /&gt;                                    :field "book" &lt;br /&gt;                                    :value book))&lt;br /&gt;      (set number-of-books (+ number-of-books client-rentals)))))&lt;br /&gt;    number-of-books))&lt;br /&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here it's clear that the service knows what data is going to be needed from the storage. With this information, the server can fetch it for the client when it wants to disconnect, and the client is now able to perform the same functionality without having to run through the clients (read, without having to have access to all clients' personal details). Relevant, noteworthy changes between the examples:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the service has to be declared with more information (like the storage-data requirements)&lt;/li&gt;

  &lt;li&gt;the storage data requirements code is &lt;strong&gt;always&lt;/strong&gt; performed on the server. The client counterpart consists of a lookup on the client-side storage for the previously fetched information. This way there is no risk of information not being available.&lt;/li&gt;

  &lt;li&gt;If the service is to be run online, it also runs equally well, with no performance penalties.&lt;/li&gt;

  &lt;li&gt;There must be either a mentality change or a tool to translate services made with the approach 1 to the approach 2!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm already laying out some code to achieve something like this. Expect news in the following week or two.&lt;/p&gt;
&lt;p&gt;*Disclaimer - despite being in a lisp pseudo-dialect, all examples could exist in the language of your choice. It's really just a matter of personal preference!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6096085468262075539?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/6096085468262075539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=6096085468262075539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6096085468262075539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6096085468262075539'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/02/user-interface-paradigms-for-data.html' title='User interface paradigms for data search and offline data access'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_eoZrdRaegvU/R56lzUb1x_I/AAAAAAAAAGQ/gA51rwCjMs0/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6423586164725438651</id><published>2008-01-10T00:40:00.001Z</published><updated>2008-01-10T00:42:14.477Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphs'/><category scheme='http://www.blogger.com/atom/ns#' term='functionality dependency'/><category scheme='http://www.blogger.com/atom/ns#' term='PhD'/><category scheme='http://www.blogger.com/atom/ns#' term='web applcations'/><title type='text'>The search for functionality dependency</title><content type='html'>&lt;p&gt;&lt;a href="http://www.pagetoscreen.net/photographs/DSC05266_medium.jpg"&gt;&lt;img src="http://www.pagetoscreen.net/photographs/DSC05266_medium.jpg" height="104" width="104" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Having had my PhD thesis proposal (previously presented &lt;a href="http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4335248" title=" Offline execution in workflow-enabled Web applications"&gt;here&lt;/a&gt;) approved by my university, it's time to move along to the next step: thorough description of the solution I propose, followed by its implementation.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The first important aspect I need to address is the &lt;strong&gt;grouping of functionalities that may be executed by a given user while offline&lt;/strong&gt;. The ideal situation would be to pick up a specification of a Web application, then automatically produce a graph of available functionalities, with their dependency hierarchy. From here, the developer (or even the project engineer) could inspect what would be desirable to be performed offline, according to the requirements artifacts. Since we're also aiming for ease of use, on the produced tree, it would be nice to see the characteristics of each functionality, namely when related to access control permissions and data dependencies. This way we could gray out some of the available functionalities that could never be performed offline (e.g., we may want to force every functionality requiring a specific role to be accessed online only). By imposing restrictions, one could easily make a map of he needed functionalities. It seems almost to easy. What we're forgetting is how we're going to get the dependency graph. Yes, I intended to get those via a workflow graph. But let's face it, most Web applications are built without a prior workflow specification artifact ever seeing the light of day. Specifically, my case study doesn't have one (yet, however). So how shall I do this?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Write the aforementioned workflow specification by hand&lt;/strong&gt;. This seems a lot of work to ask of the project development team, specially since all they want is some functionalities (they don't know exactly what or how many in a low-level, only the high-level use-case names are written in the requests, usually). It's also not possible to write it automatically, since it needs domain-specific information, usually more than what is already present (albeit very scattered) in the existing application. So this is a no-go.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Code walking&lt;/strong&gt;. If we inspect each interface user action and the accessed data and services, we could obviously draw a graph. This however poses other problems. Are all programmers doing the right thing? It's not that uncommon to write services that check on other services without needing them, just to see some futile/temporary information, and forgetting about it later on. I know that doesn't happen in a perfect world, but "real" and "perfect" don't always pair along! But there is another show-stopping issue with this approach: we would have to start the "walk" somewhere, so we need to know all the starting functionality calls, along with the list of services itself.&lt;/li&gt;

  &lt;li&gt;U&lt;strong&gt;ser experience tracing&lt;/strong&gt;. This is quite interesting in theory, if we ask users of several roles to perform their tasks, we can obviously trace the execution flow perfectly by reading the logs only. But we have no means to guarantee the users are going to access all the functionalities they are entitled to perform in our tracing period. That is only possible in a closed, controlled experience, by having users following scripts. But this kills the main purpose - those scripts are as hard to write as the workflow description itself, so it's of no use to us.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Functionality reification&lt;/strong&gt;. By reengineering the application to have the functionality calls represented as objects, we can have the immediate dependencies graph automatically by scanning all user interfaces and listing the graphs of all calls triggered by buttons, links or other events (XHR based, for instance).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm going to put my efforts on this last one. There are other advantages with this approach, being studied by some colleagues of mine at &lt;a href="http://www.esw.inesc-id.pt/wikiesw"&gt;INESC-ID&lt;/a&gt; and in the &lt;a href="https://fenix-ashes.ist.utl.pt/" title="Project Fenix"&gt;Fenix&lt;/a&gt; development team. The main ones are related to he presentation mechanism allowed - the organization of the Web application interface can be composed with such objects. I'll get into more details afterwards.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As usual, I appreciate any comments, tips or any other kind of experience sharing from you, dear reader!&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6423586164725438651?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/6423586164725438651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=6423586164725438651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6423586164725438651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6423586164725438651'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2008/01/search-for-functionality-dependency.html' title='The search for functionality dependency'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-5301939207483038630</id><published>2007-10-27T12:04:00.000+01:00</published><updated>2007-10-27T12:06:59.442+01:00</updated><title type='text'>Microsoft's Occasionally Connected Smart Clients</title><content type='html'>&lt;blockquote cite="http://msdn2.microsoft.com/en-us/library/ms998482.aspx"&gt;
  There are two broad strategies for designing smart client communications: service-oriented and data-centric. When you have determined which of these to use, you need to make some fundamental design decisions to allow your smart clients to work offline. In most cases, the clients should be designed to use asynchronous communication and simple network interactions. Clients will need to cache data for use when offline, and you will need a method to handle data and business rule conflicts when the clients go back online.&lt;br /&gt;
  [From &lt;a href="http://msdn2.microsoft.com/en-us/library/ms998482.aspx"&gt;&lt;cite&gt;Chapter 4 - Occasionally Connected Smart Clients&lt;/cite&gt;&lt;/a&gt;]&lt;br /&gt;
&lt;/blockquote&gt;This is a good overview for what I'm going to handle. Microsoft wants its PDA's, and other Smart Clients to be able to perform tasks while disconnected from the server. I want regular Web Applications to the the same, so I'm making the client browser just lie Microsoft's Smart Client. Let's overview their main points:

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Approach&lt;/strong&gt;: MS distinguishes a &lt;span style="font-weight: bold;"&gt;Data-centric&lt;/span&gt; and a &lt;span style="font-weight: bold;"&gt;Server-oriented&lt;/span&gt; approach to disconnected systems. The following graphic (taken from their article) illustrates that while data-centric approaches are not scalable due to their local replication of the entire database, the service-oriented approach also suffers from the lack of business logic (thus relying on the local cache without letting the server know it is not being contacted. We can envision server updates to this interface and/or business logic with painful consequences for the client... My approach is a mix between those two, for I want to design a client that is able to fetch a server module with both UI and business logic, and the necessary data for it to work. However, because we want the application to update the workflow, all client actions will still be postponed to the time that a server is reachable.&lt;br /&gt;
  &lt;img src="http://msdn2.microsoft.com/en-us/library/ms998482.chfg0112(en-us,MSDN.10).gif" alt="Data-centric and Service-oriented approaches" width="480" height="360" /&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Conflict types&lt;/strong&gt;: I've previously detected that all conflicts aren't the same. In fact, whenever someone edits a previously existing data (e.g., a student changing his email address), there is a simple data conflict, as the information on the client differs from the server's version. But this is a different case from an edition to a already deleted data (e.g., the same student tries to answer a question in a quiz that has already been removed by the teacher). MS article refers to the first case as &lt;strong&gt;Data Conflicts&lt;/strong&gt;, and to the second as &lt;strong&gt;Business Rules Conflicts&lt;/strong&gt;. Note that data conflicts may not be trivial to reconcile - consider a situation where two different entities change the same information, one offline, another online. Both want to change it, only one will succeed at first, but the offline client may need to merge its data, after having it sorted out with the other user.&lt;/li&gt;

  &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Locking mechanism&lt;/span&gt;: while a pessimistic approach would minimize all sorts of conflicts, it is obviously not scalable to a widely shared data-set. So with an optimistic approach comes the need to synchronize and reconcile conflicts.&lt;/li&gt;

  &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Reconciliation types&lt;/span&gt;: MS assumes the same three locations to do the reconciliation I've detected so far. If the conflict can be automatically merged, it will take place on the server. If not, it may take place on the client (with a simple user interaction dialog), or it may require the launch of another task that will contact other parties (e.g., two students posting the right answer to a question, needing the teacher input to opt for one of them).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The article further discusses CRUD operations as the ideal services to have in these situations (i.e., complex services would make client-side data synchronization harder and harder), and propose some strategies to handle task-based functionality dependencies.&lt;/p&gt;
&lt;p&gt;While this is the closer I've read so far to what I want to do for my PhD, it's still lagged behind, as I propose a methodology to adapt existing applications (e.g., pick up existing web services and build from there), and I propose a conflict - and resolution mechanism - description that seamlessly integrates with the remainder application.&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-5301939207483038630?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/5301939207483038630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=5301939207483038630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/5301939207483038630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/5301939207483038630'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2007/10/microsoft-occasionally-connected-smart.html' title='Microsoft&amp;#39;s Occasionally Connected Smart Clients'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-2384063023721629354</id><published>2007-09-27T20:19:00.000+01:00</published><updated>2008-02-25T02:46:51.469Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PhD'/><title type='text'>QUATIC07 - the humanistic version of the story</title><content type='html'>&lt;p&gt;On the last post I mentioned my findings from QUATIC07, and specifically from the input received from the software engineering doctoral consortium workshop. Now it's time to clear out what I learned from the whole experience.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Let's start this thing to mention this is my second event of this sort. I've attended to CAPSI 05, to present a paper entitled "Desduplicação sobre um conjunto de nomes próprios" (in english, "Duplicate removal in a set of first names"). The paper was presented by Helena Galhardas, that despite being the third author - my teacher of decision support systems at the time - she had both the recognition and the experience to make a proper presentation without the beginner's jitters...). So, despite having a published paper, I hadn't present any, so far. Enter the QUATIC event. I'm now faced with the opportunity to show my PhD expectations to other students and teachers of the same area. And present a poster to the entire academia/industrial audience on the conference's hallways. And have my thesis proposal published as a paper on a IEEE proceedings! I must say I was pretty excited about the whole deal!&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Day one. I arrived at the conference to present the thesis to the doctoral workshop, SEDES. The conference was in portuguese, and the first interesting fact I noticed was the geographical tendencies of the participants: I was the only one who lived/studied/worked below the northern part of portugal. The rest were all from Coimbra, Aveiro, Oporto, so Lisbon (!) was a strange city among them :) But everyone was really looking for a chance to get feedback on their work, so there wasn't much time nor motivation for picking around that! Well, after receiving my reviews, I met personally one of the reviewers, and found out he is going to be part of my PhD jury. I had lunch with all of them, and proceeded to the remainder of the thesis discussions. And that's about it.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Day 2 and 3. The poster. I placed the poster on a wall in the hallway, and got a nice desk to sit at. This way, I got to show some supporting images to some enquiring passerby. I made an english 10 minute presentation about it, to the industrial world, and got some positive feedback on the subject (the technical questions were a bit far from what I was expecting; the academia is surely more prepared to criticize my work, as it is still a novelty to the others). On the last day I got to see a teaching perspective on software engineering. Miller's presentation about TSP and PSP were most enlightening and entertaining. The day ended with a dinner in a Brazilian restaurant with live music. I got to mingle a bit with people I had met but rarely had the chance to talk to. It was fun, but I have to admit I was pretty tired. I went to bed and slept for a good 7 hours, before waking up to finish another presentation (7 hours seemed a lot, as I had been sleeping from 3 to 5 each night until then!)&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Last thoughts. I had a great time, the preparation was quite helpful in organizing my mind schemes, and the feedback was the cherry on the top of the cake. But now I need to evolve my work so that I can go to a IEEE well known conference - not that this wasn't a good one, but I need some heavyweight recognition when I'm facing a fulminating jury! Advice for the PhD newcomers? Don't miss out opportunities like this! It can be expensive, obviously, but there are organizations able to fund your research and your publications and presentations!&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Going back to Emacs (is there any other TeX editor worth reverting to, when you're an emacsen?)&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-2384063023721629354?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/2384063023721629354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=2384063023721629354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2384063023721629354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2384063023721629354'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2007/09/quatic07-humanistic-version-of-story.html' title='QUATIC07 - the humanistic version of the story'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-8091729638335635300</id><published>2007-09-16T22:25:00.001+01:00</published><updated>2007-09-16T22:32:14.956+01:00</updated><title type='text'>QUATIC07 - the academical side</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;I've attended the last edition of the &lt;a title='QUATIC' href='http://quatic2007.dsi.uminho.pt/'&gt;QUATIC&lt;/a&gt; conference, a three-day event on Universidade Nova de Lisboa, in Portugal. My main motivation was to participate on SEDES, a satellite workshop on Software Engineering PhD students. The purpose was to discuss ongoing PhD thesis and receive early feedback on them - while checking out other possibly related ideas and suggestions from the other participants.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;I presented my PhD proposal, as it was by the end of July of the present year. It was a good experience, I received lots of appraisal for my chosen thematic, and also lots of critiques on the details of the thesis, my way of explaining things and my presentation. So lets start from the beginning, go straight to the end, then stop! :) (bored readers be warned, this is going to be a long post!)&lt;/p&gt;&lt;br/&gt;&lt;p&gt;My PhD thesis proposal is entitled "&lt;strong&gt;Offline execution in workflow-enabled Web applications&lt;/strong&gt;". My goal started a bit broader, at a time where AJAX was starting to make its entrance in the development show-biz, I wanted to make desktop-like Web applications. Soon enough I realized I was foolish, because tens (hundreds?) of tools were immediately born to make Web Apps. look pretty, with lots of drag and drops, image overlaps, you name it. When something like Yahoo! releases their widgets, I can confidently stop trying to do something like that - I'm one student, they are one fully employed - read "payed!" - set of experienced developers. So I refined my goal and picked a real request - to make a Web Application run offline, without requiring external applications and without loosing any work. To do this I identified three main areas, or sub-problems:&lt;/p&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;  &lt;li&gt;Workflow decomposition into offline performable modules;&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;Offline client generation, and its functionality&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;Offline work reconciliation with the server&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;p&gt;And this was what I had in mind at the time of the short paper submission. I was also invited to present a poster on how my work would affect the industry, with a short talk within the main QUATIC conference. That, off-course, set the stage for more interaction, as my poster was on a mandatory corridor to all participants ;)&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Later on, I collected a set of information (from both research and opinions on the conference) that made my thesis improve itself. I'll try to present them here, as succinctly as I can:&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;  &lt;li&gt;Workflow decomposition is a relatively known problem, and people like van der Aalst have been working on Colored Petri-Nets (CPN) to work it out. The problem is now reduced to the question "How do I tell if I can perform this activity if I go offline now?". This is not as simple as it may seem, as I must ensure that there is a possible execution flow that won't require other entities online interaction. I also must ensure that I can bring all required data offline, to my laptop - and issues like access control or the amount of information arise here.&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;Offline persistency on a browser is now the purpose of tools such as Google Gears. Client-side generation using a high level language is also attacked by tools and frameworks like Morfik, XML11 or Google Web Toolkit. My problem is now to unify the specification of both online and offline tools into one. Later on I might also have to worry about technical details like client application transfer, shrinking, and a workflow-engine client clone, but not for a few months, for sure!&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;I was told the synchronization scheme I was looking for was already done by the nice guys from &lt;a href='http://www.microsoft.com/'&gt;Redmond&lt;/a&gt;. The Occasionally Connected Systems framework is supposed to handle a local database (SQL Server Everywhere) and all the asynchronous messaging it takes to handle eventual internet failure, small period disconnects, etc, and that would include a nice and efficient merge of all offline data. While this may be true, there are a couple of issues that allow me to stay on the innovative side of the research: 1) The framework is intended to run on desktop-based applications. I assume that eventually Silverlight-based applications could be supported (as they grow the run-time virtual machine and bloat them with even more .NET libraries). But I want Web applications to do the same, and that's not been abridged, as far as I can tell. 2) The OCS framework is able to merge database information. But the types of conflicts I'm targeting are the high-level ones. I'm not interested in the last-edition time-stamp that is different. I'm looking for the product that cannot be bought because the store now is set to open from Monday to Thursday and I can only get there on Fridays. To make things clear, &lt;strong&gt;I'm not interested in a data merge algorithm&lt;/strong&gt;, but in the elegant and simple &lt;span style='text-decoration: underline;'&gt;way to integrate the specification of such kinds of conflicts&lt;/span&gt; - and their resolution strategies - within the application domain model and workflow definition.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;This was a nice set of input. I was pleased. But I had some other things to fix, not so technical but about my approach to the whole PhD:&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;  &lt;li&gt;My sales-pitch - I need to fine-tune my goal statement into something that says "I want to describe a specific solution to a specific problem", and not "I want to solve al world's problems in two years, yay!!".&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;I also must get a supportive example. My example has fallen in the field of the non-problem - that was what I got by making it so simple I could explain it in a corridor walk... So the suggestion is to find a concrete requirement in a concrete (aka, real) system, describe the requirement, describe the problems in the current approach and conclude by suggesting how do we would want to do it.&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;I had to change a lot in what I was expecting to produce. Since I'm aiming for a development methodology (and the necessary framework or tools), I had to clearly state the inputs, outputs, all stages, the applicability/restrictions, the target audience, ad so on and so on. It's a shame there is no standards related to methodology description. I could certainly take advantage of one, now!&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;I'll post later about my personal experience on the conference - something from my human side :), and also to publish a copy of my thesis proposal. Here's how the poster looked like:&lt;br/&gt;&lt;a title='Photo Sharing' href='http://www.flickr.com/photos/edgargoncalves/1393804924/'&gt;&lt;img width='500' height='354' alt='QUATIC poster Edgar Gonçalves' src='http://farm2.static.flickr.com/1348/1393804924_6dcd41c7ac.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;By the way, I have to say I consider myself fortunate, as this short paper is now published in a IEEE Proceedings! So, do you have any more advices, or experiences you'd like to share?&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-8091729638335635300?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/8091729638335635300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=8091729638335635300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8091729638335635300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8091729638335635300'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2007/09/quatic07-academical-side.html' title='QUATIC07 - the academical side'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1348/1393804924_6dcd41c7ac_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-3388282323649664472</id><published>2007-04-20T13:54:00.001+01:00</published><updated>2007-07-17T14:46:12.195+01:00</updated><title type='text'>RIA and Flash</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Last Wednesday I went to a seminar on the application of Flash technologies to produce Rich Internet Applications. Adobe has certainly been busy for the past year, as we are far away from the "banners and intros" main purpose for Flash. Two main names pop-up for discussion: &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex 2&lt;/a&gt; and &lt;a href="http://labs.adobe.com/technologies/apollo/"&gt;Apollo&lt;/a&gt;.

Flex addresses the issue of producing web applications with Flash and ECMA Script (the ActionScript variant), in the same manner one would develop a HTML+Javascript solution. The coding language is named MXML, and allows to mingle the UI and the client-side scripting. The main advantages are the Flash remote communication capabilities (either via web services, flash remoting, and other RPC alternatives) and the Flash multimedia embedding. It's quite easy to add a video playing in a given canvas! As far as coding artifacts are concerned, all we need is at least an .MXML file, like the following:

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;

&amp;lt;mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" cornerRadius="12" alpha="0.7" borderStyle="none"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Script&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; import mx.collections.ArrayCollection;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [Bindable] public var people:ArrayCollection = new ArrayCollection(["one", "two"]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private function doAddClick(_name:String):void{
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; people.addItem(_name);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:Script&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:TextInput name="firstname" text="Type your name here"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Button label="Add it!" click="doAddClick({firstname})"/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:ComboBox dataProvider="{people}"&amp;gt;&amp;lt;/mx:ComboBox&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:FileSystemTree/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/mx:ApolloApplication&amp;gt;
&lt;/pre&gt;&lt;/blockquote&gt;
Yes, this is purely XML. One can add up pure actionscript files, wich, by the way, has some advantages over javascript (it's an OO language, for instance).


The main drawback (yes, there is one) is the IDE is not free (unlike the compiler and SDK - those are FOSS! Also, there's no DTD, or XSD available to use in XML development editors, so we will probably have to stick to an Eclipse plugin (paid Flex Builder) until an open source alternative comes around.

RIA has been forever tied to the sandbox concept: like all web applications, one can only access files that have been uploaded by the user in the present session. Another restraint is that a browser is needed to run the application. Here comes Adobe's Apollo. Take a Flex application, pass a short application XML descriptor, and with a couple of command line instructions you have a compiled and packed installer to a standalone windows/mac executable with the MXML contents. But they didn't stop there. Adobe also wants to catch up current HTML/JavaScript/AJAX developers, so Apollo also makes identical standalone applications out of pure HTML+JavaScript sites. But that's not all. to our coding pleasure, Apollo lets us access all Apollo's ActionScript facilities from Javascript, and vice-versa! This means one can code a javascript handler to access debug tracing, common dialogs, client-side file system, loke in the following example (taken from &lt;a href="http://weblogs.macromedia.com/mesh/archives/2007/03/simple_html_bas.html"&gt;Mike Chamber&lt;/a&gt;'s blog):
&lt;blockquote&gt;&lt;pre&gt;//called when button is pressed to select a file
function onFileClick()
{
 //this will trace out the string to the command line
 apollo.trace("hello");
 
 //get a reference to the desktop
 var f = apollo.flash.filesystem.File.desktopDirectory;
 
 //listen for the select event
 f.addEventListener(apollo.flash.events.Event.SELECT, onFileSelect);
 
 //open the browse dialog
 f.browse();

}&lt;/pre&gt;&lt;/blockquote&gt;Again, the SDK is (yet in alpha state) FOSS, but the IDE consists in an extension to Flex Builder, and thus is paid. But the technology itself seems quite promising. See &lt;a href="http://labs.adobe.com/technologies/digitaleditions/"&gt;Adobe Digital Editions&lt;/a&gt; for a quite nice real-world example.

In short, I'm impressed with Adobe Labs, and it seems there's more to come in the next couple of months!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-3388282323649664472?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/3388282323649664472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=3388282323649664472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3388282323649664472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3388282323649664472'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2007/04/ria-and-flash.html' title='RIA and Flash'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4100202081381200814</id><published>2007-02-15T17:54:00.001Z</published><updated>2007-02-15T17:54:07.555Z</updated><title type='text'>Free Lisp Executables in Windows</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;One of my latest projects has led me to think about making windows executables for a typical database application. The main requirement was using free software to make this project, so here's my starting point:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Clisp, 2.41 (2006-10-13) (full, with readline support)&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;ASDF&lt;/li&gt;&lt;li&gt;IDE: Emacs and SLIME (latest, from CVS at the date of this post)&lt;/li&gt;&lt;/ul&gt;The first issue I want to get behind is to make windows executables. If I can't make those, I might as well move to Python - but my programming language preference makes me stubborn about this one. I found out the magical command,&lt;b&gt; ext:saveinitmem&lt;/b&gt;. But this alone wouldn't work, and I got to the conclusion SLIME was the problem - the binary image would try to output to slime, and result in an error. The fix is simple enough - just don't load swank, and make the binary without slime. I made a convenience build.bat file, with the following:&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;c:\dev\clisp\full\lisp.exe -B c:\dev\clisp\full -M c:\dev\clisp\full\lispinit.mem -ansi -norc -q -i build.lisp&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;(don't forget to change clisp's path to your configuration). One more thing I noted was the dll's clisp uses had to be in the same directory as the produced executable. (find them under " &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Then, I put into build.lisp everything I want preloaded. ASDF, my project file loading, etc. and then, the magical function call (assuming an already loaded "test-app" package with a "main" function):&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;#+:clisp (ext:saveinitmem "test-app"&lt;br&gt;&lt;/br&gt;    :init-function #'(lambda ()&lt;br&gt;&lt;/br&gt;      (test-app::main))&lt;br&gt;&lt;/br&gt;    :NORC t&lt;br&gt;&lt;/br&gt;    :script t&lt;br&gt;&lt;/br&gt;    :start-package :test-app&lt;br&gt;&lt;/br&gt;    :executable t&lt;br&gt;&lt;/br&gt;    :quiet t)&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;All fine so far. The executable is not small, but being about 5MB makes it smaller than the ~30MB I would get with the latest SBCL (1.01) for windows. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Next challenge, the database connection. This was a lot more troublesome than I initially thought. &lt;a href='http://clsql.b9.com/'&gt;CLSQL &lt;/a&gt;was the elected choice, because I needed to access legacy data, initially from an Access .mdb file. I had to create an ODBC Data Source and use the clsql-odbc package to access it. I got this working in the clisp's repl, and then I made an image, run it and BOOM, all hell broke loose. &lt;a href='http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/1e203605f4c2fc35/'&gt;Here&lt;/a&gt; is a thread where I got some valuable hints, specially from Ken Tilton, whose Celtk package I used. What happened is that clsql uses CFFI, with cffi-uffi-compat to interface to foreign functions defined in external dll's (in the windows case). Two issues ate more of my time than I would like:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Each defcfun (i.e., foreign function interface defined) must be evaluated after having used/loaded (only once) the foreign library. Ok, that makes sense. What puzzled me was that, unline Allegro CL, Clisp (and sbcl, while we're at it) requires us to repeat this use/load-foreign-library each time an image is (re)started. This makes it a bit messier, as I have to choose (1) to load clsql at the image execution-time or (2) fetch the needed libraries from the clsql project, and load them in my main (initial) function. I opted from the second approach, for image load-time's sake. The required lines are something like: &lt;br&gt;&lt;/br&gt; &lt;blockquote&gt;(cffi-uffi-compat:load-foreign-library "clsql_uffi" :force-load t)&lt;br&gt;&lt;/br&gt;(cffi-uffi-compat:load-foreign-library "odbc32" :force-load t).&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;CLSQL uses a variable to represent a null C pointer. this is ok, except that this pointer is created one time, so after clisp loads the created image, this pointer is invalid, yielding errors every time they are used. Solution? I've simply replaced all *null-ptr* with (make-null-pointer :byte) and *null-handle-ptr* with (make-null-pointer :void). This made the trick, although incurring in a small performancing penalty - I'm not that desperate, yet :).&lt;/li&gt;&lt;/ul&gt;After this issues, I was able to read and write to my access database from my (now 6.5MB) executable. On to the next issue, the GUI. Ahh, this made me think of lots of variables:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Language integration with the graphics (consider making calls for foreign functions &lt;i&gt;vs.&lt;/i&gt; using simple abstractions in lisp);&lt;/li&gt;&lt;li&gt;Portability, I wouldn't like to build different GUI's for Mac and Windows, for instance;&lt;/li&gt;&lt;li&gt;Prettiness. Ok, It may be the best toolkit ever, but I may like to have, say, the xp look and feel. Or some other...&lt;/li&gt;&lt;li&gt;GUI design. There are some nice GUI designers out there, and there are some nice lisp abstrations to make the same result. What to choose?&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;Given this pre-requirements, my options for free were &lt;a href='http://www.wxcl-project.org/language/en/'&gt;wxCL&lt;/a&gt;, &lt;a href='http://common-lisp.net/project/graphic-forms/'&gt;graphic-forms&lt;/a&gt;, &lt;a href='http://www.tilton-technology.com/Celtk.html'&gt;celtk&lt;/a&gt;, &lt;a href='http://www.peter-herth.de/ltk/'&gt;Ltk&lt;/a&gt;, and &lt;a href='http://common-lisp.net/project/cells-gtk/'&gt;cells-gtk&lt;/a&gt;. (This list may not be comprehensive, feel free to comment, tell me about the amazing  /&amp;gt;&lt;br&gt;&lt;/br&gt;I tried wxCL first, as I'd already used wxPython, and felt at ease with wxGlade. So I started using it, created my first hello-world widget, and bang, had a whole lot of troubles, cffi related and others. I guess that they could be handled, but I would still be attached to the wxWidgets theme, not very handsome to me. For the same reason I ditched cells-gtk... I moved along, on to Graphic-forms. This is still in alpha stage, but is looking nice! Although, the interface is only for windows forms, and that makes it pretty useless in a mac/linux box. On I went, to the tcl/tk world. At first I thought I'd be attached to a specific theme/motif, but I've learned about &lt;a href='http://wiki.tcl.tk/11075'&gt;Tile&lt;/a&gt;, and this made the trick for me. So, how do I choose between Ltk and celtk? Well, Ken Tilton's Cells project, basically, prodded me towards celtk :) It's just a programming language decision, cells can be used to bind behaviors to certain parts of the GUI in an oh-so-elegant way, I was hooked soon enough! &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Ok, so what's the downside, you may ask? Celtk is still a work in progress, and is kind of not-ready for quick use/deployment. I also had cffi-related problems, simillar to those I had with clsql, and I worked around them with the following addition to may main function:&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt; (cffi::use-foreign-library "/dev/Tcl/bin/tcl85.dll")&lt;br&gt;&lt;/br&gt; (cffi::use-foreign-library "/dev/Tcl/bin/tk85.dll")&lt;br&gt;&lt;/br&gt; (cffi::use-foreign-library "/dev/Tcl/lib/tile0.7.8/tile078.dll")&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;&lt;br&gt;&lt;/br&gt;There's also lots of absolute paths to fix, in a decentralized way, the asdf is not up-to-date (Ken relies on ACL's *.lpr files), there's no readme/howto/start-here, and basically no homepage with this information. I think Ken is trying to get the project a home in http://common-lisp.net/, and meanwhile the comp.lang.lisp newsgroup will do to discuss issues we may have. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What I can say is that I've put his demo project, along with a sample MSAccess data access, in an ~8MB executable. I'm sure I can optimize this, but for me it's fair enough, and it loads fast enough for me!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Hope some of you may learn something from this. Feel free to shoot any questions, or suggestions you may have!  &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;powered by &lt;a href='http://performancing.com/firefox'&gt;performancing firefox&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4100202081381200814?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/4100202081381200814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=4100202081381200814' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4100202081381200814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4100202081381200814'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2007/02/free-lisp-executables-in-windows.html' title='Free Lisp Executables in Windows'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1797913875520655996</id><published>2006-11-28T19:12:00.001Z</published><updated>2006-11-28T19:12:09.795Z</updated><title type='text'>On thread persistence and migration</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Having contacted the Hop authors, I got a good feeling on their progresses, and I'm looking forward for the next (beta?) version. Also, they suggested me a PhD thesis, "A Portable Mechanism for Thread Persistence and Migration", whose details can be found in &lt;a href='http://www.cs.utah.edu/%7Etao/research/'&gt;Wei Tao's Ph.D. Research Page&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Her dissertation is a good explanation on how a Java program may be adapted into having support for thread suspension and resume. She based her work on a complete code re-writing (both at source and byte-code level), following a (theoretically correct) set of transformations. In short, a program must emulate the creation of a continuation on each code sentence, using an exception mechanism to capture the state of the running program. This exception usage is handy, because after catching an exception the code may throw it again, or store (persistently) the execution state. Obviously there's the problem of non serializable resources having to be saved and restored, and the local, temporary variables. Tao, cleverly leaves this issue to the application creator, with two resolution strategies:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Creating a wrapper class to the resource, that knows how to close and recreate it (e.g., close a file port and re-opening it a few days later);&lt;/li&gt;&lt;li&gt;Setting the an existing object field to the resource placed in a local variable;&lt;/li&gt;&lt;/ul&gt;It's relevant to note that Tao relies on the use of the &lt;u&gt;transient&lt;/u&gt; modifier, that makes such a field null when the object is serialized - having to be re-created on deserialization. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The process is heavily focused on the Java Virtual Machine, and the transformation is not proved to make such sense in other programming languages/environments. Nevertheless, the byte-code transformation strategy is well documented and several performance considerations are made throughout the dissertation. I, however, believe that this approach may be simplified - particularly the exception-based technique used to save/restore execution state - when the application is written in some other languages, like Scheme, that natively support first-class continuations.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Her motivation to this technique is well founded, focusing both portability (she may employ this transformations on several applications, and even with other programming languages, as long as their core is closely related to Java's) and code mobility (inevitably the best reason to save thread execution state and to be able to restore/resume it later, although "Moving long running applications from desktops to laptops and back also has clear appeal").&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;One interesting point she states from the beginning of the report is that &lt;b&gt;making a thread persistently saved is quite similar to having it migrated&lt;/b&gt; to another place, the difference being that the store is the run-time environment of another process/machine.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;If you're interested in execution-flow migration, thread state, and similar issues, I advise you to read this report, or at least to skim through it. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1797913875520655996?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1797913875520655996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1797913875520655996' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1797913875520655996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1797913875520655996'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/on-thread-persistence-and-migration.html' title='On thread persistence and migration'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4386542769696890999</id><published>2006-11-20T20:17:00.001Z</published><updated>2006-11-20T20:17:04.187Z</updated><title type='text'>Mosquito Lisp</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I stumbled upon Mosquito Lisp, and thought for a minute that it could be the adaptation to Termite's concepts into a more web-oriented strategy. But I was wrong, as it is only more focused on security measures, and leaves the main attraction in Termite behind - not only it does not allow the exchange of continuations, as it doesn't even consider them in the language (as with macros, now that we're at it!). This can make the dialect extremely simple to grasp and employ on real world cases, but it fails to make academic experiments with abstractions and other language tricks possible (at least throughout several machines!). Here's the link to the introduction:&lt;br&gt;&lt;/br&gt;&lt;a href='http://ephsec.squarespace.com/introduction-to-mosquito-lisp/'&gt;Ephemeral Security - Introduction to Mosquito Lisp&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4386542769696890999?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/4386542769696890999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=4386542769696890999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4386542769696890999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4386542769696890999'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/mosquito-lisp.html' title='Mosquito Lisp'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-7772724684644610821</id><published>2006-11-18T11:56:00.001Z</published><updated>2006-11-18T11:56:08.562Z</updated><title type='text'>Application interaction models</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I have assembled the interaction types I want to make possible in the near future. They assume a similar architecture to the one verified in current Web Applications, that is, a client-server architecture, a standard (mainstream) browser running on the client and an application container of your choice running on the server. But, unlike today's regular usage of this architecture, I want to allow some other application interaction models:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Client-Server code mobility&lt;/b&gt;, where the server may detect it is unable to compute every requested operation, and sends some of the (possibly still running) computations to the client for it to finish them. &lt;img src='http://www.gliffy.com/pubdoc/1106838/M.jpg'&gt;&lt;/img&gt; As I depict in the preceding diagram, after the client knows the code to the computation he needs to finish, it can gain the ability to perform it without accessing the server (unless there is some server-side information that needs to be fetched, obviously).&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Disconnected Execution&lt;/b&gt;. This sort of interaction is interesting as the client is able to work while being offline (or at least, disconnected from the server). The only requirement is that all of the functionality (perhaps organized in functional modules) and the related domain data must be fetched from the server: &lt;img src='http://www.gliffy.com/pubdoc/1039757/M.jpg'&gt;&lt;/img&gt; As one can see, this may pose other challenges, such as domain data access control (e.g., I may not be able to have full control to some objects that were being used by the server to produce the interface, and thus I cannot have that (whole) object on the client side).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Server replication&lt;/b&gt;, to grant reliability in the provided application. While there are several approaches to do server replication, all of them must allow messages that arrive to a front-of-the-line server to be replicated to all others (or at least the effects of processing the received message). This can be done by the exchange of continuations (see the Termite approach, in my previous posts). &lt;img src='http://www.gliffy.com/pubdoc/1106840/M.jpg'&gt;&lt;/img&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Inter-client interactions&lt;/b&gt; are the most uncommon model, when compared to existing uses of Web Applications. &lt;img src='http://www.gliffy.com/pubdoc/1106836/M.jpg'&gt;&lt;/img&gt;In the "several interactions" arrows can be two main types of communication. There can be only &lt;b&gt;data exchange&lt;/b&gt;&lt;i&gt;, &lt;/i&gt;like in instant messaging, white-boards or on-line games. But there may also be &lt;b&gt;execution flow exchange&lt;/b&gt;. You can have two clients making parallel computations, in a sort of collaborative processing. You can also have ubiquitous execution, like having a smart-phone "pick up" the application execution from the desktop computer's browser and carrying on with it.&lt;/li&gt;&lt;/ul&gt;While this list may not be complete, it is my starting point. Off course I'll add more examples or complete/modify the existing ones if I see it necessary.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Have a nice weekend!&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-7772724684644610821?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/7772724684644610821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=7772724684644610821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7772724684644610821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7772724684644610821'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/application-interaction-models.html' title='Application interaction models'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-5739016157653525267</id><published>2006-11-15T01:42:00.001Z</published><updated>2006-11-15T01:42:02.758Z</updated><title type='text'>Mobile computations example</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;In an attempt to use a new Web diagramming tool (&lt;a href='http://www.gliffy.com'&gt;Gliffy&lt;/a&gt;), I just put into a simple time-line an example of what I want to make possible with my project:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div align='center'&gt;&lt;img src='http://www.gliffy.com/pubdoc/1104850/M.jpg'&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;div align='left'&gt; Basically it is a client that starts by asking the server for a specific code execution. the server, however, opts to stop the execution midway, and transfers its work in progress to the client. Now a couple of noteworthy behaviors can be verified on the client:&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;The client finishes the remainder of the computation, not contacting the server anymore in the process;&lt;/li&gt;&lt;li&gt;The client now knows how to make that kind of computations, so it will never bug the server again for that.&lt;/li&gt;&lt;/ol&gt;I'll welcome any comment on this idea, specially constructive criticism :)&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-5739016157653525267?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/5739016157653525267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=5739016157653525267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/5739016157653525267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/5739016157653525267'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/mobile-computations-example.html' title='Mobile computations example'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-2971397918922220075</id><published>2006-11-14T15:43:00.001Z</published><updated>2006-11-14T15:43:16.638Z</updated><title type='text'>How distributed mobile computing resembles a JIT compiler</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;The Just In Time (JIT) compiler used in the Java Virtual Machines (JVM) is the tool responsible to compile Java bytecode into native platform code, thus granting the application improved execution speed on certain operations.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;How can this be comparable to distributed mobile computing? Like I stated in previous posts, I intend to be able to migrate code that is currently being executed into other machines, and resume it's execution there. Let's analyze what this means from the client application's point of view:&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;The client is viewing a page that accesses a procedure that is currently being executed on the server. Thus it calls it with a call (possibly an asynchronous one) to the server, and sets a callback function to receive the server answer;&lt;/li&gt;&lt;li&gt;The server opts to send that computation to the client, so it does so (let's assume for now that it uses a Termite-like approach to do so);&lt;/li&gt;&lt;li&gt;The client has now the task of storing the received computation is some JavaScript callable form, so that it can call it directly instead of using the RPC and callback he used before.&lt;/li&gt;&lt;/ol&gt;To do this, he changes the way he calls a given functionality. Which is pretty much the same thing the JIT compiler does. The JVM stores a couple of Virtual Tables (V-Tables) with the addresses of every functions. In the first, it stores pointers to the source code, while the second stores pointers to byte-compiled functions. The first times the code is called, the JVM uses the first V-Table, but calls the JIT to make the compilation and fill in the address in the second V-Table. This way, subsequent calls to the functions will be directed to the byte-compiled file, directly, in a transparent way for the application code.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This can be used as an inspiration for code mobility: Both the client and the server may store tables for each procedure that may be subject to migration, associated with the local address or the particular remote call mechanism, along with a flag that states which method is used currently. The problem still is what information is relevant for each function execution. This single table would suffice if we wanted static code migration. But if we want to migrate running code, we have to consider every function that can be used within the running code. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This topic is still fresh, and I will have to do some experimentations before I can have a more conclusive opinion. But I have a good feeling about this mechanism when associated with a Termite-like code migration technique!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-2971397918922220075?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/2971397918922220075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=2971397918922220075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2971397918922220075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/2971397918922220075'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/how-distributed-mobile-computing.html' title='How distributed mobile computing resembles a JIT compiler'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4578466177390577287</id><published>2006-11-13T20:20:00.001Z</published><updated>2006-11-13T20:20:39.341Z</updated><title type='text'>Inria's Hop</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I finally got to read both technical papers on &lt;a href='http://hop.inria.fr/usr/local/share/hop/weblets/home/articles/hop-lang/article.html'&gt;Hop&lt;/a&gt; (found in &lt;a href='http://hop.inria.fr/'&gt;Hop Home page&lt;/a&gt;), and I can now make a reasonable comparison between their approach and Termite's. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;First let's describe Hop's in a few sentences. Being aimed at Web applications development, Hop is mainly a programming language that separates the application logic from the interface definition, while maintaining a single coding artifact for the application. The language is built upon Bigloo Scheme, so that servers may import several useful libraries. The core features of Hop are:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;server services &lt;/b&gt;- defined just like a regular function, with the macro 'define-service', can do basically anything on the server.&lt;/li&gt;&lt;li&gt;&lt;b&gt;interface&lt;/b&gt; - created with macros that resemble the HTML tags, interfaces are a declaratively constructed HTML tree. They can contain scripts with Scheme code of two different natures: &lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Client-side code, translated automatically from to JavaScript;&lt;/li&gt;&lt;li&gt;Server-side code, mixed within client-side scripts but prefixed with a special character. This code is translated to the appropriate asynchronous server calls, and every exchanged object is automatically mangled/de-mangled (JSON can be used to read server responses on the client).&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;One of the things that pops out when you see a Hop application is it's elegance, as everything is written in a single file using the same programming language, despite addressing the two important application "strata" (server logic and user interface). The continuous bidirectional communication (and data exchange) between  the client and servers is accomplished via asynchronous remote function calls to the server and by setting events on the client that are triggered upon a server's reply - enabling both &lt;b&gt;push and pull communication models&lt;/b&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Another interesting fact is the execution model Hop uses. It is based on several engines running for a single application: One for the UI processing, and other(s) to the application logic. The URL start-point loads the UI engine, and henceforth it is responsible for calling other engines as other functionality is needed. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;But Hop isn't perfect. Let's take a closer look at the service model. As it is, Hop creates an URL for each server call needed in the UI strata. Each URL is stored in a server-side table, that is never cleansed - even temporary URL's used for anonymous services are kept indefinitely. This could be resolved (as the authors briefly point out) by exchanging closures (both the server function identifier and all the necessary variables in the environment) with the client. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;By now, we can understand another weakness of Hop. Hop uses &lt;a href='http://hop.inria.fr/usr/local/share/hop/weblets/home/articles/scheme2js/article.html'&gt;SCM2JS&lt;/a&gt;, which translates Scheme code into JavaScript and allows both languages to work seamlessly within the same memory space. However, as technically close as the languages may be, the translation fails in some key aspects, such as the Scheme support for continuations. The authors state that this could be done whether by the use of trampolines or by the translation into Continuation Passing Style (as specified by Henry Baker's &lt;a href='http://home.pipeline.com/%7Ehbaker1/CheneyMTA.html'&gt;paper&lt;/a&gt;), but would always create performance penalties. However, with support for continuations, Hop could easily get all Termite's mobile code functionality, like replication or execution migration between processes. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In my opinion, even if Hop can do such code migration with continuations, it's still weaker than Termite, as it's goals are (currently) too low. They want to build simple Web applications based on interactive operations. They wouldn't be able to build a peer-to-peer application with a Web Interface using code migration between clients, as the concept of client is mangled in the Scheme code as being the UI strata. Termite's approach, on the other hand, clearly considers processes, and that seems to make sense to me, as both clients and servers can currently play the same roles, with bidirectional client-server communication.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Before I wrap-up this Hop analysis, it's relevant to point out other weaknesses of the SCM2JS:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;exact Scheme numbers are currently mapped to floating-point JavaScript numbers;&lt;/li&gt;&lt;li&gt;Errors in Scheme are not necessarily errors in JavaScript, as the translation leaves erroneous Scheme code in executable JavaScript code (like the concatenation of two objects, (+ "a" 2) is translated to "a"+2, which yields "a2" and not an error);&lt;/li&gt;&lt;li&gt;features like &lt;i&gt;call/cc&lt;/i&gt; and &lt;i&gt;eval&lt;/i&gt; constructs are not translatable, yet.&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt; I hope Hop evolves into a great tool. Also, Bigloo Scheme, as well as Hop, need to be executable on Windows boxes, to gain the deserved popularity!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4578466177390577287?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/4578466177390577287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=4578466177390577287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4578466177390577287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4578466177390577287'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/inrias-hop.html' title='Inria&apos;s Hop'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1654233220144613105</id><published>2006-11-08T02:48:00.001Z</published><updated>2006-11-08T14:03:23.833Z</updated><title type='text'>Disconnected browsing</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;One of my current activities' main goals is to produce the necessary infrastructure for a web application to be used offline. While the term &lt;b&gt;disconnected browsing&lt;/b&gt; is becoming obsolete - Web applications now offer users a decent graphical (web) interface, not a bunch of HTML documents interlinked in a browseable manner - I'll stick with this denomination for the time being, until a better one comes arround.

My research for now has been centered on the first Web architecture, the browseable type. Even so, up until 1997 there's not much public research on this matter, and the material I've found isn't what I'm looking for.


In &lt;a href="http://citeseer.comp.nus.edu.sg/kavasseri96web.html"&gt;Web Intelligent Query - Disconnected Web Browsing using Cooperative Techniques - Kavasseri, Keating, Wittman, Joshi, Weerawarana (ResearchIndex)&lt;/a&gt; - it's clear that even then the Web model wasn't appropriate for disconnected browsing. They identified that, in order to browse the Internet, one would have to:

&lt;ul&gt;&lt;li&gt;Know a set of known starting points;&lt;/li&gt;&lt;li&gt;Have a constant network connection;&lt;/li&gt;&lt;li&gt;Filter lots of useless information;&lt;/li&gt;&lt;li&gt;Put up with bandwidth shortage and frequent link faillures (mainly with mobile devices, but also by elected network disruption, e.g. for battery power saving).&lt;/li&gt;&lt;/ul&gt;The authors state right from the beggining that the proposed solution targets static Web information. I know, this makes this solution useless for today's Web model, but I wanted to read on, just to check if there was some valuable idea. But they propose an architecture based on an "intelligent" proxy, one that stands between the browser and the Web, and is responsible for making both IR (Information Retrieval), based on users requests and IG (Information Gathering), based on guessed pro-actively retrieval of information (&lt;a href="http://citeseer.comp.nus.edu.sg/87467.html"&gt;Cooperative Information Gathering: A Distributed Problem Solving Approach - Oates, Prasad, Lesser (ResearchIndex)&lt;/a&gt;). They have some interesting related work, but the one that caught my eye was a paper on &lt;b&gt;usage patterns detection&lt;/b&gt;, for production of browsing related tasks automations (&lt;a href="http://citeseer.comp.nus.edu.sg/pitkow94integrating.html"&gt;Integrating Bottom-Up and Top-Down Analysis For Intelligent Hypertext - James, Margaret, Recker (ResearchIndex)&lt;/a&gt;).



The concept of disconnected browsing for them demands a very strict flow, from the user (client) standpoint:

&lt;ol&gt;&lt;li&gt;The client requests a set of information;&lt;/li&gt;&lt;li&gt;The proxy makes its magic, fetches data from the web - it is permanently online! - and processes the request;&lt;/li&gt;&lt;li&gt;The client asks for the fetched results;&lt;/li&gt;&lt;li&gt;The client processes the information;

&lt;/li&gt;&lt;li&gt;The client sends feedback to the proxy.&lt;/li&gt;&lt;/ol&gt;During this steps, the authors consider that being offline during steps 2 and 4 grants the client the designation of a disconnected browser...



I intend to shed some light of the concept of disconnected execution of Web applications. This has lots of non-trivial obstacles, like

&lt;ul&gt;&lt;li&gt;the existence of dynamic information;&lt;/li&gt;&lt;li&gt;the concurrent access to mutable, persistent server-side information;&lt;/li&gt;&lt;li&gt;the nature of the graphical interface being no longer a single (nor static) HTML page.&lt;/li&gt;&lt;/ul&gt;The usage model is also diffente, as the client must pre-fetch some portion of application and data, and then must be able to go offline and play arround with it. After he comes up online, the application must somehow synchronize his changed information with the server's - which, by the way, may envolve complex conflict resolution and/or merge rules for specific information types.



From this paper, however, there are some good contributions to my project:

&lt;ul&gt;&lt;li&gt;Disconnected information becomes much smaller if we know &lt;i&gt;a priori&lt;/i&gt; what to download. So it would be a good idea to detect what the user commonly does, his usage patterns!&lt;/li&gt;&lt;li&gt;It may be usefull to have a separate agent responsible to fetch the application code/data to be downloaded to the client. As this can be computationally heavy task, having the web server do it may cause serious performance issues.

&lt;/li&gt;&lt;/ul&gt;Right now I'll keep looking for other disconnected Web usage papers and projects - I'd like to see something recent, at least not older than 5 years! I know that when I reach Coda's documentation, I'll be too far from the model I want, but eventually I'll have to get down to it, as it has some good, well documented merging techniques.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1654233220144613105?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1654233220144613105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1654233220144613105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1654233220144613105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1654233220144613105'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/disconnected-browsing.html' title='Disconnected browsing'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-91876125188257963</id><published>2006-11-05T14:42:00.001Z</published><updated>2006-11-05T14:42:13.121Z</updated><title type='text'>Concurrency in a web platform with distributed computing</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Right now, it's clear whatever platform is to be the key for a Web application success, it must be based on a client-server architecture, something with the look and feel of the so-called Web 2.0 applications. That is, I want to use a Web platform to implement the aplication GUI, just as if it was a desktop application.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Wrt. the concurrency model, I would like to have multiple clients accessing simultaneously to the same application. Off course faillures on certain nodes (either clients or servers) must also be considered. Lastly, I want to be able to make computations on both the client and the server side.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Without having a Web architecture, I can find three approaches to the concurrency aspect:&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Shared space&lt;/b&gt;: By using a memory space shared by all interested nodes, one can make applications by building (complex) contraptions with locks and semaphores. It's tedious, error-prone, and is generaly considered to be avoided in medium-large applications.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Message passing&lt;/b&gt;: Using the Actors approach in which everything is an object that is operated solely by exchanging messages with it. Most of the times this is simplified to the model where only processes (or nodes, or threads) send messages to each other (like Erlang)&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Declarative data flow&lt;/b&gt;: this is the model used by Termite, and I've described it extensively in the previous post. In short each process can send messages, data, and execution-flow to another process.&lt;/li&gt;&lt;/ol&gt;From these three, the third seems to solve more issues:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Doesn't need the coding complexity needed in the shared data management;&lt;/li&gt;&lt;li&gt;Does not demand separate programming of paralel processes;&lt;/li&gt;&lt;li&gt;Declarative DSL's save lots of code lines, with abstractions based on continuations replication between nodes&lt;/li&gt;&lt;/ul&gt;With the Web architecture in mind, we must consider at least the following questions:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;How are computations going to be transferred to a given client or back to the server?&lt;/li&gt;&lt;li&gt;How will the computation be transferred at any point of the application execution?&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;Given the bandwidth current limitations, how are computations going to be serializable? In processes, continuations, closures? What is the relevant minimal data set that need to be passed along the wire?&lt;/li&gt;&lt;li&gt;It is a fact that the client must have an engine (in ECMA Script, I suppose) to process some part of the application - either the user interface or the domain application logic. This engine must be prepared to receive this sort of computations from other nodes (as well as to send some back to them).&lt;/li&gt;&lt;/ul&gt;This questions are good guides to the next stage of my research. I'll make sure to post the answers I (hopefully) find.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-91876125188257963?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/91876125188257963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=91876125188257963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/91876125188257963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/91876125188257963'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/concurrency-in-web-platform-with.html' title='Concurrency in a web platform with distributed computing'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-7135029184828058717</id><published>2006-11-05T01:33:00.001Z</published><updated>2006-11-05T01:33:33.477Z</updated><title type='text'>Termite - the light at the end of the tunnel?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Last month I started looking at&lt;b&gt; Termite&lt;/b&gt;, a Scheme-like language to produce concurrent and parallel programs. It's now time to make the relevant comments, based on the paper (read it &lt;a href='http://www.iro.umontreal.ca/%7Egermaing/termite.pdf'&gt;here&lt;/a&gt;) and directed to my PhD purpose - Webapps Interfaces development in the Web 2.0 new world.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The first thing worth making clear is the concept of &lt;b&gt;distributed computation&lt;/b&gt;s. These are concurrent programs (lightweight processes), potentially physically isolated. The data transfer between each process is made via message passing. This is based on the Actors approach, and can also be verified in Erlang. This model carries the burden of the need of functionality on the programs code. In other words, mutation cannot be done in Termite. Fortunatelly, it is possible to emulate the same behaviour by representing the "mutable" state in a process, and using a message dispatch mechanism (and representing an object in a separate process).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Processes are isolated, even if they are on the same physical node. This makes the concurrent model quite simple, as there is no shared memory, no mutexes to handle and, additionally, there is &lt;b&gt;no need of a distributed garbage collector&lt;/b&gt;!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The message sending is done using a single mailbox per process, with assynchronous sending (the send and pray model!) and synchronous receiving. Also, Termite assumes that connections cannot be trusted as being reliable, thus assuming the possibility of failure. Since there is &lt;b&gt;no message delivery guarantees&lt;/b&gt;, there also are &lt;b&gt;no correct order of reception guarantees.&lt;/b&gt; Termite leaves the burden of dealing with this to the application code, by using timeouts mechanisms. Luckilly, Termite has a way of propagating exceptions between two related processes, using Erlang-like bi-directional links, but also using a one-way-only link between two processes. Finally, Termite supports tags in each sent messsage, thus being able to mimic a multiple-channel model in a single-channel architecture. This tag system can also be used in the timeout message detection system!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;One interesting aspect is the worarround to make every object serializable. Non-serializable objects are proxied by using a process to represent them, so e.g., each port can be serialized using only a PID! This means we can send a message to the screen, or receive a message from an input device, which gives us a great sense of liberty on our programs!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;When comparing to &lt;b&gt;Erlang&lt;/b&gt;, aside from the &lt;u&gt;Lisp-like syntax&lt;/u&gt; and the &lt;u&gt;one-way links between processes&lt;/u&gt;, Termite also provides support for &lt;u&gt;first class serializable continuations&lt;/u&gt;.&lt;br&gt;&lt;/br&gt;The related work also indicates that &lt;b&gt;Kali &lt;/b&gt;uses a &lt;u&gt;lazy closure code transmition between processes&lt;/u&gt;, along with a &lt;u&gt;cache system&lt;/u&gt;, that could help improve the code!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;After reading this, there are a couple of questions to ask about Termite: What does it take to build a web framework using this kind of comunicating processes, and what's missing to be able to fulfill my PhD requirements.&lt;br&gt;&lt;/br&gt;The first question is answered in the Termite paper, by Dynamite. Unfortunatelly, I wasn't able to find any proper documentarion/web page/binaries/other material related to it. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So let's talk about what Termite can do for me, and what it can't do. If we want to use the comunicating processes model, we can envision a client being a process that sends messages to a given node on the server. This node can be connected to others, making server replication a trivial task to do (the Termite paper illustrates this behaviour). I would like to have reliability on the message sending, so this would have to be added as a layer to the Termite framework, using some sort of timeout detection. I would also like to know that the delivery order is respected in every message, so that should also be granted at the message-sending protocol level, as well. Let's say that this would be enough, for now (and leave "minor" details like scalability and speed behind!). Since we can propagate messages between Termite processes, the trivial way to achieve this would be to integrate a Termite engine within a JavaScript client-engine. I can think of a couple of ways to do this. The first is simply to &lt;b&gt;implement the Termite&lt;/b&gt; (and all of the Gambit-C dependencies) &lt;b&gt;in Javascript&lt;/b&gt;. The other is to analyse the messages that need to be sent through processes, and &lt;b&gt;produce a platform independent protocol&lt;/b&gt; (at least, to enable a JavaScript client to talk to a Termite one :) )&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I know this is still a bit hard to achieve, and I should look into other approaches before trying this. But just imagine being able for a server to start by making all of the application computation. Then, as the server machine decides it is fed-up, or if it is simply bloated, then it spawns another server in a neighbour node, and transfers the computation to it. Also imagine a more complex load-balancing mechanism being implemented between the servers. It's all very interesting (I guess this is what should be being done in the Dynamite project!), but I must confess the fun part is between clients and servers. The server finds out, after a while, that the client is able to do some processing, and it transfers a continuation with the job to be done on the client-side. Since each process can update the running code during its execution, this would be easily achieved. Now the sky is the limit, since not only we can have code execution being swaped from the client to and from the server, but we also can envision collaboration between clients, without any kind of server interaction! If this isn't enough, lets remember that the communication is reliable. Oh, and that by now we already have a fault-tolerant (replicated) server system! We could even imagine a client being able to detach itself from its server, going offline, keep on working and then synchronizing with any server when it gets back online. The implications on these kind of scenarious are a bit different than the message passing model, as we need to consider the domain structure of the application, access control, the ammount of data the client needs to own in its machine to operate, among other important issues.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Sorry for the long post. I guess If you got this far, you might as well have some opinion on this matter, so please, leave a comment!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Ta ta...&lt;br&gt;&lt;/br&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-7135029184828058717?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/7135029184828058717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=7135029184828058717' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7135029184828058717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7135029184828058717'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/11/termite-light-at-end-of-tunnel.html' title='Termite - the light at the end of the tunnel?'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-6314136784850262312</id><published>2006-10-22T01:11:00.001+01:00</published><updated>2006-10-22T01:11:32.082+01:00</updated><title type='text'>Lisp Interpreter in JavaScript</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;After checking out &lt;a href='http://www.parkscomputing.com/js/lisp.js'&gt;this&lt;/a&gt; JavaScript file, and another similar approaches, I found out that this is not exactly what I was looking for. Here's what I have in mind, for a virtual machine on the client-side:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;I need it to run code specifically designed to it. (Right now, anything must do, but I need it to be able to translate it to valid client actions - aka, use something like JavaScript, DOM, CSS, etc, etc.&lt;/li&gt;&lt;li&gt;I need it to be modified from the server (i.e., to upload code changes)&lt;/li&gt;&lt;li&gt;I need to have some sort of support for a set of language constructs and basic types, including continuations. So I probably need to serialize everything.&lt;/li&gt;&lt;li&gt;I need to consider the drawbacks of maintaining all of the variables in the continuation's environment. One simple closure may be small, but the full environment - needed to make good use of dynamic variables - can become quite large. Note that some tests are in order to make this assert valid!&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;The downside of the Lisp Interpreter I checked is that everything is automatically translated to a Javascript object. That's not what I need, since I need the code to be able to travel back into the server. I only need it to be evaluated on JavaScript. (This also means I can use a portion of this code, like the tokenizer and/or parser!)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;More to come...&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-6314136784850262312?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/6314136784850262312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=6314136784850262312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6314136784850262312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/6314136784850262312'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/lisp-interpreter-in-javascript.html' title='Lisp Interpreter in JavaScript'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-8619077054345935314</id><published>2006-10-21T12:24:00.001+01:00</published><updated>2006-10-21T12:24:19.959+01:00</updated><title type='text'>The Law of Notepad</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Taken from Continuing Intermittent Incoherency blog:&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;&lt;b&gt;&lt;br&gt;&lt;/br&gt;The Law of Notepad&lt;/b&gt;: if creative people can’t make something awesome using the lamest of production tools, your platform is gonna loose.&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-8619077054345935314?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/8619077054345935314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=8619077054345935314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8619077054345935314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8619077054345935314'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/law-of-notepad.html' title='The Law of Notepad'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-86341721950632911</id><published>2006-10-19T21:21:00.001+01:00</published><updated>2006-10-19T21:21:36.120+01:00</updated><title type='text'>OpenAjax Hub</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Here is a quote from Coach's blog, related to the main challanges that OpenAjax is trying to address to get interoperability:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href='http://www.coachwei.com/blog/_archives/2006/10/8/2396757.html'&gt;coachwei.com :: OpenAjax Update - Addressing Key Challenges for Ajax Adoption&lt;/a&gt; :&lt;br&gt;&lt;/br&gt; &lt;blockquote&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;# Toolkit “loading and unloading”&lt;/b&gt;(the capability to load and unload more than one Ajax toolkits into one page): For example, right now a lot of toolkits overload the “onload” function, which will certainly cause collision with another toolkit; &lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;# Name collision&lt;/b&gt; (the capability to deal with variable and function name collision). For example, quite a few Ajax toolkits today use “$” as a function name. When they are all loaded onto the same page, what happens? &lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;# Event Hub&lt;/b&gt; (The capability to have interaction between different Ajax toolkits). The key requirement here is to enable some kind of “event” propagation so that an event generated from toolkit A can be processed by toolkit B. An example is that the user drags an item from Toolkit A and drops it on Toolkit B – how should this two toolkits communicate the information related to this event? The proper solution is to provide a common event hub that each Ajax toolkit can publish and subscribe events. Initially, we do not have to define the details of different event objects, which can be defined in the future. &lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;# Markup scanning&lt;/b&gt; (the capability for an Ajax toolkit to scan an HTML document to pick up the interested markup segments for processing): many Ajax toolkits allow the usage of markup to define components within an HTML page but they all have their own mechanism of scanning the document. If more than one toolkit is loaded, the HTML document maybe scanned multiple times with the danger of causing significant inefficiency and collision. Providing a common mechanism to scan an HTML document would solve this problem. &lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;# Network Hub&lt;/b&gt; (server connectivity management): most browsers allow only limited number of connections to the server (for example, Internet Explorer allows only two). If each Ajax toolkit uses its own mechanism to handle server connectivity, it is highly likely collision will happen if more than one Ajax toolkits are loaded on the same page. A proper solution is to provide a common mechanism that centrally manages server connectivity and serves all registered toolkits.;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Apart from this list, they point out other missing factors, but that shall not be addressed by OpenAJAX. They are &lt;b&gt;performance issues&lt;/b&gt;, the &lt;b&gt;multiple toolkit bloating&lt;/b&gt; problem, whether there are &lt;b&gt;security&lt;/b&gt; issues with AJAX, and if so, how do they die. Other interesting problems arise with &lt;b&gt;mobility and offline execution of AJAX-based code&lt;/b&gt;, as well as with &lt;b&gt;application development and maintenance&lt;/b&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;These last two are particularly interesting to my work. The mentioned post talks about a blog with mobility issues: &lt;a href='http://www.sitepen.com/blog/category/mobile/'&gt;SitePen Blog » mobile.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-86341721950632911?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/86341721950632911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=86341721950632911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/86341721950632911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/86341721950632911'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/openajax-hub.html' title='OpenAjax Hub'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1523668841806928312</id><published>2006-10-19T02:45:00.001+01:00</published><updated>2006-10-19T02:45:05.738+01:00</updated><title type='text'>HTTP is dead. All hail Web Messaging Protocols!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;It has become very clear that HTTP doesn't serve current Web needs and purposes. So why does it remains the sole winner of the communication protocol in the Web? This is simple, really. Every browser knows how to speak HTTP, and since it's a pretty simple protocol, nobody seems eager to move a multitude of users into a paradigm shift.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The tough question is related to the solution, instead of being centered on the problem space. Where do we go from HTTP? What do we need? Most aplpications today are struggling to find a proper way to communicate with the server. &lt;a href='http://alex.dojotoolkit.org/?p=545'&gt;&lt;b&gt;Comet&lt;/b&gt;&lt;/a&gt; strategies provide bi-directional messaging between a client and a server. &lt;a href='http://www.coachwei.com/blog/_archives/2006/10/13/2414519.html'&gt;&lt;b&gt;Internet Messaging Bus&lt;/b&gt;&lt;/a&gt; goes a step further, granting the following properties to the communication protocol:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Guaranteed message delivery&lt;/li&gt;&lt;li&gt;Guaranteed order of delivery&lt;/li&gt;&lt;li&gt;Once and only once delivery&lt;/li&gt;&lt;li&gt;Both &lt;i&gt;client pull&lt;/i&gt; and &lt;i&gt;server push&lt;/i&gt; data fetching models.&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;This seems to be the end of the AJAX hype, as it is know. That is, the XMLHttpRequest, by itself, doesn't grant all those nice things to any WebApp. However, the word seems to be catchy, and &lt;a href='http://www.openajax.org/'&gt;people&lt;/a&gt; seem to want to stick with it for a bit longer, and the current bet is a messaging protocol.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;See:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://blogs.webtide.com/gregw/2006/10/18/1161164940000.html'&gt;XmlHttpRequest BAD - Messaging GOOD - Greg's blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://alex.dojotoolkit.org/?p=545'&gt;Comet: Low Latency Data for the Browser&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.theserverside.com/news/thread.tss?thread_id=42641'&gt;Web 2.0 Communication Layer: from HTTP to Comet to Internet Mess&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.coachwei.com/blog/_archives/2006/10/13/2414519.html'&gt;coachwei.com :: Web 2.0 Communication Layer: from HTTP to Comet to Internet Messaging Bus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.openajax.org/whitepaper.html'&gt;OpenAjax Alliance White Paper&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-1523668841806928312?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1523668841806928312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1523668841806928312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1523668841806928312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1523668841806928312'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/http-is-dead-all-hail-web-messaging.html' title='HTTP is dead. All hail Web Messaging Protocols!'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-4571254751230366290</id><published>2006-10-18T20:09:00.001+01:00</published><updated>2006-10-18T20:09:12.592+01:00</updated><title type='text'>Process execution mode swapping</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Another aspect that is relevant for my PhD is the exchange of information between the client(s) and the server(s). To make a pictorical description, imagine a situation where a client walks into a web application, which is running entirely on the server. The server then sends some of the computations to be executed on the client, e.g., for performance reasons. After a while, the client may take too long to execute a certain computation and transfers it, along with the already processed information, back to the server.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This situation can be compared to the Java Bytecode execution done by the Just In time compiler. The VM starts by interpreting code, then after a few iterations, it boosts up the compiler and the code that was being called is now fetched from a compiled source.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What I mean to inspect is if I can take some of these ideas and port them into a Web architecture.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In &lt;a href='http://sisc.sourceforge.net/documentation.php'&gt;SISC - Documentation&lt;/a&gt;, we can see that the Scheme interpreter can also run byte-compiled Java code. I must now find out how does it swap the execution context between those two modes, and what considerations are being done.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-4571254751230366290?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/4571254751230366290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=4571254751230366290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4571254751230366290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/4571254751230366290'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/process-execution-mode-swapping.html' title='Process execution mode swapping'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-567080639467469382</id><published>2006-10-18T19:23:00.001+01:00</published><updated>2006-10-19T00:43:44.942+01:00</updated><title type='text'>Interpreters in JavaScript</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Before discussing Termite (it deserves a post for itself), I'll post a series of links to attempts to write language interpreters in JavaScript. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;First, the motivation: As I need to create a framework to build web applications with certain characteristics built-in the client-server communication infrastructure, I need to do constant experimentations with the client capabilities. Considering that the majority of clients are able to run a javascript interpreter within the browser, it seems to be the best bet, for compatibility sakes.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A list of links to different approaches follows. For some pages, The only interesting reading material is on the Javascript that is embbeded in the source html code, so you have to dig into that.&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://fresh.homeunix.net/%7Eluke/jscm/repl.html'&gt;Interactive Scheme&lt;/a&gt; (see http://fresh.homeunix.net/~luke/jscm/scm.js.txt)&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.parkscomputing.com/lisptest.html'&gt;Lisp Interpreter in JavaScript&lt;br&gt;&lt;/br&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://justice.loyola.edu/%7Emcoffey/pr/5k/'&gt;A Brainfuck interpreter in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.crockford.com/javascript/little.html'&gt;The Little JavaScripter&lt;/a&gt; and the &lt;a href='http://www.crockford.com/javascript/scheme.html'&gt;Little Scheme&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.joeganley.com/code/jslisp.html#Intro'&gt;Joe Ganley's Lisp in JavaScript&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;Conclusions on whether this will or will not be usefull may come up on future posts!&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;&lt;a href='http://www.joeganley.com/code/jslisp.html#Intro'&gt;&lt;br&gt;&lt;/br&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-567080639467469382?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/567080639467469382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=567080639467469382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/567080639467469382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/567080639467469382'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/interpreters-in-javascript.html' title='Interpreters in JavaScript'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-8804034878213623529</id><published>2006-10-15T13:03:00.001+01:00</published><updated>2006-10-15T13:03:59.285+01:00</updated><title type='text'>A Common Lisp Post</title><content type='html'>This is my first post sent via my Common Lisp Atom interface. It uses the JLinker to call the Java Google client API methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-8804034878213623529?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/8804034878213623529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=8804034878213623529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8804034878213623529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/8804034878213623529'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/common-lisp-post.html' title='A Common Lisp Post'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-7560398595022030079</id><published>2006-10-10T13:39:00.001+01:00</published><updated>2006-10-10T13:39:13.734+01:00</updated><title type='text'>Termite - concurrent and parallel programming in Lisp</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;This is a simple tutorial for Termite, made by its author:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href='http://bc.tech.coop/blog/060122.html'&gt;Bill Clementson's Blog: Update on Termite (A Lisp for Concurrent/Parallel Programming)&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;After reading the paper on it I'll make a proper review, but I like the side remark on a file upload procedure definition: &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;&lt;span class='rss:item'&gt;this program has about the same number of lines of code
as a minimal "hello world" program in Java.
&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-7560398595022030079?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/7560398595022030079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=7560398595022030079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7560398595022030079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/7560398595022030079'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/10/termite-concurrent-and-parallel.html' title='Termite - concurrent and parallel programming in Lisp'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-1860662044516113884</id><published>2006-09-26T10:58:00.000+01:00</published><updated>2006-09-26T10:58:12.817+01:00</updated><title type='text'>Google Web Toolkit experiences</title><content type='html'>I just started toying arround with GWT (Google Web Toolkit). Here's my thoughts so far:
&lt;ul&gt;&lt;li&gt;[GOOD THING] It makes the building and running on the development environment simple. It doesn't offer the flexibility of a running interpreter, but it provides two commands (scripts), one for compiling and another for running a box (development shell) that is an application container (tomcat based) with a small browser for a quick test.&lt;/li&gt;&lt;li&gt;[GOOD THING] An application has to import only a couple of jar's to run&lt;/li&gt;&lt;li&gt;[BAD THING] We have the old Template Model problem. We have two source folder structures, one "client" with the java files, and a "public" with the html templates, images, CSS, and other files to be published directly. The HTML templates should contain id's called "slot1", "slot2", and so on, for each object that is placed with Java to be attached to a certain place in the template... Is this horrible or what? The good thing is that google also lets us do (almost) everything without a template, creating defaults!
&lt;/li&gt;&lt;li&gt;[BAD THING] I just noticed something weird in the demo application, the KitchenSink. a page with a floating dialog box, that warns with the following:
&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;"If you're wondering why there's a list box at the bottom, it's to
demonstrate that you can drag the dialog box over it. This is
noteworthy because some browsers render lists and combos in a funky way
that, if GWT didn't do some magic for you, would normally cause the
dialog box to appear to hover &lt;i&gt;underneath&lt;/i&gt; the list box.  Fortunately, you don't have to worry about it -- just use the GWT &lt;code&gt;DialogBox&lt;/code&gt; class."

Now this is (1) weird, as it seems we're still dealing with black-magic in order for things to appear right on the screen, and (2) wrong, as the google shell browser still shows the listbox over the dialog box, if we drag it towards the right (oddly enough, a left drag runs ok...)
&lt;/blockquote&gt;

&lt;p class="poweredbyperformancing"&gt;powered by &lt;a href="http://performancing.com/firefox"&gt;performancing firefox&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/6003917-1860662044516113884?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/1860662044516113884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=1860662044516113884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1860662044516113884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/1860662044516113884'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/09/google-web-toolkit-experiences.html' title='Google Web Toolkit experiences'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-9090511741667907802</id><published>2006-09-21T15:39:00.000+01:00</published><updated>2007-10-09T15:30:00.849+01:00</updated><title type='text'>After having some meetings about the future of my ...</title><content type='html'>After having some meetings about the future of my research in the ESW group (at INESC-ID), I've set a few goals to my PhD. I'm now a part of a project that will integrate a workflow management system into a Web Application development methodology. My contribution is centered on the following RIA features:&lt;br /&gt;
&lt;ul&gt;
  &lt;li&gt;Easy rich content development on a web application&lt;/li&gt;

  &lt;li&gt;Disconnected browsing, used to enable specific parts of the workflow to be worked on without requiring a permanent Internet link.&lt;/li&gt;
&lt;/ul&gt;The second point is my main goal, as the first is being more and more common every day (do a google search for 'AJAX' and check it out!). To achieve disconnected browsing, one of the biggest challanges is to find out what is going to be the persistency model - given that the information is always shared and interacted with between two possibly remote machines.&lt;br /&gt;
&lt;br /&gt;
Some questions to be answered:&lt;br /&gt;
&lt;ul&gt;
  &lt;li&gt;What is the minimum ammount of information needed in the client for it to be able to execute operations offline?&lt;/li&gt;

  &lt;li&gt;What are the security issued underlying such an information sharing?&lt;/li&gt;

  &lt;li&gt;How can workflow activities be moduled so that they can be run isolated from the rest?&lt;br /&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/6003917-9090511741667907802?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/9090511741667907802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=9090511741667907802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/9090511741667907802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/9090511741667907802'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/09/after-having-some-meetings-about-future.html' title='After having some meetings about the future of my ...'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-3798820506871502092</id><published>2006-09-21T15:17:00.000+01:00</published><updated>2007-10-09T15:31:39.418+01:00</updated><title type='text'>Here is a summary of the activities I fullfilled i...</title><content type='html'>Here is a summary of the activities I fullfilled in my PhD, during this year:

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Curricular Courses&lt;/b&gt;: I have completed the curricular component of my PhD, with the following courses:&lt;/li&gt;

  &lt;li style="list-style: none"&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Formal Software Development&lt;/u&gt;: Based on the B-Method, this course was about the development methodologies with the help of formal specifications;&lt;/li&gt;

      &lt;li&gt;&lt;u&gt;Advanced Topics&lt;/u&gt;: I studied the Desktop applications interfaces development tools, their types and characteristics. I also read &lt;a class="l" href="http://jtidwell.net/" onmousedown="return rwt(this,'','','res','2','__-x5MpO_CmTGTFv4ufIsniemtZZ8=','&amp;amp;sig2=IIYi6elRMXxWFvlvdc7FuQ')"&gt;Jenifer &lt;b&gt;Tidwell&lt;/b&gt;&lt;/a&gt;'s "Designing Interfaces" book.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;Research&lt;/b&gt;:&lt;/li&gt;

  &lt;li style="list-style: none"&gt;
    &lt;ul&gt;
      &lt;li&gt;I made a study on remote desktop interactions, where I calculated the required ammount of network bandwidth to enable common user interactions to be executed in remote applications, such as mouse moves and clicks, or key presses. The conclusions were satisfatory, as today it is possible to enable complex interactions over the web, even if they are mapped as a set of basic - and non-optimized - operations.&lt;/li&gt;

      &lt;li&gt;I analised several tools that help the development of Rich Internet Applications (or RIAs).&lt;/li&gt;
    &lt;/ul&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/6003917-3798820506871502092?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/3798820506871502092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=3798820506871502092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3798820506871502092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/3798820506871502092'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2006/09/here-is-summary-of-activities-i.html' title='Here is a summary of the activities I fullfilled i...'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-113449339401576299</id><published>2005-12-13T17:03:00.000Z</published><updated>2005-12-13T17:03:14.066Z</updated><title type='text'>AJAX and Accessibility - Standards-schmandards</title><content type='html'>I read an article from March the 1st of this year, on AJAX and usability. It's a nice, simple, straight article, easy readable.It also has a few references to other articles explaining blogs (as well as a long comment list!). Here's the main points of the author on usability:

"Improving accessibility of AJAX forms

Fortunately there are some things we can do to increase accessbility of AJAX forms. Here are my recommendations:

   1. Inform the user at the top of the form that it requires javascript or detect javascript automatically and warn the user when it isn't available. If the form has many fields you will spare your users a lot of frustration. Everyone hates filling out a form just to find out that they can't submit it.
   2. Inform the user that the page is updated dynamically. This is especially important for screen reader users and will help them decide when to trigger a re-read of the page.
   3. Make it possible to recieve an alert when information was updated. This may not be practically possible depending on the complexity of your form but will help a screen reader user a lot. Alert boxes are read by the screen reader and are usually displayed together with a sound. The checkbox should be displayed so it is clear that it is not part of the original form.
   4. Highlight recently updated areas for a short period of time. This will help sighted users understand what just happened. The nice folks over at 37signals have dubbed this 'The Yellow Fade Technique' but you can use any colour you like. Check out Adam Michela's code for another way of providing the fade."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-113449339401576299?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/113449339401576299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=113449339401576299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113449339401576299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113449339401576299'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/12/ajax-and-accessibility-standards.html' title='AJAX and Accessibility - Standards-schmandards'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-113293579239010123</id><published>2005-11-25T16:23:00.000Z</published><updated>2005-11-25T16:24:56.276Z</updated><title type='text'>Morfik - the Javascript synthetizer</title><content type='html'>&lt;p class="mobile-post"&gt;I've recently found an interesting, promising work, another framework for Web Applications development. So what's different in this one?&lt;/p&gt;&lt;p class="mobile-post"&gt;Taking Morfik's CTO's words, ?Morfik has developed a unique JavaScript Synthesis Technology (?JST?) that allows developers to use a powerful integrated design environment together with a high-level language of their choice to create reliable applications comprised purely of HTML and JavaScript?.&lt;/p&gt;&lt;p class="mobile-post"&gt;Since the framework isn't open-source (so far, at least) all we can checkout is the two Flash demos on using the program to develop basic applications, and a few white papers and communications they release to the public. From these, I'm able to comment on both their mission and the program itself.&lt;/p&gt;&lt;p class="mobile-post"&gt;Morfik's main goal is to take jobs away for "rocket-scientists" who want to develop software for well-paying companies. So far, the so-called AJAX applications have been hard to implement, given both client and server's side complexity. Morfik allows these applications to be coded in a familiar language (one of several clones of popular languages like Pascal, Basic or C#), just like
a common desktop application. This code will be trans-compiled into a server side application and a set of HTML and JavaScript files to be loaded in the client's browser. Hence, no web application or AJAX knowledge would be necessary.&lt;/p&gt;&lt;p class="mobile-post"&gt;From the demonstrations, I've spotted that the greatest feature of Morfik it's its familiarity with common Microsoft applications to develop the application. For example, a specific Morfik component is used to setup the domain tier, using an interface almost 100% identical to Microsoft Access'. Similarly, the web pages are designed using a WYSIWYG program, just like Visual Studio's interface builder. So any application used to the Microsoft's tools should be
fairly suited to use Morfik without a two year-long course!
&lt;/p&gt;&lt;p class="mobile-post"&gt;How does this Morfik advent leaves me? Well, I was planning to do something similar for my PhD, so now I must find out exactly what they plan to do, so my work won't clash with theirs. For instance, I'd like to know how do they split the computations between the client and the server - I'd like to give some adaptability to the server.&lt;/p&gt;&lt;p class="mobile-post"&gt;To add up, Morfik have a pioneers program, but they haven't released any usable version of the program for us to test it (not even demo-ware...). I'll just wait for further news on their site: http://www.morfik.com/
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-113293579239010123?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/113293579239010123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=113293579239010123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113293579239010123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113293579239010123'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/11/morfik-javascript-synthetizer.html' title='&lt;a href= &quot;http://www.morfik.com/&quot;&gt;Morfik - the Javascript synthetizer&lt;/a&gt;'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-113149260537724130</id><published>2005-11-08T23:30:00.000Z</published><updated>2007-10-09T15:31:57.528+01:00</updated><title type='text'>New directions, new homepage</title><content type='html'>&lt;p class="mobile-post"&gt;I've just reviewed my homepages, and it took me a while to get them&lt;br /&gt;
presentable... So here's my status, online-wise:&lt;/p&gt;
&lt;p class="mobile-post"&gt;- I have http://360.yahoo.com/edy_in_carpathia - this is my personal website,&lt;br /&gt;
with access to photo albums, preferences and other non-interesting stuff :)&lt;br /&gt;
- My work homepage is http://edgargoncalves.no-ip.org - it has a set of projects I'm working on, and my professional information (like my resume)&lt;br /&gt;
- This site (last, but not least) will be my communication point, unless Yahoo releases a great API to post messages to it's blog. So, for now on, my PhD discoveries, researches and interesting notes will be posted here, for the world to see. Ocasionally one or other photo will invade this space, but I promise I won't have the motivation to do so (nor the time!)&lt;/p&gt;
&lt;p class="mobile-post"&gt;So, on my next post, I promise to write about remote interfaces, my last research subject for the past weeks.&lt;/p&gt;
&lt;p class="mobile-post"&gt;Ta-ta...&lt;/p&gt;

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-113149260537724130?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/113149260537724130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=113149260537724130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113149260537724130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/113149260537724130'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/11/new-directions-new-homepage.html' title='New directions, new homepage'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111870338353146638</id><published>2005-06-13T23:56:00.000+01:00</published><updated>2005-06-13T23:56:23.566+01:00</updated><title type='text'></title><content type='html'>&lt;a href='http://photos1.blogger.com/img/179/3423/1024/vitruvian.jpg'&gt;&lt;img border='0' style='border:1px solid #666666; margin:2px' src='http://photos1.blogger.com/img/179/3423/320/vitruvian.jpg'&gt;&lt;/a&gt;&lt;br /&gt;The Vitruvian Man. Leonardo's most perfect piece, imho. This is also to tell that this blog isn't dead. In fact, it's sibling MSN Space has recently entered in a inevitable coma... But bear in mind that I have my own tech blog at www.esw.inesc-id.pt/~eemg/ - so this blog will be ONLY for personal/relevant photos and thoughts. why? because I have Hello. and because It grants me unlimited picture storage and a nice interface! :) So sit back, and enjoy the show...&lt;br /&gt;&lt;span style='font-size: 8pt;'&gt;Posted by &lt;a href='http://www.hello.com/' target='ext'&gt;Hello&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111870338353146638?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111870338353146638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111870338353146638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111870338353146638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111870338353146638'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/06/vitruvian-man.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111443248792693708</id><published>2005-04-25T13:34:00.000+01:00</published><updated>2005-04-25T13:34:47.926+01:00</updated><title type='text'>Emacs, Gnus and BBDB </title><content type='html'>&lt;p class="mobile-post"&gt;
Big day - I now have my BBDB decide where to send a mail from one of my
contacts, either personal or mailling lists! My arch repository was updated
accordingly (mail me if you want to know where it is).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111443248792693708?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111443248792693708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111443248792693708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111443248792693708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111443248792693708'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/04/emacs-gnus-and-bbdb.html' title='Emacs, Gnus and BBDB '/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111296529967419369</id><published>2005-04-08T14:01:00.000+01:00</published><updated>2005-04-08T14:01:39.673+01:00</updated><title type='text'>BBDB exporting</title><content type='html'>&lt;a href="http://www.emacswiki.org/cgi-bin/alex/Comments_on_2005-02-22_Software"&gt;Alex Schroeder: Comments on 2005-02-22 Software&lt;/a&gt;: "&lt;a title='Click to search for references to this page' href='http://www.emacswiki.org/cgi-bin/alex?search=Comments on 2005-02-22 Software'&gt;Comments on 2005-02-22 Software&lt;/a&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111296529967419369?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.emacswiki.org/cgi-bin/alex/Comments_on_2005-02-22_Software' title='BBDB exporting'/><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111296529967419369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111296529967419369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111296529967419369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111296529967419369'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/04/bbdb-exporting.html' title='BBDB exporting'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111289718504349319</id><published>2005-04-07T19:06:00.000+01:00</published><updated>2005-04-07T19:06:25.043+01:00</updated><title type='text'>mozdev.org - webmail</title><content type='html'>Now THIS is handy! Finally, both Hotmail and Yahoo mails being delivered via a pop server, for free! The caveat is that the plugin only works via thunderbird - I wonder how much longer do we have to wait until a Gnus version is made? Download it now from &lt;a href="http://webmail.mozdev.org/index.html"&gt;mozdev.org - webmail&lt;/a&gt;: "&lt;a accesskey='0' href='http://www.mozdev.org/' tabindex='1' title='mozdev.org'&gt;mozdev.org&lt;/a&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111289718504349319?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://webmail.mozdev.org/index.html' title='mozdev.org - webmail'/><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111289718504349319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111289718504349319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111289718504349319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111289718504349319'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/04/mozdevorg-webmail.html' title='mozdev.org - webmail'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111176426407882871</id><published>2005-03-25T15:24:00.000Z</published><updated>2005-03-25T15:24:24.076Z</updated><title type='text'>ZipGenius: free zip unzip utility</title><content type='html'>I found a good tool: &lt;a href="http://www.zipgenius.it/index_eng.htm"&gt;ZipGenius: free zip unzip utility. File compression is finally easy and free, with no adware, no spyware, no ads, no money. ZipGenius is free and handles many archive formats: zip, rar, arc, ace, arj, cab, tar, 7-zip, zoo, tar.gz, gz, z, bz2, iso, nrg.&lt;/a&gt;: 
"If you need a compression utility, your search ends here: now you can count on ZipGenius and you it won't cost a dime to you, just because here you can find just FREEWARE programs."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111176426407882871?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.zipgenius.it/index_eng.htm' title='ZipGenius: free zip unzip utility'/><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111176426407882871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111176426407882871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111176426407882871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111176426407882871'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/zipgenius-free-zip-unzip-utility.html' title='ZipGenius: free zip unzip utility'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111141181328257917</id><published>2005-03-21T13:30:00.000Z</published><updated>2005-03-21T13:30:13.283Z</updated><title type='text'></title><content type='html'>trying the current version of weblogger. if this blog entry has a title, I'll
settle with it. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111141181328257917?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111141181328257917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111141181328257917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111141181328257917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111141181328257917'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/trying-current-version-of-weblogger.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111141099784782607</id><published>2005-03-21T13:16:00.000Z</published><updated>2005-03-21T13:16:37.846Z</updated><title type='text'></title><content type='html'>Point one: with the weblogger package for emacs my subjects are nto
appearing. gotta check why eventually.

Point two: at INESC, I have emacs version GNU Emacs 21.3.50.1
(i386-mingw-nt5.2.3790) of 2005-01-30 on NONIQPC. Well, this has support for
'jpeg, and not 'gif. In my laptop, I seem to miss both of those image types! I
wonder why??&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111141099784782607?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111141099784782607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111141099784782607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111141099784782607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111141099784782607'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/point-one-with-weblogger-package-for.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111119645666483177</id><published>2005-03-19T01:40:00.000Z</published><updated>2005-03-19T01:40:56.663Z</updated><title type='text'></title><content type='html'>I made some updates to ERC nicklist module. Basically, it now shows me who's
online and availlable, along with it's email. Also, the menu is functional! Now
I need some icons to put before each nick, to tell me the away state and the
connection type (msn, icq, irc,...). But it's something I'll so with more
time. I'm happy to be part of the erc community, for now!

I was testing weblogger.el, and I said I would say something about it. Well, I'm
still using it for this post, so that means something! Basically, it uses the
blogger API, so it can do a lot more that my email sending approach (however, I
allowed for making a new post from an emacs region - I might merge that
functionality, someday).

Cheers!

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111119645666483177?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111119645666483177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111119645666483177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111119645666483177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111119645666483177'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/i-made-some-updates-to-erc-nicklist.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111093721914555806</id><published>2005-03-16T01:40:00.000Z</published><updated>2005-03-16T01:40:19.146Z</updated><title type='text'></title><content type='html'>I've found yet another existing method of blogging here. This may be more
complete, i'll just have to try it out more. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111093721914555806?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111093721914555806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111093721914555806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111093721914555806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111093721914555806'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/ive-found-yet-another-existing-method.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111088880370410640</id><published>2005-03-15T12:13:00.000Z</published><updated>2005-03-15T12:13:23.706Z</updated><title type='text'>ERC and voice, with Bitlbee</title><content type='html'>&lt;p class="mobile-post"&gt;I have noticed that the voicing system is used in Bitlbee to let me know wich
users are availlable, instead of being away, DND or simply NA. So, my next ERC
modding will have to be a notification, to let me know what's the status of my
so-called "friends".&lt;/p&gt;&lt;p class="mobile-post"&gt;Also, I have to check erc-bbdb to know the current MSN nick of a particular
buddy. I know they do this on /WHOIS, so i'l just grok that and make it into a
popup message in erc-nicklist, or something.&lt;/p&gt;&lt;p class="mobile-post"&gt;Btw, I just came across C-M-w in Emacs. The kill ring still amazes me! (Go on,
check it...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111088880370410640?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111088880370410640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111088880370410640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111088880370410640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111088880370410640'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/erc-and-voice-with-bitlbee.html' title='ERC and voice, with Bitlbee'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111072574015579316</id><published>2005-03-13T14:55:00.000Z</published><updated>2005-03-13T14:55:40.156Z</updated><title type='text'>"Allows", and stuff like that</title><content type='html'>&lt;p class="mobile-post"&gt;I've just discovered that english papers don't like to use sentences like "it
allows me to do", or "i was allowed to evolve...". Live and learn!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111072574015579316?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111072574015579316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111072574015579316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111072574015579316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111072574015579316'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/allows-and-stuff-like-that.html' title='&quot;Allows&quot;, and stuff like that'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111039068520069035</id><published>2005-03-09T17:51:00.000Z</published><updated>2005-03-09T17:51:25.203Z</updated><title type='text'>Blogspot posting from Emacs</title><content type='html'>&lt;p class="mobile-post"&gt;
After setting up your blog to receive messages from a mail, eval this on emacs:&lt;/p&gt;&lt;p class="mobile-post"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Blogspot email sending:&lt;/p&gt;&lt;p class="mobile-post"&gt;(defvar blogspot-post-email "yourname.dummy_mail@blogger.com")&lt;/p&gt;&lt;p class="mobile-post"&gt;(defun blogspot (title url &amp;optional text)
  "Opens a gnus msg buffer with the active region or the parameters passed in the body.
Configure `blogspot-post-email' to set it up."
  (interactive "sPost title: 
sPost link: ")
  (let ((to      blogspot-post-email)
	(subject (cond ((and title url (not (string= url "")))
			(concat "&lt;a href=\""
				url
				"\"&gt;"
				title
				"&lt;/a&gt;"))
		       (title title)
		       (t "")))
	(body    (or text "")))
    (gnus-msg-mail to subject)
    (save-excursion
    (when body
      (raise-frame)
      (insert body)))
    (message "Edit your post and press \\C-c \\C-c to post it to %s." blogspot-post-email)))&lt;/p&gt;&lt;p class="mobile-post"&gt;(defun blogspot-region (beg end title url)
  "Call `blogspot-text' and inserts the active region as the post's body."
  (interactive "r
sPost title: 
sPost link: ")
  (blogspot title url (buffer-substring-no-properties beg end)))&lt;/p&gt;&lt;p class="mobile-post"&gt;-- 
Edgar Gonçalves
INESC-ID, Software Engineering Group (Technical University of Lisbon)
Portugal&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111039068520069035?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111039068520069035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111039068520069035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111039068520069035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111039068520069035'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/blogspot-posting-from-emacs.html' title='Blogspot posting from Emacs'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111020177126311413</id><published>2005-03-07T13:22:00.000Z</published><updated>2005-03-07T13:22:51.263Z</updated><title type='text'>ICWI 2005: Call for Papers</title><content type='html'>&lt;strong&gt;IADIS International Conference&lt;/strong&gt; is an opportunity to write a paper on my final degree project. While it may not be a hot-shot conference, it's another published paper for my CV, along with the increased experience, yadda yadda... For details on the conference, see: &lt;a href="http://www.iadis.org/icwi2005/cfp.asp"&gt;ICWI 2005: Call for Papers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111020177126311413?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.iadis.org/icwi2005/cfp.asp' title='ICWI 2005: Call for Papers'/><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111020177126311413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111020177126311413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111020177126311413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111020177126311413'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/icwi-2005-call-for-papers.html' title='ICWI 2005: Call for Papers'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111003669580344092</id><published>2005-03-05T15:31:00.000Z</published><updated>2005-03-05T15:31:35.803Z</updated><title type='text'></title><content type='html'>&lt;a href='http://photos1.blogger.com/img/179/3423/1024/14 Anos da Deby - 20-02-2005 15-48-14.jpg'&gt;&lt;img border='0' style='border:1px solid #666666; margin:2px' src='http://photos1.blogger.com/img/179/3423/320/14 Anos da Deby - 20-02-2005 15-48-141.jpg'&gt;&lt;/a&gt;&lt;br /&gt;These are my two girls. Taken at my sister's (the one in the right) 14th birthday!&lt;br /&gt;&lt;span style='font-size: 8pt;'&gt;Posted by &lt;a href='http://www.hello.com/' target='ext'&gt;Hello&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111003669580344092?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111003669580344092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111003669580344092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003669580344092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003669580344092'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/these-are-my-two-girls.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111003463954827327</id><published>2005-03-05T14:55:00.000Z</published><updated>2005-03-05T14:57:19.550Z</updated><title type='text'>RSS access to newsgroups via Google</title><content type='html'>Ever wanted to read newsgroups in Firefox? Well, yeah, you can use google groups to achieve that. But what if you already read RSS/RDF/Atom news? You can read any group via the google groups feeder. See &lt;a href="http://myitforum.techtarget.com/blog/mniehaus/archive/2005/01/08/1546.aspx"&gt;RSS access to newsgroups via Google&lt;/a&gt; for more information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111003463954827327?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111003463954827327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111003463954827327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003463954827327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003463954827327'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/rss-access-to-newsgroups-via-google.html' title='RSS access to newsgroups via Google'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-111003448055277235</id><published>2005-03-05T14:42:00.000Z</published><updated>2005-03-05T14:54:40.556Z</updated><title type='text'>The Carpathia Blog is back!</title><content type='html'>That's right. A new face, a new name - Carpathian Cloud - and a fresh motivation. I want this blog to have all of my daily discoveries (both social and techincal). But I mean to make some posts with some thoughts, some pictures I find interesting or relevant, and other stuff I may consider usefull to some viewer.

I also have some new tools, and a ongoing idea to help me with my blog posting: &lt;a href="http://www.hello.com/"&gt;Hello&lt;/a&gt; and &lt;a href="http://www.picasa.com"&gt;Picasa&lt;/a&gt; are great to post images. JustBlogIt! is a Firefox extension that allows me to post something from any page, adding the link and title automatically. I also intend to make (or find, eheh) a mean to do the same from within Emacs. It would be great - and not that hard, I believe - more to come about this...

Hope this can be of some use to someone. Cheers!
&lt;a href="http://www.hello.com"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-111003448055277235?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/111003448055277235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=111003448055277235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003448055277235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/111003448055277235'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2005/03/carpathia-blog-is-back.html' title='The Carpathia Blog is back!'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107817895786939832</id><published>2004-03-01T22:09:00.000Z</published><updated>2004-03-01T22:12:14.420Z</updated><title type='text'>My computer is up and running again!</title><content type='html'>After a quick tour with blaster, my win system became unstable. So, format c: /q did the job, and it is now fine (it was also full of shit, then...) So hey, new thunderbird nightly, and there goes another 7MB of international downloads :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107817895786939832?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107817895786939832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107817895786939832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107817895786939832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107817895786939832'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/03/my-computer-is-up-and-running-again.html' title='My computer is up and running again!'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107807214421327818</id><published>2004-02-29T16:29:00.000Z</published><updated>2004-02-29T16:31:58.796Z</updated><title type='text'>ImageMagick for MzScheme 103</title><content type='html'>&lt;a href="http://www.scheme.dk/imagemagick-for-mzscheme/"&gt;ImageMagick for MzScheme 103&lt;/a&gt;: With this baby we may make thumbnails on the fly, by making a nice surflet :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107807214421327818?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107807214421327818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107807214421327818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107807214421327818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107807214421327818'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/imagemagick-for-mzscheme-103.html' title='ImageMagick for MzScheme 103'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107799883989717423</id><published>2004-02-28T20:07:00.000Z</published><updated>2004-02-28T20:10:13.606Z</updated><title type='text'>Breeze Systems - Digital Photography Starts Here!</title><content type='html'>I was advised &lt;a href="http://www.breezesys.com/BreezeBrowser/index.htm"&gt;Breeze Systems&lt;/a&gt; have a great app to deal with raw images from the Canon PowerShot S50 (my cam...) can't try it out right now, but I will. (ACDSee??)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107799883989717423?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107799883989717423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107799883989717423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107799883989717423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107799883989717423'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/breeze-systems-digital-photography.html' title='Breeze Systems - Digital Photography Starts Here!'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107780522431555076</id><published>2004-02-26T14:20:00.000Z</published><updated>2004-02-26T14:23:14.860Z</updated><title type='text'>Orion Application Server</title><content type='html'>&lt;a href="http://orionserver.com/"&gt;Orion Application Server&lt;/a&gt; This is a good resource for creating custom taglibs for struts/JSP's. Has more stuff, but I haven't checked it out...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107780522431555076?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107780522431555076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107780522431555076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107780522431555076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107780522431555076'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/orion-application-server.html' title='Orion Application Server'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107758579949882257</id><published>2004-02-24T01:23:00.000Z</published><updated>2004-02-24T01:26:06.513Z</updated><title type='text'>NLO's Siemens C55 Page</title><content type='html'>&lt;a href="http://nlo.gsmhosting.net/"&gt;NLO's Siemens C55 Page&lt;/a&gt; Here are some tips about my current cell-phone (shoooo - it's supposed to be secret...) :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107758579949882257?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107758579949882257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107758579949882257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107758579949882257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107758579949882257'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/nlos-siemens-c55-page.html' title='NLO&apos;s Siemens C55 Page'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107646389855197356</id><published>2004-02-11T01:44:00.000Z</published><updated>2004-02-11T01:47:27.466Z</updated><title type='text'>2xExplorer home</title><content type='html'>Go to &lt;a href="http://netez.com/2xExplorer/"&gt;2xExplorer home&lt;/a&gt; and grab its newest child: xplorerÂ², itÂ´s SOOOOO cool. think norton commander + explorer + quickviewer + cuteftp and boom! xplorerÂ² :) (still in alpha by now...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107646389855197356?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107646389855197356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107646389855197356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107646389855197356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107646389855197356'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/2xexplorer-home.html' title='2xExplorer home'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107642851023599000</id><published>2004-02-10T15:55:00.000Z</published><updated>2004-02-10T15:57:38.263Z</updated><title type='text'>Hypertext marks in LaTeX: a manual for hyperref</title><content type='html'>Click &lt;a href="http://www.tug.org/applications/hyperref/manual.html"&gt;here&lt;/a&gt; to see the manual for this awsome package to latex - the default is those fugly red boxes arround links in the otherwise cute pdf's!! use something like &lt;code&gt; \usepackage[pdftitle={my title},colorlinks=true,urlcolor=blue,linkcolor=blue]{hyperref} &lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107642851023599000?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107642851023599000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107642851023599000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107642851023599000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107642851023599000'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/hypertext-marks-in-latex-manual-for.html' title='Hypertext marks in LaTeX: a manual for hyperref'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107593358450528377</id><published>2004-02-04T22:26:00.000Z</published><updated>2004-02-04T22:28:45.060Z</updated><title type='text'>emacs - a repository</title><content type='html'>This &lt;a href="http://www.newartisans.com/johnw/emacs.html"&gt;emacs&lt;/a&gt; site has stuff about emacs-wiki, and a xml-parser for elisp (wanna read rss's? ;) )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107593358450528377?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107593358450528377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107593358450528377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107593358450528377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107593358450528377'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/02/emacs-repository.html' title='emacs - a repository'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107525979496184229</id><published>2004-01-28T03:16:00.000Z</published><updated>2004-01-28T03:18:44.936Z</updated><title type='text'>Samurize.com</title><content type='html'>&lt;a href="http://www.samurize.com/modules/news/"&gt;Samurize.com - News&lt;/a&gt; weeeeeeeeeeeeeeee!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107525979496184229?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107525979496184229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107525979496184229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107525979496184229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107525979496184229'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/samurizecom.html' title='Samurize.com'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107522739615305239</id><published>2004-01-27T18:16:00.000Z</published><updated>2004-01-27T18:18:45.610Z</updated><title type='text'>Pantheons</title><content type='html'>This is a very complete site. &lt;a href="http://web.raex.com/~obsidian/PanIndex.html"&gt;Pantheons&lt;/a&gt; has a full list of gods, demi-gods and heroes of many different cultures, organized geographically. It's pretty good to learn something new!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107522739615305239?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107522739615305239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107522739615305239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107522739615305239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107522739615305239'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/pantheons.html' title='Pantheons'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107516086809735203</id><published>2004-01-26T23:47:00.000Z</published><updated>2004-01-26T23:49:56.076Z</updated><title type='text'>WinT's Windows Modifications</title><content type='html'>&lt;a href="http://wint.virtualplastic.net/hackindex.php"&gt;WinT's Windows Modifications&lt;/a&gt;: This is very cute! dialigs, toolbars and application modifications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107516086809735203?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107516086809735203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107516086809735203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107516086809735203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107516086809735203'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/wints-windows-modifications.html' title='WinT&apos;s Windows Modifications'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107499600336214937</id><published>2004-01-25T02:00:00.000Z</published><updated>2004-01-25T02:02:09.356Z</updated><title type='text'>TinyWeb</title><content type='html'>&lt;a href="http://www.ritlabs.com/en/products/tinyweb/"&gt;Ritlabs: TinyWeb&lt;/a&gt;. This is a win32 FREE, SMALL, http daemon wirh SSL tunneling... looks nice, but i'm not really needing it, now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107499600336214937?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107499600336214937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107499600336214937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107499600336214937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107499600336214937'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/tinyweb.html' title='TinyWeb'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107473759694857606</id><published>2004-01-22T02:13:00.000Z</published><updated>2004-01-22T02:15:18.653Z</updated><title type='text'>myRSS: PUBLICO.PT Channel Information</title><content type='html'>&lt;a href="http://myrss.com/f/p/u/publicoPtNhgxus1.html"&gt;myRSS: PUBLICO.PT Channel Information&lt;/a&gt; This is a good starting point to learn about rss...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107473759694857606?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107473759694857606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107473759694857606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107473759694857606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107473759694857606'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/myrss-publicopt-channel-information.html' title='myRSS: PUBLICO.PT Channel Information'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107472312927394102</id><published>2004-01-21T22:12:00.000Z</published><updated>2004-01-21T22:14:10.763Z</updated><title type='text'>A CSS editing mode for Emacs</title><content type='html'>&lt;a href="http://www.garshol.priv.no/download/software/css-mode/"&gt;A CSS editing mode for Emacs&lt;/a&gt; check this out&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107472312927394102?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107472312927394102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107472312927394102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107472312927394102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107472312927394102'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/css-editing-mode-for-emacs.html' title='A CSS editing mode for Emacs'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107472180752539469</id><published>2004-01-21T21:50:00.000Z</published><updated>2004-01-21T21:52:08.466Z</updated><title type='text'>AllegroServe - a Web Application Server</title><content type='html'>&lt;a href="http://opensource.franz.com/aserve/index.html"&gt;AllegroServe - a Web Application Server&lt;/a&gt; hey, it's free now!! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107472180752539469?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107472180752539469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107472180752539469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107472180752539469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107472180752539469'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/allegroserve-web-application-server.html' title='AllegroServe - a Web Application Server'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107465037664001480</id><published>2004-01-21T01:59:00.000Z</published><updated>2004-01-21T02:01:37.140Z</updated><title type='text'>The Common Gateway Interface Specification</title><content type='html'>&lt;a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html"&gt;The Common Gateway Interface Specification&lt;/a&gt;&gt; someday i-ll have a good look at this...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107465037664001480?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107465037664001480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107465037664001480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107465037664001480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107465037664001480'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/common-gateway-interface-specification.html' title='The Common Gateway Interface Specification'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107454777054582012</id><published>2004-01-19T21:29:00.000Z</published><updated>2004-01-19T21:31:29.123Z</updated><title type='text'>scsh.net</title><content type='html'>&lt;a href="http://www.scsh.net"&gt;scsh.net&lt;/a&gt; is the site for the Scheme Shell - yes, it's alive!! must give it a go...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107454777054582012?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107454777054582012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107454777054582012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107454777054582012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107454777054582012'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/scshnet.html' title='scsh.net'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107454680801379951</id><published>2004-01-19T21:13:00.000Z</published><updated>2004-01-19T21:15:26.733Z</updated><title type='text'>CLiki (the common lisp wiki): IMHO</title><content type='html'>&lt;a href="http://www.cliki.net/IMHO"&gt;IMHO&lt;/a&gt;, from onShore Development is a toolkit that provides facilities for building highly interactive Web applications. (using lisp, it seems!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107454680801379951?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107454680801379951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107454680801379951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107454680801379951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107454680801379951'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/cliki-common-lisp-wiki-imho.html' title='CLiki (the common lisp wiki): IMHO'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107443887365895949</id><published>2004-01-18T15:14:00.000Z</published><updated>2004-01-18T15:16:30.606Z</updated><title type='text'>X-Men - Episode List</title><content type='html'>&lt;a href="http://tvtome.com/XMen/eplist.html"&gt;X-Men - Episode List&lt;/a&gt; This is extensive, and very easy to follow, fully linked! start your kazaa engines!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107443887365895949?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107443887365895949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107443887365895949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107443887365895949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107443887365895949'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/x-men-episode-list.html' title='X-Men - Episode List'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107435222299097008</id><published>2004-01-17T15:10:00.000Z</published><updated>2004-01-17T15:12:18.623Z</updated><title type='text'>Piled Higher and Deeper</title><content type='html'>&lt;a href="http://www.phdcomics.com/comics/archive.php?comicid=59"&gt;Piled Higher and Deeper&lt;/a&gt; Break time - great comic!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107435222299097008?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107435222299097008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107435222299097008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107435222299097008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107435222299097008'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/piled-higher-and-deeper.html' title='Piled Higher and Deeper'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107412411544726989</id><published>2004-01-14T23:48:00.000Z</published><updated>2004-01-14T23:50:26.936Z</updated><title type='text'>Running as a Service on MS Windows</title><content type='html'>&lt;a href="http://www.haxial.com/faq/mswinservice/"&gt;HAXIAL -- Running as a Service on MS Windows&lt;/a&gt; This is eveything you'll need - found out the firedaemon is free to use with ONE single service :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107412411544726989?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107412411544726989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107412411544726989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107412411544726989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107412411544726989'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/running-as-service-on-ms-windows.html' title='Running as a Service on MS Windows'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107404798191759363</id><published>2004-01-14T02:39:00.000Z</published><updated>2004-01-14T02:41:32.373Z</updated><title type='text'>FreeTranslation.com - FreeTranslation Tools for browser and web site translation</title><content type='html'>&lt;a href="http://www.freetranslation.com/link.htm"&gt;FreeTranslation.com - FreeTranslation Tools for browser and web site translation&lt;/a&gt; really cool - add an applet to your website :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107404798191759363?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107404798191759363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107404798191759363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107404798191759363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107404798191759363'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/freetranslationcom-freetranslation.html' title='FreeTranslation.com - FreeTranslation Tools for browser and web site translation'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107384271331602429</id><published>2004-01-11T17:38:00.000Z</published><updated>2004-01-11T17:38:53.930Z</updated><title type='text'>Bitvise WinSSHD</title><content type='html'>&lt;a href="http://www.bitvise.com/winsshd.html"&gt;Bitvise WinSSHD&lt;/a&gt; sshd for windows. caveat: not free. (but "buyable" at astalavista...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107384271331602429?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107384271331602429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107384271331602429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107384271331602429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107384271331602429'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/bitvise-winsshd.html' title='Bitvise WinSSHD'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107384149608258471</id><published>2004-01-11T17:18:00.000Z</published><updated>2004-01-11T17:18:36.883Z</updated><title type='text'>http://www.pmail.com/overviews/ovw_mercury.htm</title><content type='html'>&lt;a href="http://clk.about.com/?zi=1/XJ"&gt;http://www.pmail.com/overviews/ovw_mercury.htm&lt;/a&gt; IMAP, SSL windows free server&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107384149608258471?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107384149608258471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107384149608258471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107384149608258471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107384149608258471'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/httpwwwpmailcomoverviewsovwmercuryhtm.html' title='http://www.pmail.com/overviews/ovw_mercury.htm'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107382993445024686</id><published>2004-01-11T14:05:00.000Z</published><updated>2004-01-11T14:05:55.326Z</updated><title type='text'>FireDaemon :: Install and run Win32 applications as Windows NT/2K/XP/2K3 services</title><content type='html'>&lt;a href="http://www.firedaemon.com/"&gt;FireDaemon :: Install and run Win32 applications as Windows NT/2K/XP/2K3 services&lt;/a&gt; emule, winamp server, and so on and so on...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107382993445024686?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107382993445024686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107382993445024686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107382993445024686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107382993445024686'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/firedaemon-install-and-run-win32.html' title='FireDaemon :: Install and run Win32 applications as Windows NT/2K/XP/2K3 services'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107382978257512500</id><published>2004-01-11T14:03:00.000Z</published><updated>2004-01-11T14:03:23.486Z</updated><title type='text'>DSL/Cable Webserver - Run your own webserver from home on DSL or Cable!</title><content type='html'>&lt;a href="http://www.dslwebserver.com/"&gt;DSL/Cable Webserver - Run your own webserver from home on DSL or Cable!&lt;/a&gt; hey - everything is here! :) someday i'll have my home pc do all that nasty tricks they mention...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107382978257512500?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107382978257512500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107382978257512500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107382978257512500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107382978257512500'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/dslcable-webserver-run-your-own.html' title='DSL/Cable Webserver - Run your own webserver from home on DSL or Cable!'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107369126658551780</id><published>2004-01-09T23:32:00.000Z</published><updated>2004-01-09T23:34:46.650Z</updated><title type='text'>And now, for something completelly diferent...</title><content type='html'>&lt;a href="http://www.marklpirata.web.pt/"&gt;MarklPirata - radio online &lt;/a&gt; (portuguese) eheheh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107369126658551780?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107369126658551780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107369126658551780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107369126658551780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107369126658551780'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2004/01/and-now-for-something-completelly.html' title='And now, for something completelly diferent...'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107283669734842749</id><published>2003-12-31T02:11:00.000Z</published><updated>2003-12-31T02:11:55.056Z</updated><title type='text'>CyberCPU.net -- using sql in access db with asp</title><content type='html'>might be handy someday :) &lt;a href="http://www.cybercpu.net/howto/web/access.asp"&gt;CyberCPU.net --&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107283669734842749?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107283669734842749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107283669734842749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107283669734842749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107283669734842749'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/12/cybercpunet-using-sql-in-access-db.html' title='CyberCPU.net -- using sql in access db with asp'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107270056745681271</id><published>2003-12-29T12:22:00.000Z</published><updated>2003-12-29T12:23:04.596Z</updated><title type='text'>i18n in asp.net pages</title><content type='html'>Check &lt;a href="http://www.informit.com/isapi/guide~dotnet/seq_id~160/guide/content.asp"&gt;InformIT.com : Programming &gt;here&lt;/a&gt; to get a good howto and a good explanation of how globalization works!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107270056745681271?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107270056745681271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107270056745681271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107270056745681271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107270056745681271'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/12/i18n-in-aspnet-pages.html' title='i18n in asp.net pages'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107247630507079759</id><published>2003-12-26T22:02:00.000Z</published><updated>2003-12-26T22:05:21.763Z</updated><title type='text'>New blog arrangement</title><content type='html'>now, with archives :) not that hard, really. just a test...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107247630507079759?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107247630507079759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107247630507079759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107247630507079759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107247630507079759'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/12/new-blog-arrangement.html' title='New blog arrangement'/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107244491051917042</id><published>2003-12-26T13:21:00.000Z</published><updated>2003-12-26T13:22:06.886Z</updated><title type='text'></title><content type='html'>And finaly I made it: my first BB4win plugin that I am really going to use :) After the first revision I fixed two important bugs, and now it's pretty stable, for me. Link:

&lt;a href="http://web.tagus.ist.utl.pt/~edgar.goncalves//bbstatus/"&gt;BBbin 1.0.1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107244491051917042?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107244491051917042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107244491051917042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107244491051917042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107244491051917042'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/12/and-finaly-i-made-it-my-first-bb4win.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-107197603650960870</id><published>2003-12-21T03:07:00.000Z</published><updated>2003-12-21T03:07:31.700Z</updated><title type='text'></title><content type='html'>&lt;a href="http://www.nu2.nu/pebuilder/"&gt;Bart's PE Builder - Build your own Bart Preinstalled Environment (BartPE) bootable CD/DVD&lt;/a&gt;: wohoo! no disk? no problem! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-107197603650960870?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/107197603650960870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=107197603650960870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107197603650960870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/107197603650960870'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/12/barts-pe-builder-build-your-own-bart.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-106747490197345537</id><published>2003-10-30T00:48:00.000Z</published><updated>2003-10-30T00:48:21.813Z</updated><title type='text'></title><content type='html'>&lt;a href="http://www.cv.nrao.edu/~pmurphy/emacs.html"&gt;How the Grinch Stole Emacs&lt;/a&gt; A sweet and tender tale :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-106747490197345537?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/106747490197345537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=106747490197345537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106747490197345537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106747490197345537'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/10/how-grinch-stole-emacs-sweet-and.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-106747300777298547</id><published>2003-10-30T00:16:00.000Z</published><updated>2003-10-30T00:16:48.026Z</updated><title type='text'></title><content type='html'>&lt;a href="http://preview-latex.sourceforge.net/"&gt;The preview-latex package&lt;/a&gt; woo-oooh! The only problem for windows is that "i need an emacs that supports images"... Maybe the CVS version, as they suggest, will do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-106747300777298547?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/106747300777298547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=106747300777298547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106747300777298547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106747300777298547'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/10/preview-latex-package-woo-oooh-only.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6003917.post-106746940884795808</id><published>2003-10-29T23:16:00.000Z</published><updated>2003-10-29T23:16:49.620Z</updated><title type='text'></title><content type='html'>&lt;a href="http://home.lanck.net/mf/srv/index.htm"&gt;Small HTTP server&lt;/a&gt; for windows - it's working, you're seeing it on this Blog! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6003917-106746940884795808?l=carpathia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carpathia.blogspot.com/feeds/106746940884795808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6003917&amp;postID=106746940884795808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106746940884795808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6003917/posts/default/106746940884795808'/><link rel='alternate' type='text/html' href='http://carpathia.blogspot.com/2003/10/small-http-server-for-windows-its.html' title=''/><author><name>Edgar Gonçalves</name><uri>http://www.blogger.com/profile/05728895749334817487</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Otn_qtsurXg/SmnESc5Tf1I/AAAAAAAAAro/atiCIRAV7ck/S220/Viseu,+full.JPG'/></author><thr:total>0</thr:total></entry></feed>
