<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>emacs — jd:/dev/blog</title><description>Posts tagged &quot;emacs&quot; on jd:/dev/blog.</description><link>https://julien.danjou.info/</link><item><title>The bad practice in FOSS projects management</title><link>https://julien.danjou.info/blog/foss-projects-management-bad-practice/</link><guid isPermaLink="true">https://julien.danjou.info/blog/foss-projects-management-bad-practice/</guid><description>During the OpenStack summit a few weeks ago, I had the chance to talk to some people about my experience on running open source projects. It turns out that after hanging out in communities and contrib</description><pubDate>Thu, 09 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;During the OpenStack summit a few weeks ago, I had the chance to talk to some people about my experience on running open source projects. It turns out that after hanging out in communities and contributing to many projects for years, I may be able to provide some hindsight and an external eye to many of those who are new to it.&lt;/p&gt;
&lt;p&gt;There are plenty of resource explaining how to run an open source projects out there. Today, I would like to take a different angle and emphasize what you should not &lt;em&gt;socially&lt;/em&gt; do in your projects. This list comes from various open source projects I encountered these past years. I&apos;m going to go through some of the bad practice I&apos;ve spotted, in a random order, illustrated by some concrete example.&lt;/p&gt;
&lt;h2&gt;Seeing contributors as an annoyance&lt;/h2&gt;
&lt;p&gt;When software developers and maintainers are busy, there&apos;s one thing they don&apos;t need: more work. To many people, the instinctive reactions to external contribution is: damn, more work. And actually, it is.&lt;/p&gt;
&lt;p&gt;Therefore, some maintainers tend to avoid that surplus of work: they state they don&apos;t want contributions, or make contributors feel un-welcomed. This can take a lot of different forms, from ignoring them to being unpleasant. It indeed avoids the immediate need to deal with the work that has been added on the maintainer shoulders.&lt;/p&gt;
&lt;p&gt;This is one of the biggest mistake and misconception of open source. If people are sending you more work, you should do whatever it takes to feel them welcome so they continue working with you. They might pretty soon become the guys doing the work you are doing instead of you. Think: retirement!&lt;/p&gt;
&lt;p&gt;Let&apos;s take a look at my friend Gordon, who I saw starting as a Ceilometer contributor in 2013. He was doing great code reviews, but he was actually giving me more work by catching bugs in my patches and sending patches I had to review. Instead of being a bully so he would stop making me rework my code and reviews his patches, &lt;a href=&quot;http://lists.openstack.org/pipermail/openstack-dev/2013-May/008975.html&quot;&gt;I requested that we trust him even more by adding him as a core reviewer&lt;/a&gt;. time contribution.&lt;/p&gt;
&lt;p&gt;And if they don&apos;t do this one-time contribution, they won&apos;t make it two. They won&apos;t make any. Those projects may have just lost their new maintainers.&lt;/p&gt;
&lt;h2&gt;Letting people only do the grunt work&lt;/h2&gt;
&lt;p&gt;When new contributors arrive and want to contribute to a particular project, they may have very different motivation. Some of them are users, but some of them are just people looking to see how it is to contribute. Getting the thrill of contribution, as an exercise, or as a willingness to learn and start contributing back to the ecosystem they use.&lt;/p&gt;
&lt;p&gt;The usual response from maintainers is to push people into doing grunt work. That means doing jobs that have no interest, little value, and probably no direct impact on the project.&lt;/p&gt;
&lt;p&gt;Some people actually have no problem with it, some have. Some will feel offended to do low impact work, and some will love it as soon as you give them some sort of acknowledgment. Be aware of it, and be sure to high-five people doing it. That&apos;s the only way to keep them around.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/computer-coding.jpg&quot; alt=&quot;computer-coding&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Not valorizing small contributions&lt;/h2&gt;
&lt;p&gt;When the first patch that comes in from a new contributor is a typo fix, what developers think? That they don&apos;t care, that you&apos;re wasting their precious time with your small contribution. And nobody cares about bad English in the documentation, don&apos;t they?&lt;/p&gt;
&lt;p&gt;This is wrong. See my first contributions to &lt;a href=&quot;https://github.com/home-assistant/home-assistant/commit/36cb12cd157b22bdc1fa28b700ca0fb751cca7a4&quot;&gt;home-assistant&lt;/a&gt; and &lt;a href=&quot;https://github.com/marijnh/Postmodern/commit/ec537f72393e1032853b78e0b7b4d0ff98632a02&quot;&gt;Postmodern&lt;/a&gt;: I fixed typos in the documentation.&lt;/p&gt;
&lt;p&gt;I contributed to &lt;a href=&quot;http://orgmode.org&quot;&gt;Org-mode&lt;/a&gt; for a few years. &lt;a href=&quot;http://repo.or.cz/org-mode.git/commit/a153f5a31dffbc6b78a8c5d8d027961abe585a38&quot;&gt;My first patch to orgmode&lt;/a&gt; was about fixing a docstring. Then, I sent 56 patches, fixing bugs and adding fancy features and also wrote a few external modules. To this day, I&apos;m still #16 in the top-committer list of Org-mode who contains 390 contributors. So not that would call a small contributor. I am sure the community is glad they did not despise my documentation fix.&lt;/p&gt;
&lt;h2&gt;Setting the bar too high for new comers&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/too-high.png&quot; alt=&quot;too-high&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When new contributors arrive, their knowledge about the project, its context, and the technologies can vary largely. One of the mistakes people often make is to ask contributors too complicated things that they cannot realize. That scares them away (many people are going to be shy or introvert) and they may just disappear, feeling too stupid to help.&lt;/p&gt;
&lt;p&gt;Before making any comment, you should not have any assumption about their knowledge. That should avoid such situation. You also should be very delicate when assessing their skills, as some people might feel vexed if you underestimate them too much.&lt;/p&gt;
&lt;p&gt;Once that level has been properly evaluated (a few exchanges should be enough), you need to mentor to the right degree your contributor so it can blossom. It takes time and experience to master this, and you may likely lose some of them in the process, but it&apos;s a path every maintainer has to take.&lt;/p&gt;
&lt;p&gt;Mentoring is a very important aspect of welcoming new contributors to your project, whatever it is. Pretty sure that applies nicely outside free software too.&lt;/p&gt;
&lt;h2&gt;Requiring people to make sacrifices with their lives&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/balance-stones.jpg&quot; alt=&quot;balance-stones&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is an aspect that varies a lot depending on the project and context, but it&apos;s really important. As a free software project, where most people will contribute on their own good will and sometimes spare time, you must not require them to make big sacrifices. This won&apos;t work.&lt;/p&gt;
&lt;p&gt;One of the worst implementation of that is requiring people to fly 5 000 kilometers to meet in some place to discuss the project. This puts contributors in an unfair position, based on their ability to leave their family for a week, take a plane/boat/car/train, rent an hotel, etc. This is not good, and everything should be avoided to &lt;em&gt;require&lt;/em&gt; people to do that in order to participate and feel included in the project and blend in your community. Don&apos;t get me wrong: that does not me social activities should be prohibited, on the contrary. Just avoid excluding people when you discuss any project.&lt;/p&gt;
&lt;p&gt;The same apply to any other form of discussion that makes it complicated for everyone to participate: IRC meetings (it&apos;s hard for some people to book an hour, especially depending on the timezone they live in), video-conference (especially using non-free software), etc.&lt;/p&gt;
&lt;p&gt;Everything that requires people to basically interact with the project in a synchronous manner for a period of time will put constraints on them that can make them uncomfortable.&lt;/p&gt;
&lt;p&gt;The best medium is still e-mail and asynchronous derivative (bug trackers, etc), as it is asynchronous and allow people to work at their own pace at their own time.&lt;/p&gt;
&lt;h2&gt;Not having an (implicit) CoC&lt;/h2&gt;
&lt;p&gt;Codes of conduct seem to be a trendy topic (and a touchy subject), as more and more communities are opening to a wilder audience than they used to be – which is great.&lt;/p&gt;
&lt;p&gt;Actually, all communities have a code of conduct, being written with black ink or being carried in everyone&apos;s mind unconsciously. Its form is a matter of community size and culture.&lt;/p&gt;
&lt;p&gt;Now, depending on the size of your community and how you feel comfortable applying it, you may want to have it composed in a document, e.g. like &lt;a href=&quot;https://www.debian.org/code_of_conduct&quot;&gt;Debian did&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having a code of conduct does not transform your whole project community magically into a bunch of carebears following its guidance. But it provides an interesting point you can refer to as soon as you need. It can help throwing it at some people, to indicate that their behavior is not welcome in the project, and somehow, ease their potential exclusion – even if nobody wants to go that far generally, and that&apos;s it&apos;s rarely that useful.&lt;/p&gt;
&lt;p&gt;I don&apos;t think it&apos;s mandatory to have such a paper on smaller projects. But you have to keep in mind that the implicit code of conduct will be derived from &lt;em&gt;your&lt;/em&gt; own behavior. The way your leader(s) will communicate with others will set the entire social mood of the project. Do not underestimate that.&lt;/p&gt;
&lt;p&gt;When we started the &lt;a href=&quot;http://launchpad.net/ceilometer&quot;&gt;Ceilometer&lt;/a&gt; project, we implicitly followed the &lt;a href=&quot;https://www.openstack.org/legal/community-code-of-conduct/&quot;&gt;OpenStack Code of Conduct&lt;/a&gt; before it even existed, and probably set the bar a little higher. Being nice, welcoming and open-minded, we achieved a descent score of diversity, having up to 25% of our core team being women – way above the current ratio in OpenStack and most open source projects!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/friends-beach.jpg&quot; alt=&quot;friends-beach&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Making people not English native feeling like outsider&lt;/h2&gt;
&lt;p&gt;It&apos;s quite important to be aware of that the vast majority of free software project out there are using English as the common language of communication. It makes a lot of sense: it&apos;s a commonly spoken language, and it seems to do the job correctly.&lt;/p&gt;
&lt;p&gt;But a large part of the hackers out there are not native English speakers. Many are not able to speak English fluently. That means the rate at which they can communicate and run a conversation might be very low, which can make some people frustrated, especially native English speaker.&lt;/p&gt;
&lt;p&gt;The principal demonstration of this phenomena can be seen in social events (e.g. conferences) where people are debating. It can be very hard for people to explain their thoughts in English and to communicate properly at a decent rate, making the conversation and the transmission of ideas slow. The worst thing that one can see in this context is an English native speaker cutting people off and ignoring them, just because they are talking too slowly. I do understand that it can be frustrating, but the problem here is not the non-native English speaking, it&apos;s the medium being used that does not make your fellow on the same level of everyone by moving the conversation orally.&lt;/p&gt;
&lt;p&gt;To a lesser extent, the same applies to IRC meetings, which are by relatively synchronous. Completely asynchronous media do not have this flaw, that&apos;s why they should also be preferred in my opinion.&lt;/p&gt;
&lt;h2&gt;No vision, no delegation&lt;/h2&gt;
&lt;p&gt;Two of the most commonly encountered mistakes in open source projects: seeing the maintainer struggling with the growth of its project while having people trying to help.&lt;/p&gt;
&lt;p&gt;Indeed, when the flow of contributor starts coming in, adding new features, asking for feedback and directions, some maintainers choke and don&apos;t know how to respond. That ends up frustrating contributors, which therefore may simply vanish.&lt;/p&gt;
&lt;p&gt;It&apos;s important to have a vision for your project and communicate it. Make it clear for contributors what you want or don&apos;t want in your project. Transferring that in a clear (and non-aggressive, please) manner, is a good way of lowering the friction between contributors. They&apos;ll pretty soon know if they want to join your ship or not, and what to expect. So be a good captain.&lt;/p&gt;
&lt;p&gt;If they chose to work with you and contribute, you should start trusting them as soon as you can and delegate some of your responsibilities. This can be anything that you used to do: review patches targeting some subsystem, fixing bugs, writing docs. Let people own an entire part of the project so they feel responsible and care about it as much as you do. Doing the opposite, which is being a control-freak, is the best shot at staying alone with your open source software.&lt;/p&gt;
&lt;p&gt;And no project is going to grow and be successful that way.&lt;/p&gt;
&lt;p&gt;In 2009, when Uli Schlachter sent &lt;a href=&quot;http://article.gmane.org/gmane.comp.window-managers.awesome.devel/1746/match=uli+schlachter&quot;&gt;his first patch to awesome&lt;/a&gt;, this was more work for me. I had to review this patch, and I was already pretty busy designing the new versions of awesome and doing my day job! Uli&apos;s work was not perfect, and I had to fix it myself. More work. And what did I do? A few minutes later, I &lt;a href=&quot;http://article.gmane.org/gmane.comp.window-managers.awesome.devel/1747/match=uli+schlachter&quot;&gt;replied to him&lt;/a&gt; with a clear plan of what he should do and what I thought about his work.&lt;/p&gt;
&lt;p&gt;In response, Uli sent patches and improved the project. Do you know what Uli does today? He manages the awesome window manager project since 2010 instead of me. I managed to transmit my vision, delegate, and then retired!&lt;/p&gt;
&lt;h2&gt;Non-recognition of contributions&lt;/h2&gt;
&lt;p&gt;People contribute in different ways, and it&apos;s not always code. There&apos;s a lot of things around a free software projects: documentation, bug triage, user support, user experience design, communication, translation…&lt;/p&gt;
&lt;p&gt;It took a while for example to &lt;a href=&quot;http://debian.org&quot;&gt;Debian&lt;/a&gt; to recognize that their translators could have the status of Debian Developer. &lt;a href=&quot;http://openstack.org&quot;&gt;OpenStack&lt;/a&gt; is working in the same direction by trying to &lt;a href=&quot;https://wiki.openstack.org/wiki/NonATCRecognition&quot;&gt;recognize non-technical contributions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As soon as your project starts attributing badges to some people and creating classes of different members in the community, you should be very careful that you don&apos;t forget anyone. That&apos;s the easiest road to losing contributors along the road.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/heart-sign.jpg&quot; alt=&quot;heart-sign&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Don&apos;t forget to be thankful&lt;/h2&gt;
&lt;p&gt;This whole list has been inspired by many years of open source hacking and free software contributions. Everyone&apos;s experience and feeling might be different, or malpractice may have been seen under different forms. Let me know and if there&apos;s any other point that you encountered and blocked you to contribute to open source projects!&lt;/p&gt;
</content:encoded><category>open-source</category><category>openstack</category><category>awesome</category><category>debian</category><category>emacs</category></item><item><title>Gnus notifications</title><link>https://julien.danjou.info/blog/gnus-notifications/</link><guid isPermaLink="true">https://julien.danjou.info/blog/gnus-notifications/</guid><description>Today, I&apos;ve merged my Gnus notifications module inside Gnus git repository. This way, it will be available for everybody in Emacs 24.2.</description><pubDate>Wed, 29 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/commit/?id=7b7db76666fae115c7ec0cc78ca96ea4e177ba4e&quot;&gt;I&apos;ve merged my Gnus notifications module&lt;/a&gt; inside Gnus git repository. This way, it will be available for everybody in Emacs 24.2.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/gnus-notifications-1.png&quot; alt=&quot;gnus-notifications-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This module allows you to be notified via &lt;code&gt;notifications-notify&lt;/code&gt; (the Emacs implementation of the &lt;a href=&quot;http://www.galago-project.org/specs/notification/&quot;&gt;Freedesktop desktop notifications&lt;/a&gt;) on new messages received in Gnus. It can also retrieves contacts photo via &lt;em&gt;gravatar.el&lt;/em&gt; and &lt;em&gt;google-contacts.el&lt;/em&gt; to include them in the notification.&lt;/p&gt;
&lt;p&gt;To enable it in Emacs &amp;gt; 24.1, you just have to add the following line to your Gnus configuration file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(add-hook &apos;gnus-after-getting-new-news-hook &apos;gnus-notifications)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to download it and use it stand-alone for a previous Emacs version, you can &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/plain/lisp/gnus-notifications.el&quot;&gt;fetch the latest file revision&lt;/a&gt; and load it before adding the previously given line.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Emacs configuration published</title><link>https://julien.danjou.info/blog/emacs-configuration-published/</link><guid isPermaLink="true">https://julien.danjou.info/blog/emacs-configuration-published/</guid><description>I&apos;ve finally published my Emacs configuration.  This took me a while, since I had personal information inside (like passwords). Recently, I&apos;ve been able to move them away and can now publish everythin</description><pubDate>Tue, 24 Jul 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve finally published my Emacs configuration.&lt;/p&gt;
&lt;p&gt;This took me a while, since I had personal information inside (like passwords). Recently, I&apos;ve been able to move them away and can now publish everything in my &lt;a href=&quot;https://github.com/jd/emacs.d.git&quot;&gt;Git repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s probably not yet usable from scratch, since I didn&apos;t include the bootstrap code for &lt;a href=&quot;http://github.com/dimitri/el-get&quot;&gt;el-get&lt;/a&gt;. But you can at least lurk and grab some ideas or lines of code. And do not hesitate to ask me anything about it!&lt;/p&gt;
&lt;p&gt;Note that I&apos;m using Emacs development version (trunk), so it&apos;s possible that some things do not work with (old) released Emacs versions.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>ERC notifications</title><link>https://julien.danjou.info/blog/erc-notifications/</link><guid isPermaLink="true">https://julien.danjou.info/blog/erc-notifications/</guid><description>Today, I&apos;ve merged my erc notifications module inside Emacs trunk. This way, it will be available for everybody in Emacs 24.2.</description><pubDate>Sat, 21 Jul 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, &lt;a href=&quot;http://bzr.savannah.gnu.org/lh/emacs/trunk/revision/109176&quot;&gt;I&apos;ve merged my erc notifications module&lt;/a&gt; inside Emacs trunk. This way, it will be available for everybody in Emacs 24.2.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/erc-notifications-1.png&quot; alt=&quot;erc-notifications-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This module allows you to be notified via &lt;code&gt;notifications-notify&lt;/code&gt; (the Emacs implementation of the &lt;a href=&quot;http://www.galago-project.org/specs/notification/&quot;&gt;Freedesktop desktop notifications&lt;/a&gt;) on private message received on IRC, or when your nickname is mentioned on a channel.&lt;/p&gt;
&lt;p&gt;To enable it in Emacs &amp;gt; 24.1, you just have to add the following line to your configuration file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(add-to-list &apos;erc-modules &apos;notifications)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to download it and use it stand-alone for a previous Emacs version, you can &lt;a href=&quot;http://bzr.savannah.gnu.org/lh/emacs/trunk/annotate/head:/lisp/erc/erc-notifications.el&quot;&gt;fetch the latest file revision&lt;/a&gt; and load it before adding the previously given line.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Ten years as a Debian developer</title><link>https://julien.danjou.info/blog/ten-years-as-a-debian-developer/</link><guid isPermaLink="true">https://julien.danjou.info/blog/ten-years-as-a-debian-developer/</guid><description>Ten years ago, I joined the Debian project as a developer.</description><pubDate>Fri, 24 Feb 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ten years ago, I joined the &lt;a href=&quot;http://www.debian.org&quot;&gt;Debian&lt;/a&gt; project as a developer.&lt;/p&gt;
&lt;p&gt;At that time, I was 18 and in my first year at university, hanging out with the &lt;a href=&quot;http://tuxfamily.org&quot;&gt;TuxFamily&lt;/a&gt; system administrators, which included 3 french Debian developers (sjg, igenibel and creis).&lt;/p&gt;
&lt;p&gt;I was learning Debian packaging while working on &lt;a href=&quot;http://vhffs.org&quot;&gt;VHFFS&lt;/a&gt;, and decided to package one or two non-yet-packaged software for Debian. My friends pushed me into the &lt;a href=&quot;http://nm.debian.org&quot;&gt;NM process&lt;/a&gt;, and &lt;a href=&quot;https://nm.debian.org/nmstatus.php?email=acid@hno3.org&quot;&gt;less than 2 months later&lt;/a&gt; I was a Debian developer. One have to admit that back in the days, the NM process was really fast if you were able to reply to the questions quickly. :-) I think I became the youngest developer among Debian&apos;s ones.&lt;/p&gt;
&lt;p&gt;That was my first steps in a Free Software project, and it was really exciting.&lt;/p&gt;
&lt;p&gt;In 10 years, I&apos;ve been doing a lot of different things for Debian. Sure, I&apos;ve been using it all the years long, but let&apos;s recap a bit what I did, from what I recall.&lt;/p&gt;
&lt;p&gt;My first Debian only project was &lt;a href=&quot;http://packages.debian.org/apt-build&quot;&gt;apt-build&lt;/a&gt; around 2003, and later &lt;a href=&quot;http://packages.debian.org/rebuildd&quot;&gt;rebuildd&lt;/a&gt; in 2007.&lt;/p&gt;
&lt;p&gt;I built the &lt;a href=&quot;https://alioth.debian.org/projects/pkg-xen/&quot;&gt;Xen packaging team&lt;/a&gt; in 2005, I&apos;ve been a Stable Release Manager for a year in 2006, and did heavy bug squashing to release Etch that same year.&lt;/p&gt;
&lt;p&gt;I also was an &lt;a href=&quot;https://nm.debian.org/whoisam.php&quot;&gt;Application Manager in 2006&lt;/a&gt; and managed the application of 2&lt;br /&gt;
Debian developers (&lt;a href=&quot;https://nm.debian.org/nmstatus.php?email=joseparrella%40cantv.net&quot;&gt;Jose Parrella&lt;/a&gt; and &lt;a href=&quot;https://nm.debian.org/nmstatus.php?email=debian%40damianv.com.ar&quot;&gt;Damián Viano&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I admit I&apos;ve been less active in Debian after 2007, mainly because I was busy working on &lt;a href=&quot;http://awesome.naquadah.org&quot;&gt;awesome&lt;/a&gt;, &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs&lt;/a&gt; and others software.&lt;/p&gt;
&lt;p&gt;Since 2011, I joined the &lt;a href=&quot;http://alioth.debian.org/projects/openstack/&quot;&gt;OpenStack packaging team&lt;/a&gt; and I&apos;m working on OpenStack on a (almost) daily basis.&lt;/p&gt;
&lt;p&gt;I don&apos;t know how many packages I touched, managed or updated, but that should be one or two hundreds. I still maintain &lt;a href=&quot;http://qa.debian.org/developer.php?login=acid&quot;&gt;53 of them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After all, the adventure has been really pleasant, and I had the chance to work with and meet fabulous and smart people. I always liked this project and what it&apos;s trying to do.&lt;/p&gt;
&lt;p&gt;After all these years, I&apos;m definitively staying! See you in another 10 years, folks! :)&lt;/p&gt;
</content:encoded><category>debian</category><category>openstack</category><category>emacs</category><category>awesome</category></item><item><title>Google Contacts for Emacs</title><link>https://julien.danjou.info/blog/google-contacts-for-emacs/</link><guid isPermaLink="true">https://julien.danjou.info/blog/google-contacts-for-emacs/</guid><description>I finally finished a thing I was really missing: accessing my Google Contacts from Emacs.</description><pubDate>Mon, 26 Sep 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I finally finished a thing I was really missing: accessing my Google Contacts from Emacs.&lt;/p&gt;
&lt;p&gt;That&apos;s now possible, thanks to my new &lt;a href=&quot;https://github.com/jd/google-contacts.el&quot;&gt;google-contacts.el&lt;/a&gt; package.&lt;/p&gt;
&lt;p&gt;It includes searching for any contact and displaying the result in a window.&lt;br /&gt;
You can also jump to a contact from &lt;a href=&quot;http://gnus.org&quot;&gt;Gnus&lt;/a&gt; by pressing a&lt;br /&gt;
key, and complete e-mail addresses while composing a mail.&lt;/p&gt;
</content:encoded><category>emacs</category><category>google</category></item><item><title>OAuth 2.0 for Emacs</title><link>https://julien.danjou.info/blog/oauth-2-0-for-emacs/</link><guid isPermaLink="true">https://julien.danjou.info/blog/oauth-2-0-for-emacs/</guid><description>This week, I&apos;ve finished my OAuth 2.0 client implementation for GNU Emacs.</description><pubDate>Fri, 23 Sep 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This week, I&apos;ve finished my &lt;a href=&quot;http://oauth.net/2/&quot;&gt;OAuth 2.0&lt;/a&gt; client implementation for &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have &lt;a href=&quot;http://bzr.savannah.gnu.org/lh/emacs/elpa/revision/126?start_revid=126&quot;&gt;imported it&lt;/a&gt; into &lt;a href=&quot;http://elpa.gnu.org/&quot;&gt;GNU ELPA&lt;/a&gt; so Emacs 24 users will be soon able to install it using the new Emacs packaging system.&lt;/p&gt;
&lt;p&gt;OAuth 2.0 can be used to access, among others, &lt;a href=&quot;http://code.google.com/apis/accounts/docs/OAuth2.html&quot;&gt;Google APIs&lt;/a&gt; or the &lt;a href=&quot;http://developers.facebook.com/docs/authentication/&quot;&gt;Facebook Graph API&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>emacs</category><category>web</category></item><item><title>Org contacts now part of org-contrib</title><link>https://julien.danjou.info/blog/org-contacts-now-part-of-org-contrib/</link><guid isPermaLink="true">https://julien.danjou.info/blog/org-contacts-now-part-of-org-contrib/</guid><description>Thanks to my recent promotion allowing me to commit directly in Org-mode, I&apos;ve moved Org-contacts into the contrib directory of the Orgmode distribution.</description><pubDate>Fri, 18 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Thanks to my recent promotion allowing me to commit directly in Org-mode, I&apos;ve moved Org-contacts into the contrib directory of the &lt;a href=&quot;http://www.orgmode.org&quot;&gt;Orgmode&lt;/a&gt; distribution.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>My latest contributions to the Emacs&apos; world</title><link>https://julien.danjou.info/blog/my-latest-contributions-to-the-emacs-world/</link><guid isPermaLink="true">https://julien.danjou.info/blog/my-latest-contributions-to-the-emacs-world/</guid><description>I spend too much time writing Emacs Lisp code these days. Unfortunately, the more I do the more I find new useful tools to improve my work-flow and save time for doing more Lisp. D&apos;oh.  I did not work</description><pubDate>Tue, 01 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I spend too much time writing Emacs Lisp code these days. Unfortunately, the more I do the more I find new useful tools to improve my work-flow and save time for doing more Lisp. D&apos;oh.&lt;/p&gt;
&lt;p&gt;I did not work on any big thing these last weeks, so I&apos;m thinking it&apos;s a good time to talk about the various code and patches I sent to multiple Emacs packages.&lt;/p&gt;
&lt;h2&gt;el-get&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dimitri/el-get&quot;&gt;el-get&lt;/a&gt;, a fabulous tool that installs and handles all the external Emacs packages I use. A friendly war started on the &lt;a href=&quot;http://blog.gmane.org/gmane.emacs.el-get.devel&quot;&gt;development list&lt;/a&gt; about autoloads handling. The discussion was overall pointless, since we had a very hard time to communicate our ideas, and we did not understand each others several times.&lt;/p&gt;
&lt;p&gt;In the end, &lt;em&gt;el-get&lt;/em&gt; now supports autoload correctly and do not load automatically all your packages, improving the startup time, and using the Emacs way to do things. Which is always better, obviously.&lt;/p&gt;
&lt;h2&gt;git-commit-mode&lt;/h2&gt;
&lt;p&gt;I&apos;ve started to use &lt;a href=&quot;https://github.com/rafl/git-commit-mode&quot;&gt;git-commit-mode&lt;/a&gt; some times ago. I usually use &lt;em&gt;git-commit&lt;/em&gt; with the &lt;em&gt;-v&lt;/em&gt; option to see what I&apos;m committing. I though it would be useful to color the diff with &lt;em&gt;diff-mode&lt;/em&gt;, so I &lt;a href=&quot;https://github.com/rafl/git-commit-mode/commit/3e2d1047fff31358c39486cd890d1eb87a464404&quot;&gt;wrote a patch&lt;/a&gt; just to do that, which&lt;br /&gt;
was merged today by Florian.&lt;/p&gt;
&lt;h2&gt;magit&lt;/h2&gt;
&lt;p&gt;Some weeks ago, I decided to give a try to &lt;a href=&quot;http://philjackson.github.com/magit/&quot;&gt;magit&lt;/a&gt;, and loved it. I am not always using it, but for basic operations it is very useful. But I really soon found some things I did not like and therefore send patches to enhance it.&lt;/p&gt;
&lt;p&gt;First, I&apos;ve added &lt;a href=&quot;https://github.com/philjackson/magit/commit/0314e7fd1df2b37b3cd1699afdf2dc3b98aee2d1&quot;&gt;a patch to honor status.showUntrackedFiles&lt;/a&gt; which I use in my home directory. In the mean time, I&apos;ve also added &lt;a href=&quot;https://github.com/philjackson/magit/commit/43cd05081b7e60d3f2dcce696f3a07c135f4e306&quot;&gt;a patch to allow adding an arbitrary file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Yesterday, I sent another &lt;a href=&quot;https://github.com/philjackson/magit/pull/128&quot;&gt;pull request&lt;/a&gt;, not closed for now, which adds the &lt;a href=&quot;https://github.com/jd/magit/commit/73afce9f0220146a55c6c63735ce48561a277632&quot;&gt;possibility to visit files in another window&lt;/a&gt; from a diff file, and &lt;a href=&quot;https://github.com/jd/magit/commit/82d43edb123f493d639ef0835734e58fca1b8c0a&quot;&gt;the support for add-change-log-entry&lt;/a&gt; directly from the displayed diff. Useful for these old projects still using &lt;em&gt;ChangeLog&lt;/em&gt; files but accessible through git (hi Emacs &amp;amp; Gnus!).&lt;/p&gt;
&lt;h2&gt;Gnus&lt;/h2&gt;
&lt;p&gt;Nothing remarkable, but I write a couple of &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/commit/?id=3ccee76adca8a830cf781e697119b980cd9fcbe1&quot;&gt;fixes&lt;/a&gt; and &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/commit/?id=01c211faea248b5d9e35f3662670bb8d12b9b137&quot;&gt;enhancements&lt;/a&gt; to the Sieve manage mode, to the &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/commit/?id=d715adda2809176649227153d9e97564e755efb6&quot;&gt;Gravatar code&lt;/a&gt; and cleaned-up some very very old code. Also added the possibility to&lt;br /&gt;
&lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/commit/?id=2bd6537597f51762a4b04f81c70d8f2be5dcb690&quot;&gt;set list-identifier as a group parameter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Org-mode&lt;/h2&gt;
&lt;p&gt;I spent most of my time working on my &lt;a href=&quot;http://git.naquadah.org/?p=~jd/org-mode.git;a=shortlog;h=refs/heads/jd/agenda-format&quot;&gt;jd/agenda-format&lt;/a&gt; branch, which is soon to be merged. I&apos;ve also just got developer access to the Org-mode patch work and repository, so I&apos;ll be able to break things even more! ;-)&lt;/p&gt;
&lt;h2&gt;ERC&lt;/h2&gt;
&lt;p&gt;I &lt;a href=&quot;http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=391de97a758c44e5d38e0c8f0bd50fe5eae09d5f&quot;&gt;fixed&lt;/a&gt; &lt;strong&gt;the&lt;/strong&gt; bug that annoyed me for a long time. Now &lt;em&gt;erc-track&lt;/em&gt; does not reset the last channel status on window visibility changes not made by the user.&lt;/p&gt;
</content:encoded><category>emacs</category><category>github</category></item><item><title>Announcing Org-contacts</title><link>https://julien.danjou.info/blog/announcing-org-contacts/</link><guid isPermaLink="true">https://julien.danjou.info/blog/announcing-org-contacts/</guid><description>When I started to use Emacs, I got hooked by many stuff like Gnus and Org-mode. One thing I quickly started to hate is how the Lisp code can be old and unmaintained.</description><pubDate>Tue, 08 Feb 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I started to use Emacs, I got hooked by many stuff like &lt;a href=&quot;http://gnus.org&quot;&gt;Gnus&lt;/a&gt; and &lt;a href=&quot;http://orgmode.org&quot;&gt;Org-mode&lt;/a&gt;. One thing I quickly started to hate is how the Lisp code can be old and unmaintained. That especially applies to &lt;a href=&quot;http://bbdb.sourceforge.net&quot;&gt;BBDB&lt;/a&gt;, which has been unmaintained for years, and has very very very old and obsolete code.&lt;/p&gt;
&lt;p&gt;Therefore I&apos;ve decided to develop my own BBDB replacement based on my lovely Org-mode. It&apos;s called &lt;code&gt;org-contacts&lt;/code&gt;, and it allows you to handle your contact like anything you would handle in Org. This way you can manage them the way you want, without any preset fields or any assumptions like BBDB has.&lt;/p&gt;
&lt;p&gt;I had the chance to present it at the Paris OrgCamp a couple of weeks ago,&lt;br /&gt;
and due to the enthusiastic audience I had, I&apos;m now releasing it to the wide&lt;br /&gt;
Internet.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Naquadah theme for Emacs</title><link>https://julien.danjou.info/blog/naquadah-theme-for-emacs/</link><guid isPermaLink="true">https://julien.danjou.info/blog/naquadah-theme-for-emacs/</guid><description>I often post Emacs screenshots on this blog, and consequently receive a bunch of request for my Emacs theme. Therefore I decided to publish it.</description><pubDate>Mon, 31 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I often post Emacs screenshots on this blog, and consequently receive a bunch of request for my Emacs theme. Therefore I decided to &lt;a href=&quot;https://github.com/jd/naquadah-theme&quot;&gt;publish it&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>OrgCamp Paris 2011 review</title><link>https://julien.danjou.info/blog/orgcamp-paris-2011-review/</link><guid isPermaLink="true">https://julien.danjou.info/blog/orgcamp-paris-2011-review/</guid><description>Yesterday afternoon, I was at the first OrgCamp in Paris.</description><pubDate>Sun, 23 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday afternoon, I was at the first &lt;a href=&quot;http://www.lifehacking.fr/mediawiki/index.php/OrgModeCampJanvier2011&quot;&gt;OrgCamp in Paris&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was my first attendance to a &lt;a href=&quot;http://en.wikipedia.org/wiki/BarCamp&quot;&gt;BarCamp&lt;/a&gt;, and I really liked it. It&apos;s basically the first geek event I do not find boring nor useless.&lt;/p&gt;
&lt;p&gt;There was about 18-20 persons participating, which was quite high, since we all initially though we would have been only 5.&lt;/p&gt;
&lt;p&gt;We had several presentations of various features and personal usages of &lt;a href=&quot;http://www.orgmode.org&quot;&gt;Org-mode&lt;/a&gt;. For my part, I&apos;ve quickly presented the agenda, and my &lt;a href=&quot;http://bbdb.sourceforge.net/&quot;&gt;BBDB&lt;/a&gt; replacement named &lt;strong&gt;org-contacts&lt;/strong&gt; (I&apos;ll probably talk about it on this blog in another post later).&lt;/p&gt;
&lt;p&gt;The only downside was that Bastien (the new Org-mode maintainer) was not able to come and join us. On the other side, there were so much to tell for a first time, I did not have so much time to code. I only have been able to &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-orgmode/2011-01/msg01002.html&quot;&gt;fix one bug&lt;/a&gt; reported during my agenda presentation.&lt;/p&gt;
&lt;p&gt;In the end, the overall atmosphere was very enthusiastic and friendly, which was extremely pleasant. The #org-mode-fr IRC channel has been created on &lt;a href=&quot;http://freenode.net&quot;&gt;Freenode&lt;/a&gt;, following this event. Feel free to join us.&lt;/p&gt;
&lt;p&gt;Since people liked it so badly, it seems there should be another barcamp in the next months. Stay tuned.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Code fontification with Gnus and Org-mode</title><link>https://julien.danjou.info/blog/code-fontification-with-gnus-and-orgmode/</link><guid isPermaLink="true">https://julien.danjou.info/blog/code-fontification-with-gnus-and-orgmode/</guid><description>I&apos;ve added code fontification using Org src blocks inside Gnus.</description><pubDate>Thu, 20 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve added code fontification using &lt;a href=&quot;http://orgmode.org/manual/Working-With-Source-Code.html#Working-With-Source-Code&quot;&gt;Org src blocks&lt;/a&gt; inside &lt;a href=&quot;http://gnus.org&quot;&gt;Gnus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/gnus-org-buffer-fontification-1.png&quot; alt=&quot;gnus-org-buffer-fontification-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This interprets the block as an Org buffer and fontify it accordingly if &lt;code&gt;org-src-fontify-natively&lt;/code&gt; it set to &lt;code&gt;t&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://news.gmane.org/find-root.php?message_id=%3c80k4lj78ui.fsf%40mundaneum.com%3e&quot;&gt;Sébastien Vauban for the original idea&lt;/a&gt; and implementation. Now it works out of the box without any customization.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Color contrast correction</title><link>https://julien.danjou.info/blog/color-contrast-correction/</link><guid isPermaLink="true">https://julien.danjou.info/blog/color-contrast-correction/</guid><description>I finally took some time to finish my color contrast corrector.  It&apos;s now able to compare two colors and to tell if they are readable when used as foreground and background color for text rendering. I</description><pubDate>Tue, 23 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I finally took some time to finish my color contrast corrector.&lt;/p&gt;
&lt;p&gt;It&apos;s now able to compare two colors and to tell if they are readable when used as foreground and background color for text rendering. If they are too close, the code corrects both colors so to they&apos;ll become distant enough to be readable.&lt;/p&gt;
&lt;p&gt;To do that, it uses color coordinates in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lab_color_space&quot;&gt;CIE L_a_b* colorspace&lt;/a&gt;. This allows to determine the luminance difference between 2 colors very easily by comparing the &lt;em&gt;L&lt;/em&gt; component of the coordinates. The default threshold used to determine readability based on luminance difference is 40 (on 100), which seems to give pretty good results so far.&lt;/p&gt;
&lt;p&gt;Then it uses the &lt;a href=&quot;http://en.wikipedia.org/wiki/Color_difference#CIEDE2000&quot;&gt;CIE Delta E 2000&lt;/a&gt; formula to obtain the distance between colors. A distance of 6 is considered to be enough for the colors to be distinctive in our case, but that can be adjusted anyway. That depends on reader&apos;s eyes.&lt;/p&gt;
&lt;p&gt;If both the color and luminance distances are big enough, the color pair is considered readable when used upon each other.&lt;/p&gt;
&lt;p&gt;If these criteria are not satisfied, the code simply tries to correct the color by adjusting the &lt;em&gt;L&lt;/em&gt; (luminance) component of the colors so their difference is 40. Optionally, the background color can be fixed so only the foreground color would be adjusted; this is especially handy when the color background is not provided by any external style, but it the screen one (like the Emacs frame background in my case).&lt;/p&gt;
&lt;p&gt;Here is an example result generated over 10 pairs of random colors. Left colors are randomly generated, and right colors are the corrected one.&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;border-collapse: collapse; width: 100%; font-family: monospace; font-size: 0.85em;&quot;&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th style=&quot;text-align: left; padding: 6px 10px;&quot;&amp;gt;Original&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th style=&quot;text-align: left; padding: 6px 10px;&quot;&amp;gt;Corrected&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #698b69; color: #ababab;&quot;&amp;gt;DarkSeaGreen4 / gray67&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #4a6b4b; color: #cccccc;&quot;&amp;gt;#4a6b4b / #cccccc&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #6c7b8b; color: #228b22;&quot;&amp;gt;SlateGray4 / forest green&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #9faec0; color: #005700;&quot;&amp;gt;#9faec0 / #005700&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #212121; color: #5c5c5c;&quot;&amp;gt;grey13 / grey36&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #131313; color: #6c6c6c;&quot;&amp;gt;#131313 / #6c6c6c&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #9f79ee; color: #f0fff0;&quot;&amp;gt;MediumPurple2 / honeydew&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #9e78ed; color: #f0fff0;&quot;&amp;gt;#9e78ed / #f0fff0&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #6e6e6e; color: #66cd00;&quot;&amp;gt;grey43 / chartreuse3&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #5e5e5e; color: #79de25;&quot;&amp;gt;#5e5e5e / #79de25&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #faf0e6; color: #ee1289;&quot;&amp;gt;linen / DeepPink2&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #faf0e6; color: #ee1289;&quot;&amp;gt;linen / DeepPink2&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #53868b; color: #0000ff;&quot;&amp;gt;CadetBlue4 / blue1&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #6c9fa4; color: #0000e1;&quot;&amp;gt;#6c9fa4 / #0000e1&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #545454; color: #cdb38b;&quot;&amp;gt;gray33 / NavajoWhite3&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #525252; color: #cfb58c;&quot;&amp;gt;#525252 / #cfb58c&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #7fff00; color: #cd9b9b;&quot;&amp;gt;chartreuse1 / RosyBrown3&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #9cff38; color: #b28282;&quot;&amp;gt;#9cff38 / #b28282&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #c71585; color: #ff1493;&quot;&amp;gt;medium violet red / DeepPink1&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px;&quot;&amp;gt;→&amp;lt;/td&amp;gt;
&amp;lt;td style=&quot;padding: 6px 10px; background-color: #9c0060; color: #ff55b9;&quot;&amp;gt;#9c0060 / #ff55b9&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;All this has been written in Emacs Lisp. The code is now available in &lt;a href=&quot;http://www.gnus.org&quot;&gt;Gnus&lt;/a&gt; (and therefore in Emacs 24) in the packages &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/tree/lisp/color-lab.el&quot;&gt;color-lab&lt;/a&gt; and &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/tree/lisp/shr-color.el&quot;&gt;shr-color&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A future work would be to add support for colour blindness.&lt;/p&gt;
&lt;p&gt;As a side note, several people pointed me at the &lt;a href=&quot;http://www.w3.org/TR/WCAG10/&quot;&gt;WCAG&lt;/a&gt; formulas to determine luminance and contrast ratio. These are probably good criteria to choose your color when designing a user interface. However, they are not enough to determine if displayed color will be readable. This means you can use them if you are a designer, but IMHO they are pretty weak for detecting and correcting colors you did not choose.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Elisp color manipulation routines</title><link>https://julien.danjou.info/blog/elisp-color-manipulation-routines/</link><guid isPermaLink="true">https://julien.danjou.info/blog/elisp-color-manipulation-routines/</guid><description>Last week, I spent some time implementing various color manipulation routines. The ultimate goal was to find a way to determine if a text in a certain color was readable on a background with a differe</description><pubDate>Sat, 20 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, I spent some time implementing various color manipulation routines. The ultimate goal was to find a way to determine if a text in a certain color was readable on a background with a different color.&lt;/p&gt;
&lt;p&gt;Something I failed to do so far, despite my research in the area.&lt;/p&gt;
&lt;p&gt;However, since I think my code could be useful for other people, I&apos;ve set up a tiny &lt;a href=&quot;http://git.naquadah.org/?p=~jd/color-el.git;a=summary&quot;&gt;git repository&lt;/a&gt; with the routines I wrote.&lt;/p&gt;
&lt;p&gt;The funniest one to implement was &lt;a href=&quot;http://en.wikipedia.org/wiki/Color_difference#CIEDE2000&quot;&gt;CIEDE2000&lt;/a&gt;. I verified my code with the data given in &lt;a href=&quot;http://www.ece.rochester.edu/~gsharma/ciede2000/ciede2000noteCRNA.pdf&quot;&gt;the specifications&lt;/a&gt; and can assure it&apos;s correct. :-)&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Org-mode and holidays</title><link>https://julien.danjou.info/blog/org-mode-and-holidays/</link><guid isPermaLink="true">https://julien.danjou.info/blog/org-mode-and-holidays/</guid><description>Org-mode has a nice option which allows you to show week-end days in a different color in your agenda.</description><pubDate>Mon, 15 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://orgmode.org&quot;&gt;Org-mode&lt;/a&gt; has a nice option which allows you to show week-end days in a different color in your agenda. That means that Saturday and Sunday (when I do not work) are fontified with &lt;code&gt;org-agenda-date-weekend&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But there are other days I do not work, like my vacations or holidays.&lt;/p&gt;
&lt;p&gt;Therefore, I&apos;ve wrote a patch to add &lt;code&gt;org-agenda-day-face-function&lt;/code&gt; which is optionally called to determine what should be the face used to fontify a day. &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-orgmode/2010-11/msg00542.html&quot;&gt;This&lt;/a&gt; allows me to use the same face for holidays and for week-end days, like for last Thursday which was an holiday in France.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-org-mode-holidays-1.png&quot; alt=&quot;emacs-org-mode-holidays-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That patch has been merged in Org last week.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Google Maps for Emacs: moving, caching and home</title><link>https://julien.danjou.info/blog/google-maps-for-emacs-moving-caching-home/</link><guid isPermaLink="true">https://julien.danjou.info/blog/google-maps-for-emacs-moving-caching-home/</guid><description>Last week, I worked on my Google Maps for Emacs extension. I&apos;ve introduced a new format handling for locations which include the longitude and latitude.</description><pubDate>Mon, 08 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, I worked on my Google Maps for Emacs extension. I&apos;ve introduced a new format handling for locations which include the longitude and latitude. The initial format was just a string describing the location, which was obviously too limited.&lt;/p&gt;
&lt;p&gt;It now prints coordinates of the different elements when the mouse is over the map, with other information.&lt;/p&gt;
&lt;p&gt;It also center the map on &lt;em&gt;M-x google-maps&lt;/em&gt; and set a default zoom level. This is something which was not set because it&apos;s not a good idea to set center coordinates in order to see all points on the map automatically. But you can still remove the centering by pressing &lt;em&gt;&quot;C&quot;&lt;/em&gt;. On the other hand, setting it automatically allows to move the map easily, and I think that what most users want to do.&lt;/p&gt;
&lt;p&gt;I&apos;ve also added a &quot;place my home on the map&quot; feature, accessible by pressing &lt;code&gt;h&lt;/code&gt; on any map. That adds a marker according to the location set in Emacs using the &lt;code&gt;calendar-&lt;/code&gt; variables.&lt;/p&gt;
&lt;p&gt;This feature is also available under &lt;a href=&quot;http://orgmode.org&quot;&gt;Org&lt;/a&gt; by pressing &lt;em&gt;C-u C-c M-l&lt;/em&gt;, which shows the location of your appointment with your home on the map too.&lt;/p&gt;
&lt;p&gt;Finally, you also get caching so it does not request images you already seen, which makes the moving nicer and faster to use, and prompt history.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-google-maps-move-1.png&quot; alt=&quot;emacs-google-maps-move-1&quot; /&gt;&lt;/p&gt;
</content:encoded><category>emacs</category><category>google</category></item><item><title>Icon category support in Org-mode</title><link>https://julien.danjou.info/blog/icon-category-support-in-org-mode/</link><guid isPermaLink="true">https://julien.danjou.info/blog/icon-category-support-in-org-mode/</guid><description>My latest patch for Org mode has been accepted by Carsten today. It adds support for custom category icons in all views, like agenda or todo.</description><pubDate>Thu, 04 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My latest patch for &lt;a href=&quot;http://orgmode.org&quot;&gt;Org mode&lt;/a&gt; has been accepted by Carsten today. It adds support for custom category icons in all views, like agenda or todo.&lt;/p&gt;
&lt;p&gt;You just need to configure &lt;em&gt;org-agenda-category-icon-alist&lt;/em&gt; and it will work out of the box.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-org-category-icons-1.png&quot; alt=&quot;emacs-org-category-icons-1&quot; /&gt;&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Transparent GIF support in Emacs 24</title><link>https://julien.danjou.info/blog/transparent-gif-support-in-emacs24/</link><guid isPermaLink="true">https://julien.danjou.info/blog/transparent-gif-support-in-emacs24/</guid><description>Last week, I wrote a couple of patches to add support for transparency when Emacs is displaying GIF images.</description><pubDate>Tue, 02 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, I wrote a &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2010-10/msg01009.html&quot;&gt;couple of patches&lt;/a&gt; to add support for transparency when Emacs is displaying &lt;a href=&quot;http://en.wikipedia.org/wiki/Graphics_Interchange_Format&quot;&gt;GIF&lt;/a&gt; images.&lt;/p&gt;
&lt;p&gt;Until now, it was displaying the color used to define transparency in the file data. Now it displays the image correctly by using the frame color as the transparency color, like it&apos;s done for other image formats.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-gif-transparent-1.png&quot; alt=&quot;emacs-gif-transparent-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The patches have not been merged yet, but will probably be soon.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>No more dashes in Emacs 24 mode-line</title><link>https://julien.danjou.info/blog/no-more-dashes-in-emacs24-mode-line/</link><guid isPermaLink="true">https://julien.danjou.info/blog/no-more-dashes-in-emacs24-mode-line/</guid><description>We all know the good old Emacs mode-line you got under every window. Since the beginning (a long time ago), it starts and ends with dashes. I&apos;ve proposed a patch to remove them.</description><pubDate>Wed, 20 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We all know the good old Emacs mode-line you got under every window. Since the beginning (a long time ago), it starts and ends with dashes. I&apos;ve proposed &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2010-10/msg00675.html&quot;&gt;a patch&lt;/a&gt; to remove them.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-dashes.png&quot; alt=&quot;Screenshot of Emacs with dashes in the mode line&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-no-dashes-2.png&quot; alt=&quot;Screenshot of Emacs without dashes in the mode line&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This has been merged in Emacs 24. You won&apos;t see any more ugly dashes in graphical mode.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Enhancing Emacs mouse avoidance</title><link>https://julien.danjou.info/blog/enhancing-emacs-mouse-avoidance/</link><guid isPermaLink="true">https://julien.danjou.info/blog/enhancing-emacs-mouse-avoidance/</guid><description>Enhancing Emacs mouse-avoidance-mode to respect the invisible mouse pointer, merged in Emacs 24.</description><pubDate>Tue, 19 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recent &lt;em&gt;Emacs&lt;/em&gt; versions have a wonderful capacity to hide the mouse pointer as soon as you type and insert characters in a buffer. This is controlled by the &lt;code&gt;make-pointer-invisible&lt;/code&gt; variable, which is set to t by default.&lt;/p&gt;
&lt;p&gt;However that does not hide the pointer when simply moving the cursor on screen. Therefore, I&apos;ve started to use &lt;code&gt;mouse-avoidance-mode&lt;/code&gt;, which make the mouse pointer jump if your cursor hits it.&lt;/p&gt;
&lt;p&gt;Unfortunately, if your cursor hits the invisible mouse pointer, &lt;code&gt;mouse-avoidance-mode&lt;/code&gt; makes it jump too, because it does not know it is invisible.&lt;/p&gt;
&lt;p&gt;Well, it &lt;em&gt;did&lt;/em&gt; not know. Now it does, &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2010-10/msg00574.html&quot;&gt;thanks to my patches&lt;/a&gt; which have been merged in Emacs 24. Using the new function &lt;code&gt;frame-pointer-invisible-p&lt;/code&gt;, one can know if the mouse pointer has been hidden by Emacs. Therefore I enhanced `mouse-avoidance-mode&apos; to use it, and everything is alright now. :-)&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Gnus and Gravatar support</title><link>https://julien.danjou.info/blog/gnus-gravatar-support/</link><guid isPermaLink="true">https://julien.danjou.info/blog/gnus-gravatar-support/</guid><description>This last couple of days I&apos;ve been dedicated making Gnus… fresher.</description><pubDate>Sat, 25 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This last couple of days I&apos;ve been dedicated making &lt;a href=&quot;http://www.gnus.org&quot;&gt;Gnus&lt;/a&gt;… fresher.&lt;/p&gt;
&lt;p&gt;I&apos;ve decided to give a whirl on &lt;a href=&quot;http://www.gravatar.com&quot;&gt;Gravatar&lt;/a&gt; support. I already tried the &lt;code&gt;gravatar.el&lt;/code&gt; lying on the Interweb, but well, it was crap: it used &lt;code&gt;wget&lt;/code&gt; to fetch pictures, therefore was totally synchronous. Reading each mail was slower. The cache did not even have TTL, as far as I recall.&lt;/p&gt;
&lt;p&gt;So, I&apos;ve now wrote &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/tree/lisp/gravatar.el&quot;&gt;&lt;code&gt;gravatar.el&lt;/code&gt;&lt;/a&gt; implementing the Gravatar API. Asynchronously of course. With cache, TTL, etc. Perfect. :-)&lt;/p&gt;
&lt;p&gt;Then I&apos;ve composed &lt;a href=&quot;http://git.gnus.org/cgit/gnus.git/tree/lisp/gnus-gravatar.el&quot;&gt;&lt;code&gt;gnus-gravatar.el&lt;/code&gt;&lt;/a&gt;, implementing a washing function adding Gravatar for &lt;code&gt;From&lt;/code&gt; field and/or &lt;code&gt;Cc&lt;/code&gt;/&lt;code&gt;To&lt;/code&gt; fields, like done for &lt;a href=&quot;https://www.cs.indiana.edu/picons/&quot;&gt;picons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I was expecting, the patch was badly received by the GNU guys, which start talking about thinks like external resources, privacy, non-free software, etc. Boring.&lt;/p&gt;
&lt;p&gt;Fortunately, Lars allowed me to push the patch in git so everybody can give it a try. I&apos;m now waiting for feedbacks in order to know if I will have to maintain this patch outside Gnus, or not.&lt;/p&gt;
&lt;p&gt;Here&apos;s the mandatory screenshot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/gnus-gravatar-1.png&quot; alt=&quot;gnus-gravatar-1&quot; /&gt;&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Gnus news is good news!</title><link>https://julien.danjou.info/blog/gnus-news-is-good-news/</link><guid isPermaLink="true">https://julien.danjou.info/blog/gnus-news-is-good-news/</guid><description>As I already wrote too many times, I&apos;ve started to use Gnus 6 months ago, and never looked back.</description><pubDate>Thu, 23 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As I already wrote too many times, I&apos;ve started to use &lt;a href=&quot;http://gnus.org&quot;&gt;Gnus&lt;/a&gt; 6 months ago, and never looked back.&lt;/p&gt;
&lt;p&gt;At that time, I joined the &lt;a href=&quot;http://gnus.org/resources.html&quot;&gt;ding mailing list&lt;/a&gt; in order to ask some dumb questions and, once, send a patch. There were very low activity on that list.&lt;/p&gt;
&lt;p&gt;Until Lars, the original Gnus author, came back.&lt;/p&gt;
&lt;p&gt;Three weeks ago, he started to wrote a new wash function to render &lt;a href=&quot;http://en.wikipedia.org/wiki/HTML&quot;&gt;HTML&lt;/a&gt; mails properly, with pictures. It&apos;s named &lt;code&gt;gnus-html&lt;/code&gt;, and is (for now) based on &lt;a href=&quot;http://w3m.sourceforge.net&quot;&gt;w3m&lt;/a&gt; (but not on &lt;a href=&quot;http://emacs-w3m.namazu.org/&quot;&gt;emacs-w3m&lt;/a&gt;, which is not part of Emacs).&lt;/p&gt;
&lt;p&gt;Last week, I&apos;ve sent a set of patches to replace the usage of &lt;a href=&quot;http://curl.haxx.se&quot;&gt;curl&lt;/a&gt; by the standard &lt;code&gt;url-retrieve&lt;/code&gt; function to fetch images, plus various enhancement. It seems that my work was good enough that Lars offered me write access to the git repository. I can therefore mess up the Gnus entirely. Hurrah!&lt;/p&gt;
&lt;p&gt;I&apos;ve continued to work on &lt;code&gt;gnus-html&lt;/code&gt; and recently merged a set of patches improving image retrieval (which is now done in parallel) and starting to use &lt;code&gt;url-cache&lt;/code&gt; to cache image for a defined period of time. Of course, I found a bunch of tiny bug and special case while reading RSS feeds and various HTML mails, and fixed them all along.&lt;/p&gt;
&lt;p&gt;Lars added a &lt;a href=&quot;http://xmlsoft.org&quot;&gt;libxml&lt;/a&gt; binding for Emacs 24, providing the &lt;code&gt;html-parse-string&lt;/code&gt; function. His future plan seems to be the abandon of w3m in favor of a native parsing via libxml to render HTML, and therefore, HTML mails.&lt;/p&gt;
&lt;p&gt;I should also mention the new &lt;code&gt;nnimap&lt;/code&gt; back-end; Gnus has been designed to read &lt;a href=&quot;http://en.wikipedia.org/wiki/Network_News_Transfer_Protocol&quot;&gt;NNTP&lt;/a&gt; newsgroups, and not mails. Consequently, it had a very poor behaviour when used with a back-end such has &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol&quot;&gt;IMAP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lars took a week to rewrite entirely our dear &lt;code&gt;nnimap&lt;/code&gt; back-end, and make it act in a more expected way. There&apos;s still a bunch of bug and code to write, but it is at least usable and seems faster than the old code.&lt;/p&gt;
&lt;p&gt;Last thing I did was to rewrite the icon support in the group buffer. When I started to use Gnus, I was curious and tried to configure this. I never managed to make it work, and now know and understand why it was broken. So I ended rewriting entirely, and now it works. I never though I would understand, fix, and commit this code when reading the Gnus documentation this winter, but hell yeah, I did.&lt;/p&gt;
&lt;p&gt;Now I&apos;ve still several little project to improve things in all sort of area.&lt;br /&gt;
We&apos;ll see what I&apos;ll do next. :-)&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Emacs, Org, whatever the weather!</title><link>https://julien.danjou.info/blog/emacs-org-whatever/</link><guid isPermaLink="true">https://julien.danjou.info/blog/emacs-org-whatever/</guid><description>Another week, another Emacs extension!</description><pubDate>Wed, 08 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another week, another &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt; extension!&lt;/p&gt;
&lt;p&gt;I had (once again) a wonderful idea: what if I could have the weather forecasts in my &lt;a href=&quot;http://orgmode.org&quot;&gt;Org&lt;/a&gt; agenda? Wouldn&apos;t that be wonderful?&lt;/p&gt;
&lt;p&gt;My quest started by looking for a service offering a good weather forecast API. I found nothing simple as the hidden Google Weather API, which is nice, but… not documented. Not at all. Not a single line. Nah.&lt;/p&gt;
&lt;p&gt;Then, I wrote a &lt;strong&gt;google-weather&lt;/strong&gt; extension, implementing a basic Emacs Lisp API to retrieve data from the Google service:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ELISP&amp;gt; (google-weather-data-&amp;gt;forecast (google-weather-get-data &quot;Paris&quot;))
(((9 8 2010)
  (low &quot;53&quot;)
  (high &quot;63&quot;)
  (icon &quot;http://www.google.com/ig/images/weather/rain.gif&quot;)
  (condition &quot;Rain&quot;))
 ((9 9 2010)
  (low &quot;53&quot;)
  (high &quot;69&quot;)
  (icon &quot;http://www.google.com/ig/images/weather/chance_of_rain.gif&quot;)
  (condition &quot;Scattered Showers&quot;))
 ((9 10 2010)
  (low &quot;54&quot;)
  (high &quot;72&quot;)
  (icon &quot;http://www.google.com/ig/images/weather/partly_cloudy.gif&quot;)
  (condition &quot;Partly Cloudy&quot;))
 ((9 11 2010)
  (low &quot;55&quot;)
  (high &quot;75&quot;)
  (icon &quot;http://www.google.com/ig/images/weather/partly_cloudy.gif&quot;)
  (condition &quot;Partly Cloudy&quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My API even implements data caching, which is nice to speed up the agenda display.&lt;/p&gt;
&lt;p&gt;By the way, I think my next job will be to hack on the &lt;em&gt;url-cache&lt;/em&gt; feature of Emacs, which is utterly buggy and has probably never be used. But that&apos;s another topic.&lt;/p&gt;
&lt;p&gt;Finally, I just had to write another module on top of that to export the forecasts to Org. A screen shot is probably better than a long and boring explanation, so here&apos;s the result.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/org-google-weather-1.png&quot; alt=&quot;org-google-weather-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My only regret is that the icons provided by Google are ugly squares, so I did not want to use them. On the other hand, I did not found any icon set that would have all the icons Google provides (around 20). So I felt back on the &lt;a href=&quot;http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html&quot;&gt;icon naming specification&lt;/a&gt; to map the Google images to standard images. Any better idea would be welcome, of course.&lt;/p&gt;
&lt;p&gt;All the information can be found on the &lt;a href=&quot;https://github.com/jd/google-weather.el&quot;&gt;Google Weather for Emacs extension homepage&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>emacs</category><category>google</category></item><item><title>Emacs and OfflineIMAP</title><link>https://julien.danjou.info/blog/emacs-and-offlineimap/</link><guid isPermaLink="true">https://julien.danjou.info/blog/emacs-and-offlineimap/</guid><description>I recently decided to use OfflineIMAP to synchronize my mails on my laptop. It&apos;s a great piece of software, and allows me to read my mail while I&apos;m offline.</description><pubDate>Fri, 03 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently decided to use &lt;a href=&quot;http://wiki.github.com/jgoerzen/offlineimap/&quot;&gt;OfflineIMAP&lt;/a&gt; to synchronize my mails on my laptop. It&apos;s a great piece of software, and allows me to read my mail while I&apos;m offline.&lt;/p&gt;
&lt;p&gt;I use it with &lt;a href=&quot;http://www.gnus.org&quot;&gt;Gnus&lt;/a&gt;, of course. But I lacked a proper way to integrate OfflineIMAP with it, so I decided to write a little Emacs extension to run and monitor OfflineIMAP directly from Emacs.&lt;/p&gt;
&lt;p&gt;Here comes &lt;a href=&quot;https://github.com/jd/offlineimap.el&quot;&gt;offlineimap.el&lt;/a&gt;, an Emacs extension to run OfflineIMAP directly within Emacs. It will display OfflineIMAP output in a buffer, and optionally shows the current OfflineIMAP operation in the mode line.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/offlineimap-el-1.png&quot; alt=&quot;offlineimap-el-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By default the status is in the mode line only if you are in the Gnus group buffer. But that&apos;s customizable, of course, since this is Emacs!&lt;/p&gt;
&lt;p&gt;If you are using &lt;a href=&quot;http://github.com/dimitri/el-get&quot;&gt;el-get&lt;/a&gt;, there&apos;s already a recipe to install it!&lt;/p&gt;
</content:encoded><category>emacs</category><category>email</category></item><item><title>Emacs, Google Maps and BBDB</title><link>https://julien.danjou.info/blog/emacs-google-maps-bbdb/</link><guid isPermaLink="true">https://julien.danjou.info/blog/emacs-google-maps-bbdb/</guid><description>Today&apos;s fun idea was to put all my contacts stored into BBDB on a Google Maps&apos; map, using my Google Maps extension for Emacs.</description><pubDate>Wed, 18 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today&apos;s fun idea was to put all my contacts stored into &lt;a href=&quot;http://bbdb.sourceforge.net/&quot;&gt;BBDB&lt;/a&gt; on a Google Maps&apos; map, using my Google Maps extension for Emacs.&lt;/p&gt;
&lt;p&gt;With the help of a few lines of Lisp glue:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(google-maps-static-show
 :markers
 (mapcar
  (lambda (address-entry)
    `((,(concat
         (mapconcat
          &apos;identity
          (elt address-entry 1) &quot;, &quot;) &quot;, &quot;
          (elt address-entry 2) &quot;, &quot;
          (elt address-entry 3) &quot;, &quot;
          (elt address-entry 4) &quot;, &quot;
          (elt address-entry 5)))))
  (mapcan
   (lambda (record)
     ;; We need to copy the returned list, because mapcan will modify it later
     (copy-list (bbdb-record-addresses record)))
   (bbdb-records))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-google-maps-bbdb-1.png&quot; alt=&quot;Screenshot of Google Maps with BBDB contacts&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s really simplistic, but I did not need more to have fun. :-) This could be extended to set a specific marker and/or color for each contact, with a legend. I&apos;ll let that as an exercise for my readers.&lt;/p&gt;
