bari - Marco Barisione

Strawberry tiramisù

This is an interesting (and delicious) variation of the normal tiramiù, with coffee replaced by strawberry puree. The recipe for the mascarpone mixture, unlike most British and American ones, doesn’t use whipped cream, producing a much better final result. Note that tiramisù contains raw eggs, so you should use very fresh eggs.

Ingredients:

  • 800g strawberries
  • 140g sugar
  • ½ lemon
  • 4 eggs
  • 500g mascarpone
  • 300g savoiardi biscuits (or ladyfingers)

Serves 8 to 10 people.

Quickly wash 500g of strawberries under running cold water and hull them. Cut the strawberries in half and put in a bowl with 60g of sugar and the lemon juice. If you have time, set aside the strawberries for about one hour.
Put the strawberries and the juice they released in a blender and blend until you get a liquid puree. If you don’t like the tiny strawberry seeds, you can strain the puree through a fine sieve.

Whisk the yolks with the remaining sugar until the mixture is fluffy. Add the mascarpone and mix well. In another bowl, whip the egg whites until stiff peaks form. Delicately fold the whipped whites in the mascarpone mixture.

For normal tiramisù I prefer whole savoiardi biscuits, but, in this case, they don’t soak the puree as well as coffee, so I prefer to cut them in half lengthwise. If you are in a hurry, you can skip this step.
Soak a few savoiardi at a time in the strawberry puree and arrange them in a serving dish (I usually use a 35×23 cm Pyrex dish). You should use about half of your biscuits for the first layer. Spread half of the mascarpone mixture over the savodiardi. Repeat with another layer of soaked biscuits and one of mascarpone mixture.

Wash and hull the remaining strawberries. Cut the strawberries lengthwise and decorate the tiramisù with them.
Refrigerate for at least 8 hours before serving.

bari - Marco Barisione

Hazelnuts and cheese risotto with port wine reduction

I got inspired for this risotto recipe, one of my favourites, by a restaurant in Vercelli.
In Italy I would use a toma cheese from Piedmont to prepare this recipe, but this kind of cheese is difficult to find here. After a few experiments I found out that Ossau-Iraty is quite similar to toma cheeses, but I also add some creamy Gorgonzola to add a bit more flavour and creaminess. It’s important that you get the creamy version of Gorgonzola (like the one in the picture below) because the stronger version would cover the flavour of the Ossau-Iraty. Alternatively, you can replace the gorgonzola with Galbani Dolcelatte (it’s similar in flavour, very easy to find and cheaper too).

Ingredients:

  • 50g hazelnuts (possibly already toasted and chopped)
  • 0.8 liter vegetable broth
  • 2 tablespoon extra virgin olive oil (or 1 knob of butter)
  • 1 medium onion or 2 shallots
  • 320g risotto rice (Carnaroli, Vialone Nano or Arborio)
  • 1 small glass of white wine
  • 180g Ossau-Iraty cheese
  • 75g creamy gorgonzola
  • 30g butter
  • 50g grated Parmigiano Reggiano
  • ground black pepper
  • salt

Ingredients for the port reduction:

  • 240g port wine
  • ¼ teaspoon cinnamon powder

Serves 4 as a main course, 6 as a first course.

First of all, read the recipe for basic risotto for hints about making risotto.

If you are using non-toasted hazelnuts, preheat your oven to 180 °C. Place the hazelnuts in a baking pan and put in the oven for about 10 minutes. Let the hazelnuts cool down enough to be handled easily. Get a few hazelnuts in your hands and rub them to remove the skins (don’t worry if some skins don’t come off).
Chop the hazelnuts into small pieces.

Heat up the broth in a pan, or prepare one if you are using fresh ingredients.
Finely chop the onion or shallots and fry on low heat in a pan with a knob of butter or with the olive oil. When the onion starts getting slightly translucent, but it’s not browned, add the rice. Turn up the heat to medium-low and fry the rice for 2 minutes stirring often.
Add the wine and stir. It should evaporate quickly.

When the wine is evaporated, add a ladle of broth. Add some salt and ground black pepper. Whenever the liquid in the pan is absorbed, add another ladle of broth. If you run out of broth before the rice is ready, you should start adding boiling water.

While the rice is cooking dice the Ossau-Iraty in small pieces and the Gorgonzola in big chunks.
Prepare the port reduction by putting the port in a small pan with the cinnamon. Bring to a boil and let simmer until reduced to about half.

The rice needs to be cooked al dente; it’s ready when it’s not hard any more but it is still firm inside. It will take about 15 minutes, but it depends on the rice you are using.
Check for seasoning and add more salt and black pepper if needed.

Turn off the heat. Add the butter and the three cheeses, and stir well. Cover the pan and allow to sit for 2 or 3 minutes.
Stir again and transfer to serving plates. Pour the port reduction on the risotto and sprinkle it with the chopped hazelnuts.

bari - Marco Barisione

Basic risotto

Risotto has always been one of my favourite dishes, also because I come from Vercelli, a small city that produces and exports a lot of rice. Making risotto is not difficult as long as you use the right rice, you cook it correctly (it’s not just boiled rice with a sauce added at the end) and, when it’s cooked, you let it sit with butter and cheese for a few minutes to make it creamy. This recipe is just a basic risotto to show you how to make a good risotto, so it’s not particularly tasty without other ingredients.

There are a lot of varieties of rice and the one for risotto needs to be rich of starch to produce a creamy result, but it should not fall apart while cooking. The most commonly used types of rice are Arborio, Carnaroli (in the picture above) and Vialone Nano. I prefer Carnaroli as it’s very rich of starch but remains firm after cooking, even if you accidentally overcook it a little bit. Vialone Nano is a very good risotto rice that absorbs the condiment well, but it doesn’t stay as firm as Carnaroli. Arborio is the most common rice for risotto, probably because it’s also the cheapest one, but it’s not as good as the others.
The brand of rice I usually buy in England is Riso Gallo Carnaroli. Despite being far from the best rice I ever tried, it’s the best that can be easily found here, but it’s twice as expensive as some Arborio rice brands.

Ingredients:

  • 0.8 liter broth (vegetable or chicken)
  • 2 tablespoon extra virgin olive oil (or 1 knob of butter)
  • 1 medium onion or 2 shallots
  • 320g risotto rice (Carnaroli, Vialone Nano or Arborio)
  • 1 small glass of white wine
  • 50g butter
  • 100g grated Parmigiano Reggiano
  • ground black pepper
  • salt

Serves 4 as a main course, 6 as a first course.

Heat up the broth in a pan, or prepare one if you are using fresh ingredients. A good broth is important for a basic recipe like this one, but for other recipes I usually just add some stock cubes to the rice and then add water from a kettle instead of adding the broth.

Choose a pan that would be large enough to fit the uncooked rice in a layer of 1 or 2 centimeters. Finely chop the onion or shallots and fry on low heat in the pan with a knob of butter or with the olive oil.
When the onion starts getting slightly translucent, but it’s not browned, add the rice. Turn up the heat to medium-low and fry the rice for 2 minutes stirring often. This step is needed to toast the rice so it will remain firmer when cooked.
Add the wine and stir. It should evaporate quickly.

When the wine is evaporated, add a ladle of broth. If you are as lazy as me and you are using a stock cube and water, you should add the crumbled stock cube now. Add some salt and ground black pepper.
Let the risotto absorb the water, when it’s almost completely absorbed add another ladle of broth. Keep adding broth when needed until the rice is cooked. If you run out of broth before the rice is ready, you should start adding boiling water.
The rice needs to be cooked al dente; it’s ready when it’s not hard any more but it is still firm inside. It will take about 15 or 16 minutes since you added the fist ladle of broth if you are using Carnaroli. The cooking time for Arborio is 13 or 14 minutes, and for Vialone Nano it’s 12 or 13 minutes.
Check for seasoning and add more salt and black pepper if needed.

Turn off the heat. Add the butter and Parmigiano cheese, and stir. Cover the pan and allow to sit for 2 or 3 minutes. This step, called mantecatura, is what makes good risottos so creamy.
Stir again and serve.

bari - Marco Barisione

Better notification support

Yesterday I released a new version of my message notification extension for gnome-shell (3.2 and 3.4), to install it or to update it just visit its page on extensions.gnome.org.

The main feature in the new version is that it just handles notifications coming from well-known applications: Empathy, XChat, XChat-GNOME, Pidgin and notify-send. Handling the Empathy notifications is easy because they are well integrated with the shell, but the other notifications required some hack because all the applications handle notifications in different ways. I did my best to make the notifications as useful as possible, similar to the Empathy ones, but there are some small limitations.
Some of the handled applications require plugins to show notification bubbles:

  • Pidgin: Click on the “Tools” menu and then “Plug-ins”. Make sure that the “Libnotify Popups” plugin is enabled. If the plugin is not in the list it means you need to install it. On Debian the package is called “pidgin-libnotify”, other distros should have a package with a similar name.
  • XChat-GNOME: Click on the “Edit” menu and then “Preferences”. In the “Scripts and Plugins” tab make sure that “On-screen display” is enabled.
  • XChat: Click on the “Settings” menu and then “Preferences”. In the “Alerts” tab make sure that “Show tray baloons” is enabled for both “Private Message” and “Highlighted Message”. If the notifications pile up in the bottom right corner of your screen and clicking on them does nothing, it means that XChat is using notify-send because it cannot find libnotify. I don’t know how to fix this issue on different distros, but I found a Red Hat bug explaining the problem.

Message notification
Notifications coming from Empathy and XChat-GNOME

