<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Planet Maemo: category &quot;feed:01c9bb92c8cdc7e3a5fc627f123acc22&quot;</title>
        <description>Blog entries from Maemo community</description>
        <link>http://maemo.org/news/planet-maemo/</link>
        <lastBuildDate>Sun, 24 May 2026 11:08:25 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.6(BH)</generator>
        <language>en</language>
        <managingEditor>planet@maemo.org</managingEditor>
        <item>
            <title>Eina_Log customizations</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/kt23Orc93WI/</link>
            <description><![CDATA[
<p><strong>Introduction to Eina_Log:</strong></p>
<p>EFL provides a powerful logging system called &#8220;eina_log&#8221;, it can help developers and QA engineers a lot by providing key features:</p>
<ul>
<li><strong>Levels/Priorities with option to disable at compile time:</strong> similar to syslog, one can specify levels such as critical, error, warning, information or debug. An added bonus is that you can compile-out messages above certain levels, removing the function call overhead and the strings from the binary.</li>
<li><strong>Logging domains:</strong> one can create multiple domains aside from the global/default one, this allows for easy filtering when debugging or looking for errors. Let&#8217;s say you want debug Edje, just <code>export EINA_LOG_LEVELS="edje:4"</code></li>
<li><strong>Comprehensive, Colorful default formatting:</strong> it will automatically turn on colors if your $TERM is supported (also works on Windows). Output includes PID, log domain, file name, line number and even thread ID if that&#8217;s different from the main thread. Some of the components can be toggled with environment variables.</li>
</ul>
<div>The <strong>benefits of writing with <code>eina_log</code></strong> instead of adding <code>printf()</code> is that you can more easily filter the output and you can <strong>keep the debug information</strong> there, without extra impacts. Often people that add <code>printf()</code> will forget them and pollute everybody&#8217;s else output, eventually clashing with user-output (if <code>printf()/stdout</code> and not <code>fprintf()/stderr</code>). Or they remove and when <strong>someone else run into similar bugs</strong> and needs to walk the code and think all over again on where to add logs to figure out the problem. Then it&#8217;s best that the <strong>developer who writes the code leaves proper debug messages with key variables/values, for future debug help</strong>.</div>
<p>Although widely documented and with examples at <a href="http://docs.enlightenment.org/auto/eina/group__Eina__Log__Group.html">http://docs.enlightenment.org/auto/eina/group__Eina__Log__Group.html</a> some still don&#8217;t use it due lack of knowledge, particularly on how to customize the output. They end writing new systems, such as Tizen did with &#8220;<a title="dlog source at Tizen.org" href="https://review.tizen.org/git/?p=framework/system/dlog.git;a=summary" target="_blank">dlog</a>&#8220;.</p>
<p><strong>Customizing Eina_Log output:</strong></p>
<p>The application can specify its own logging function with eina <code>eina_log_print_cb_set(function, function_data)</code>. By default it will use <code>eina_log_print_cb_stderr()</code>, but <code>eina_log_print_cb_stdout()</code> and <code>eina_log_print_cb_file()</code> are available. We&#8217;ll explore the options by writing our own functions (all source hosted at <a href="http://barbieri-playground.googlecode.com/svn/efl-tests/eina-log/">http://barbieri-playground.googlecode.com/svn/efl-tests/eina-log/</a>)</p>
<p><strong>Simple Log to Stderr:</strong></p>
<p>Let&#8217;s start with a simple test that just prints to <code>stderr</code> without fancy formatting. Each line is the log level followed by the actual message:</p>
<pre>#include &lt;Eina.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    fprintf(stderr, "%d: ", level);
    vfprintf(stderr, fmt, args);
    putc('\n', stderr);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
<p>Output:</p>
<pre>$ gcc -o eina-log-simple eina-log-simple.c `pkg-config --cflags --libs eina`
$ ./eina-log-simple
1: Hi there: 1234</pre>
<p>It starts as usual initializing Eina, then sets our function to be used as print callback, then uses the standard macro that logs to the global domain. Our function is also pretty simple and easy to understand.</p>
<p><strong>Simple Log just our domain to Stderr:</strong></p>
<p>How about if we just want the simple output for our application domain, leaving all others with Eina&#8217;s standard <code>eina_log_print_cb_stderr()</code>? This was required by <a href="http://svn.enlightenment.org/svn/e/trunk/edje/src/bin/edje_cc.c">edje_cc tool</a>. It&#8217;s just about using the <code>const Eina_Log_Domain *d</code> parameter!</p>
<pre>#include &lt;Eina.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
   if ((!d-&gt;name) || (strcmp(d-&gt;name, "mydomain") != 0))
     eina_log_print_cb_stderr(d, level, file, fnc, line, fmt, NULL, args);
   else
     {
        fprintf(stderr, "%d: ", level);
        vfprintf(stderr, fmt, args);
        putc('\n', stderr);
     }
}

int main(int argc, char *argv[])
{
   int log_domain;

   eina_init();
   eina_log_print_cb_set(_my_log_cb, NULL);

   log_domain = eina_log_domain_register("mydomain", NULL);

   EINA_LOG_ERR("Hi there: %d", 1234);
   EINA_LOG_DOM_ERR(log_domain, "Just for domain: %x", 0xff00);

   eina_shutdown();
   return 0;
}</pre>
<p>Output:</p>
<pre>$ ./eina-log-simple-domain
ERR: eina-log-simple-domain.c:34 main() Hi there: 1234
1: Just for domain: ff00</pre>
<p>As one can see, just &#8220;mydomain&#8221; is printed in a simpler way, other domains are still using Eina&#8217;s standard output.</p>
<p><strong>Log to Syslog:</strong></p>
<p>If you&#8217;re writing a key component of some platform, such as the phone dialer, you may want to log it to syslog. It may also be useful in some embedded systems. That&#8217;s as simple:</p>
<pre>#include &lt;Eina.h&gt;
#include &lt;syslog.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    int priority;
    switch (level) {
     case EINA_LOG_LEVEL_CRITICAL:
        priority = LOG_CRIT;
        break;
     case EINA_LOG_LEVEL_ERR:
        priority = LOG_ERR;
        break;
     case EINA_LOG_LEVEL_WARN:
        priority = LOG_WARNING;
        break;
     case EINA_LOG_LEVEL_INFO:
        priority = LOG_INFO;
        break;
     case EINA_LOG_LEVEL_DBG:
        priority = LOG_DEBUG;
        break;
     default:
        priority = level + LOG_CRIT;
    }
    vsyslog(priority, fmt, args);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
<p>Output:</p>
<pre>Oct 27 16:20:18 solid eina-log-syslog[25582]: Hi there: 1234</pre>
<p>As simple as you wondered, just noticed that we are converting Eina&#8217;s level to syslog priorities.</p>
<p><strong>Log to Systemd&#8217;s Journal</strong></p>
<p>Systemd will be used in Tizen, then it would be nice to have Eina to log to its powerful Journal system. Lennart wrote a nice article <a href="http://0pointer.de/blog/projects/journal-submit">systemd for Developers III</a> where he explains how to do it and the benefits. Looking at <code>sd-journal.h</code> we can see how to do it:</p>
<pre>#include &lt;Eina.h&gt;
#include &lt;systemd/sd-journal.h&gt;

/* http://0pointer.de/blog/projects/journal-submit */
/* gcc -o test test.c `pkg-config --libs --cflags eina libsystemd-journal` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    char filestr[PATH_MAX + sizeof("CODE_FILE=")];
    char linestr[128];
    int priority;
    switch (level) {
     case EINA_LOG_LEVEL_CRITICAL:
        priority = LOG_CRIT;
        break;
     case EINA_LOG_LEVEL_ERR:
        priority = LOG_ERR;
        break;
     case EINA_LOG_LEVEL_WARN:
        priority = LOG_WARNING;
        break;
     case EINA_LOG_LEVEL_INFO:
        priority = LOG_INFO;
        break;
     case EINA_LOG_LEVEL_DBG:
        priority = LOG_DEBUG;
        break;
     default:
        priority = level + LOG_CRIT;
    }

    snprintf(filestr, sizeof(filestr), "CODE_FILE=%s", file);
    snprintf(linestr, sizeof(linestr), "CODE_LINE=%d", line);
    sd_journal_printv_with_location(priority, filestr, linestr, fnc, fmt, args);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
<p>Output (json-pretty)</p>
<pre>
$ ./eina-log-journal
$ journalctl -o json-pretty
{
        "__CURSOR" : "s=3c7eaf66e4734bb286e54efd20bb9f8d;i=645;b=c6681f0bd53d41d4ba682e12021095e7;m=23487887b;t=4cd0e8d5c0bf3;x=ab7f934fdb40485f;p=system.journal",
        "__REALTIME_TIMESTAMP" : "1351362291698675",
        "__MONOTONIC_TIMESTAMP" : "9471232123",
        "_BOOT_ID" : "c6681f0bd53d41d4ba682e12021095e7",
        "MESSAGE" : "Hi there: 1234",
        "PRIORITY" : "3",
        "CODE_FILE" : "eina-log-journal.c",
        "CODE_LINE" : "50",
        "CODE_FUNC" : "main",
        "_TRANSPORT" : "journal",
        "_PID" : "25655",
        "_UID" : "500",
        "_GID" : "500",
        "_SOURCE_REALTIME_TIMESTAMP" : "1351362291698325",
        "_MACHINE_ID" : "b84a5d286a7bfe411836d69100004cf6",
        "_HOSTNAME" : "solid"
}</pre>
<p>See that we can get our file, line and function to be saved by the journal. Just awesome! <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> </p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/kt23Orc93WI" height="1" width="1" alt=""/><span class="net_nemein_favourites">4 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=f99e9b54206411e29d8c892346603ccf3ccf&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/f99e9b54206411e29d8c892346603ccf3ccf/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=f99e9b54206411e29d8c892346603ccf3ccf&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/f99e9b54206411e29d8c892346603ccf3ccf/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Sat, 27 Oct 2012 18:33:27 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-f99e9b54206411e29d8c892346603ccf3ccf</guid>
        </item>
        <item>
            <title>Eina_Log customizations</title>
            <link>http://blog.gustavobarbieri.com.br/2012/10/27/eina_log-customizations.html</link>
            <description><![CDATA[
<strong>Introduction to Eina_Log:</strong>

EFL provides a powerful logging system called "eina_log", it can help developers and QA engineers a lot by providing key features:
<ul>
	<li><strong>Levels/Priorities with option to disable at compile time:</strong> similar to syslog, one can specify levels such as critical, error, warning, information or debug. An added bonus is that you can compile-out messages above certain levels, removing the function call overhead and the strings from the binary.</li>
	<li><strong>Logging domains:</strong> one can create multiple domains aside from the global/default one, this allows for easy filtering when debugging or looking for errors. Let's say you want debug Edje, just <code>export EINA_LOG_LEVELS="edje:4"</code></li>
	<li><strong>Comprehensive, Colorful default formatting:</strong> it will automatically turn on colors if your $TERM is supported (also works on Windows). Output includes PID, log domain, file name, line number and even thread ID if that's different from the main thread. Some of the components can be toggled with environment variables.</li>
</ul>
<div>The <strong>benefits of writing with <code>eina_log</code></strong> instead of adding <code>printf()</code> is that you can more easily filter the output and you can <strong>keep the debug information</strong> there, without extra impacts. Often people that add <code>printf()</code> will forget them and pollute everybody's else output, eventually clashing with user-output (if <code>printf()/stdout</code> and not <code>fprintf()/stderr</code>). Or they remove and when <strong>someone else run into similar bugs</strong> and needs to walk the code and think all over again on where to add logs to figure out the problem. Then it's best that the <strong>developer who writes the code leaves proper debug messages with key variables/values, for future debug help</strong>.</div>
Although widely documented and with examples at <a href="http://docs.enlightenment.org/auto/eina/group__Eina__Log__Group.html">http://docs.enlightenment.org/auto/eina/group__Eina__Log__Group.html</a> some still don't use it due lack of knowledge, particularly on how to customize the output. They end writing new systems, such as Tizen did with "<a title="dlog source at Tizen.org" href="https://review.tizen.org/git/?p=framework/system/dlog.git;a=summary" target="_blank">dlog</a>".

<strong>Customizing Eina_Log output:</strong>

The application can specify its own logging function with eina <code>eina_log_print_cb_set(function, function_data)</code>. By default it will use <code>eina_log_print_cb_stderr()</code>, but <code>eina_log_print_cb_stdout()</code> and <code>eina_log_print_cb_file()</code> are available. We'll explore the options by writing our own functions (all source hosted at <a href="http://barbieri-playground.googlecode.com/svn/efl-tests/eina-log/">http://barbieri-playground.googlecode.com/svn/efl-tests/eina-log/</a>)

<strong>Simple Log to Stderr:</strong>

Let's start with a simple test that just prints to <code>stderr</code> without fancy formatting. Each line is the log level followed by the actual message:
<pre>#include &lt;Eina.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    fprintf(stderr, "%d: ", level);
    vfprintf(stderr, fmt, args);
    putc('\n', stderr);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
Output:
<pre>$ gcc -o eina-log-simple eina-log-simple.c `pkg-config --cflags --libs eina`
$ ./eina-log-simple
1: Hi there: 1234</pre>
It starts as usual initializing Eina, then sets our function to be used as print callback, then uses the standard macro that logs to the global domain. Our function is also pretty simple and easy to understand.

<strong>Simple Log just our domain to Stderr:</strong>

How about if we just want the simple output for our application domain, leaving all others with Eina's standard <code>eina_log_print_cb_stderr()</code>? This was required by <a href="http://svn.enlightenment.org/svn/e/trunk/edje/src/bin/edje_cc.c">edje_cc tool</a>. It's just about using the <code>const Eina_Log_Domain *d</code> parameter!
<pre>#include &lt;Eina.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
   if ((!d-&gt;name) || (strcmp(d-&gt;name, "mydomain") != 0))
     eina_log_print_cb_stderr(d, level, file, fnc, line, fmt, NULL, args);
   else
     {
        fprintf(stderr, "%d: ", level);
        vfprintf(stderr, fmt, args);
        putc('\n', stderr);
     }
}

int main(int argc, char *argv[])
{
   int log_domain;

   eina_init();
   eina_log_print_cb_set(_my_log_cb, NULL);

   log_domain = eina_log_domain_register("mydomain", NULL);

   EINA_LOG_ERR("Hi there: %d", 1234);
   EINA_LOG_DOM_ERR(log_domain, "Just for domain: %x", 0xff00);

   eina_shutdown();
   return 0;
}</pre>
Output:
<pre>$ ./eina-log-simple-domain
ERR: eina-log-simple-domain.c:34 main() Hi there: 1234
1: Just for domain: ff00</pre>
As one can see, just "mydomain" is printed in a simpler way, other domains are still using Eina's standard output.

<strong>Log to Syslog:</strong>

If you're writing a key component of some platform, such as the phone dialer, you may want to log it to syslog. It may also be useful in some embedded systems. That's as simple:
<pre>#include &lt;Eina.h&gt;
#include &lt;syslog.h&gt;

/* gcc -o test test.c `pkg-config --libs --cflags eina` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    int priority;
    switch (level) {
     case EINA_LOG_LEVEL_CRITICAL:
        priority = LOG_CRIT;
        break;
     case EINA_LOG_LEVEL_ERR:
        priority = LOG_ERR;
        break;
     case EINA_LOG_LEVEL_WARN:
        priority = LOG_WARNING;
        break;
     case EINA_LOG_LEVEL_INFO:
        priority = LOG_INFO;
        break;
     case EINA_LOG_LEVEL_DBG:
        priority = LOG_DEBUG;
        break;
     default:
        priority = level + LOG_CRIT;
    }
    vsyslog(priority, fmt, args);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
Output:
<pre>Oct 27 16:20:18 solid eina-log-syslog[25582]: Hi there: 1234</pre>
As simple as you wondered, just noticed that we are converting Eina's level to syslog priorities.

<strong>Log to Systemd's Journal</strong>

Systemd will be used in Tizen, then it would be nice to have Eina to log to its powerful Journal system. Lennart wrote a nice article <a href="http://0pointer.de/blog/projects/journal-submit">systemd for Developers III</a> where he explains how to do it and the benefits. Looking at <code>sd-journal.h</code> we can see how to do it:
<pre>#include &lt;Eina.h&gt;
#include &lt;systemd/sd-journal.h&gt;

/* http://0pointer.de/blog/projects/journal-submit */
/* gcc -o test test.c `pkg-config --libs --cflags eina libsystemd-journal` */

static void
_my_log_cb(const Eina_Log_Domain *d,
           Eina_Log_Level level,
           const char *file,
           const char *fnc,
           int line,
           const char *fmt,
           void *data,
           va_list args)
{
    char filestr[PATH_MAX + sizeof("CODE_FILE=")];
    char linestr[128];
    int priority;
    switch (level) {
     case EINA_LOG_LEVEL_CRITICAL:
        priority = LOG_CRIT;
        break;
     case EINA_LOG_LEVEL_ERR:
        priority = LOG_ERR;
        break;
     case EINA_LOG_LEVEL_WARN:
        priority = LOG_WARNING;
        break;
     case EINA_LOG_LEVEL_INFO:
        priority = LOG_INFO;
        break;
     case EINA_LOG_LEVEL_DBG:
        priority = LOG_DEBUG;
        break;
     default:
        priority = level + LOG_CRIT;
    }

    snprintf(filestr, sizeof(filestr), "CODE_FILE=%s", file);
    snprintf(linestr, sizeof(linestr), "CODE_LINE=%d", line);
    sd_journal_printv_with_location(priority, filestr, linestr, fnc, fmt, args);
}

int main(int argc, char *argv[])
{
    eina_init();
    eina_log_print_cb_set(_my_log_cb, NULL);

    EINA_LOG_ERR("Hi there: %d", 1234);

    eina_shutdown();
    return 0;
}</pre>
Output (json-pretty)
<pre>
$ ./eina-log-journal
$ journalctl -o json-pretty
{
        "__CURSOR" : "s=3c7eaf66e4734bb286e54efd20bb9f8d;i=645;b=c6681f0bd53d41d4ba682e12021095e7;m=23487887b;t=4cd0e8d5c0bf3;x=ab7f934fdb40485f;p=system.journal",
        "__REALTIME_TIMESTAMP" : "1351362291698675",
        "__MONOTONIC_TIMESTAMP" : "9471232123",
        "_BOOT_ID" : "c6681f0bd53d41d4ba682e12021095e7",
        "MESSAGE" : "Hi there: 1234",
        "PRIORITY" : "3",
        "CODE_FILE" : "eina-log-journal.c",
        "CODE_LINE" : "50",
        "CODE_FUNC" : "main",
        "_TRANSPORT" : "journal",
        "_PID" : "25655",
        "_UID" : "500",
        "_GID" : "500",
        "_SOURCE_REALTIME_TIMESTAMP" : "1351362291698325",
        "_MACHINE_ID" : "b84a5d286a7bfe411836d69100004cf6",
        "_HOSTNAME" : "solid"
}</pre>
See that we can get our file, line and function to be saved by the journal. Just awesome! :-)<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1e71f95b9c6d5ac1f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1e71f95b9c6d5ac1f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1e71f95b9c6d5ac1f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1e71f95b9c6d5ac1f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Sat, 27 Oct 2012 18:33:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1e71f95b9c6d5ac1f9511e799c74d55c3ebdfbddfbd</guid>
        </item>
        <item>
            <title>econnman-1 released</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/QiQiwYjQtkY/</link>
            <description><![CDATA[
<p>Today I&#8217;m releasing the first release of &#8220;econnman&#8221;, the <a href="http://enlightenment.org">EFL</a> user interface for <a href="http://connman.net/">ConnMan</a>.</p>

<a href='http://blog.gustavobarbieri.com.br/2012/08/12/econnman-1-released/econnman-services/'><img width="150" height="150" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2012/08/econnman-services-150x150.png" class="attachment-thumbnail" alt="econnman-services" /></a>
<a href='http://blog.gustavobarbieri.com.br/2012/08/12/econnman-1-released/econnman-service-detail/'><img width="150" height="150" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2012/08/econnman-service-detail-150x150.png" class="attachment-thumbnail" alt="econnman-service-detail" /></a>
<a href='http://blog.gustavobarbieri.com.br/2012/08/12/econnman-1-released/econnman-tech-list/'><img width="150" height="150" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2012/08/econnman-tech-list-150x150.png" class="attachment-thumbnail" alt="econnman-tech-list" /></a>
<a href='http://blog.gustavobarbieri.com.br/2012/08/12/econnman-1-released/econnman-tech-detail/'><img width="150" height="150" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2012/08/econnman-tech-detail-150x150.png" class="attachment-thumbnail" alt="econnman-tech-detail" /></a>

<p>Some time ago raster added a ConnMan module to e17, but then the API broken during 0.5 transition and I rewrote that module. With ConnMan-1.0 the API was changed yet again and our module stopped working.</p>
<p><a href="http://www.politreco.com/">Lucas De Marchi</a> took the task to revive the module and he is still finishing this task&#8230; let&#8217;s say Enlightenment&#8217;s internal widget set (e_widget) is something that can get everyone bored to death! Also the new ConnMan API requires an Agent interface to reply with passwords, usernames and other input that the manager may need. This code was not written before, so these new API and GUI must be written.</p>
<p>Until Lucas can finish his work I took a weekend to play with my favorite language: Python. I was away from Python-EFL for a while, so I was wanting to write some code using it. Python-DBus is super-simple (compare it to C!), so the EConnMan in Python-EFL was a nice thing to play.</p>
<p>We&#8217;ll cooperate efforts: E17 module will only provide the services list and allow to connect and disconnect. It will also provide an Agent, so we can provide passwords. Everything else that is related to configuration will be left to stand-alone &#8220;econnman&#8221; application. This standalone will do the tweaks and show details such as IP and MAC addresses, proxy, tethering and others.</p>
<p>In less than two days I had the base of the code I&#8217;m releasing now. It supports everything I need (IOW: it does not support VPN, Bluetooth-PAN or 3G/Cellular), but it&#8217;s easy to extend to support new features&#8230;. <strong>so patches are welcome!</strong></p>
<p>My delay to have it released was that I wanted to improve theme (both default and detourious) so it look better, as you can see in the screenshots. It&#8217;s still not perfect, particularly the &#8220;Segment Control&#8221; used to show mutually exclusive options (DHCP, Static, Off) is damn ugly!</p>
<p>It also ships with an optional agent (&#8211;agent/-a command line option) that can be used until E17 gets a proper module with agent support.</p>
<p>Download:</p>
<ul>
<li>Tarball: <a href="http://packages.profusion.mobi/econnman/econnman-1.tar.gz">http://packages.profusion.mobi/econnman/econnman-1.tar.gz</a></li>
<li>Repository: <a href="http://svn.enlightenment.org/svn/e/trunk/econnman/">http://svn.enlightenment.org/svn/e/trunk/econnman/</a></li>
</ul>
<p><strong>Future:</strong></p>
<p>Some people want IPv6, Proxy and VPN support. Those are nice ideas, but I personally don&#8217;t need them. So I&#8217;d like some people that use them to step up and do the code&#8230; or at least push me to do them! <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_razz.gif" alt=":-P" class="wp-smiley" /> </p>
<p>Some people want to rewrite it in C and while I can sponsor the idea, it will be much more work for no real gain. With a Python version working one can do the conversion easily, even the helper structures and callbacks can be known beforehand&#8230;</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/QiQiwYjQtkY" height="1" width="1" alt=""/><span class="net_nemein_favourites">7 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=bac81458e4de11e196d39b68c9a646d046d0&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/bac81458e4de11e196d39b68c9a646d046d0/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=bac81458e4de11e196d39b68c9a646d046d0&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/bac81458e4de11e196d39b68c9a646d046d0/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Mon, 13 Aug 2012 00:11:49 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-bac81458e4de11e196d39b68c9a646d046d0</guid>
        </item>
        <item>
            <title>econnman-1 released</title>
            <link>http://blog.gustavobarbieri.com.br/2012/08/13/econnman-1-released.html</link>
            <description><![CDATA[
Today I'm releasing the first release of "econnman", the <a href="http://enlightenment.org">EFL</a> user interface for <a href="http://connman.net/">ConnMan</a>.

<div class="image-gallery">
  <ul>
    <li><a href="http://maemo.org/attachments/2012/08/econnman-services.png" target="_blank"><img src="http://maemo.org/attachments/2012/08/econnman-services-281x300.png" /></a></li>
    <li><a href="http://maemo.org/attachments/2012/08/econnman-service-detail.png" target="_blank"><img src="http://maemo.org/attachments/2012/08/econnman-service-detail-281x300.png" /></a></li>
    <li><a href="http://maemo.org/attachments/2012/08/econnman-tech-list.png" target="_blank"><img src="http://maemo.org/attachments/2012/08/econnman-tech-list-281x300.png" /></a></li>
    <li><a href="http://maemo.org/attachments/2012/08/econnman-tech-detail.png" target="_blank"><img src="http://maemo.org/attachments/2012/08/econnman-tech-detail-281x300.png" /></a></li>
  </ul>
</div>

Some time ago raster added a ConnMan module to e17, but then the API broken during 0.5 transition and I rewrote that module. With ConnMan-1.0 the API was changed yet again and our module stopped working.

<a href="http://www.politreco.com/">Lucas De Marchi</a> took the task to revive the module and he is still finishing this task... let's say Enlightenment's internal widget set (e_widget) is something that can get everyone bored to death! Also the new ConnMan API requires an Agent interface to reply with passwords, usernames and other input that the manager may need. This code was not written before, so these new API and GUI must be written.

Until Lucas can finish his work I took a weekend to play with my favorite language: Python. I was away from Python-EFL for a while, so I was wanting to write some code using it. Python-DBus is super-simple (compare it to C!), so the EConnMan in Python-EFL was a nice thing to play.

We'll cooperate efforts: E17 module will only provide the services list and allow to connect and disconnect. It will also provide an Agent, so we can provide passwords. Everything else that is related to configuration will be left to stand-alone "econnman" application. This standalone will do the tweaks and show details such as IP and MAC addresses, proxy, tethering and others.

In less than two days I had the base of the code I'm releasing now. It supports everything I need (IOW: it does not support VPN, Bluetooth-PAN or 3G/Cellular), but it's easy to extend to support new features.... <strong>so patches are welcome!</strong>

My delay to have it released was that I wanted to improve theme (both default and detourious) so it look better, as you can see in the screenshots. It's still not perfect, particularly the "Segment Control" used to show mutually exclusive options (DHCP, Static, Off) is damn ugly!

It also ships with an optional agent (--agent/-a command line option) that can be used until E17 gets a proper module with agent support.

Download:
<ul>
<li>Tarball: <a href="http://packages.profusion.mobi/econnman/econnman-1.tar.gz">http://packages.profusion.mobi/econnman/econnman-1.tar.gz</a></li>
<li>Repository: <a href="http://svn.enlightenment.org/svn/e/trunk/econnman/">http://svn.enlightenment.org/svn/e/trunk/econnman/</a></li>
</ul>

<strong>Future:</strong>

Some people want IPv6, Proxy and VPN support. Those are nice ideas, but I personally don't need them. So I'd like some people that use them to step up and do the code... or at least push me to do them! :-P

Some people want to rewrite it in C and while I can sponsor the idea, it will be much more work for no real gain. With a Python version working one can do the conversion easily, even the helper structures and callbacks can be known beforehand...

&nbsp;<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1e71f95b726f8721f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1e71f95b726f8721f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1e71f95b726f8721f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1e71f95b726f8721f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Mon, 13 Aug 2012 00:11:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1e71f95b726f8721f9511e799c74d55c3ebdfbddfbd</guid>
        </item>
        <item>
            <title>kmod announcement (and how to help testing it!)</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/ShX2gzyHp8s/</link>
            <description><![CDATA[
<h4>introduction and motivation</h4>
<p>At <a title="ProFUSION embedded systems" href="http://profusion.mobi/">ProFUSION</a> a common topic is how to optimze the system. Not just the speed, but also what and how it is done. Not just for our embedded systems, but also our desktops and laptops.</p>
<p>These discussions led us to be involved in projects that consider this goal, such as <a title="window manager and graphical user interface toolkit" href="http://enlightenment.org/">Enlightenment</a>, <a title="connman - connection manager" href="http://connman.net/">ConnMan</a>, <a title="oFono - open source telephony" href="http://ofono.org/">oFono</a> and <a title="system and service manager for Linux" href="http://www.freedesktop.org/wiki/Software/systemd">systemd</a>. With great projects, come great people and thus enlightening discussions on how to improve things. From these discussions <a title="Lennart Poettering's home page" href="http://0pointer.de/lennart/">Lennart Poettering</a> and <a title="Kay Sievers G+ profile" href="https://plus.google.com/108087225644395745666/posts">Kay Sievers</a> put together a <a title="A Plumber's Wish List for Linux" href="http://0pointer.de/blog/projects/plumbers-wishlist.html">A Plumber&#8217;s Wish List for Linux</a>, with one of the items being of special interest for ProFUSION as it had the potential of also helping embedded systems and speeding up or boots:</p>
<pre>* module-init-tools: provide a proper libmodprobe.so from
module-init-tools:
Early boot tools, installers, driver install disks want to
access information about available modules to optimize
bootup handling.</pre>
<p>One of the reasons for this is that udev will search /sys/devices for all &#8220;modalias&#8221; files and call &#8220;<code>/sbin/modprobe -bv $ALIAS</code>&#8220;, however many of these calls evaluate to an empty list, thus an useless execution of program that will open /lib/modules/`uname -r`/modules.*, load resources, search for something that is not there and return. This could be way cheaper if done inside udev workers. <em>[note: Lucas did measure and noticed 2.5x speedups, stay tuned for benchmarks]</em></p>
<h4>kmod</h4>
<p>Then our developer <a title="Lucas De Marchi personal blog." href="http://www.politreco.com/">Lucas De Marchi</a> proposed to do the libmodprobe and we funded it. After some discussions with Lennart and Kay, it was decided to rename it to <strong>kmod</strong> for shortness and good namespace. The initial goal was to achive a 1:1 replacement of module-init-tools as a library to be used by udev and systemd-modules-load and we are close to it with our <a title="kmod-v2" href="http://www.politreco.com/2011/12/announce-kmod-2/">second release done today</a>! While we miss depmod tool (planned for v3), our kmod-modprobe should be fully functional and if this proves to be true, the logic will move to libkmod to be used by udev.</p>
<h4>we need your testing!</h4>
<p>To ensure kmod-modprobe does what it is supposed to do, we need extensive testing, there is where we need you! Try it on as many systems as possibles and let us know. To do this we recommend:</p>
<pre>$ git clone git://git.profusion.mobi/kmod.git
$ cd kmod
$ ./autogen.sh
$ ./configure --enable-logging \
              --enable-debug --enable-tools \
              --enable-zlib # if you have module.ko.gz
$ make all
$ sudo make install
$ sudo mv /sbin/modprobe /sbin/modprobe-bkp
$ sudo ln -s /usr/bin/kmod-modprobe /sbin/modprobe
$ ls -1 /sys/module/ &gt; ~/original-modules
$ reboot
$ ls -1 /sys/module/ &gt; ~/kmod-modules
$ diff ~/original-modules ~/kmod-modules</pre>
<h4>current users and feedback</h4>
<p>Being a new project in a critical area of Linux system, we expected lots of criticism and rejection by people, but interestingly enough after <a title="kmod-v1" href="http://www.politreco.com/2011/12/announce-kmod-1/">Lucas&#8217; announcement</a> and <a title="LWN article: First version of kmod released" href="http://lwn.net/Articles/472354/">LWN article</a> the feedback was highly positive! We even had some testers and people to help with ideas and experience.</p>
<p>Among the people that joined the project is the current maintainer of module-init-tools package <a title="Jon Masters' home page" href="http://jonmasters.org/">Jon Masters</a>, which announced that <a title="libkmod replaces module-init-tools" href="http://www.jonmasters.org/blog/2011/12/20/libkmod-replaces-module-init-tools/">kmod replaces module-init-tools</a>. He is helping a lot with his knowledge and cases from Red Hat Enterprise Linux, also providing modules from non-trivial platforms such as s390. Last but not least he provided insights to improve module handling on Linux, particularly replacing modules with better alternative as required in enterprise systems.</p>
<p>With Jon&#8217;s blessing we&#8217;ll use the same mailing list <a title="linux-modules mailing list" href="http://vger.kernel.org/vger-lists.html#linux-modules">linux-modules@vger.kernel.org</a> and our git will move to kernel.org soon.</p>
<p>People from ARCH and Debian were also interested and even created packages for it! These guys were extremely helpful to test cases such as gzip modules, 64bits modules with i386 user space and so on. They are: Tom Gundersen (tomegun), Dave Reisner (falconindy) and Marco d’Itri (Md).</p>
<h4>next steps</h4>
<p>Based on our TODO, we have the following ideas for next steps:</p>
<ul>
<li>Finish libkmod-elf.c to provide information required by depmod. I&#8217;m working on this in my depmod branch;</li>
<li>tools/kmod-depmod.c: create a 1:1 compatible tool to generate /lib/modules/`uname -r`/modules.*;</li>
<li>libkmod should export parsed configuration to be used by kmod-modprobe.c &#8211;dumpconfig;</li>
<li>create kmodmock library to be LD_PRELOAD&#8217;ed to redirect some syscalls such as init_module(), delete_module() and open() of /sys and /proc. I&#8217;ve started a branch for this some time ago as &#8220;unittest&#8221; branch but stopped due lack of ELF support at the time;</li>
<li>create unittests and measure coverage. Given kernel modules are user-input they may be broken files and libkmod-elf.c needs to be extensively tested to avoid segmentation fault due out-of-boundaries access. This mean not trusting null terminated string in .strtab section and so on.</li>
<li>create optimized modules.archive that would contain optimized search index and all modules compressed independently, but in the same file. This would save file access and could provide information we don&#8217;t have today, like the uncompressed size of gzipped modules.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/ShX2gzyHp8s" height="1" width="1" alt=""/><span class="net_nemein_favourites">7 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=7f2db5aa2c0211e1be3477741e8fcce1cce1&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/7f2db5aa2c0211e1be3477741e8fcce1cce1/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=7f2db5aa2c0211e1be3477741e8fcce1cce1&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/7f2db5aa2c0211e1be3477741e8fcce1cce1/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Wed, 21 Dec 2011 18:23:19 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-7f2db5aa2c0211e1be3477741e8fcce1cce1</guid>
        </item>
        <item>
            <title>kmod announcement (and how to help testing it!)</title>
            <link>http://blog.gustavobarbieri.com.br/2011/12/21/kmod-announcement-and-how-to-help-testing-it.html</link>
            <description><![CDATA[
<h4>introduction and motivation</h4>
At <a title="ProFUSION embedded systems" href="http://profusion.mobi/">ProFUSION</a> a common topic is how to optimze the system. Not just the speed, but also what and how it is done. Not just for our embedded systems, but also our desktops and laptops.

These discussions led us to be involved in projects that consider this goal, such as <a title="window manager and graphical user interface toolkit" href="http://enlightenment.org/">Enlightenment</a>, <a title="connman - connection manager" href="http://connman.net/">ConnMan</a>, <a title="oFono - open source telephony" href="http://ofono.org/">oFono</a> and <a title="system and service manager for Linux" href="http://www.freedesktop.org/wiki/Software/systemd">systemd</a>. With great projects, come great people and thus enlightening discussions on how to improve things. From these discussions <a title="Lennart Poettering's home page" href="http://0pointer.de/lennart/">Lennart Poettering</a> and <a title="Kay Sievers G+ profile" href="https://plus.google.com/108087225644395745666/posts">Kay Sievers</a> put together a <a title="A Plumber's Wish List for Linux" href="http://0pointer.de/blog/projects/plumbers-wishlist.html">A Plumber's Wish List for Linux</a>, with one of the items being of special interest for ProFUSION as it had the potential of also helping embedded systems and speeding up or boots:
<pre>* module-init-tools: provide a proper libmodprobe.so from
module-init-tools:
Early boot tools, installers, driver install disks want to
access information about available modules to optimize
bootup handling.</pre>
One of the reasons for this is that udev will search /sys/devices for all "modalias" files and call "<code>/sbin/modprobe -bv $ALIAS</code>", however many of these calls evaluate to an empty list, thus an useless execution of program that will open /lib/modules/`uname -r`/modules.*, load resources, search for something that is not there and return. This could be way cheaper if done inside udev workers. <em>[note: Lucas did measure and noticed 2.5x speedups, stay tuned for benchmarks]</em>
<h4>kmod</h4>
Then our developer <a title="Lucas De Marchi personal blog." href="http://www.politreco.com/">Lucas De Marchi</a> proposed to do the libmodprobe and we funded it. After some discussions with Lennart and Kay, it was decided to rename it to <strong>kmod</strong> for shortness and good namespace. The initial goal was to achive a 1:1 replacement of module-init-tools as a library to be used by udev and systemd-modules-load and we are close to it with our <a title="kmod-v2" href="http://www.politreco.com/2011/12/announce-kmod-2/">second release done today</a>! While we miss depmod tool (planned for v3), our kmod-modprobe should be fully functional and if this proves to be true, the logic will move to libkmod to be used by udev.
<h4>we need your testing!</h4>
To ensure kmod-modprobe does what it is supposed to do, we need extensive testing, there is where we need you! Try it on as many systems as possibles and let us know. To do this we recommend:
<pre>$ git clone git://git.profusion.mobi/kmod.git
$ cd kmod
$ ./autogen.sh
$ ./configure --enable-logging \
              --enable-debug --enable-tools \
              --enable-zlib # if you have module.ko.gz
$ make all
$ sudo make install
$ sudo mv /sbin/modprobe /sbin/modprobe-bkp
$ sudo ln -s /usr/bin/kmod-modprobe /sbin/modprobe
$ ls -1 /sys/module/ &gt; ~/original-modules
$ reboot
$ ls -1 /sys/module/ &gt; ~/kmod-modules
$ diff ~/original-modules ~/kmod-modules</pre>
<h4>current users and feedback</h4>
Being a new project in a critical area of Linux system, we expected lots of criticism and rejection by people, but interestingly enough after <a title="kmod-v1" href="http://www.politreco.com/2011/12/announce-kmod-1/">Lucas' announcement</a> and <a title="LWN article: First version of kmod released" href="http://lwn.net/Articles/472354/">LWN article</a> the feedback was highly positive! We even had some testers and people to help with ideas and experience.

Among the people that joined the project is the current maintainer of module-init-tools package <a title="Jon Masters' home page" href="http://jonmasters.org/">Jon Masters</a>, which announced that <a title="libkmod replaces module-init-tools" href="http://www.jonmasters.org/blog/2011/12/20/libkmod-replaces-module-init-tools/">kmod replaces module-init-tools</a>. He is helping a lot with his knowledge and cases from Red Hat Enterprise Linux, also providing modules from non-trivial platforms such as s390. Last but not least he provided insights to improve module handling on Linux, particularly replacing modules with better alternative as required in enterprise systems.

With Jon's blessing we'll use the same mailing list <a title="linux-modules mailing list" href="http://vger.kernel.org/vger-lists.html#linux-modules">linux-modules@vger.kernel.org</a> and our git will move to kernel.org soon.

People from ARCH and Debian were also interested and even created packages for it! These guys were extremely helpful to test cases such as gzip modules, 64bits modules with i386 user space and so on. They are: Tom Gundersen (tomegun), Dave Reisner (falconindy) and Marco d’Itri (Md).
<h4>next steps</h4>
Based on our TODO, we have the following ideas for next steps:
<ul>
	<li>Finish libkmod-elf.c to provide information required by depmod. I'm working on this in my depmod branch;</li>
	<li>tools/kmod-depmod.c: create a 1:1 compatible tool to generate /lib/modules/`uname -r`/modules.*;</li>
	<li>libkmod should export parsed configuration to be used by kmod-modprobe.c --dumpconfig;</li>
	<li>create kmodmock library to be LD_PRELOAD'ed to redirect some syscalls such as init_module(), delete_module() and open() of /sys and /proc. I've started a branch for this some time ago as "unittest" branch but stopped due lack of ELF support at the time;</li>
	<li>create unittests and measure coverage. Given kernel modules are user-input they may be broken files and libkmod-elf.c needs to be extensively tested to avoid segmentation fault due out-of-boundaries access. This mean not trusting null terminated string in .strtab section and so on.</li>
	<li>create optimized modules.archive that would contain optimized search index and all modules compressed independently, but in the same file. This would save file access and could provide information we don't have today, like the uncompressed size of gzipped modules.</li>
</ul><span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1e71f95b4b88b0a1f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1e71f95b4b88b0a1f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1e71f95b4b88b0a1f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1e71f95b4b88b0a1f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Wed, 21 Dec 2011 18:23:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1e71f95b4b88b0a1f9511e799c74d55c3ebdfbddfbd</guid>
        </item>
        <item>
            <title>PythonBrasil[7] = Excellent!</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/wNRVEWB4VXg/</link>
            <description><![CDATA[
<p>Last week from 29-Sep to 01-Oct we had the amazing 7th PythonBrasil conference, for the first time in São Paulo.</p>
<p>Since I&#8217;ve start to use Python in 2002 I loved the language, but after getting introduced to the PythonBrasil community in 2004 I&#8217;ve boosted my development skills, got some friends and even my first job (INdT-Recife) was a kind recommendation from Osvaldo Santana in 2005.</p>
<p>By 2005 we had the 1st PythonBrasil Conference, then called PyConBrasil, here in Campinas with the help of UNICAMP and our amazing non-stop contributor Rodrigo Senra. It was very cool, I even presented a talk there&#8230; and it motivated me to go to following conferences in 2006 and 2007 as well.</p>
<p>However if starting to work at INdT reduced my spare time since late 2006, after ProFUSION was born in 2008 I had no time to participate in the lists or even go to conferences. What a shame!</p>
<p>I couldn&#8217;t see how shameful it was until I did this PythonBrasil in 2011. I&#8217; m yet to see a conference with so kind people. People still remembered me and I was ashamed when I couldn&#8217;t remind their names&#8230; although they did remember mine (<em>NOTE TO CONFERENCE: bigger names next year!</em>) Some would even let me know they still use <a href="http://code.google.com/p/eagle-py/">Eagle-Py</a>, something that I already forgot about. And people I had closer contact before were willing to talk as if we had met last week. Amazing.</p>
<p>During these talks I&#8217;ve catch up with Rodrigo Senra, Luciano, Osvaldo, Erico, Marco André, Sidnei, Fernando and many more I couldn&#8217;t remember. However one of the talks was very special: talked to Gustavo Niemeyer about <strong>Go programming language</strong>. That&#8217;s right, people were so kind and open we had a keynote about Go, and we talked a lot afterwards without problems! <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_razz.gif" alt=":-P" class="wp-smiley" />   Gustavo showed me some nice details about the language and my mind is now burning! I must do Enlightenment Foundation Libraries (EFL) + Go = EGO, a perfect GUI tool.</p>
<p>But I was of use&#8230; not just a leecher! I went there to present 3 talks (slides in Portuguese!):</p>
<ul>
<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-bindings.pdf">Tudo que você sempre quis saber sobre Bindings</a></li>
<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-embedded.pdf">Python em sistemas embarcados: Sim ou Não?</a></li>
<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-canvas2D.pdf">Canvas-2D extremamente rápido usando EFL</a></li>
</ul>
<p>Last but not least, I&#8217;d like to thank everyone that did this amazing conference possible!</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/wNRVEWB4VXg" height="1" width="1" alt=""/><span class="net_nemein_favourites">5 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=911fee84f0ae11e0995389975b483e4d3e4d&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/911fee84f0ae11e0995389975b483e4d3e4d/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=911fee84f0ae11e0995389975b483e4d3e4d&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/911fee84f0ae11e0995389975b483e4d3e4d/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 06 Oct 2011 21:00:41 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-911fee84f0ae11e0995389975b483e4d3e4d</guid>
        </item>
        <item>
            <title>PythonBrasil[7] = Excellent!</title>
            <link>http://blog.gustavobarbieri.com.br/2011/10/06/pythonbrasil7-excellent.html</link>
            <description><![CDATA[
Last week from 29-Sep to 01-Oct we had the amazing 7th PythonBrasil conference, for the first time in São Paulo.

Since I've start to use Python in 2002 I loved the language, but after getting introduced to the PythonBrasil community in 2004 I've boosted my development skills, got some friends and even my first job (INdT-Recife) was a kind recommendation from Osvaldo Santana in 2005.

By 2005 we had the 1st PythonBrasil Conference, then called PyConBrasil, here in Campinas with the help of UNICAMP and our amazing non-stop contributor Rodrigo Senra. It was very cool, I even presented a talk there... and it motivated me to go to following conferences in 2006 and 2007 as well.

However if starting to work at INdT reduced my spare time since late 2006, after ProFUSION was born in 2008 I had no time to participate in the lists or even go to conferences. What a shame!

I couldn't see how shameful it was until I did this PythonBrasil in 2011. I' m yet to see a conference with so kind people. People still remembered me and I was ashamed when I couldn't remind their names... although they did remember mine (<em>NOTE TO CONFERENCE: bigger names next year!</em>) Some would even let me know they still use <a href="http://code.google.com/p/eagle-py/">Eagle-Py</a>, something that I already forgot about. And people I had closer contact before were willing to talk as if we had met last week. Amazing.

During these talks I've catch up with Rodrigo Senra, Luciano, Osvaldo, Erico, Marco André, Sidnei, Fernando and many more I couldn't remember. However one of the talks was very special: talked to Gustavo Niemeyer about <strong>Go programming language</strong>. That's right, people were so kind and open we had a keynote about Go, and we talked a lot afterwards without problems! :-P  Gustavo showed me some nice details about the language and my mind is now burning! I must do Enlightenment Foundation Libraries (EFL) + Go = EGO, a perfect GUI tool.

But I was of use... not just a leecher! I went there to present 3 talks (slides in Portuguese!):
<ul>
	<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-bindings.pdf">Tudo que você sempre quis saber sobre Bindings</a></li>
	<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-embedded.pdf">Python em sistemas embarcados: Sim ou Não?</a></li>
	<li><a href="http://talks.gustavobarbieri.com.br/pyconbrasil7/ProFUSION_pycon-canvas2D.pdf">Canvas-2D extremamente rápido usando EFL</a></li>
</ul>

Last but not least, I'd like to thank everyone that did this amazing conference possible!<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1e71f95b25041a01f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1e71f95b25041a01f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1e71f95b25041a01f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1e71f95b25041a01f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 06 Oct 2011 21:00:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1e71f95b25041a01f9511e799c74d55c3ebdfbddfbd</guid>
        </item>
        <item>
            <title>Introducing EWS to help EFL on FB and PS3</title>
            <link>http://blog.gustavobarbieri.com.br/2011/10/06/introducing-ews-to-help-efl-on-fb-and-ps3.html</link>
            <description><![CDATA[
Lots of systems do not support multi-window on their own, consider standard Linux Frame Buffer (FB) or the PlayStation3. This makes it cumbersome as you're restricted to a single window,  likely you'll have to rewrite your apps to behave well in this scenario.

Traditionally this problem is worked around by toolkits like Qt that provides <a href="http://doc.qt.nokia.com/4.7/qt-embedded-architecture.html">QWS</a>, a great help for developers. Considering QWS I decided to help our PS3 friends with something similar which I shamelessly called <strong>EWS</strong> (Ecore + Evas Single Process Windowing System).

Ecore and Evas already made 99% of this work: they abstract rendering, abstract windowing and so on. There is even support for "inlined windows" in Elementary, these are rendered to buffers that are visible inside other windows. Actually the first version of EWS was a 30min hack in Elementary called "eland" (making fun of wayland). But as not everyone would use Elementary it was better to move it lower in the stack: Ecore_Evas.

Ecore_Evas is a glue layer between Ecore and Evas that takes care to configure actual windows and setup Evas on them, to capture events from various sources and feed them to canvas, etc. If you cope with its API you'll work with most EFL libraries and applications out-of-the-box.

Ecore_Evas_EWS was created as a new engine that builds on top of others. It will use a backing-store engine like X11, FB, DirectFB, WinCE or PS3 to create an internal Ecore_Evas. Every new window created with <strong>ecore_evas_ews_new()</strong> is rendered to an Evas using the buffer engine and its pixels end as the image source in the backing-store engine, displaying it. This is very similar to existing ecore_evas_buffer feature <strong>ecore_evas_object_image_new()</strong>, however it will handle more things automatically.

Among the new features are events to allow window management. Things like "window created", "window moved" and "window resized" are placed in the main loop for interested peers, they may handle these and decorate the windows, offer window management (close, maximize, ...). To exemplify that I've added support in Elementary with basic controls such as move, maximize, restore and close. Unfortunately it looks  ugly like hell and then I'm not posting any screenshot or screencast ;-) Let's wait for people doing themes to make a great work.

The work is far from complete, bugs remain,  optimizations could be applied for OpenGL... if you consider the rules "20/80", 80% of the code was written in 20% of the time, now we'll take 80% to make it work for sure :-D  But it's not bad considering it took me 2 days,  1421 lines in ecore_evas_ews.c, 543 in elu_ews_wm.c and 317 in ews.edc...

That's why I keep saying that EFL is an amazing technology to build products. It runs fast, it's slick and it does not get in the way. Give it a try! :-)<span class="net_nemein_favourites">0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1e71f95afc2d1a01f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1e71f95afc2d1a01f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1e71f95afc2d1a01f9511e799c74d55c3ebdfbddfbd&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1e71f95afc2d1a01f9511e799c74d55c3ebdfbddfbd/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 06 Oct 2011 00:51:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1e71f95afc2d1a01f9511e799c74d55c3ebdfbddfbd</guid>
        </item>
        <item>
            <title>Introducing EWS to help EFL on FB and PS3</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/5w8VA79XmM0/</link>
            <description><![CDATA[
<p>Lots of systems do not support multi-window on their own, consider standard Linux Frame Buffer (FB) or the PlayStation3. This makes it cumbersome as you&#8217;re restricted to a single window,  likely you&#8217;ll have to rewrite your apps to behave well in this scenario.</p>
<p>Traditionally this problem is worked around by toolkits like Qt that provides <a href="http://doc.qt.nokia.com/4.7/qt-embedded-architecture.html">QWS</a>, a great help for developers. Considering QWS I decided to help our PS3 friends with something similar which I shamelessly called <strong>EWS</strong> (Ecore + Evas Single Process Windowing System).</p>
<p>Ecore and Evas already made 99% of this work: they abstract rendering, abstract windowing and so on. There is even support for &#8220;inlined windows&#8221; in Elementary, these are rendered to buffers that are visible inside other windows. Actually the first version of EWS was a 30min hack in Elementary called &#8220;eland&#8221; (making fun of wayland). But as not everyone would use Elementary it was better to move it lower in the stack: Ecore_Evas.</p>
<p>Ecore_Evas is a glue layer between Ecore and Evas that takes care to configure actual windows and setup Evas on them, to capture events from various sources and feed them to canvas, etc. If you cope with its API you&#8217;ll work with most EFL libraries and applications out-of-the-box.</p>
<p>Ecore_Evas_EWS was created as a new engine that builds on top of others. It will use a backing-store engine like X11, FB, DirectFB, WinCE or PS3 to create an internal Ecore_Evas. Every new window created with <strong>ecore_evas_ews_new()</strong> is rendered to an Evas using the buffer engine and its pixels end as the image source in the backing-store engine, displaying it. This is very similar to existing ecore_evas_buffer feature <strong>ecore_evas_object_image_new()</strong>, however it will handle more things automatically.</p>
<p>Among the new features are events to allow window management. Things like &#8220;window created&#8221;, &#8220;window moved&#8221; and &#8220;window resized&#8221; are placed in the main loop for interested peers, they may handle these and decorate the windows, offer window management (close, maximize, &#8230;). To exemplify that I&#8217;ve added support in Elementary with basic controls such as move, maximize, restore and close. Unfortunately it looks  ugly like hell and then I&#8217;m not posting any screenshot or screencast <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" />  Let&#8217;s wait for people doing themes to make a great work.</p>
<p>The work is far from complete, bugs remain,  optimizations could be applied for OpenGL&#8230; if you consider the rules &#8220;20/80&#8243;, 80% of the code was written in 20% of the time, now we&#8217;ll take 80% to make it work for sure <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_biggrin.gif" alt=":-D" class="wp-smiley" />   But it&#8217;s not bad considering it took me 2 days,  1421 lines in ecore_evas_ews.c, 543 in elu_ews_wm.c and 317 in ews.edc&#8230;</p>
<p>That&#8217;s why I keep saying that EFL is an amazing technology to build products. It runs fast, it&#8217;s slick and it does not get in the way. Give it a try! <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /> </p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/5w8VA79XmM0" height="1" width="1" alt=""/><span class="net_nemein_favourites">1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=54ac0f3aefbb11e0a31d4f86d58fcb68cb68&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/54ac0f3aefbb11e0a31d4f86d58fcb68cb68/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>3 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=54ac0f3aefbb11e0a31d4f86d58fcb68cb68&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/54ac0f3aefbb11e0a31d4f86d58fcb68cb68/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 06 Oct 2011 00:51:00 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-54ac0f3aefbb11e0a31d4f86d58fcb68cb68</guid>
        </item>
        <item>
            <title>EFL portability shines: native PS3 support!</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/JFYDGFbwB7I/</link>
            <description><![CDATA[
<p>While most projects praises portability with fancy things like &#8220;gchar&#8221; (Gtk), fancy names like &#8220;LightHouse&#8221; (Qt) or completely new abstraction concepts, The Enlightenment Project always choose a simple approach to use POSIX and fill the gaps as required. This requires much less work and yields the same or better results, as we could see in the past and now being the first toolkit to be ported to PlayStation3 (native, no Linux)!</p>
<div style="text-align: center;"><iframe src="http://www.youtube.com/embed/j2kuxyzY7IU" frameborder="0" width="420" height="315"></iframe></div>
<p>As announced by the the developer, <a href="http://kakaroto.homelinux.net/">KaKaRoTo</a>, in our <a href="http://www.enlightenment.org/p.php?p=news/show&amp;l=en&amp;news_id=33">official news</a> the port was done on top of our existing SDL backend in a couple of days, then being migrated to native PlayStation3 using unofficial SDK <a href="http://psl1ght.com/">PSL1GHT</a> for jailbroken systems. There is still no hardware acceleration, yet it runs fine a physics game at Full HD.</p>
<p>Right now we have port to MacOS and Windows, including WinCE. Given our scarce resources we do not lag behind Qt or Gtk in portability front. Basically what we have is one brave developer called Vincent Torri that is a Math professor and do it on his spare time!</p>
<p>Vincent could do it by keeping our approach: use POSIX and fill the gaps. He created &#8220;Evil&#8221;, a library to provide missing functions to Windows. Kakaroto then created &#8220;Escape&#8221; to do the same for PSL1GHT. Seems this approach works fine <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> </p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/JFYDGFbwB7I" height="1" width="1" alt=""/><span class="net_nemein_favourites">1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=b53dd732e09a11e0b75a13a7e6c00d450d45&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/b53dd732e09a11e0b75a13a7e6c00d450d45/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>2 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=b53dd732e09a11e0b75a13a7e6c00d450d45&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/b53dd732e09a11e0b75a13a7e6c00d450d45/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Fri, 16 Sep 2011 19:22:11 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-b53dd732e09a11e0b75a13a7e6c00d450d45</guid>
        </item>
        <item>
            <title>DesktopSummit 2011 – Berlin</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/wKQMnB0vkHY/</link>
            <description><![CDATA[
<p>I had the pleasure to attend the DesktopSummit 2011, a great event that happened in Berlin from 5-12 of August 2011. <a href="http://maemo.org/2011/06/02/desktopsummit-2011/">As I&#8217;ve mentioned in an earlier blogpost</a> my focus was to highlight Enlightenment&#8217;s opinion that <strong>performance matters</strong> and that we need <strong>broader standards</strong> in freedesktop.org. Of course I explained a bit about our history and the current status of E17. The presentation file can be <a href="http://talks.gustavobarbieri.com.br/desktop_summit/2011/quick-overview-of-efl-and-e17.pdf">downloaded here</a>.</p>
<p style="text-align: center;"><a href="http://www.desktopsummit.org/"><img class="aligncenter size-full wp-image-248" title="DS2011 attending banner" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2011/06/DS2011-attending-banner.png" alt="" width="340" height="111" /></a></p>
<p>All in all the event was great, not just due the talks but mostly due the <strong>friends and side-talks</strong>. Being at these events for a few years I managed to know lots of people from different projects. Not being in a major side (read: KDE or GNOME) I have the gift of free-transit among these fields&#8230; which is pleasant as I can gather ideas from both. <em>[There is no hard or official barriers between them, but the psychological blocks peers from talking to each other and this is quite bad]</em></p>
<p>I came there sponsored by my company (<a href="http://profusion.mobi/">ProFUSION embedded systems</a>) to represent the system that provides a big bucket of our consulting, training and development services: <strong>Enlightenment.</strong>  I had the pleasure to engage into endless conversations with Enlightenment developers and community leaders (Cedric, Boris, Michael, Philippe&#8230;) We discussed a lot how we could broader EFL usage, bring more users, lower the barrier to new developers with easier to use tools and languages and of course how we could get Raster to release E17.</p>
<p>I also tried to learn from other people of technologies as well.  Before I was an Enlightenment hacker I did use and develop with <strong>Qt/KDE</strong> and already knew some icons such as Aaron Seigo, Thiago Macieira, Helio Castro and Sebastian Kügler, which I managed to meet again. Of course my ex-coworkers at INdT and KDE fanatics Artur Duque de Souza, Renato Chencarek were there. And I was introduced to Daker Fernandes Pinheiro, from INdT. We discussed QML, Qt, MeeGo and lots of optimization and API designs. Quite productive!</p>
<p>Being part of Maemo since 2006, attended some GUADEC and hacked <strong>Gtk/GNOME</strong> for fun and work I got to know some icons there as well. I&#8217;ve talked to Lennart Poettering, Marcel Holtmann and Marc-André Lueau, people that I&#8217;ve worked together in a way or another and that are always open minded to discussions. I&#8217;ve also touched base with some people like Lucas Rocha and Zeeshan Ali. It is interesting to know what these guys are doing for Linux Desktop (and mobile) infrastructure and their vision for GNOME.</p>
<p><strong>My presentation</strong> went quite well, I was bit anxious and nervous in such a huge room that held it, but I guess people understood the history of Enlightenment, why we created the &#8220;Foundation Libraries&#8221; (instead of using Gtk or Qt),  our special care with performance and why it will always pay off. I did some heavy critics to FreeDesktop.Org that generated positive feedback from Thiago Macieira (Qt/KDE) and people from other desktops (XFCE/LXDE). Last but not least I&#8217;ve made it clear Enlightenment has serious problems to manage community, <em>we&#8217;re quite bully</em>, and did thank the guys like Philippe Caseiro and other french dudes that are trying to solve this issue.</p>
<p>All in all a great event, with great people! Looking forward to be in next desktopsummit as well!</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/wKQMnB0vkHY" height="1" width="1" alt=""/><span class="net_nemein_favourites">5 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=10847b3acdbf11e0ae2f6dc702f05f005f00&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/10847b3acdbf11e0ae2f6dc702f05f005f00/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=10847b3acdbf11e0ae2f6dc702f05f005f00&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/10847b3acdbf11e0ae2f6dc702f05f005f00/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Tue, 23 Aug 2011 18:39:41 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-10847b3acdbf11e0ae2f6dc702f05f005f00</guid>
        </item>
        <item>
            <title>ANN: LightMediaScanner 0.4.4 released</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/XZfGlbP6YuU/</link>
            <description><![CDATA[
<p>I&#8217;m proud to announce LightMediaScanner 0.4.4 <a href="http://people.profusion.mobi/cgit.cgi/lightmediascanner.git/tag/?id=release_0.4.4">was released</a> and I&#8217;d like to take some time to remind you of this awesome project <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> </p>
<p>While 0.4.4 is no big leap ahead of 0.4.3 I&#8217;m doing this post more to make clear people that the project is still alive and it may be the right tool for you, particularly if you need fast media scanning on your desktop or embedded device.</p>
<h4>Introduction (History)</h4>
<p><a href="http://people.profusion.mobi/cgit.cgi/lightmediascanner.git/">LightMediaScanner</a> (LMS) was born in 2007 during the development of <a href="openbossa.indt.org.br/canola2/">Canola2</a> media player for Nokia N800 Maemo device. We did a previous try at media scanners for Canola1 and did learn a lot, that would be the foundation of LMS.</p>
<p>We had two major problems to solve:</p>
<ol>
<li>scan large amounts of media as fast as possible</li>
<li>don&#8217;t mess with interactivity.</li>
</ol>
<p>The first problem had more qualifiers, like the <strong>media being unreliable</strong> (broken files), be removed without prior notification (mmc removed when system was off), slow discs (sd/mmc), small amount of available RAM, low-end CPU and so on.</p>
<p>Traditional approaches were slow and would bring your device to unusable state for minutes, even after the scan process finished as they consumed too much memory that would swap your applications and services. They would also be naive with file scanning and would trash filesystem&#8217;s cache with useless data.</p>
<h4>Existing Solutions Problems</h4>
<p>At that time we had Maemo&#8217;s media scanner that was awful and <a href="http://projects.gnome.org/tracker/">Tracker</a> was being developed to solve its problems. However Tracker was immature and had other focus, more like being fancy with new standards and trying to solve all the diseases of the world&#8230; while we need to be fast in some specific cases.</p>
<p>To highlight technical problems, let&#8217;s consider JPEG scanners. Everything one Media Player application would need is the  title, author/artist, date, width, height, orientation and maybe geolocation. These are <strong>few bytes</strong>, particularly because Title and Author are missing in most cases. We should open the file, get these bytes, register these and close the file. Every system at the time used libexif to do so, however it would <strong>copy all the header to memory prior to scanning</strong>. Given that most files contain thumbnails in the header, it would mean <strong>useless malloc + read of around 10-50kb</strong>, to get dozen bytes and exit. This trashes the VM and disc. Moreover, some libraries would open the file themselves and would not fadvise as POSIX_FADV_DONTNEED, thus the filesystem would keep it in cache for further access that never happen! Similar situations existed for PNG, Mp3 and others.</p>
<h4>LightMediaScanner Solution</h4>
<p>We decided to go with a 2 process solution to avoid crashes and hang-ups on the main process. This would be safe and we could kill the slave process if it took too long to report on a given file. Later on we introduced threaded and single process scanning that would be useful in some cases.</p>
<p>We also had dynamic loadable plugins (shared objects) with the media parsers to be used given matching extensions. The plugins can be selected by the user at runtime. Yes, <strong>we would not scan every file with every parser</strong>, we did trust the extension as a way to save work and it worked fine, and fast.</p>
<p>The main process just scans the filesystem and  pipes the files to the slave (thread or process). This slave would open the file, get the data to populate a structure to be written to database, then close the file and report back the progress. If the slave takes too long to reply or dies, it&#8217;s respawned with the next file in the queue.</p>
<p>The database uses SQLite3 and a configurable number of files are processed in one SQL transaction, thus we&#8217;d not hit the filesystem with writes that often. The database access is provided with helper functions that uses pre-compiled statements. However we only provide the insert/update methods, as the fetch (select) are up to the application to use (maybe using their own ORM framework).</p>
<p>Some metadata formats did not specify encoding (ASCII was assumed) and fallbacks can be applied with the charsets. It will use iconv in a priority list to figure out what works.</p>
<h4>Just the Indexer!</h4>
<p>LightMediaScanner is not a daemon-service, it does not talk DBus neither requires you to speak  <a href="http://www.w3.org/RDF/">RDF</a> or <a href="http://www.w3.org/TR/rdf-sparql-query/">SPARQL</a>. If you want, you can create one with it, but it does not provide this stuff out of the box. Basically you call it to check for media and then access the database yourself, using the SQLite3 directly or using some ORM, doing caches or not, it&#8217;s up to you.</p>
<p>The database tables are quite simple and try to provide common useful relations. It&#8217;s not designed to cover all weird cases in the world (like multiple artists per song or which lens did you use with your camera).</p>
<h4>Using it!</h4>
<p>Get the code from our GIT or use the release tarball, see <a href="http://people.profusion.mobi/cgit.cgi/lightmediascanner.git/">http://people.profusion.mobi/cgit.cgi/lightmediascanner.git/</a>. It uses standard autoconf/automake to build, so should be familiar to most developers.</p>
<p>It hard-depends only on SQLite3 and iconv (most libC ships with it). Optional dependencies are libvorbis, libmp4v2 and libflac.</p>
<p>You can call the scanner from C, C++ or <a href="http://people.profusion.mobi/cgit.cgi/python-lightmediascanner.git/">Python using our bindings</a>. Comprehensive example can be found at <a href="http://people.profusion.mobi/cgit.cgi/lightmediascanner.git/tree/src/bin/test.c">src/bin/test.c</a></p>
<p>References: <a href="http://blog.gustavobarbieri.com.br/2008/10/05/lightmediascanner-020-released/">previous post about lightmediascanner 0.2.0 release</a></p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/XZfGlbP6YuU" height="1" width="1" alt=""/><span class="net_nemein_favourites">8 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=1c13ee22cab311e08e9f7ffc9723c247c247&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/1c13ee22cab311e08e9f7ffc9723c247c247/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=1c13ee22cab311e08e9f7ffc9723c247c247&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/1c13ee22cab311e08e9f7ffc9723c247c247/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Fri, 19 Aug 2011 22:19:21 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-1c13ee22cab311e08e9f7ffc9723c247c247</guid>
        </item>
        <item>
            <title>Blog recovered</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/1XjHLdlqKEY/</link>
            <description><![CDATA[
<p>Hi all,</p>
<p>After a while not even opening my blog, yesterday I did two posts. While the administrator interface seemed fine, readers quickly notified that it was showing lots of spam in the regular view which I confirmed using Chromium&#8217;s private browsing. Investigations led to dozen administrator accounts in WordPress database, then I decided to reinstall from scratch. Unfortunately yesterday was a busy day and I could barely stay at the computer to do so.</p>
<p>Anyway, this morning I restored my blog and I&#8217;ll try to keep it updated <img src="http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_biggrin.gif" alt=":-D" class="wp-smiley" />  I also changed the comments rule, instead of requiring people to register, I instead opted to close comments after 14 days, since most spammers seems to look for pages with reasonable pagerank and new pages do not have them that soon.</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/1XjHLdlqKEY" height="1" width="1" alt=""/><span class="net_nemein_favourites">3 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=9571f8188dff11e08d95f5b11686ed40ed40&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/9571f8188dff11e08d95f5b11686ed40ed40/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>5 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=9571f8188dff11e08d95f5b11686ed40ed40&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/9571f8188dff11e08d95f5b11686ed40ed40/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Fri, 03 Jun 2011 16:32:29 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-9571f8188dff11e08d95f5b11686ed40ed40</guid>
        </item>
        <item>
            <title>ESC Brazil – RealTime Linux with RT_PREEMPT</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/wk0nmUiBMP4/</link>
            <description><![CDATA[
<p>The first Embedded Systems Conference Brazil was held at São Paulo on 24 to May 25 2011 and <a href="http://profusion.mobi">ProFUSION</a> was there to do a technical talk.</p>
<p>Our contributor <a href="http://www.politreco.com/">Lucas De Marchi</a> proposed the talk &#8220;<em>Usando Linux como Sistema de Tempo Real</em>&#8221; (Using Linux as an Real Time Operating System). He did his master thesis on that topic for 2 years at Politecnico di Milano, so he knows a lot about the topic.</p>
<p>Unfortunately Lucas is one of those geeks that try to live a real-world life and plays football (soccer for americans) and in the week before he broke his foot&#8230; Ouch!</p>
<p>So yours truly was elected to present the talk for him. I already did play with realtime Linux in the past and I knew the concepts from past experiences, thus I accepted the challenge and did the talk. According to the attendees it was a good talk!</p>
<p>People got amazed with Linux&#8217;s Real Time capabilities and the ability to mix it with regular (&#8220;fair&#8221;) tasks, being able to change a process from <code>FAIR</code> to <code>RT</code> during runtime, no recompile was needed! This was demonstrated in a Freescale&#8217;s i.MX31 running music player running with regular priority and ping flood and a heavy CPU task, the music skipped and it was clear the deadlines were not being met. Running <code>chrt</code> and raising the priority above Kernel Threads that handle interruptions immediately fixed the skips. We also ran a softwareÂ oscilloscopeÂ at desktop that plotted the achieved deadlines and it confirmed what we were listening.</p>
<p>If you&#8217;re not aware, RT_PREEMPT is a patchset (from pre-git days, not a git tree called -rt) that Ingo MolnarÂ and Thomas Gleixner run to improve Real-Time behavior for the Linux kernel. As concepts are tested and patches mature they are moved into mainline tree, benefiting everyone using it, even your desktop running PulseAudio now! The major trick of this work was to handle interruptions in Kernel Threads instead of immediately as it used to be. These threads are RT themselves at priority 50 and if you want you can have a regular user process thread at a higher priority and it will run before the kernel. This was the case with the pingflood, with a regular kernel the music could skip due kernel stopping the playback process to handle the network interruption.</p>
<p>Last but not least, if you&#8217;re not familiar with RT have something clear in your mind. <strong>Real Time doesn&#8217;t mean Real Fast</strong>. It just mean you have guarantees to execute things when they should and this is mainly done by means of aÂ preemptiveÂ kernel. In some cases RT will turn things slower, as you may switch contexts more often due preemption, but you&#8217;ll know you&#8217;ll be on time (as opposed to batch processing). Linux being a General Purpose Operating System (GPOS) was not designed with such thing in mind, but it was successfully converted into one!</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/wk0nmUiBMP4" height="1" width="1" alt=""/><span class="net_nemein_favourites">3 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=da69c6508d3511e0ad8325319c07b823b823&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/da69c6508d3511e0ad8325319c07b823b823/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>1 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=da69c6508d3511e0ad8325319c07b823b823&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/da69c6508d3511e0ad8325319c07b823b823/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 02 Jun 2011 16:03:50 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-da69c6508d3511e0ad8325319c07b823b823</guid>
        </item>
        <item>
            <title>DesktopSummit 2011</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/9ZcOPJxssk8/</link>
            <description><![CDATA[
<p>Hi all,</p>
<p>After I started on twitter and facebook the blog posts reduced a lot&#8230; anyways I&#8217;d like to mention I&#8217;ll attend DesktopSummit 2011 in Berlin to represent the Enlightenment (aka E17) team and thus an alternative view to the traditional GNOME x KDE.</p>
<p style="text-align: center;"><a href="http://www.desktopsummit.org/"><img class="aligncenter size-full wp-image-248" title="DS2011 attending banner" src="http://blog.gustavobarbieri.com.br/wp-content/uploads/2011/06/DS2011-attending-banner.png" alt="" width="340" height="111" /></a></p>
<p>Fortunately I have couple of friends in both GNOME and KDE so I can express our E17 voice without being ignored (at least immediately ;-P). Dunno if it&#8217;s me or E17 being the underdog, but people don&#8217;t feel afraid to listen to our ideas and they even try to incorporate those that make sense, like Enlightenment&#8217;s Edje that resulted in QEdje that in turn resulted into QML that boosts Qt development these days.</p>
<p>My focus will be:</p>
<ul>
<li><strong>performance matters:</strong> even if you have a fast hardware today and an even faster hardware tomorrow, you should care about performance. I&#8217;m not talking about neat picking premature optimizations, but to design platforms and <strong>standards</strong> considering performance. It&#8217;s often not harder, just need to be considered from the beginning. What bugs us most is the stupid freedesktop.org <strong>thumbnail</strong> standard, that forces use of PNG even if most of our pictures are in JPEG, causing slower thumbnailing time, bigger disk footprint and slower load times. Second in the list is the traditional abuse of <strong>XML</strong>, praised years ago and suddenly GNOME realized it was a bad idea (given GSetting/DConf), but it&#8217;s deeply inside our desktops with fontconfig and others (want faster application load times? Don&#8217;t use XML.);</li>
<li><strong>Broader Standards:</strong> A standard must be thought outside the &#8220;I&#8217;m implementing it for myself&#8221; scope. Similar to above, we should consider broader standards and not get a piece of GNOME or KDE and say it&#8217;s a standard. Freedesktop.org fails to get standards because of this stupid approach. See the last flamewars around simple topics as the systray replacement. Actually the systray standard is a well known bad example, people wrote it like if GNOME was the only way to do this. Enlightenment officially ignored this standard due stupid bugs with XEmbed specification and approach (as EFL uses the &#8220;windowless widgets&#8221; for a while, the XEmbed made no sense and caused user experience problems);</li>
<li><strong>Embedded is the future.</strong> Okay, it will be a DesktopSummit, but as Rasterman predicted Â in <a href="http://linux.slashdot.org/story/02/07/20/1342205/Rasterman-Says-Desktop-Linux-is-Dead">2002</a> the desktop game is unlike to be changed from Microsoft dominance and we better look for new fields where we can compete equally. Given Android, WebOS, Maemo, MeeGo and others, it&#8217;s clear that Linux does dominated the mobile world. With appliances (from TVs to DVR toÂ <a href="http://www.engadget.com/2010/11/30/infinity-i-kitchen-sports-linux-based-touch-screen-computer-kit/">Refrigerators</a>) being dominated for a while (after the embedded cpus got more powerful, most embedded OS got replaced with Linux). Thus together with performance we must not restrict ourselves to the keyboard-mouse-X11-big-screens approach that we used before. This is not just about scalable (as in multiplication) GUI as people believed SVG would help, but we need different GUI for different environments and our toolkits and infrastructure have to help with that&#8230; something that Apple is currently doing quite well with their iOS UI toolkit providing universal applications that run optimized on both iPad and iPhone/iPod.</li>
</ul>
<p>If you&#8217;re also attending this summit, let&#8217;s meet there and have some beers.</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/9ZcOPJxssk8" height="1" width="1"/><span class="net_nemein_favourites">3 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=d99a41be8d3511e0ad8325319c07b823b823&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/d99a41be8d3511e0ad8325319c07b823b823/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>2 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=d99a41be8d3511e0ad8325319c07b823b823&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/d99a41be8d3511e0ad8325319c07b823b823/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Thu, 02 Jun 2011 15:32:37 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-d99a41be8d3511e0ad8325319c07b823b823</guid>
        </item>
        <item>
            <title>ANN: liblogger</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/5WaOgRKCIPA/</link>
            <description><![CDATA[
<blockquote><p>&#8220;There is no better tool to debug than printf()&#8221;<br />
&#8211; Latin proverb from an old Chinese man.</p></blockquote>
<p>That&#8217;s what every programmer knows. Despite interesting tools like profilers, debuggers and other tracing tool, for a reason or another we often resort to good old <code>printf()</code>. The logic behind this is quite simple: it&#8217;s available everywhere and have no impact on performace (mostly, on both cases &#8212; don&#8217;t be picky!), yet it allows you to check out if your program flow is as you expected and if not, what&#8217;s happening. The bad part, of course, is that it&#8217;s invasive and cumbersome to type, often introduces errors by itself (come on, raise your hand if you never ever wasted hours debugging to notice that the bug was in the debug message!)</p>
<p>GDB and some tools like ltrace or GLibC&#8217;s <a href="http://people.redhat.com/jolsa/latrace/index.shtml">latrace</a> are not always available, particularly on embededd systems they may be available but almost unusable. I hit that in the past weeks during some debugging on an old MIPS where I had to investigate why my supposedly correct program did not work, but a proprietary one did. Documentation is almost inexistent and makes you more clueless than not, thus I had to compare what we were doing differently.</p>
<p>At first I started doing an old trick to create a shared library to be <code>$LD_PRELOAD</code>ed on my own that would log what was being called, then <code>dlopen()</code>/<code>dlsym()</code> the actual symbol, call it, then log again, then return. I did it for a handful functions, some I even printed out structure members and although it worked, soon I got bored and hit by the laziness that most programmers have: I must make this automatic. <strong>Liblogger was born</strong>.</p>
<p><a href="http://barbieri-playground.googlecode.com/svn/liblogger/">Liblogger</a> is Python program that will parse a C header file and generate a source file that does exactly what I described above: log entrance, call the actual function and keep its return value, then log exit, then return the value. That&#8217;s the basics this single-file without external dependencies do. This source file can then be compiled into a shared object or into the final application.</p>
<p>Of course I wanted it to be as helpful as possible, so this first version already includes some nifty features:</p>
<ul>
<li>source file can be compile-time configured using CPP defines to produce colored, thread-safe, timestamped (gettimeofday, clock_gettime), indented (nesting level) output. This output can go to stderr or some given file;</li>
<li>generates makefile for you, creating most of aforementioned variations by default. Just pick the one you want to use and LD_PRELOAD it;</li>
<li>generate types file with all parsed enums, structs, unions and typedefs;</li>
<li>generate formatters file with custom functions to print out known enums, structs and unions. No more copy + sed on the original structs to produce <code>printf()</code> statements manually!</li>
<li>will keep <code>errno</code> intact so functions that rely on it will work as it will not be reset by <code>fprintf()</code> calls;</li>
<li>can be compiled in a thread-safe way, doing locks around <code>dlopen()</code>, <code>dlsym()</code> and the log <code>FILE*</code> to keep messages atomic. It will also keep the indentation level per-thread and print out thread ids (if not main thread);</li>
<li>Behavior is completely controlled with a INI-style configuration file. It can (check for more at <a href="http://barbieri-playground.googlecode.com/svn/liblogger/README.txt">README.txt</a>):
<ul>
<li>tell the parser tokens to ignore;</li>
<li>filter (positively/negatively) functions to log;</li>
<li>specify type formatters you want to use. Couple are provided for basic C types, and you can request it to generate custom formatters for parsed types as mentioned above;</li>
<li>specify return value checkers you want to use. Couple are provided, including one that checks for errno and logs the value as a string;</li>
<li>if types of parameters and return are safe to be used by formatters, this can be used at various levels to provide black-white lists for these and keep it useful and safe;</li>
<li>special handling of return (output) parameters, their values can be dereferenced and printed out after the actual function is called;</li>
</ul>
</li>
</ul>
<p>Usage should be pretty straightforward but I distribute two <a href="http://barbieri-playground.googlecode.com/svn/liblogger/examples/">examples</a>, one for dbus and another for jpeglib. Part of the dbus example is reproduced below:</p>
<ul>
<li>dbus.cfg</li>
<pre>
[global]
headers = dbus/dbus.h
overrides = formatters-%(header_name)s.c
# regular expression for all defines in dbus-macros.h
ignore-tokens-regexp = (DBUS_MACROS_H|DBUS_BEGIN_DECLS|DBUS_END_DECLS|DBUS_BEGIN_DECLS|DBUS_END_DECLS|DBUS_DEPRECATED|DBUS_DEPRECATED|DBUS_DEPRECATED|DBUS_EXPORT|DBUS_EXPORT|DBUS_EXPORT|DBUS_EXPORT)

[type-formatters]
DBusHandleMessageFunction = %(prefix)s_log_fmt_pointer
DBusFreeFunction = %(prefix)s_log_fmt_pointer
DBusHandleMessageFunction = %(prefix)s_log_fmt_pointer

[safe-formatters]
DBusHandleMessageFunction = true
DBusFreeFunction = true
DBusHandleMessageFunction = true

# be pedantic about safety, let's specify all strings independently

[func-dbus_message_new_method_call]
parameter-bus_name-safe = true
parameter-path-safe = true
parameter-interface-safe = true
parameter-method-safe = true
</pre>
</li>
<li>call:
<pre>
liblogger.py \
    --config dbus.cfg \
    --makefile Makefile.dbus-connection \
    --makefile-cflags "\`pkg-config --cflags dbus-1\` -I." \
    --custom-formatters formatters-connection.c \
    /usr/include/dbus-1.0/dbus/dbus-connection.h \
    libdbus-1.so \
    log-dbus-connection.c
make -f Makefile.dbus-connection
LD_PRELOAD=./log-dbus-connection-color-timestamp.so d-feet
</pre>
</li>
</ul>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/5WaOgRKCIPA" height="1" width="1"/><span class="net_nemein_favourites">9 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=698e868a4a9d11e09b469957d46f11651165&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/698e868a4a9d11e09b469957d46f11651165/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=698e868a4a9d11e09b469957d46f11651165&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/698e868a4a9d11e09b469957d46f11651165/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Wed, 09 Mar 2011 21:38:29 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-698e868a4a9d11e09b469957d46f11651165</guid>
        </item>
        <item>
            <title>MeeGo, Nokia… light at the end?</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/B1VukszaeQI/</link>
            <description><![CDATA[
<p>Hello people, as most of open source lovers I&#8217;m still trying to digest Nokia&#8217;s move to WP7. But although many are worried about the future of Meego or the Linux on mobiles, I&#8217;m quite confident.</p>
<p>First, as said before MeeGo is not just about Nokia or phones, it&#8217;s also being pushed as In-Vehicle Infotainment (IVI) and is already <a title="MeeGo becomes infotainment operating system of choice for BMW, GM, Hyundai and more" href="http://www.engadget.com/2010/07/26/meego-becomes-infotainment-operating-system-of-choice-for-bmw-g/" target="_blank">adopted by BMW</a>, which you can see daily contributions on projects such as <a title="ConnMan contribution by BMW" href="http://lists.connman.net/pipermail/connman/2011-February/003668.html" target="_blank">ConnMan</a>. So let&#8217;s not assume it is the end of the world given Nokia&#8217;s action.</p>
<p>Second, although Android and WebOS are indeed Linux since they use this kernel, we often want more traditional user-space stack, like MeeGo would be. For those, Â don&#8217;t loose hope! Today (Feb14, 2011) we got a major announcement at MWC by LiMo: <a title="LiMo Foundation Unveils LiMo 4" href="http://www.limofoundation.org/en/Press-Releases/limo-foundation-unveils-limo-4.html" target="_blank">LiMo Foundation Unveils LiMo 4</a>. It&#8217;s based on X11, WebKit, GNOME and&#8230; EFL!</p>
<p>Wait? Where do you see EFL in that announcement? You&#8217;ll have to check <a title="What is the LiMo 4 Platform?" href="http://www.limofoundation.org/en/what-is-the-platform.html" target="_blank">What is the LiMo 4 Platform?</a> block diagram and see EFL is now a first class component at it, together with GNOME that was there since first release. Yeah, we surely could use better publicity at EFL side <img src='http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>The release is still just text and no code, which should be available by July2011, however you can get code straight from EFL SVN.</p>
<p><a title="ProFUSION embedded systems" href="http://profusion.mobi/" target="_blank">ProFUSION</a> team is happy due our contributions to make this possible, after all we help with EFL and WebKit-EFL developments!</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/B1VukszaeQI" height="1" width="1"/><span class="net_nemein_favourites">8 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=25c15fae388211e083de43184d653eb33eb3&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/25c15fae388211e083de43184d653eb33eb3/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=25c15fae388211e083de43184d653eb33eb3&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/25c15fae388211e083de43184d653eb33eb3/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Mon, 14 Feb 2011 20:53:28 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-25c15fae388211e083de43184d653eb33eb3</guid>
        </item>
        <item>
            <title>systemd!</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/fzTxv_k6AeM/</link>
            <description><![CDATA[
<p>Yeah, I did not write for a while, but that does not mean I&#8217;m dead or changed interests, just that running an always growing company is taking lots of time, with the spare time I get being invested in something interesting and relevant, usually that does not translate to blog posts <img src='http://blog.gustavobarbieri.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  Â However I felt like doing it today.</p>
<p>While most people know me due my graphical user interfaces work, likely related to Enlightenment, I&#8217;m one of those guys that like to consider the system as a whole and not just a subset of it. My main interest since 1998 is graphics, from good old days of tcl/tk and gtk1 to pygame/sdl to qt3/4 and later enlightenment. But I always kept an eye on other bits like boot, networking, sound and so on.</p>
<p>After getting into <a href="http://blog.gustavobarbieri.com.br/2010/01/02/enlightenment-meets-connman/">ConnMan</a> to have a good (and fast) network infrastructure, I started to consider similar bloat-reducing options to other parts of the system. Talking to friends like Holtmann, Lennart and ProFUSION co-workers about the stupid stuff we do in our distributions, like abusing shell scripts for no good&#8230; even tried to resurrect Gentoo&#8217;s bug <a href="http://bugs.gentoo.org/show_bug.cgi?id=69579">#69579</a> (Bootup Time Reduction/General Speedup).</p>
<p>My first idea was simple, hackish and selfish: as I&#8217;m Gentoo user, I could write a shell script compiler that generates threaded-C code with the exact state machine I&#8217;d have using /etc/init.d with OpenRC. It was <strong>simple</strong> (or not so complex) as most of the scripts are start-stop-daemon wrappers with dead-simple usage of OpenRC&#8217;s dependency information (need, use, after, before&#8230;). However it was <strong>hackish</strong> because couple of them are not simple and would require hacks, either special cases or rewrite them natively, to make it work. Last but not least, it was <strong>selfish</strong> as likely it would just fix my problem, or with some luck it could benefit Gentoo as a whole. All of that after I loosing faith in Upstart of couple of tries and talks with related developers.</p>
<p>However sometimes it is better to talk to smart(er?) people before you go do your own stuff. I don&#8217;t feel like I suffer from NIH-syndrome. So talking here and there, JoÃ£o Paulo pointed that Lennart had a still secret project to do exactly what I was aiming, but knowing Lenny, it ought to be good. So I immediately <code>/q -freenode mezcalero</code> and started chatting, with he demonstrating a great cleverness and even proving me wrong in some assumptions, he already thought of much more like merging inted features and how to isolate services in their own control groups&#8230; yeah, he got me in systemd&#8217;s bandwagon.</p>
<p>As I still have tons of other stuff to do, I put the idea on hold and went back to it after several posts and announcements that Fedora 14 would use it. At the first free time slot I checked out the code and Gentoo&#8217;s &#8220;port&#8221;. Well, as expected with young projects it did not cover some special cases, like systems without IPv6 (mine) and Gentoo&#8217;s /etc/init.d scripts were too smart due OpenRC&#8217;s dependency resolver that would make their usage more harm than good. So I had work to do, but it was done and contributed back, with awesome results.</p>
<p>The project and community, also composed of other nice and helpful hackers such as Kay Sievers and Michael Biebl and I felt like it was an excellent project ProFUSION could collaborate, then we invested 2 developers to help it: Fabiano Fidencio and Lucas de Marchi, that got it running on Arch (OpenEmbedded on the way) and added some missing features, like native poweroff/halt/reboot, compile time toggle to disable SysV backward compatibility and so on, runtime fallbacks if no IPv6 and so on.</p>
<p>Right now systemd is very powerful, it can almost fulfill all my needs and likely can manage everything an embedded system would use on its own. From its lightness that reduced my boot in 10s and 2000 process, to nice helpers like its syslog-kmsg bridge. In my opinion, the biggest missing feature is cron-like features to reduce yet-another daemon from boot and centralize it in the &#8220;system daemon &#8212; systemd&#8221;.</p>
<p>If you don&#8217;t know it yet, give it a try. It&#8217;s young however very mature, handling complex cases, providing nice utilities and trying to unify Linux boot process. A short list of its awesomeness would be:</p>
<ul>
<li>each service is isolated in its own control group, being able to apply limits and avoid children processes to exit their parent&#8217;s control (ie: php/perl from cgi-bin exit from their apache tree). Aside from safety, this allows monitoring when a forking service died as all process in its cgroup are gone.</li>
<li>socket activation, like inted/xinetd, allows seldom used servers to not add load to boot process yet they still work as expected, like sshd and cupsd for desktop systems.</li>
<li>lazy mount of filesystems by means of kernel automount. Similarly to socket activation, this lazy mount avoids adding load to boot process and postpone the actual mount when the system actually need files from such mountpoint.</li>
<li>easy to read/write configuration files (units) with ini-like syntax, matching other freedesktop.org projects such as dbus.</li>
<li>native support, properly written in C, to various boot tasks such as loading modules,  load/save random seed, clean temporary files, setup console fonts and keys, enforcing quota checks, creating required directories with correct permissions and so on.</li>
<li>useful helpers such as systemd-kmsg-syslogd that directs /dev/log to /dev/kmsg, that avoids the need of a proper system logger with logrotate on embedded (or desktops that doesn&#8217;t need persistent logging).</li>
<li>awesome readahead code that uses fanotify (temporarily disabled in 2.6.36) to passively collect read files, even while replaying already collected from previous boot &#8212; without stepping on its own toe or major performance hit.</li>
<li>proper integration with DBus to provide race-free activation of system services.</li>
<li>various agent interfaces to request user intervention, like passwords.</li>
<li>proper remote control interface (uses DBus)</li>
<li>proper (optional) SELinux and auditd labeling and interaction.</li>
</ul>
<p>All in all I really like Systemd and I foresee a brilliant future for it, given major distros adopt it officially (Fedora and OpenSuse at least?)</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/fzTxv_k6AeM" height="1" width="1"/><span class="net_nemein_favourites">9 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=03ba3ac4e3b511dfa3db69800ebfc038c038&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/03ba3ac4e3b511dfa3db69800ebfc038c038/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>0 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=03ba3ac4e3b511dfa3db69800ebfc038c038&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/03ba3ac4e3b511dfa3db69800ebfc038c038/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Fri, 29 Oct 2010 22:41:50 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-03ba3ac4e3b511dfa3db69800ebfc038c038</guid>
        </item>
        <item>
            <title>United “sucker” Airlines</title>
            <link>http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/h3lhCLMRkPY/</link>
            <description><![CDATA[
<p><em><strong>Notice:</strong> this is a rant posted only to my &#8220;life&#8221; blog category, if you happen to not like personal stories but got this due some syndication using my global RSS instead of specific, please forgive me and just ignore this post.</em></p>
<p>Ulisses and I had to travel to a conference in Orlando, FL and we did the stupid mistake of booking the flight with United Airlines. Yes, we already had problems with it in the past and we knew <a href="http://www.youtube.com/watch?v=5YGc4zOqozo">United Breaks Guitars</a>, but nonetheless we insisted to give it another try. It was already strange that our flight to Orlando had to go to Washington DC in the first step, then we would have to go through Chicago during our return&#8230; but yeah, it was cheaper and the airlines do these stupid routes to aggregate more people.</p>
<p><strong>Problem#1:</strong> So&#8230; Sunday, June 20th, we were set to depart at 10pm. Given that my birthday was the day before, I was at my family&#8217;s house for a great Brazilian BBQ. However their city is 4 hours away from the airport, you all know the airport checks take some time and they require us to be 3 hours before, so 7 hours earlier I departed. If you happen to like football as I do, and you are Brazilian, you would rather die instead of loosing Brazil versus Ivory Coast in the world cup, but I was forced to.</p>
<p>Arriving at the airport exactly 3 hours earlier, we did the check-in, went through security and waited for hours&#8230; to be notified 20 minutes before that our flight was cancelled due no reason. They rumored that the aircraft had mechanical problems and could not fly.</p>
<p><strong>Problem#2:</strong> We were told that we should go in the next flight at around 1pm the next day&#8230; it was already bad, given that we&#8217;d loose the first conference day, but it became worse once other passengers alerted us that UA actually did <strong>not</strong> had any flights departing at that time! Apparently they were just doing that so they would just have to pay us one hotel night, forcing us to be at the airport in the morning and then wait until 10pm for the actual flight!</p>
<p>We could not afford such delay as the second conference day was the one with the important bits. Thus we made them book us a flight with their partner company &#8220;TAM&#8221;, departing Monday 21th in the morning. The flight was a direct one and that was awesome, with a new airplane with interactive media displays and so on.</p>
<p><strong>Problem#3:</strong> We had to go to Chicago where we had the connection back to SÃ£o Paulo, it was around 2 hour slack between them and so good balance, not much to wait and enough time to get our luggage transferred. But UA was nice to delay our flight departure by 30 minutes. A bit worried, we were confident it was still enough. However during the flight, the pilot announced <em>&#8220;We&#8217;ll have to stop in Kansas to refuel&#8221;</em>, <strong>WTF</strong> we thought immediately. Of course this was a stupid excuse for something that they did not tell us. Kansas it was, long delay&#8230; but we did manage to get to Chicago 30 minutes before our flight departed.</p>
<p>Obviously, while you can walk from one gate to another in 30 minutes, your luggage cannot go through their unknown process and it did not make into the plane.</p>
<p><strong>Problem#4:</strong> We arrived in SÃ£o Paulo and waited for our baggage&#8230; thinking in a logical way, we did know it was not there, but as the government slogan says &#8220;we&#8217;re brazilian and we&#8217;ll never loose hope!&#8221; After confirming that it was not there, we went to United Airline help desk. Strange looks, computer queries and questions about our route in USA, they said it was located in Chicago and should be in Brazil in their next flight, which should be this afternoon (June 29th). The whole they happened, but no news from our luggage&#8230; called them and they said it is still in Chicago, but at this point: would you believe them?</p>
<p><strong>Problem#5:</strong> when entering Brazil you have the usual options &#8220;Nothing to declare&#8221; or &#8220;Goods to declare&#8221;. Often then choose some samples from &#8220;nothing to declare&#8221; to be exhaustively investigated, a quite invasive search I&#8217;d say. We did not had anything to declare, but given that our luggages were not there, we had to go be searched just to be able to have our stuff to be allowed through the Customs without us. WTF, what is the logic behind that?! A huge inconvenience.</p>
<p><strong>Problem#6:</strong> my luggage was package with all my brand new clothes as we had scheduled some meetings with costumers in the conference. For some stupid mistake, I also dispatched my BlackBerry with my luggage since I did not use it for the whole week. Ulisses also had some nice gifts for his daughter in his bag. Very, very likely we&#8217;ll not see such personal items anymore, as they are likely to vanish with our luggage or just handle us opened bags without these items as it already happened to me in the past.</p>
<p>Yeah, United breaks guitars, make you loose your football game, fuck with your business travel, loose your luggage&#8230; what a shame, never using United services in future, this time for real. I did learn my lesson.</p>
<img src="http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/h3lhCLMRkPY" height="1" width="1"/><span class="net_nemein_favourites">5 <a href="http://maemo.org/news/?net_nemein_favourites_execute=fav&net_nemein_favourites_execute_for=66cd77fe83d711df80d99f47cadce60be60b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/fav/midgard_article/66cd77fe83d711df80d99f47cadce60be60b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-favorite.png" style="border: none;" alt="Add to favourites" title="Add to favourites" /></a>3 <a href="http://maemo.org/news/?net_nemein_favourites_execute=bury&net_nemein_favourites_execute_for=66cd77fe83d711df80d99f47cadce60be60b&net_nemein_favourites_url=https://maemo.org/news/favorites//json/bury/midgard_article/66cd77fe83d711df80d99f47cadce60be60b/" class="net_nemein_favourites_create"><img src="http://static.maemo.org:81/net.nemein.favourites/not-buried.png" style="border: none;" alt="Bury" title="Bury" /></a></span>]]></description>
            <author>Gustavo Barbieri &lt;barbieri@gmail.com&gt;</author>
            <category>feed:01c9bb92c8cdc7e3a5fc627f123acc22</category>
            <pubDate>Tue, 29 Jun 2010 23:11:52 +0000</pubDate>
            <guid>http://maemo.org/midcom-permalink-66cd77fe83d711df80d99f47cadce60be60b</guid>
        </item>
    </channel>
</rss>