</content:encoded><category>emacs</category><category>google</category></item><item><title>Update on rainbow-mode</title><link>https://julien.danjou.info/blog/update-on-rainbow-mode/</link><guid isPermaLink="true">https://julien.danjou.info/blog/update-on-rainbow-mode/</guid><description>rainbow-mode had a big success and good feedbacks when I released it for the first time a couple of months ago.</description><pubDate>Tue, 10 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;rainbow-mode had a big success and good feedbacks when I released it for the first time a couple of months ago.&lt;/p&gt;
&lt;p&gt;Several users asked to me request its inclusion into &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;. Therefore, some days ago, &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2010-07/msg01290.html&quot;&gt;I proposed to merge it inside Emacs trunk&lt;/a&gt;. My request has been denied, but the mode has been added to the &lt;a href=&quot;http://elpa.gnu.org&quot;&gt;Emacs 24 package repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the mean time, I&apos;ve added support for &lt;a href=&quot;http://www.w3.org/TR/css3-color/#hsl-color&quot;&gt;hsl() and hsla()&lt;/a&gt; support, and added&lt;br /&gt;
&lt;a href=&quot;http://www.w3.org/TR/css3-color/#svg-color&quot;&gt;CSS 3/SVG color names&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>M-x google-maps</title><link>https://julien.danjou.info/blog/google-maps-el/</link><guid isPermaLink="true">https://julien.danjou.info/blog/google-maps-el/</guid><description>Since I have started to use Org-mode, I though it was missing something to have appointment locations on a map.</description><pubDate>Mon, 28 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since I have started to use &lt;a href=&quot;http://www.orgmode.org&quot;&gt;Org-mode&lt;/a&gt;, I though it was missing something to have appointment locations on a map. Of course, it&apos;s easy to get a &lt;code&gt;LOCATION&lt;/code&gt; property from an entry, and then &lt;code&gt;browse-url&lt;/code&gt; on &lt;a href=&quot;http://maps.google.com&quot;&gt;Google Maps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/emacs-google-maps-1.png&quot; alt=&quot;emacs-google-maps-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;But it is &lt;strong&gt;too&lt;/strong&gt; easy for me, so once again I said: challenge accepted! I will bring Google Maps into Emacs!&lt;/p&gt;
&lt;p&gt;After several hours of work, the &lt;a href=&quot;https://github.com/jd/google-maps.el&quot;&gt;google-maps.el project&lt;/a&gt; shows a map!&lt;/p&gt;
&lt;p&gt;It fully implements the &lt;a href=&quot;http://code.google.com/apis/maps/documentation/staticmaps/&quot;&gt;Google Static Maps API&lt;/a&gt; and the &lt;a href=&quot;http://code.google.com/apis/maps/documentation/geocoding/&quot;&gt;Google Maps Geocoding API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can type &lt;code&gt;M-x google-maps&lt;/code&gt; and type some place to see it marked on map. Of course you can do much more, as seen in the screen shot above.&lt;/p&gt;
&lt;p&gt;I&apos;ve also completed all of this with a small &lt;code&gt;org-location-google-maps.el&lt;/code&gt; which simply show a Google Maps&apos; map for the location of an event in &lt;em&gt;Org mode&lt;/em&gt; by pressing &lt;code&gt;C-c M-l&lt;/code&gt; in an Org buffer or in the Org agenda.&lt;/p&gt;
</content:encoded><category>emacs</category><category>google</category></item><item><title>Announcing rainbow-mode</title><link>https://julien.danjou.info/blog/announcing-rainbow-mode/</link><guid isPermaLink="true">https://julien.danjou.info/blog/announcing-rainbow-mode/</guid><description>While customizing Emacs this last weeks, I had the need to customize also the color theme.</description><pubDate>Wed, 16 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;While customizing &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt; this last weeks, I had the need to customize also the color theme.&lt;/p&gt;
&lt;p&gt;Color themes are always a pain in the ass to edit, because you&apos;re supposed to read color strings like &lt;em&gt;#aabbcc&lt;/em&gt; and guess what colors they represent.&lt;/p&gt;
&lt;p&gt;This is why I wrote &lt;em&gt;rainbow-mode&lt;/em&gt;, a minor mode for Emacs that will highlight strings that represents color, using the color they represent.&lt;/p&gt;
&lt;p&gt;This support hexadecimal syntax, HTML color name, X color names and rgb() CSS syntax.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://julien.danjou.info/content/images/03/rainbow-mode-1.png&quot; alt=&quot;rainbow-mode-1&quot; /&gt;&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Desktop notification support for Emacs</title><link>https://julien.danjou.info/blog/desktop-notification-support-for-emacs/</link><guid isPermaLink="true">https://julien.danjou.info/blog/desktop-notification-support-for-emacs/</guid><description>This last weeks, I&apos;ve worked on implementing the Desktop Notification Specification into Emacs.</description><pubDate>Wed, 09 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This last weeks, I&apos;ve worked on implementing the &lt;a href=&quot;http://www.galago-project.org/specs/notification/&quot;&gt;Desktop Notification Specification&lt;/a&gt; into &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It allows sending desktop notification in a very simple way.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(notifications-notify
    :title &quot;You&apos;ve got mail!&quot;
    :body &quot;There&apos;s 34 mails unread&quot;
    :app-icon &quot;~/.emacs.d/icons/mail.png&quot;
    :urgency &apos;low)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It supports the protocol signals (&lt;code&gt;NotificationClosed&lt;/code&gt; and &lt;code&gt;ActionInvoked&lt;/code&gt;) and the two main methods (&lt;code&gt;Notify&lt;/code&gt; and &lt;code&gt;CloseNotification&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The methods specification are implemented entirely (hints, replaces, actions, icon, etc).&lt;/p&gt;
&lt;p&gt;The signals are supported via callbacks function provided on the notification creation.&lt;/p&gt;
&lt;p&gt;It have been merged into Emacs trunk today.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2010-06-09  Julien Danjou  &amp;lt;julien@danjou.info&amp;gt;

	* net/notifications.el: New file.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This also allowed me to discover, raise and fix a &lt;a href=&quot;http://lists.gnu.org/archive/html/emacs-devel/2010-06/msg00228.html&quot;&gt;bug&lt;/a&gt; in the D-Bus binding of Emacs, which will be probably fixed in trunk soon.&lt;/p&gt;
</content:encoded><category>emacs</category><category>x11</category></item><item><title>Announcing erc-track-score</title><link>https://julien.danjou.info/blog/announcing-erc-track-score/</link><guid isPermaLink="true">https://julien.danjou.info/blog/announcing-erc-track-score/</guid><description>A couple of months ago, I&apos;ve started using ERC to hang out on IRC.</description><pubDate>Mon, 07 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of months ago, I&apos;ve started using &lt;a href=&quot;http://www.emacswiki.org/emacs/ERC&quot;&gt;ERC&lt;/a&gt; to hang out on &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_Relay_Chat&quot;&gt;IRC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&apos;ve read all the pages on &lt;a href=&quot;http://www.emacswiki.org/&quot;&gt;EmacsWiki&lt;/a&gt; about it, just to see how far I could customize it.&lt;/p&gt;
&lt;p&gt;I must admit that I was not disappointed, even if I expected to be. It&apos;s quite a nice software, and once well configured it&apos;s more convenient that my old &lt;a href=&quot;http://www.irssi.org&quot;&gt;irssi&lt;/a&gt; setup.&lt;/p&gt;
&lt;p&gt;While browsing EmacsWiki, I read an interesting idea about channel scoring/temperature on the &lt;a href=&quot;http://www.emacswiki.org/emacs/ErcChannelTracking#toc9&quot;&gt;erc-track&lt;/a&gt; page. The idea is to see if it&apos;s worth jumping to an IRC channel to see what people are talking about.&lt;/p&gt;
&lt;p&gt;Challenge accepted!&lt;/p&gt;
&lt;p&gt;I sat up and started to dig though ERC source code to find the information I needed about variables and functions.&lt;/p&gt;
&lt;p&gt;I finally did write something nice, which I called erc-track-score. And yet another piece of software I wrote for my lovely &lt;a href=&quot;http://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;How does it work? Ha-ha, I was sure you would ask. You&apos;re so predictable, dude! Read the following, and you&apos;ll know everything you ever wanted to know about it since the moment you read the title of that blog entry.&lt;/p&gt;
&lt;p&gt;Which probably turned you on.&lt;/p&gt;
&lt;p&gt;Nasty you.&lt;/p&gt;
&lt;p&gt;First of all, the score of a channel starts at zero. Zero means &quot;seriously, don&apos;t bother, nothing is happening here&quot;.&lt;/p&gt;
&lt;p&gt;Upon each new message arrival, the score is incremented by 1. If a new message contains a keyword, your nickname or is sent by a pal, the score is increased by configurable values, by default between 2 and 20 points, depending on the match type. On the other hand, when a message is send by some fool, the score is decreased by 1 by default.&lt;/p&gt;
&lt;p&gt;Obviously, if the score is going negative, you really should not jump to the channel.&lt;/p&gt;
&lt;p&gt;Finally, the score is permanently and slowly brought back to 0. By default, the score is decreased by 1 point every 10 seconds.&lt;/p&gt;
&lt;p&gt;Overall, reading the score should gives you a good idea of the channel temperature.&lt;/p&gt;
&lt;p&gt;I&apos;m still not sure what is the best formula to compute the score, but so far the default values seem quite good. We&apos;ll see.&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Announcing muse-blog</title><link>https://julien.danjou.info/blog/announcing-muse-blog/</link><guid isPermaLink="true">https://julien.danjou.info/blog/announcing-muse-blog/</guid><description>Digging into the fabulous world of Emacs and Lisp, I wanted to use it to build my personal Web site and my blog.</description><pubDate>Wed, 19 May 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Digging into the fabulous world of Emacs and Lisp, I wanted to use it to build my personal Web site and my blog.&lt;/p&gt;
&lt;p&gt;I already moved from &lt;a href=&quot;http://ikiwiki.info/&quot;&gt;ikiwiki&lt;/a&gt; to &lt;a href=&quot;http://mwolson.org/projects/EmacsMuse.html&quot;&gt;Emacs Muse&lt;/a&gt; for my HTML pages some weeks ago.&lt;/p&gt;
&lt;p&gt;Muse provides an extension to maintain a journal, called &lt;em&gt;muse-journal&lt;/em&gt;. Unfortunately, it was far to fulfill all my needs, and I decided that it would be a good exercise to write a better extension.&lt;/p&gt;
&lt;p&gt;Consequently, I started to wrote my own extension, which I named muse-blog.&lt;/p&gt;
&lt;p&gt;And this is now what is used to build this blog. :-)&lt;/p&gt;
</content:encoded><category>emacs</category></item><item><title>Entering the Emacs world</title><link>https://julien.danjou.info/blog/entering-the-emacs-world/</link><guid isPermaLink="true">https://julien.danjou.info/blog/entering-the-emacs-world/</guid><description>In February 2009, my friend dim tried to force me using Emacs. I know a couple of people using it and Gnus for reading their mail, and it always made me curious.</description><pubDate>Mon, 17 May 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In February 2009, my friend &lt;a href=&quot;http://tapoueh.org&quot;&gt;dim&lt;/a&gt; tried to force me using Emacs. I know a couple of people using it and &lt;a href=&quot;http://www.gnus.org&quot;&gt;Gnus&lt;/a&gt; for reading their mail, and it always made me curious.&lt;/p&gt;
&lt;p&gt;At that time, more than a year ago, Emacs 22 and Gnus did not seem usable from my point of view.&lt;/p&gt;
&lt;p&gt;But around mid February, with the help of dim, I tried again to start using Emacs.&lt;/p&gt;
&lt;p&gt;Actually, this was not something new for me. I (very basically) used Emacs between 2000 and 2006. In 2006, when I finished the university and started working at &lt;a href=&quot;http://www.easter-eggs.com&quot;&gt;Easter-eggs&lt;/a&gt;, I met a couple of &lt;a href=&quot;http://www.vim.org&quot;&gt;vim&lt;/a&gt; enthusiasts. They taught me how to use it in various ways, and I started to know more about vim than Emacs, so I switched.&lt;/p&gt;
&lt;p&gt;This time, I started by configuring it, but reading the manual and also learning a bit of Lisp. It took me several weeks, but step by step I learned many, many things. And I must admit, I liked it.&lt;/p&gt;
&lt;p&gt;I&apos;ve configured and starting to use some very important mode, like Gnus, &lt;a href=&quot;http://orgmode.org&quot;&gt;Org mode&lt;/a&gt;, &lt;a href=&quot;http://mwolson.org/projects/EmacsMuse.html&quot;&gt;Muse&lt;/a&gt;, or even ERC.&lt;/p&gt;
&lt;p&gt;I&apos;ll probably talk about various Emacs related things in the near future, since I already wrote more than a thousand lines of Lisp in the last 2 months.&lt;/p&gt;
&lt;p&gt;Anyhow, I&apos;d just conclude by asserting that my new Emacs/Gnus/Org/ERC setup beats my old vim/mutt/nothing/irssi to the death with a baseball bat. :-)&lt;/p&gt;
</content:encoded><category>emacs</category></item></channel></rss>