Browse Source

Update specivic vim config git

Phyks (Lucas Verney) 4 years ago
parent
commit
47c0f47d21

+ 5
- 4
blog/2014/07/index.html View File

@@ -16,19 +16,19 @@
16 16
 
17 17
                     <h2>Catégories</h2>
18 18
                         <nav id="sidebar-tags">
19
-                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (3)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (7)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (7)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (5)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (7)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (6)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (2)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (64)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (68)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (8)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (16)</a> </div>
20 20
                         </nav>
21 21
 
22 22
                     <h2>Derniers articles</h2>
23 23
                         <ul id="sidebar-articles">
24
-                            <li><a href="//phyks.me/2014/10/dhcp_server.html">Utiliser son PC sous Arch pour connecter un Raspberry Pi à Internet</a></li><li><a href="//phyks.me/2014/08/sortez_vos_emails.html">Sortez vos emails, c'est pas sale&nbsp;!</a></li><li><a href="//phyks.me/2014/08/synchronisation_backups_1.html">Synchroniser ses ordinateurs 1/2</a></li><li><a href="//phyks.me/2014/08/free_mobile_fluctuant.html">Les énigmes du réseau Free Mobile</a></li><li><a href="//phyks.me/2014/07/notification_sms_free.html">Recevoir ses emails par SMS avec Free Mobile</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2015/01/known.html">Thoughts on blogging engine</a></li><li><a href="//phyks.me/2015/01/vcsh.html">Versionner ses fichiers de configuration avec vcsh</a></li><li><a href="//phyks.me/2015/01/bmc.html">Gestion d'articles scientifiques avec BMC</a></li><li><a href="//phyks.me/2014/11/ipv6_kimsufi.html">Getting ipv6 to work with a Kimsufi server</a></li><li><a href="//phyks.me/2014/11/bloomysearch.html">Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
28 28
                         <ul id="sidebar-links">
29 29
                             <li><a href="//phyks.me/contact.html" title="Contact">Me contacter</a></li>
30 30
                             <li class="monospace"><a href="//links.phyks.me" title="Mon Shaarli">find ~phyks -type l</a></li>
31
-                            <li><a href="https://github.com/phyks/" title="Github">Mon Github</a></li>
31
+                            <li><a href="https://github.com/phyks/" rel="me" title="Github">Mon Github</a></li>
32 32
                             <li><a href="//phyks.me/divers.html" title="Divers">Divers</a></li>
33 33
                         </ul>
34 34
                 </aside>
@@ -407,10 +407,11 @@ Un important et un petit ajout à votre projet.</p>
407 407
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
408 408
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
409 409
 if !empty(glob(git_vimrc))
410
-    exec ":source " . git_vimrc
410
+    sandbox exec ":source " . git_vimrc
411 411
 endif
412 412
 </pre>
413 413
 </code>
414
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
414 415
 
415 416
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
416 417
 

+ 5
- 4
blog/2014/07/specific_vim_config_git.html View File

@@ -16,19 +16,19 @@
16 16
 
17 17
                     <h2>Catégories</h2>
18 18
                         <nav id="sidebar-tags">
19
-                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (3)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (7)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (7)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (5)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (7)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (6)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (2)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (64)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (68)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (8)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (16)</a> </div>
20 20
                         </nav>
21 21
 
22 22
                     <h2>Derniers articles</h2>
23 23
                         <ul id="sidebar-articles">
24
-                            <li><a href="//phyks.me/2014/10/dhcp_server.html">Utiliser son PC sous Arch pour connecter un Raspberry Pi à Internet</a></li><li><a href="//phyks.me/2014/08/sortez_vos_emails.html">Sortez vos emails, c'est pas sale&nbsp;!</a></li><li><a href="//phyks.me/2014/08/synchronisation_backups_1.html">Synchroniser ses ordinateurs 1/2</a></li><li><a href="//phyks.me/2014/08/free_mobile_fluctuant.html">Les énigmes du réseau Free Mobile</a></li><li><a href="//phyks.me/2014/07/notification_sms_free.html">Recevoir ses emails par SMS avec Free Mobile</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2015/01/known.html">Thoughts on blogging engine</a></li><li><a href="//phyks.me/2015/01/vcsh.html">Versionner ses fichiers de configuration avec vcsh</a></li><li><a href="//phyks.me/2015/01/bmc.html">Gestion d'articles scientifiques avec BMC</a></li><li><a href="//phyks.me/2014/11/ipv6_kimsufi.html">Getting ipv6 to work with a Kimsufi server</a></li><li><a href="//phyks.me/2014/11/bloomysearch.html">Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
28 28
                         <ul id="sidebar-links">
29 29
                             <li><a href="//phyks.me/contact.html" title="Contact">Me contacter</a></li>
30 30
                             <li class="monospace"><a href="//links.phyks.me" title="Mon Shaarli">find ~phyks -type l</a></li>
31
-                            <li><a href="https://github.com/phyks/" title="Github">Mon Github</a></li>
31
+                            <li><a href="https://github.com/phyks/" rel="me" title="Github">Mon Github</a></li>
32 32
                             <li><a href="//phyks.me/divers.html" title="Divers">Divers</a></li>
33 33
                         </ul>
34 34
                 </aside>
@@ -68,10 +68,11 @@
68 68
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
69 69
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
70 70
 if !empty(glob(git_vimrc))
71
-    exec ":source " . git_vimrc
71
+    sandbox exec ":source " . git_vimrc
72 72
 endif
73 73
 </pre>
74 74
 </code>
75
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
75 76
 
76 77
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
77 78
 

+ 656
- 63
blog/2014/index.html View File

@@ -16,12 +16,12 @@
16 16
 
17 17
                     <h2>Catégories</h2>
18 18
                         <nav id="sidebar-tags">
19
-                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (64)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (66)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (8)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (16)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (24)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (64)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (68)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (16)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (8)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (56)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (16)</a> </div>
20 20
                         </nav>
21 21
 
22 22
                     <h2>Derniers articles</h2>
23 23
                         <ul id="sidebar-articles">
24
-                            <li><a href="//phyks.me/2015/01/bmc.html">Gestion d'articles scientifiques avec BMC</a></li><li><a href="//phyks.me/2014/11/ipv6_kimsufi.html">Getting ipv6 to work with a Kimsufi server</a></li><li><a href="//phyks.me/2014/11/bloomysearch.html">Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</a></li><li><a href="//phyks.me/2014/10/pulseaudio_remote.html">Balancer le son de ses hauts-parleurs sur le réseau</a></li><li><a href="//phyks.me/2014/10/dhcp_server.html">Utiliser son PC sous Arch pour connecter un Raspberry Pi à Internet</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2015/01/known.html">Thoughts on blogging engine</a></li><li><a href="//phyks.me/2015/01/vcsh.html">Versionner ses fichiers de configuration avec vcsh</a></li><li><a href="//phyks.me/2015/01/bmc.html">Gestion d'articles scientifiques avec BMC</a></li><li><a href="//phyks.me/2014/11/ipv6_kimsufi.html">Getting ipv6 to work with a Kimsufi server</a></li><li><a href="//phyks.me/2014/11/bloomysearch.html">Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
@@ -45,86 +45,679 @@
45 45
                 <div id="articles">
46 46
 <article>
47 47
 	<aside>
48
-		<p class="day">09</p>
49
-		<p class="month">Novembre</p>
48
+		<p class="day">30</p>
49
+		<p class="month">Juillet</p>
50 50
 	</aside>
51 51
 	<div class="article">
52
-		<header><h1 class="article_title"><a href="//phyks.me/2014/11/ipv6_kimsufi.html">Getting ipv6 to work with a Kimsufi server</a></h1></header>
52
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/notification_sms_free.html">Recevoir ses emails par SMS avec Free Mobile</a></h1></header>
53 53
 		<!-- 
54 54
     @author=Phyks
55
-    @date=09112014-1945
56
-    @title=Getting ipv6 to work with a Kimsufi server
57
-    @tags=Phyks
55
+    @date=30072014-1500
56
+    @title=Recevoir ses emails par SMS avec Free Mobile
57
+    @tags=Dev, Phyks
58 58
 -->
59 59
 
60
-<p>Starting from yesterday, my server (<a href="http://phyks.me">phyks.me</a>) should be available using ipv6. This was not the case before due to laziness and a lack of configuration. However, as setting ipv6 on a Kimsufi seems to not be really straight-forward (out of date documentation, information disseminated over the web and difficult to find between basic mistakes and real errors…), I think it may be useful to keep some notes here. Hope it can help anyone.</p>
61
-<p>The <a href="http://help.ovh.co.uk/Ipv4Ipv6">doc</a> explains that OVH has not set ipv6 autoconfig on their servers, and that you should configure the default route and IP address yourself.</p>
62
-<p>To find your ip address, it is pretty easy: just go to your manager and look for the ipv6 address in the IP section.</p>
63
-<p><code>ip -6 addr add YOUR_IPV6_ADDRESS/64 dev eth0</code></p>
64
-<p>This will add the ipv6 address to your network device. Then, you have to manually add the default gateway. To get its address, you should remove the last two digits of your ipv6 address and put <code>FF:FF:FF:FF:FF</code> instead. This means that <code>2001:41d0:1:4462::1/64</code> will give you a default gateway <code>2001:41d0:1:44FF:FF:FF:FF:FF</code>.</p>
65
-<p>Then, you should add a default route <em>via</em> this gateway</p>
66
-<p><code>ip -6 r a default via 2001:41d0:1:44FF:FF:FF:FF:FF</code></p>
67
-<p>This is the standard procedure explained in OVH guide and many posts around the web such as <a href="https://www.skyminds.net/serveur-dedie-mise-en-place-de-lipv6/">this one</a> (in French). It may work in some cases, however, in my case, I could not reach the default gateway and then, I could not add this route.</p>
68
-<p>I found <a href="http://forum.ovh.co.uk/showthread.php?6435-Getting-IPv6-working-on-kimsufi&amp;p=44965&amp;viewfull=1#post44965">a comment</a> on the OVH forum giving a solution.</p>
69
-<p>You should first add a route to reach the gateway</p>
70
-<p><code>ip -6 r a 2001:41d0:1:44FF:FF:FF:FF:FF dev eth0</code></p>
71
-<p>and then, you can add the default route <em>via</em> this gateway</p>
72
-<p><code>ip -6 r a default via 2001:41d0:1:44FF:FF:FF:FF:FF</code></p>
73
-		<footer><p class="date">Le 09/11/2014 à 19:45</p>
74
-		<p class="tags">Tags : <a href="//phyks.me/tags/Phyks.html">Phyks</a></p></footer>
60
+<p><em>Edit</em>&nbsp;: Cela fait bientôt une semaine que l'API Free me renvoie un 402, en boucle… je ne peux plus envoyer de SMS depuis l'API. Je ne sais pas combien de temps ça va durer, à suivre… mais du coup c'était pas forcément une super idée… soyez prévenus&nbsp;!&nbsp;:)</p>
61
+<p>Si vous êtes client Free Mobile (forfait à 2€ ou à 19€), sachez que Free met à disposition gratuitement une <a href="http://www.freenews.fr/spip.php?article14817">API d'envoi de SMS</a>. <em>Via</em> un appel HTTP, vous pourrez désormais vous envoyer des notifications par SMS (uniquement à destination de votre numéro donc), ce qui fait le plus grand bonheur des utilisateurs de solutions domotiques.</p>
62
+<p>Dans cet article, je vais l'utiliser dans un but différent&nbsp;: recevoir mes emails par SMS. Je pars d'ici peu pour une semaine à l'étranger (pas de connexion internet…) et ai besoin de relever mes emails régulièrement. Grâce à ce service, je vais pouvoir les recevoir par SMS.</p>
63
+<p><em>Note</em>&nbsp;: Recevoir ses emails par SMS peut poser des problèmes de vie privée, votre opérateur voyant passer tous vos SMS notamment. Ça peut être d'autant plus gênant si vous recevez des rappels de mot de passe par email, qui vous seront transmis par SMS.</p>
64
+<p>Je me suis grandement inspiré de <a href="http://louis.jachiet.com/blog/?p=228">cet article</a> mais ai réécrit le script. Le script ci-dessous est donc en Python (que je maîtrise mieux que Perl), gère plusieurs serveurs et se connecte en IMAP à vos boîtes, pour pouvoir récupérer des emails chez Gmail and cie, pour lesquels on ne peut pas mettre de règles <code>procmail</code>. Dans mon script, les identifiants&nbsp;/ mots de passe sont en clair pour pouvoir l'éxecuter <em>via</em> une <code>crontask</code>. Si vous ne contrôlez pas le serveur sur lequel vous faites tourner ce script ou ne réglez pas correctement les permissions, attention à vos mots de passe&nbsp;!</p>
65
+<p>Première étape, il faut aller activer l'option sur votre compte. Sur le site de Free, Gérer mon compte → Mes Options → Notifications par SMS → Activer. Vous pourrez alors récupérer votre clé d'API.</p>
66
+<p>Deuxième étape, récupérer <a href="https://github.com/Phyks/Emails_SMS_Free_Mobile_API">ce script</a> qui va vous permettre de vous connecter à vos boîtes IMAP.</p>
67
+<p>Troisième étape, éditer le script pour correspondre à vos besoins. Tous les paramètres à modifier sont entre des commentaires <code># EDIT BELOW ACCORDING TO YOUR NEEDS</code> et <code># YOU SHOULD NOT HAVE TO EDIT BELOW</code>. Il vous faudra ajouter vos serveurs IMAP (serveur, login et mot de passe, et boîte à utiliser (par-défaut, INBOX)). Vous pouvez ajouter autant de serveurs que vous voulez en dupliquant les dictionnaires au sein de la liste <code>imap_servers</code>. Il vous faudra également éditer votre login pour l'API (<code>IDENT</code>, identifiant de connexion au compte) et la clé d'API à utiliser (<code>PASS</code>).</p>
68
+<p><em>Note</em>: L'URL ne devrait pas avoir besoin d'être modifiée, et <code>save_path</code> est le fichier JSON utilisé pour stocker les identifiants des emails relevés (et uniquement les identifiants), pour ne pas renvoyer la même notification plusieurs fois.</p>
69
+<p>Finalement, il ne reste plus qu'à mettre ce script sur un de vos serveurs (ou une machine allumée suffisamment souvent), et à le lancer <em>via</em> une <code>crontask</code>, par exemple <code>*/15 * * * * python3 ./mails_sms_free.py &gt; .mails_sms_free.log</code> pour relever vos emails toutes les 15 minutes.</p>
70
+<p><em>Note</em>&nbsp;: J'utilise ce script depuis une journée sans problèmes, mais il est sûrement imparfait. N'hésitez pas à <a href="https://phyks.me/contact.html">me signaler</a> (ou <em>via</em> les <em>issues</em> Github) d'éventuels problèmes rencontrés. </p>
71
+		<footer><p class="date">Le 30/07/2014 à 15:00</p>
72
+		<p class="tags">Tags : <a href="//phyks.me/tags/Dev.html">Dev</a>, <a href="//phyks.me/tags/Phyks.html">Phyks</a></p></footer>
75 73
 	</div>
76 74
 </article>
77 75
 <article>
78 76
 	<aside>
79
-		<p class="day">08</p>
80
-		<p class="month">Novembre</p>
77
+		<p class="day">29</p>
78
+		<p class="month">Juillet</p>
81 79
 	</aside>
82 80
 	<div class="article">
83
-		<header><h1 class="article_title"><a href="//phyks.me/2014/11/bloomysearch.html">Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</a></h1></header>
84
-		<!-- 
85
-    @author=Phyks
86
-    @date=08112014-1845
87
-    @title=Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites
88
-    @tags=Dev, Web
81
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/diaspora_pas_pour_tout_monde.html">Diaspora*, c'est quand même pas pour tout le monde</a></h1></header>
82
+		<!--
83
+	@author=Phyks
84
+	@date=29072014-2251
85
+	@title=Diaspora*, c'est quand même pas pour tout le monde
86
+	@tags=Libre
89 87
 -->
