<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Felipe Contreras</title>
	<atom:link href="http://felipec.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://felipec.wordpress.com</link>
	<description>Personal blog of Felipe Contreras</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:01:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='felipec.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Felipe Contreras</title>
		<link>http://felipec.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://felipec.wordpress.com/osd.xml" title="Felipe Contreras" />
	<atom:link rel='hub' href='http://felipec.wordpress.com/?pushpress=hub'/>
		<item>
		<title>EFI adventures</title>
		<link>http://felipec.wordpress.com/2012/01/18/efi-adventures/</link>
		<comments>http://felipec.wordpress.com/2012/01/18/efi-adventures/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 17:22:37 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[efi]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=1129</guid>
		<description><![CDATA[If you are like me, you probably have heard of EFI, but don&#8217;t know what it means in practice, how to eat it, or what to mix it with. But I recently bought a new PC, and it happened to come with EFI, so I decided to enable it and then I learned many things [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1129&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you are like me, you probably have heard of EFI, but don&#8217;t know what it means in practice, how to eat it, or what to mix it with. But I recently bought a new PC, and it happened to come with EFI, so I decided to enable it and <b>then</b> I learned many things about it.</p>
<h3>Whole new world</h3>
<p>First of all, EFI is not something just can just &#8220;enable&#8221;. Even if your kernel has support for EFI, that won&#8217;t make a difference unless you boot it through EFI, and you can&#8217;t seamlessly boot through EFI unless you create a boot entry, which is done with <code>efibootmgr</code>, which only works once you are in EFI mode. So it&#8217;s a bit of a chicken-and-egg problem.</p>
<p>So how do you enter this world in the first place? First of all, you would need a shell. Some BIOSes come with one, but otherwise you would need to install one, and you can find public links on <a href="https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface#UEFI_Shell">this wiki page</a>.</p>
<p>But where to put this &#8220;shell&#8221;? Well, the EFI system partition&#8211;yes, you need a dedicated partition (more info <a href="https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface#UEFI_system_partition">here</a>). This partition should be formatted using FAT32, and marked in a special way, so the EFI BIOS would be able to identify it, and use it&#8217;s contents.</p>
<p>You copy the shell to this partition on <code>/shellx64.efi</code> (I tried UEFI Shell 2.0 (Beta), but it didn&#8217;t work for me, so I used the old one).</p>
<p>Your BIOS should now be able to boot this shell&#8230; Somehow. It took me a long time to figure out that in my BIOS, that&#8217;s a hidden option on the exit menu, where you can &#8220;exit&#8221; into a shell.</p>
<p>Congratulations, now you are in EFI mode, and probably type some commands, like in the old DOS days, but not be able to do anything really (unless you have some EFI version of Prince of Persia).</p>
<h3>The bootloader</h3>
<p>There are a few EFI bootloaders out there, like ELILO, and efilinux, but I decided to go with the safest and familiar choice: GRUB2 (well GRUB was familiar, GRUB2 not so much). Arch Linux&#8217;s wiki describes in great detail <a href="https://wiki.archlinux.org/index.php/GRUB2">how to setup GRUB2 for EFI</a>, so I&#8217;ll just mention that you need to use a different command (&#8216;grub_efi_x86_64-install&#8217; in the case of Arch Linux), and the files need to be installed in the aforementioned EFI system partition.</p>
<p>You would end up with a file <code>/efi/arch/grubx64.efi</code>, and this is an EFI binary that you can use in the shell. Theoretically you should be able to enter the command &#8220;\efi\arch\grubx64.efi&#8221;, but for some reason that didn&#8217;t work for me, so I had to &#8220;cd \efi\arch&#8221;, and then &#8220;grubx64.efi&#8221;. Of course, you first need to choose the right partition, but the shell makes it easier by having aliases to the EFI system partitions, so you first type &#8220;fs0:&#8221; (or something like that), like I said; very similar to DOS.</p>
<h3>Directly, please</h3>
<p>But going into the shell and typing those commands every time you boot is cumbersome, which is why you would want to add a boot entry. So, once you have been able to boot Linux through EFI, you should be able to load the &#8216;efivars&#8217; module, and thus access &#8216;/sys/firmware/efi/vars/&#8217;, which is what &#8216;efibootmgr&#8217; needs.</p>
<p>Then you can do something like:</p>
<p><code>efibootmgr --create --gpt --disk /dev/sdX --part Y --write-signature --label "Arch Linux (GRUB2)" --loader '\efi\arch\grubx64.efi'</code></p>
<p><b>WARNING</b>: You shouldn&#8217;t use this on Mac&#8217;s, there&#8217;s a different process for those.</p>
<p>In your BIOS you should see the option of booting into &#8220;Arch Linux (GRUB2)&#8221;, like you have the option of booting into a CD-ROM, and then you can choose that as the first one in the boot order <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Stub</h3>
<p>But wait a second, that starts to look like two bootloaders: the BIOS has a boot entry, and so does GRUB. Why not boot directly into Linux?</p>
<p><a href="http://article.gmane.org/gmane.linux.kernel/1204117">A couple of patches</a> from Matt Fleming enable just that. They should be in version 3.3. Enable CONFIG_EFI_STUB, and copy bzImage to /efi/linux/linux.efi.</p>
<p>So now you can boot directly from the BIOS into Linux (or Windows) with no bootloader at all <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2012/01/18/efi-adventures/"><img src="http://img.youtube.com/vi/Mi_XZocjoIA/2.jpg" alt="" /></a></span>
<h3>GPT</h3>
<p>While you are on that, why not enable this new partitioning scheme? It&#8217;s more EFI friendly, and you can&#8217;t actually install a version of Windows that works with EFI without it. For Windows 7 it&#8217;s either EFI and GPT, or non-EFI and MBR; you can&#8217;t mix them (don&#8217;t ask me why).</p>
<p>Fortunately it&#8217;s very easy to switch from MBR to GPT; just run gdisk (from a rescue disk, of course). It&#8217;s also easy to switch back, as long ad you haven&#8217;t used more than four partitions.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/1129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/1129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/1129/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1129&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2012/01/18/efi-adventures/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>Android vs. Maemo power management: static vs. dynamic</title>
		<link>http://felipec.wordpress.com/2012/01/04/android-vs-maemo-power-managment-static-vs-dynamic/</link>
		<comments>http://felipec.wordpress.com/2012/01/04/android-vs-maemo-power-managment-static-vs-dynamic/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 23:10:26 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[power management]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=1099</guid>
		<description><![CDATA[Some of you might have heard about Google&#8217;s Android team proposal to introduce wakelocks (aka suspend-blockers) to the Linux kernel. While there was a real issue being solved in the kernel side, the benefits on the user-space side were dubious at best, and after a huge discussion, they finally didn&#8217;t get in. During this discussions [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1099&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Some of you might have heard about Google&#8217;s Android team proposal to introduce wakelocks (aka suspend-blockers) to the Linux kernel. While there was a real issue being solved in the kernel side, the benefits on the user-space side were dubious at best, and after a <b>huge</b> discussion, they finally didn&#8217;t get in.</p>
<p>During this discussions the dynamic and static power management were described and discussed at length, and there was a bit of talk about Maemo(MeeGo) vs Android approaches to power management, but there was so much more than that.</p>
<p>Some people have problems with the battery on Android devices, for some people it&#8217;s just fine, some people have problems with the Maemo, other don&#8217;t, so in general; your mileage might vary. But given the extremely different approaches, it&#8217;s easy to see in which cases you would have better luck with Maemo, and in which with Android&#8211;Although I do think it&#8217;s obvious which approach is superior, but I am biased.</p>
<p>An interesting achievement was shared by Thiago Maciera, who managed to get &#8216;<a href="https://plus.google.com/108138837678270193032/posts/Apd28fCRQCz">5 days and a couple of minutes</a>&#8216; out of the Nokia N9 while traveling, and actually using it&#8211;and let&#8217;s remember this is a 1450 mAh battery. Some Android users might have trouble believing this, but hopefully this blog post would explain what&#8217;s going on.</p>
<p>So lets go ahead and explore the two approaches.</p>
<h2>Dynamic Power Management</h2>
<p>Perhaps the simplest way to imagine dynamic power management, is the gears of a manual transmission car. You go up and down depending on how much power does the system actually needs.</p>
<p>In some hardware, such as OMAP chips, it&#8217;s possible to have quite a lot of fine control on the power states of quite a lot of devices, plus different operating power points on the different cores. For example, it might be possible to have some devices, such as the display on, and active, some other devices partially off, like speaker, and other completely off, like USB. And based on the status of the whole system, whole blocks can be powered off, other with low voltage levels, etc.</p>
<p>Linux has a framework to deal properly with this kind of hardware, the <a href="http://lwn.net/Articles/347573/">runtime power management</a>, that originally came from the embedded world, and a lot from OMAP development, but is now available to everyone.</p>
<p>The idea is very simple; devices should sleep as much as possible. This means that if you have a sound device that needs chunks of 100ms, and the system is not doing anything else but playing sound, then most of the devices go to sleep, even the CPU, and the CPU is only waken up when it needs to write data for the audio device. Even better is to configure the sound device for chunks of 1 second, so the system can sleep even more.</p>
<p>Obviously, some co-operation between kernel and user-space is needed. Say, if you have an instant messenger program that needs to do work every minute, and a mail program that is configured to check mail every 10 minutes, you would want them to do work at the same time when they align at every 10 minutes. This is sometimes called <b>IP heartbeat</b>; the system wakes up for a beat, and then immediately goes back to sleep. And there are kernel facilities as well, such as range timers.</p>
<p>All this is possible thanks to very small latencies required for devices to go to sleep and wakeup, and have intermediary modes (e.g. on, inactive, retention, off), so, for example a device might be able to go to inactive mode in 1ms, retention in 2ms, and off in 5ms (totally invented numbers). Again, the more sleep, the better. Obviously, this is <b>impossible</b> on x86 chips, which have huge latencies&#8211;at least right now, and it&#8217;s something Intel is probably trying to improve effusively. All these latencies are known by the runtime pm framework in the kernel, and based on that it and the usage, it figures out what is the lowest power state possible without breaking things.</p>
<p>Note I&#8217;m not a power management expert, but you cant watch a colleague of mine explain the OMAP 3 power-managment on this video:</p>
<p><a href='http://free-electrons.com/pub/video/2009/fosdem/fosdem2009-schrijver-advanced-pm-omap3.ogv'>Advanced Power Management for OMAP3</a></p>
<p>And there&#8217;s plenty of <del datetime="2012-01-12T18:29:44+00:00"><a href="http://lwn.net/Articles/347573/">more resources</a></del>.</p>
<p><b>Update</b>: That was the wrong link, here are the <a href="http://elinux.org/Power_Management">resources</a>.</p>
<h2>Static Power Management</h2>
<p>Static power management has two modes: on and off. That&#8217;s it.</p>
<p>OK, that&#8217;s not exactly the case in general, but it is in the Android context; the system is either suspended, or active, and it&#8217;s easy to know in which mode you are; if the screen is on, it&#8217;s active, and if it&#8217;s off; it&#8217; is suspended (ideally).</p>
<p>There&#8217;s really not much more than that. The complexity comes from the problem of <b>when</b> to suspend; you might have turned off the display, but there might be a system service that still needs to do work, so this service grabs a <b>suspend blocker</b> which, as the name suggests, prevents the system from suspending (until the lock is released). This introduces a problem; a rouge program might grab a &#8216;suspend blocker&#8217; and never release it, which means your phone will never suspend, and thus the battery would drain rather quickly. So, some security mechanisms are introduced to grant permissions selectively to use suspend blockers.</p>
<p>And moreover, Android developers found race conditions in the suspend sequences in certain situations that were rather nasty (e.g. the system tries to suspend at the same time the user clicks a button, and the system never wakes up again), and these were acknowledged as real issues that would happen on all systems (including PC&#8217;s and servers, albeit rarely, because they don&#8217;t suspend so often), and got fixed (or at least they tried).</p>
<h2>Versus</h2>
<p>First of all, it&#8217;s important to know that if you have dynamic pm working perfectly, you reach exactly the same voltage usage than static pm, so in ideal cases they both behave <b>exactly</b> the same.</p>
<p>The problem is that it&#8217;s really hard for dynamic pm to reach that ideal case, in reality systems are able to sleep for certain periods of time, after which they are woken up, often times unnecessarily, and as I already explained; that&#8217;s not good. So the goal of a dynamic pm system is to increase those periods of time as much as possible, thus maximizing battery life. But there&#8217;s a point of diminished returns (read <a href="http://article.gmane.org/gmane.linux.kernel/995525">this</a> or <a href="http://article.gmane.org/gmane.linux.ports.arm.omap/37982">this</a> for expert explanations), so, if the system manages to sleep 1s in average, there&#8217;s really not much more to gain if it sleeps 2s, or even 10s. These goals were quite difficult to achieve in the past (not these, I invented those numbers), but not so much any more thanks to several mechanisms that have been introduced and implemented through the years. So it&#8217;s fair to say that the <i>sweet spot</i> of dynamic pm has been achieved.</p>
<p>This means that <b>today</b> a system that has been fine-tuned for dynamic pm can reach reach a decent battery life compared to one that uses static pm in most circumstances. But for some use-cases, say, you leave your phone on your desk and you don&#8217;t use it at all, static pm would allow it to stay alive for <b>weeks</b>, or even <b>months</b>, while dynamic pm can&#8217;t possibly achieve that any time soon. Hopefully you would agree, that nobody cares about those use-cases were you are not actually using the device.</p>
<p>And of course, you only need <b>one</b> application behaving badly and waking up the system constantly, and the battery life is screwed. So in essence, dynamic pm is hard to achieve.</p>
<p>Android developers argued that was one of the main reasons to go for static pm; it&#8217;s easier to achieve, specially if you want to support a lot of third party applications (Android Market) without compromising battery life. While this makes sense, I wasn&#8217;t convinced by this argument; you still can have one application that is behaving badly (grabbing suspend blockers the whole time), and while permissions should help, the application might still request the permission, and the user grant it (who reads incomprehensible warnings before clicking &#8216;Yes&#8217; anyway?).</p>
<p>So, both can get screwed by bad apps (although it&#8217;s likely that it&#8217;s harder in the static pm case, albeit not that much).</p>
<p>But actually, you can have <b>both</b> static and dynamic power management, and in fact, Android does. But that doesn&#8217;t mean Android automatically wins, as I explained, the system needs to be fine-tuned for dynamic pm, and that has never been a focus of Android (there&#8217;s no API&#8217;s or frameworks for that, etc.). So, for example, a Nokia N9 phone might be able to sleep 1s in average, while an Android phone 100ms (when not suspended). This means when you are <b>actually using the device</b> (the screen is on), chances are, a system fine-tuned for dynamic pm (Nokia N9) would consume less battery, than an Android device.</p>
<p><b>That</b> is the main difference between the two. <b>tl;dr:</b> dynamic pm is better for active usage.</p>
<p>So, if Android developers want to improve the battery usage while on <b>active usage</b> (which I assume is what the users want), they need to fine-tune the system for dynamic pm, and thus sleep as much as possible, hopefully reaching the <i>sweet spot</i>. But wait a second&#8230; If Android is using dynamic pm anyway, and they tune the system to the point of diminishing returns; <b>there is not need for static pm</b>. Right? Well, that&#8217;s my thinking, but I didn&#8217;t manage to make Android developers realize that in the discussion.</p>
<p>Plus, there&#8217;s a bunch of other reasons while static pm is not palatable for non-Android systems (aka. typical Linux systems), but I won&#8217;t go into those details.</p>
<p>Nokia&#8217;s bet was on dynamic, Google&#8217;s bet was on static, and in the end we agreed to disagree, but I think it&#8217;s clear from the outcome in real-world situations who was right&#8211;N9 users experiencing more than one day of normal usage, and even more than two. Sadly, only Nokia N9 users would manage to experience dynamic pm in full glory (at the moment).</p>
<h2>Upstream</h2>
<p>But not all is lost, and this in my opinion is the most important aspect. Dynamic pm lives on the Linux kernel <b>mainline</b> through the runtime power management API. This is <b>not</b> a Nokia invention that will die with the Nokia N9; it&#8217;s a collaborative effort where Nokia, TI, and other companies worked together, and now not only benefits OMAP, but other embedded chips, and even non-embedded ones. Being upstream means it&#8217;s good, and it has been blessed by many parties, and has gone through many iterations, and finally it probably doesn&#8217;t look like the original OMAP SRF code <b>at all</b>. Sooner or later your phone (if you don&#8217;t have an N9) will benefit from this effort, and it might even be an Android phone, your netbook (if not already benefiting in some way), and even your PC.</p>
<p>Android&#8217;s suspend blockers are not upstream, and it&#8217;s quite unlikely that they will ever be, or that you would see them used in any system other than Android, and there&#8217;s good reasons for that. Matthew Garrett did an excellent job of summarizing what went wrong with the story of suspend blockers on his presentation &#8216;Android/Linux kernel: Lessons learned&#8217;, but unfortunately the Linux foundation seems to be doing a poor job of providing those videos (I cannot watch them any more, even though I registered<del datetime="2012-01-12T00:48:17+00:00">, and they haven&#8217;t been helpful through email conversations</del>).</p>
<p><b>Update</b>: I managed to get the video from the Linux Foundation and pushed it to YouTube:<br />
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2012/01/04/android-vs-maemo-power-managment-static-vs-dynamic/"><img src="http://img.youtube.com/vi/A4psPP67YMU/2.jpg" alt="" /></a></span></p>
<p>Here is <a href="http://thread.gmane.org/gmane.linux.kernel/1016861/focus=1020374">part of the discussion</a> on LKML, if you want to read it for some strange reason. WARNING; it&#8217;s <b>huge</b>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/1099/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1099&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2012/01/04/android-vs-maemo-power-managment-static-vs-dynamic/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://free-electrons.com/pub/video/2009/fosdem/fosdem2009-schrijver-advanced-pm-omap3.ogv" length="176442026" type="video/ogg" />
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>A tale of just another Linux kernel bug</title>
		<link>http://felipec.wordpress.com/2011/12/13/a-tale-of-just-another-linux-kernel-bug/</link>
		<comments>http://felipec.wordpress.com/2011/12/13/a-tale-of-just-another-linux-kernel-bug/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 16:00:06 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[kernel]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=1066</guid>
		<description><![CDATA[As part of a bigger effort to get my Nokia N900 in good shape for development, I decided to track down an issue with the keyboard; I could type &#8216;a&#8217;, but not &#8216;A&#8217; or any special characters, so no &#8216;shift&#8217; or &#8216;ctrl&#8217; or anything special. Trying to figure out what was going on took me [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1066&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As part of a bigger effort to get my <a href="http://en.wikipedia.org/wiki/Nokia_N900">Nokia N900</a> in good shape for development, I decided to track down an issue with the keyboard; I could type &#8216;a&#8217;, but not &#8216;A&#8217; or any special characters, so no &#8216;shift&#8217; or &#8216;ctrl&#8217; or anything special. Trying to figure out what was going on took me through an unexpected journey, which is not remarkable, but I think it&#8217;s a good example of what many kernel developers (and low level developers) constantly go through, and as such, might be interesting for some people to read.</p>
<h2>Keycodes</h2>
<p>So, first things first. I recently had an issue with a PS/2 keyboard on my PC, so I had an idea how to debug this, and the first thing I did was to run <code>keycode</code>, which shows messages like these:</p>
<pre>keycode  30 press
keycode  30 release
keycode  30 press
keycode  30 release
keycode  29 press</pre>
<p>Then these keys are supposed to be converted to real characters somehow through a key map, and apparently X has a map of its own.</p>
<p>However, I saw keycodes being pressed when I clicked &#8216;shift&#8217;, so I concluded that neither hardware, nor input driver was the problem, could it be the mapping? The MeeGo project provided a <a href="https://meego.gitorious.org/meego-device-adaptation/n900_nokia-n900-configs/blobs/master/nokia-n900-keys.map">mapping file</a> that I have been using for some time, and it clearly shows &#8220;keycode 42 = Shift&#8221;, and I was getting keycode 42, so the mapping seemed correct, but was it being applied properly? I found out this can be checked by using <code>dumpkeys</code>, and indeed, the mapping was correct.</p>
<p>Everything was fine up to this level. Next.</p>
<p>Note: all these tools (showkey, loadkeys, and dumpkeys) are provided by the &#8216;kbd&#8217; package.</p>
<h2>Virtual terminal</h2>
<p>Now I stumbled into a problem; I&#8217;ve no idea what it is that I am interacting with on the framebuffer console (I&#8217;m not using X). So, I try fill that gap in my knowledge by going to the <code>##linux</code> IRC channel in freenode.net, and ask the question: what is it that converts they keycodes to characters in a framebuffer console? As it&#8217;s typical when I ask these sorts of tricky questions, I get useless responses, like, &#8216;what distribution are you using?&#8217; I <i>knew</i> that didn&#8217;t matter, so I set out to investigate myself.</p>
<p>I thought, well, what is this thing that I have to add in my inittab to get the console working? <code>1:2345:respawn:/sbin/getty 9600 tty1</code>. I tried to read documentation about getty and try different options, like try to specify vt100 as an argument, but to no avail.</p>
<p>Maybe it&#8217;s done in the kernel? I thought. So I quickly went through my kernel config, and I find this gem:</p>
<pre>CONFIG_VT

If you say Y here, you will get support for terminal devices with
display and keyboard devices. These are called "virtual" because you
can run several virtual terminals (also called virtual consoles) on
one physical terminal. This is rather useful, for example one
virtual terminal can collect system messages and warnings, another
one can be used for a text-mode user session, and a third could run
an X session, all in parallel. Switching between virtual terminals
is done with certain key combinations, usually Alt-.

The setterm command ("man setterm") can be used to change the
properties (such as colors or beeping) of a virtual terminal. The
man page console_codes(4) ("man console_codes") contains the special
character sequences that can be used to change those properties
directly. The fonts used on virtual terminals can be changed with
the setfont ("man setfont") command and the key bindings are defined
with the loadkeys ("man loadkeys") command.

You need at least one virtual terminal device in order to make use
of your keyboard and monitor. Therefore, only people configuring an
embedded system would want to say N here in order to save some
memory; the only way to log into such a system is then via a serial
or network connection.

If unsure, say Y, or else you won't be able to do much with your new
shiny Linux system <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </pre>
<p>That makes sense, now we are getting somewhere. So, in the past, there was this notion of &#8216;terminals&#8217;, which are specialized pieces of hardware that send and receive ASCII (or some codes), so they are the ones that have all the needed stuff to control they keyboard, screen, and so on. I never had the need to use one of these terminals, therefore I never really knew what a &#8220;virtual&#8221; terminal was. So a virtual terminal does the job of a real terminal; it needs an input driver, and a display driver, and really puts them to do something useful.</p>
<p>Interesting theory, but is it true? I quickly looked at the code inside drivers/tty/vt, and I found code to control the keyboard, screen, and also that contains the keyboard mappings. Excellent! So we found the thing that uses these keyboard mappings. Now what?</p>
<p>Before moving on, the fact that this code resides in tty is also helpful, basically, serial console, virtual terminals (framebuffer console), and real terminals all operate through tty&#8217;s (teleprinter), which are means of communication between hosts and these &#8220;devices&#8221;. So, getty really gets a tty to be used by any of these.</p>
<p>All right, so now the knowledge gap seems to be filled, what next? Well, clearly there&#8217;s something wrong with this virtual terminal, but what? I immediately started looking at the code at drivers/tty/vt/keyboard.c, and I noticed something interesting: <b>kbdmode</b> can have different values, like RAW, and this mode, certain things are not handled, like &#8216;shift&#8217;. That looked promising, but how to change that mode?</p>
<p>I looked for tools to control the virtual terminal, I found an interesting one, setterm, which was not available in my minimal system, I couldn&#8217;t find how to get it, and anyway didn&#8217;t have any option that I wanted. terminfo and such looked interesting, but it didn&#8217;t seem like anything relevant to the issue at hand. Then I found <code>kbd_mode</code>, which obviously did what I wanted, and I already had it <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . I couldn&#8217;t even type mbd_mode on my keyboard, so I had to write shortcuts on my PC (kbda, kbdb, etc.). Unfortunately, I found out that initially the mode was set to &#8216;unicode&#8217;, which seemed Ok, and changing to &#8216;ascii&#8217; didn&#8217;t change anything.</p>
<p>So, it didn&#8217;t seem to be a user-space configuration of any sort. Next.</p>
<h2>Getting our hands dirty</h2>
<p>Time to actually type some code. I modified the code in &#8216;drivers/tty/vt/keyboard.c&#8217;, specially in kbd_keycode() to find out the true kbdmode, the keycodes coming down, and how they were being interpreted.</p>
<p>I quickly found out that they keycodes and mode were indeed correct, but each and every key press was immediately followed by a key release, so shift+a was interpreted as shift, a. Now we are getting somewhere; the problem <b>has to be</b> on the input driver.</p>
<p>Maybe I chose the wrong one, or maybe I&#8217;m missing some configurations. I see some CONFIG_KEYBOARD_GPIO, and CONFIG_KEYBOARD_TWL4030, and it looks like I should be using TWL4030, as that&#8217;s the chip the Nokia N900 has, but I&#8217;m not sure, so time to look at the <a href="http://wiki.maemo.org/N900_Hardware_Schematic">N900 schematics</a>. Well, it seemed like TWL4030 is indeed the right one, and there&#8217;s nothing to it; either you have it or not.</p>
<p>Maybe some recent change broke it&#8230; But there&#8217;s nothing recent that I can see that could do that. So it&#8217;s time to take a look at the actual code: drivers/input/keyboard/twl4030_keypad.c. After adding a few prints here and there I realize the problem starts with this code <code>ret = twl4030_kpread(kp, &amp;reg, KEYP_ISR1, 1)</code> which returns 0 after a key press (that returns 1). So, time to read the <a href="http://www.ti.com/litv/pdf/swcu050g">TRM</a>.</p>
<p>It took me some time to find the right document, and then understand what all the configuration options were actually doing (more or less), and then play around with them. After making a lot of more or less random changes I notice no difference in this particular problem of getting an extra &#8217;0&#8242;. So I think to myself; maybe the problem is the interrupt.</p>
<p>So I abandon the configuration of the keyboard, and look at the code to request the interrupt:<br />
<code>request_threaded_irq(kp-&gt;irq, NULL, do_kp_irq, 0, pdev-&gt;name, kp);</code></p>
<p>I had some interrupt issues before (in fact on this very keyboard), so I knew a few hacks I could try, like specifying the IRQF_ONESHOT flag. That didn&#8217;t help, so I tried to do that in the parent interrupt on &#8216;drivers/mfd/twl4030-irq.c&#8217;, because I saw a patch from Neil Brown on the linux-omap mailing list that fixed another issue, but that didn&#8217;t help either. Then I realized I saw one patch that affected this interrupt request (<a href="http://article.gmane.org/gmane.linux.kernel/932255">see here</a>). So I revert the patch, and <b>voilà</b>, no more 0&#8242;s afterwards, and the keyboard works properly.</p>
<p>However, there&#8217;s a nasty warning about interrupts being enabled, which is probably the reason why the original patch happened, so I try a few random things to get rid of it, but nothing helps. So then I wonder, maybe the reason the keyboard driver worked before that patch is just pure luck, and these extra interrupts were not being detected properly.</p>
<h2>Enough fooling around</h2>
<p>Since I really want to fix this issue properly, I push myself to really understand what&#8217;s going on in the driver. So I slowly read all the documentation, and all the registers, and try to set different values to see what&#8217;s going on. While doing that, I noticed one function was calculating the times wrongly, and was telling the driver to use values twice as big as originally intended. It took me some time to figure out why the author chose 31 &lt;&lt; (x + 1) instead of 2 &lt;&lt; (x + 1) * 31, which is what a direct function conversion would return, until I realized that a shift basically means multiplying by two, and x &lt;&lt; 1 is basically the same as (2 &lt;&lt; 0) * x, but the author missed that x = ptv + 1, and so it should be 31 &lt;&lt; (ptv + 2). Anyway, after being confident of these timeout values, I could set big timeouts on the range of seconds without overflowing the registers and see exactly what they were doing in timescales I could notice.</p>
<p>So yeah, these registers were doing what I thought they should be doing. Nice try.</p>
<p>Time to go back to the interrupt handling. After reading the code of the twl4030-irq, which is supposed to fire the irqs that the keyboard driver eventually gets, and then reading some kernel core code as well, it was not really clear to me how these were all weaved together, so I added some printfs.</p>
<p>Before going forward I&#8217;ll briefly explain a bit what TWL4030 is. To my understanding it&#8217;s basically an integrated circuit that has many functions, one of them is having a keyboard controller. So there is no dedicated IRQ for the keyboard interrupt, but TWL4030 has a level interrupt, and then the right module IRQ is demultiplexed. OK.</p>
<p>I was hoping there was a chain of actions like pih -&gt; sih (from twl-core) -&gt; keyboard, but no, there was only one action in the chain. Fortunately when I reverted the patch I got a warning with a backtrace where I could see something like twl4030_irq_thread-&gt;generic_handle_irq-&gt;handle_simple_irq. It was really straight-forward, but I couldn&#8217;t see why. There was a lot of code in twl403o-irq for a &#8220;secondary interrupt handler&#8221; but it didn&#8217;t seem to be called at all, and I didn&#8217;t see how generic_handle_irq was calling handle_simple_irq.</p>
<p>Time to step back for a second. I remembered a patch from Neil Brown trying to fix something regarding how this sih stuff was called (<a href="http://article.gmane.org/gmane.linux.kernel/1220708">here</a>) because it was not called at all, but these patches are supposed to be fixes for other patches that are not applied at this point, so they really wouldn&#8217;t help.</p>
<p>At this point I&#8217;m pretty much stuck, as I&#8217;ve no idea how all this code is connected, you might think that all this is way over my head, and it might be, even if just a little, but that has never deterred me. I know that as long as I have the code, and I have a way to run it, I can figure out how it works, so I just keep trying.</p>
<p>After reading the code more carefully, I noticed that only some twl &#8220;modules&#8221; had a sih setup, and the keyboard was not one of them, so that explained the sih part. And then I noticed a part of the irq handling that dealt with &#8220;chips&#8221;, and one interesting function that setup the chip&#8217;s &#8220;handler&#8221;. Wait a second&#8230; So there&#8217;s a chip handler, and a client handler, a few keystrokes after and I find this gem <code>irq_set_chip_and_handler(i, &amp;twl4030_irq_chip, handle_simple_irq)</code>. Finally! So I can now see the whole chain of events, but alas, I still have no idea why things are failing.</p>
<p>I thought maybe some states where miscalculated, so I find a function that is used to print everything related to an irq, but it was hidden in some internal code, so I had to do a few tricks to use it in the keyboard driver. All the states seemed to be OK, except one&#8230; the irq count, which showed something like 0, 0, 0, 1, 2, 2, 3 where it should have shown 0, 0, 1, 1, 2, 2. I looked at all the places where this counter is modified, and I found an interesting function: handle_nested_irq, so I replaced handle_simple_irq just for fun, and&#8230;</p>
<p><b>BAM!</b></p>
<p>Everything worked perfectly.</p>
<h2>Why, Why, Why</h2>
<p>So, now I found a fix, but why does it work? If I want to fix this in a way that other people will not get bitten, I have to find the proper fix, so &#8220;This seems to make things work here&#8221; usually doesn&#8217;t convince many kernel hackers.</p>
<p>Using handle_nested_irq makes the compiler throw a warning right away, because the number of arguments is different, so I looked at how other people use this function, and it&#8217;s indeed very different, it looks like people are calling handle_nested_irq directly, instead of generic_handle_irq, which would eventually handle handle_simple_irq, because that&#8217;s the chip&#8217;s configured handler. It all boils down to the difference between handle_nested_irq and handle_simple_irq, and looking at them it&#8217;s clear that handle_nested_irq does much less, specifically, it calls directly the action-&gt;thread_fn() callback, which is the keyboard interrupt handler, rather than waking up the thread, which is the same function (but in a specialized thread).</p>
<p>And this finally shines some light; the reason why the interrupt counter is wrong, is that the thread is waked <b>after</b> the irq has been processed, so the code that is supposed to clear the interrupt hasn&#8217;t been called yet, and a second interrupt is generated which is spurious. The relevant code is supposed to read a register, and the hardware clear the interrupt on a read (or write) operation. The reason handle_nested_irq works is because it doesn&#8217;t bother with the interrupt thread at all, it calls the function right away on the same thread, and thus the interrupt is marked as handled at the right time (after it has been really handled).</p>
<p>And this also explains why other people call handle_nested_irq instead of generic_handle_irq; you are supposed to call it inside an interrupt thread (which is configured with request_threaded_irq), but there&#8217;s a thread lying around that nobody uses. Indeed, Neil Brown noticed the same (<a href="http://article.gmane.org/gmane.linux.kernel/1220707">here</a>), so irq_set_nested_thread() will make sure that no extra thread is created.</p>
<p>So both irq handlers must be threaded, the one for the twl-core, and the one for the keyboard, not just the one for the keyboard like right now. Fortunately Felipe Balbi already fixed that (see this <a href="http://article.gmane.org/gmane.linux.ports.arm.omap/59958">patch series</a>), but that broke things badly, and then Neil Brown fixed them (see <a href="http://article.gmane.org/gmane.linux.ports.arm.omap/67333">this</a>). Interestingly enough, I had already tested those patches for other reasons, but at this point I wasn&#8217;t sure if they would fix the keyboard problems, I just assumed the would anyway.</p>
<p>Good good, it looks like we finally have the whole picture, but the job&#8217;s not done yet.</p>
<h2>Getting it &#8220;done&#8221;</h2>
<p>Now the question is: how to fix this? One limitation of the &#8216;stable&#8217; kernel trees (at least AFAIK), is that the patches should be in the latest Linus&#8217;s tree, so whatever solution is found, should be in the main tree.</p>
<p>Ideally, all the stack of irq&#8217;s should be reorganized to use the nested/threaded API, or none at all. So <a href="http://article.gmane.org/gmane.linux.kernel/932255">this</a> patch, should have been applied only after <a href="http://article.gmane.org/gmane.linux.ports.arm.omap/59958">this patch series</a>, and not two years beforehand. I pondered for quite some time whether a middle-ground could be found, either by workarounds in the core irq handler, or in the keyboard one, eventually I came to the conclusion that since the core is supposed to set irq_set_nested_thread() anyway (just trust me), the keyboard one is the one that should check if it&#8217;s nested or not, and either set the thread handler, or a normal one, and this code should work before and after the patches applied for 3.2. Unfortunately, the &#8216;nested&#8217; flag is supposed to be internal to the kernel&#8217;s thread handling code.</p>
<p>So there&#8217;s really no way around it, either the original patch is reverted (and other possible similar ones for other twl modules), or all the twl core irq handler gets the new code for 3.2 backported, and that code isn&#8217;t even fixed yet (as of v3.2-rc5) (and maybe it will not be the way things are progressing).</p>
<p>Then the question arises; is all that new code on v3.2 working properly? I went ahead and tried it, and lo and behold; the keyboard works as expected. I then backported all those patches to v3.1, and they all worked too.</p>
<p>But does it really make sense to apply all those patches to all the kernels after v2.6.33? Or does it make sense to revert a few of them? That&#8217;s not for me to decide, so I ask the community, after I did all that work on <a href="http://article.gmane.org/gmane.linux.kernel.input/22899">this mail</a>.</p>
<p>Sometimes the result of a week&#8217;s work ends up being a one line patch, sometimes it&#8217;s just one character, and in this case, there was no patch (at least from me), but at least the issue is clearly identified, as well as the fixes. And that means nobody has to do this work again.</p>
<p>Well, the fun is not over&#8230; We still need to synchronize the maintainers, so the right patches land on Linus&#8217; tree for v3.2, and they are back-ported to the relevant linux-stable trees.</p>
<h2>Kernel development is hard, let&#8217;s go shopping</h2>
<p>What are you talking about? This isn&#8217;t even kernel development, it&#8217;s just some legwork <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  I&#8217;m going to be <a href="http://search.dilbert.com/comic/Topper">Topper</a> for a second and say &#8220;That&#8217;s nothing!&#8221;, there&#8217;s way more complicated and challenging issues kernel developers confront all the time. I thought this was interesting because of all the steps I had to do, and because it involved things I had no idea about.</p>
<p>Was this worth my time? Well, I learned what is actually a virtual terminal for real, and not some vague notion, like when common people say &#8220;My browser? Yeah, I use Google&#8230; No?&#8221;. I also learned a bit more about the IRQ handling API in the Linux kernel, and BTW, all this threaded interrupt API started because of real issues, and the removal of IRQF_DISABLED (nice LWN article about it <a href="http://lwn.net/Articles/380931/">here</a>), and that thread was fun to read years ago, even when I didn&#8217;t understand most of it, maybe it&#8217;s time to read it again <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>For me, the best is the satisfaction of knowing that I really &#8220;got it&#8221;. I mean, I really understand what causes the problem, many of the possible solutions, including hacky and proper ones, and exactly what to do if I get bitten by a similar problem regarding threaded IRQ&#8217;s.</p>
<p>And now that the keyboard is fixed, on with the next problem on the N900 (which I stopped working on, because I though a functional keyboard would help to debug it, as opposed to shut down, remove the MMC, plug it into a PC, write a script with the commands I want to run, unmount, plug it back, and boot [I can't use USB networking for this issue to appear]).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/1066/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/1066/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/1066/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1066&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/12/13/a-tale-of-just-another-linux-kernel-bug/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>No project is more important than its users</title>
		<link>http://felipec.wordpress.com/2011/11/21/no-project-is-more-important-than-its-users/</link>
		<comments>http://felipec.wordpress.com/2011/11/21/no-project-is-more-important-than-its-users/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 22:59:08 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[users]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=1025</guid>
		<description><![CDATA[Let&#8217;s begin by looking at some quotes from ELCE 2011 kernel panel: Linus Torvalds: The biggest thing any program can do is not the technical details of the program itself; it&#8217;s how useful the program is to users. So any time any program (like the kernel or any other project), breaks the user experience, to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1025&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s begin by looking at some quotes from ELCE 2011 kernel panel:</p>
<p>Linus Torvalds:</p>
<blockquote><p>The biggest thing any program can do is not the technical details of the program itself; it&#8217;s how useful the program is to users.</p>
<p>So any time any program (like the kernel or any other project), breaks the user experience, to me, that&#8217;s the absolute worst failure that a software project can make.</p></blockquote>
<blockquote><p>No project is more important than the users of the project.</p></blockquote>
<p>Alan Cox:</p>
<blockquote><p>If you want to understand the importance of not suddenly changing your users&#8217; experience.<br />
I would go and take a look at GNOME 3.0.<br />
[Laughter]<br />
Irrespective of whether it is a good user interface design or not.<br />
It&#8217;s a demonstrattion of why you don&#8217;t suddenly change everything on people who rely on what you were doing.</p></blockquote>
<blockquote><p>If you look at it from the point of view of the people producing the hardware and technology. Then there&#8217;s always a pressure from them to get every new feature and every new thing enabled.</p>
<p>But if you talk to the users of these systems, most of them are primarily concerned that what used to work continues to work and in the same way.</p></blockquote>
<p>You can see the whole video to get a sense of how important it is for Linux developers not to break user experience. Also, how to don&#8217;t break the API while still moving forward, and not increasing code complexity. Or breaking API without users noticing.</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/11/21/no-project-is-more-important-than-its-users/"><img src="http://img.youtube.com/vi/kzKzUBLEzwk/2.jpg" alt="" /></a></span>
<p>This should be common sense, but some people don&#8217;t agree and there are various arguments I have heard over the years.</p>
<h2>Developers vs. Users</h2>
<p>According to some people, it doesn&#8217;t matter what the users want, only what developers want, because at the end of the day, it&#8217;s the developers that will implement it. This mentality even lead to the term Free Software User Entitlement Syndrome; the idea that somehow users have a say in what happens in the project is dismissed with passion by some people.</p>
<p>This kind of thinking ignores a very basic fact; there&#8217;s no such thing as a user/developer divide. We were not branded at the moment of birth; &#8220;you shall be a developer&#8221;. No, developers were mere users at some point in time. Maybe they were not so good at programming when they started, but they eventually learned all the tricks. Or maybe they already were good programmers, but didn&#8217;t want to contribute right away until they saw the  software was actually useful, saw an area of opportunity, and had enough time.</p>
<p>Moreover, there are all kinds of developers; the ones that contribute only one patch, the ones that contribute a series of patches they did in one weekend, the ones that contribute sporadically, the ones that contribute often (but are not part of the core team), and the core team. There is no natural division either; it&#8217;s a continuum, and people often move back and forth in it as time and motivation permits.</p>
<p>In fact, this continuum of developers follows a power law distribution, also referred to as the <a href="http://en.wikipedia.org/wiki/Long_Tail">long tail</a>. It is hard to see in the following image, but the total area from the right (yellow) is the same as the left (green), that&#8217;s why the term long tail is used to point out that one should not dismiss certain people that might be labeled as outsiders, or not part of the &#8220;core&#8221;:</p>
<p><a href="http://felipec.files.wordpress.com/2011/11/600px-long_tail-svg.png"><img src="http://felipec.files.wordpress.com/2011/11/600px-long_tail-svg.png?w=630" alt="" title="Long Tail"   class="aligncenter size-full wp-image-1054" /></a></p>
<p>Here is a graph of all the contributors to the git project ordered by the number of commits, which is plotted on the y axis:</p>
<p><a href="http://felipec.files.wordpress.com/2011/11/tail_1.png"><img src="http://felipec.files.wordpress.com/2011/11/tail_1.png?w=630" alt="" title="git contributors by number of commits"   class="aligncenter size-full wp-image-1036" /></a></p>
<p>It&#8217;s not easy to see, but there&#8217;s a long tail there. Here it&#8217;s plotted in logarithmic scale, and with a graph of a pareto function:</p>
<p><a href="http://felipec.files.wordpress.com/2011/11/tail_2.png"><img src="http://felipec.files.wordpress.com/2011/11/tail_2.png?w=630" alt="" title="git contributions by number of commits in log log scale"   class="aligncenter size-full wp-image-1041" /></a></p>
<p>This means that 70% of the people contributing to git have only provided less than 6 patches, and 37% only <b>one patch</b>. Sure, one patch might not look like a lot, but as Clay Shirky points out; what if it&#8217;s a patch for a buffer overflow? what if it&#8217;s the difference between a malevolent hacker being able to exploit your system or not? Traditional companies can&#8217;t make use of people like Zack Brown who contribute only one patch to the project, but open source organizations can, so lets make use of them.</p>
<p>And lets not forget that this continuum is not static; people often move up (and down) in the ladder. Good projects would exploit this long tail by not dividing groups of developers, and making things easy for newcomers. Junio C Hamano, the maintainer of git, points out:</p>
<blockquote><p>During the entire history leading to 1.6.6, 710 authors contributed code<br />
and documentation.  The changes since 1.6.5 were made by 99 authors, among<br />
which 17 are the new contributors to the project.</p></blockquote>
<p><a href="http://article.gmane.org/gmane.comp.version-control.git/135659">Source</a>.</p>
<p>And of course, this long tail graph doesn&#8217;t even take into account the thousands of users, many which are potential contributors. Plus you have people like Ingo Molnar, who is a very active Linux kernel developer, but has only committed 6 patches to the git project, does that mean he is not a &#8220;developer&#8221;?</p>
<p>Lets get rid of this idea that there is a division between users and developers; in open source projects, this division just exists in people&#8217;s imagination.</p>
<h2>Lack of resources</h2>
<p>As Linus and other developers pointed out in the video above, you can find ways to provide both the old, and the new behavior. Often this is not difficult at all, but requires some imagination.</p>
<p>Unfortunately, some people disagree and just drop features without any way to use the previous behavior and they rationalize the decision using the &#8220;lack of resources&#8221; card. Sometimes they don&#8217;t even try it, but sometimes it&#8217;s true that it&#8217;s difficult to implement something while keeping the old behavior. However, something being difficult is not an excuse not to do it; it might take more time, but it&#8217;s still doable.</p>
<p>This is the point that is often ignored; they don&#8217;t want to spend more time.</p>
<p>But there&#8217;s another important point; perhaps the lack of developers is due to the amount of features dropped. Think about it. As I explained, all developers were users at some point, and dropping features means dropping users (current and potential), which inevitably means dropping potential developers. The harder you try to keep you users (through keeping features), the more confidence these users would have that they will be using your project in the future, and the more they will see contributing as an investment.</p>
<p>This is one of the reasons Linux is so popular (as I explained in <a href="http://felipec.wordpress.com/2011/03/06/why-linux-is-the-most-important-software-project-in-history/">another post</a>; it&#8217;s the most important software project in history) everybody that has been using it for years knows (s)he will still be using it in the years to come, as they are not going to suddenly break everything. It&#8217;s a contract between users and developers that builds <b>trust</b>. With this trust it&#8217;s easy to gather more and more users, and thus, more and more developers.</p>
<p>This also applies the other way; not only about not dropping features, but adding unpopular ones. It is possible to add features not everybody will use, and still keep them isolated from the main experience&#8211;although this requires time, and resources.</p>
<p>Imagine a developer that uses project X, which works pretty well from him, but he wants to add a feature. He might be reluctant to do so because a) there&#8217;s no guarantee that they will not drop it in the future, and b) they might reject it right away because they don&#8217;t want it in their main experience. Until there is a project like Linux that incorporates all the needs of all the people, this developer would have to either fork project X, or stay in apathy.</p>
<p>So, don&#8217;t drop any feature, and incorporate all the features; it&#8217;s difficult, but this this is the only sure way of being as successful as Linux, and avoid forks.</p>
<h2>Users don&#8217;t know what they want</h2>
<p>While there is some truth to this claim, it&#8217;s a very crude oversimplification of reality. For example, users didn&#8217;t know they wanted a touch screen before the iPhone, that is true, but after that, they <b>knew</b> they wanted it, and if you were say Nokia, you couldn&#8217;t say &#8220;oh, users don&#8217;t know what they want&#8221; and stay with non-touch interfaces; sometimes they do know. Plus, what they definitely know is what they don&#8217;t want; like an application that crashes constantly.</p>
<p>This argument is often used as a rationalization when features are removed and users complain. Some developers bring this argument in a patronized way, implying that they know better. Sometimes they do know better, but this should not be used as an excuse to stop listening the complaints.</p>
<h2>Conclusion</h2>
<p>So, there you have it, it&#8217;s really simple; try really hard not to break your user&#8217;s experience, because unlike what some people like to think; it&#8217;s the users that make a project successful. The user-base is from where all the contributors come from, and the publicity. If you do break user experience, try to do it in a way that can be reverted if your users complain, or even better, provide both an old and new way of doing things; eventually the new way would be as good as the old, and everybody would move eventually.</p>
<p>Appreciate your users, listen to them, and never threat them as expendable, or even worst; a nuisance. Basic stuff that many big projects forget.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/1025/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/1025/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/1025/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=1025&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/11/21/no-project-is-more-important-than-its-users/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>

		<media:content url="http://felipec.files.wordpress.com/2011/11/600px-long_tail-svg.png" medium="image">
			<media:title type="html">Long Tail</media:title>
		</media:content>

		<media:content url="http://felipec.files.wordpress.com/2011/11/tail_1.png" medium="image">
			<media:title type="html">git contributors by number of commits</media:title>
		</media:content>

		<media:content url="http://felipec.files.wordpress.com/2011/11/tail_2.png" medium="image">
			<media:title type="html">git contributions by number of commits in log log scale</media:title>
		</media:content>
	</item>
		<item>
		<title>No, GNOME doesn&#8217;t want user feedback; how I argued in favor of voting in bugzilla, and got banned as a result</title>
		<link>http://felipec.wordpress.com/2011/09/23/no-gnome-doesnt-want-user-feedback-how-i-argued-in-favor-of-voting-in-bugzilla-and-got-banned-as-a-result/</link>
		<comments>http://felipec.wordpress.com/2011/09/23/no-gnome-doesnt-want-user-feedback-how-i-argued-in-favor-of-voting-in-bugzilla-and-got-banned-as-a-result/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 16:43:29 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[bugzilla]]></category>
		<category><![CDATA[gnome]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=986</guid>
		<description><![CDATA[I have long been an advocate for listening to the users (see this old thread in in GNOME&#8217;s ml), and through the years I have discussed over and over with GNOME developers why it&#8217;s important to listen to your users, and why they are barely doing it. However, that hasn&#8217;t prevented me to cooperate in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=986&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I have long been an advocate for listening to the users (see this <a href="http://thread.gmane.org/gmane.comp.gnome.hackers/4353/focus=35980" target="_blank">old thread</a> in in GNOME&#8217;s ml), and through the years I have discussed over and over with GNOME developers why it&#8217;s important to listen to your users, and why they are barely doing it.</p>
<p>However, that hasn&#8217;t prevented me to cooperate in their bugzilla, I have filed bug reports, participated in discussions, also fixed bugs, and I even maintain one component; gst-openmax. You can check yourself <a href="http://goo.gl/29YbB" title="My bugs" target="_blank">here</a>, or for a few interesting ones: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629349" title="[oggdemux] extract stream tags for tagreadbin and transcoding">629349</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640859" title="basesink incorrectly categorizes timestamp jitter as drift">640859</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640665" title="basesink: drops too many buffers when there's no duration">640665</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650724" title="baseaudiosink: delay the resyncing of timestamp vs ringbuffertime">650724</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655361" title="pcapparse: fix SLL parsing">655361</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=480858" title="gstqueue code cleaning">480858</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623473" title="zlib should be checked with pkg-config">623473</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630910" title="glib: build is broken when zlib is not on a standard location">630910</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598771" title="Fix build without pango">598771</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=535074" title="Separate build/install gtk-doc stuff">535074</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=534975" title="Use autopoint">534975</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=548776" title="gstomx mpe4dec can not work with qtdemux">548776</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=340375" title="[API 0.11] differentiate between mp4 audio/video and quicktime etc.">340375</a>.</p>
<p>Yet, because of a couple of comments in <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629161">bug #629161</a> (Support voting in GNOME Bugzilla), and <b>without any warning</b>, I got banned. But of course, they deleted the evidence, so you can&#8217;t see it.</p>
<h2>The official response</h2>
<p>Anyway, let&#8217;s leave the ban pending, and concentrate on the real issue: why are votes not enabled? This is what you can find from <a href="http://live.gnome.org/BugzillaHelp" target="_blank">GNOME&#8217;s site</a>:</p>
<blockquote><p>Voting would give the impression that your vote would make someone fix the bug faster. That is almost always not the case. As this gives a false impression, voting usually creates a lot of extra comments because of that (eg &#8216;this bug has XXX amounts of votes and still not fixed&#8217;) and just frustates users.</p>
<p>A better way to get a bug fixed faster is to either:</p>
<ul>
<li>Provide a patch, or</li>
<li>Look, review and test the patches provided by other contributors. Especially the reviewing part takes a lot of time and developers will really appreciate people who say if a patch does or does not fix the bug for them. Reviewing the patch (looking for potential problems / good code style / etc) is even better.</li>
</ul>
<p>Note: If you want to express interest in a bug, just CC yourself (and leave the comment field empty). The developer can easily see if a lot of people have cc&#8217;ed themselves, without causing the bad voting side-effects.</p></blockquote>
<blockquote><p>Voting would give the impression that your vote would make someone fix the bug faster.</p></blockquote>
<p>No, it wouldn&#8217;t. That&#8217;s a miss-conception, there&#8217;s plenty of evidence to the contrary, as Tim Janik pointed in his <a href="http://timj.testbit.eu/2010/09/09/09-09-2010-request-to-support-voting-in-gnome-bugzilla/" target="_blank">blog post</a>, both GitHub and Google Code offer voting methods, but not only that, Mozilla Firefox, KDE, Mediawiki, WineHQ do too.</p>
<p>Let&#8217;s take a quick look at the most voted bugs in some projects: Chromium <a href="http://code.google.com/p/chromium/issues/detail?id=60101" target="_blank">Issue 60101</a>: webRequest extension API (<strong>2264</strong> stars), Wine <a href="http://bugs.winehq.org/show_bug.cgi?id=421" target="_blank">Bug 421</a> &#8211; Implement a DIB engine (<strong>161</strong> votes). Do you see anybody having the impression that the bug should be fixed <b>fast</b> as GNOME people suggest? No.</p>
<p>That&#8217;s because it&#8217;s not true, people assume that a bug with a lot of votes should have a high priority, that&#8217;s a completely different thing; speed != priority.</p>
<blockquote><p>As this gives a false impression, voting usually creates a lot of extra comments because of that (eg &#8216;this bug has XXX amounts of votes and still not fixed&#8217;) and just frustates users.</p></blockquote>
<p>Again not true, and backed up by a lot of evidence. People don&#8217;t complain if a bug is not fixed in a timely manner, they complain if it affects many people, and developers give to it no importance. But if they did their job properly, that would not happen, in my experience, just setting the right priority but explaining that it&#8217;s not that easy to implement is enough. Additionally, I set milestones based important bugs fixed, this way users know that 1.2 won&#8217;t be released until the bug they care about is fixed, so they know there&#8217;s no point in raising attention to it.</p>
<p>But even assuming what they said was true, the amount of annoyance the complains would generate is overcome by the value provided by knowing which bugs are really important.</p>
<blockquote><p>If you want to express interest in a bug, just CC yourself (and leave the comment field empty)</p></blockquote>
<p>That&#8217;s not what the CC field is for, therefore people would not use it for that, defeating the purpose. Plus, you can&#8217;t sort bugs by number of people in CC.</p>
<p>That&#8217;s it. It was easy to debunk wasn&#8217;t it?</p>
<h2>The bug</h2>
<p>Let&#8217;s go now to the bug in question; <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629161">bug #629161</a>. A bunch of <b>GNOME developers</b> (Tim Janik, Jürg Billeter, Sandy Armstrong, Travis Reitter, Javier Jardón, Gabriel Burt) made it clear that they would want this for their components, yet nothing happens. There&#8217;s basically only arguments in favor, nobody is arguing against.</p>
<p>So, now you have refuted arguments from their official position, and an enhancement request to allow voting in some components. Why wouldn&#8217;t they just allow it, if anything, just to see how things go? At the end of the day it&#8217;s the maintainers of the components that would decide if voting has been beneficial, or not. One can only speculate, but I assume the reason is political; if you enable voting for some components, people would automatically assume that the other components don&#8217;t want to hear feedback from users (which might very well be the case).</p>
<p>In anyway, it won&#8217;t happen&#8211;not for certain components, not as a trial, not ever. There&#8217;s no real reasons against, and it doesn&#8217;t matter how many arguments are put forward. Strange, huh?</p>
<h2>The ban</h2>
<p>These comments were deleted, so I&#8217;m providing them in full so you can judge by yourself, also, because there&#8217;s no public hearing or any way one can defend itself against arbitrary bans.</p>
<pre>--- Comment 14 Felipe Contreras 2011-09-08 23:24:33 UTC

(In reply to comment #5)
&gt; Google's star approach is nice because the user does not see how many other
&gt; folks starred the issue (or if they do, it's not nearly as visible as something
&gt; like "votes").

Wrong.

http://code.google.com/p/chromium/issues/detail?id=60101

2273 people starred this issue and may be notified of changes.

(In reply to comment #12)
&gt; The argument that users will be disappointed that bugs with high numbers of
&gt; votes are not being fixed has been raised here, and also previously on Bug
&gt; 390454.  My counter-argument to this is: so what?  Every other bug tracker I
&gt; use (KDE, Novell, SeaMonkey, OpenOffice.org, MediaWiki) allows users to both
&gt; make and view votes.  Yes, occasionally some users complain that bugs haven't
&gt; been fixed.  No, this hasn't resulted in planes falling out of the sky, all
&gt; development work ceasing, etc.  Such unhelpful comments are thankfully rare,
&gt; and either get ignored, or else someone politely reminds the poster of bug
&gt; tracker and free software development etiquette.

Exactly. The value of the information gathered by this outweighs tremendously
against the small possible annoyances. In my experience however adding voting
does not lead to annoying comments.

In my own project hosted in Google code I always make it clear when a feature
is extremely popular but it's difficult to implement, I just say that, and the
users seem to understand, that if it's not fixed in a certain period of time,
it doesn't mean that nobody cares, it just means it's not that easy.

Now, if this was actually *tried* for some period of time, and *then* it turned
out that there was indeed too many of these comments I would understand, but
that's not the case.

The decision is based on pure speculation.</pre>
<p>I say something is not true, and I provide evidence that shows that&#8217;s the case. Then I say the decision is based on speculation, which is true, and the only way to know for sure is to give it a try. Is that too bad? According to Olav is it bad enough to warrant a ban:</p>
<pre>--- Comment 15 Olav Vitters [bugzilla.gnome.org developer] 2011-09-10 03:46:00 UTC

(In reply to comment #14)
&gt; The decision is based on pure speculation.

Please just stop the way you're acting. Just because I see things differently
doesn't make it ok to behave like this on Google Plus, desktop-devel-list,
here, etc.</pre>
<p>Olav says I should stop with the way I&#8217;m acting, without specifying what is that &#8220;way&#8221;. First of all, notice that there&#8217;s no threat of a ban at this point. Also, notice that I don&#8217;t know what exactly I&#8217;m supposed to stop doing. So&#8230;</p>
<pre>--- Comment 16 Felipe Contreras 2011-09-10 12:34:24 UTC

(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; The decision is based on pure speculation.
&gt;
&gt; Please just stop the way you're acting. Just because I see things differently
&gt; doesn't make it ok to behave like this on Google Plus, desktop-devel-list,
&gt; here, etc.

I'm not acting in any way. Here's the definition of speculation:

 * to think, meditate or reflect on a subject; to deliberate or cogitate
 * to make an inference based on inconclusive evidence; to surmise or
conjecture

That is what you are doing. If you don't like how it sounds, then don't do it.

The only way you can know for sure what would happen if you enable voting, is
to enable voting, and see.</pre>
<p>Right? If somebody is speculating, what&#8217;s wrong with saying &#8220;you are speculating&#8221;, if you want people to say you are speculating, then don&#8217;t speculate. Like a cheater that is complaining about people calling him cheater.</p>
<pre>--- Comment 17 Olav Vitters [bugzilla.gnome.org developer] 2011-09-10 13:22:55 UTC

To put it in other words: I don't like the way you're behaving.

For example:

(In reply to comment #16)
&gt; That is what you are doing. If you don't like how it sounds, then don't do it.

Stating things in above way, just don't. I'm not talking about arguments you're
trying to make. It is about the way you phrase them.

More concretely: My objection is not about not like "speculation", it is the
tone of your messages and the way you phrase those things. To more it comes
acrosss as trying to "tick me off". This is the last I'll say on this matter on
this bug, getting offtopic.</pre>
<p>Oh! So it&#8217;s the tone? Well, we could debate whether there&#8217;s a nicer way to transmit the message I want to convey, but why linger on such lowly things? Olav certainly seems to have moved on and don&#8217;t want to discuss about this.</p>
<p>Note that at this point there&#8217;s still no warning about what would happen if I continue this behavior, that until the last comment wasn&#8217;t clarified, and in my opinion, it should never be an issue in the discussion.</p>
<pre>--- Comment 18 Felipe Contreras 2011-09-10 14:06:06 UTC

(In reply to comment #17)
&gt; This is the last I'll say on this matter on this bug, getting offtopic.

Exactly, this has nothing to do with the subject.

And complaining about "tone" is not precisely considered a sophisticated way to
engage in a discussion:

http://www.paulgraham.com/disagree.html

http://upload.wikimedia.org/wikipedia/commons/7/7c/Graham%27s_Hierarchy_of_Disagreement.svg</pre>
<p>According to Paul Graham responding to tone is &#8220;a weak form of disagreement&#8221;, so I try to make it more delicate by saying it&#8217;s &#8220;not precisely a sophisticated way to engage in a discussion&#8221;.</p>
<p><b>BANG</b>. Without any other comment or notification, I got banned. I didn&#8217;t notice until weeks later when I couldn&#8217;t login to GNOME bugzilla with this message:</p>
<pre>Bug 629161 -- continue behaviour after various requests to change it
If you believe your account should be restored, please send email to bugmaster@gnome.org explaining why.</pre>
<p>What? I go to that bug report and I don&#8217;t see anything (my comments were deleted), so I ask personally Andre Klappler to fetch the comments for me, and at the same time I contact the bugmasters.</p>
<p>After I got the comments and analyzed them I proceeded to build my defense (attached at the end); I actually never used a wrong tone. Olav&#8217;s problem was not with the tone, but with what I was actually saying, which was not flattering for him or GNOME, but actually true. I went into detail through those comments, and there was not <i>nicer</i> way of saying it.</p>
<p>In fact, I even proposed a <strong>compromise</strong>, I would not make any comment that criticizes GNOME, because apparently, that&#8217;s not allowed.</p>
<p>But, not surprisingly I got no response, except from Andre Klapper, who said he didn&#8217;t even read my defense:</p>
<pre>On Fri, Sep 23, 2011 at 3:35 PM, Andre Klapper wrote:
&gt; On Fri, 2011-09-23 at 15:20 +0300, Felipe Contreras wrote:
&gt;&gt; Of course not, you are only interested in patting each other in the
&gt;&gt; back, and self-congratulate yourselves. You are not interested in a
&gt;&gt; fair trial.
&gt;
&gt; It's exactly this style that makes me not interested in discussing
&gt; anything with you currently.
&gt; I stopped reading here, not interested in the rest.</pre>
<p>So, no fair trial, banned with no warning, with reasons that are not true. That&#8217;s justice in GNOME&#8217;s world.</p>
<h2>So that&#8217;s why</h2>
<p>Perhaps it should be clear now why is it that the GNOME project doesn&#8217;t listen to it&#8217;s users, doesn&#8217;t allow voting in bugzilla, doesn&#8217;t allow a user survey (I&#8217;ll explain that in another blog post), ideastorm, or anything that gives the user masses the ability to speak.</p>
<p>GNOME is an autocratic oligarchy; it&#8217;s a club of like-minded people which only allows like-minded people. It a group that is both pompous and self-congratulatory; patting each other on the back is an obligation. You should not rock the boat, criticize the status quo, be confrontational, or deviate from the norm. They are never wrong, or do lowly things, and their design is dogma.</p>
<p>As I found out, to suggest that a GNOME member is <b>speculating</b> is such an extreme offense, that one should be shunned forever, never to poison GNOME&#8217;s precious ears, regardless of years of contributions (in my case since 2005).</p>
<p>Good riddance.</p>
<h2>Defense</h2>
<pre>Since not Olav, nor anybody else presented any case, I'm going to
infer it from this:
---
Bug 629161 -- continue behaviour after various requests to change it
---

What is that behavior? Using phrasing and tone that are not in the
liking of Olav. How many instances? Presumably two, comment #14, and
comment #16. How many requests were done to change it? Presumably two,
comment #15, and comment #17.

First of all, at this point it should be clear, that in no point in
time any ban warning was issued. In fact, at no point in  time any
repercussions where stated. Having participated in countless online
discussions, I thought saying "I don't like your tone" meant only
that. Many people dislike the tone of other people, but most people
don't have the power, or the indecency, to block somebody's comments
just because they don't like them.

Now, did the accused change his tone after the second request to
change it? Well, lets look at comment #18.

What is the tone of this comment? How could this comment transmit the
same idea, but with a tone in the liking of Olav?

If you go to the page http://www.paulgraham.com/disagree.html, on the
section "Responding to Tone", the description is "this is still a weak
form of disagreement". So, stating that the site says so, is merely
stating a fact, not engaging in any form of inflammatory rhetoric. But
instead, I tried to choose more "subtle words", and changed "a weak
form of disagreement" to "not precisely sophisticated".

So no, there's nothing wrong with the tone of this comment. What Olav
didn't seem to like, was the content of the message which diminished
his position. There is no way I could have made that point in a way
that Olav would have lied it. So his "request" in comment #17 doesn't
apply, thus the "second warning" was never enforced.

Not to mention that at this point it seems more that Olav doesn't want
to discuss the merits of tone, and thus he is willing to let go of his
request. A person who was willing to improve discussions would have
been willing to continue the discussion about merits of tone in a
private manner. Or at the very least Olav should have made it clear
that regardless of the importance, it's something that is not
tolerated and warrant a ban. He didn't do any of such things.

But if you look closely at comment #17:

This is not a second request, it's a *clarification* on the first request.

And it points out to a line in comment #16:
---
That is what you are doing. If you don't like how it sounds, then don't do it.
---

Is this tone bad? What could be done to this message to improve the
tone? The point being made is that things are what things are;
speculating is speculating, and there's nothing wrong with pointing
out what is happening, instead, one should focus on avoiding doing it,
rather than preventing people from pointing it out.

So, there's really not much that can be done to change the tone of
this message without changing its meaning as well.

So, again, Olav was not concerned with the tone as he claimed, but he
was concerned about what was being said.

And finally, the line that started everything in comment #12:
---
The decision is based on pure speculation.
---

We ask again, is this tone bad? How can you say the same thing in a
better tone? There are not many ways.

So, yet again, Olav was concerned about what was being said, not the tone.

In conclusion:

1) There was no law, no warning, effectively no way in which I could
know what was going to happen.
2) There were no various requests to change the behavior, only one,
explained in two parts, because the first one was not clear enough.
3) The complaint about tone is unsubstantiated, the real problem is
pointing out things that put GNOME in a bad light.</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/986/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/986/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/986/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=986&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/09/23/no-gnome-doesnt-want-user-feedback-how-i-argued-in-favor-of-voting-in-bugzilla-and-got-banned-as-a-result/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>Unique Mexican music; Son Jarocho, folklore and more</title>
		<link>http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/</link>
		<comments>http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 23:22:08 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Mexico]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[World]]></category>
		<category><![CDATA[folklore]]></category>
		<category><![CDATA[jarocho]]></category>
		<category><![CDATA[veracruz]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=973</guid>
		<description><![CDATA[There&#8217;s a lot of interesting and unique music in Mexico, both modern and traditional, but there&#8217;s one kind that I find particularly unique and beautiful that I think it&#8217;s extremely underrated in Mexico, let alone in the world; Son Jarocho. This first video is from Cafe Tacuba, IMO the best band from Mexico, although I&#8217;m [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=973&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a lot of interesting and unique music in Mexico, both modern and traditional, but there&#8217;s one kind that I find particularly unique and beautiful that I think it&#8217;s extremely underrated in Mexico, let alone in the world; Son Jarocho.</p>
<p>This first video is from Cafe Tacuba, IMO the best band from Mexico, although I&#8217;m not sure what kind of style it is, it&#8217;s certainly awesome <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (I couldn&#8217;t find a better video quality)</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/HVyjiP4PUDg/2.jpg" alt="" /></a></span>
<p>The rest of the videos are of what I consider <a href="http://en.wikipedia.org/wiki/Son_Jarocho">Son Jarocho</a> in the right setting; small room, 3 guys;  jarana jarocha (small guitar), requinto jarocho (even smaller guitar), and more importantly; arpa jarocha (a special harp). It&#8217;s a mixture of different styles from different continents, and the lyrics are often funny and sometimes improvised to make fun of something, or somebody. BTW, jarocho means from Veracruz, one of the 31 states of Mexico.</p>
<p>La Bamba is the most famous one, but I couldn&#8217;t find one video worthy of highlighting, so I just put the best one I could find. And before you ask, yes, the high pitch and loud voices in the chorus are intended, also, wait for the solos <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/2_5ixBB9YNg/2.jpg" alt="" /></a></span>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/EwYeQ_9_nxE/2.jpg" alt="" /></a></span>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/T_cyQhJaViQ/2.jpg" alt="" /></a></span>
<p>This is what you most likely would expericence; a group wandering around restaurants, improvising and making jokes.</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/Iw1yNvZumBI/2.jpg" alt="" /></a></span>
<p>This one seems professionally recorded. Just for measure.</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/"><img src="http://img.youtube.com/vi/aFIRhN_Zo-E/2.jpg" alt="" /></a></span>
<p>For more more about Mexican music and culture, check this <a href="http://felipec.wordpress.com/2007/09/16/get-to-know-a-little-bit-more-about-mexican-culture/">previous post</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/973/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/973/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/973/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=973&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/09/07/unique-mexican-music-son-jarocho-folklore-and-more/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>Scrobbler for Maemo, now both on N900, and N9</title>
		<link>http://felipec.wordpress.com/2011/08/18/scrobbler-for-maemo-now-both-on-n900-and-n9/</link>
		<comments>http://felipec.wordpress.com/2011/08/18/scrobbler-for-maemo-now-both-on-n900-and-n9/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 20:02:13 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[maemo-scrobberl]]></category>
		<category><![CDATA[scrobbler]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=968</guid>
		<description><![CDATA[Version 2.0 finally moved to Fremantle stable, so everybody can start using it If you are not familiar with it, this package will see what music you are listening on Maemo devices, and scrobble to your favorite service, either last.fm, libre.fm, or both. I already explained the features in an earlier blog entry, along with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=968&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Version 2.0 finally moved to Fremantle stable, so everybody can <a href="http://maemo.org/downloads/product/Maemo5/maemo-scrobbler/">start using it</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>If you are not familiar with it, this package will see what music you are listening on Maemo devices, and scrobble to your favorite service, either last.fm, libre.fm, or both.</p>
<p>I already explained the features in an <a href="http://felipec.wordpress.com/2010/07/11/scrobbler-for-maemo-2-0-released-now-with-love-support/">earlier blog entry</a>, along with an explanation of how to make use of the &#8220;love&#8221; feature.</p>
<p>But now I also managed to port this to Harmattan, and it works perfectly on my Nokia N9. Interestingly enough, the new UI has a &#8220;favorite&#8221; feature directly integrated, it took me some time, as it&#8217;s not publicly documented, but I finally managed to hook into it, so everything works seamlessly <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/08/18/scrobbler-for-maemo-now-both-on-n900-and-n9/"><img src="http://img.youtube.com/vi/66KJCavcC2o/2.jpg" alt="" /></a></span>
<p>I was rather impressed by how easy it was to port it, I was able to leave all the GLib bits intact, even libsoup is still supported, and libconio, so I only had to make changes regarding the new qmafw. Thanks to the Qt guys for using the GLib&#8217;s mainloop by default, it certainly made things easier for me <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><b>Update</b></p>
<p>You can find a debian package here: <a href="http://people.freedesktop.org/~felipec/maemo-scrobbler_2.0-2_armel.deb">maemo-scrobbler 2.0-2</a>.</p>
<p>Then, you would need to create a file <code>~/.config/scrobbler</code> like this:</p>
<pre>[lastfm]
username=foo
password=bar

[librefm]
username=foo
password=bar</pre>
<p>That&#8217;s it <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/968/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/968/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=968&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/08/18/scrobbler-for-maemo-now-both-on-n900-and-n9/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>N9 Swipe undocumented feature; activate sane behavior</title>
		<link>http://felipec.wordpress.com/2011/08/14/n9-swipe-undocumented-feature-activate-sane-behavior/</link>
		<comments>http://felipec.wordpress.com/2011/08/14/n9-swipe-undocumented-feature-activate-sane-behavior/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 11:30:20 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=956</guid>
		<description><![CDATA[Ed Page recently blogged about his idea to improve the Swipe UI. Fortunately for him, a bunch of people and I had the same idea inside Nokia Update: apparently this is not present in the images distributed with the Nokia N950&#8242;s, it was introduced after 25-3. If you open ~/.config/mcompositor/mcompsitor.conf, you&#8217;ll see a bunch of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=956&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ed Page recently <a href="http://eopage.blogspot.com/2011/08/swipe-ux-idea.html">blogged about</a> his idea to improve the Swipe UI. Fortunately for him, a bunch of people and I had the same idea inside Nokia <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><b>Update</b>: apparently this is not present in the images distributed with the Nokia N950&#8242;s, it was introduced after 25-3.</p>
<p>If you open <code>~/.config/mcompositor/mcompsitor.conf</code>, you&#8217;ll see a bunch of swipe-action-foo configs, all of them set to &#8220;away&#8221; (by default).</p>
<p>You can, however, change them to something like:<br />
<code>swipe-action-up: switcher<br />
swipe-action-down: close<br />
swipe-action-left: events<br />
swipe-action-right: launcher</code></p>
<p>And voilà! Now depending on which direction you swipe, is the action that would happen. You need to kill mcompositor for them to become active (or send SIGTERM/SIGINT, I don&#8217;t remember which one).</p>
<p>This was possible because I got fed up arguing about the benefits of swiping down to close applications, and decided to implement the thing by myself. While doing that, I also decided to implement an idea that was flying around, which was to do something different depending on the direction of the swipe. It took me about two days to do, including making it configurable, mostly trying to familiarize myself with the code that was split into multiple packages, and wrapping myself around C++, which I have avoided as much as possible. That was much less time than the time spent discussing before and after I implemented the patches. Fortunately, after seeing the thing in action, many people jumped into the wagon, and at least swipe down to close is available to the masses, which people <a href="http://mynokiablog.com/2011/07/17/video-swipe-down-to-close-app-in-nokia-n9-australia-first-to-launch-n9/">seem to like</a>. Guerrilla design <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>However, after a lot of though, I realized the configuration I mentioned above is ideal. And this is my rationale:</p>
<h2>Rationale</h2>
<p>The current design is inconsistent; when you swipe away, you never know in which desktop view you are going to end up, specially if you just unlocked the device. You might end up in &#8216;switcher&#8217;, or &#8216;launcher&#8217;, or &#8216;events&#8217;. Same action, different behaviour equals inconsistency.</p>
<p>There&#8217;s a simple solution; utilize the simple mental model required to navigate the desktop views.</p>
<p><a href="http://felipec.files.wordpress.com/2011/08/swipe.png"><img src="http://felipec.files.wordpress.com/2011/08/swipe.png?w=630" alt="Swipe mental model" title="Swipe"   class="aligncenter size-full wp-image-958" /></a></p>
<p>In this way, it&#8217;s easy to know exactly what would happen when swiping on each direction, decreasing the amount of actions needed from the user. The same action always produces the same behavior.</p>
<p>It is unclear if this mode is ever going to be officially supported on the device, despite the fact that I think it&#8217;s <b>obviously</b> superior (and Ed Page seems to agree, as he came with the exact same idea by himself), maybe some people are worried about updating manuals and what not, but at least it&#8217;s trivial to activate, and anybody can create a 3rd party app for that <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>BTW. This is yet another reason why I distrust people telling me I&#8217;m a &#8220;geek&#8221;, and &#8220;designers&#8221; know better when it comes to design. In the words of Elaine Morgan; yes, they can all be wrong, history is strung with occasions when they all got it wrong.</p>
<p>Enjoy <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/956/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/956/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/956/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=956&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/08/14/n9-swipe-undocumented-feature-activate-sane-behavior/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>

		<media:content url="http://felipec.files.wordpress.com/2011/08/swipe.png" medium="image">
			<media:title type="html">Swipe</media:title>
		</media:content>
	</item>
		<item>
		<title>msn-pecan 0.1.3 released</title>
		<link>http://felipec.wordpress.com/2011/07/30/msn-pecan-0-1-3-released/</link>
		<comments>http://felipec.wordpress.com/2011/07/30/msn-pecan-0-1-3-released/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 12:21:44 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IM]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[libpurple]]></category>
		<category><![CDATA[msn]]></category>
		<category><![CDATA[msn-pecan]]></category>
		<category><![CDATA[pidgin]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=951</guid>
		<description><![CDATA[Hi, This is a normal maintenance release mostly to fix reliability on authentication, and offline messaging fixes. Felipe Contreras (19): build: use makensis win32: update README with full instructions gitignore: update build: trivial cleanup build: remove redundant -ansi specifier pn_util: remove clang warnings auth: properly cleanup pending request Improvements from clang analyzer Trivial cleanups from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=951&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>This is a normal maintenance release mostly to fix reliability on<br />
authentication, and offline messaging fixes.</p>
<pre>Felipe Contreras (19):
      build: use makensis
      win32: update README with full instructions
      gitignore: update
      build: trivial cleanup
      build: remove redundant -ansi specifier
      pn_util: remove clang warnings
      auth: properly cleanup pending request
      Improvements from clang analyzer
      Trivial cleanups from clang analysis
      pn_util: trivial improvement in pn_html_unescape
      http: fix crash when connecting from another location
      sync: fix gression in LST command
      msn: send messages offline when invisible
      notification: properly update the status on CHG
      node: extra check for open signal handler
      auth: fix a few memory leaks
      node: fix trivial warning
      build: use GIO by default
      win32: tag 0.1.3</pre>
<p>Download from the (<a href="http://code.google.com/p/msn-pecan/downloads">usual place</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/951/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/951/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=951&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/07/30/msn-pecan-0-1-3-released/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>
	</item>
		<item>
		<title>Why geeks should be your target for marketing</title>
		<link>http://felipec.wordpress.com/2011/07/20/why-geeks-should-be-your-target-for-marketing/</link>
		<comments>http://felipec.wordpress.com/2011/07/20/why-geeks-should-be-your-target-for-marketing/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 19:04:50 +0000</pubDate>
		<dc:creator>FelipeC</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://felipec.wordpress.com/?p=941</guid>
		<description><![CDATA[It&#8217;s simple; because they listen. As opposed to the masses, which are really good at ignoring you. Do you really think Average Joe will listen when you say your Samsung Galaxy S II has a 1.2Ghz dual-core processor? No, he will ask his friend, Geek Mike, which phone he should buy. Seth Godin, marketing guru, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=941&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s simple; because they listen. As opposed to the masses, which are really good at ignoring you.</p>
<p>Do you really think Average Joe will listen when you say your Samsung Galaxy S II has a 1.2Ghz dual-core processor? No, he will ask his friend, Geek Mike, which phone he should buy.</p>
<p>Seth Godin, marketing guru, explains it perfectly:</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/07/20/why-geeks-should-be-your-target-for-marketing/"><img src="http://img.youtube.com/vi/xBIVlM435Zg/2.jpg" alt="" /></a></span>
<p>He explains the TV industrial complex is gone, the golden years of the 60&#8242;s when all companies had to do is flood the TV with ads is now history. There&#8217;s too many choices, and way less time. Nowadays there&#8217;s complex networks of information, and everybody knows where and how to get recommendations of services and products, which probably will only be noticed if they are <b>remarkable</b>.</p>
<p>How do you explain that Google became such a big company without advertisement? You make a good product, and people talk about it. First the hard-core geeks, then normal geeks, there&#8217;s normal people, and eventually, even grandmas and grandpas. They started with doing one thing, but very well, and that made them remarkable. That&#8217;s why today even though Google+ as 74% males and 25% engineers (<a href="http://findpeopleonplus.com/statistics">reference</a>), they will spread the word, and eventually everybody will be there.</p>
<p><img alt="" src="http://upload.wikimedia.org/wikipedia/en/4/45/DiffusionOfInnovation.png" title="Adoption Curve" class="alignnone" width="541" height="334" /></p>
<p>That is the viral effect of social networks. If you want something to spread through the network, you have to target the nodes that are more tightly connected, the ones at the center of the network. These would obviously be geek bloggers, many of which have thousands of followers, each of which will spread it to more and more people, until eventually you get to the masses. Google, Twitter, Facebook, the iPhone, they all seemed to be targeting only a small niche of technical people, but what many people didn&#8217;t consider, is that these geeks would find the value, and spread the message.</p>
<span style="text-align:center; display: block;"><a href="http://felipec.wordpress.com/2011/07/20/why-geeks-should-be-your-target-for-marketing/"><img src="http://img.youtube.com/vi/2U-tOghblfE/2.jpg" alt="" /></a></span>
<p>This should be obvious, but for some people it&#8217;s not. Some people say &#8220;oh, the geeks don&#8217;t like this, but it&#8217;s OK, they are not our target market&#8221; (Nokia comes to mind), which completely misses the point that if geeks don&#8217;t spread the message, you already lost.</p>
<p>And that is why <a href="http://felipec.wordpress.com/2011/06/16/after-two-weeks-of-using-gnome-3-i-officially-hate-it/">GNOME 3</a>, for example, already lost. They are ignoring the huge backlash from existing users telling them &#8220;we don&#8217;t care about you, you are a tiny minority&#8221;.</p>
<p>In this hugely interconnected world, you should not disregard the tiny minority that loves you, to seek the huge majority that doesn&#8217;t care about you, that is not only dangerous, but doomed to fail. Moreover, I would go even further and say, this tiny minority can actually tell you what you should do to reach the big majority better.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipec.wordpress.com/941/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipec.wordpress.com/941/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipec.wordpress.com/941/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipec.wordpress.com&amp;blog=62686&amp;post=941&amp;subd=felipec&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://felipec.wordpress.com/2011/07/20/why-geeks-should-be-your-target-for-marketing/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">felipec</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/4/45/DiffusionOfInnovation.png" medium="image">
			<media:title type="html">Adoption Curve</media:title>
		</media:content>
	</item>
	</channel>
</rss>