Is there any other common application that you would like to be handled by my plugin? The only prerequisite is that they somehow use standard notification bubbles (and this means I cannot implement it for Skype).

If you are looking for the source code, it’s in this git repository.

bari - Marco Barisione

Nuovo blog in inglese

Più di quattro anni fa mi sono trasferito in Inghilterra per lavoro. All’inizio ho provato a continuare ad aggiornare questo blog, ma alla fine mi sono arreso. Qui mi capita spesso di cucinare ricette con ingredienti difficili da trovare in Italia e, vice versa, non riesco a trovare alcuni ingredienti italiani, quindi mi era passato la voglia di bloggare in italiano. Alla fine mi sono arreso all’evidenza: difficilmente aggiornerò ancora questo blog, ma lo terrò vivo visto che ricevo ancora parecchie visite, in particolare per le ricette della tarte tatin e della torta ricotta e pere.
Nel frattempo ho creato un nuovo blog di ricette, questa volta in inglese, chiamato gnocchialpesto.co.uk. Su questo blog posterò varie ricette, soprattutto italiane, che possono essere preparate con ingredienti che si trovano facilmente in Inghilterra. Se capite l’inglese seguitemi sul mio nuovo blog! :)

bari - Marco Barisione

Updated message notifier and new cooking blog

A few months ago I wrote a gnome-shell extension that shows how many conversations with unread messages you have, so that I could stop missing incoming messages.
I updated the extension so it now works better and it can also show what the incoming notifications are when you press the icon. You can get the new version (and install it with just two clicks) from extensions.gnome.org. If you previously installed the extension from git and you don’t have an update button on that page it could mean you need to first manually remove ~/.local/share/gnome-shell/extensions/message-notifier@shell-extensions.barisione.org/ and reload the shell (ALT-F2 and then type “r”).

Message notification

Note that the extension shows the number of conversations with new messages and not the number of messages; I don’t like seeing “2” up there if somebody just wrote me “hi” and then “how are you?”.

There is still a major problem with the extension. I wanted to be able to also see if somebody pinged me on IRC (I’m a XChat-GNOME user) so I don’t limit the count to active chat conversations, but I consider all the active notifications. I find this very useful to avoid missing something, but it means that the red icon will also appear every time banshee or rhythmbox change song. Suggestions on how to solve this?

Changing completely topic, I recently moved to a new home and, having a nice new kitchen (with dishwasher), I started cooking a lot again. I decided to start a new cooking blog called gnocchialpesto.co.uk to keep track of my recipes and share them with others. If you like food, in particular Italian one, take a look at it :).

bari - Marco Barisione

Bonet

Bonet, pronounced like if it were written as “boonet”, is a typical dessert from Piedmont with amaretti biscuits and cocoa.

There are two types of amaretti, soft and hard. For this recipe we need the hard and crunchy ones. They can easily be found in all the major UK supermarkets, the most common brand is shown in the picture below.

I prefer cooking bonets in savarin moulds (circular and with a hole in the middle). You can also use loaf tins or, if you prefer single portions, ramekins.

Ingredients for the caramel:

  • 80g white sugar

Ingredients:

  • 6 whole medium eggs
  • 150g sugar
  • 60g unsweetened cocoa powder
  • 200g hard amaretti biscuits
  • 300g double cream (or replace with milk)
  • 450g semi-skimmed or whole milk
  • 1 small cup of espresso coffee or 3 teaspoons of instant coffee (optional)
  • 50g amaretto liqueur (optional)

Serves 8 to 10 people.

Prepare the caramel. Making caramel is easier than most people think, but you need to pay attention because it’s very hot and it gets solid really quickly when the temperature decreases.

Place the sugar in a pan with a thick bottom. The right size for the pan should allow the sugar to cover the bottom completely but the sugar layer should not be thicker than half a centimeter. Turn on the heat and leave on medium-low until the sugar starts to get liquid. Never stir while making caramel!
When the caramel starts getting liquid and bubbling on the sides, turn down the heat. Let cook undisturbed until the caramel is completely liquid and brown, the right colour is the one in the picture below. If most of the sugar seems to have turned into caramel but a few chunks are still hard and white, you can use the tip of a knife to break them.
When the caramel is ready, pour it quickly in the bonet mould. Pay attention because the mould will get hot quickly.

Prepare the bonet. Whisk together 3 eggs, the sugar and the cocoa powder. When mixed well, add the other eggs and mix again. I prepare the mixture starting with 3 eggs so that you can easily mix the ingredients without ending up with lumps of cocoa and without over-whisking. It’s important to avoid over-whisking; too much air ruins the texture of the bonet, so you should also avoid using an electric whisk.

Grind the amaretti biscuits until you get a fine powder. Add to the egg mixture the amaretti powder, the coffee, the amaretto liqueur, the cream and the milk, and mix. Pour the mixture into the mould or ramekins.

Put the mould or ramekins in a bigger ovenproof pan (a roasting pan for instance). Add room temperature water to the pan until it reaches two thirds of the height of the bonet mould.
Place the pan in a preheated oven at 180 °C. Cook the bonet for 60 minutes if you are using a big mould or loaf tin. If the shape of the mould you used makes the mixture very thick you will need to cook the bonet 10 more minutes. If you are using ramekins it will take just 45 minutes.
When the dessert is cooked, remove the pan from the oven and leave the mould in the water until it reaches room temperature.

Refrigerate for at least 8 hours, but it’s much better if you prepare the bonet a couple of days in advance. When it’s time to serve, pass a knife around the mould, put a plate upside down on top of the mould, keep the two together with your hands and turn them upside down quickly. Pour the caramel remaining in the mould on top of the bonet. You can decorate with whole or crushed amaretti. Making caramel is easier than most people think, but you need to pay attention because it’s very hot and it gets solid really quickly when the temperature decreases.

Place the sugar in a pan with a thick bottom. The right size for the pan should allow the sugar to cover the bottom completely but the sugar layer should not be thicker than half a centimeter. Turn on the heat and leave on medium-low until the sugar starts to get liquid. Never stir while making caramel!
When the caramel starts getting liquid and bubbling on the sides, turn down the heat. Let cook undisturbed until the caramel is completely liquid and brown, the right colour is the one in the picture below. If most of the sugar seems to have turned into caramel but a few chunks are still hard and white, you can use the tip of a knife to break them.
When the caramel is ready, pour it quickly in the bonet mould. Pay attention because the mould will get hot quickly.

bari - Marco Barisione

Vitello tonnato

Vitello tonnato, literally “tunnied veal”, is a typical summer dish from Piedmont (the region where Turin is) that is usually eaten as a second course or as a starter. The typical version of this dish is composed by thin slices of veal covered with a tuna-based creamy sauce. Considering that veal is expensive and difficult to find, I prefer to use pork fillet as it produces a very similar result for a fraction of the cost (and it’s also much quicker to cook).
This dish must be prepared at least one day in advance because the flavours need time to blend together.

Ingredients for the meat:

  • 1 pork fillet (the weight is usually between 400 and 500g)
  • 1 carrot
  • 1 onion
  • 3 cloves
  • 1 rib of celery
  • 2 bay leaves

Ingredients for the sauce:

  • 3 whole eggs
  • 50g of (possibly stale) white bread (that’s one thick slice)
  • 3 tablespoons of vinegar
  • 2 tablespoons of capers
  • 150g drained canned tuna
  • 5 anchovy fillets
  • Worcestershire sauce (optional)
  • ground black pepper
  • salt

Serves 6 as a starter, 4 as a second course.

Peel and quarter the onion. Clean both the carrot and the celery, and chop them in a few big pieces.
Put all the ingredients for cooking the meat, except for the meat itself, in a pan with enough water to cover the pork. Bring the water to a boil and let it simmer for 15 minutes. Add the pork fillet to the boiling water and let it simmer for 20 minutes. It’s important that the water is just simmering or the pork will get tough.

After 20 minutes remove from the heat and let the pork cool down inside the broth. It should take at least one hour.

While the meat is cooling, you can start preparing the sauce. Place the whole eggs in a small pan, cover with room temperature or cold water and bring to a boil. When the water starts boiling cook the eggs for about 8 minutes. Cool down under running cold water and peel them.

If the capers are preserved under salt rinse them to remove it. Do the same with the anchovies if they are preserved under salt.

Break the bread into a few pieces and put it in a bowl together with the vinegar. After a few minutes place the bread, the roughly chopped eggs, the capers, the drained tuna, the anchovies, a few drops of Worcestershire sauce and some ground black pepper in a blender. Add about 100g of the broth where the meat was cooked.
Blend the mixture until smooth. The end result should be a smooth and creamy sauce that is more liquid than mayonnaise, but not too runny. The sauce will probably be still too thick at this stage, so add more broth until you get the expected result. Season with salt and black pepper to taste.

Remove the pork fillet from the broth and pat it dry with some kitchen towels. Slice the pork fillet thinly and place in a big enough plate so that the slices cover the plate completely but overlapping as little as possible. Cover the meat uniformly with the sauce. If you want, you can decorate the dish with capers and lemon slices.

Refrigerate for at least one day before serving.

bari - Marco Barisione

Pasta alla carbonara

Let’s start this blog with a dish that, despite being simple, is rarely good outside Italy. Pasta alla carbonara should be creamy, but the creaminess should be achieved without using any cream, and should not contain any extraneous vegetables (no garlic and no onions) or meat (no chicken please!), just some form of bacon.
The most traditional bacon to use is guanciale (made from pig’s cheeks), but it’s difficult to find. Unsmoked pancetta cubes, usually sold in double packs like in the picture below, are the best choice and are available from most grocery stores. If you cannot find pancetta, you can use unsmoked lardons, but they are usually bigger so they need to be chopped in smaller cubes.