88
+<p>Ça faisait quelques mois que je disais que j'allais m'héberger une instance de <a href="ihttps://diasporafoundation.org/">Diaspora*</a> (un <em>pod</em> comme ça s'appelle). Finalement, sous la pression de <a href="http://tomcanac.com/">tmos</a> j'ai cédé et j'ai fini par m'occuper de ça ce weekend. Du coup, il est temps de faire un petit retour sur l'installation.</p>
90 89
 
91
-<h2>Overview</h2>
92
-<p>Many websites and blogs are statically generated and the webserver only serves static files. It is the case of many doc websites and more and more blogs, starting from this one, as <a href="http://jekyllrb.com/">Jekyll</a>&nbsp;/ <a href="http://blog.getpelican.com/">Pelican</a> develops.</p>
93
-<p>This is really useful to reduce the complexity of the website and the load on the webserver. All the complex logic is done at the generation.</p>
94
-<p>However, this also means you do not have dynamic pages on your website to handle search queries. Then, you are left with two (or three) choices&nbsp;:</p>
95
-<ol>
96
-<li>Use an external search engine, such as an embedded Google search box. This raises some privacy concerns and make you depends on an external service. </li>
97
-<li>(Use a JS search engine such as the <a href="http://www.airpair.com/angularjs#/10-filters-core-">filters</a> provided by Angular.JS. This only works on the displayed content, and is not a real solution). </li>
98
-<li>Stop worrying about search engine on your website and let the users <code>wget</code>-ing and <code>grep</code>-ing your website on their computers. This is not the most user-friendly solution…</li>
99
-</ol>
100
-<p>There are a couple of solutions around, mostly based on <a href="http://lunrjs.com/">Lunr.js</a> which generates an index from the articles available, and use this index for fulltext search. This is the best solution I found so far but it is still not perfect. Although there is a stemmer and an index generation to reduce the amount of data to be transferred, the data is not stored in a very efficient way, and the full index is sent as JSON. An example implementation for Jekyll is available through <a href="https://github.com/slashdotdash/jekyll-lunr-js-search">the jekyll-lunr-js-search plugin</a>.</p>
101
-<p>I had the idea of a client side search engine in mind for a while, but was facing the same problem as Lunr.js: how not to send a full (very large) index over the network to every single client&nbsp;? Not having an optimized data structure would basically mean sending twice the content of the website to the client. It may not be a practical problem nowadays, as transfer speed is not always the limiting resource, but it is still not to be considered as a good practice, in my opinion, especially if your website might be accessed from mobile devices.</p>
102
-<p>I came accross <a href="http://www.stavros.io/posts/bloom-filter-search-engine/?print">this article</a> from Stavros Korokithakis and thought something similar could be achieved directly in the browser. Instead of using a standard dictionary to store the index, this article proposes to use a Bloom filter per article. Bloom filters are very interesting probabilistic structures which can store whether an element is or not in a set, with a fixed number of bits. It can return false positives: if an element is in the set, it always returns <code>True</code>, but if an element is not in the set, it may say it is actually in, with a small probability. <a href="https://en.wikipedia.org/wiki/Bloom_filter">Wikipedia page</a> on the subject has all the necessary stuff to understand these data structures.</p>
103
-<p>I wrote it in the context of my blog, which means a Python script to generate the index at pages generation, and a client side search engine in JavaScript, running in browser.</p>
104
-<p>A demo is available <a href="https://phyks.github.io/BloomySearch/">here</a>. It contains all the articles of my blog, as of writing this article, totalizing 160k characters, and only 7kB of index, allowing 10% of false positives, which may be a bit too much for a really reliable search engine. Reducing the error rate will lead to an increase in the index size (11kB for 1% of false positives and the same amount of characters).</p>
105
-<h2>Details of the implementation</h2>
106
-<p>As JavaScript is not the easier language to use for hashing and binary data manipulation, I started by implementing the client side search engine. Then, it would be easier to adapt the Python code to the JS lib than doing the contrary. Actually, I found <a href="https://github.com/jasondavies/bloomfilter.js">this bloomfilters.js library</a> from Jason Davies which was doing most of the job and did not need many modifications. I edited it a bit to support a construction with a <code>capacity</code> and an <code>error_rate</code>, instead of an explicit number of bits and times to apply the hashing function. This forked version is available <a href="https://github.com/Phyks/bloomfilter.js/blob/master/bloomfilter.js">here</a>.</p>
107
-<p>Then, I reimplemented this library in Python, to generate readable Bloom filters for the JavaScript script.</p>
108
-<h3>Server side</h3>
109
-<p>The generation script takes every articles in a given directory and for each of them:</p>
90
+<p><em>Note&nbsp;:</em> Je ne m'attarderai pas sur l'historique et le but du projet (TLDR; un réseau social décentralisé et opensource), <a href="http://blog-libre.org/tag/diaspora">d'autres</a> l'ont déjà fait, ni sur l'utilisation, car je débarque et n'ai pas encore appréhendé la bête. C'est donc juste un retour sur l'installation, l'accessibilité de Diaspora* au plus grand nombre, et les premiers pas. De plus, je n'ai pas de commentaires sur ce blog statique, donc n'hésitez pas à <a href="http://phyks.me/contact.html">me contacter</a> pour en discuter.</p>
91
+
92
+<p>Il y a peu, <a href="http://maniatux.fr/index.php?article473/diaspora-c-est-pas-pour-moi">Maniatux</a> écrivait «&nbsp;Diaspora, c'est pas pour moi&nbsp;». J'y suis, j'ai réussi à l'installer, mais je serai bien tenté de dire «&nbsp;Diaspora*, c'est pas pour tout le monde&nbsp;» voire même «&nbsp;Diaspora*, si tu n'es pas geek barbu libriste, mieux vaut passer ton chemin&nbsp;» (pour l'instant, j'espère). Retour sur les principaux points.</p>
93
+
94
+<h2>S'auto-héberger</h2>
95
+
96
+<p>Forcément, on parle de réseau social décentralisé, libre et on soulève plusieurs problématiques de vie privée avec les grands réseaux sociaux actuels (Twitter, Facebook, …). Donc si on passe sur Diaspora*, ce n'est pas a priori pour aller sur un pod pré-existant, et retomber dans un silo.</p>
97
+
98
+<p>Attention, je ne dis pas que c'est le mal absolu que d'aller sur un pod hébergé par quelqu'un d'autre, loin de là. On a une certaine qualité de service garantie et les principaux pods français (<a href="http://diaspora-fr.org/">diaspora-fr.org</a>, <a href="https://framasphere.org">FramaSphère</a>, …) sont aux mains d'association auxquelles je fais infiniment plus confiance qu'aux gros du web. Mais tant qu'à être présent sur ce réseau, et si on en a la possibilité, autant s'héberger soi-même. Comme j'héberge déjà mon compte Jabber et plusieurs autres services que j'utilise, autant essayer de continuer dans la décentralisation et héberger son propre <em>pod</em>.</p>
99
+
100
+<p>La majeure partie des commentaires dans la suite sera donc liée à cet auto-hébergement. Si vous êtes sur un pod hébergé par quelqu'un d'autre, vous ne les rencontrerez sûrement jamais mais ils sont à mon avis très importants pour un projet qui promeut la décentralisation.</p>
101
+
102
+
103
+<h2>Ruby, mon ami…</h2>
104
+
105
+<p>Diaspora a fait le choix d'utiliser Ruby, et non PHP qui est un langage très standard, déjà largement utilisé par <a href="http://wordpress.org">Wordpress</a> et tous les autres grands CMS. La plupart des utilisateurs a l'habitude de ces scripts et sait les installer facilement&nbsp;: une base de données créée avec PHPMyAdmin, un copier/coller avec un FTP ou SCP et éventuellement un petit <em>vhost</em> et ça marche. Faire le choix d'un langage «&nbsp;exotique&nbsp;», c'est se priver d'office d'un nombre conséquent d'utilisateurs, qui ne pourront pas l'installer facilement (ne serait-ce que parce qu'ils n'ont qu'un hébergement web et pas un serveur dédié).</p>
106
+
107
+<p>Ce choix est très certainement techniquement justifié (PHP est décrié par beaucoup), mais le fait est que Ruby, c'est compliqué à utiliser pour un utilisateur moyen. Il faut installer la bonne version, les bonnes <em>gems</em>, avoir les bons droits etc. Heureusement, Diaspora* utilise RVM qui simplifie grandement l'installation… quand ça fonctionne (j'y reviens un peu plus bas). Enfin, RVM simplifie l'installation, mais la rend d'autant plus obscure&nbsp;: on enchaîne les commandes listées sur le wiki, sans vraiment savoir ce qu'elles font et on passe un temps important à les décrypter pour comprendre ce qu'il va se passer. Dans tous les cas, Node.JS et Python sont déjà largement utilisés (avec des problèmes similaires cependant), les utiliser aurait déjà pu faciliter l'accès et augmenter la documentation disponible.</p>
108
+
109
+<p><em>Note&nbsp;:</em> Diaspora* utilise aussi Node.JS, mais «&nbsp;caché&nbsp;» derrière du Ruby. On est donc surtout confronté aux problèmes avec Ruby.</p>
110
+
111
+<p>Enfin, toutes ces technologies (Node.JS / Python / Ruby / …) ne s'interfacent pas directement avec Apache. Là où pour servir un script PHP, il faut tout au plus un <em>vhost</em>, il faut ici charger tout un tas de modules spécifiques pour Apache et servir <em>via</em> <em>mod_proxy</em> l'instance de Diaspora*. Chance, le <em>vhost</em> disponible sur le wiki fonctionne directement, mais je ne doute pas que les nombreuses instructions avancées utilisées décourageront bon nombre d'utilisateurs de comprendre ce que fait réellement ce <em>vhost</em> (ce qui est fort dommage).</p>
112
+
113
+<p>C'est donc à mon avis un gros point faible du projet (et je rejoins donc Maniatux), que de reposer sur Ruby, qui est un langage quand même assez exotique, qui empêchera les possesseurs d'un hébergement web seul de l'installer chez eux. Qui plus est quand d'autres technos comme Node.JS et Python sont disponibles, et avec beaucoup plus d'utilisateurs pour aider sur les problèmes généraux et non spécifiques à Diaspora*.</p>
114
+
115
+
116
+<h2>Des technos (trop&nbsp;?) modernes</h2>
117
+
118
+<p>Diaspora* utilise Ruby, mais ce n'est pas la seule technologie moderne utilisée. On retrouve toutes les technos qui ont le vent en poupe : Node.JS, Boostrap, SASS, YAML, redis… Du coup, à chaque techno, une installation de paquets supplémentaires (redis par exemple), et un frein à la customisation (Bootstrap / SASS par exemple).</p>
119
+
120
+<p>Heureusement, les dépôts Debian sont bien fournis, et on peut désormais utiliser des paquets tout prêts pour redis et nodejs. Ça rajoute une étape à l'installation, et élimine définitivement les possesseurs de mutualisés, mais ça n'est pas la partie la plus compliquée.</p>
121
+
122
+<p>Les fichiers de configuration YAML sont très bien commentés et lisibles, c'est pratique. Par contre, l'utilisation de SASS oblige à connaître un minimum le fonctionnement de cet outil, et à compiler à chaque fois sa feuille de style. Je ne sais pas si les fonctions avancées de SASS simplifient grandement les feuilles de styles, mais la <em>bidouillabilité</em> en prend un coup =(.</p>
123
+
124
+
125
+<h2>Une documentation… minimale</h2>
126
+
127
+<p>Sur la documentation, rien à redire. La <a href="https://wiki.diasporafoundation.org/Installation/Debian/Wheezy?db=mysql&mode=production">page de documentation</a> pour Debian Wheezy est complète.</p>
128
+
129
+<p>Par contre, la documentation est minimale. Comprenez bien qu'elle est complète donc contient toutes les commandes nécessaires pour s'en sortir et installer Diaspora*, mais ne contient rien de plus. Que faire après l'installation&nbsp;? Quelques vagues liens sont disponibles en fin de page, mais il faudra se lancer dans l'exploration de son instance (quelques infos sur la façon de fermer son instance aux inscriptions, quelques informations pour faire ses premiers pas auraient été super). Un problème en marge de l'installation, une configuration un peu exotique&nbsp;? Il faudra vous débrouiller par vous-même.</p>
130
+
131
+<p>Et se débrouiller par soi-même, c'est justement ça le problème. La doc sur RVM est assez minime, les chans IRC sont déserts (ou plus exactement il y a du monde, mais aucune activité visible)… (Merci au passage à <a href="https://github.com/Flaburgan">Flaburgan</a> qui a été un des seuls à répondre :)</p>
132
+
133
+<p>En particulier, j'ai eu des problèmes avec RVM. Je n'avais pas <span class="monospace">sudo</span> disponible sur mon serveur, et selon la documentation, je devais lancer <span class="monospace">rvm autolibs read-only</span>. Mais cette commande me retournait un magnifique <span class="monospace">rvm_debug: command not found</span>, quoi que je fasse et bien que tous les fichiers nécessaires aient été sourcés par bash (visiblement, il y avait un problème à ce niveau quand même). Du coup, je cherche cette erreur dans <del>Google</del> mon moteur de recherche favori, et je ne trouve qu'une <em>issue</em> vieille de 6 mois et corrigée. Je reteste plusieurs fois, en suivant scrupuleusement la <a href="https://rvm.io/development/">doc de RVM</a> (cette fois) et non celle de Diaspora* des fois qu'elle ne soit pas à jour. Rien à faire, toujours la même erreur. Je décide donc d'aller voir sur IRC, sur <span class="monospace">#diaspora</span> et <span class="monospace">#rvm</span>, aucune activité en 2 jours… Finalement, j'ai réussi à m'en sortir en bidouillant avec un <span class="monospace">export -f rvm_debug</span> et j'ai réussi à installer Diaspora*, mais je ne sais toujours pas ce qu'il se passait…</p>
134
+
135
+
136
+<h2>Gourmand</h2>
137
+
138
+<p>Quand on lit les pré-requis dans le <a href="https://wiki.diasporafoundation.org/Installation/Debian/Wheezy?db=mysql&mode=production">wiki</a>, on trouve qu'il faut au minimum 512Mo de RAM (et 1Go de swap) et un CPU multi-cœur. Ces pré-requis sont à destination des gens souhaitant héberger un <em>pod</em> de taille moyenne. Étant le seul utilisateur de mon pod, Diaspora* consommera sûrement beaucoup moins de ressources, à voir. Sinon, ça veut dire que Diaspora* ne pourra pas tourner sur un Raspberry Pi (par exemple), ce qui peut être dommage quand on voit que Cyrille Borne <a href="http://blog-libre.org/post/2014/07/21/installer-owncloud-en-5-minutes-sur-un-raspberry-pi-et-autres">installe un petit serveur XMPP sur son Raspi</a> et qu'une instance de Diaspora aurait pu le rejoindre pour faire un Raspberry Pi social qui contrôle notre identité sur les réseaux.</p>
139
+
140
+
141
+<h2>Premiers pas</h2>
142
+<p>On retrouve les principaux éléments des réseaux sociaux traditionnels. L'interface m'a un peu rappelé (feu) <a href="http://status.net/">StatusNet</a> (ou plus exactement son successeur, <a href="http://pump.io/">pump.io</a>, la faute à Bootstrap je suppose). On arrive sur une vue des derniers posts très classique et on peut poster directement.</p>
143
+
144
+<p>Diaspora* met l'accent sur le contrôle de ses données, à travers les aspects (équivalents aux cercles de Google+ je pense). Du coup, chaque post peut être à destination d'un cercle différent, et ce comportement est un peu déroutant au début. En particulier, les posts sont privés par défaut, et il faut commencer à taper son message puis dérouler une liste déroulante pour modifier les aspects qui pourront voir ce post. À noter également qu'une fois un post écrit, son aspect ne peut être modifié.</p>
145
+
146
+
147
+<h2>Petite déception dans les fonctions de base</h2>
148
+<p>Diaspora* met l'accent sur le contrôle des données. Pourtant, je n'ai pas vu de moyen très simple d'exporter ses données (mais je ne doute pas que ça existe), mais surtout pour les importer. On ne peut donc pas migrer son instance sur un autre pod. C'est dommage, j'aurais bien testé sur un pod hébergé avant de passer chez moi =(.</p>
149
+
150
+<p><strong>EDIT&nbsp;</strong> Autre truc un peu énervant. Quand on cherche un utilisateur, le moindre espace en trop dans le champ de recherche empêche la recherche de s'exécuter correctement.</p>
151
+
152
+<h2>Quelques points supplémentaires</h2>
153
+<ul>
154
+    <li>J'ai essayé d'ajouter quelques contacts. Aucun problème avec ceux hébergés sur <a href="http://diaspora-fr.org/">diaspora-fr.org</a>, mais j'ai eu beaucoup plus de mal à ajouter un autre utilisateur qui s'auto-hébergeait. On n'a pas encore élucidé ce qu'il se passait, mais il semblerait que je me sois même fait bloqué par portsentry lorsque j'ai essayé de l'ajouter…</li>
155
+    <li>Bien penser à cocher la case «&nbsp;permettre à tous de chercher votre profil&nbsp;» pour que les autres puissent vous ajouter.</li>
156
+    <li><strong>EDIT&nbsp;:</strong> Je découvre petit à petit Diaspora* et pour l'instant, je regrette quand même un peu le manque de fédération. C'est décentralisé, mais c'est un gros amas de petits ilots centralisés (les <em>pods</em>). Par exemple, les contacts ne sont pas fédérés et ne s'affichent qu'au sein d'un même <em>pod</em>.</li>
157
+    <li><strong>EDIT&nbsp;</strong> Les mentions sont bien pratiques, comme sur Twitter, mais ne sont pas utilisables dans des commentaires…</li>
158
+</ul>
159
+
160
+		<footer><p class="date">Le 29/07/2014 à 22:51</p>
161
+		<p class="tags">Tags : <a href="//phyks.me/tags/Libre.html">Libre</a></p></footer>
162
+	</div>
163
+</article>
164
+<article>
165
+	<aside>
166
+		<p class="day">24</p>
167
+		<p class="month">Juillet</p>
168
+	</aside>
169
+	<div class="article">
170
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/inline_diff.html">Lister des corrections en ligne</a></h1></header>
171
+		<!--
172
+	@author=Phyks
173
+	@date=24072014-2235
174
+	@title=Lister des corrections en ligne
175
+	@tags=Dev
176
+-->
177
+<p>Il m'arrive souvent de corriger des documents textes et de devoir noter facilement les fautes d'orthographe. Idéalement:</p>
178
+<ul>
179
+    <li>Un humain devrait être capable de le lire sans difficultés.</li>
180
+    <li>Une machine devrait pouvoir le <em>parser</em> facilement pour effectuer la correction elle-même.</li>
181
+    <li>Le correcteur devrait avoir un minimum de mots à recopier.</li>
182
+</ul>
183
+
184
+<p>Une solution est de corriger directement le document, puis de faire un <em>diff</em>. Ça marche, mais ce n'est pas des plus pratiques (on n'a pas forcément <em>diff</em> partout par exemple, ou encore le texte source n'est pas disponible pour du Markdown ou du LaTeX) et c'est quand même pas le plus lisible pour le destinataire. Pour résoudre ce problème, on peut utiliser <a href="etherpad.org"><em>etherpad</em></a> (dont une instance est disponible chez <a href="http://framapad.org/">FramaSoft</a> pour ceux qui ne veulent pas auto-héberger) par exemple, qui va garder les corrections en couleur et ce sera donc très lisible.</p>
185
+
186
+<p>Ceci dit, j'utilise une autre solution, qui ne nécessite qu'un éditeur de texte brut, et qui, un peu comme Markdown, est facilement lisible par un humain ou une machine. Je ne suis sûrement pas le seul à l'utiliser, et ça n'a sûrement pas grand chose d'extraordinaire, mais si jamais ça peut servir à d'autres personnes… (au moins à ceux à qui j'envoie mes corrections dans ce format ^^)</p>
187
+
188
+<p>Le plus simple est de partir d'un exemple. Considérons le texte suivant:</p>
189
+<blockquote>Cec est un text de démonstratin. Comme vous pouvez aisément le constater il y a quelques lettres manquntes et quelqueslettres en troap ou des mauvaises lettres. C'est donc un bon exiample.</blockquote>
190
+
191
+<p>Évidemment, le texte corrigé est:</p>
192
+<blockquote>Ceci est un texte de démonstration. Comme vous pouvez le constater aisément il y a quelques lettres manquantes et quelques lettres en trop ou des mauvaises lettres. C'est donc un bon exemple.</blockquote>
193
+
194
+<p>Pour ce texte, ma proposition de correction serait:</p>
195
+<pre>Cec(+i)
196
+text(+e)
197
+démonstrati(+o)n
198
+manqu(+a)ntes
199
+quelques(+ )lettres
200
+tro(-a)p
201
+ex(-ia+e)mple</pre>
202
+
203
+<p>Avec cette méthode, la correction est très courte, facilement lisible et très vite écrite. Détaillons-la un peu plus.</p>
204
+
205
+<p>Premier constat: il est très rare d'avoir des parenthèses au sein d'un mot. Et quand il y a des parenthèses, il n'y a jamais (en français correctement typographié, sauf erreur de ma part) un + ou un - qui suit une parenthèse ouvrante. On va donc englober dans des parenthèses nos corrections, directement au sein du mot. Au sein d'une parenthèse, on commencera toujours par le symbole - suivi de la lettre (ou des lettres consécutives) à retirer, s'il y a lieu. Puis viendra le symbole + suivi des lettres à insérer à la place dans le mot.</p>
206
+
207
+<p>Quand il manque une lettre dans le mot, elle est dans le champ de vision au sein de la parenthèse quand on lit le mot, et la lecture du mot est facilitée, tout en voyant immédiatement qu'il y a une faute à cet endroit. Quand il y a une lettre en trop, il suffit de ne pas lire la parenthèse pour avoir le mot complet bien écrit. Quand il y a eu une substitution, les lettres à insérer sont après le +, et les lettres à retirer sont après le -. La lecture d'un tel <em>diff</em> est donc très facile.</p>
208
+
209
+<p>Pour un ordinateur, il est également très facile de lire un tel diff. Le code serait le suivant:</p>
210
+<ul>
211
+    <li>Découper le texte en mots.</li>
212
+    <li>Pour chaque mot, regarder s'il y a un (ou plusieurs) groupe(s) de parenthèses contenant des + et des -, au format précédent.</li>
213
+    <li>Pour chaque mot qui en contient, retirer les caractères suivant le - et ajouter ceux suivant le +.</li>
214
+</ul>
215
+
216
+<p>Une implémentation basique (et mal codée) en Python qui traite un mot serait :</p>
217
+<code><pre>def inline_diff(word):
218
+    index = word.find('(-')
219
+    if index == -1:
220
+        index = word.find('(+')
221
+    if index == -1:
222
+        return word
223
+
224
+    index_end = word.find(')', index)
225
+    if index_end == -1:
226
+        return False
227
+
228
+    output = word[:index]
229
+    action = 'add'
230
+    for i in range(index, index_end):
231
+        if word[i] == '(':
232
+            continue
233
+        elif word[i] == '-':
234
+            action = 'remove'
235
+        elif word[i] == '+':
236
+            action = 'add'
237
+        else:
238
+            if action == 'remove':
239
+                continue
240
+            else:
241
+                output += word[i]
242
+    output += word[index_end+1:]
243
+    return inline_diff(output)</pre></code>
244
+
245
+<p>Il reste à traiter le cas d'un diff complet. Plutôt que de fournir le texte complet, on peut se contenter de fournir une liste des corrections, comme la liste précédente, par ordre d'apparition dans le texte. Avec très peu de précautions nécessaires, une telle liste pourrait être traitée directement par un ordinateur pour apporter les corrections.</p>
246
+
247
+
248
+<p><strong>Mise à jour :</strong> Enfin, n'oublions pas d'aborder quelques limitations de ce système:</p>
249
+<ul>
250
+    <li>Si le texte possède deux orthographes d'un mot, il faut prendre des précautions pour la correction. En particulier, il faut rappeler le mot à corriger autant de fois qu'il y a de corrections à faire, et on ne peut pas faire d'option <em>greedy</em>. Cependant, ceci devrait déjà être le cas si vous utilisez la méthode décrite précédemment.</li>
251
+    <li>Dans le cas du texte suivant:
252
+<blockquote>Il existe des fois où la technique peut être utilisée moyennant quelques précautions. Dans cet exemple, les technique précédentes ne fonctionneront pas sans précautions.</blockquote>
253
+Si on utilise <span class="monospace">technique(+s)</span>, c'est la première qui sera remplacée. Il faut donc étendre cette méthode pour traiter un contexte suffisant pour effectuer le remplacement sans ambiguïtés. Le <em>diff</em> adéquat serait:
254
+<pre>les technique(+s)</pre>.</li>
255
+    <li>On ne peut pas déplacer de mots facilement avec cette méthode. Plus exactement, c'est possible mais n'est pas optimal. Considérons le texte suivant:
256
+        <blockquote>Dans ce texte, les sont mots inversés.</blockquote>
257
+        Moyennant une implémentation un peu plus large de l'algorithme, on pourrait utiliser la méthode précédente comme ceci, pour corriger cette phrase:
258
+        <pre>les (-sont) mots (+sont)</pre>
259
+        car rien n'interdit à un mot d'être entièrement supprimé ou ajouté.</lu>
260
+</ul>
261
+
262
+		<footer><p class="date">Le 24/07/2014 à 22:35</p>
263
+		<p class="tags">Tags : <a href="//phyks.me/tags/Dev.html">Dev</a></p></footer>
264
+	</div>
265
+</article>
266
+<article>
267
+	<aside>
268
+		<p class="day">16</p>
269
+		<p class="month">Juillet</p>
270
+	</aside>
271
+	<div class="article">
272
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/pourquoi_gpl_pas_libre.html">Pourquoi la GPL n'est pas (si) libre</a></h1></header>
273
+		<!--
274
+	@author=Phyks
275
+	@date=16072014-1900
276
+	@title=Pourquoi la GPL n'est pas (si) libre
277
+	@tags=Libre
278
+-->
279
+<p>Cet article est une traduction (dont je ne garantis pas la qualité :) de <a href="http://noordering.wordpress.com/2009/01/20/why-the-gpl-is-not-free/">cet article (en anglais)</a>. Je n'ai pas réussi à contacter l'auteur, et si celui-ci passe par là et souhaite le retrait de la traduction, je la retirerai.</p>
280
+
281
+<p>Cet article résume bien le problème que me pose la clause de redistribution sous une licence compatible, qui complique bien souvent l'utilisation de la licence (notamment car ce qu'on peut réellement faire avec un code sous GPL n'est pas toujours très clair et intuitif). C'est une des raisons pour laquelle je privilégie généralement une licence plus permissive, comme la <a href="https://tldrlegal.com/license/mit-license">MIT</a>. La dernière partie sur l'échec de la GPL est moins convaincante, et peut être même un peu tirée par les cheveux, mais elle fait partie de l'article donc je la laisse.</p>
282
+
283
+<p>À partir de maintenant et dans toute la suite, «&nbsp;je&nbsp;» désigne donc l'auteur de l'article précédent.</p>
284
+
285
+<h1>Pourquoi la GPL n'est pas libre</h1>
286
+
287
+<h2>Introduction</h2>
288
+
289
+<p>La <a href="http://www.fsf.org/">Free Software Foundation (FSF)</a> présente la <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a> comme un défenseur idéal de vos libertés. On nous dit que la GPL est au cœur de la défense de quatre libertés :</p>
110 290
 <ol>
111
-<li>It gets a set of all the words in this article, ignoring too short words. </li>
112
-<li>It applies <a href="http://tartarus.org/martin/PorterStemmer/">Porter Stemming Algorithm</a> to reduce drastically the number of words to keep. </li>
113
-<li>It generates a Bloom filters containing all of these words.</li>
291
+    <li>La liberté de faire tourner le programme, pour n'importe quelle raison (liberté 0).</li>
292
+    <li>La liberté d'étudier comment le programme fonctionne, et de l'adapter à vos besoins (liberté 1). L'accès au code source est une condition préliminaire à cette liberté.</li>
293
+    <li>La liberté de redistribuer des copies pour que vous puissiez facilement aider vos voisins (liberté 2).</li>
294
+    <li>La liberté d'améliorer le programme et de diffuser les améliorations (et les versions modifiées en général) au public, pour que la communauté entière en bénéficie (liberté 3). L'accès au code source est une condition préliminaire à cette liberté.</li>
114 295
 </ol>
115
-<p>Finally, it concatenates all the per article Bloom filters in a binary file, to be sent to the client. It also generates a JSON index mapping the id of the Bloom filter in the binary file to the corresponding URL and title for each article.</p>
116
-<h3>Client side</h3>
117
-<p>Upon loading, the JavaScript script downloads the binary file (see <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data">this MDN doc</a> for more details) containing the Bloom filters and the JSON index, and regenerate BloomFilters on the client side.</p>
118
-<p>When the client searches for something, the JavaScript script splits the query in words and iterate over the Bloom filters to search for the words. That's it =)</p>
119
-<h2>(Fun) facts found while reimplementing the Bloom filters library in Python</h2>
120
-<p>First problem I had to deal with&nbsp;: the difference between JavaScript <code>Number</code> type and Python <code>int</code>. JavaScript has only one type for all numbers (<code>int</code> or <code>floats</code>) and it is <code>Number</code> (see <a href="https://stackoverflow.com/questions/307179/what-is-javascripts-highest-integer-value-that-a-number-can-go-to-without-losin">this SO thread</a>). They are 64-bit floating point values, with a magnitude no greater than 2<sup>53</sup>. However, when doing bitwise operations, they are casted to 32 bits before doing the operation. This is something to take care of, because Python's <code>int</code> can be 64 bits (<a href="http://legacy.python.org/dev/peps/pep-0237/">http://legacy.python.org/dev/peps/pep-0237/</a>). Then, when a bitwise operation overflows in JavaScript, it may not overflow the same way in Python.</p>
121
-<p>The solution to this problem was to use <code>ctypes.c_int</code> in Python for bitwise operations, as proposed <a href="https://stackoverflow.com/questions/1694507/difference-between-operator-in-js-and-python">here</a>.</p>
122
-<p>Another problem was the difference between modulo behaviour with negative numbers in Python and in JavaScript. Unlike C, C++ and JavaScript, Python's modulo operator (%) always return a number having the same sign as the divisor (<a href="https://stackoverflow.com/questions/3883004/negative-numbers-modulo-in-python">Source</a>). Then, we have to reimplement the C behaviour in a modulo function in Python.</p>
123
-<p>Finally, there was no “shift right adding zeros” (logical right shift) in Python, contrary to JS, see <a href="https://stackoverflow.com/questions/5832982/how-to-get-the-logical-right-binary-shift-in-python">this SO thread</a>. </p>
124
-		<footer><p class="date">Le 08/11/2014 à 18:45</p>
296
+
297
+<p><a href="http://www.gnu.org/philosophy/free-sw.html">« Qu'est-ce que le logiciel libre ? », sur le site de la GNU</a></p>
298
+
299
+<p>J'affirme cependant que la GPL ne nous donne pas de liberté, mais juste différentes restrictions. J'affirme de plus qu'elle ne nous donne pas toutes les libertés précédentes. Dans cet article, je défend que la GPL est intrinsèquement imparfaite quand il s'agit de libérer les logiciels.</p>
300
+
301
+
302
+<h2>Qu'est-ce que j'ai écrit ?</h2>
303
+
304
+<p>Permettez moi d'ouvrir une parenthèse avant de commencer. Je voudrais présenter un sujet lié qui est au cœur de mon argumentation, et qui est la question de savoir combien de code exactement vous avez écrit. Imaginons un scénario typique : vous êtes l'auteur d'une bibliothèque libre et <em>open source</em>. Le but de cette bibliothèque n'importe pas particulièrement, donc disons qu'elle sert à chiffrer des <em>widgets</em>. Vous mettez tout votre talent dans cette bibliothèque, et elle devient stable et très complète. Le diagramme représente le projet à ce moment :</p>
305
+
306
+<p style="text-align:center;"><a href="//phyks.me/2014/07/gpl_pas_libre_1.png"><img src="//phyks.me/2014/07/gpl_pas_libre_1.png" alt="Votre projet, initialement."/></a><br/>
307
+Vous êtes fier de votre projet.</p>
308
+
309
+<p>Supposons donc maintennt qu'une tierce partie prenne votre code et construise quelque chose par dessus. On pourrait le représenter comme ceci :</p>
310
+
311
+<p style="text-align:center;"><a href="//phyks.me/2014/07/gpl_pas_libre_2.png"><img src="//phyks.me/2014/07/gpl_pas_libre_2.png" alt="Des ajouts à votre projet."/></a><br/>
312
+Un important et un petit ajout à votre projet.</p>
313
+
314
+<p>Ce qui est important ici, c'est de réaliser que la quantité de code que vous avez écrite ne change pas. Même si l'ajout de la tierce partie consiste seulement en une jolie interface graphique pour votre bibliothèque, la quantité de code que vous avez écrite n'a pas augmenté, ni diminué.</p>
315
+
316
+
317
+<h2>Ce que vous couvrez avec une licence</h2>
318
+
319
+<p>Ok, posons donc maintenant la question : quelle est la pertinence de tout ceci ? Ça nous a aidé à clarifier ce que vous couvrez exactement par la licence lorsque vous appliquez une licence GPL à votre code. Vous couvrez <em>votre</em> code, et seulement votre code. Et pourtant, la GPL restreint la licence des travaux dérivés. Notons ici que les travaux dérivés sont <em>intégralement</em> le travail de quelqu'un d'autre.</p>
320
+
321
+<p>L'argument le plus courant que j'ai entendu pour favoriser la GPL est qu'avec une licence plus faible (disons <a href="http://www.opensource.org/licenses/bsd-license.php">BSD</a>), une tierce partie peut prendre votre code, l'étendre, et fermer l'accès aux sources. Réfléchissons donc à ce que cela signifie. Pour fermer l'accès à votre code, ils auraient du le prendre, retirer toutes les sources en accès libre pour ce code, et ensuite le distribuer à nouveau en <em>closed source</em>. Mais cela n'a aucun sens. Vous distribuez toujours votre code source sous une licence libre et <em>open source</em>, donc en quoi l'ont-ils rendu <em>closed source</em> ? Ils ne l'ont pas fait : <em>votre code</em> est toujours <em>open source</em>. Donc, qu'ont-ils rendu <em>closed source</em> ? Et bien, la réponse est « leur code », et <em>seulement</em> leur code est <em>closed source</em>, et c'est très bien : ils sont dans leur droit d'appliquer la licence de leur choix à leur code.</p>
322
+
323
+<p>Donc la conclusion est qu'une entreprise peut venir, prendre libWidgetCrypt et proposer un petit <em>wrapper</em> autour, et commencer à faire d'énormes profits en vendant le résultat $10,000. Oui, c'est possible, mais c'est aussi un scénario assez improbable. Si tout ce qu'ils ont fait a été d'écrire un petit <em>wrapper</em>, alors vous, ou quelqu'un d'autre dans la communauté <em>open source</em> est parfaitement capable de réaliser un tel <em>wrapper</em> en un rien de temps. Et alors, tout ce qu'il vous reste à faire est de casser les prix et d'ajouter un bon gros morceau de liberté.</p>
324
+
325
+<p>Le scénario le plus probable, cependant, est qu'une entreprise arrive, prenne libWidgetCrypt et produise un gros morceau de code supplémentaire, qui utilise juste votre bibliothèque dans sa base. Alors, cette entreprise va vendre <em>son</em> code, et <em>ses extensions</em> pour un montant élevé, et ils ont parfaitement le droit de le faire. Après tout, c'est leur code.</p>
326
+
327
+<p>Croyez le ou non, ce scénario est encore un scénario bénéfique pour vous. Cette entreprise est susceptible de trouver des bugs dans libWidgetCrypt, et de les corriger. De mon expérience de ce genre de choses, ils contribuent et vous font parvenir leurs correctifs plus souvent qu'on le pense, même si rien ne les y oblige ! Oui, il arrive qu'ils corrigent la bibliothèque et s'enfuient avec les correctifs, mais encore une fois, ils ont écrit les correctifs, ils ont le droit de le faire !</p>
328
+
329
+
330
+<h2>Là où la GPL rate</h2>
331
+
332
+<p>Je suis entré dans beaucoup de détails sur ce que vous mettez sous GPL quand vous appliquez une licence GPL à votre code, mais je n'ai pas encore parlé de ce que j'avais annoncé au début de cet article. Je ne vous ai pas dit pourquoi la GPL n'est pas une licence libre. Pour cela, je vais me concentrer sur la dernière liberté qu'elle affirme offrir : « La liberté d'améliorer le programme, et de diffuser les améliorations (et les versions modifiées en général) au public, pour que la communauté entière en bénéficie (liberté 3). ». Supposons que j'ai une entreprise, et que je crée un produit à distribuer. J'aimerais utiliser votre bibliothèque dans mon programme, j'aimerais même améliorer votre bibliothèque, et diffuser les améliorations publiquement, pour que l'intégralité de la communauté en bénéficie. Malheureusement, je dois finir par vendre un produit, donc j'aimerais garder le cœur de mon projet <em>closed source</em>. Malheureusement, la GPL proscrit ce genre de choses.</p>
333
+
334
+<p>Nous avons donc un bon citoyen, une entreprise qui veut diffuser leurs correctifs à la bibliothèque, et pourtant la GPL leur interdit de le faire. Elle ne leur donne aucune liberté ! À la place, la GPL est un ensemble de restrictions.</p>
335
+
336
+<p>Il se peut que vous trouviez que l'ensemble de restrictions que la GPL offre est plus moralement acceptable que les licences <em>closed source</em> traditionnelles, mais ce n'est <em>pas</em> une licence libre. Elle ne donne pas de liberté, elle donne différentes restrictions.</p>
337
+
338
+
339
+<h2>Conclusions</h2>
340
+
341
+<p>La GPL n'est pas une licence libre, en ce qu'elle restreint les libertés aux seules personnes qu'elle juge moralement acceptables. Il y a souvent des gens qui ne tombent pas dans cette case « moralement acceptable », mais qui ont pourtant de très bonnes intentions. La GPL est donc trop restrictive pour beaucoup de projets. À la place, c'est souvent une bonne idée d'utiliser une véritable licence <em>FOSS</em>, comme la licence BSD par exemple. En faisant cela, vous ne vous rendrez pas vulnérable pour des entreprises qui voudraient passer magiquement votre code en <em>closed source</em>, car vous continuerez à le distribuer. Il se peut qu'ils passent en <em>closed source</em> un petit ajout à votre code et essayent de le vendre pour des sommes astronomiques. Cependant, dans ce cas, vous pouvez aussi reproduire le même changement mineur, et le donner entièrement librement à la communauté.</p>
342
+
343
+		<footer><p class="date">Le 16/07/2014 à 19:00</p>
344
+		<p class="tags">Tags : <a href="//phyks.me/tags/Libre.html">Libre</a></p></footer>
345
+	</div>
346
+</article>
347
+<article>
348
+	<aside>
349
+		<p class="day">16</p>
350
+		<p class="month">Juillet</p>
351
+	</aside>
352
+	<div class="article">
353
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/doxygen_php.html">Documenter son code PHP avec doxygen</a></h1></header>
354
+		<!--
355
+	@author=Phyks
356
+	@date=16072014-1520
357
+	@title=Documenter son code PHP avec doxygen
358
+	@tags=Web, Dev
359
+-->
360
+<p>Je cherchais hier un moyen de générer une belle doc PHP, à partir de mes fichiers sources. Je connaissais quelques outils de la sorte (OcamlDoc, Sphinx pour Python, JavaDoc etc.) mais je n'avais jamais regardé ça en détails.</p>
361
+
362
+<p>Du coup, je suis tombé sur <a href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>, qui supporte une très grande variété de langages, est utilisé par beaucoup de scripts (dont des très gros comme Drupal) et était largement suffisant pour mes besoins. Il mange vos sources et génère de <a href="http://maniacbug.github.com/RF24/classRF24.html"><del>belles documentations</del></a> des pages de doc lisibles, en HTML, LaTeX, CHM et autres.</p>
363
+
364
+<p>J'ai pas trouvé de guides ultra rapides pour démarrer (ok, j'ai pas vraiment cherché non plus) donc je liste ici les 3 commandes de base, pour avoir une doc en 5 minutes chrono.</p>
365
+
366
+<p>Pour commencer, il faut faire <span class="monospace">doxygen&nbsp;-g&nbsp;.doxygen</span> dans le répertoire du projet pour générer un fichier de configuration (option <span class="monospace">-g</span>) nommé <span class="monospace">.doxygen</span>. Voici quelques paramètres utiles à modifier:</p>
367
+<ul>
368
+    <li><span class="monospace">PROJECT_NAME</span>, mettre le nom de votre projet.</li>
369
+    <li>Je voulais générer uniquement une doc HTML, et tout mettre dans un dossier doc. J'ai donc mis <span class="monospace">OUTPUT_DIRECTORY</span> à <span class="monospace">"doc/"</span>, puis <span class="monospace">HTML_OUTPUT</span> à <span class="monospace">.</span> (pour que la doc HTML aille dans <span class="monospace">doc/</span>) et enfin <span class="monospace">GENERATE_LATEX</span> à <span class="monospace">NO</span> pour ne pas générer de doc en LaTeX.</li>
370
+    <li>Enfin, je voulais traiter tous les fichiers de mon projet, donc j'ai mis l'option <span class="monospace">RECURSIVE</span> à <span class="monospace">YES</span>.</li>
371
+</ul>
372
+
373
+<p>Une fois tout ceci fait, il faut que vos commentaires soient au bon format pour que doxygen les lise. Un exemple est disponible <a href="https://raw.githubusercontent.com/Phyks/Freeder/master/inc/functions.php">ici</a>.</p>
374
+
375
+<p>En gros, il faut à chaque fois redoubler les commentaires <span class="monospace">/**&nbsp;…&nbsp;*/</span> pour que doxygen les <em>parse</em>. Les premières lignes de texte dans chaque cas sont un petit paragraphe descriptif. Il est possible d'ajouter un plus long paragraphe après avoir sauté une ligne. Doxygen utilise ensuite des tags <span class="monospace">@quelquechose</span> pour noter les paramètres, les valeurs de retours, les copyrights etc.</p>
376
+
377
+<p><strong>Important</strong>, ne pas oublier de dire à doxygen d'utiliser le fichier courant avec un <span class="monospace">@file</span> dans le commentaire global du fichier.</p>
378
+
379
+<p>Une fois tous vos fichiers <em>taggés</em> correctement, lancer <span class="monospace">doxygen .doxygen</span> depuis la racine de votre projet pour générer la doc. Vous obtiendrez une belle documentation <a href="https://freederteam.github.io/Freeder/doc/files.html">comme ça</a> (ok, il y a encore du boulot sur celle-ci…).</p>
380
+
381
+		<footer><p class="date">Le 16/07/2014 à 15:20</p>
382
+		<p class="tags">Tags : <a href="//phyks.me/tags/Web.html">Web</a>, <a href="//phyks.me/tags/Dev.html">Dev</a></p></footer>
383
+	</div>
384
+</article>
385
+<article>
386
+	<aside>
387
+		<p class="day">15</p>
388
+		<p class="month">Juillet</p>
389
+	</aside>
390
+	<div class="article">
391
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/specific_vim_config_git.html">Specific Vim config per Git repository</a></h1></header>
392
+		<!--
393
+	@author=Phyks
394
+	@date=15072014-2220
395
+	@title=Specific Vim config per Git repository
396
+	@tags=Linux, Vim
397
+-->
398
+<p>I was looking for a way to add custom vim options on a per-repo basis. The standard way I saw for now, was adding some comments to change the Vim config on a per-file basis. There were some alternatives which were working for any project folder (and not only git repos) but they were only working if you start Vim from the root of the project, or they were exploring the tree from local folder up to root (and needed a plugin). None of them were satisfactory.</p>
399
+
400
+<p>When I edit a file and need specific Vim configuration, it is usually inside a git repo. So, it is easy to know what is the root folder, and I just wanted to search for a <span class="monospace">Vimrc</span> file in this folder. No complicated tree searching, working from anywhere inside the repo, no per-file specific configuration.</p>
401
+
402
+<p>First of all, the magic command I used to find the git root folder is <span class="monospace">git rev-parse --show-top-level</span>.</p>
403
+
404
+<p>Then, all I had to do is wrap it correctly in my <span class="monospace">.vimrc</span>:</p>
405
+<code>
406
+<pre>" Git specific configuration
407
+let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
408
+let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
409
+if !empty(glob(git_vimrc))
410
+    sandbox exec ":source " . git_vimrc
411
+endif
412
+</pre>
413
+</code>
414
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
415
+
416
+<p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
417
+
418
+		<footer><p class="date">Le 15/07/2014 à 22:20</p>
419
+		<p class="tags">Tags : <a href="//phyks.me/tags/Linux.html">Linux</a>, <a href="//phyks.me/tags/Vim.html">Vim</a></p></footer>
420
+	</div>
421
+</article>
422
+<article>
423
+	<aside>
424
+		<p class="day">10</p>
425
+		<p class="month">Juillet</p>
426
+	</aside>
427
+	<div class="article">
428
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/benchmark_rss.html">Quick and dirty benchmark of RSS/ATOM parsing libs</a></h1></header>
429
+		<!--
430
+	@author=Phyks
431
+	@date=10072014-1725
432
+	@title=Quick and dirty benchmark of RSS/ATOM parsing libs
433
+	@tags=Dev, Web
434
+-->
435
+<p><strong>EDIT:</strong> I just realized that the PHP function <span class="monospace">microtime</span> does not return what I expected. This does not change much the results (to compare the solutions) but change the units. I update the results accordingly.</p>
436
+
437
+<p>As I wrote in a <a href="http://phyks.me/2014/07/lecteur_rss_ideal.html">previous article</a>. I am working on a rss reader that could fit my needs. For this purpose, I am currently trying to see which way is the best way to parse RSS and ATOM feeds in PHP.</p>
438
+
439
+<p>I searched on the web for benchmarks, but I could only find old benchmarks, for old version of the libs and weird stuff (like parsing directly the feed with regex). So, I did a quick and dirty benchmark (and this is the reason why this article is in english :).</p>
440
+
441
+<h2>Which lib is the best one to parse RSS and ATOM feeds ?</h2>
442
+
443
+<p>I searched on the web for the available solutions. I found three main solutions (ordered from the most lightweight one to the less lightweight one):</p>
444
+<ul>
445
+    <li><a href="https://github.com/broncowdd/feed2array">feed2array</a>, a lib by <a href="http://warriordudimanche.net/">Bronco</a> which is basically a wrapper around SimpleXML and is used by <a href="http://lehollandaisvolant.net/">timo</a> in his RSS reader implemented in <a href="https://github.com/timovn/blogotext">blogotext</a>. So it is tested on a quite wide range of feeds and should be considered fully working.</li>
446
+    <li><a href="http://lastrss.oslab.net/">lastRSS</a>, a dedicated lib written in PHP</li>
447
+    <li><a href="http://simplepie.org">SimplePie</a>, the well known lib, very complete, able to handle a wide range of feeds, correctly <strong>and</strong> incorrectly formatted, but very heavy.</li>
448
+</ul>
449
+
450
+<p>My goal was just to do a quick benchmark, so it is complete dirty and may not be very precise, but I did not need more. I did not test extensively all the available libs, especially all the wrappers around SimpleXML as the one I found was sufficient, and is basic enough to reflect a general result.</p>
451
+
452
+<p>My test lies on six RSS and ATOM feeds (both of them, to be sure that the lib worked on them) with a total of 75 articles. I parse them with the corresponding lib, and I do not display anything but the total time to parse them. I do not mind the ability of the lib to handle specially malformed feeds as these should not exist and parsing them may encourage their use. So, I am just interested in the time needed to parse these 6 feeds.</p>
453
+
454
+<p>The three libs parsed all of them successfully. I ran the test on my laptop, which can be considered almost 100% idle.</p>
455
+
456
+<p>The results are:</p>
457
+<table>
458
+    <tr>
459
+        <td>feed2array (and similar basic simpleXML based solution)</td>
460
+        <td>about 40ms</td>
461
+    </tr>
462
+    <tr>
463
+        <td>lastRss</td>
464
+        <td>about 120ms and I got some mistakes</td>
465
+    </tr>
466
+    <tr>
467
+        <td>SimplePie</td>
468
+        <td>about 280ms</td>
469
+    </tr>
470
+</table>
471
+
472
+<p>So, for my personnal case, I would simply say “the simpler the better” and go for feed2array that works perfectly on the feeds I want to use and is way faster than the overkill libraries. Very often I read that SimplePie was heavy and slow (despite their advertisement as “super fast”) and it seems to be confirmed by my results.</p>
473
+
474
+<p>In conclusion, however these results are just to be considered as orders of magnitude, and not precise measurements, I would say that you should avoid any complicated and overkill library unless you really need some of the advanced features it has. Your script will be way faster (up to 5 times faster or so according to these results).</p>
475
+
476
+<p><em>Note:</em> I only focused on these three libraries as it appears that they are the three main libraries available for this purpose (except for feed2array for which there are plenty of similar scripts). I wanted only scripts under a fully open source license, which eliminated some of the others. The only notable ones that I could have taken into account (I think) are the feed library from Zend, but I did not want to search for a way to get only the relevant functions from Zend, and the newly integrated PHP extensions such as XSLT. However, these PHP extensions are not widely available, and not built-in at all, so they may not be available on most of the shared hostings.</p>
477
+
478
+<h2>Store in a database / files or parse it each time ?</h2>
479
+
480
+<p>Next question I had was how do this time compare with retrieving infos from a database. For this purpose, I compared three times:</p>
481
+<ul>
482
+    <li>time to parse the feeds using feed2array, which is about 40ms, as found before.</li>
483
+    <li>time to load the arrays representing the feeds from serialized and gzipped files, which is about 8ms.</li>
484
+    <li>time to load 75 elements (id, description, guid, link and pubDate) from a sqlite database, not optimized at all, which is about 2ms.</li>
485
+</ul>
486
+
487
+<p>As we could expect, it is longer to parse the feeds than to load them from a storage. So, it is definitely not a good idea to parse them at each page generation. Plus RSS format is not practical at all to do search and complex queries.</p>
488
+
489
+<p>The legit solutions are then to use flat files or a database. The difference between the two times is not so large, considering that files are gzipped and that I actually stored a bit more information in the file than in the table.</p>
490
+
491
+<p>However, there is not much optimization to do with files, whereas there are many ways to improve my results with a database. For instance, I used a basic sqlite table, without any potential optimization. But I could have used a more robust solution. If performances are really a concern, I could even use a temporary database, stored in RAM, to store the feeds elements. If this table is lost, that is not a big deal, as I will only have to do a refresh to get them back.</p>
492
+
493
+<p>Finally, one of the major problems with SQLite seems to be that it may be slow to write and completely locks the database when writing inside. But, this is also the case for flat files.</p>
494
+
495
+<p>In conclusion, I would say that the best solution appears to be SQLite with PDO. Actually, the use of PDO will enable to change the database very easily, and SQLite might be as good (if not better) as flat files.</p>
496
+
497
+<p><em>Note:</em> I put all my code and the test rss feeds in a zip archive available <a href="https://pub.phyks.me/benchmark_rss.zip">here</a>.</p>
498
+
499
+		<footer><p class="date">Le 10/07/2014 à 17:25</p>
125 500
 		<p class="tags">Tags : <a href="//phyks.me/tags/Dev.html">Dev</a>, <a href="//phyks.me/tags/Web.html">Web</a></p></footer>
126 501
 	</div>
127 502
 </article>
503
+<article>
504
+	<aside>
505
+		<p class="day">10</p>
506
+		<p class="month">Juillet</p>
507
+	</aside>
508
+	<div class="article">
509
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/lecteur_rss_ideal.html">Mon lecteur RSS idéal</a></h1></header>
510
+		<!--
511
+	@author=Phyks
512
+	@date=10072014-1724
513
+	@title=Mon lecteur RSS idéal
514
+	@tags=Web, Libre, Autohébergement
515
+-->
516
+<p><strong>EDIT :</strong> J'ai repris quelque peu le commentaire de FreshRSS, après discussion avec son auteur. J'avais raté certaines options en particulier.</p>
517
+<p><strong>EDIT 2:</strong> Suite à quelques retours sur cet article, je tiens à préciser que la première partie de l'article (« Panorama de ce qui existe ») est volontairement courte et caricaturale. C'est une compilation caricaturale de réflexions que j'ai entendues, et je ne m'étends volontairement pas dessus, pour ne pas allourdir inutilement cet article qui vise d'abord à présenter les points qui me semblent importants pour mon lecteur de flux RSS idéal.</p>
518
+<p><em>Attention, cet article est un bon pavé et il est sûrement plein de répétitions… :)</em></p>
519
+
520
+<p>Sam&amp;Max ont écrit récemment sur <a href="http://sametmax.com/pourquoi-sametmax-com-utilise-wordpress/">leur moteur idéal</a>. Le moteur de blog est un réel problème, et j'adhérerais immédiatement à un moteur de blog qui satisfasse leurs critères (mais bon, pour l'instant ma solution maison patchée de partout fonctionne pas trop mal :). En revanche, un autre point mérite une bonne réflexion et pourrait être grandement amélioré et modernisé : le lecteur RSS.</p>
521
+
522
+<p>J'utilise actuellement <a href="https://github.com/ldleman/Leed">Leed</a> sur mon serveur. J'en suis globalement satisfait, mais certains points m'agacent et ne sont pas résolus, au fil des versions. Pourtant, après avoir fait le tour des solutions existantes, c'est la solution la plus fonctionnelle que j'ai trouvée… Je profite donc de ce billet pour dresser un bilan de ce que j'ai vu passer sur les lecteurs RSS et ce que je voudrais trouver dans mon lecteur RSS idéal.</p>
523
+
524
+<h2>Panorama de ce qui existe</h2>
525
+
526
+<p>Tout d'abord, sebsauvage a fait il y a quelques temps un <a href="http://sebsauvage.net/rhaa/index.php?2013/03/15/17/15/39-arretez-de-pleurer-google-reader-hebergez-un-lecteur-rss-chez-vous">petit tour d'horizon des solutions de lecteurs RSS à héberger</a>. Je vais faire court, au risque de m'attirer les critiques :</p>
527
+<dl>
528
+    <dt>Leed</dt>
529
+    <dd>On attend le support du multi-utilisateur depuis un moment, il utilise <span class="monospace">mysql_</span> qui est déprécié, base MySQL obligatoire, quand même assez lourd, une licence non libre (CC BY SA NC), des développeurs principaux indisponibles (le <a href="http://leed.idleman.fr/">wiki</a> est globalement HS pour l'instant), un thème de base très moche, pas si simple à installer pour Mme Michu, des thèmes qui sont quand même limités, et <a href="https://github.com/ldleman/Leed/issues/391">bloqués par le dépôt principal</a>…</dd>
530
+
531
+    <dt>KrISS Feed</dt>
532
+    <dd>C'est moche, pas fonctionnel. Je ne me suis pas attardé sur le reste, qui semble assez standard.</dd>
533
+
534
+    <dt>FreshRSS</dt>
535
+    <dd>Il peut gérer beaucoup d'articles (100k annoncés sur le <a href="http://freshrss.org/">site</a>). C'est pas très bô (beau / ergonomique / efficace) non plus, trop compact (notamment sur smartphone, quand on a des gros doigts :), et les infos importantes ne sont pas mises en valeur (à mon avis, les flux sont les éléments principaux, à mettre en valeur ; sur FRSS, mon œil est beaucoup plus attiré par les dossiers et les boutons). C'est aussi compliqué à installer (base MySQL, même si c'est pas si compliqué, Cron manuel, instructions dans le README que ne lit pas Mme Michu), et cela risque de bloquer Mme Michu… Ses avantages par contre : il supporte très bien la charge, et l'intégration de Mozilla Persona est originale. Il a aussi de nombreuses possibilités, pour peu qu'on fouille un peu les menus de configuration.</dd>
536
+
537
+    <dt>Aeres</dt>
538
+    <dd>Site HS, mais ça a l'air très moche aussi.</dd>
539
+
540
+    <dt>Miniflux</dt>
541
+    <dd>Seul concurrent sérieux, à la vue du site. De très bonnes idées, comme le <em>full content</em> et la suppression des trackers à la volée, mais quand on ouvre la page de démo, c'est moche… et <strong>inutilisable</strong> ce qui est vraiment dommage pour un script qui est hébergé contre paiement. C'est minimaliste, trop minimaliste. Les liens pour marquer comme lus, non lus, supprimer etc sont invisibles, le texte de l'article non sélectionné est illisible, surtout sur un mobile en plein soleil, il n'y a aucun support de plugins, les raccourcis claviers sont complètement dissociés du contrôle à la souris et il me semble assez lourd quand on charge de nombreux articles.</dd>
542
+
543
+    <dt>selfoss</dt>
544
+    <dd>Ça commence bien, le site est beau et les <em>screenshots</em> donnent envie, mais qu'en est-il vraiment ? Déjà, c'est <strong>compliqué</strong> : l'installation est compliquée, la configuration se fait dans un fichier <span class="monospace">config.ini</span>, il n'y a pas de démo disponible, et quand on finit par l'installer pour le voir en action, on se rend compte que ce n'est quand même pas très utilisable.</dd>
545
+
546
+    <dt>RSS Lounge</dt>
547
+    <dd>Connu pour sa lourdeur, il fait tout (ou presque, il ne fait pas encore le café), on passe.</dd>
548
+
549
+    <dt>cartulary</dt>
550
+    <dd>C'est compliqué, le README est paumatoire, alors qu'il n'y a vraiment aucune raison d'expliquer de façon si compliquée une installation somme toute assez basique.</dd>
551
+
552
+    <dt>RSS Miner</dt>
553
+    <dd><a href="http://www.rssminer.net/">Le site</a> ne s'affiche pas correctement chez moi, la barre de gauche cachant la moitié de la page et ne se fermant pas, je m'attends au pire et je n'ai pas regardé plus en détails.</dd>
554
+
555
+    <dt>News Blur</dt>
556
+    <dd>Il y a des idées, notamment le côté social. Mais c'est compliqué, et hors de portée de beaucoup de monde, car ça tourne sous Django, avec du MongoDB et du PostgreSQL. Je ne suis pas sûr que le côté social soit compatible entre plusieurs instances et utilise un réseau décentralisé pré-existant, qui permettrait de le plugger facilement avec Diaspora ou n'importe quel autre logiciel du genre, et évitant de multiplier les réseaux et les protocoles.</dd>
557
+
558
+    <dt>Feed HQ</dt>
559
+    <dd>Inscription obligatoire pour tester, c'est aussi du python + redis + postgresql + elasticsearch, donc on oublie pour Mme Michu.</dd>
560
+</dl>
561
+
562
+
563
+<h3>Que conclure de ce panorama ?</h3>
564
+
565
+<p>Quoi que je fasse, je reviens vers Leed. De nombreuses fonctionnalités sont annoncées depuis un moment, et j'attends qu'elles voient le jour, mais il reste le plus fonctionnel et celui qui colle le mieux avec mon lecteur RSS idéal, tout en restant loin de la perfection. Le reste est moche, complexe, lent, et même les solutions payantes (mais opensources) ne s'en sortent guère mieux. Je n'utilisais pas Google Reader, mais s'il était dans la tradition des outils Google (simple, fonctionnel et rapide), je n'ai pas (encore ?) trouvé de réelle alternative.</p>
566
+
567
+<p>Concernant Leed, la première étape est bien sûr de changer le thème par défaut (Marigolds) pour un meilleur thème. Le plus complet et maintenu actuellement est <a href="https://github.com/tmos/greeder">Greeder</a> de <a href="http://tomcanac.com/">tmos</a> (bien que <a href="http://rss.remitaines.fr/">Hot Beer</a> se défende, même si je n'adhère absolument pas au format <em>webzine</em>). tmos travaille sur un pack Leed + greeder et sur l'intégration de Leed dans <a href="https://yunohost.org/">Yunohost</a>, qui devrait lui redonner un peu de fraîcheur.</p>
568
+
569
+
570
+<h2>Mais du coup, c'est quoi mon lecteur RSS idéal ?</h2>
571
+
572
+<h3>Rapidité, simplicité, fonctionnalité</h3>
573
+
574
+<p>Je met à jour mon lecteur RSS toutes les heures, et j'y passe donc quasiment une fois par heure. Je ne veux pas passer dix minutes à chaque fois pour réussir à cliquer sur le bon bouton, ou pour attendre que la page soit chargée.</p>
575
+
576
+<p>Il faut donc qu'il soit beau, intuitif (pour ça, Leed + greeder remplit bien ce rôle), rapide et fonctionnel. Le but est aussi de lire des articles, pas de voir défiler des titres, donc il faut que les articles soient affichés en entier (mais personnalisables <em>via</em> une option pour satisfaire tout le monde), sans avoir besoin de cliquer trois fois sur chaque article pour le lire.</p>
577
+
578
+<p>Je le regarde de partout, et beaucoup sur mon portable, dans les transports. Or, bien souvent, il n'y a pas de réseau dans les transports, et je ne veux pas d'une <a href="http://standblog.org/blog/post/2014/06/29/Web-Entrepreneur-Conference-videos-disponibles">énième app quand du HTML5 peut le faire</a>. Du coup, un thème responsive, des actions tactiles (comme Greeder, en plus étendu) et une utilisation du <em>local storage</em> et le tour est joué :)</p>
579
+
580
+<p>Toutes ces fonctionnalités (et celles qui vont suivre) peuvent paraître en contradiction avec « être léger, rapide et fonctionnel », mais si le script est suffisamment compartimenté, on peut ne charger que ce qui sera utile à l'affichage et conserver un grand nombre de fonctionnalités avancées, sans alourdir nécessairement le script (sauf dans le cas où tout serait activé en même temps).</p>
581
+
582
+
583
+<h3>Extensibilité et customisation</h3>
584
+
585
+<p>On ne peut pas faire un logiciel parfait, qui satisfasse tout le monde. Plutôt que d'opter pour le minimalisme et se priver ainsi de fonctions avancées, un système de plugins bien pensé me paraît mieux. Celui de Leed est bien pour ça, même s'il manque un peu de documentation. Idéalement, il faudrait même que les plugins et thèmes existants pour un des lecteurs RSS les plus répandu actuellement soient compatibles (mais là, je rêve je pense :).</p>
586
+
587
+<p>Quelques idées de plugins cools en vrac :</p>
588
+<ul>
589
+    <li>Recherche : très souvent je lis des articles, puis quelques jours plus tard je réalise que j'aurais du les garder de côté car j'en ai besoin. Sauf qu'à ce moment, je ne sais plus sur quel flux je l'ai lu, et c'est une galère de le retrouver. Un plugin de recherche sur l'agrégateur permet de résoudre ce problème.</li>
590
+    <li>Une implémentation de <a href="https://github.com/sebsauvage/rss-bridge">rss-bridge</a> pour le côté user-friendly.</li>
591
+    <li>Des plugins spécifiques par flux, pour afficher les conversations entre shaarli en tant que conversations par exemple.</li>
592
+    <li>Annotation de texte en direct pour noter rapidement des idées, des corrections de typo etc.</li>
593
+</ul>
594
+
595
+<p>Pour le côté user friendly et l'adoption par Mme Michu, il faudrait aussi une liste de plugins « officiels » (c'est-à-dire respectant les guidelines et donc compatibles) simple, à la wordpress. Il suffirait alors d'envoyer l'archive dans l'interface admin pour l'installer automatiquement.</p>
596
+
597
+<p>Idéalement, il faudrait des coding guidelines strictes, qui manquent sur les projets actuels. Notamment sur la façon d'écrire un thème ou sur les balises à utiliser dans un thème, afin de garantir la cohérence de l'interface et la rapidité du script. Leed par exemple, a un dépôt <a href="https://github.com/ldleman/Leed-market">market</a> très hétérogène, et des thèmes qui n'ont pas de base commune rendant très difficile l'implémentation de nouveau code sur plusieurs thèmes. Pire, certains plugins doivent être adaptés pour chaque thème, ce qui est une perte de temps considérable.</p>
598
+
599
+
600
+<h3>Une gestion fine des flux</h3>
601
+
602
+<p>Une autre fonctionnalité qui me paraît importante est de pouvoir gérer finement les flux, c'est-à-dire pouvoir prioriser, classer, trier et filtrer des flux très facilement.</p>
603
+
604
+<p>Un premier point est la gestion des doublons. Très souvent, il arrive d'avoir des articles similaires, sur le même sujet, voire même des articles tout simplement identiques, si certains flux se recoupent. Le premier cas est difficile à trier et à filtrer (même si idéalement ces articles devraient pouvoir être regroupés ensemble), mais le deuxième est très simple à filtrer. Les doublons devraient donc être masqués et gérés comme un seul et même article.</p>
605
+
606
+<p>Un autre point important est la présence du multi-utilisateur. Cela permet ainsi de ne charger qu'une seule fois les liens communs à plusieurs comptes, et d'accélerer le rafraîchissement des liens ainsi que d'alléger la charge des serveurs. Je vois deux cas d'utilisation importants : pouvoir avoir une seule instance pour tout une famille, et pouvoir avoir différents comptes par activité (un compte pro et un compte perso par exemple).</p>
607
+
608
+<p>D'autres fonctionnalités sympathiques sont proposées par certains lecteurs RSS, notamment la gestion de la priorité des flux, pour prioriser certains flux.</p>
609
+
610
+<p>Je pense aussi qu'il y a moyen de faire des trucs très sympas avec les dossiers, qui sont bien trop rigides comme fonctionnement (et que je n'utilise pas personnellement). Sûrement un système de tags, ou un système flexible par mot-clé. Mais je n'ai pas encore d'idées précises à apporter pour cette réflexion. N'hésitez pas à partager les votres :)</p>
611
+
612
+
613
+<h3>Transparence et protection de la vie privée</h3>
614
+
615
+<p>Un des principaux avantages de s'auto-héberger est d'avoir les contraintes de transparence, de sécurité et de protection de la vie privée qu'on se fixe, au lieu d'être dépendant d'une solution tierce sur ces points.</p>
616
+
617
+<p>Un lecteur RSS idéal, et toujours dans l'optique de l'utilisation par le plus grand nombre, devrait :</p>
618
+<dl>
619
+    <dt>afficher de manière claire les logs disponibles</dt>
620
+    <dd>on ne devrait jamais devoir aller chercher une information dans un obscur fichier de log écrit dans le répertoire du script, ou pire, dans les logs Apache. Au contraire, ces informations (historique de connexions, historiques de mise à jour, …) devraient être disponibles dans l'interface directement, de façon claire et compréhensible en un clin d'œil.</dd>
621
+
622
+    <dt>des statistiques claires</dt>
623
+    <dd>de même, une fonctionnalité absente de nombreux lecteurs RSS et qui me semble pourtant plutôt basique est la possibilité de voir en un clin d'œil quels sont les flux fréquemment mis à jour, quels sont les flux les plus actifs, les moins actifs, etc., ceci afin de pouvoir très facilement trier ses flux et supprimer les flux morts. Il m'est arrivé plusieurs fois d'avoir un flux qui a changé d'adresse, ou qui était momentanément indisponible, et de mettre plusieurs jours à m'en rendre compte, faute d'affichage clair comme "attention, le flux XXX n'a pas été mis à jour depuis N jours, alors qu'il avait une fréquence habituelle de M articles / jour"</dd>
624
+
625
+    <dt>régler finement les permissions</dt>
626
+    <dd>S'auto-héberger, c'est aussi pouvoir régler finement les fonctions avancées de ses logiciels. J'utilise intensivement la vue anonyme de Leed, pour ne pas avoir à me connecter à chaque visite, et car je trouve ça pratique de pouvoir voir les flux RSS que les autres suivent, on découvre bien souvent de nouveaux flux top comme ça. Mais sur la plupart des lecteurs actuels, soit tout est public, soit tout est privé. Or je ne veux pas forcément que <strong>tous</strong> mes flux soit publics. En particulier, certains flux liés à des services que j'utilise (mon Owncloud, par exemple) ne devraient pas être publics.</dd>
627
+
628
+    <dt>être compatible avec les autres outils libres à disposition</dt>
629
+    <dd>Enfin, même si je souhaite beaucoup de fonctions dans mon lecteur RSS, je ne veux pas qu'il devient un monstre polycéphal qui fait tout. Le libre a cela de merveilleux qu'il existe une infinité de petits outils qui font une seule petite tâche, mais la font très bien. Pourquoi implémenter aussi une gestion des favoris, quand Owncloud le propose, quand shaarli marche du tonerre et est de surcroît très simple à installer, etc. Il faut donc au contraire prévoir d'être compatible avec ces autres outils, pour que le libre soit cohérent. En particulier, owncloud propose un flux RSS accessible après authentification (POST) des "activités" sur le compte. Pratique pour suivre des dossiers partagés. Mais très peu de (si ce n'est aucun) lecteur RSS disponible ne gère cette authentification =(.</dd>
630
+
631
+    <dt>promouvoir la vie privée de l'utilisateur</dt>
632
+    <dd>En utilisant son propre lecteur RSS auto-hébergé, on a un contrôle total sur nos flux, et on ne divulgue pas d'informations non contrôlées à un tiers (typiquement l'hébergeur du lecteur RSS, qui pourra alors nous cibler plus finement). J'aimerais pouvoir retrouver ça dans mon lecteur avec un filtrage des liens feedburner par défaut, pour supprimer ces redirections et les remplacer par des liens directs, ainsi qu'un filtrage des publicités dans les flux, un peu à la manière des <a href="https://github.com/ldleman/Leed-market">plugins</a> urlclean et adblock pour Leed. Il pourrait aussi cacher le referer lors de l'ouverture d'un lien externe, etc. Il y a énormément de possibilités de ce côté.</dd>
633
+</dl>
634
+
635
+
636
+<h3>Toujours garder l'ergonomie en tête</h3>
637
+
638
+<p>L'ergonomie est sûrement un des points faibles des lecteurs RSS disponibles actuellement (et du logiciel libre ?). Elle est bien souvent négligée, et cela prive bon nombre d'utilisateurs d'utiliser les scripts en question.</p>
639
+
640
+<p>Pourtant, il y a moyen de faire beaucoup de choses, notamment en usant (abusant ?) de JavaScript et des fonctionnalités récentes (transitions CSS, HTML5 etc). Du drag&amp;drop s'implémente facilement, et facilite grandement l'utilisation pour beaucoup d'utilisateurs. Décrémenter un compteur d'éléments non lus en JavaScript chaque fois qu'on marque un élément comme lu prend 3 lignes de JavaScript et pourtant cela n'a été implémenté que récemment dans <a href="https://github.com/tmos/greeder/commit/446a521d240db62bc8350f54b31148429afeddb7">Greeder</a> et dans le thème par défaut de Leed.</p>
641
+
642
+<p>De plus, j'ai besoin d'une application web pour ne pas dépendre de l'ordinateur (ou du téléphone) que j'utilise. Que je sois sur mon téléphone, mon ordinateur ou n'importe quel autre périphérique, je retrouve mes news dans le même état, sans synchronisation compliquée, et sans développer un logiciel différent par périphérique. Le web est vraiment magique pour ça. Mais ce n'est pas pour autant que je ne veux pas que cette <em>webapp</em> se rapproche le plus possible d'une application native (qui sont bien souvent des <em>wrappers</em> autour d'une interface web, sur mobile, de toutes façons). Ainsi, sur mon portable, je veux retrouver des actions tactiles, un stockage en <em>local storage</em> car je risque d'être déconnecté sans raison, et une interface utilisable pleinement sans jouer avec le zoom. Et sur mon ordinateur, je veux pouvoir bénéficier d'une navigation au clavier, avec des raccourcis claviers, et de fonctionnalités avancées telles que le rafraîchissment régulier ou <a href="https://github.com/tmos/greeder/issues/71">la notification</a>, afin de se rapprocher le plus possible d'une application (et peut être un jour tourner dans sa propre instance du navigateur, pour ressembler vraiment à une application ?).</p>
643
+
644
+<p>Côté interface, celle-ci doit faciliter la lecture en mettant l'accent sur le contenu et les actions importantes. Il y a aussi beaucoup de boutons qui ont une fonction peu claire dans les scripts que j'ai pu voir : double négation dans les questions qui nous fait répondre « oui » quand on voulait dire « non », pas de rappel du nom du dossier quand on veut marquer tout un dossier comme lu (ce qui nous fait nous demander si on a bien cliqué sur le bon bouton)… D'autre part, quand je qualifiais les interfaces de « moches » au début de cet article, c'était bien souvent que l'interface était peu claire / paumatoire / clicodrôme.</p>
645
+
646
+<p>La mode est au <em>scroll</em> infini. C'est bien pratique quand on a une connexion permanente, mais dès que la connexion coupe, qu'on recharge la page, et qu'on se retrouve tout en haut, c'est nettement moins drôle. Du coup, vive la pagination, en gardant une option pour le <em>scroll</em> infini, pour ceux qui l'aiment particulièrement. Par contre, si le <em>local storage</em> est très largement utilisé, le <em>scroll</em> infini peut s'envisager, car la perte de connexion ne bloquera pas la page.</p>
647
+
648
+<p>Enfin, un dernier point essentiel à mon avis est la possibilité de se connecter automatiquement et d'avoir un <em>bookmarklet</em> efficace pour ajouter des flux (idéalement, une intégration directe avec le module d'abonnement de Firefox :). Leed a un bon <em>bookmarklet</em> mais la connexion automatique n'est arrivée que récemment. Et attention sur ce point, <a href="https://github.com/sebsauvage/Shaarli">Shaarli</a> a une connexion automatique erratique, qui a tendance à ne pas passer chez certains hébergeurs.</p>
649
+
650
+
651
+<h3><del>Paraître</del>Être sérieux</h3>
652
+
653
+<p>Trop de scripts de ce genre ont aussi des traductions approximatives, <em>monkey patchée</em> ou bourrées de fautes. L'inernationalisation est importante de nos jours et ne doit pas être négligée, surtout qu'elle est désormais facilitée par les outils disponibles et qu'elle n'est pas si problématique si pensée depuis le début. Faire un test sur les nombres à afficher pour afficher l'accord si besoin n'est pas très long, et il est possible de faire une fonction à appeler pour le faire à chaque fois. Ce n'est pas grand chose, mais c'est plus propre, plus beau et plus tentant. Une bonne traduction, une bonne licence, un code en anglais et des <em>coding guidelines</em> motiveront plus les gens pour écrire du code et faire des contributions.</p>
654
+
655
+<p>Il faut aussi avoir une sortie régulière de versions, quitte à sortir des versions rapprochées. Si toutes les nouvelles fonctions sont regroupées dans une branche <span class="monospace">dev</span> et regroupées dans une version stable une fois par an, Mme Michu ne verra qu'une version par an, et se dira donc que le développement est lent, même si chaque version apporte énormément de nouveautés. Au contraire, un dépôt avec des commits réguliers est plus attirant car on se dit que le logiciel vit, qu'il est suivi et qu'on n'aura donc pas à attendre longtemps si on rencontre un problème avec. Personnellement, si je rencontre un problème bloquant avec un logiciel et que celui-ci n'est pas résolu rapidement (en quelques semaines tout au plus), que je le veuile ou non, j'oublie l'existence de ce logiciel, je trouve des alternatives, et je retombe dessus par hasard quelques mois plus tard.</p>
656
+
657
+<p>De même, on ne peut pas tout développer, et on ne peut pas tout réinventer. Du coup, il devient important de virer les fonctionnalités inutiles, ou qui font doublon avec d'autres programmes, pour ne pas réinventer la roue et se consacrer sur les points essentiels pour le script.</p>
658
+
659
+
660
+<h3>Et tout cela… pour tous</h3>
661
+
662
+<p>Comme j'ai déjà insisté pas mal dessus, je reprendrais juste brièvement quelques points dans cette partie. Mais pour rester dans l'érgonomique et le beau, un tel script devrait être facile à installer, à configurer et à utiliser, par tous.</p>
663
+
664
+<p>Ceci passe par une interface user friendly, utilisant pleinement les fonctionnalités offertes par les navigateurs aujourd'hui (drag&amp;drop, AJAX, …). Ceci passe aussi par l'internationalisation, la présence d'une vraie liste d'extensions, facilement utilisable, une doc claire et à jour et un fonctionnement identique (dans la mesure du possible) sur la plupart des hébergements disponibles.</p>
665
+
666
+<p>Du côté de la licence, un tel lecteur RSS devrait être sous une licence libre (dans le sens de logiciel libre), ce qui n'est malheureusement pas le cas de Leed aujourd'hui (sous licence CC-BY-NC-SA), qui a d'ailleurs une licence ambiguë, déconseilleé pour les codes sources (voir <a href="http://freear.org.uk/content/creative-commons-licenses-software-just-say-no">ici</a> ou <a href="http://wiki.creativecommons.org/Frequently_Asked_Questions#Can_I_use_a_Creative_Commons_license_for_software.3F">ici</a>) et complexe comme le montre <a href="http://www.framablog.org/index.php/post/2012/10/15/non-commercial-creative-commons">cet article chez Framasoft</a>, un comble pour une licence qui se veut simple et intuitive. :)</p>
667
+
668
+<p>Enfin, un des principaux points est sûrement de pouvoir mettre à jour les flux facilement, sans y penser et sans intervention. Actuellement, la plupart des lecteurs nécessitent une intervention de l'utilisateur pour ajouter une <em>crontask</em>. C'est compliqué, source de problèmes, d'erreurs en recopiant etc, et ça complique l'installation pour pas mal de monde. Il y a sûrement moyen de rendre cela plus facile aussi, en tout cas ça serait top si c'était le cas. <a href="http://owncloud.org/">Owncloud</a> par exemple propose de lancer les tâches par AJAX, webcron ou cron, sans configuration de la part de l'utilisateur.</p>
669
+
670
+
671
+<h2>Conclusion</h2>
672
+
673
+<p>Aucun lecteur RSS ne me satisfait pleinement, mais Leed me paraît le moins imparfait à l'heure actuelle. En prenant des briques à gauche, à droite, on réunit la plupart des fonctions qui me paraissent importantes, mais je pense qu'il y a encore moyen de faire beaucoup pour s'affranchir des modèles classiques et établis de lecteurs RSS et proposer quelque chose d'innovant, misant sur l'ergonomie et s'adressant au plus grand nombre.</p>
674
+
675
+<p>Je vais essayer de mettre ça en pratique, en gardant en tête les points que je juge le plus important : facilité d'utilisation, ergonomie, beau et performant. Je ferai sûrement quelques articles sur des points spécifiques que je croiserai. Si vous me lisez et que vous avez un hébergement mutualisé, n'hésitez pas à me donner des infos sur votre hébergement PHP (version de PHP, modules disponibles qui sont trouvables dans le phpinfo notamment) car je ne sais pas exactement quelles sont les installations typiques de PHP sur mutualisé.</p>
676
+
677
+<p>Enfin, beaucoup de fonctionnalités seraient implémentées très facilement en utilisant les technos à la mode, nodejs ou les solutions à base de python par exemple. Mais cela oblige à se priver du côté « facilement installable par tous » car ces solutions ne sont pas disponibles sur la plupart des hébergeurs mutualisés. Ça semble aussi être un des problèmes de <a href="https://diasporafoundation.org/">Diaspora*</a> par exemple, car j'entends régulièrement qu'<a href="http://maniatux.fr/index.php?article473/diaspora-c-est-pas-pour-moi">installer son pod est compliqué</a>, notamment car Diaspora* utilise Ruby, C'est vrai, et si c'est pour utiliser un pod public, proposé par la communauté, beaucoup d'utilisateurs ne voient pas de réelles différences par rapport à Facebook,</p>
678
+
679
+		<footer><p class="date">Le 10/07/2014 à 17:24</p>
680
+		<p class="tags">Tags : <a href="//phyks.me/tags/Web.html">Web</a>, <a href="//phyks.me/tags/Libre.html">Libre</a>, <a href="//phyks.me/tags/Autohébergement.html">Autohébergement</a></p></footer>
681
+	</div>
682
+</article>
683
+<article>
684
+	<aside>
685
+		<p class="day">02</p>
686
+		<p class="month">Juillet</p>
687
+	</aside>
688
+	<div class="article">
689
+		<header><h1 class="article_title"><a href="//phyks.me/2014/07/astuces_arduino.html">Quelques astuces pour Arduino</a></h1></header>
690
+		<!--
691
+	@author=Phyks
692
+	@date=02072014-2215
693
+	@title=Quelques astuces pour Arduino
694
+	@tags=DIY, Électronique
695
+-->
696
+<p>Voici astuces en vrac pour Arduino que j'ai découvertes ces derniers jours, en codant pour <a href="http://citizenwatt.paris/">CitizenWatt</a> et en particulier pour le <a href="https://github.com/CitoyensCapteurs/CitizenWatt-sensor">capteur</a>.</p>
697
+
698
+<h2>Stocker des données en Flash</h2>
699
+
700
+<p>Il peut arriver d'avoir pas mal de données statiques dans un programme et donc d'arriver à court de RAM disponible (2ko sur un ATMega 328p / Arduino Uno). Et quand ça arrive, c'est le drame (typiquement, le Serial se mettait à faire n'importe quoi dans mon cas)…</p>
701
+
702
+<p>Par exemple, à chaque appel de <span class="monospace">Serial.println("Quelque chose");</span>, la chaîne de caractères <span class="monospace">"Quelque chose"</span> est chargée en RAM. Du coup, sur un code assez long, avec pas mal d'affichage verbeux sur la liaison série, on sature vite la RAM.</p>
703
+
704
+<p>Qu'à cela ne tienne, il est possible de stocker la chaîne dans la Flash et de la charger directement depuis la Flash. Avant, c'était compliqué, il fallait utiliser <span class="monospace">PROGMEM</span>, mais depuis la version 1.0 de l'IDE, il suffit d'entourer la chaîne de <span class="monospace">F()</span>, par exemple <span class="monospace">Serial.println(F("Quelque chose"));</span>. <a href="http://playground.arduino.cc/Learning/Memory">Source</a></p>
705
+
706
+<p>Et au passage, <a href="http://playground.arduino.cc/Code/AvailableMemory">un petit bout de code</a> pour savoir combien il reste de RAM disponible.</p>
707
+
708
+
709
+<h2>Les préférences de l'IDE</h2>
710
+
711
+<p>Je n'avais jamais été faire un tour dans les préférences de l'IDE non plus, principalement par flemme. Qu'à cela ne tienne, c'est désormais chose faite, et j'y ai croisé quelques options vraiment vitales.</p>
712
+
713
+<p>En particulier, <span class="monospace">Afficher les résultats détaillés pendant compilation</span> qui permettra d'avoir un <em>output</em> plus verbeux pendant la compilation.</p>
714
+
715
+<p>Mais la vraie révélation de cette soirée, c'est l'option <span class="monospace">Utiliser un éditeur externe</span>. Vous ne supportez plus l'éditeur Arduino et son indentation pourrie, ses fonctionnalités dignes de <span class="monospace">notepad</span> premier du nom et son non affichage des numéros de ligne (à part en bas dans un petit coin, inutilisable au possible pour débugger efficacement), cette option est faite pour vous ! En l'activant, Arduino ne lira plus le fichier. Vous pouvez l'éditer comme vous voulez dans un éditeur externe (Vim &lt;3) et au moment d'<em>uploader</em> le code, l'IDE Arduino ira relire le fichier, le compiler et l'<em>uploader</em>.</p>
716
+
717
+		<footer><p class="date">Le 02/07/2014 à 22:15</p>
718
+		<p class="tags">Tags : <a href="//phyks.me/tags/DIY.html">DIY</a>, <a href="//phyks.me/tags/Électronique.html">Électronique</a></p></footer>
719
+	</div>
720
+</article>
128 721
             </div>
129 722
             <footer id="rss">
130 723
                 <p><a href="//phyks.me/rss.xml"><img src="//phyks.me/img/rss.png" alt="RSS"/></a></p>

+ 2
- 1
blog/index.html View File

@@ -851,10 +851,11 @@ Un important et un petit ajout à votre projet.</p>
851 851
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
852 852
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
853 853
 if !empty(glob(git_vimrc))
854
-    exec ":source " . git_vimrc
854
+    sandbox exec ":source " . git_vimrc
855 855
 endif
856 856
 </pre>
857 857
 </code>
858
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
858 859
 
859 860
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
860 861
 

+ 28
- 103
blog/rss.xml View File

@@ -7,16 +7,12 @@
7 7
 		<language>fr</language>
8 8
 		<copyright>CC BY</copyright>
9 9
 		<webMaster>webmaster@phyks.me (Phyks)</webMaster>
10
-		<lastBuildDate>Mon, 05 Jan 2015 15:37:43 -0000</lastBuildDate>
10
+		<lastBuildDate>Tue, 06 Jan 2015 20:59:10 -0000</lastBuildDate>
11 11
 		<item>
12 12
 			<title>Thoughts on blogging engine</title>
13 13
 			<link>http://phyks.me/2015/01/known.html</link>
14 14
 			<guid isPermaLink="true">http://phyks.me/2015/01/known.html</guid>