Ingredients:

  • 250g spaghetti
  • 130g unsmoked pancetta cubes (or lardons)
  • 3 yolks and 1 whole egg
  • 15g parmigiano reggiano (grated)
  • 15g pecorino romano (grated, you can replace with parmigiano)
  • salt
  • ground black pepper

Serves 2 as a main course, 3 as a first course.

Cook the pasta in salted boiling water according to the instructions on the packet (the cheese and pancetta are salty, so don’t add too much salt in the water).

While the pasta is cooking, add the pancetta to a small frying pan and cook on medium-low heat for a few minutes, until it’s lightly golden. When done, remove from the heat and set aside.

Meanwhile, add the yolks, the whole egg, the cheeses and some black pepper to a bowl or deep dish. You can just use more parmigiano if you don’t have pecorino. Mix the egg mixture with a fork.

When the pasta is cooked, drain it and put it back in the pan (but not on the hob), add the egg mixture and mix quickly. The residual heat in the pasta and pan will cook the egg; by mixing quickly you will prevent the eggs from forming overcooked lumps. Add the pancetta, including the fat remaining in the pan, and mix again. Serve with some more black pepper on top.

bari - Marco Barisione

Permanent IM notifications

Update: the extension is now available on extensions.gnome.org.

Gnome 3 and the shell look really great, but there are a few things that annoy me. My main complaint is that I keep missing IM messages because there is no visual clue that you got a message (unless you are staring at the bottom of your screen exactly when you receive something).
This problem will probably be fixed in the next version of Gnome, see bug #641723, but I wanted something now. That’s why I wrote a simple extension that just displays the number of conversations with unread messages. To install it, just clone the git repository and execute “make install”.

Spot the difference
Spot the difference

The extension is unpolished, it does very little, the code is horrible and I didn’t pay any attention to usability; I just wanted a quick fix while waiting for upstream to fix the bug properly. Nevertheless, I hope this code will be useful for other people too!

bari - Marco Barisione

Broken GTalk calls

Recently Google updated their XMPP servers to use standard Jingle for audio and video calls; see the “Google: The Future is Jingle” post on xmpp.org for some more details.
This would be good news for us, except that, by doing so, they broke calls in telepathy-gabble (so in Empathy, the N900 and MeeGo) in multiple ways.

Luckily GTalk developers were really cooperative and they agreed on fixing their servers and Will and Olivier already fixed Gabble too. The new version of Gabble (0.12.2 for the stable branch and 0.13.1 for the development one) should make calls work again on the desktop, MeeGo and on Harmattan (i.e. the N9 and N950) too.
For the N900 we don’t have any way to release updates, but Google will push an update to their servers (in the next week or two hopefully) with a N900-specific workaround.

Sadly video calls on the N900 will keep not working; the version of gst-dsp on the N900 doesn’t properly handle changes in the parameters of the stream :(.

Update: just to be clear, this affects only calls from GTalk to gabble. Calls in the other direction still work and calls between two devices of Gabble work too.

bari - Marco Barisione

Folks and QtContacts

At the moment I’m at the MeeGo conference in Dublin, finally finding a bit of time to blog on what I have been working on for the past 2 weeks. The conference is really well organised and the location is a bit unusual but awesome. For me, the best thing about this conference seems to be the possibility of meeting so many people that I know because of GNOME, Collabora and Maemo/MeeGo. Considering that Collabora is now employing several KDE people, this conference is also a good way to meet more KDE developers while awaiting for the Desktop Summit in Berlin.


The Aviva stadium

Nowadays, Empathy uses libfolks to access contacts and to merge multiple contacts (called personas in Folks) into a single “meta-contact” (called individual).
On MeeGo, on the other hand, it seems that QtContacts (part of QtMobility) is the future. QtContacts is just an API and relies on backends for the actual access to contacts, so why not trying to have QtContacts using libfolks? In the last weeks I worked a bit on writing a QtFolks backed for QtContacts and a small demo written in QML to show what the backend can do.

The demo showing some of my XMPP contacts
The demo showing some of my XMPP contacts

Folks doesn’t just want to be a library for IM contacts, but a generic library to access all of your contacts. The next logical step was to add extra backends to access more sources of contacts.
If you use the Facebook XMPP server, you can already have access to Facebook friends and chat with them, but you don’t get all the information that are available through the web API. This is why I modified the Facebook libsocialweb plugin to also access Facebook contacts and added new interfaces to libfolks to expose this information. Moreover, we can rely of the Facebook ID to automatically merge the persona from the Facebook XMPP and the one from the Facebook web API into a single individual.

A contact with multiple IM addresses and information coming from Facebook too
A contact with multiple IM addresses and information coming from Facebook too

guido - Guido Vicino

Anche io sarei potuto diventare un pirata

“..ci sono pirati che violentano le ragazzine. Ci sono ricchi mercanti che vendono armi alle nazioni in cui i bambini non hanno cibo da mangiare. Ci sono proprietari che impiegano bambini come manodopera[..].Quando stiamo in piedi davanti alla montagna,subito prima di Toccare la Terra capiamo di essere non solo bodhisattva ma anche le vittime stesse dell’oppressione e dell’ingiustizia. Noi siamo il pirata che sta per violentare la ragazzina e siamo la ragazzina che sta per essere violentata dal pirata. La famiglia in cui viveva quel pirata viveva nella miseria più nera, suo padre era un pescatore che conosceva un solo mezzo per dimenticare i suoi problemi,la bottiglia;un uomo che non sapeva educare il figlio e lo picchiava spesso.Alla morte del padre poi,aveva continuato il mestiere suo;non aveva rìisorse per comprendere o amare. Il giovane aveva ceduto alla tentazione di diventare un pirata. In mare aperto non c’era la polizia,quindi perchè non seguire l’esempio dei suoi compagni e violentare quella ragazzina,sulla barca che aveva assalito?
Se avessimo avuto un fucile avremmo potuto sparare al giovane e lui sarebbe morto,ma non sarebbe stato meglio insegnargli a comprendere ed amare? Dov’erano i politici,gli educatori che dovevano aiutarlo? Se i bambini non verranno seguiti ed educati adeguatamente,alcuni di loro diverranno pirati. Se io stesso fossi nato in una famiglia povera,se non avessi mai ricevuto un’istruzione,se avessi avuto genitori così anch’io sarei potuto diventare un pirata.”
Thich Nhat Hanh – Il segreto della pace

bari - Marco Barisione

Feature complete custom ringtones

I finally released a version of “Custom ringtones for your contacts” that implements every basic feature I wanted to have for a first stable version, so I think it deserves being called 1.0 :).
Apart from some bug fixes, this new version is translatable and allow you to set a ringtone for callers with a hidden phone number and for contacts not in your address book. The new settings are available from the address book settings dialog.

The settings dialog with the extra ringtone buttons
The settings dialog with the extra ringtone buttons

For now there is only an Italian translation, but any help to get more is appreciated. Don’t worry, there are just 8 strings to translate!
To propose a new translation just go to the Transifex component page, download the .pot source file, add the translations to it, login to Transifex, and upload the file by pressing “Add a new translation” and setting as target file “po/XX.po” (where “XX” it the language code, for instance “fi” for Finnish, “de” for German, etc.). If you don’t know how to use gettext translation files I suggest using Poedit or gtranslator.

The custom ringtones application is now available both from extras-testing and from my personal repository:

Install per-contact-ringtones
Install from my personal repository
(follow the link on the N900 browser)

Update: I released version 1.0.1 containing some new translations: German (by NightShift79), French (by Alban Crequy), Brazilian Portuguese (by Humberto Sgrott Reis) and Swedish (by Andreas Henriksson). I will add more when I receive more.

Update 2: I released version 1.0.2 containing a crasher fix and some new translations: Albanian (by Ilir Gjika), Dutch (by Daniel Holsboer) and Spanish (by Fernando Borrego Polo).

Update 3: I released version 1.0.3 containing some new translations: Russian (by Misha Ketslah), Norwegian (by Stian Husemoen), Korean (by KwangHee Cho), Czech (by Pavel Fric), Hungrarian (by Balázs Bárány) and Romanian (by Bogdan Vernescu).

guido - Guido Vicino

Morte di un Cool-er Ereader

COOL-ER ereader

Qualche giorno fa si è rotto il mio primo lettore di EBook dopo circa due mesi scarsi di vita. Il lettore in questione era un COOL-ER Ereader. Lo schermo a tecnologia E-ink si è dimostrato non all’altezza di un pendolarismo selvaggio tipico della mia attività… I pregi e difetti del defunto sono erano i seguenti:

Pro:

  • Economico (269 €).
  • Ottima leggibilità.
  • Supportava molti formati elettronici (in due mesi ho letto 2 PDF ed 1 Epub.

Contro:

  • Fragilissimo e fatto della stessa plastica dell’ovetto Kinder
    (si è rotto tenendo nella borsa porta computer interna tra una cartellina e dei fogli).
  • La ditta che lo produceva è andata in liquidazione.
  • L’attacco per le cuffie non è quello standard (anche se dentro ne trovate un paio.

Il mio problema attuale è se vale la pena comprarne un altro o meno (ovviamente di un’altra marca). Cosa fare?

bari - Marco Barisione

Ringtoned 0.2.4 (now with vibration!)

I just released ringtoned 0.2.4 with a fix to make the N900 able to vibrate again when a call is received.
Ringtoned (displayed in the application manager as “Custom ringtones for your contacts”) is available from extras-devel (that contains a lot of other unstable software!) or from my personal repository:

Install per-contact-ringtones
Install from my personal repository
(follow the link on the N900 browser)

This release fixes the last major reproducible bugs, but I’m sure there are more. If you find any please report them in the bugzilla explaining clearly what you are doing, what you would expect to happen and what happens instead. A log attached to the bugzilla entry is very useful to understand what is going on, and can be easily created by opening a terminal and giving this command:

ringtonedctl -d stop startwait > /home/user/MyDocs/ringtoned.log 2>&1

Then attach the ringtoned.log file that is in your documents directory to the bug report.

bari - Marco Barisione

Ringtoned 0.2.1

The Fremantle daemon that decodes ringtones seems to have a bug that, in some cases, makes it produce wave files with an invalid size in them. These files cannot be played by libcanberra, so it meant that some ringtones couldn’t be played when you receive a phone call. I just released ringtoned 0.2.1 with a work around for the bug, please let me know if this version works better for you.

Anyway, I got a new component in the Meamo Bugzilla for ringtoned, so please report bugs there.

Update 2: I released ringtoned 0.2.2 that just adds some more debugging info to make my life easier.

bari - Marco Barisione

Faster custom ringtones

Several people complained that my custom ringtones application is too slow when receiving calls, so I started analysing what ringtoned does when a new call is received. The three main operations in this case are creating the object that represents a call after retrieving all the needed information (caller ID, etc.) from Telepathy, looking up the contact that matches the caller and playing the ringtone.
The Telepathy bit just needed to be slightly smarter, but was already quite fast. The contact look up was already very fast, unless you have so many contacts to make your address book unusable.
The code that needed more optimisation was the one that plays ringtones. It turned out that using GStreamer with playbin2 (the element able to detect and play all the supported file types) is not fast enough for this use case. I tried different approaches and in the end I decided to always use uncompressed wave files and stream them directly to PulseAudio.[1]
Note that GStreamer is not the best solution just in this very specific case, for all the other use cases GStreamer is still the best solution.

After these changes I was really expecting to get very good performances, but it was still quite slow. My analysis was showing that, since when ringtoned gets notified from Telepathy of the existence of a new call to when it starts streaming to PulseAudio, less than 0.1 seconds passes, so why was it still slow?
At this point I tried using bustle to generate graphs of the D-Bus activity when a call is received. The graphs showed that the delay was not ringtoned’s fault, but a bug in Maemo causing a freeze that made the dispatching of new calls about 4 seconds slower when ringtoned was running. Somebody is now working on the bug and trying to figure out why it’s happening, in the meantime I’m working around it watching for new calls in a different way.[2]

Ringtoned and the related packages are available in Maemo extras-devel under the name “Custom ringtones for your contacts”. If you don’t want to add the extras-devel repository (as it contains a lot of unstable software, you have been warned!), you can download ringtoned directly from my personal repository:

Install per-contact-ringtones
Install from my personal repository
(follow the link on the N900 browser)

The only known big problem left is that ringtoned breaks vibration, I will fix it in the next days/week.

Update: It looks like MyContacts is incompatible with ringtoned, so you cannot use these two programs together.

[1] The file is uncompressed in background, so you can still use any type of file for ringtones. Just notice that, when you update from a previous version, the first time you receive a call from a contact that already had a custom ringtone you will get the default ringtone and not the custom one as previous versions were not generating the uncompressed file.
[2] For people interested in Telepathy: the freeze happens if there is an observer running, even if at that point the dispatching to observers didn’t start yet! The (ugly, but effective) solution was to just listens to the NewChannels signal directly. When the Maemo bug will be fixed I will revert my code to use an observer.

bari - Marco Barisione

Disappearing plugins

If you have any application that adds buttons to the address book (like the contacts merger), you could have noticed that the buttons recently disappeared. This happened because of a bug in Monorail, the IM file transfer application.
Alban already fixed this bug and uploaded a new version to extras-devel. This new version also fixes other bugs, including a crash caused by the sharing plugin in Conboy.

Update: Note that you need to reboot or kill osso-addressbook after updating monorail to see the plugins again.

bari - Marco Barisione

Custom ringtones for your contacts

Yesterday I finished implementing the first release of a new program (ringtoned, i.e. ringtone daemon, i.e. I don’t have any imagination for program names) that allows setting a custom ringtone for specific contacts. Ringtoned tries to integrate nicely with the system:

  • You can select the default ringtone in Settings → Profiles as usual
  • To set a custom ringtone you go to the Contacts application, select the contact and press the new “Set custom ringtone” button in the menu
  • The dialog to set custom ringtones tries to be a perfect copy of the dialog to set the global ringtone
  • It works both for normal phone calls and GTalk/SIP/Skype calls, thanks to Telepathy
  • The ringtone is played only when the normal one would be played and at the same volume, thanks to some PulseAudio magic

Ringtoned also tries not to break your phone, if for any reasons it crashes the default behaviour should be restored. Nevertheless, this is just version 0.1, so it could be full of bugs and could make you miss phone calls. You have been warned! Moreover, replacing the default ringtone components with something more complex could make the ringtone start slightly later in case of heavy load, see my previous blog post. You have been warned again!

If you still want to give it a try, ringtoned is now in Maemo extras-devel under the name “Custom ringtones for your contacts”. If you don’t want to add the extras-devel repository (as it contains a lot of unstable software), you can download ringtoned directly from my personal repository:

Install per-contact-ringtones
Install from my personal repository
(follow the link on the N900 browser)

If you are interested in the source code, it’s in Collabora’s git repositories.

The are two major features that are missing at the moment: the ability to set a custom ringtone for anonymous phone calls and for calls from an unknown number, and the ability to set ringtones for groups and not only for single contacts. The former feature should be easy and it mainly just requires some UI, so it will be hopefully implemented shortly.
Groups are more difficult to implement because they are not supported at all by the Maemo address book; I would first have to implement support for groups and then add ringtones for the groups. I hope to be able to find time for this, but I cannot guarantee anything.

In a future post I will explain the architecture of ringtoned and how to extend it: the code that chooses the custom ringtone is actually just a small plugin of the ringtone daemon and it’s possible to write other similar plugins for different needs.

bari - Marco Barisione

How hard can it be? (Or why you don’t have custom per contact ringtones on Maemo)

Often in blogs, forums or IRC you can find people complaining of missing features in some programs (and some of them are very rude). While they can be right sometimes, other times they just make me angry because they don’t know how difficult writing software can be, and they don’t understand the difference between a semi-working prototype and a proper stable application written by professional developers, designed by professional UI designers and tested by professional testers.

Implementing some features can actually be quite difficult and it could be better to skip those from your product and focus on other things; on the N900 one of these missing features is the ability to set customised ringtones for specific contacts.
Several people wondered how hard it can be, after all a lot of old phones do it. What they don’t consider is that, in many ways, the N900 is not a traditional phone and is more similar to a small computer. On the other hand, the N900 still needs to be reliable to be certified as a phone; for ringtones this means that the ringtone should be played as soon as the phone call is received, or the user could miss it.
Now suppose your N900 is under heavy load due to multitasking (real multitasking, like on a normal computer) and you receive a phone call from a friend; being a close friend that often calls you, you have an MP3 ringtone set just for him. The phone has to look up for the contact corresponding to the phone number, load the file from the (slow) memory card, load the libraries for playing the ringtone, uncompress the file, and finally play it. All of this on a phone under heavy load with most programs swapped out of memory!
To workaround this problem the N900 seems to do some tricks: the ringtone is uncompressed into a (big) WAV file and saved on the faster (but small) internal memory, and the component playing the ringtone is memlocked (i.e. never removed from memory). Of course, you cannot do this for all the possible ringtones or the already small disk space would be used immediately. Choosing not to uncompress the files, on the other hand, would mean keeping loaded in memory all the possible codecs.

Does this mean that it’s impossible to have a different ringtone for a specific contact on Maemo? No, it just means that if you want it you have to be ready to accept that the ringtone could start playing a couple of seconds later in some uncommon heavy load conditions. When you are ready to do that you just have to wait a couple of days, so that I can polish and publish the program I wrote to have custom ringtones :D

In other news, I’m going to GUADEC for the whole week: see you there!

I'm going to GUADEC

pierlux - Pierre-Luc Beaudoin

Wikipedia Path extension for my browser?

Dear Lazyweb,

On this partly-cloudy day of April, I’ve thrown myself at Wikipedia seeking mercy upon my insatiable need to know more about diverse subjects such as the International Phonetic Alphabet.  But, as with any visit to Wikipedia, I ended up reading about even more diverse subjects such as the Mortgage word (from Law French), the Arabic loanword Orange and the Merovingian dynasty.

This was all great to read upon (thanks Wikipedians!).  But I’d like an easy way to find my way back to the original piece.  I’d like a nice Firefox extension to draw for me the threads of articles I’ve read.  Each time I’d open a new tab it would create a new branch from this article.  When an article links to an already open tab, it should be identified with a dashed line.

I’ve drawn an example of what it could look like (click for more details):

My path through Wikipedia today

So please, tell me someone already wrote that piece of software? (It took me quite too long to draw this funny diagram).

Regards,

Pierre-Luc

NB: An attentive reader will realize that I like reading on History, Languages and History of Languages.

pierlux - Pierre-Luc Beaudoin

Comment mettre fin aux invitations et pourriels

Malos humos, el / Bad Fumes, Him

Malos humos, el / Bad Fumes, Him. CC By-NC Heart Industry

Voici quelques petits trucs pour savoir si un groupe/chaîne de lettres est illégitime (comme “10 voitures OFFERTES à 10 membres FACEBOOK”):

  1. Si le titre inclus des mots en majuscule;
  2. Si on y parle de faire de gros cadeaux mais qu’on en a pas entendu parlé dans les nouvelles;
  3. Si tout ce qu’on doit faire pour participer est ridiculement simple (joindre un groupe, envoyer à tous tes amis); en plus au Québec, il faudrait répondre à une question d’habileté mathématique ;-)
  4. S’il est impossible de corroborer l’information (ça veut dire de trouver d’autres sources d’information qui confirme les faits);
  5. S’il est impossible de trouver les règlements officiels du concours;
  6. Si vous n’avez pas été contacté directement pour ce concours: les gens de chez Facebook et MSN savent encore comment contacter leurs utilisateurs.

Merci d’appliquer ses règles simples avant de m’envoyer invitations/chaînes de lettres et autres choses qui pollue la vie en ligne.

pierlux - Pierre-Luc Beaudoin

The rumors of our extinction have been greatly exaggerated

This is a public announcement to everyone who have seen the opening and closing ceremonies of the 2010 Winter Olympics in Vancouver: Canada is still inhabited by French speakers.

Despite all the criticism the Vancouver Organizing Committee received after the opening ceremonies, little changed in the closing one.  Yes, the VANOC’s CEO made an effort to speak in French but that’s about the only change you could see.  That and the fact that Canada’s Olympic Broadcast Media Consortium added a live translator on French TV so that the less “fortunate” can understand the ceremonies in their own country.

Would have it been too much to ask for one of the monologues to have been in French? After all, I am sure there are Francophones outside Québec ready to do such a creed for Canada.  They probably just didn’t try to find one but I personally believe finding one could also have been a hard job, considering that doing such a creed, even if it’s a caricature, could mean professional suicide for a Québec comedian in Québec’s French market (where such creeds on any side isn’t popular these days).

In short, we still exist.  What you have witnessed is a sad image for a country with 2 official languages.  It is reminiscent of old English-French frictions which we all would like to believe were long gone.  As it has been pointed out on this blog (a post worth reading) and in the professional press (in French!), denying French Canadians such visibility has done more for the sovereignty movement of Québec than the current leaders of the movement themselves. And that’s quite a job, considering the health of the movement at the moment (the leading party not being the ruling government for 7 years now).

This is also reminiscent of West-East frictions.  The (mostly English) West feels bilingualism is being wrongly imposed on them. They feel too much power is given to the central provinces (where 60 % of the population lives).  They probably also feel (rightfully) they are paying for our social wealth services considering the thriving west economy of tar sands and, I have to admit, their just efficient administrations.  Those frictions may never disappear, after all British Colombia was almost part of the United States of America if it were not of the Canadian rails built in 1870s.  My point of view on the subject is that parts of Canada and United States are being unnecessarily separated on political reasons.  Vancouver’s economy is probably more active with Seattle’s than the rest of Canada.  The same applies with the province of Québec and state of New York.  Politically enforcing an horizontal relationship where the natural flow of business is vertical.  This argument has been mentioned in the latest High Speed Trains plans of Québec–Windsor and Montréal–New York.  I am going to stop here but this could lead to interesting debates on history and politics. :)