15
-			<description>
16
-
17
-
18
-
19
-For now, I am using my own custom made Python script to handle my static blog with a Git backend, Blogi…</description>
15
+			<description>For now, I am using my own custom made Python script to handle my static blog with a Git backend, Blogi…</description>
20 16
 			<content:encoded><![CDATA[<div class="article">
21 17
 <header></header>
22 18
 <!-- 
@@ -49,11 +45,7 @@ For now, I am using my own custom made Python script to handle my static blog wi
49 45
 			<title>Versionner ses fichiers de configuration avec vcsh</title>
50 46
 			<link>http://phyks.me/2015/01/vcsh.html</link>
51 47
 			<guid isPermaLink="true">http://phyks.me/2015/01/vcsh.html</guid>
52
-			<description>
53
-
54
-
55
-
56
-Je viens de découvrir un petit outil fort pratique pour versionner ses fichiers de configuration avec Git : vcs…</description>
48
+			<description>Je viens de découvrir un petit outil fort pratique pour versionner ses fichiers de configuration avec Git : vcs…</description>
57 49
 			<content:encoded><![CDATA[<div class="article">
58 50
 <header></header>
59 51
 <!-- 
@@ -82,11 +74,7 @@ Je viens de découvrir un petit outil fort pratique pour versionner ses fichiers
82 74
 			<title>Gestion d'articles scientifiques avec BMC</title>
83 75
 			<link>http://phyks.me/2015/01/bmc.html</link>
84 76
 			<guid isPermaLink="true">http://phyks.me/2015/01/bmc.html</guid>
85
-			<description>
86
-
87
-
88
-
89
-Lorsqu'on fait de la recherche scientifique (ou de la veille), on est très vite amener à stocker de très nombreux articles en PDF…</description>
77
+			<description>Lorsqu'on fait de la recherche scientifique (ou de la veille), on est très vite amener à stocker de très nombreux articles en PDF…</description>
90 78
 			<content:encoded><![CDATA[<div class="article">
91 79
 <header></header>
92 80
 <!-- 
@@ -129,11 +117,7 @@ Lorsqu'on fait de la recherche scientifique (ou de la veille), on est très vite
129 117
 			<title>Getting ipv6 to work with a Kimsufi server</title>
130 118
 			<link>http://phyks.me/2014/11/ipv6_kimsufi.html</link>
131 119
 			<guid isPermaLink="true">http://phyks.me/2014/11/ipv6_kimsufi.html</guid>
132
-			<description>
133
-
134
-
135
-
136
-Starting from yesterday, my server (phyks.me) should be available using ipv6. This was not the case before due to laziness and a lack of configuratio…</description>
120
+			<description>Starting from yesterday, my server (phyks.me) should be available using ipv6. This was not the case before due to laziness and a lack of configuratio…</description>
137 121
 			<content:encoded><![CDATA[<div class="article">
138 122
 <header></header>
139 123
 <!-- 
@@ -166,11 +150,7 @@ Starting from yesterday, my server (phyks.me) should be available using ipv6. Th
166 150
 			<title>Proof-of-concept: BloomySearch, a (JavaScript) client-side search engine for static websites</title>
167 151
 			<link>http://phyks.me/2014/11/bloomysearch.html</link>
168 152
 			<guid isPermaLink="true">http://phyks.me/2014/11/bloomysearch.html</guid>
169
-			<description>
170
-
171
-
172
-
173
-Overview
153
+			<description>Overview
174 154
 Many websites and blogs are statically generated and the webserver only serves static file…</description>
175 155
 			<content:encoded><![CDATA[<div class="article">
176 156
 <header></header>
@@ -225,11 +205,7 @@ Many websites and blogs are statically generated and the webserver only serves s
225 205
 			<title>Balancer le son de ses hauts-parleurs sur le réseau</title>
226 206
 			<link>http://phyks.me/2014/10/pulseaudio_remote.html</link>
227 207
 			<guid isPermaLink="true">http://phyks.me/2014/10/pulseaudio_remote.html</guid>
228
-			<description>
229
-
230
-
231
-
232
-J'ai un PC fixe et un portable, et je cherchais un moyen de balancer le son de mon portable sur les hauts-parleurs de bonne qualité branchés sur mon PC fixe, quand je suis sur le même résea…</description>
208
+			<description>J'ai un PC fixe et un portable, et je cherchais un moyen de balancer le son de mon portable sur les hauts-parleurs de bonne qualité branchés sur mon PC fixe, quand je suis sur le même résea…</description>
233 209
 			<content:encoded><![CDATA[<div class="article">
234 210
 <header></header>
235 211
 <!-- 
@@ -264,11 +240,7 @@ J'ai un PC fixe et un portable, et je cherchais un moyen de balancer le son de m
264 240
 			<title>Utiliser son PC sous Arch pour connecter un Raspberry Pi à Internet</title>
265 241
 			<link>http://phyks.me/2014/10/dhcp_server.html</link>
266 242
 			<guid isPermaLink="true">http://phyks.me/2014/10/dhcp_server.html</guid>
267
-			<description>
268
-
269
-
270
-
271
-J'ai un Raspberry Pi et mon portable sous Arch Linux, et je me promène pas mal avec les deux. Mais je n'ai pas toujours de routeur à disposition pour brancher les deux sur le même réseau et travailler facilemen…</description>
243
+			<description>J'ai un Raspberry Pi et mon portable sous Arch Linux, et je me promène pas mal avec les deux. Mais je n'ai pas toujours de routeur à disposition pour brancher les deux sur le même réseau et travailler facilemen…</description>
272 244
 			<content:encoded><![CDATA[<div class="article">
273 245
 <header></header>
274 246
 <!-- 
@@ -335,11 +307,7 @@ iptables -A POSTROUTING -t nat -j MASQUERADE
335 307
 			<title>Sortez vos emails, c'est pas sale !</title>
336 308
 			<link>http://phyks.me/2014/08/sortez_vos_emails.html</link>
337 309
 			<guid isPermaLink="true">http://phyks.me/2014/08/sortez_vos_emails.html</guid>
338
-			<description>
339
-
340
-
341
-
342
-TLDR in English : If you care about your scripts, if you love them and want them to be used, to live, leave a simple way to contact you (…</description>
310
+			<description>TLDR in English : If you care about your scripts, if you love them and want them to be used, to live, leave a simple way to contact you (…</description>
343 311
 			<content:encoded><![CDATA[<div class="article">
344 312
 <header></header>
345 313
 <!-- 
@@ -387,11 +355,7 @@ TLDR in English : If you care about your scripts, if you love them and want the
387 355
 			<title>Synchroniser ses ordinateurs 1/2</title>
388 356
 			<link>http://phyks.me/2014/08/synchronisation_backups_1.html</link>
389 357
 			<guid isPermaLink="true">http://phyks.me/2014/08/synchronisation_backups_1.html</guid>
390
-			<description>
391
-
392
-
393
-
394
-Étude des solutions disponibles
358
+			<description>Étude des solutions disponibles
395 359
 J'utilise quotidiennement au moins 2 ordinateurs : mon ordinateur portable et mon fix…</description>
396 360
 			<content:encoded><![CDATA[<div class="article">
397 361
 <header></header>
@@ -486,11 +450,7 @@ J'utilise quotidiennement au moins 2 ordinateurs : mon ordinateur portable et m
486 450
 			<title>Les énigmes du réseau Free Mobile</title>
487 451
 			<link>http://phyks.me/2014/08/free_mobile_fluctuant.html</link>
488 452
 			<guid isPermaLink="true">http://phyks.me/2014/08/free_mobile_fluctuant.html</guid>
489
-			<description>
490
-
491
-
492
-
493
-C'est très étrange… Là où je suis, la connexion SSH est toujours utilisable (avec un lag important rendant très insupportable toute édition de fichiers, mais Weechat over SSH est utilisable), mais le débit sur le port 80 est très fluctuan…</description>
453
+			<description>C'est très étrange… Là où je suis, la connexion SSH est toujours utilisable (avec un lag important rendant très insupportable toute édition de fichiers, mais Weechat over SSH est utilisable), mais le débit sur le port 80 est très fluctuan…</description>
494 454
 			<content:encoded><![CDATA[<div class="article">
495 455
 <header></header>
496 456
 <!--
@@ -516,11 +476,7 @@ C'est très étrange… Là où je suis, la connexion SSH est toujours utilisabl
516 476
 			<title>Recevoir ses emails par SMS avec Free Mobile</title>
517 477
 			<link>http://phyks.me/2014/07/notification_sms_free.html</link>
518 478
 			<guid isPermaLink="true">http://phyks.me/2014/07/notification_sms_free.html</guid>
519
-			<description>
520
-
521
-
522
-
523
-Edit : Cela fait bientôt une semaine que l'API Free me renvoie un 402, en boucle… je ne peux plus envoyer de SMS depuis l'AP…</description>
479
+			<description>Edit : Cela fait bientôt une semaine que l'API Free me renvoie un 402, en boucle… je ne peux plus envoyer de SMS depuis l'AP…</description>
524 480
 			<content:encoded><![CDATA[<div class="article">
525 481
 <header></header>
526 482
 <!-- 
@@ -552,11 +508,7 @@ Edit : Cela fait bientôt une semaine que l'API Free me renvoie un 402, en bouc
552 508
 			<title>Diaspora*, c'est quand même pas pour tout le monde</title>
553 509
 			<link>http://phyks.me/2014/07/diaspora_pas_pour_tout_monde.html</link>
554 510
 			<guid isPermaLink="true">http://phyks.me/2014/07/diaspora_pas_pour_tout_monde.html</guid>
555
-			<description>
556
-
557
-
558
-
559
-Ça faisait quelques mois que je disais que j'allais m'héberger une instance de Diaspora* (un pod comme ça s'appelle…</description>
511
+			<description>Ça faisait quelques mois que je disais que j'allais m'héberger une instance de Diaspora* (un pod comme ça s'appelle…</description>
560 512
 			<content:encoded><![CDATA[<div class="article">
561 513
 <header></header>
562 514
 <!--
@@ -613,11 +565,7 @@ Edit : Cela fait bientôt une semaine que l'API Free me renvoie un 402, en bouc
613 565
 			<title>Lister des corrections en ligne</title>
614 566
 			<link>http://phyks.me/2014/07/inline_diff.html</link>
615 567
 			<guid isPermaLink="true">http://phyks.me/2014/07/inline_diff.html</guid>
616
-			<description>
617
-
618
-
619
-
620
-Il m'arrive souvent de corriger des documents textes et de devoir noter facilement les fautes d'orthograph…</description>
568
+			<description>Il m'arrive souvent de corriger des documents textes et de devoir noter facilement les fautes d'orthograph…</description>
621 569
 			<content:encoded><![CDATA[<div class="article">
622 570
 <header></header>
623 571
 <!--
@@ -695,7 +643,11 @@ Si on utilise <span class="monospace">technique(+s)</span>, c'est la première q
695 643
         <blockquote>Dans ce texte, les sont mots inversés.</blockquote>
696 644
         Moyennant une implémentation un peu plus large de l'algorithme, on pourrait utiliser la méthode précédente comme ceci, pour corriger cette phrase:
697 645
         <pre>les (-sont) mots (+sont)</pre>
698
-        car rien n'interdit à un mot d'être entièrement supprimé ou ajouté.</li></ul></div>]]></content:encoded>
646
+        car rien n'interdit à un mot d'être entièrement supprimé ou ajouté.
647
+</li></ul>
648
+<footer>
649
+<p class="tags">Tags : <a href="http://phyks.me/tags/Dev.html">Dev</a></p></footer>
650
+</div>]]></content:encoded>
699 651
 			<pubDate>Thu, 24 Jul 2014 19:35:00 -0000</pubDate>
700 652
 			<category>Dev</category>
701 653
 			<author>webmaster@phyks.me (Phyks)</author>
@@ -704,11 +656,7 @@ Si on utilise <span class="monospace">technique(+s)</span>, c'est la première q
704 656
 			<title>Pourquoi la GPL n'est pas (si) libre</title>
705 657
 			<link>http://phyks.me/2014/07/pourquoi_gpl_pas_libre.html</link>
706 658
 			<guid isPermaLink="true">http://phyks.me/2014/07/pourquoi_gpl_pas_libre.html</guid>
707
-			<description>
708
-
709
-
710
-
711
-Cet article est une traduction (dont je ne garantis pas la qualité :) de cet article (en anglais…</description>
659
+			<description>Cet article est une traduction (dont je ne garantis pas la qualité :) de cet article (en anglais). Je n'ai pas réussi à contacter l'auteur, et si celui-ci passe par là et souhaite le retrait de la traduction, je la retirera…</description>
712 660
 			<content:encoded><![CDATA[<div class="article">
713 661
 <header></header>
714 662
 <!--
@@ -762,11 +710,7 @@ Un important et un petit ajout à votre projet.</p>
762 710
 			<title>Documenter son code PHP avec doxygen</title>
763 711
 			<link>http://phyks.me/2014/07/doxygen_php.html</link>
764 712
 			<guid isPermaLink="true">http://phyks.me/2014/07/doxygen_php.html</guid>
765
-			<description>
766
-
767
-
768
-
769
-Je cherchais hier un moyen de générer une belle doc PHP, à partir de mes fichiers sources. Je connaissais quelques outils de la sorte (OcamlDoc, Sphinx pour Python, JavaDoc et…</description>
713
+			<description>Je cherchais hier un moyen de générer une belle doc PHP, à partir de mes fichiers sources. Je connaissais quelques outils de la sorte (OcamlDoc, Sphinx pour Python, JavaDoc et…</description>
770 714
 			<content:encoded><![CDATA[<div class="article">
771 715
 <header></header>
772 716
 <!--
@@ -800,11 +744,7 @@ Je cherchais hier un moyen de générer une belle doc PHP, à partir de mes fich
800 744
 			<title>Specific Vim config per Git repository</title>
801 745
 			<link>http://phyks.me/2014/07/specific_vim_config_git.html</link>
802 746
 			<guid isPermaLink="true">http://phyks.me/2014/07/specific_vim_config_git.html</guid>
803
-			<description>
804
-
805
-
806
-
807
-I was looking for a way to add custom vim options on a per-repo basis. The standard way I saw for now, was adding some comments to change the Vim config on a per-file basi…</description>
747
+			<description>I was looking for a way to add custom vim options on a per-repo basis. The standard way I saw for now, was adding some comments to change the Vim config on a per-file basi…</description>
808 748
 			<content:encoded><![CDATA[<div class="article">
809 749
 <header></header>
810 750
 <!--
@@ -822,10 +762,11 @@ I was looking for a way to add custom vim options on a per-repo basis. The stand
822 762
 let git_path = system("git rev-parse --show-toplevel 2&gt;/dev/null")
823 763
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
824 764
 if !empty(glob(git_vimrc))
825
-    exec ":source " . git_vimrc
765
+    sandbox exec ":source " . git_vimrc
826 766
 endif
827 767
 </pre>
828 768
 </code>
769
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
829 770
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
830 771
 <footer>
831 772
 <p class="tags">Tags : <a href="http://phyks.me/tags/Linux.html">Linux</a>, <a href="http://phyks.me/tags/Vim.html">Vim</a></p></footer>
@@ -839,11 +780,7 @@ endif
839 780
 			<title>Quick and dirty benchmark of RSS/ATOM parsing libs</title>
840 781
 			<link>http://phyks.me/2014/07/benchmark_rss.html</link>
841 782
 			<guid isPermaLink="true">http://phyks.me/2014/07/benchmark_rss.html</guid>
842
-			<description>
843
-
844
-
845
-
846
-EDIT: I just realized that the PHP function microtime does not return what I expected. This does not change much the results (to compare the solutions) but change the unit…</description>
783
+			<description>EDIT: I just realized that the PHP function microtime does not return what I expected. This does not change much the results (to compare the solutions) but change the unit…</description>
847 784
 			<content:encoded><![CDATA[<div class="article">
848 785
 <header></header>
849 786
 <!--
@@ -908,11 +845,7 @@ EDIT: I just realized that the PHP function microtime does not return what I exp
908 845
 			<title>Mon lecteur RSS idéal</title>
909 846
 			<link>http://phyks.me/2014/07/lecteur_rss_ideal.html</link>
910 847
 			<guid isPermaLink="true">http://phyks.me/2014/07/lecteur_rss_ideal.html</guid>
911
-			<description>
912
-
913
-
914
-
915
-EDIT : J'ai repris quelque peu le commentaire de FreshRSS, après discussion avec son auteur. J'avais raté certaines options en particulie…</description>
848
+			<description>EDIT : J'ai repris quelque peu le commentaire de FreshRSS, après discussion avec son auteur. J'avais raté certaines options en particulie…</description>
916 849
 			<content:encoded><![CDATA[<div class="article">
917 850
 <header></header>
918 851
 <!--
@@ -1026,11 +959,7 @@ EDIT : J'ai repris quelque peu le commentaire de FreshRSS, après discussion ave
1026 959
 			<title>Quelques astuces pour Arduino</title>
1027 960
 			<link>http://phyks.me/2014/07/astuces_arduino.html</link>
1028 961
 			<guid isPermaLink="true">http://phyks.me/2014/07/astuces_arduino.html</guid>
1029
-			<description>
1030
-
1031
-
1032
-
1033
-Voici astuces en vrac pour Arduino que j'ai découvertes ces derniers jours, en codant pour CitizenWatt et en particulier pour le capteu…</description>
962
+			<description>Voici astuces en vrac pour Arduino que j'ai découvertes ces derniers jours, en codant pour CitizenWatt et en particulier pour le capteu…</description>
1034 963
 			<content:encoded><![CDATA[<div class="article">
1035 964
 <header></header>
1036 965
 <!--
@@ -1061,11 +990,7 @@ Voici astuces en vrac pour Arduino que j'ai découvertes ces derniers jours, en
1061 990
 			<title>Viens faire mon hackathon avec plein de CC dedans</title>
1062 991
 			<link>http://phyks.me/2014/04/hackathon_cc.html</link>
1063 992
 			<guid isPermaLink="true">http://phyks.me/2014/04/hackathon_cc.html</guid>
1064
-			<description>
1065
-
1066
-
1067
-
1068
-J'ai reçu aujourd'hui une pub pour hack4france, un « hackathon 100% made in France ». On passera sur le hackathon made in France avec du bon anglais de partout (et oui, aussi surprenant que ça puisse paraître, hack4France, c'est pas du français, en bon français, ça donnerait « hack pour la France », tout de suite moins in), sur les récompenses et sur les APIs proposées pour regarder la FAQ et le règlement qui devraient faire hurler tout défenseur des licences libre…</description>
993
+			<description>J'ai reçu aujourd'hui une pub pour hack4france, un « hackathon 100% made in France ». On passera sur le hackathon made in France avec du bon anglais de partout (et oui, aussi surprenant que ça puisse paraître, hack4France, c'est pas du français, en bon français, ça donnerait « hack pour la France », tout de suite moins in), sur les récompenses et sur les APIs proposées pour regarder la FAQ et le règlement qui devraient faire hurler tout défenseur des licences libre…</description>
1069 994
 			<content:encoded><![CDATA[<div class="article">
1070 995
 <header></header>
1071 996
 <!--

+ 16
- 8
blog/tags/Linux.html View File

@@ -1572,10 +1572,11 @@ iptables -A POSTROUTING -t nat -j MASQUERADE
1572 1572
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1573 1573
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1574 1574
 if !empty(glob(git_vimrc))
1575
-    exec ":source " . git_vimrc
1575
+    sandbox exec ":source " . git_vimrc
1576 1576
 endif
1577 1577
 </pre>
1578 1578
 </code>
1579
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1579 1580
 
1580 1581
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1581 1582
 
@@ -1608,10 +1609,11 @@ endif
1608 1609
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1609 1610
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1610 1611
 if !empty(glob(git_vimrc))
1611
-    exec ":source " . git_vimrc
1612
+    sandbox exec ":source " . git_vimrc
1612 1613
 endif
1613 1614
 </pre>
1614 1615
 </code>
1616
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1615 1617
 
1616 1618
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1617 1619
 
@@ -1644,10 +1646,11 @@ endif
1644 1646
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1645 1647
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1646 1648
 if !empty(glob(git_vimrc))
1647
-    exec ":source " . git_vimrc
1649
+    sandbox exec ":source " . git_vimrc
1648 1650
 endif
1649 1651
 </pre>
1650 1652
 </code>
1653
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1651 1654
 
1652 1655
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1653 1656
 
@@ -1680,10 +1683,11 @@ endif
1680 1683
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1681 1684
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1682 1685
 if !empty(glob(git_vimrc))
1683
-    exec ":source " . git_vimrc
1686
+    sandbox exec ":source " . git_vimrc
1684 1687
 endif
1685 1688
 </pre>
1686 1689
 </code>
1690
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1687 1691
 
1688 1692
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1689 1693
 
@@ -1716,10 +1720,11 @@ endif
1716 1720
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1717 1721
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1718 1722
 if !empty(glob(git_vimrc))
1719
-    exec ":source " . git_vimrc
1723
+    sandbox exec ":source " . git_vimrc
1720 1724
 endif
1721 1725
 </pre>
1722 1726
 </code>
1727
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1723 1728
 
1724 1729
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1725 1730
 
@@ -1752,10 +1757,11 @@ endif
1752 1757
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1753 1758
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1754 1759
 if !empty(glob(git_vimrc))
1755
-    exec ":source " . git_vimrc
1760
+    sandbox exec ":source " . git_vimrc
1756 1761
 endif
1757 1762
 </pre>
1758 1763
 </code>
1764
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1759 1765
 
1760 1766
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1761 1767
 
@@ -1788,10 +1794,11 @@ endif
1788 1794
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1789 1795
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1790 1796
 if !empty(glob(git_vimrc))
1791
-    exec ":source " . git_vimrc
1797
+    sandbox exec ":source " . git_vimrc
1792 1798
 endif
1793 1799
 </pre>
1794 1800
 </code>
1801
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1795 1802
 
1796 1803
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1797 1804
 
@@ -1824,10 +1831,11 @@ endif
1824 1831
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
1825 1832
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
1826 1833
 if !empty(glob(git_vimrc))
1827
-    exec ":source " . git_vimrc
1834
+    sandbox exec ":source " . git_vimrc
1828 1835
 endif
1829 1836
 </pre>
1830 1837
 </code>
1838
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
1831 1839
 
1832 1840
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
1833 1841
 

+ 16
- 8
blog/tags/Vim.html View File

@@ -68,10 +68,11 @@
68 68
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
69 69
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
70 70
 if !empty(glob(git_vimrc))
71
-    exec ":source " . git_vimrc
71
+    sandbox exec ":source " . git_vimrc
72 72
 endif
73 73
 </pre>
74 74
 </code>
75
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
75 76
 
76 77
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
77 78
 
@@ -104,10 +105,11 @@ endif
104 105
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
105 106
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
106 107
 if !empty(glob(git_vimrc))
107
-    exec ":source " . git_vimrc
108
+    sandbox exec ":source " . git_vimrc
108 109
 endif
109 110
 </pre>
110 111
 </code>
112
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
111 113
 
112 114
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
113 115
 
@@ -140,10 +142,11 @@ endif
140 142
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
141 143
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
142 144
 if !empty(glob(git_vimrc))
143
-    exec ":source " . git_vimrc
145
+    sandbox exec ":source " . git_vimrc
144 146
 endif
145 147
 </pre>
146 148
 </code>
149
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
147 150
 
148 151
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
149 152
 
@@ -176,10 +179,11 @@ endif
176 179
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
177 180
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
178 181
 if !empty(glob(git_vimrc))
179
-    exec ":source " . git_vimrc
182
+    sandbox exec ":source " . git_vimrc
180 183
 endif
181 184
 </pre>
182 185
 </code>
186
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
183 187
 
184 188
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
185 189
 
@@ -212,10 +216,11 @@ endif
212 216
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
213 217
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
214 218
 if !empty(glob(git_vimrc))
215
-    exec ":source " . git_vimrc
219
+    sandbox exec ":source " . git_vimrc
216 220
 endif
217 221
 </pre>
218 222
 </code>
223
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
219 224
 
220 225
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
221 226
 
@@ -248,10 +253,11 @@ endif
248 253
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
249 254
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
250 255
 if !empty(glob(git_vimrc))
251
-    exec ":source " . git_vimrc
256
+    sandbox exec ":source " . git_vimrc
252 257
 endif
253 258
 </pre>
254 259
 </code>
260
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
255 261
 
256 262
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
257 263
 
@@ -284,10 +290,11 @@ endif
284 290
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
285 291
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
286 292
 if !empty(glob(git_vimrc))
287
-    exec ":source " . git_vimrc
293
+    sandbox exec ":source " . git_vimrc
288 294
 endif
289 295
 </pre>
290 296
 </code>
297
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
291 298
 
292 299
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
293 300
 
@@ -320,10 +327,11 @@ endif
320 327
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
321 328
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
322 329
 if !empty(glob(git_vimrc))
323
-    exec ":source " . git_vimrc
330
+    sandbox exec ":source " . git_vimrc
324 331
 endif
325 332
 </pre>
326 333
 </code>
334
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
327 335
 
328 336
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
329 337
 

+ 2
- 1
gen/2014/07/specific_vim_config_git.gen View File

@@ -23,10 +23,11 @@
23 23
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
24 24
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
25 25
 if !empty(glob(git_vimrc))
26
-    exec ":source " . git_vimrc
26
+    sandbox exec ":source " . git_vimrc
27 27
 endif
28 28
 </pre>
29 29
 </code>
30
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
30 31
 
31 32
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>
32 33
 

+ 2
- 1
raw/2014/07/specific_vim_config_git.html View File

@@ -16,9 +16,10 @@
16 16
 let git_path = system("git rev-parse --show-toplevel 2>/dev/null")
17 17
 let git_vimrc = substitute(git_path, '\n', '', '') . "/.vimrc"
18 18
 if !empty(glob(git_vimrc))
19
-    exec ":source " . git_vimrc
19
+    sandbox exec ":source " . git_vimrc
20 20
 endif
21 21
 </pre>
22 22
 </code>
23
+<p>Note: I use sandbox to prevent arbitrary functions from being executed.</p>
23 24
 
24 25
 <p>This small code, added at the end of your <span class="monospace">.vimrc</span> will just look for a <span class="monospace">.vimrc</span> at the root the git repository and source it if possible. That's exactly what I wanted :)</p>