In conclusion, just don’t forget we still exist.  We have a thriving musical culture (among other) as you can see here, here, here and here (my personal favourite local artists these years).  Its absence from the Olympics is an anecdotal abnormality.

pierlux - Pierre-Luc Beaudoin

My upcoming talks at Confoo.ca

After touring FOSS events all around the world, I decided to see what’s happening on the local software scene.  I met with the guys from Montreal-Python, the Ubuntu Québec local team guys (after all Montréal is the home of Canonical’s Global Support Services) and the local start-ups at DemoCamp.

confoo.ca Web Techno ConferenceThey convinced me I should give a talk at Confoo.ca.  In fact I decided to submit 2 talks and both were accepted.  Confoo.ca is a new conference building on the famous PhpQuébec conferences but gathering much more communities together: .Net, Python, Ruby and Web developers. The conference will cover technical topics as well as project management, marketing and social medias.

Based on my personal knowledge and the experiments I’ve been doing lately with Web + Desktop apps combinations, I’ve submitted the following talks.

Django + RESTful APIs as an application server

Application servers are the central part of data applications. They are responsible for mission critical activities of businesses and yet have to be cost effective. Django offers a lot of flexibility by providing rapid application development. Django-piston makes it easy to add RESTful APIs to existing Django apps. Web servers are very common and rather cheap to rent or host in house.

Once your application has a RESTful API, nothing is keeping desktop applications to access your web services. For example, using librest on the desktop, Emerillon accesses on-line databases such as Geonames. Librest simplifies accessing RESTful web services and makes parsing XML fun again (that’s a Robert Bradford quote if I am not mistaken).

Introduction to OpenStreetMap and how to use it

When thinking of online maps, Google Maps is often mentioned as a reference. But you can’t use their data in all the exciting ways you could ever imagine. Enters OpenStreetMap: community built openly licensed map data. You are virtually free to do anything with the data, short of not giving proper attribution of its origins.

With this gained freedom, you can explore and create unique maps adjusted to your needs. You can also simply reuse the default one available on OpenStreetMap.org, in some locations it is way more complete than any other maps anyway.

Come and attend Confoo.ca!

pierlux - Pierre-Luc Beaudoin

MapBuddy 0.2, libchamplain 0.4.4 and 0.5

What a big release week!

First, a quick update to MapBuddy:

  • Translations (French, Spanish, German, Swedish, Polish, Slovak)
  • A “Add to addressbook” button on merchant’s window (with the help of Jonathon Jongsma)
  • A precision circle is drawn around your position
  • Kinetic scrolling is turned on

Then, a bigger update for libchamplain 0.4.4:

  • API clean up (with API backward compatibility): champlain_view_set_size should have never existed
  • Fix to make Python bindings work out of the tarballs!
  • Use shared paths by all tiles consumers on Maemo devices to store tiles (saves bandwidth)
  • Load tiles in a spiral manner from the centre (thanks to Jason Woofenden)
  • Optimizations resulting in
    • Faster start-up
    • Smoother scrolling
    • Energy savings (by doing less computations)

Then, a huge update for libchamplain 0.5:

  • First development release with new APIs:
    • Local map rendering (Google Summer of Code of Simon Wenner)
    • New Map Source mechanism à la Pipe and Filter (Jiří Techet)

pierlux - Pierre-Luc Beaudoin

J’ai invité Clutter pour Noël

C’est maintenant une tradition établie pour les réveillons de Noël du côté de ma mère: on se rassemble tous pour un bon repas de mets traditionnels, on échange les cadeaux et on joue à un jeu. Mais pas n’importe quel jeu, un jeu fait maison créé pour cette occasion unique. Par exemple, ces 2 dernières années nous avons joué à une version de Serpent et échelles géante et une adaptation du Banquier.

Le jeu de Serpents et échelles de 2008 (notez que l'échelle fait 20 cm!)

Le jeu de Serpents et échelles de 2008 (notez que l'échelle fait 20 cm!)

Mais 2009 était une année spéciale, j’allais être l’hôte du réveillon. J’allais avoir à bâtir un jeu pour l’occasion. Ma mère est créative et aime bricoler mais ce n’est pas tant mon cas. J’ai donc décidé de créer un jeu à l’ordinateur. Noël de fortune était né.

Écran de démarrage du jeu

Écran de démarrage du jeu

Après consultation avec mon cohôte, nous avons établi les règles de base du jeu: ce serait un jeu avec tours où chaque joueur doit deviner une expression. Le joueur pourra nommer des lettres et elles seront révélées dans l’expression. Si la lettre n’est pas dans l’expression, il perd un point et c’est au prochain joueur de jouer. Le joueur peut également essayer de résoudre, mais s’il échoue il perdra 5 points. Chaque joueur a sa propre expression à deviner. Lorsqu’un joueur trouve son expression, il a droit à un cadeau. Il y aura 3 manches. Pour aider les joueurs, l’alphabet sera affiché en haut de l’écran et les lettres déjà nommées seront identifiées pendant la première manche, seulement les lettres nommées seront affichées pendant la 2e manche alors que rien ne sera affiché pour la dernière manche. C’est une augmentation du niveau de difficulté. Le joueur qui aura trouvé ses expressions avec le moins d’essais aura un cadeau supplémentaire à la fin du jeu. Ces règles vous rappellent peut-être La roue de fortune ou le bonhomme pendu.

Pendant le jeu

Pendant le jeu

Nous avons trouvé plus de 400 expressions pour le jeu afin que nous puissions prendre part au jeu avec toute la famille. Il y a eu 3 thèmes, un par manche: Noël, Chose à faire, Personnalités connues. Sans surprise, le premier thème a été très facile mais les 2 derniers plus difficiles.

Pour créer le jeu, j’ai décidé d’y aller avec Python puisque je voulais un langage de programmation avec des structures de base de haut niveau comme des ensembles, listes et dictionnaires. Ces dernières se sont avérées très utiles pour l’implémentation. Un jeu doit être excitant visuellement et puisque je m’y connais déjà en Clutter, ça aurait été un choix qui va de soi. Le graphisme est plutôt simple: tout est une image (à l’exception du texte!) qui est animée avec Clutter. Lorsqu’un joueur nomme une lettre, toutes les cartes sont animées comme si quelque chose passait sous elles et elles tournent si la lettre correspond. Un son magique est aussi entendu! S’il y a une erreur (lettre déjà nommée, lettre pas dans le mot), une boîte de dialogue s’affiche. Lorsque la manche est terminée, le pointage est affiché tel un diagramme à bandes qui s’affichent une à une (pour ajouter de la tension).

L'écran de solution

L'écran de solution

L'écran de solution erronée

L'écran de solution erronée

L'écran de pointage (données simulées ;-)

L'écran de pointage (données simulées ;-)

<video controls="true" src="http://blog.pierlux.com/wp-content/uploads/2010/01/cards.ogg">
[Oups votre navigateur ne supporte pas le tag Vidéo!] Téléchargez le vidéo ici!
</video>

Cela m’aura pris bien au delà de 80 heures pour créer le jeu. En tout et partout, ça aura été un grand succès :) Nos invités l’ont trouvé original et la partie a duré des heures.

Gabriel explique les règles. Vous pouvez voir les cadeaux dans les bibliothèques.

Gabriel explique les règles. Vous pouvez voir les cadeaux dans les bibliothèques.

Je ne rendrai pas le code de ce jeu libre. Pour être franc, le code n’est pas exemplaire: c’était mon premier jeu, ma première application Python à partir de rien et à la fin, je ne faisais que corriger bêtement les bugs sans corriger les problèmes de fond. Mais bon, il fonctionne. Je suis sûr qu’il y a des applications fermées pire que ça.

La plupart des images proviennent d’images disponibles sous licence Creative Commons comme le fond d’écran. Malheureusement, j’ai mal fait mon travail et je n’ai pas gardé le nom de l’auteur ou le lien de la page où j’ai trouvé les bordures utilisées partout dans le jeu. Si vous le trouvez, je le lierai!

Ah! En passant, puisque ma mère avait beaucoup de temps libre (n’ayant pas à créer un jeu cette année), elle s’est investie dans l’emballage des cadeaux. Avez-vous déjà reçu un cadeau emballé comme une bûche de Noël? ou dans le tambourin de l’enfant au tambour? :)

Mon cadeau était emballé à la manière d'une bûche de Noël.  Je l'ai mérité pour avoir trouvé le mot Ragoût de boulettes.

Mon cadeau était emballé à la manière d'une bûche de Noël. Je l'ai mérité pour avoir trouvé le mot Ragoût de boulettes.

pierlux - Pierre-Luc Beaudoin

I invited Clutter for Christmas

It’s now an established tradition at my mother’s Christmas Eve party, we all gather for a good meal, exchange gifts and then play a game. Not any game, an home made game built for this occasion only. For example, in the last 2 years, we played a giant Snakes and ladders game on my mom’s wall and an adaptation of Deal or No Deal. During the game, each player wins little gifts. Usually the games include special rules so that everyone finishes with the same amount of gifts.

The Snakes and Lader game of 2008

The Snakes and Ladders game of 2008 (the ladder is 20 cm long)

But 2009 was special. I was going to host the party. I was going to be the one to build a game for this occasion. My mother is creative and resourceful when comes the time to use whatever materials are at hand, but I am not. I decided to build a computer game instead! Noël de fortune was born.

Splash Screen of the game

Splash screen of the game

After consulting with my co-host, we elaborated the basic rules of the game: a turn-based game where players have to guess an expression. They would be able to give letters that would then be revealed. If the letter is not in the expression, the player loses one point and it is then to the next player to play. The players can try to solve but if they fail it costs them 5 points. Each player have their own expression to find. When he finds his expression, he wins a gift. There should be 3 rounds. To help the players, during the first round the whole alphabet is displayed with the letters he already said highlighted. During the second round, only the given letters are displayed, and nothing during the last round. It makes it harder :) The player who finds his expression with the less tries wins an extra gift at the end of the game. These rules probably remind you of The Wheel of Fortune without the wheel, or of Hangman.

During the game

During the game

We built a list of 400 possible expressions for the game so that we could also play with everyone. There were 3 themes, one per round: Christmas, Things to do and Famous People. Not unexpectedly, the first theme was quite easy to guess, but the 2 others were more challenging.

To create the game, I decided to go with Python as I wanted to have a language with rich built-in types such as lists, sets and dictionaries. They came handy in the implementation. A game has to be exciting to the eye and considering I already had a fair amount of experience with Clutter, it was an obvious choice. The graphics are simple: everything is an image (except text!) and is animated using Clutter. When the player says a letter, all the cards bounce as if something passed under to read them and they turn around if the letter matches. A nice magic sound is played out. There are error dialogs (the letter was previously given or the letter is not found) and solution dialogs too! When the turn is over, the score is displayed using vertical bars that show up one by one (adding a little stress hehe).

The solution dialog

The solution dialog

The bad solution dialog

The bad solution dialog

The points screen

The score screen (not actual game scores ;-)

<video controls="true" src="http://blog.pierlux.com/wp-content/uploads/2010/01/cards.ogg">
[Oops, your browser does not support the video tag!] Download the video instead!
</video>

It took quite over 80 hours to create the game. Overall, it was a great success :) Our guests liked it and fun lasted for hours!

Gabriel explaining the rules

Gabriel explaining the rules. You can see all the gifts surrounding the LCD screen.

I will not be releasing the game. Quite honestly, the code is a mess: it was my first game, my first Python application from scratch and in the end I was just fixing bugs without fixing core issues. But hey it works: I am sure there are worst proprietary apps out there :)

Some of the graphics are composed of images available under Creative Common such as the background. Unfortunately, I did a lazy job keeping track of my sources and I lost the link/name of the author of the nice graphics I used. If you find it, I’ll link it!

Oh by the way, since my mom got her hands free of creating a game, she invested herself in the packaging of the gifts. Has anyone of your ever received a gift wrapped like a Bûche de Noël or a drummer boy’s drum? :)

My gift was wrapped like a Bûche de Noël. I won this gift by finding the word "meat ball stew".

pierlux - Pierre-Luc Beaudoin

OpenStreetMap mappers band to improve Haiti’s map

In order to help people, free and widely available maps are a good tool to rescue parties.  Many users of OpenStreetMap have organized a wiki page to manage the work that needs to be done to quickly improve OpenStreetMap for this part of the world. Thankfully, Yahoo has high resolution imagery of the region making it possible to trace the streets.  Note: remember that only Yahoo imagery can be used, as OpenStreetMap has a signed derivative work permission with Yahoo.

If you know how to edit maps, maybe you can land a hand! CrisisCommon also has other resources.

Follow-up: Mikel Maron has before and after images along with more info.

Slippy Map

pierlux - Pierre-Luc Beaudoin

One more map app for the N900

Well, I finaly got my hands on a N900 (given as a Christmas gift by Collabora to Gabriel).  This gave me the occasion to observe first hand that the Ovi Maps, while having a lot of features, is slow and that the Hildon Emerillon port is less than perfect.  It is hard to use with fingers and feels alien to the platform.

To solve this, I created Map Buddy: a map application specifically designed for Maemo 5.  It is quite simple to use and works out of the box (no configuration or selection of plug-ins required!).  It also has something other apps don’t: it uses web-services to provide business search capabilities.

Here’s the use case I built Map Buddy upon: you just arrived in Montréal and want to find a sushi restaurant.

  1. You start Map Buddy, it will be centred on the place you closed Map Buddy on.  You can click on the “Center on me” icon on the bottom left, and it will centre the map on Montréal ‒ remember you are in Montréal for this example! By the way, your position is marked by a blue dot. Later version will display the precision too.
  2. To search for businesses, you have to switch in business search mode, tap on the magnifying glass to do so.
  3. Enter sushi in the search bar and press enter! The map will be populated with markers representing the places tagged with sushi (powered by Praized Media, a Montréal start-up).
  4. To get the name of the place, tap once on the marker.
  5. To get the complete details about a place, tap once on the name: a new window will be opened with the business’ address, phone number and web site if available.  Map Buddy even provides a call button!
  6. To clear the search results, tap on the trash can in the search bar or do a new search.

It’s that simple!

Map Buddy includes a place search so that if you are looking for Pizza in New York, you don’t have to scroll from San Francisco to New York to get there.  Select the Place search mode, enter New York in the search field and press enter.  A picker dialog will be opened to let you select the correct New York.

To switch to other maps, click on the layer icon, it will bring up the list of possible maps to display.

I hope you like it!  Try it today! WARNING: Installing Map Buddy in this early stage requires adding the extras-devel repository which might install unstable software on your device.  Try it at your own risk or if you are a professional ;-)

NB: Praized Media only has strong data sets for Canada and United States.  They plan to sign business partnerships to get data for Europe in 2010.  In the mean time, you can directly add businesses using this form.

NB: Help is appreciated to translate it!

pierlux - Pierre-Luc Beaudoin

Can you spot what’s new?

Yes! Libchamplain now has a scale! It was long overdue. In fact, I first started to work on it way before libchamplain 0.2.2 was even released (1.25 year ago). It got impeded by more important features and bug fixes. Two or three months ago Tollef Fog Heen took over the branch and added the magic required maths to compute the scale. I then took over his work (as he was quite busy and I wanted this too) to provide the final result.

Since all the changes are backward compatible, I’ll soon release a libchamplain 0.4.3 with the scale disabled by default (to ensure the same visual behaviour as before upgrade). To display a scale, an application just has to change the show-scale property to TRUE.

#if CHAMPLAIN_CHECK_VERSION (0, 4, 3)
g_object_set (champlain_view, "show-scale", TRUE, NULL);
#endif

The scale also supports other exotic units than the SI/metric ones. It can display miles and feet, if you’re into that. :) By the way, the scale will automatically switch from kilometres to metres when it makes more sense. That was quite more complex to do with miles and feet as they are not simply a power of 10. Set the scale-unit property to CHAMPLAIN_UNIT_MILES to get miles.

You can limit the width (in pixels) of the scale with the max-scale-width property.  If you watch closely, the scale will adjust itself right away when you move the map.

bari - Marco Barisione

Essere inglesi

Mettersi a litigare all’una e mezza di notte per decidere se la fila per i taxi deve andare da sinistra verso destra o da destra verso sinista.

pierlux - Pierre-Luc Beaudoin

Complainte funéraire pour la pomme

Ici se trouvait une pomme
Ici se dressait la table
Là était la maison
Là était la ville
Ici gît le pays

Cette pomme là
C'est la terre
Un bel astre
Sur lequel il y eût des pommes
Et des mangeurs de pommes

Traduction libre de “Nänie auf den Apfel” de Hans Magnus Enzensberger

pierlux - Pierre-Luc Beaudoin

Lancement de l’Agenda du libre du Québec

Une nouvelle ressource en ligne pour la communauté de l’informatique libre du Québec est ouverte au public aujourd’hui: l’Agenda du libre du Québec. Ce site gratuit vise à rassembler en un seul point tous les évènements du Québec portant sur l’informatique libre: des InstallFest aux conférences, en passant par les Mapping Party d’OpenStreetMap.

Le site est très simple à utiliser.  Dès l’arrivée sur le site, le visiteur voit les évènements du mois en cours dans un calendrier.  Il peut ensuite le filtrer pour sa région administrative ou passer à un autre mois.  Il ne verra alors que les événements pour sa région et les événements à portée nationale ou internationale ayant lieu au Québec.

L’Agenda du libre du Québec est aussi un service de calendrier en ligne.  Les visiteurs peuvent exporter les événements vers leur application de calendrier favorite (via l’un des fils WebCal) ou leur application de nouvelles (via l’un des fils RSS).

Le contenu de l’Agenda est contribué par la communauté et est modéré selon les règles suivantes: les événements doivent porter sur un projet libre (c’est-à-dire avec une license acceptée par l’Open Source Initiative ou Creative Commons). Le contenu de l’Agenda grandira au fur et à mesure où les événements y seront ajoutés par les membres actifs de la communauté.

L’Agenda du libre du Québec est une réimplémentation légitime de L’Agenda du Libre (France).  Comme cette dernière, le code source, le texte et le design de la version québécoise est entièrement disponible, en faisait un exemple de logiciel libre.

pierlux - Pierre-Luc Beaudoin

De l’anglais au CÉGEP: encore un peu plus SVP

Le débat est relancé de plus belle au Québec sur l’obligation de forcer le peuple à faire une partie de ces études supérieures en français.  Rappelons qu’au Québec, il est obligatoire pour un francophone de naissances et les nouveaux arrivants (allophones) de fréquenter l’école jusqu’à la fin du secondaire en français si celle-ci est financé par l’État, pour les autres (les anglophones de souche), ils peuvent fréquenter l’école de leur choix.  Cette démarche vise à éviter une assimilation du Québec vers l’anglais par “noyade” d’immigrant parlant anglais, tout en protégeant le droit des minorités existantes. Pour les Européens qui lisent ce billet, le CÉGEP est un collège qui offre des diplômes techniques ou pré-universitaires.

D’après les statistiques qu’on voit à gauche et à droite, seulement 4 % des citoyens francophones de souche décident d’aller étudier de plein gré dans un CÉGEP anglophone alors que cette proportion grimpe à 50 % chez les allophones.  Le débat médiatique ces jours-ci semble toujours autour de cette dernière statistiques.  Certaines gens voudraient ces 4 % et 50 % forcé de choisir un CÉGEP francophone, certains vont même jusqu’à imposer l’université en français!

Je suis d’avis que forcer les gens à continuer une partie ou toutes leurs études en français n’est pas la solution. Si les jeunes choisissent d’aller étudier en anglais, c’est pour connaître la langue des affaire et de voyage internationale. Après tout, ils maîtrisent certainement assez bien le français après 11 ans d’école primaire et secondaire.  Il faut protéger cette liberté pour les francophones qui désirent parfaire leur connaissances linguistiques de manière pratique en étudiant en anglais.  Si nous les forçons à aller ailleurs pour faire cela, nous contribuerons à l’exode des cerveaux.

Je crois qu’il serait plutôt beaucoup plus efficace d’améliorer l’offre et la qualité des cours d’anglais au CÉGEP et au secondaire.  Après tout, si ces cours menaient à une meilleure maîtrise de la langue de Shakespeare, nous ne ressentirions pas le besoin d’étudier dans cette langue.  J’ai fait toute mes études dans le réseau francophones.  De par mes résultats supérieurs en anglais, j’ai toujours été classé dans les classes avancées au secondaire comme au CÉGEP, mais je crois que ces classes avancées ne l’étaient pas encore assez!  Il faut que la barre soit remontée pour tous.

Je pense qu’on regarde ce problème-qui-n’en-est-pas-un du mauvais angle.  À l’observation “plusieurs gens décident de faire leur études supérieures en anglais” certains pensent “forçons-les a les faire en français”, je pense “offrons de meilleurs cours d’anglais et ils changeront d’avis”.

pierlux - Pierre-Luc Beaudoin

Ein neues plugin um zu vorangehen

Ich habe in der letzten Wochen an einem neuen Plug-in gearbeitet aber das war nicht alles.  Es liegt unter dem Repository emerillon-plugins (inspiriert von EOGs).  Es sind schon 4 Plug-ins in Arbeit aber nicht alle sollten mit Emerillon vertrieben werden.

Dieses Plug-in soll für Montréalers nützlich sein: es zeigt den Status des Bixi Netz. Bixi ist der öffentliche Montréaler Fahrradverleih. Er ist so schön, er soll in London (Großbritannien) und Boston (Vereinigte Staaten von Amerika) eingerichtet werden.

Das Plug-in ist einfach: es gibt ein Drop-Down-Menü wo man wählen kann, ob “Verfügbar Fahrräder” oder “Freie Docks” angezeigt werden. Die Karte wird immer zeitnah mit den neuesten Information aktualisiert. Die Stifte ändern ihre Größe wenn es gibt mehr verfügbar Fahrräder oder freie Docks gibt. Die Information wird alle 5 Minuten herunterladen.

Das Plug-in ist jetzt frei verwendbar, nachdem alle rechtlichen Fragen geklärt sind. Es ist einem schönes Beispiel dafür was Sie mit libchamplain und Emerillon machen können. Es ist die erste Verwendung einer von ChamplainMarker abgeleiteten Klasse (das ich kenne), die das eigene Look-and-Feel zur Schau stellt.

Ausschlussklausel für Haftung: Dieses Plug-in wurde von Novopia Solutions zugänglich gemacht und steht nicht in jeglicher Verbindung zu Bixi, dem öffentlichen Montréaler Fahrradverleih. Bixi ist ein Warenzeichen der Société de vélo en libre-service.

pierlux - Pierre-Luc Beaudoin

A new plugin to lead them all :)

In the last weeks I (among other things) worked on a new plugin repository (vastly inspired by EOG‘s) for third party plug-ins for Emerillon.  There are currently 4 plugins being worked on and not all of them should be distributed with the base Emerillon application. Enters emerillon-plugins.

It currently has 1 plug-in.  This plugin is one that will be useful to Montréalers: it displays the status of the Bixi network.  Bixi is Montréal’s self-serve public bike system.  Apparently its design is so good — the bike system, not the plug-in :) — that it’ll be implemented in both London (UK) and Boston (USA) very soon.

So the plug-in is quite simple: you have a drop down list where you select to see available bikes in stations near you or available docking stations.  The map is updated instantly to display the new values.  The markers on the map change in size depending on the available bikes/docks.  The information is automatically updated every 5 minutes.

After all the legal verifications, this plug-in is now free for everyone to share.  It should serve as a good example of what you can do with Emerillon and libchamplain.  It is the first piece of code (that I am aware of) to demonstrate ChamplainMarker sub-classing to implement unique look & feel.

Disclaimer: This plug-in has been independently developed by Novopia Solutions and is not in anyway related to or endorsed by Bixi, the operator of Montréal’s public bike system.  Bixi is a trade mark of Société de vélo en libre-service.

pierlux - Pierre-Luc Beaudoin

Un greffon pour mener la voie :)

Ces dernières semaines, j’ai travaillé sur un dépôt pour greffons (très fortement inspiré de celui d’EOG) pour les greffons de tierces parties pour Emerillon.  Il y a présentement 4 de ces greffons en cours de réalisation et ils ne devraient pas tous faire parti du paquetage d’Emerillon.  C’est pourquoi il y a maintenant emerillon-plugins.

Ce dernier compte un greffon.  Ce greffon en est un qui sera très utile aux Montréalais: il affiche l’état du réseau Bixi.  Bixi c’est le réseau de vélo en libre-service de Montréal.  Son design est si bon — le réseau de vélo, pas le greffon :) — qu’il sera bientôt disponible à Londres (Angleterre) et Boston (États-Unis).

Le greffon est très simple: une liste déroulante vous donne l’option de visualiser les vélos disponibles ou les points d’ancrage libres.  La carte est immédiatement mise-à-jour pour afficher la nouvelle information.  La taille des points sur la carte change en fonction du nombre de vélo ou de points d’ancrage.  L’information est téléchargée depuis les serveurs de bixi à toutes les 5 minutes.

Après toutes les vérifications légales, ce greffon est maintenant librement disponible pour tous. Il sert de très bon exemple de ce que vous pouvez faire avec Emerillon et libchamplain. C’est à ma connaissance le seul code qui existe qui sous-classe ChamplainMarker afin d’implémenter un rendu unique.

Avis: ce greffon a été développé de manière indépendante par Solutions Novopia et n’est pas lié, supporté ou approuvé par Bixi, l’opérateur du système de vélo en libre-service de Montréal.  Bixi est une marque de commerce déposée de la Société de vélo en libre-service.

pierlux - Pierre-Luc Beaudoin

Looking for a tool to draw pipe networks

Dear knowledgeable(lazy)web,

I have a friend who’s looking for a free software application to draw pipeline networks using the Piping and Instrumentation Diagram Standard Notation such as this example:

He didn’t find any and resorted to draw each possible elements in svgs he later intend to import as symbols in Dia.  Does such a thing already exist? or is there another specialized tool that comes with such symbols?

Answer in comments to this post. Thanks!

pierlux - Pierre-Luc Beaudoin

Trying GnuCash

When I realized Gnome Bugzilla passed the 600 000th bug mark, I went to see which project got the “honours”.  Turns out GnuCash is the big winner!   I had never started GnuCash before and I though it was a good moment to try it!

First of all, the learning curve is high.  That’s to be expected, after all GnuCash is a complete accounting application. While the UI is quite simple and lean, there’s terminology and procedures to learn. That where the documentation comes handy.

The documentation covers many topics: terminology, accounting principles and howtos for many specific uses.  In about 2 hours, I was setup: I had setup my accounts (based on their very well localized presets: it even included Québec’s taxes and perceptions accounts), I had imported transactions from my bank account and credit cards.  Now if only Desjardins also provided retirement savings (RRSP) details in a computer readable format beside their brochure PDFs… I’ll have to wait ’till I get my detailed printed report (once every 3 months) before I can manually enter the data in GnuCash.

All in all, I’d like to kudo the GnuCash contributors.  Somehow I didn’t expect so much polish on a 12 years old application (and don’t get me wrong, but sometimes apps get stuck in time).  The ledger view comes with handy keyboard shortcuts designed to speed up data entry and I like it. Custom reports? that even more awesome.

I’ll submit some localization bugs (or request a fr_CA version) because somehow it looks like French and Québécois accountants didn’t agree on all the words (ie. conciliation).

guido - Guido Vicino

Webmin

Webmin

Webmin is a web-based system configuration tool for OpenSolaris, Linux and other Unix-like systems, although recent versions can also be installed and run on Windows.

guido - Guido Vicino

Danziger – The People are still behind me

Danziger - The People are still behind me

Danziger,

from Los Angeles Times (Unknow number…let me know which if you know.)

pierlux - Pierre-Luc Beaudoin

Back from Boston with an Emerillon release

So I am finally back from the Boston Summit, a unique occasion to get updates on latest developments, and I am releasing Emerillon 0.1 for distributions eager to package.

Mandatory Greyhound rant

With a 3 hour delay on departure (making a total of 5 hours of wait in Boston’s 10 ℃ station), we managed to arrive 5 hours late in Montréal, due to a defective heater in the bus.  Add moving everyone at 5 AM from that defective ’70s bus to a freezing ’90s bus with actually less seats than the previous one, and the fact that there was enough people to fill 3 buses in Boston, but only 54 managed to leave on the first one and you’ve got a complete picture of the fiasco.

I am not going to run in too much details but all this could have been so easily avoided.  The delays were due to the fact that the bus that was supposed to bring us had been delayed at the US border.  Fine, shit happens.  What is not fine is that they waited until our expected departure time to get a replacement driver (since he had busted his legal driving time).  See, it takes about 5 hours from the border to Boston.  Knowing he was going to be late (and therefore busting his hours), the driver should have called his manager, which should have prepared a replacement driver for the next departure in 10 hours! But none of that happened.  And, to top it all, there were no Greyhound dispatcher to be called by the Boston station employees to inform them of a missing departure bus.  Complete utter fail.

Emerillon 0.1.0 release

Now for the fun part.  With all that time on hands, I created 2 new plugins for Emerillon (Copy a link of the current view to online maps, and display map position in statusbar) and cooked a release including all the 5 submitted translations.  Woot! Grab the release here.  This is a preview release with no guaranty on plugin API stability.  See the complete announce email.

Before anyone asks, I am using the gnome-colors Shiki-Wize theme.

For those who missed the original announcement: Emerillon is a map viewer. Aiming at simple user interface, Emerillon is a powerful, extensible application. It features OpenStreetMap based
maps. Use it to browse maps, search the map for places, placemark places for later quick access and more!

There are even packages of this release for Ubuntu Hardy from Mathieu Trudel.  See his blog of the install instructions.

pierlux - Pierre-Luc Beaudoin

Just arrived in Boston

I just arrived in Boston in time for the Boston Gnome Summit.  The trip down to Boston with Greyhound was less than wonderful, and to think I was complaining about Orléans Express’ service between Montréal and Québec city!  Comparing Greyhound to German trains would be comparing chaos to order.  We only had a lunch pause because we were offered one when we changed driver and we were not supposed to change driver… That would have been a very long 8 hours bus ride!

At least the hotel we are staying at this year is in a more lively part of the city :) See you tomorrow!

guido - Guido Vicino

The Modern Day Shugyosha

IT Consultant – The Modern Day Shugyosha

…ho sempre avuto il dubbio che Reply avesse il potere di chiedermi l’Harakiri!

guido - Guido Vicino

Memo sull’Impermanenza

<object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/pgYA2c5iyzs&amp;hl=it&amp;fs=1&amp;"/><param name="allowFullScreen" value="true"/><param name="allowscriptaccess" value="always"/><embed allowfullscreen="true" allowscriptaccess="always" height="344" src="http://www.youtube.com/v/pgYA2c5iyzs&amp;hl=it&amp;fs=1&amp;" type="application/x-shockwave-flash" width="425"></embed></object>

…un bel memo sull’impermanenza.

guido - Guido Vicino

Umberto Veronesi

« L’umanità rischia un effetto a catena distruttivo: esaurimento di energia, di acqua potabile, di alimenti base per soddisfare consumismi alimentari errati. In Cina e in India è aumentato il consumo di carne, così come non si ferma in Occidente. I conti non tornano. Sei miliardi di abitanti, tre miliardi di bovini da macello (ogni chilo di carne brucia 20 mila litri d’acqua), 15 miliardi di volatili da alimentazione, produzione di combustibili dai cereali. Tra un po’ non ci sarà più cibo. Grano, soia, riso, mais costano sempre di più e vanno a ingrassare gli animali da allevamento. Dobbiamo fermarci ora. Primo passo: diventare vegetariani, o quasi. »

Umberto Veronesi, (citato in Corriere della sera, 20 maggio 2008, p.9)

guido - Guido Vicino

L’ospite molesto

”Non ti aspettavo”! E chi se lo aspetterebbe? Le fulgide e meritate proiezioni verso un futuro coltivato e sperato accompagnano giustamente le ore giovanili di ogni essere dotato di progettualità e passione: eppure Alda porta con sé, da epoche in cui non sospetta lontanamente la visita di quel futuro “Ospite molesto”, già l’avvisaglia di una Natura matrigna. Un preannuncio che la renderà forte inconsciamente “pronta” in vista dell’arrivo di un “mostro strisciante” il cui nome dovrà imparare a pronunciare e ad accettare: “Sclerosi Multipla”.

Michele Nigro

Riguardo al libro “L’ospite molesto” di Alda Visconti Tosco pubblicato da ENNEPILIBRI.

guido - Guido Vicino

MIT: il global warming sarà peggiore del previsto

MIT: il global warming sarà peggiore del previsto

bari - Marco Barisione

Uova in cocotte agli asparagi

Uova in Cocotte agli Asparagi

Ingredienti:

  • 25 asparagi circa
  • 100 g di stracchino
  • 4 uova
  • 4 cucchiai di panna
  • parmigiano reggiano
  • sale
  • pepe

Dose per 4 persone

Lavate gli asparagi, rimuovete la parte bianca e dura e cuocete in acqua bollente per 10 minuti. Scolate gli asparagi e tagliateli a pezzetti tenendo da parte qualche punta per la decorazione.
Distribuite sul fondo di 4 stampini monoporzione da soufflé (chiamati ramequin o ramekin) gli asparagi e lo stracchino tagliato a pezzetti. Aggiungete un pizzico di sale.
Rompete per uovo in ogni ramequin facendo attenzione a non rompere il rosso. Aggiungete un cucchiaio di panna, un poco di parmigiano reggiano, sale e pepe.
Mettete gli stampini in una pirofila e riempite la pirofila d’acqua bollente fino a raggiungere metà dell’altezza degli stampini. Cuocete in forno preriscaldato a 180˚ C per 15 minuti, le uova devono essere cotte ma il rosso deve rimanere morbido. Rimuovete i ramequin dalla pirofila, asciugate, decorate con le punte d’asparago tenute da parte e servite in tavola.