Browse Source

Article on privoxy on raspberry pi

Phyks (Lucas Verney) 2 years ago
parent
commit
80c328eb41
No known key found for this signature in database

+ 353
- 0
blog/2017/04/index.html View File

@@ -0,0 +1,353 @@
1
+<!DOCTYPE html>
2
+<html lang="fr">
3
+    <head>
4
+        <meta charset="utf-8">
5
+        <title>Phyks' blog - 2017/04</title>
6
+		<link rel="stylesheet" href="//phyks.me/design.css"/>
7
+        <link type="text/plain" rel="author" href="//phyks.me/humans.txt"/>
8
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
+        <link rel="alternate" type="application/rss+xml" title="RSS" href="//phyks.me/rss.xml" />
10
+    </head>
11
+    <body>
12
+        <div id="wrapper">
13
+            <!-- Sidebar -->
14
+                <aside id="sidebar-wrapper">
15
+                    <header><h1><a href="//phyks.me">~Phyks</a></h1></header>
16
+
17
+                    <h2>Catégories</h2>
18
+                        <nav id="sidebar-tags">
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
20
+                        </nav>
21
+
22
+                    <h2>Derniers articles</h2>
23
+                        <ul id="sidebar-articles">
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25
+                        </ul>
26
+
27
+                    <h2>Liens</h2>
28
+                        <ul id="sidebar-links">
29
+                            <li><a href="//phyks.me/contact.html" title="Contact">Me contacter</a></li>
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/" rel="me" title="Github">Mon Github</a></li>
32
+                            <li><a href="//phyks.me/divers.html" title="Divers">Divers</a></li>
33
+                        </ul>
34
+                </aside>
35
+
36
+            <!-- Page content -->
37
+                <header id="header">
38
+                    <h1><a href="//phyks.me">~Phyks</a></h1>
39
+                </header>
40
+
41
+                <div id="note_responsive">
42
+                    <p><em>Note</em> : Cliquez sur la bande bleue à gauche pour faire apparaître le menu.</p>
43
+                </div>
44
+
45
+                <div id="articles">
46
+<article>
47
+	<aside>
48
+		<p class="day">04</p>
49
+		<p class="month">Avril</p>
50
+	</aside>
51
+	<div class="article">
52
+		<header><h1 class="article_title"><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></h1></header>
53
+		<!-- 
54
+    @author=Phyks
55
+    @date=04042917-1916
56
+    @title=Filtering ads with your Raspberry Pi
57
+    @tags=RaspberryPi
58
+-->
59
+
60
+<p>TL;DR: Please have a look at the benchmark section below, to be aware of the 
61
+limitations of this particular setup and decide whether to spend some time 
62
+putting it in place or not.</p>
63
+<p>I recently came across <a href="https://github.com/pi-hole/pi-hole">this Pi-Hole 
64
+project</a> that claims to be "a black hole 
65
+for Internet advertisements" (thanks <a href="https://nicofrand.eu/">nicofrand</a> for 
66
+making me discover this!). The idea was really attractive: having a simple 
67
+Raspberry Pi on the network doing all the ad filtering for the whole network, 
68
+rather than having to maintain a separate <a href="https://github.com/gorhill/uBlock">uBlock 
69
+Origin</a> install on each and every computers 
70
+of the network. It was also particularly attractive as having such ad blocker 
71
+on a smartphone requires a rooted device. Plus there was a really nice web 
72
+interface to control the whole ad blocking device.</p>
73
+<p>While looking at it more in depth, I realized it was actually very limited:</p>
74
+<ol>
75
+<li>First, it was built around specific softwares and was doing some magical 
76
+   stuff using these softwares. It was really painful to get away from them.
77
+   Basically, it uses <code>dnsmasq</code> to expose a DNS service, a standard <code>hosts</code>
78
+   file to block the hosts serving ads, and a lighthttpd webserver. Problem is
79
+   I already have a DNS resolver (<code>unbound</code>) on this Raspberry Pi, and a web
80
+   server (<code>nginx</code>). I did not want to spend a lot of time trying to integrate
81
+   it in my existing setup if finally it was not that powerful, so I decided
82
+   to look at it in details before installing.</li>
83
+<li>Second issue was that it relies on <code>dnsmasq</code>. <code>dnsmasq</code> is a simple program 
84
+   that allow you to answer DNS queries by using the hosts defined in
85
+   <code>/etc/hosts</code> and to forward every other requests to another DNS server
86
+   (typically your ISP DNS server). Pi-Hole lets you configure two DNS servers
87
+   to forward queries to, default one being 8.8.8.8 (<code>Google</code>&nbsp;:/). I already
88
+   have a resolver on this Raspberry-Pi and I do want to do the resolution
89
+   myself, especially since my ISP DNS servers lies, and I do not want to use
90
+   public DNS server on another network. So I had to hack on Pi-Hole to do
91
+   some DNS resolution. About these issues, I'd like to point to two very
92
+   interesting articles from <a href="http://www.bortzmeyer.org/">Bortzmeyer</a>: <a href="http://www.bortzmeyer.org/google-dns">this
93
+   one about Google DNS</a> (in French) and
94
+   <a href="http://www.bortzmeyer.org/son-propre-resolveur-dns.html">this one about having your own DNS
95
+   resolver</a> (same).
96
+   Also, being a DNS resolver, it may be cumbersome to disable it temporarily
97
+   to load some website that absolutely requires the ads to be loaded.</li>
98
+<li>Last issue was that contrary to uBlock which filters at the requests level 
99
+   (and even sometimes at the HTML level), the fact that is basically an
100
+   alternative DNS resolver means you can only filter at the domain level.
101
+   That is, you either whitelist (default) or blacklist a domain which is
102
+   serving ads or malwares, but you cannot differentiate different paths for a
103
+   given domain. While browsing <a href="http://liberation.fr/">Libération website</a>, I
104
+   can see uBlock is blocking queries such as
105
+   <code>http://s3.amazonaws.com/files.wrapper.theadtech.com/native/placements/liberation.fr/pconfig?r=5a6f5d98b4d608</code>.
106
+   Such queries <strong>cannot</strong> be blocked by Pi-Hole without blacklisting the
107
+   whole Amazon S3 network.</li>
108
+</ol>
109
+<p>Given these facts, I remembered <a href="https://www.privoxy.org/">Privoxy</a> which can 
110
+be used as a filtering proxy, in a way similar to uBlock. Given that it is a 
111
+proxy, it can filter in details, just as uBlock do and you can very easily 
112
+disable it (simply disable the proxy). Plus, almost any devices offer you a 
113
+proxy setting, so it should work both on my Android phones and computers. In 
114
+this article I describe how I set up a Pi-Hole alternative based on Unbound 
115
+(to have my own DNS resolver and block some things at the domain level)
116
+coupled with a Privoxy proxy to filter out ads.</p>
117
+<p><strong>Limitations</strong>: So, contrary to Pi-Hole, the setup described here will be
118
+able to remove ads in a similar way to uBlock/AdBlock. If you go through the 
119
+whole article till the end, it will also have the element hiding features. 
120
+Being a proxy setting, it will be easy to toggle it on and off (either by 
121
+Prixovy toggling features or by manually turning off proxy on your device), if 
122
+required. However, be aware of the remaining limitations with regards to HTTPS 
123
+streams (<a href="https://www.privoxy.org/faq/misc.html">section 4.15</a>). As 
124
+AdBlock/uBlock runs in the browser, it can filter ads in HTTPS streams as 
125
+well, Privoxy will not be as efficient without HTTPS interception (which is 
126
+generally not a good idea). However, it should perform rather well in the vast 
127
+majority of situations (also note that AdBlock for rooted Android devices is 
128
+also a proxy, so for them, it will not change anything).</p>
129
+<p>I assume you already have a running Raspberry Pi with some basic install. 
130
+Typically, see <a href="https://known.phyks.me/2017/raspberry-pi-install-checklist">this previous 
131
+article</a> if this 
132
+is not the case</p>
133
+<h2>Set up a DNS resolver</h2>
134
+<p>Let's install a DNS resolver on the Raspberry Pi, to answer DNS queries on the 
135
+network. I am installing unbound and configuring Unbound here.</p>
136
+<p><code>$ sudo apt-get install unbound
137
+$ curl -o&amp;nbsp;/etc/unbound/root.hints https://www.internic.net/domain/named.cache
138
+$ # (Optional) Set crontask to download root.hints file every six months</code></p>
139
+<p>The last <code>curl</code> command is used to fetch the root hints, to query hosts that 
140
+are not cached. See <a href="https://wiki.archlinux.org/index.php/unbound#Root_hints">this section of the ArchWiki 
141
+page</a> for more infos.</p>
142
+<p>Then, you can create a basic configuration file for unbound.</p>
143
+<p><code>$ cat&amp;nbsp;/etc/unbound/unbound.conf.d/local.conf
144
+server: 
145
+    username: "unbound"
146
+    interface: 0.0.0.0  # Listen on all interfaces
147
+    root-hints: "/etc/unbound/root.hints"
148
+    access-control: 192.168.0.0/8 allow  # Access-control, see "Example" section in https://www.unbound.net/documentation/unbound.conf.html</code></p>
149
+<p>Then, enable and start Unbound service at startup:</p>
150
+<p><code>$ sudo systemctl start unbound &amp;&amp; sudo systemctl enable unbound</code></p>
151
+<p>You can now change the resolver to be used on your Raspberry Pi and on your 
152
+whole network. To change it on your Raspberry Pi, have a look at <a href="https://wiki.debian.org/NetworkConfiguration#Defining_the_.28DNS.29_Nameservers">this wiki 
153
+page</a> 
154
+(for Raspbian). To set it as the default DNS resolver on your network, have a
155
+look at your router configuration, and set the DNS resolvers address to the 
156
+address of your Raspberry Pi. Don't forget to open the ports in your firewall 
157
+(53 tcp and udp).</p>
158
+<p>To check everything is working fine, you can use <code>dig</code> (from <code>dnsutils</code> 
159
+package on Debian-based distributions). Typically, <code>dig google.fr</code> should give 
160
+you some results (in the <code>ANSWER SECTION</code>) and the IP address in the <code>SERVER</code> 
161
+line should be the one of your Raspberry Pi.</p>
162
+<p><strong>Note</strong>: At this point, we should emphasize that having an open DNS resolver
163
+(that is, a DNS resolver that can answer to anyone) can be a security risk
164
+especially since <a href="https://www.incapsula.com/ddos/attack-glossary/dns-amplification.html">some DDoS attacks use 
165
+it</a>. 
166
+Then, you should make sure that your Raspberry Pi DNS server is only 
167
+accessible from your local network, and that no third-party has access to it. 
168
+This should be done through the <code>access-control</code> line in the above 
169
+configuration, but this can also be enforced by the firewall running on your 
170
+Raspberry Pi and the firewall on your router (typically, most routers provided 
171
+by your ISP block any incoming connections, check this).</p>
172
+<h2>Block some domains based on hosts</h2>
173
+<p>Now, we would like <code>unbound</code> to block some domains that are known to serve ads 
174
+and malwares, in a similar way as Pi-Hole does. For this purpose, we will use 
175
+<a href="https://github.com/jodrell/unbound-block-hosts"><code>unbound-block-hosts</code></a> script
176
+to import <code>hosts</code> files into Unbound configuration. Basically, for every such 
177
+domain, Unbound will return <code>127.0.0.1</code>.</p>
178
+<p><code>unbound-block-hosts</code> is designed with the <a href="http://someonewhocares.org/">Dan Pollock's hosts
179
+file</a> in mind, whereas I wanted to be able to 
180
+import any host file in Unbound. 
181
+<a href="https://github.com/Phyks/unbound-block-hosts">Here</a> is a forked and patched
182
+version for this purpose (very ugly patch, as I am not fluent in Perl&nbsp;:/).</p>
183
+<p>We will create an <code>includes</code> dir in the Unbound configuration directory 
184
+(<code>mkdir&amp;nbsp;/etc/unbound/includes/</code>), and include the rules in the main
185
+configuration by appending <code>include: "/etc/unbound/includes/*.conf"</code> to the 
186
+<code>/etc/unbound/unbound.conf.d/local.conf</code> previously created.</p>
187
+<p>Now, you can run <code>./unbound-block-hosts --url="SOME_URL" 
188
+--file=/etc/unbound/includes/FOOBAR-blocking.conf</code> to generate a matching
189
+configuration for a given <code>hosts</code> list. Typically, I have a script doing:</p>
190
+<p>```</p>
191
+<h1>/bin/sh</h1>
192
+<p>set -e</p>
193
+<p>cd "$(dirname "$0")"</p>
194
+<p>echo "Fetch Malware domains list and append to unbound" 
195
+./unbound-block-hosts --url="http://www.malwaredomainlist.com/hostslist/hosts.txt" --file=/etc/unbound/includes/malwaredomainlist-blocking.conf --address="YOUR_RASPBERRY_PI_IP"
196
+echo "Fetch Yoyo ad servers list and append to unbound" 
197
+curl "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound;showintro=0&amp;mimetype=plaintext" &gt;&nbsp;/etc/unbound/includes/yoyoadservers-blocking.conf</p>
198
+<p>systemctl reload unbound 
199
+```</p>
200
+<p>which is crontask-ed to run every day. Default address is <code>127.0.0.1</code> which 
201
+means the local host for the client machine. I do not want to have too many 
202
+404 on my local webservers, so I'd rather put the IP address of the Raspberry 
203
+Pi and have a webserver answering a 404 on it.</p>
204
+<h2>Install a webserver</h2>
205
+<p>As simple as</p>
206
+<p><code>sudo apt-get install nginx</code></p>
207
+<h2>Install and configure Privoxy</h2>
208
+<p>Now, you can install Privoxy:</p>
209
+<p><code>sudo apt-get install privoxy</code></p>
210
+<p>The default configuration should be mostly ok. You can look at the 
211
+<code>/etc/privoxy/config</code> file to adapt it to your needs (the file is really an
212
+example of well documented config file). Two options you might be interesting 
213
+in changing are the <code>debug</code> option (to enable logging, which is disabled by 
214
+default) and <code>listen-addr</code>. You will want to set the latter to:</p>
215
+<p><code>listen-address  127.0.0.1:8118 
216
+listen-address  YOUR_RASPBERRY_PI_IP:8118</code></p>
217
+<p>so that the Prixovy proxy is accessible from the rest of your LAN. As always, 
218
+do not forget to configure your firewall to let the Privoxy connections pass 
219
+through. At this point, you should try to set the proxy in your browser's 
220
+preferences and check that everything is working fine. You should be able to 
221
+browse to any web page, but the proxy will not do anything else for the 
222
+moment.</p>
223
+<p><strong>Note</strong>: At this point, we should emphasize that having such a proxy is a
224
+security risk, as anyone having access to your proxy can browse the web with 
225
+your IP address (and you may be held liable for anything illegal done with 
226
+it). Then, you should make sure that your Raspberry Pi Privoxy is only 
227
+accessible from your local network, and that no third-party has access to it. 
228
+This should be enforced by the firewall running on your Raspberry Pi and the 
229
+firewall on your router (typically, most routers provided by your ISP block 
230
+any incoming connections, check this).</p>
231
+<p>Privoxy, as installed by the Raspbian package, enables a couple of filters out 
232
+of the box. As we will be translating Adblock rules into Privoxy rules, we can 
233
+disable them. Edit the <code>/etc/privoxy/match-all.action</code> file to get something 
234
+like this:</p>
235
+<p>```</p>
236
+<h6></h6>
237
+<h1>Id: match-all.action,v</h1>
238
+<h1></h1>
239
+<h1>This file contains the actions that are applied to all requests and</h1>
240
+<h1>may be overruled later on by other actions files. Less experienced</h1>
241
+<h1>users should only edit this file through the actions file editor.</h1>
242
+<h1></h1>
243
+<h6></h6>
244
+<p>{ \
245
++change-x-forwarded-for{block} \
246
++client-header-tagger{css-requests} \
247
++client-header-tagger{image-requests} \
248
++filter{refresh-tags} \
249
++filter{webbugs} \
250
++filter{jumping-windows} \
251
++filter{ie-exploits} \
252
++hide-from-header{block} \
253
++hide-referrer{conditional-block} \
254
+}
255
+/ # Match all URLs
256
+```</p>
257
+<p>In particular, I disabled the filters <code>img-reorder</code> (which is really intensive 
258
+for the Raspberry Pi, and takes a few hundreds of milliseconds to process a 
259
+regular page) and <code>banners-by-size</code> as we will be importing Adblock rules 
260
+which should give better results. <code>deanimate-gifs</code> and <code>session-cookies-only</code> 
261
+is a matter of taste (respectively it prevents animated GIFs by replacing them 
262
+by their last frame and only allowing temporary cookies).</p>
263
+<h2>Block ads using Privoxy</h2>
264
+<p>We will now be importing adBlock rules into privoxy. One way to do it is to 
265
+use <a href="http://projects.zubr.me/wiki/adblock2privoxy">this Haskell script</a>.</p>
266
+<p>To install it directly on your Raspberry Pi, provided you have a recent 
267
+Raspberry Pi:</p>
268
+<ul>
269
+<li>Install Haskell Stack http://allocinit.io/haskell/haskell-on-raspberry-pi-3/
270
+  (if you are feeling adventurous)</li>
271
+<li>Install adblock2privoxy
272
+  https://projects.zubr.me/wiki/adblock2privoxy#from-sources</li>
273
+</ul>
274
+<p>This was not my case, so I set up a builder on my server to run daily. Some 
275
+rules are <a href="http://projects.zubr.me/wiki/adblock2privoxyDownloads">provided by the 
276
+author</a> and my builds 
277
+are available <a href="http://pub.phyks.me/adblock2privoxy">here</a>.</p>
278
+<p>The way to set up the resulting files into Privoxy is very well detailed on 
279
+<a href="http://projects.zubr.me/wiki/adblock2privoxy#how-to-apply-results">the page of the
280
+project</a>.</p>
281
+<p><em>Note</em>: My builds are made with the Element Hiding feature and <code>example.com</code>
282
+as the <code>domainCSS</code> parameter. You should replace any occurrence of 
283
+<code>example.com</code> by the FQDN or IP adrdess of your Raspberry Pi when importing
284
+it. Please, do not put too much load on my hosted builds and consider hosting 
285
+your owns.</p>
286
+<h2>Benchmark</h2>
287
+<p>All the tests were made with a Raspberry Pi of the first model with 512MB of 
288
+RAM (model 1B). The Raspberry Pi has a wired access to internet (100MB/s port 
289
+only on the Raspberry Pi). My laptop is wired as well (gigabit ethernet). Home 
290
+connection to internet is a fiber access (923 Mbps download, 250 Mbps upload, 
291
+as reported by 
292
+<a href="https://www.dslreports.com/speedtest?httpsok=1&amp;r=489">DSLReports</a>).</p>
293
+<h3>Testing the DNS server</h3>
294
+<p>Without the DNS server,</p>
295
+<p>```
296
+$ # Using my ISP resolver
297
+$ % dig @192.168.0.254 example.com
298
+...
299
+;; Query time: 7 msec
300
+;; SERVER: 192.168.0.254#53(192.168.0.254)</p>
301
+<p>$ # Using Google DNS
302
+$ dig @8.8.8.8 example.com
303
+...
304
+;; Query time: 5 msec
305
+;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
306
+<p>$ # Using the DNS resolver on my Raspberry Pi
307
+$ dig @192.168.0.1 example.com
308
+...
309
+;; Query time: 505 msec
310
+;; SERVER: 192.168.0.1#53(192.168.0.1)</p>
311
+<p>$ # Using it another time, now that the domain is in cache
312
+$ dig @192.168.0.1 example.com
313
+...
314
+;; Query time: 5 msec
315
+;; SERVER: 192.168.0.1#53(192.168.0.1)
316
+```</p>
317
+<p>These are typical times, the value is typically the one obtained as average 
318
+of a few runs.</p>
319
+<p>We can see that there is some overhead when first accessing a domain, as the 
320
+Pi has to do the full DNS resolution. Afterwards, the domain is kept in cache 
321
+and it is as fast to use the DNS server from the Pi as it is to use any other 
322
+one.</p>
323
+<h3>Testing the Privoxy setup</h3>
324
+<p>Now, let us focus on the performances of the Privoxy on the Raspberry Pi. I 
325
+tested it with a few websites, and results were roughly the same. Here is a 
326
+detailed example of <a href="http://www.liberation.fr/direct/">Liberation's website</a>, 
327
+a French journal. This example is interesting as my µBlock setup on my laptop 
328
+blocks 23 different things when I don't use the DNS nor the Privoxy proxy. It 
329
+is also an interesting example as out of the 23 blocked contents, only 14 of 
330
+them could be blocked by DNS (with the setup described above).</p>
331
+<p>The main issue here is that Privoxy is very long to process the page with all 
332
+the filters, and it is way too heavy for my low power Raspberry Pi first 
333
+model.</p>
334
+<p>The main HTML document for this page takes 7 seconds to load when passing 
335
+through the proxy, mainly due to the processing time. When reloading the page, 
336
+it only takes 400ms as it is already in cache. As a comparison, it takes only 
337
+24ms when loading it directly.</p>
338
+<p>The complete setup looks equivalent to the µBlock setup on my laptop.</p>
339
+<p>I don't have a more recent version of the Raspberry Pi (typically Raspberry Pi 
340
+3) to test what the performances are on such a more powerful system. If you 
341
+can try it, let me know, I am curious about the way it handles the load, and I 
342
+could publish an edit to this article. </p>
343
+		<footer><p class="date">Le 04/04/2917 à 19:16</p>
344
+		<p class="tags">Tags : <a href="//phyks.me/tags/RaspberryPi.html">RaspberryPi</a></p></footer>
345
+	</div>
346
+</article>
347
+            </div>
348
+            <footer id="rss">
349
+                <p><a href="//phyks.me/rss.xml"><img src="//phyks.me/img/rss.png" alt="RSS"/></a></p>
350
+            </footer>
351
+        </div>
352
+    </body>
353
+</html>

+ 353
- 0
blog/2017/04/privoxy_raspberry_pi.html View File

@@ -0,0 +1,353 @@
1
+<!DOCTYPE html>
2
+<html lang="fr">
3
+    <head>
4
+        <meta charset="utf-8">
5
+        <title>Phyks' blog - Filtering ads with your Raspberry Pi</title>
6
+		<link rel="stylesheet" href="//phyks.me/design.css"/>
7
+        <link type="text/plain" rel="author" href="//phyks.me/humans.txt"/>
8
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
+        <link rel="alternate" type="application/rss+xml" title="RSS" href="//phyks.me/rss.xml" />
10
+    </head>
11
+    <body>
12
+        <div id="wrapper">
13
+            <!-- Sidebar -->
14
+                <aside id="sidebar-wrapper">
15
+                    <header><h1><a href="//phyks.me">~Phyks</a></h1></header>
16
+
17
+                    <h2>Catégories</h2>
18
+                        <nav id="sidebar-tags">
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
20
+                        </nav>
21
+
22
+                    <h2>Derniers articles</h2>
23
+                        <ul id="sidebar-articles">
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25
+                        </ul>
26
+
27
+                    <h2>Liens</h2>
28
+                        <ul id="sidebar-links">
29
+                            <li><a href="//phyks.me/contact.html" title="Contact">Me contacter</a></li>
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/" rel="me" title="Github">Mon Github</a></li>
32
+                            <li><a href="//phyks.me/divers.html" title="Divers">Divers</a></li>
33
+                        </ul>
34
+                </aside>
35
+
36
+            <!-- Page content -->
37
+                <header id="header">
38
+                    <h1><a href="//phyks.me">~Phyks</a></h1>
39
+                </header>
40
+
41
+                <div id="note_responsive">
42
+                    <p><em>Note</em> : Cliquez sur la bande bleue à gauche pour faire apparaître le menu.</p>
43
+                </div>
44
+
45
+                <div id="articles">
46
+<article>
47
+	<aside>
48
+		<p class="day">04</p>
49
+		<p class="month">Avril</p>
50
+	</aside>
51
+	<div class="article">
52
+		<header><h1 class="article_title"><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></h1></header>
53
+		<!-- 
54
+    @author=Phyks
55
+    @date=04042917-1916
56
+    @title=Filtering ads with your Raspberry Pi
57
+    @tags=RaspberryPi
58
+-->
59
+
60
+<p>TL;DR: Please have a look at the benchmark section below, to be aware of the 
61
+limitations of this particular setup and decide whether to spend some time 
62
+putting it in place or not.</p>
63
+<p>I recently came across <a href="https://github.com/pi-hole/pi-hole">this Pi-Hole 
64
+project</a> that claims to be "a black hole 
65
+for Internet advertisements" (thanks <a href="https://nicofrand.eu/">nicofrand</a> for 
66
+making me discover this!). The idea was really attractive: having a simple 
67
+Raspberry Pi on the network doing all the ad filtering for the whole network, 
68
+rather than having to maintain a separate <a href="https://github.com/gorhill/uBlock">uBlock 
69
+Origin</a> install on each and every computers 
70
+of the network. It was also particularly attractive as having such ad blocker 
71
+on a smartphone requires a rooted device. Plus there was a really nice web 
72
+interface to control the whole ad blocking device.</p>
73
+<p>While looking at it more in depth, I realized it was actually very limited:</p>
74
+<ol>
75
+<li>First, it was built around specific softwares and was doing some magical 
76
+   stuff using these softwares. It was really painful to get away from them.
77
+   Basically, it uses <code>dnsmasq</code> to expose a DNS service, a standard <code>hosts</code>
78
+   file to block the hosts serving ads, and a lighthttpd webserver. Problem is
79
+   I already have a DNS resolver (<code>unbound</code>) on this Raspberry Pi, and a web
80
+   server (<code>nginx</code>). I did not want to spend a lot of time trying to integrate
81
+   it in my existing setup if finally it was not that powerful, so I decided
82
+   to look at it in details before installing.</li>
83
+<li>Second issue was that it relies on <code>dnsmasq</code>. <code>dnsmasq</code> is a simple program 
84
+   that allow you to answer DNS queries by using the hosts defined in
85
+   <code>/etc/hosts</code> and to forward every other requests to another DNS server
86
+   (typically your ISP DNS server). Pi-Hole lets you configure two DNS servers
87
+   to forward queries to, default one being 8.8.8.8 (<code>Google</code>&nbsp;:/). I already
88
+   have a resolver on this Raspberry-Pi and I do want to do the resolution
89
+   myself, especially since my ISP DNS servers lies, and I do not want to use
90
+   public DNS server on another network. So I had to hack on Pi-Hole to do
91
+   some DNS resolution. About these issues, I'd like to point to two very
92
+   interesting articles from <a href="http://www.bortzmeyer.org/">Bortzmeyer</a>: <a href="http://www.bortzmeyer.org/google-dns">this
93
+   one about Google DNS</a> (in French) and
94
+   <a href="http://www.bortzmeyer.org/son-propre-resolveur-dns.html">this one about having your own DNS
95
+   resolver</a> (same).
96
+   Also, being a DNS resolver, it may be cumbersome to disable it temporarily
97
+   to load some website that absolutely requires the ads to be loaded.</li>
98
+<li>Last issue was that contrary to uBlock which filters at the requests level 
99
+   (and even sometimes at the HTML level), the fact that is basically an
100
+   alternative DNS resolver means you can only filter at the domain level.
101
+   That is, you either whitelist (default) or blacklist a domain which is
102
+   serving ads or malwares, but you cannot differentiate different paths for a
103
+   given domain. While browsing <a href="http://liberation.fr/">Libération website</a>, I
104
+   can see uBlock is blocking queries such as
105
+   <code>http://s3.amazonaws.com/files.wrapper.theadtech.com/native/placements/liberation.fr/pconfig?r=5a6f5d98b4d608</code>.
106
+   Such queries <strong>cannot</strong> be blocked by Pi-Hole without blacklisting the
107
+   whole Amazon S3 network.</li>
108
+</ol>
109
+<p>Given these facts, I remembered <a href="https://www.privoxy.org/">Privoxy</a> which can 
110
+be used as a filtering proxy, in a way similar to uBlock. Given that it is a 
111
+proxy, it can filter in details, just as uBlock do and you can very easily 
112
+disable it (simply disable the proxy). Plus, almost any devices offer you a 
113
+proxy setting, so it should work both on my Android phones and computers. In 
114
+this article I describe how I set up a Pi-Hole alternative based on Unbound 
115
+(to have my own DNS resolver and block some things at the domain level)
116
+coupled with a Privoxy proxy to filter out ads.</p>
117
+<p><strong>Limitations</strong>: So, contrary to Pi-Hole, the setup described here will be
118
+able to remove ads in a similar way to uBlock/AdBlock. If you go through the 
119
+whole article till the end, it will also have the element hiding features. 
120
+Being a proxy setting, it will be easy to toggle it on and off (either by 
121
+Prixovy toggling features or by manually turning off proxy on your device), if 
122
+required. However, be aware of the remaining limitations with regards to HTTPS 
123
+streams (<a href="https://www.privoxy.org/faq/misc.html">section 4.15</a>). As 
124
+AdBlock/uBlock runs in the browser, it can filter ads in HTTPS streams as 
125
+well, Privoxy will not be as efficient without HTTPS interception (which is 
126
+generally not a good idea). However, it should perform rather well in the vast 
127
+majority of situations (also note that AdBlock for rooted Android devices is 
128
+also a proxy, so for them, it will not change anything).</p>
129
+<p>I assume you already have a running Raspberry Pi with some basic install. 
130
+Typically, see <a href="https://known.phyks.me/2017/raspberry-pi-install-checklist">this previous 
131
+article</a> if this 
132
+is not the case</p>
133
+<h2>Set up a DNS resolver</h2>
134
+<p>Let's install a DNS resolver on the Raspberry Pi, to answer DNS queries on the 
135
+network. I am installing unbound and configuring Unbound here.</p>
136
+<p><code>$ sudo apt-get install unbound
137
+$ curl -o&amp;nbsp;/etc/unbound/root.hints https://www.internic.net/domain/named.cache
138
+$ # (Optional) Set crontask to download root.hints file every six months</code></p>
139
+<p>The last <code>curl</code> command is used to fetch the root hints, to query hosts that 
140
+are not cached. See <a href="https://wiki.archlinux.org/index.php/unbound#Root_hints">this section of the ArchWiki 
141
+page</a> for more infos.</p>
142
+<p>Then, you can create a basic configuration file for unbound.</p>
143
+<p><code>$ cat&amp;nbsp;/etc/unbound/unbound.conf.d/local.conf
144
+server: 
145
+    username: "unbound"
146
+    interface: 0.0.0.0  # Listen on all interfaces
147
+    root-hints: "/etc/unbound/root.hints"
148
+    access-control: 192.168.0.0/8 allow  # Access-control, see "Example" section in https://www.unbound.net/documentation/unbound.conf.html</code></p>
149
+<p>Then, enable and start Unbound service at startup:</p>
150
+<p><code>$ sudo systemctl start unbound &amp;&amp; sudo systemctl enable unbound</code></p>
151
+<p>You can now change the resolver to be used on your Raspberry Pi and on your 
152
+whole network. To change it on your Raspberry Pi, have a look at <a href="https://wiki.debian.org/NetworkConfiguration#Defining_the_.28DNS.29_Nameservers">this wiki 
153
+page</a> 
154
+(for Raspbian). To set it as the default DNS resolver on your network, have a
155
+look at your router configuration, and set the DNS resolvers address to the 
156
+address of your Raspberry Pi. Don't forget to open the ports in your firewall 
157
+(53 tcp and udp).</p>
158
+<p>To check everything is working fine, you can use <code>dig</code> (from <code>dnsutils</code> 
159
+package on Debian-based distributions). Typically, <code>dig google.fr</code> should give 
160
+you some results (in the <code>ANSWER SECTION</code>) and the IP address in the <code>SERVER</code> 
161
+line should be the one of your Raspberry Pi.</p>
162
+<p><strong>Note</strong>: At this point, we should emphasize that having an open DNS resolver
163
+(that is, a DNS resolver that can answer to anyone) can be a security risk
164
+especially since <a href="https://www.incapsula.com/ddos/attack-glossary/dns-amplification.html">some DDoS attacks use 
165
+it</a>. 
166
+Then, you should make sure that your Raspberry Pi DNS server is only 
167
+accessible from your local network, and that no third-party has access to it. 
168
+This should be done through the <code>access-control</code> line in the above 
169
+configuration, but this can also be enforced by the firewall running on your 
170
+Raspberry Pi and the firewall on your router (typically, most routers provided 
171
+by your ISP block any incoming connections, check this).</p>
172
+<h2>Block some domains based on hosts</h2>
173
+<p>Now, we would like <code>unbound</code> to block some domains that are known to serve ads 
174
+and malwares, in a similar way as Pi-Hole does. For this purpose, we will use 
175
+<a href="https://github.com/jodrell/unbound-block-hosts"><code>unbound-block-hosts</code></a> script
176
+to import <code>hosts</code> files into Unbound configuration. Basically, for every such 
177
+domain, Unbound will return <code>127.0.0.1</code>.</p>
178
+<p><code>unbound-block-hosts</code> is designed with the <a href="http://someonewhocares.org/">Dan Pollock's hosts
179
+file</a> in mind, whereas I wanted to be able to 
180
+import any host file in Unbound. 
181
+<a href="https://github.com/Phyks/unbound-block-hosts">Here</a> is a forked and patched
182
+version for this purpose (very ugly patch, as I am not fluent in Perl&nbsp;:/).</p>
183
+<p>We will create an <code>includes</code> dir in the Unbound configuration directory 
184
+(<code>mkdir&amp;nbsp;/etc/unbound/includes/</code>), and include the rules in the main
185
+configuration by appending <code>include: "/etc/unbound/includes/*.conf"</code> to the 
186
+<code>/etc/unbound/unbound.conf.d/local.conf</code> previously created.</p>
187
+<p>Now, you can run <code>./unbound-block-hosts --url="SOME_URL" 
188
+--file=/etc/unbound/includes/FOOBAR-blocking.conf</code> to generate a matching
189
+configuration for a given <code>hosts</code> list. Typically, I have a script doing:</p>
190
+<p>```</p>
191
+<h1>/bin/sh</h1>
192
+<p>set -e</p>
193
+<p>cd "$(dirname "$0")"</p>
194
+<p>echo "Fetch Malware domains list and append to unbound" 
195
+./unbound-block-hosts --url="http://www.malwaredomainlist.com/hostslist/hosts.txt" --file=/etc/unbound/includes/malwaredomainlist-blocking.conf --address="YOUR_RASPBERRY_PI_IP"
196
+echo "Fetch Yoyo ad servers list and append to unbound" 
197
+curl "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound;showintro=0&amp;mimetype=plaintext" &gt;&nbsp;/etc/unbound/includes/yoyoadservers-blocking.conf</p>
198
+<p>systemctl reload unbound 
199
+```</p>
200
+<p>which is crontask-ed to run every day. Default address is <code>127.0.0.1</code> which 
201
+means the local host for the client machine. I do not want to have too many 
202
+404 on my local webservers, so I'd rather put the IP address of the Raspberry 
203
+Pi and have a webserver answering a 404 on it.</p>
204
+<h2>Install a webserver</h2>
205
+<p>As simple as</p>
206
+<p><code>sudo apt-get install nginx</code></p>
207
+<h2>Install and configure Privoxy</h2>
208
+<p>Now, you can install Privoxy:</p>
209
+<p><code>sudo apt-get install privoxy</code></p>
210
+<p>The default configuration should be mostly ok. You can look at the 
211
+<code>/etc/privoxy/config</code> file to adapt it to your needs (the file is really an
212
+example of well documented config file). Two options you might be interesting 
213
+in changing are the <code>debug</code> option (to enable logging, which is disabled by 
214
+default) and <code>listen-addr</code>. You will want to set the latter to:</p>
215
+<p><code>listen-address  127.0.0.1:8118 
216
+listen-address  YOUR_RASPBERRY_PI_IP:8118</code></p>
217
+<p>so that the Prixovy proxy is accessible from the rest of your LAN. As always, 
218
+do not forget to configure your firewall to let the Privoxy connections pass 
219
+through. At this point, you should try to set the proxy in your browser's 
220
+preferences and check that everything is working fine. You should be able to 
221
+browse to any web page, but the proxy will not do anything else for the 
222
+moment.</p>
223
+<p><strong>Note</strong>: At this point, we should emphasize that having such a proxy is a
224
+security risk, as anyone having access to your proxy can browse the web with 
225
+your IP address (and you may be held liable for anything illegal done with 
226
+it). Then, you should make sure that your Raspberry Pi Privoxy is only 
227
+accessible from your local network, and that no third-party has access to it. 
228
+This should be enforced by the firewall running on your Raspberry Pi and the 
229
+firewall on your router (typically, most routers provided by your ISP block 
230
+any incoming connections, check this).</p>
231
+<p>Privoxy, as installed by the Raspbian package, enables a couple of filters out 
232
+of the box. As we will be translating Adblock rules into Privoxy rules, we can 
233
+disable them. Edit the <code>/etc/privoxy/match-all.action</code> file to get something 
234
+like this:</p>
235
+<p>```</p>
236
+<h6></h6>
237
+<h1>Id: match-all.action,v</h1>
238
+<h1></h1>
239
+<h1>This file contains the actions that are applied to all requests and</h1>
240
+<h1>may be overruled later on by other actions files. Less experienced</h1>
241
+<h1>users should only edit this file through the actions file editor.</h1>
242
+<h1></h1>
243
+<h6></h6>
244
+<p>{ \
245
++change-x-forwarded-for{block} \
246
++client-header-tagger{css-requests} \
247
++client-header-tagger{image-requests} \
248
++filter{refresh-tags} \
249
++filter{webbugs} \
250
++filter{jumping-windows} \
251
++filter{ie-exploits} \
252
++hide-from-header{block} \
253
++hide-referrer{conditional-block} \
254
+}
255
+/ # Match all URLs
256
+```</p>
257
+<p>In particular, I disabled the filters <code>img-reorder</code> (which is really intensive 
258
+for the Raspberry Pi, and takes a few hundreds of milliseconds to process a 
259
+regular page) and <code>banners-by-size</code> as we will be importing Adblock rules 
260
+which should give better results. <code>deanimate-gifs</code> and <code>session-cookies-only</code> 
261
+is a matter of taste (respectively it prevents animated GIFs by replacing them 
262
+by their last frame and only allowing temporary cookies).</p>
263
+<h2>Block ads using Privoxy</h2>
264
+<p>We will now be importing adBlock rules into privoxy. One way to do it is to 
265
+use <a href="http://projects.zubr.me/wiki/adblock2privoxy">this Haskell script</a>.</p>
266
+<p>To install it directly on your Raspberry Pi, provided you have a recent 
267
+Raspberry Pi:</p>
268
+<ul>
269
+<li>Install Haskell Stack http://allocinit.io/haskell/haskell-on-raspberry-pi-3/
270
+  (if you are feeling adventurous)</li>
271
+<li>Install adblock2privoxy
272
+  https://projects.zubr.me/wiki/adblock2privoxy#from-sources</li>
273
+</ul>
274
+<p>This was not my case, so I set up a builder on my server to run daily. Some 
275
+rules are <a href="http://projects.zubr.me/wiki/adblock2privoxyDownloads">provided by the 
276
+author</a> and my builds 
277
+are available <a href="http://pub.phyks.me/adblock2privoxy">here</a>.</p>
278
+<p>The way to set up the resulting files into Privoxy is very well detailed on 
279
+<a href="http://projects.zubr.me/wiki/adblock2privoxy#how-to-apply-results">the page of the
280
+project</a>.</p>
281
+<p><em>Note</em>: My builds are made with the Element Hiding feature and <code>example.com</code>
282
+as the <code>domainCSS</code> parameter. You should replace any occurrence of 
283
+<code>example.com</code> by the FQDN or IP adrdess of your Raspberry Pi when importing
284
+it. Please, do not put too much load on my hosted builds and consider hosting 
285
+your owns.</p>
286
+<h2>Benchmark</h2>
287
+<p>All the tests were made with a Raspberry Pi of the first model with 512MB of 
288
+RAM (model 1B). The Raspberry Pi has a wired access to internet (100MB/s port 
289
+only on the Raspberry Pi). My laptop is wired as well (gigabit ethernet). Home 
290
+connection to internet is a fiber access (923 Mbps download, 250 Mbps upload, 
291
+as reported by 
292
+<a href="https://www.dslreports.com/speedtest?httpsok=1&amp;r=489">DSLReports</a>).</p>
293
+<h3>Testing the DNS server</h3>
294
+<p>Without the DNS server,</p>
295
+<p>```
296
+$ # Using my ISP resolver
297
+$ % dig @192.168.0.254 example.com
298
+...
299
+;; Query time: 7 msec
300
+;; SERVER: 192.168.0.254#53(192.168.0.254)</p>
301
+<p>$ # Using Google DNS
302
+$ dig @8.8.8.8 example.com
303
+...
304
+;; Query time: 5 msec
305
+;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
306
+<p>$ # Using the DNS resolver on my Raspberry Pi
307
+$ dig @192.168.0.1 example.com
308
+...
309
+;; Query time: 505 msec
310
+;; SERVER: 192.168.0.1#53(192.168.0.1)</p>
311
+<p>$ # Using it another time, now that the domain is in cache
312
+$ dig @192.168.0.1 example.com
313
+...
314
+;; Query time: 5 msec
315
+;; SERVER: 192.168.0.1#53(192.168.0.1)
316
+```</p>
317
+<p>These are typical times, the value is typically the one obtained as average 
318
+of a few runs.</p>
319
+<p>We can see that there is some overhead when first accessing a domain, as the 
320
+Pi has to do the full DNS resolution. Afterwards, the domain is kept in cache 
321
+and it is as fast to use the DNS server from the Pi as it is to use any other 
322
+one.</p>
323
+<h3>Testing the Privoxy setup</h3>
324
+<p>Now, let us focus on the performances of the Privoxy on the Raspberry Pi. I 
325
+tested it with a few websites, and results were roughly the same. Here is a 
326
+detailed example of <a href="http://www.liberation.fr/direct/">Liberation's website</a>, 
327
+a French journal. This example is interesting as my µBlock setup on my laptop 
328
+blocks 23 different things when I don't use the DNS nor the Privoxy proxy. It 
329
+is also an interesting example as out of the 23 blocked contents, only 14 of 
330
+them could be blocked by DNS (with the setup described above).</p>
331
+<p>The main issue here is that Privoxy is very long to process the page with all 
332
+the filters, and it is way too heavy for my low power Raspberry Pi first 
333
+model.</p>
334
+<p>The main HTML document for this page takes 7 seconds to load when passing 
335
+through the proxy, mainly due to the processing time. When reloading the page, 
336
+it only takes 400ms as it is already in cache. As a comparison, it takes only 
337
+24ms when loading it directly.</p>
338
+<p>The complete setup looks equivalent to the µBlock setup on my laptop.</p>
339
+<p>I don't have a more recent version of the Raspberry Pi (typically Raspberry Pi 
340
+3) to test what the performances are on such a more powerful system. If you 
341
+can try it, let me know, I am curious about the way it handles the load, and I 
342
+could publish an edit to this article. </p>
343
+		<footer><p class="date">Le 04/04/2917 à 19:16</p>
344
+		<p class="tags">Tags : <a href="//phyks.me/tags/RaspberryPi.html">RaspberryPi</a></p></footer>
345
+	</div>
346
+</article>
347
+            </div>
348
+            <footer id="rss">
349
+                <p><a href="//phyks.me/rss.xml"><img src="//phyks.me/img/rss.png" alt="RSS"/></a></p>
350
+            </footer>
351
+        </div>
352
+    </body>
353
+</html>

+ 293
- 59
blog/2017/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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
@@ -45,69 +45,303 @@
45 45
                 <div id="articles">
46 46
 <article>
47 47
 	<aside>
48
-		<p class="day">31</p>
49
-		<p class="month">Mars</p>
48
+		<p class="day">04</p>
49
+		<p class="month">Avril</p>
50 50
 	</aside>
51 51
 	<div class="article">
52
-		<header><h1 class="article_title"><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars : Jupyter</a></h1></header>
52
+		<header><h1 class="article_title"><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></h1></header>
53 53
 		<!-- 
54 54
     @author=Phyks
55
-    @date=31032017-1958
56
-    @title=Don du mois de mars&nbsp;: Jupyter
57
-    @tags=DonDuMois
55
+    @date=04042917-1916
56
+    @title=Filtering ads with your Raspberry Pi
57
+    @tags=RaspberryPi
58 58
 -->
59 59
 
60
-<p>Je continue les <a href="https://known.phyks.me/2016/don-du-mois-de-d%C3%A9cembrenbsp-eff">dons du 
61
-mois</a> en 
62
-donnant ce mois-ci 15€ à <a href="https://jupyter.org/">Jupyter</a>.</p>
63
-<p>Jupyter (anciennement iPython) est issu de <a href="https://linuxfr.org/news/ipython-est-mort-vive-ipython-4-0">la 
64
-scission</a> entre 
65
-iPython (le noyau) et la partie <em>notebook</em> (feuilles de calcul). Jupyter 
66
-Notebook recouvre cette deuxième partie, et supporte différents noyaux en plus 
67
-de Python (R, Haskell, Julia, Ruby, etc). Un bon exemple du rendu est 
68
-disponible <a href="https://nbviewer.jupyter.org/github/ipython/ipython/blob/4.0.x/examples/IPython%20Kernel/Trapezoid%20Rule.ipynb">ici</a> (en lecture seule).</p>
69
-<p>Une feuille de calculs est composée de cellules, et chaque cellule peut être 
70
-soit du texte (markdown étendu avec le support de LaTeX pour les équations, 
71
-rendues avec MathJaX), soit du code. C'est un très bon outil pour faire un 
72
-genre de <a href="https://fr.wikipedia.org/wiki/Programmation_lettr%C3%A9e">programmation 
73
-lettrée</a> où code et 
74
-équations sont ensemble, dans un unique document cohérent. De plus, Jupyter 
75
-supporte l'export vers de nombreux formats (grâce à LaTeX et à Pandoc), et 
76
-notamment PDF, TeX et HTML, ce qui permet de générer un document final propre 
77
-contenant l'intégralité des notes et des simulations pour un projet donné. </p>
78
-		<footer><p class="date">Le 31/03/2017 à 19:58</p>
79
-		<p class="tags">Tags : <a href="//phyks.me/tags/DonDuMois.html">DonDuMois</a></p></footer>
80
-	</div>
81
-</article>
82
-<article>
83
-	<aside>
84
-		<p class="day">31</p>
85
-		<p class="month">Mars</p>
86
-	</aside>
87
-	<div class="article">
88
-		<header><h1 class="article_title"><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février : i3wm</a></h1></header>
89
-		<!-- 
90
-    @author=Phyks
91
-    @date=31032017-1945
92
-    @title=Don du mois de février&nbsp;: i3wm
93
-    @tags=DonDuMois
94
--->
95
-
96
-<p>J'ai été assez débordé le mois dernier et viens de me rendre compte que mon 
97
-article sur le don du mois de février était resté en brouillon non publié&nbsp;:/</p>
98
-<p>Je continue donc les <a href="https://known.phyks.me/2016/don-du-mois-de-d%C3%A9cembrenbsp-eff">dons du 
99
-mois</a> en 
100
-donnant ce mois-ci 15€ à <a href="http://i3wm.org/">i3wm</a>.</p>
101
-<p>i3wm est un gestionnaire de fenêtres pour X11 (Linux) qui fait du <em>tiling</em> 
102
-("pavage" en bon français). Il organise automatiquement les fenêtres à
103
-l'écran, de sorte qu'elles ne se superposent jamais, mais pavent l'espace 
104
-disponible.</p>
105
-<p>Je l'utilise quotidiennement, et une fois qu'on l'a testé (et qu'on s'y est 
106
-habitué), ça devient très rapidement indispensable.</p>
107
-<p>À noter, il existe une alternative (sans lien avec i3wm) pour Wayland: 
108
-<a href="https://github.com/SirCmpwn/sway">sway</a>.</p>
109
-		<footer><p class="date">Le 31/03/2017 à 19:45</p>
110
-		<p class="tags">Tags : <a href="//phyks.me/tags/DonDuMois.html">DonDuMois</a></p></footer>
60
+<p>TL;DR: Please have a look at the benchmark section below, to be aware of the 
61
+limitations of this particular setup and decide whether to spend some time 
62
+putting it in place or not.</p>
63
+<p>I recently came across <a href="https://github.com/pi-hole/pi-hole">this Pi-Hole 
64
+project</a> that claims to be "a black hole 
65
+for Internet advertisements" (thanks <a href="https://nicofrand.eu/">nicofrand</a> for 
66
+making me discover this!). The idea was really attractive: having a simple 
67
+Raspberry Pi on the network doing all the ad filtering for the whole network, 
68
+rather than having to maintain a separate <a href="https://github.com/gorhill/uBlock">uBlock 
69
+Origin</a> install on each and every computers 
70
+of the network. It was also particularly attractive as having such ad blocker 
71
+on a smartphone requires a rooted device. Plus there was a really nice web 
72
+interface to control the whole ad blocking device.</p>
73
+<p>While looking at it more in depth, I realized it was actually very limited:</p>
74
+<ol>
75
+<li>First, it was built around specific softwares and was doing some magical 
76
+   stuff using these softwares. It was really painful to get away from them.
77
+   Basically, it uses <code>dnsmasq</code> to expose a DNS service, a standard <code>hosts</code>
78
+   file to block the hosts serving ads, and a lighthttpd webserver. Problem is
79
+   I already have a DNS resolver (<code>unbound</code>) on this Raspberry Pi, and a web
80
+   server (<code>nginx</code>). I did not want to spend a lot of time trying to integrate
81
+   it in my existing setup if finally it was not that powerful, so I decided
82
+   to look at it in details before installing.</li>
83
+<li>Second issue was that it relies on <code>dnsmasq</code>. <code>dnsmasq</code> is a simple program 
84
+   that allow you to answer DNS queries by using the hosts defined in
85
+   <code>/etc/hosts</code> and to forward every other requests to another DNS server
86
+   (typically your ISP DNS server). Pi-Hole lets you configure two DNS servers
87
+   to forward queries to, default one being 8.8.8.8 (<code>Google</code>&nbsp;:/). I already
88
+   have a resolver on this Raspberry-Pi and I do want to do the resolution
89
+   myself, especially since my ISP DNS servers lies, and I do not want to use
90
+   public DNS server on another network. So I had to hack on Pi-Hole to do
91
+   some DNS resolution. About these issues, I'd like to point to two very
92
+   interesting articles from <a href="http://www.bortzmeyer.org/">Bortzmeyer</a>: <a href="http://www.bortzmeyer.org/google-dns">this
93
+   one about Google DNS</a> (in French) and
94
+   <a href="http://www.bortzmeyer.org/son-propre-resolveur-dns.html">this one about having your own DNS
95
+   resolver</a> (same).
96
+   Also, being a DNS resolver, it may be cumbersome to disable it temporarily
97
+   to load some website that absolutely requires the ads to be loaded.</li>
98
+<li>Last issue was that contrary to uBlock which filters at the requests level 
99
+   (and even sometimes at the HTML level), the fact that is basically an
100
+   alternative DNS resolver means you can only filter at the domain level.
101
+   That is, you either whitelist (default) or blacklist a domain which is
102
+   serving ads or malwares, but you cannot differentiate different paths for a
103
+   given domain. While browsing <a href="http://liberation.fr/">Libération website</a>, I
104
+   can see uBlock is blocking queries such as
105
+   <code>http://s3.amazonaws.com/files.wrapper.theadtech.com/native/placements/liberation.fr/pconfig?r=5a6f5d98b4d608</code>.
106
+   Such queries <strong>cannot</strong> be blocked by Pi-Hole without blacklisting the
107
+   whole Amazon S3 network.</li>
108
+</ol>
109
+<p>Given these facts, I remembered <a href="https://www.privoxy.org/">Privoxy</a> which can 
110
+be used as a filtering proxy, in a way similar to uBlock. Given that it is a 
111
+proxy, it can filter in details, just as uBlock do and you can very easily 
112
+disable it (simply disable the proxy). Plus, almost any devices offer you a 
113
+proxy setting, so it should work both on my Android phones and computers. In 
114
+this article I describe how I set up a Pi-Hole alternative based on Unbound 
115
+(to have my own DNS resolver and block some things at the domain level)
116
+coupled with a Privoxy proxy to filter out ads.</p>
117
+<p><strong>Limitations</strong>: So, contrary to Pi-Hole, the setup described here will be
118
+able to remove ads in a similar way to uBlock/AdBlock. If you go through the 
119
+whole article till the end, it will also have the element hiding features. 
120
+Being a proxy setting, it will be easy to toggle it on and off (either by 
121
+Prixovy toggling features or by manually turning off proxy on your device), if 
122
+required. However, be aware of the remaining limitations with regards to HTTPS 
123
+streams (<a href="https://www.privoxy.org/faq/misc.html">section 4.15</a>). As 
124
+AdBlock/uBlock runs in the browser, it can filter ads in HTTPS streams as 
125
+well, Privoxy will not be as efficient without HTTPS interception (which is 
126
+generally not a good idea). However, it should perform rather well in the vast 
127
+majority of situations (also note that AdBlock for rooted Android devices is 
128
+also a proxy, so for them, it will not change anything).</p>
129
+<p>I assume you already have a running Raspberry Pi with some basic install. 
130
+Typically, see <a href="https://known.phyks.me/2017/raspberry-pi-install-checklist">this previous 
131
+article</a> if this 
132
+is not the case</p>
133
+<h2>Set up a DNS resolver</h2>
134
+<p>Let's install a DNS resolver on the Raspberry Pi, to answer DNS queries on the 
135
+network. I am installing unbound and configuring Unbound here.</p>
136
+<p><code>$ sudo apt-get install unbound
137
+$ curl -o&amp;nbsp;/etc/unbound/root.hints https://www.internic.net/domain/named.cache
138
+$ # (Optional) Set crontask to download root.hints file every six months</code></p>
139
+<p>The last <code>curl</code> command is used to fetch the root hints, to query hosts that 
140
+are not cached. See <a href="https://wiki.archlinux.org/index.php/unbound#Root_hints">this section of the ArchWiki 
141
+page</a> for more infos.</p>
142
+<p>Then, you can create a basic configuration file for unbound.</p>
143
+<p><code>$ cat&amp;nbsp;/etc/unbound/unbound.conf.d/local.conf
144
+server: 
145
+    username: "unbound"
146
+    interface: 0.0.0.0  # Listen on all interfaces
147
+    root-hints: "/etc/unbound/root.hints"
148
+    access-control: 192.168.0.0/8 allow  # Access-control, see "Example" section in https://www.unbound.net/documentation/unbound.conf.html</code></p>
149
+<p>Then, enable and start Unbound service at startup:</p>
150
+<p><code>$ sudo systemctl start unbound &amp;&amp; sudo systemctl enable unbound</code></p>
151
+<p>You can now change the resolver to be used on your Raspberry Pi and on your 
152
+whole network. To change it on your Raspberry Pi, have a look at <a href="https://wiki.debian.org/NetworkConfiguration#Defining_the_.28DNS.29_Nameservers">this wiki 
153
+page</a> 
154
+(for Raspbian). To set it as the default DNS resolver on your network, have a
155
+look at your router configuration, and set the DNS resolvers address to the 
156
+address of your Raspberry Pi. Don't forget to open the ports in your firewall 
157
+(53 tcp and udp).</p>
158
+<p>To check everything is working fine, you can use <code>dig</code> (from <code>dnsutils</code> 
159
+package on Debian-based distributions). Typically, <code>dig google.fr</code> should give 
160
+you some results (in the <code>ANSWER SECTION</code>) and the IP address in the <code>SERVER</code> 
161
+line should be the one of your Raspberry Pi.</p>
162
+<p><strong>Note</strong>: At this point, we should emphasize that having an open DNS resolver
163
+(that is, a DNS resolver that can answer to anyone) can be a security risk
164
+especially since <a href="https://www.incapsula.com/ddos/attack-glossary/dns-amplification.html">some DDoS attacks use 
165
+it</a>. 
166
+Then, you should make sure that your Raspberry Pi DNS server is only 
167
+accessible from your local network, and that no third-party has access to it. 
168
+This should be done through the <code>access-control</code> line in the above 
169
+configuration, but this can also be enforced by the firewall running on your 
170
+Raspberry Pi and the firewall on your router (typically, most routers provided 
171
+by your ISP block any incoming connections, check this).</p>
172
+<h2>Block some domains based on hosts</h2>
173
+<p>Now, we would like <code>unbound</code> to block some domains that are known to serve ads 
174
+and malwares, in a similar way as Pi-Hole does. For this purpose, we will use 
175
+<a href="https://github.com/jodrell/unbound-block-hosts"><code>unbound-block-hosts</code></a> script
176
+to import <code>hosts</code> files into Unbound configuration. Basically, for every such 
177
+domain, Unbound will return <code>127.0.0.1</code>.</p>
178
+<p><code>unbound-block-hosts</code> is designed with the <a href="http://someonewhocares.org/">Dan Pollock's hosts
179
+file</a> in mind, whereas I wanted to be able to 
180
+import any host file in Unbound. 
181
+<a href="https://github.com/Phyks/unbound-block-hosts">Here</a> is a forked and patched
182
+version for this purpose (very ugly patch, as I am not fluent in Perl&nbsp;:/).</p>
183
+<p>We will create an <code>includes</code> dir in the Unbound configuration directory 
184
+(<code>mkdir&amp;nbsp;/etc/unbound/includes/</code>), and include the rules in the main
185
+configuration by appending <code>include: "/etc/unbound/includes/*.conf"</code> to the 
186
+<code>/etc/unbound/unbound.conf.d/local.conf</code> previously created.</p>
187
+<p>Now, you can run <code>./unbound-block-hosts --url="SOME_URL" 
188
+--file=/etc/unbound/includes/FOOBAR-blocking.conf</code> to generate a matching
189
+configuration for a given <code>hosts</code> list. Typically, I have a script doing:</p>
190
+<p>```</p>
191
+<h1>/bin/sh</h1>
192
+<p>set -e</p>
193
+<p>cd "$(dirname "$0")"</p>
194
+<p>echo "Fetch Malware domains list and append to unbound" 
195
+./unbound-block-hosts --url="http://www.malwaredomainlist.com/hostslist/hosts.txt" --file=/etc/unbound/includes/malwaredomainlist-blocking.conf --address="YOUR_RASPBERRY_PI_IP"
196
+echo "Fetch Yoyo ad servers list and append to unbound" 
197
+curl "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound;showintro=0&amp;mimetype=plaintext" &gt;&nbsp;/etc/unbound/includes/yoyoadservers-blocking.conf</p>
198
+<p>systemctl reload unbound 
199
+```</p>
200
+<p>which is crontask-ed to run every day. Default address is <code>127.0.0.1</code> which 
201
+means the local host for the client machine. I do not want to have too many 
202
+404 on my local webservers, so I'd rather put the IP address of the Raspberry 
203
+Pi and have a webserver answering a 404 on it.</p>
204
+<h2>Install a webserver</h2>
205
+<p>As simple as</p>
206
+<p><code>sudo apt-get install nginx</code></p>
207
+<h2>Install and configure Privoxy</h2>
208
+<p>Now, you can install Privoxy:</p>
209
+<p><code>sudo apt-get install privoxy</code></p>
210
+<p>The default configuration should be mostly ok. You can look at the 
211
+<code>/etc/privoxy/config</code> file to adapt it to your needs (the file is really an
212
+example of well documented config file). Two options you might be interesting 
213
+in changing are the <code>debug</code> option (to enable logging, which is disabled by 
214
+default) and <code>listen-addr</code>. You will want to set the latter to:</p>
215
+<p><code>listen-address  127.0.0.1:8118 
216
+listen-address  YOUR_RASPBERRY_PI_IP:8118</code></p>
217
+<p>so that the Prixovy proxy is accessible from the rest of your LAN. As always, 
218
+do not forget to configure your firewall to let the Privoxy connections pass 
219
+through. At this point, you should try to set the proxy in your browser's 
220
+preferences and check that everything is working fine. You should be able to 
221
+browse to any web page, but the proxy will not do anything else for the 
222
+moment.</p>
223
+<p><strong>Note</strong>: At this point, we should emphasize that having such a proxy is a
224
+security risk, as anyone having access to your proxy can browse the web with 
225
+your IP address (and you may be held liable for anything illegal done with 
226
+it). Then, you should make sure that your Raspberry Pi Privoxy is only 
227
+accessible from your local network, and that no third-party has access to it. 
228
+This should be enforced by the firewall running on your Raspberry Pi and the 
229
+firewall on your router (typically, most routers provided by your ISP block 
230
+any incoming connections, check this).</p>
231
+<p>Privoxy, as installed by the Raspbian package, enables a couple of filters out 
232
+of the box. As we will be translating Adblock rules into Privoxy rules, we can 
233
+disable them. Edit the <code>/etc/privoxy/match-all.action</code> file to get something 
234
+like this:</p>
235
+<p>```</p>
236
+<h6></h6>
237
+<h1>Id: match-all.action,v</h1>
238
+<h1></h1>
239
+<h1>This file contains the actions that are applied to all requests and</h1>
240
+<h1>may be overruled later on by other actions files. Less experienced</h1>
241
+<h1>users should only edit this file through the actions file editor.</h1>
242
+<h1></h1>
243
+<h6></h6>
244
+<p>{ \
245
++change-x-forwarded-for{block} \
246
++client-header-tagger{css-requests} \
247
++client-header-tagger{image-requests} \
248
++filter{refresh-tags} \
249
++filter{webbugs} \
250
++filter{jumping-windows} \
251
++filter{ie-exploits} \
252
++hide-from-header{block} \
253
++hide-referrer{conditional-block} \
254
+}
255
+/ # Match all URLs
256
+```</p>
257
+<p>In particular, I disabled the filters <code>img-reorder</code> (which is really intensive 
258
+for the Raspberry Pi, and takes a few hundreds of milliseconds to process a 
259
+regular page) and <code>banners-by-size</code> as we will be importing Adblock rules 
260
+which should give better results. <code>deanimate-gifs</code> and <code>session-cookies-only</code> 
261
+is a matter of taste (respectively it prevents animated GIFs by replacing them 
262
+by their last frame and only allowing temporary cookies).</p>
263
+<h2>Block ads using Privoxy</h2>
264
+<p>We will now be importing adBlock rules into privoxy. One way to do it is to 
265
+use <a href="http://projects.zubr.me/wiki/adblock2privoxy">this Haskell script</a>.</p>
266
+<p>To install it directly on your Raspberry Pi, provided you have a recent 
267
+Raspberry Pi:</p>
268
+<ul>
269
+<li>Install Haskell Stack http://allocinit.io/haskell/haskell-on-raspberry-pi-3/
270
+  (if you are feeling adventurous)</li>
271
+<li>Install adblock2privoxy
272
+  https://projects.zubr.me/wiki/adblock2privoxy#from-sources</li>
273
+</ul>
274
+<p>This was not my case, so I set up a builder on my server to run daily. Some 
275
+rules are <a href="http://projects.zubr.me/wiki/adblock2privoxyDownloads">provided by the 
276
+author</a> and my builds 
277
+are available <a href="http://pub.phyks.me/adblock2privoxy">here</a>.</p>
278
+<p>The way to set up the resulting files into Privoxy is very well detailed on 
279
+<a href="http://projects.zubr.me/wiki/adblock2privoxy#how-to-apply-results">the page of the
280
+project</a>.</p>
281
+<p><em>Note</em>: My builds are made with the Element Hiding feature and <code>example.com</code>
282
+as the <code>domainCSS</code> parameter. You should replace any occurrence of 
283
+<code>example.com</code> by the FQDN or IP adrdess of your Raspberry Pi when importing
284
+it. Please, do not put too much load on my hosted builds and consider hosting 
285
+your owns.</p>
286
+<h2>Benchmark</h2>
287
+<p>All the tests were made with a Raspberry Pi of the first model with 512MB of 
288
+RAM (model 1B). The Raspberry Pi has a wired access to internet (100MB/s port 
289
+only on the Raspberry Pi). My laptop is wired as well (gigabit ethernet). Home 
290
+connection to internet is a fiber access (923 Mbps download, 250 Mbps upload, 
291
+as reported by 
292
+<a href="https://www.dslreports.com/speedtest?httpsok=1&amp;r=489">DSLReports</a>).</p>
293
+<h3>Testing the DNS server</h3>
294
+<p>Without the DNS server,</p>
295
+<p>```
296
+$ # Using my ISP resolver
297
+$ % dig @192.168.0.254 example.com
298
+...
299
+;; Query time: 7 msec
300
+;; SERVER: 192.168.0.254#53(192.168.0.254)</p>
301
+<p>$ # Using Google DNS
302
+$ dig @8.8.8.8 example.com
303
+...
304
+;; Query time: 5 msec
305
+;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
306
+<p>$ # Using the DNS resolver on my Raspberry Pi
307
+$ dig @192.168.0.1 example.com
308
+...
309
+;; Query time: 505 msec
310
+;; SERVER: 192.168.0.1#53(192.168.0.1)</p>
311
+<p>$ # Using it another time, now that the domain is in cache
312
+$ dig @192.168.0.1 example.com
313
+...
314
+;; Query time: 5 msec
315
+;; SERVER: 192.168.0.1#53(192.168.0.1)
316
+```</p>
317
+<p>These are typical times, the value is typically the one obtained as average 
318
+of a few runs.</p>
319
+<p>We can see that there is some overhead when first accessing a domain, as the 
320
+Pi has to do the full DNS resolution. Afterwards, the domain is kept in cache 
321
+and it is as fast to use the DNS server from the Pi as it is to use any other 
322
+one.</p>
323
+<h3>Testing the Privoxy setup</h3>
324
+<p>Now, let us focus on the performances of the Privoxy on the Raspberry Pi. I 
325
+tested it with a few websites, and results were roughly the same. Here is a 
326
+detailed example of <a href="http://www.liberation.fr/direct/">Liberation's website</a>, 
327
+a French journal. This example is interesting as my µBlock setup on my laptop 
328
+blocks 23 different things when I don't use the DNS nor the Privoxy proxy. It 
329
+is also an interesting example as out of the 23 blocked contents, only 14 of 
330
+them could be blocked by DNS (with the setup described above).</p>
331
+<p>The main issue here is that Privoxy is very long to process the page with all 
332
+the filters, and it is way too heavy for my low power Raspberry Pi first 
333
+model.</p>
334
+<p>The main HTML document for this page takes 7 seconds to load when passing 
335
+through the proxy, mainly due to the processing time. When reloading the page, 
336
+it only takes 400ms as it is already in cache. As a comparison, it takes only 
337
+24ms when loading it directly.</p>
338
+<p>The complete setup looks equivalent to the µBlock setup on my laptop.</p>
339
+<p>I don't have a more recent version of the Raspberry Pi (typically Raspberry Pi 
340
+3) to test what the performances are on such a more powerful system. If you 
341
+can try it, let me know, I am curious about the way it handles the load, and I 
342
+could publish an edit to this article. </p>
343
+		<footer><p class="date">Le 04/04/2917 à 19:16</p>
344
+		<p class="tags">Tags : <a href="//phyks.me/tags/RaspberryPi.html">RaspberryPi</a></p></footer>
111 345
 	</div>
112 346
 </article>
113 347
             </div>

+ 3
- 3
blog/archives.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
@@ -43,7 +43,7 @@
43 43
                 </div>
44 44
 
45 45
                 <div id="articles">
46
-<article><div class="article"><h1 class="article_title">Archives</h1><ul><li><a href="//phyks.me/2017">2017</a></li><ul><li><a href="//phyks.me/2017/03">Mars</a></li><li><a href="//phyks.me/2017/02">Février</a></li><li><a href="//phyks.me/2017/01">Janvier</a></li></ul><li><a href="//phyks.me/2016">2016</a></li><ul><li><a href="//phyks.me/2016/12">Décembre</a></li><li><a href="//phyks.me/2016/08">Août</a></li><li><a href="//phyks.me/2016/05">Mai</a></li><li><a href="//phyks.me/2016/01">Janvier</a></li></ul><li><a href="//phyks.me/2015">2015</a></li><ul><li><a href="//phyks.me/2015/12">Décembre</a></li><li><a href="//phyks.me/2015/10">Octobre</a></li><li><a href="//phyks.me/2015/05">Mai</a></li><li><a href="//phyks.me/2015/04">Avril</a></li><li><a href="//phyks.me/2015/03">Mars</a></li><li><a href="//phyks.me/2015/02">Février</a></li><li><a href="//phyks.me/2015/01">Janvier</a></li></ul><li><a href="//phyks.me/2014">2014</a></li><ul><li><a href="//phyks.me/2014/11">Novembre</a></li><li><a href="//phyks.me/2014/10">Octobre</a></li><li><a href="//phyks.me/2014/08">Août</a></li><li><a href="//phyks.me/2014/07">Juillet</a></li><li><a href="//phyks.me/2014/04">Avril</a></li><li><a href="//phyks.me/2014/03">Mars</a></li><li><a href="//phyks.me/2014/02">Février</a></li></ul><li><a href="//phyks.me/2013">2013</a></li><ul><li><a href="//phyks.me/2013/12">Décembre</a></li><li><a href="//phyks.me/2013/11">Novembre</a></li></ul></ul></div></article>            </div>
46
+<article><div class="article"><h1 class="article_title">Archives</h1><ul><li><a href="//phyks.me/2017">2017</a></li><ul><li><a href="//phyks.me/2017/04">Avril</a></li><li><a href="//phyks.me/2017/03">Mars</a></li><li><a href="//phyks.me/2017/02">Février</a></li><li><a href="//phyks.me/2017/01">Janvier</a></li></ul><li><a href="//phyks.me/2016">2016</a></li><ul><li><a href="//phyks.me/2016/12">Décembre</a></li><li><a href="//phyks.me/2016/08">Août</a></li><li><a href="//phyks.me/2016/05">Mai</a></li><li><a href="//phyks.me/2016/01">Janvier</a></li></ul><li><a href="//phyks.me/2015">2015</a></li><ul><li><a href="//phyks.me/2015/12">Décembre</a></li><li><a href="//phyks.me/2015/10">Octobre</a></li><li><a href="//phyks.me/2015/05">Mai</a></li><li><a href="//phyks.me/2015/04">Avril</a></li><li><a href="//phyks.me/2015/03">Mars</a></li><li><a href="//phyks.me/2015/02">Février</a></li><li><a href="//phyks.me/2015/01">Janvier</a></li></ul><li><a href="//phyks.me/2014">2014</a></li><ul><li><a href="//phyks.me/2014/11">Novembre</a></li><li><a href="//phyks.me/2014/10">Octobre</a></li><li><a href="//phyks.me/2014/08">Août</a></li><li><a href="//phyks.me/2014/07">Juillet</a></li><li><a href="//phyks.me/2014/04">Avril</a></li><li><a href="//phyks.me/2014/03">Mars</a></li><li><a href="//phyks.me/2014/02">Février</a></li></ul><li><a href="//phyks.me/2013">2013</a></li><ul><li><a href="//phyks.me/2013/12">Décembre</a></li><li><a href="//phyks.me/2013/11">Novembre</a></li></ul></ul></div></article>            </div>
47 47
             <footer id="rss">
48 48
                 <p><a href="//phyks.me/rss.xml"><img src="//phyks.me/img/rss.png" alt="RSS"/></a></p>
49 49
             </footer>

+ 303
- 39
blog/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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>
@@ -45,6 +45,307 @@
45 45
                 <div id="articles">
46 46
 <article>
47 47
 	<aside>
48
+		<p class="day">04</p>
49
+		<p class="month">Avril</p>
50
+	</aside>
51
+	<div class="article">
52
+		<header><h1 class="article_title"><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></h1></header>
53
+		<!-- 
54
+    @author=Phyks
55
+    @date=04042917-1916
56
+    @title=Filtering ads with your Raspberry Pi
57
+    @tags=RaspberryPi
58
+-->
59
+
60
+<p>TL;DR: Please have a look at the benchmark section below, to be aware of the 
61
+limitations of this particular setup and decide whether to spend some time 
62
+putting it in place or not.</p>
63
+<p>I recently came across <a href="https://github.com/pi-hole/pi-hole">this Pi-Hole 
64
+project</a> that claims to be "a black hole 
65
+for Internet advertisements" (thanks <a href="https://nicofrand.eu/">nicofrand</a> for 
66
+making me discover this!). The idea was really attractive: having a simple 
67
+Raspberry Pi on the network doing all the ad filtering for the whole network, 
68
+rather than having to maintain a separate <a href="https://github.com/gorhill/uBlock">uBlock 
69
+Origin</a> install on each and every computers 
70
+of the network. It was also particularly attractive as having such ad blocker 
71
+on a smartphone requires a rooted device. Plus there was a really nice web 
72
+interface to control the whole ad blocking device.</p>
73
+<p>While looking at it more in depth, I realized it was actually very limited:</p>
74
+<ol>
75
+<li>First, it was built around specific softwares and was doing some magical 
76
+   stuff using these softwares. It was really painful to get away from them.
77
+   Basically, it uses <code>dnsmasq</code> to expose a DNS service, a standard <code>hosts</code>
78
+   file to block the hosts serving ads, and a lighthttpd webserver. Problem is
79
+   I already have a DNS resolver (<code>unbound</code>) on this Raspberry Pi, and a web
80
+   server (<code>nginx</code>). I did not want to spend a lot of time trying to integrate
81
+   it in my existing setup if finally it was not that powerful, so I decided
82
+   to look at it in details before installing.</li>
83
+<li>Second issue was that it relies on <code>dnsmasq</code>. <code>dnsmasq</code> is a simple program 
84
+   that allow you to answer DNS queries by using the hosts defined in
85
+   <code>/etc/hosts</code> and to forward every other requests to another DNS server
86
+   (typically your ISP DNS server). Pi-Hole lets you configure two DNS servers
87
+   to forward queries to, default one being 8.8.8.8 (<code>Google</code>&nbsp;:/). I already
88
+   have a resolver on this Raspberry-Pi and I do want to do the resolution
89
+   myself, especially since my ISP DNS servers lies, and I do not want to use
90
+   public DNS server on another network. So I had to hack on Pi-Hole to do
91
+   some DNS resolution. About these issues, I'd like to point to two very
92
+   interesting articles from <a href="http://www.bortzmeyer.org/">Bortzmeyer</a>: <a href="http://www.bortzmeyer.org/google-dns">this
93
+   one about Google DNS</a> (in French) and
94
+   <a href="http://www.bortzmeyer.org/son-propre-resolveur-dns.html">this one about having your own DNS
95
+   resolver</a> (same).
96
+   Also, being a DNS resolver, it may be cumbersome to disable it temporarily
97
+   to load some website that absolutely requires the ads to be loaded.</li>
98
+<li>Last issue was that contrary to uBlock which filters at the requests level 
99
+   (and even sometimes at the HTML level), the fact that is basically an
100
+   alternative DNS resolver means you can only filter at the domain level.
101
+   That is, you either whitelist (default) or blacklist a domain which is
102
+   serving ads or malwares, but you cannot differentiate different paths for a
103
+   given domain. While browsing <a href="http://liberation.fr/">Libération website</a>, I
104
+   can see uBlock is blocking queries such as
105
+   <code>http://s3.amazonaws.com/files.wrapper.theadtech.com/native/placements/liberation.fr/pconfig?r=5a6f5d98b4d608</code>.
106
+   Such queries <strong>cannot</strong> be blocked by Pi-Hole without blacklisting the
107
+   whole Amazon S3 network.</li>
108
+</ol>
109
+<p>Given these facts, I remembered <a href="https://www.privoxy.org/">Privoxy</a> which can 
110
+be used as a filtering proxy, in a way similar to uBlock. Given that it is a 
111
+proxy, it can filter in details, just as uBlock do and you can very easily 
112
+disable it (simply disable the proxy). Plus, almost any devices offer you a 
113
+proxy setting, so it should work both on my Android phones and computers. In 
114
+this article I describe how I set up a Pi-Hole alternative based on Unbound 
115
+(to have my own DNS resolver and block some things at the domain level)
116
+coupled with a Privoxy proxy to filter out ads.</p>
117
+<p><strong>Limitations</strong>: So, contrary to Pi-Hole, the setup described here will be
118
+able to remove ads in a similar way to uBlock/AdBlock. If you go through the 
119
+whole article till the end, it will also have the element hiding features. 
120
+Being a proxy setting, it will be easy to toggle it on and off (either by 
121
+Prixovy toggling features or by manually turning off proxy on your device), if 
122
+required. However, be aware of the remaining limitations with regards to HTTPS 
123
+streams (<a href="https://www.privoxy.org/faq/misc.html">section 4.15</a>). As 
124
+AdBlock/uBlock runs in the browser, it can filter ads in HTTPS streams as 
125
+well, Privoxy will not be as efficient without HTTPS interception (which is 
126
+generally not a good idea). However, it should perform rather well in the vast 
127
+majority of situations (also note that AdBlock for rooted Android devices is 
128
+also a proxy, so for them, it will not change anything).</p>
129
+<p>I assume you already have a running Raspberry Pi with some basic install. 
130
+Typically, see <a href="https://known.phyks.me/2017/raspberry-pi-install-checklist">this previous 
131
+article</a> if this 
132
+is not the case</p>
133
+<h2>Set up a DNS resolver</h2>
134
+<p>Let's install a DNS resolver on the Raspberry Pi, to answer DNS queries on the 
135
+network. I am installing unbound and configuring Unbound here.</p>
136
+<p><code>$ sudo apt-get install unbound
137
+$ curl -o&amp;nbsp;/etc/unbound/root.hints https://www.internic.net/domain/named.cache
138
+$ # (Optional) Set crontask to download root.hints file every six months</code></p>
139
+<p>The last <code>curl</code> command is used to fetch the root hints, to query hosts that 
140
+are not cached. See <a href="https://wiki.archlinux.org/index.php/unbound#Root_hints">this section of the ArchWiki 
141
+page</a> for more infos.</p>
142
+<p>Then, you can create a basic configuration file for unbound.</p>
143
+<p><code>$ cat&amp;nbsp;/etc/unbound/unbound.conf.d/local.conf
144
+server: 
145
+    username: "unbound"
146
+    interface: 0.0.0.0  # Listen on all interfaces
147
+    root-hints: "/etc/unbound/root.hints"
148
+    access-control: 192.168.0.0/8 allow  # Access-control, see "Example" section in https://www.unbound.net/documentation/unbound.conf.html</code></p>
149
+<p>Then, enable and start Unbound service at startup:</p>
150
+<p><code>$ sudo systemctl start unbound &amp;&amp; sudo systemctl enable unbound</code></p>
151
+<p>You can now change the resolver to be used on your Raspberry Pi and on your 
152
+whole network. To change it on your Raspberry Pi, have a look at <a href="https://wiki.debian.org/NetworkConfiguration#Defining_the_.28DNS.29_Nameservers">this wiki 
153
+page</a> 
154
+(for Raspbian). To set it as the default DNS resolver on your network, have a
155
+look at your router configuration, and set the DNS resolvers address to the 
156
+address of your Raspberry Pi. Don't forget to open the ports in your firewall 
157
+(53 tcp and udp).</p>
158
+<p>To check everything is working fine, you can use <code>dig</code> (from <code>dnsutils</code> 
159
+package on Debian-based distributions). Typically, <code>dig google.fr</code> should give 
160
+you some results (in the <code>ANSWER SECTION</code>) and the IP address in the <code>SERVER</code> 
161
+line should be the one of your Raspberry Pi.</p>
162
+<p><strong>Note</strong>: At this point, we should emphasize that having an open DNS resolver
163
+(that is, a DNS resolver that can answer to anyone) can be a security risk
164
+especially since <a href="https://www.incapsula.com/ddos/attack-glossary/dns-amplification.html">some DDoS attacks use 
165
+it</a>. 
166
+Then, you should make sure that your Raspberry Pi DNS server is only 
167
+accessible from your local network, and that no third-party has access to it. 
168
+This should be done through the <code>access-control</code> line in the above 
169
+configuration, but this can also be enforced by the firewall running on your 
170
+Raspberry Pi and the firewall on your router (typically, most routers provided 
171
+by your ISP block any incoming connections, check this).</p>
172
+<h2>Block some domains based on hosts</h2>
173
+<p>Now, we would like <code>unbound</code> to block some domains that are known to serve ads 
174
+and malwares, in a similar way as Pi-Hole does. For this purpose, we will use 
175
+<a href="https://github.com/jodrell/unbound-block-hosts"><code>unbound-block-hosts</code></a> script
176
+to import <code>hosts</code> files into Unbound configuration. Basically, for every such 
177
+domain, Unbound will return <code>127.0.0.1</code>.</p>
178
+<p><code>unbound-block-hosts</code> is designed with the <a href="http://someonewhocares.org/">Dan Pollock's hosts
179
+file</a> in mind, whereas I wanted to be able to 
180
+import any host file in Unbound. 
181
+<a href="https://github.com/Phyks/unbound-block-hosts">Here</a> is a forked and patched
182
+version for this purpose (very ugly patch, as I am not fluent in Perl&nbsp;:/).</p>
183
+<p>We will create an <code>includes</code> dir in the Unbound configuration directory 
184
+(<code>mkdir&amp;nbsp;/etc/unbound/includes/</code>), and include the rules in the main
185
+configuration by appending <code>include: "/etc/unbound/includes/*.conf"</code> to the 
186
+<code>/etc/unbound/unbound.conf.d/local.conf</code> previously created.</p>
187
+<p>Now, you can run <code>./unbound-block-hosts --url="SOME_URL" 
188
+--file=/etc/unbound/includes/FOOBAR-blocking.conf</code> to generate a matching
189
+configuration for a given <code>hosts</code> list. Typically, I have a script doing:</p>
190
+<p>```</p>
191
+<h1>/bin/sh</h1>
192
+<p>set -e</p>
193
+<p>cd "$(dirname "$0")"</p>
194
+<p>echo "Fetch Malware domains list and append to unbound" 
195
+./unbound-block-hosts --url="http://www.malwaredomainlist.com/hostslist/hosts.txt" --file=/etc/unbound/includes/malwaredomainlist-blocking.conf --address="YOUR_RASPBERRY_PI_IP"
196
+echo "Fetch Yoyo ad servers list and append to unbound" 
197
+curl "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound;showintro=0&amp;mimetype=plaintext" &gt;&nbsp;/etc/unbound/includes/yoyoadservers-blocking.conf</p>
198
+<p>systemctl reload unbound 
199
+```</p>
200
+<p>which is crontask-ed to run every day. Default address is <code>127.0.0.1</code> which 
201
+means the local host for the client machine. I do not want to have too many 
202
+404 on my local webservers, so I'd rather put the IP address of the Raspberry 
203
+Pi and have a webserver answering a 404 on it.</p>
204
+<h2>Install a webserver</h2>
205
+<p>As simple as</p>
206
+<p><code>sudo apt-get install nginx</code></p>
207
+<h2>Install and configure Privoxy</h2>
208
+<p>Now, you can install Privoxy:</p>
209
+<p><code>sudo apt-get install privoxy</code></p>
210
+<p>The default configuration should be mostly ok. You can look at the 
211
+<code>/etc/privoxy/config</code> file to adapt it to your needs (the file is really an
212
+example of well documented config file). Two options you might be interesting 
213
+in changing are the <code>debug</code> option (to enable logging, which is disabled by 
214
+default) and <code>listen-addr</code>. You will want to set the latter to:</p>
215
+<p><code>listen-address  127.0.0.1:8118 
216
+listen-address  YOUR_RASPBERRY_PI_IP:8118</code></p>
217
+<p>so that the Prixovy proxy is accessible from the rest of your LAN. As always, 
218
+do not forget to configure your firewall to let the Privoxy connections pass 
219
+through. At this point, you should try to set the proxy in your browser's 
220
+preferences and check that everything is working fine. You should be able to 
221
+browse to any web page, but the proxy will not do anything else for the 
222
+moment.</p>
223
+<p><strong>Note</strong>: At this point, we should emphasize that having such a proxy is a
224
+security risk, as anyone having access to your proxy can browse the web with 
225
+your IP address (and you may be held liable for anything illegal done with 
226
+it). Then, you should make sure that your Raspberry Pi Privoxy is only 
227
+accessible from your local network, and that no third-party has access to it. 
228
+This should be enforced by the firewall running on your Raspberry Pi and the 
229
+firewall on your router (typically, most routers provided by your ISP block 
230
+any incoming connections, check this).</p>
231
+<p>Privoxy, as installed by the Raspbian package, enables a couple of filters out 
232
+of the box. As we will be translating Adblock rules into Privoxy rules, we can 
233
+disable them. Edit the <code>/etc/privoxy/match-all.action</code> file to get something 
234
+like this:</p>
235
+<p>```</p>
236
+<h6></h6>
237
+<h1>Id: match-all.action,v</h1>
238
+<h1></h1>
239
+<h1>This file contains the actions that are applied to all requests and</h1>
240
+<h1>may be overruled later on by other actions files. Less experienced</h1>
241
+<h1>users should only edit this file through the actions file editor.</h1>
242
+<h1></h1>
243
+<h6></h6>
244
+<p>{ \
245
++change-x-forwarded-for{block} \
246
++client-header-tagger{css-requests} \
247
++client-header-tagger{image-requests} \
248
++filter{refresh-tags} \
249
++filter{webbugs} \
250
++filter{jumping-windows} \
251
++filter{ie-exploits} \
252
++hide-from-header{block} \
253
++hide-referrer{conditional-block} \
254
+}
255
+/ # Match all URLs
256
+```</p>
257
+<p>In particular, I disabled the filters <code>img-reorder</code> (which is really intensive 
258
+for the Raspberry Pi, and takes a few hundreds of milliseconds to process a 
259
+regular page) and <code>banners-by-size</code> as we will be importing Adblock rules 
260
+which should give better results. <code>deanimate-gifs</code> and <code>session-cookies-only</code> 
261
+is a matter of taste (respectively it prevents animated GIFs by replacing them 
262
+by their last frame and only allowing temporary cookies).</p>
263
+<h2>Block ads using Privoxy</h2>
264
+<p>We will now be importing adBlock rules into privoxy. One way to do it is to 
265
+use <a href="http://projects.zubr.me/wiki/adblock2privoxy">this Haskell script</a>.</p>
266
+<p>To install it directly on your Raspberry Pi, provided you have a recent 
267
+Raspberry Pi:</p>
268
+<ul>
269
+<li>Install Haskell Stack http://allocinit.io/haskell/haskell-on-raspberry-pi-3/
270
+  (if you are feeling adventurous)</li>
271
+<li>Install adblock2privoxy
272
+  https://projects.zubr.me/wiki/adblock2privoxy#from-sources</li>
273
+</ul>
274
+<p>This was not my case, so I set up a builder on my server to run daily. Some 
275
+rules are <a href="http://projects.zubr.me/wiki/adblock2privoxyDownloads">provided by the 
276
+author</a> and my builds 
277
+are available <a href="http://pub.phyks.me/adblock2privoxy">here</a>.</p>
278
+<p>The way to set up the resulting files into Privoxy is very well detailed on 
279
+<a href="http://projects.zubr.me/wiki/adblock2privoxy#how-to-apply-results">the page of the
280
+project</a>.</p>
281
+<p><em>Note</em>: My builds are made with the Element Hiding feature and <code>example.com</code>
282
+as the <code>domainCSS</code> parameter. You should replace any occurrence of 
283
+<code>example.com</code> by the FQDN or IP adrdess of your Raspberry Pi when importing
284
+it. Please, do not put too much load on my hosted builds and consider hosting 
285
+your owns.</p>
286
+<h2>Benchmark</h2>
287
+<p>All the tests were made with a Raspberry Pi of the first model with 512MB of 
288
+RAM (model 1B). The Raspberry Pi has a wired access to internet (100MB/s port 
289
+only on the Raspberry Pi). My laptop is wired as well (gigabit ethernet). Home 
290
+connection to internet is a fiber access (923 Mbps download, 250 Mbps upload, 
291
+as reported by 
292
+<a href="https://www.dslreports.com/speedtest?httpsok=1&amp;r=489">DSLReports</a>).</p>
293
+<h3>Testing the DNS server</h3>
294
+<p>Without the DNS server,</p>
295
+<p>```
296
+$ # Using my ISP resolver
297
+$ % dig @192.168.0.254 example.com
298
+...
299
+;; Query time: 7 msec
300
+;; SERVER: 192.168.0.254#53(192.168.0.254)</p>
301
+<p>$ # Using Google DNS
302
+$ dig @8.8.8.8 example.com
303
+...
304
+;; Query time: 5 msec
305
+;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
306
+<p>$ # Using the DNS resolver on my Raspberry Pi
307
+$ dig @192.168.0.1 example.com
308
+...
309
+;; Query time: 505 msec
310
+;; SERVER: 192.168.0.1#53(192.168.0.1)</p>
311
+<p>$ # Using it another time, now that the domain is in cache
312
+$ dig @192.168.0.1 example.com
313
+...
314
+;; Query time: 5 msec
315
+;; SERVER: 192.168.0.1#53(192.168.0.1)
316
+```</p>
317
+<p>These are typical times, the value is typically the one obtained as average 
318
+of a few runs.</p>
319
+<p>We can see that there is some overhead when first accessing a domain, as the 
320
+Pi has to do the full DNS resolution. Afterwards, the domain is kept in cache 
321
+and it is as fast to use the DNS server from the Pi as it is to use any other 
322
+one.</p>
323
+<h3>Testing the Privoxy setup</h3>
324
+<p>Now, let us focus on the performances of the Privoxy on the Raspberry Pi. I 
325
+tested it with a few websites, and results were roughly the same. Here is a 
326
+detailed example of <a href="http://www.liberation.fr/direct/">Liberation's website</a>, 
327
+a French journal. This example is interesting as my µBlock setup on my laptop 
328
+blocks 23 different things when I don't use the DNS nor the Privoxy proxy. It 
329
+is also an interesting example as out of the 23 blocked contents, only 14 of 
330
+them could be blocked by DNS (with the setup described above).</p>
331
+<p>The main issue here is that Privoxy is very long to process the page with all 
332
+the filters, and it is way too heavy for my low power Raspberry Pi first 
333
+model.</p>
334
+<p>The main HTML document for this page takes 7 seconds to load when passing 
335
+through the proxy, mainly due to the processing time. When reloading the page, 
336
+it only takes 400ms as it is already in cache. As a comparison, it takes only 
337
+24ms when loading it directly.</p>
338
+<p>The complete setup looks equivalent to the µBlock setup on my laptop.</p>
339
+<p>I don't have a more recent version of the Raspberry Pi (typically Raspberry Pi 
340
+3) to test what the performances are on such a more powerful system. If you 
341
+can try it, let me know, I am curious about the way it handles the load, and I 
342
+could publish an edit to this article. </p>
343
+		<footer><p class="date">Le 04/04/2917 à 19:16</p>
344
+		<p class="tags">Tags : <a href="//phyks.me/tags/RaspberryPi.html">RaspberryPi</a></p></footer>
345
+	</div>
346
+</article>
347
+<article>
348
+	<aside>
48 349
 		<p class="day">31</p>
49 350
 		<p class="month">Mars</p>
50 351
 	</aside>
@@ -903,43 +1204,6 @@ Password: nimble </p>
903 1204
 		<p class="tags">Tags : <a href="//phyks.me/tags/aNimble.html">aNimble</a></p></footer>
904 1205
 	</div>
905 1206
 </article>
906
-<article>
907
-	<aside>
908
-		<p class="day">13</p>
909
-		<p class="month">Février</p>
910
-	</aside>
911
-	<div class="article">
912
-		<header><h1 class="article_title"><a href="//phyks.me/2015/02/opendata_altimetry.html">Looking for altitude OpenData</a></h1></header>
913
-		<!-- 
914
-    @author=Phyks
915
-    @date=13022015-1735
916
-    @title=Looking for altitude OpenData
917
-    @tags=GeoData, OpenData
918
--->
919
-
920
-<p>Recently, for a personal project, I looked for opendata for altitude in France. These are not so easy to find, although there are some really good opendata out there, with a very great accuracy. Indeed, <a href="http://www.openstreetmap.org/#map=5/51.500/-0.100">OpenStreetMaps</a> provides really accurate opendata for maps (street names and so on), but absolutely nothing concerning the altitude.</p>
921
-<p>I finally found two datasets available for France, one published by <a href="https://www.data.gouv.fr/fr/datasets/bd-alti-75m/">IGN</a> and the other one being the <a href="http://wiki.openstreetmap.org/wiki/SRTM">SRTM</a> dataset published by the NASA. The one from IGN provides altitude information for the whole French territory, at a resolution of 75m, which is quite good for numerically modeling the terrain. The one from NASA is more complete and provides altitude information for the whole globe surface between -60° and 60° latitude at a resolution of about 90m, obtained by averaging on 30m samples.</p>
922
-<h2>IGN BD ALTI opendata</h2>
923
-<p>First of all, let's have a look at the BD ALTI from IGN, which is not as widely used as the SRTM one (at least in a hobbyist context) and does not have much documentation around there.</p>
924
-<p>IGN provides an archive containing the data for the whole French territory. In the archive, there are several folders. The interesting one, in our case, is <code>1_DONNEES_LIVRAISON_*</code> which contains all the data files.</p>
925
-<p>Altitude data is available in two formats: GeoTiff (Tiff with geolocation metadata) and ASCII Esri grid. I personally used the ASCII Esri Grid files. For more info about this file format, you can refer to <a href="https://en.wikipedia.org/wiki/Esri_grid#ASCII">the Wikipedia page</a>.</p>
926
-<p>Each file starts with some header informations: number of rows and cols (1000), position of the lower-left corner in X and Y coordinates, size of an elementary cell and value used to indicate missing data. The file then contains a matrix representing the values of each cell, as described in the Wikipedia page.</p>
927
-<p>Position on the map is indicated in X and Y coordinates, and not using the standard latitude and longitude coordinates. This is a different projection system, called <a href="https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert">Lambert93</a>, and used for official maps of France. <a href="https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert">Wikipedia</a> contains the relevant information to translate from the standard WGS84 (satellite latitude and longitude coordinates) to the Lambert93 coordinates, and reciprocally but the best way seems to be to use the <a href="http://trac.osgeo.org/proj/">Proj.4 libray</a> which has a <a href="https://pypi.python.org/pypi/pyproj?">Python binding</a> to handle the conversion.</p>
928
-<p>To find a specific point, you should then iterate over the available data files and check if the position of the point is between <code>xllcorner, yllcorner</code> and <code>xllcorner + ncols * cellsize, yllcorner + nrows * cellsize</code>. Then, you just have to get the value of the matching cell in the matrix description in the file.</p>
929
-<p>An example script is available at <a href="https://github.com/Phyks/IGN_OpenData">https://github.com/Phyks/IGN_OpenData</a>. It takes a rectangle defined by two latitudes and longitudes in input, as well as the data folder to process, and will output the relevant data from the BD ALTI dataset, in XYZ file format, which is equivalent to a CSV file with columns X, Y and altitude (Z), separated by tabulations, and sorted. This is also an example use of the Proj.4 Python binding to handle basic coordinates system transforms.</p>
930
-<h2>SRTM opendata</h2>
931
-<p>The SRTM dataset exists in multiple versions and different samplings. Have a look at <a href="https://github.com/Phyks/IGN_OpenData">this wiki page</a> to have more information about it. I was interested in SRTMGL3 version 3, which is the third iteration of the dataset sampled at 3 arcseconds (which is about 90m). It is available at <a href="this address">http://e4ftl01.cr.usgs.gov/SRTM/SRTMGL3.003/</a> (before clicking the main folder in this address, please note that this is very heavy and long to process as it contains all the files for the whole world). <a href="">rv</a> uses it and provides a basic import script to a PostgreSQL database, available <a href="https://gitlab.crans.org/leger/rv/blob/master/height/populate_height_table.cc">here</a>.</p>
932
-<p>All files are named with a convention to describe the tile they represent. For instance, the tile starting at 0° North and 6° East is called <code>N00E006.*</code>.</p>
933
-<p>There is a really nice <a href="https://gis.stackexchange.com/questions/43743/how-to-extract-elevation-from-hgt-file">StackOverflow post</a> to explain how to handle these files and the following will almost be a rewriting of this post.</p>
934
-<p>First of all, take the integer part of the position you want (latitude and longitude), and look for the corresponding file at the previous address. You will download a (zipped) hgt file containing the altitude data. This file is a big-endian binary file that you will have to parse.</p>
935
-<p>First, you have to find the pixels coordinates representing your geographic point. To this purpose, you have to take the floating part of the latitude and longitude of the point you want and convert them to arcseconds (e.g. for 50° 24' 58.888", you will have 24 * 60 + 58.888 = 1498.888). As the sampling is done at 3 arcseconds, the pixel coordinates are given by the closest integer to the latitude (resp. longitude) of your point, expressed in arcseconds, divided by 3. Latitude will give you the row index, whereas longitude will give you the col index.</p>
936
-<p>The first row in the file is the northernmost one, so if we are looking at row 500 from the lower edge, we actually have to look at row 1201 - 500 from the beginning of the files (1200 being 3600&nbsp;/ 3, the total number of rows in the data file).</p>
937
-<p>We then have to iterate on cols to find the correct one, using the same principle.</p>
938
-<p>An example script is available <a href="https://github.com/Phyks/IGN_OpenData/blob/master/srtm_alti.py">here</a> although it was not thoroughly tested. If you fix any problem with it, please report&nbsp;:) </p>
939
-		<footer><p class="date">Le 13/02/2015 à 17:35</p>
940
-		<p class="tags">Tags : <a href="//phyks.me/tags/GeoData.html">GeoData</a>, <a href="//phyks.me/tags/OpenData.html">OpenData</a></p></footer>
941
-	</div>
942
-</article>
943 1207
 <p class="archives"><a href="//phyks.me/archives.html">Archives</a></p>            </div>
944 1208
             <footer id="rss">
945 1209
                 <p><a href="//phyks.me/rss.xml"><img src="//phyks.me/img/rss.png" alt="RSS"/></a></p>

+ 310
- 45
blog/rss.xml View File

@@ -7,7 +7,316 @@
7 7
 		<language>fr</language>
8 8
 		<copyright>CC BY</copyright>
9 9
 		<webMaster>webmaster@phyks.me (Phyks)</webMaster>
10
-		<lastBuildDate>Fri, 31 Mar 2017 16:58:26 -0000</lastBuildDate>
10
+		<lastBuildDate>Tue, 04 Apr 2017 16:16:24 -0000</lastBuildDate>
11
+		<item>
12
+			<title>Filtering ads with your Raspberry Pi</title>
13
+			<link>http://phyks.me/2017/04/privoxy_raspberry_pi.html</link>
14
+			<guid isPermaLink="true">http://phyks.me/2017/04/privoxy_raspberry_pi.html</guid>
15
+			<description>
16
+
17
+
18
+
19
+TL;DR: Please have a look at the benchmark section below, to be aware of the 
20
+limitations of this particular setup and decide whether to spend some time 
21
+putting it in place or no…</description>
22
+			<content:encoded><![CDATA[<div class="article">
23
+<header></header>
24
+<!-- 
25
+    @author=Phyks
26
+    @date=04042917-1916
27
+    @title=Filtering ads with your Raspberry Pi
28
+    @tags=RaspberryPi
29
+-->
30
+<p>TL;DR: Please have a look at the benchmark section below, to be aware of the 
31
+limitations of this particular setup and decide whether to spend some time 
32
+putting it in place or not.</p>
33
+<p>I recently came across <a href="https://github.com/pi-hole/pi-hole">this Pi-Hole 
34
+project</a> that claims to be "a black hole 
35
+for Internet advertisements" (thanks <a href="https://nicofrand.eu/">nicofrand</a> for 
36
+making me discover this!). The idea was really attractive: having a simple 
37
+Raspberry Pi on the network doing all the ad filtering for the whole network, 
38
+rather than having to maintain a separate <a href="https://github.com/gorhill/uBlock">uBlock 
39
+Origin</a> install on each and every computers 
40
+of the network. It was also particularly attractive as having such ad blocker 
41
+on a smartphone requires a rooted device. Plus there was a really nice web 
42
+interface to control the whole ad blocking device.</p>
43
+<p>While looking at it more in depth, I realized it was actually very limited:</p>
44
+<ol>
45
+<li>First, it was built around specific softwares and was doing some magical 
46
+   stuff using these softwares. It was really painful to get away from them.
47
+   Basically, it uses <code>dnsmasq</code> to expose a DNS service, a standard <code>hosts</code>
48
+   file to block the hosts serving ads, and a lighthttpd webserver. Problem is
49
+   I already have a DNS resolver (<code>unbound</code>) on this Raspberry Pi, and a web
50
+   server (<code>nginx</code>). I did not want to spend a lot of time trying to integrate
51
+   it in my existing setup if finally it was not that powerful, so I decided
52
+   to look at it in details before installing.</li>
53
+<li>Second issue was that it relies on <code>dnsmasq</code>. <code>dnsmasq</code> is a simple program 
54
+   that allow you to answer DNS queries by using the hosts defined in
55
+   <code>/etc/hosts</code> and to forward every other requests to another DNS server
56
+   (typically your ISP DNS server). Pi-Hole lets you configure two DNS servers
57
+   to forward queries to, default one being 8.8.8.8 (<code>Google</code> :/). I already
58
+   have a resolver on this Raspberry-Pi and I do want to do the resolution
59
+   myself, especially since my ISP DNS servers lies, and I do not want to use
60
+   public DNS server on another network. So I had to hack on Pi-Hole to do
61
+   some DNS resolution. About these issues, I'd like to point to two very
62
+   interesting articles from <a href="http://www.bortzmeyer.org/">Bortzmeyer</a>: <a href="http://www.bortzmeyer.org/google-dns">this
63
+   one about Google DNS</a> (in French) and
64
+   <a href="http://www.bortzmeyer.org/son-propre-resolveur-dns.html">this one about having your own DNS
65
+   resolver</a> (same).
66
+   Also, being a DNS resolver, it may be cumbersome to disable it temporarily
67
+   to load some website that absolutely requires the ads to be loaded.</li>
68
+<li>Last issue was that contrary to uBlock which filters at the requests level 
69
+   (and even sometimes at the HTML level), the fact that is basically an
70
+   alternative DNS resolver means you can only filter at the domain level.
71
+   That is, you either whitelist (default) or blacklist a domain which is
72
+   serving ads or malwares, but you cannot differentiate different paths for a
73
+   given domain. While browsing <a href="http://liberation.fr/">Libération website</a>, I
74
+   can see uBlock is blocking queries such as
75
+   <code>http://s3.amazonaws.com/files.wrapper.theadtech.com/native/placements/liberation.fr/pconfig?r=5a6f5d98b4d608</code>.
76
+   Such queries <strong>cannot</strong> be blocked by Pi-Hole without blacklisting the
77
+   whole Amazon S3 network.</li>
78
+</ol>
79
+<p>Given these facts, I remembered <a href="https://www.privoxy.org/">Privoxy</a> which can 
80
+be used as a filtering proxy, in a way similar to uBlock. Given that it is a 
81
+proxy, it can filter in details, just as uBlock do and you can very easily 
82
+disable it (simply disable the proxy). Plus, almost any devices offer you a 
83
+proxy setting, so it should work both on my Android phones and computers. In 
84
+this article I describe how I set up a Pi-Hole alternative based on Unbound 
85
+(to have my own DNS resolver and block some things at the domain level)
86
+coupled with a Privoxy proxy to filter out ads.</p>
87
+<p><strong>Limitations</strong>: So, contrary to Pi-Hole, the setup described here will be
88
+able to remove ads in a similar way to uBlock/AdBlock. If you go through the 
89
+whole article till the end, it will also have the element hiding features. 
90
+Being a proxy setting, it will be easy to toggle it on and off (either by 
91
+Prixovy toggling features or by manually turning off proxy on your device), if 
92
+required. However, be aware of the remaining limitations with regards to HTTPS 
93
+streams (<a href="https://www.privoxy.org/faq/misc.html">section 4.15</a>). As 
94
+AdBlock/uBlock runs in the browser, it can filter ads in HTTPS streams as 
95
+well, Privoxy will not be as efficient without HTTPS interception (which is 
96
+generally not a good idea). However, it should perform rather well in the vast 
97
+majority of situations (also note that AdBlock for rooted Android devices is 
98
+also a proxy, so for them, it will not change anything).</p>
99
+<p>I assume you already have a running Raspberry Pi with some basic install. 
100
+Typically, see <a href="https://known.phyks.me/2017/raspberry-pi-install-checklist">this previous 
101
+article</a> if this 
102
+is not the case</p>
103
+<h2>Set up a DNS resolver</h2>
104
+<p>Let's install a DNS resolver on the Raspberry Pi, to answer DNS queries on the 
105
+network. I am installing unbound and configuring Unbound here.</p>
106
+<p><code>$ sudo apt-get install unbound
107
+$ curl -o&amp;nbsp;/etc/unbound/root.hints https://www.internic.net/domain/named.cache
108
+$ # (Optional) Set crontask to download root.hints file every six months</code></p>
109
+<p>The last <code>curl</code> command is used to fetch the root hints, to query hosts that 
110
+are not cached. See <a href="https://wiki.archlinux.org/index.php/unbound#Root_hints">this section of the ArchWiki 
111
+page</a> for more infos.</p>
112
+<p>Then, you can create a basic configuration file for unbound.</p>
113
+<p><code>$ cat&amp;nbsp;/etc/unbound/unbound.conf.d/local.conf
114
+server: 
115
+    username: "unbound"
116
+    interface: 0.0.0.0  # Listen on all interfaces
117
+    root-hints: "/etc/unbound/root.hints"
118
+    access-control: 192.168.0.0/8 allow  # Access-control, see "Example" section in https://www.unbound.net/documentation/unbound.conf.html</code></p>
119
+<p>Then, enable and start Unbound service at startup:</p>
120
+<p><code>$ sudo systemctl start unbound &amp;&amp; sudo systemctl enable unbound</code></p>
121
+<p>You can now change the resolver to be used on your Raspberry Pi and on your 
122
+whole network. To change it on your Raspberry Pi, have a look at <a href="https://wiki.debian.org/NetworkConfiguration#Defining_the_.28DNS.29_Nameservers">this wiki 
123
+page</a> 
124
+(for Raspbian). To set it as the default DNS resolver on your network, have a
125
+look at your router configuration, and set the DNS resolvers address to the 
126
+address of your Raspberry Pi. Don't forget to open the ports in your firewall 
127
+(53 tcp and udp).</p>
128
+<p>To check everything is working fine, you can use <code>dig</code> (from <code>dnsutils</code> 
129
+package on Debian-based distributions). Typically, <code>dig google.fr</code> should give 
130
+you some results (in the <code>ANSWER SECTION</code>) and the IP address in the <code>SERVER</code> 
131
+line should be the one of your Raspberry Pi.</p>
132
+<p><strong>Note</strong>: At this point, we should emphasize that having an open DNS resolver
133
+(that is, a DNS resolver that can answer to anyone) can be a security risk
134
+especially since <a href="https://www.incapsula.com/ddos/attack-glossary/dns-amplification.html">some DDoS attacks use 
135
+it</a>. 
136
+Then, you should make sure that your Raspberry Pi DNS server is only 
137
+accessible from your local network, and that no third-party has access to it. 
138
+This should be done through the <code>access-control</code> line in the above 
139
+configuration, but this can also be enforced by the firewall running on your 
140
+Raspberry Pi and the firewall on your router (typically, most routers provided 
141
+by your ISP block any incoming connections, check this).</p>
142
+<h2>Block some domains based on hosts</h2>
143
+<p>Now, we would like <code>unbound</code> to block some domains that are known to serve ads 
144
+and malwares, in a similar way as Pi-Hole does. For this purpose, we will use 
145
+<a href="https://github.com/jodrell/unbound-block-hosts"><code>unbound-block-hosts</code></a> script
146
+to import <code>hosts</code> files into Unbound configuration. Basically, for every such 
147
+domain, Unbound will return <code>127.0.0.1</code>.</p>
148
+<p><code>unbound-block-hosts</code> is designed with the <a href="http://someonewhocares.org/">Dan Pollock's hosts
149
+file</a> in mind, whereas I wanted to be able to 
150
+import any host file in Unbound. 
151
+<a href="https://github.com/Phyks/unbound-block-hosts">Here</a> is a forked and patched
152
+version for this purpose (very ugly patch, as I am not fluent in Perl :/).</p>
153
+<p>We will create an <code>includes</code> dir in the Unbound configuration directory 
154
+(<code>mkdir&amp;nbsp;/etc/unbound/includes/</code>), and include the rules in the main
155
+configuration by appending <code>include: "/etc/unbound/includes/*.conf"</code> to the 
156
+<code>/etc/unbound/unbound.conf.d/local.conf</code> previously created.</p>
157
+<p>Now, you can run <code>./unbound-block-hosts --url="SOME_URL" 
158
+--file=/etc/unbound/includes/FOOBAR-blocking.conf</code> to generate a matching
159
+configuration for a given <code>hosts</code> list. Typically, I have a script doing:</p>
160
+<p>```</p>
161
+<h1>/bin/sh</h1>
162
+<p>set -e</p>
163
+<p>cd "$(dirname "$0")"</p>
164
+<p>echo "Fetch Malware domains list and append to unbound" 
165
+./unbound-block-hosts --url="http://www.malwaredomainlist.com/hostslist/hosts.txt" --file=/etc/unbound/includes/malwaredomainlist-blocking.conf --address="YOUR_RASPBERRY_PI_IP"
166
+echo "Fetch Yoyo ad servers list and append to unbound" 
167
+curl "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound;showintro=0&amp;mimetype=plaintext" &gt; /etc/unbound/includes/yoyoadservers-blocking.conf</p>
168
+<p>systemctl reload unbound 
169
+```</p>
170
+<p>which is crontask-ed to run every day. Default address is <code>127.0.0.1</code> which 
171
+means the local host for the client machine. I do not want to have too many 
172
+404 on my local webservers, so I'd rather put the IP address of the Raspberry 
173
+Pi and have a webserver answering a 404 on it.</p>
174
+<h2>Install a webserver</h2>
175
+<p>As simple as</p>
176
+<p><code>sudo apt-get install nginx</code></p>
177
+<h2>Install and configure Privoxy</h2>
178
+<p>Now, you can install Privoxy:</p>
179
+<p><code>sudo apt-get install privoxy</code></p>
180
+<p>The default configuration should be mostly ok. You can look at the 
181
+<code>/etc/privoxy/config</code> file to adapt it to your needs (the file is really an
182
+example of well documented config file). Two options you might be interesting 
183
+in changing are the <code>debug</code> option (to enable logging, which is disabled by 
184
+default) and <code>listen-addr</code>. You will want to set the latter to:</p>
185
+<p><code>listen-address  127.0.0.1:8118 
186
+listen-address  YOUR_RASPBERRY_PI_IP:8118</code></p>
187
+<p>so that the Prixovy proxy is accessible from the rest of your LAN. As always, 
188
+do not forget to configure your firewall to let the Privoxy connections pass 
189
+through. At this point, you should try to set the proxy in your browser's 
190
+preferences and check that everything is working fine. You should be able to 
191
+browse to any web page, but the proxy will not do anything else for the 
192
+moment.</p>
193
+<p><strong>Note</strong>: At this point, we should emphasize that having such a proxy is a
194
+security risk, as anyone having access to your proxy can browse the web with 
195
+your IP address (and you may be held liable for anything illegal done with 
196
+it). Then, you should make sure that your Raspberry Pi Privoxy is only 
197
+accessible from your local network, and that no third-party has access to it. 
198
+This should be enforced by the firewall running on your Raspberry Pi and the 
199
+firewall on your router (typically, most routers provided by your ISP block 
200
+any incoming connections, check this).</p>
201
+<p>Privoxy, as installed by the Raspbian package, enables a couple of filters out 
202
+of the box. As we will be translating Adblock rules into Privoxy rules, we can 
203
+disable them. Edit the <code>/etc/privoxy/match-all.action</code> file to get something 
204
+like this:</p>
205
+<p>```</p>
206
+<h6></h6>
207
+<h1>Id: match-all.action,v</h1>
208
+<h1></h1>
209
+<h1>This file contains the actions that are applied to all requests and</h1>
210
+<h1>may be overruled later on by other actions files. Less experienced</h1>
211
+<h1>users should only edit this file through the actions file editor.</h1>
212
+<h1></h1>
213
+<h6></h6>
214
+<p>{ \
215
++change-x-forwarded-for{block} \
216
++client-header-tagger{css-requests} \
217
++client-header-tagger{image-requests} \
218
++filter{refresh-tags} \
219
++filter{webbugs} \
220
++filter{jumping-windows} \
221
++filter{ie-exploits} \
222
++hide-from-header{block} \
223
++hide-referrer{conditional-block} \
224
+}
225
+/ # Match all URLs
226
+```</p>
227
+<p>In particular, I disabled the filters <code>img-reorder</code> (which is really intensive 
228
+for the Raspberry Pi, and takes a few hundreds of milliseconds to process a 
229
+regular page) and <code>banners-by-size</code> as we will be importing Adblock rules 
230
+which should give better results. <code>deanimate-gifs</code> and <code>session-cookies-only</code> 
231
+is a matter of taste (respectively it prevents animated GIFs by replacing them 
232
+by their last frame and only allowing temporary cookies).</p>
233
+<h2>Block ads using Privoxy</h2>
234
+<p>We will now be importing adBlock rules into privoxy. One way to do it is to 
235
+use <a href="http://projects.zubr.me/wiki/adblock2privoxy">this Haskell script</a>.</p>
236
+<p>To install it directly on your Raspberry Pi, provided you have a recent 
237
+Raspberry Pi:</p>
238
+<ul>
239
+<li>Install Haskell Stack http://allocinit.io/haskell/haskell-on-raspberry-pi-3/
240
+  (if you are feeling adventurous)</li>
241
+<li>Install adblock2privoxy
242
+  https://projects.zubr.me/wiki/adblock2privoxy#from-sources</li>
243
+</ul>
244
+<p>This was not my case, so I set up a builder on my server to run daily. Some 
245
+rules are <a href="http://projects.zubr.me/wiki/adblock2privoxyDownloads">provided by the 
246
+author</a> and my builds 
247
+are available <a href="http://pub.phyks.me/adblock2privoxy">here</a>.</p>
248
+<p>The way to set up the resulting files into Privoxy is very well detailed on 
249
+<a href="http://projects.zubr.me/wiki/adblock2privoxy#how-to-apply-results">the page of the
250
+project</a>.</p>
251
+<p><em>Note</em>: My builds are made with the Element Hiding feature and <code>example.com</code>
252
+as the <code>domainCSS</code> parameter. You should replace any occurrence of 
253
+<code>example.com</code> by the FQDN or IP adrdess of your Raspberry Pi when importing
254
+it. Please, do not put too much load on my hosted builds and consider hosting 
255
+your owns.</p>
256
+<h2>Benchmark</h2>
257
+<p>All the tests were made with a Raspberry Pi of the first model with 512MB of 
258
+RAM (model 1B). The Raspberry Pi has a wired access to internet (100MB/s port 
259
+only on the Raspberry Pi). My laptop is wired as well (gigabit ethernet). Home 
260
+connection to internet is a fiber access (923 Mbps download, 250 Mbps upload, 
261
+as reported by 
262
+<a href="https://www.dslreports.com/speedtest?httpsok=1&amp;r=489">DSLReports</a>).</p>
263
+<h3>Testing the DNS server</h3>
264
+<p>Without the DNS server,</p>
265
+<p>```
266
+$ # Using my ISP resolver
267
+$ % dig @192.168.0.254 example.com
268
+...
269
+;; Query time: 7 msec
270
+;; SERVER: 192.168.0.254#53(192.168.0.254)</p>
271
+<p>$ # Using Google DNS
272
+$ dig @8.8.8.8 example.com
273
+...
274
+;; Query time: 5 msec
275
+;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
276
+<p>$ # Using the DNS resolver on my Raspberry Pi
277
+$ dig @192.168.0.1 example.com
278
+...
279
+;; Query time: 505 msec
280
+;; SERVER: 192.168.0.1#53(192.168.0.1)</p>
281
+<p>$ # Using it another time, now that the domain is in cache
282
+$ dig @192.168.0.1 example.com
283
+...
284
+;; Query time: 5 msec
285
+;; SERVER: 192.168.0.1#53(192.168.0.1)
286
+```</p>
287
+<p>These are typical times, the value is typically the one obtained as average 
288
+of a few runs.</p>
289
+<p>We can see that there is some overhead when first accessing a domain, as the 
290
+Pi has to do the full DNS resolution. Afterwards, the domain is kept in cache 
291
+and it is as fast to use the DNS server from the Pi as it is to use any other 
292
+one.</p>
293
+<h3>Testing the Privoxy setup</h3>
294
+<p>Now, let us focus on the performances of the Privoxy on the Raspberry Pi. I 
295
+tested it with a few websites, and results were roughly the same. Here is a 
296
+detailed example of <a href="http://www.liberation.fr/direct/">Liberation's website</a>, 
297
+a French journal. This example is interesting as my µBlock setup on my laptop 
298
+blocks 23 different things when I don't use the DNS nor the Privoxy proxy. It 
299
+is also an interesting example as out of the 23 blocked contents, only 14 of 
300
+them could be blocked by DNS (with the setup described above).</p>
301
+<p>The main issue here is that Privoxy is very long to process the page with all 
302
+the filters, and it is way too heavy for my low power Raspberry Pi first 
303
+model.</p>
304
+<p>The main HTML document for this page takes 7 seconds to load when passing 
305
+through the proxy, mainly due to the processing time. When reloading the page, 
306
+it only takes 400ms as it is already in cache. As a comparison, it takes only 
307
+24ms when loading it directly.</p>
308
+<p>The complete setup looks equivalent to the µBlock setup on my laptop.</p>
309
+<p>I don't have a more recent version of the Raspberry Pi (typically Raspberry Pi 
310
+3) to test what the performances are on such a more powerful system. If you 
311
+can try it, let me know, I am curious about the way it handles the load, and I 
312
+could publish an edit to this article. </p>
313
+<footer>
314
+<p class="tags">Tags : <a href="http://phyks.me/tags/RaspberryPi.html">RaspberryPi</a></p></footer>
315
+</div>]]></content:encoded>
316
+			<pubDate>Sun, 04 Apr 2917 16:16:00 -0000</pubDate>
317
+			<category>RaspberryPi</category>
318
+			<author>webmaster@phyks.me (Phyks)</author>
319
+		</item>
11 320
 		<item>
12 321
 			<title>Don du mois de mars : Jupyter</title>
13 322
 			<link>http://phyks.me/2017/03/don_mars.html</link>
@@ -1022,49 +1331,5 @@ Password: nimble </p>
1022 1331
 			<category>aNimble</category>
1023 1332
 			<author>webmaster@phyks.me (Phyks)</author>
1024 1333
 		</item>
1025
-		<item>
1026
-			<title>Looking for altitude OpenData</title>
1027
-			<link>http://phyks.me/2015/02/opendata_altimetry.html</link>
1028
-			<guid isPermaLink="true">http://phyks.me/2015/02/opendata_altimetry.html</guid>
1029
-			<description>
1030
-
1031
-
1032
-
1033
-Recently, for a personal project, I looked for opendata for altitude in France. These are not so easy to find, although there are some really good opendata out there, with a very great accurac…</description>
1034
-			<content:encoded><![CDATA[<div class="article">
1035
-<header></header>
1036
-<!-- 
1037
-    @author=Phyks
1038
-    @date=13022015-1735
1039
-    @title=Looking for altitude OpenData
1040
-    @tags=GeoData, OpenData
1041
--->
1042
-<p>Recently, for a personal project, I looked for opendata for altitude in France. These are not so easy to find, although there are some really good opendata out there, with a very great accuracy. Indeed, <a href="http://www.openstreetmap.org/#map=5/51.500/-0.100">OpenStreetMaps</a> provides really accurate opendata for maps (street names and so on), but absolutely nothing concerning the altitude.</p>
1043
-<p>I finally found two datasets available for France, one published by <a href="https://www.data.gouv.fr/fr/datasets/bd-alti-75m/">IGN</a> and the other one being the <a href="http://wiki.openstreetmap.org/wiki/SRTM">SRTM</a> dataset published by the NASA. The one from IGN provides altitude information for the whole French territory, at a resolution of 75m, which is quite good for numerically modeling the terrain. The one from NASA is more complete and provides altitude information for the whole globe surface between -60° and 60° latitude at a resolution of about 90m, obtained by averaging on 30m samples.</p>
1044
-<h2>IGN BD ALTI opendata</h2>
1045
-<p>First of all, let's have a look at the BD ALTI from IGN, which is not as widely used as the SRTM one (at least in a hobbyist context) and does not have much documentation around there.</p>
1046
-<p>IGN provides an archive containing the data for the whole French territory. In the archive, there are several folders. The interesting one, in our case, is <code>1_DONNEES_LIVRAISON_*</code> which contains all the data files.</p>
1047
-<p>Altitude data is available in two formats: GeoTiff (Tiff with geolocation metadata) and ASCII Esri grid. I personally used the ASCII Esri Grid files. For more info about this file format, you can refer to <a href="https://en.wikipedia.org/wiki/Esri_grid#ASCII">the Wikipedia page</a>.</p>
1048
-<p>Each file starts with some header informations: number of rows and cols (1000), position of the lower-left corner in X and Y coordinates, size of an elementary cell and value used to indicate missing data. The file then contains a matrix representing the values of each cell, as described in the Wikipedia page.</p>
1049
-<p>Position on the map is indicated in X and Y coordinates, and not using the standard latitude and longitude coordinates. This is a different projection system, called <a href="https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert">Lambert93</a>, and used for official maps of France. <a href="https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert">Wikipedia</a> contains the relevant information to translate from the standard WGS84 (satellite latitude and longitude coordinates) to the Lambert93 coordinates, and reciprocally but the best way seems to be to use the <a href="http://trac.osgeo.org/proj/">Proj.4 libray</a> which has a <a href="https://pypi.python.org/pypi/pyproj?">Python binding</a> to handle the conversion.</p>
1050
-<p>To find a specific point, you should then iterate over the available data files and check if the position of the point is between <code>xllcorner, yllcorner</code> and <code>xllcorner + ncols * cellsize, yllcorner + nrows * cellsize</code>. Then, you just have to get the value of the matching cell in the matrix description in the file.</p>
1051
-<p>An example script is available at <a href="https://github.com/Phyks/IGN_OpenData">https://github.com/Phyks/IGN_OpenData</a>. It takes a rectangle defined by two latitudes and longitudes in input, as well as the data folder to process, and will output the relevant data from the BD ALTI dataset, in XYZ file format, which is equivalent to a CSV file with columns X, Y and altitude (Z), separated by tabulations, and sorted. This is also an example use of the Proj.4 Python binding to handle basic coordinates system transforms.</p>
1052
-<h2>SRTM opendata</h2>
1053
-<p>The SRTM dataset exists in multiple versions and different samplings. Have a look at <a href="https://github.com/Phyks/IGN_OpenData">this wiki page</a> to have more information about it. I was interested in SRTMGL3 version 3, which is the third iteration of the dataset sampled at 3 arcseconds (which is about 90m). It is available at <a href="this address">http://e4ftl01.cr.usgs.gov/SRTM/SRTMGL3.003/</a> (before clicking the main folder in this address, please note that this is very heavy and long to process as it contains all the files for the whole world). <a href="">rv</a> uses it and provides a basic import script to a PostgreSQL database, available <a href="https://gitlab.crans.org/leger/rv/blob/master/height/populate_height_table.cc">here</a>.</p>
1054
-<p>All files are named with a convention to describe the tile they represent. For instance, the tile starting at 0° North and 6° East is called <code>N00E006.*</code>.</p>
1055
-<p>There is a really nice <a href="https://gis.stackexchange.com/questions/43743/how-to-extract-elevation-from-hgt-file">StackOverflow post</a> to explain how to handle these files and the following will almost be a rewriting of this post.</p>
1056
-<p>First of all, take the integer part of the position you want (latitude and longitude), and look for the corresponding file at the previous address. You will download a (zipped) hgt file containing the altitude data. This file is a big-endian binary file that you will have to parse.</p>
1057
-<p>First, you have to find the pixels coordinates representing your geographic point. To this purpose, you have to take the floating part of the latitude and longitude of the point you want and convert them to arcseconds (e.g. for 50° 24' 58.888", you will have 24 * 60 + 58.888 = 1498.888). As the sampling is done at 3 arcseconds, the pixel coordinates are given by the closest integer to the latitude (resp. longitude) of your point, expressed in arcseconds, divided by 3. Latitude will give you the row index, whereas longitude will give you the col index.</p>
1058
-<p>The first row in the file is the northernmost one, so if we are looking at row 500 from the lower edge, we actually have to look at row 1201 - 500 from the beginning of the files (1200 being 3600 / 3, the total number of rows in the data file).</p>
1059
-<p>We then have to iterate on cols to find the correct one, using the same principle.</p>
1060
-<p>An example script is available <a href="https://github.com/Phyks/IGN_OpenData/blob/master/srtm_alti.py">here</a> although it was not thoroughly tested. If you fix any problem with it, please report :) </p>
1061
-<footer>
1062
-<p class="tags">Tags : <a href="http://phyks.me/tags/GeoData.html">GeoData</a>, <a href="http://phyks.me/tags/OpenData.html">OpenData</a></p></footer>
1063
-</div>]]></content:encoded>
1064
-			<pubDate>Fri, 13 Feb 2015 15:35:00 -0000</pubDate>
1065
-			<category>GeoData</category>
1066
-			<category>OpenData</category>
1067
-			<author>webmaster@phyks.me (Phyks)</author>
1068
-		</item>
1069 1334
 	</channel>
1070 1335
 </rss>

+ 2
- 2
blog/tags/.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Arch.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Autohébergement.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/CoffeeShops.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/DIY.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Dev.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Development.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Devops.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/DonDuMois.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/Game Engine.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/GeoData.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>

+ 2
- 2
blog/tags/JavaScript.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/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</a> </div>
19
+                            <div class="tag"><a href="//phyks.me/tags/aNimble.html">/aNimble (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Arch.html">/Arch (48)</a> </div><div class="tag"><a href="//phyks.me/tags/Autohébergement.html">/Autohébergement (48)</a> </div><div class="tag"><a href="//phyks.me/tags/CoffeeShops.html">/CoffeeShops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Development.html">/Development (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Devops.html">/Devops (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Dev.html">/Dev (128)</a> </div><div class="tag"><a href="//phyks.me/tags/DIY.html">/DIY (34)</a> </div><div class="tag"><a href="//phyks.me/tags/DonDuMois.html">/DonDuMois (4)</a> </div><div class="tag"><a href="//phyks.me/tags/Électronique.html">/Électronique (32)</a> </div><div class="tag"><a href="//phyks.me/tags/Game Engine.html">/Game Engine (1)</a> </div><div class="tag"><a href="//phyks.me/tags/GeoData.html">/GeoData (1)</a> </div><div class="tag"><a href="//phyks.me/tags/i3.html">/i3 (1)</a> </div><div class="tag"><a href="//phyks.me/tags/JavaScript.html">/JavaScript (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Known.html">/Known (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Libre.html">/Libre (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Linux.html">/Linux (96)</a> </div><div class="tag"><a href="//phyks.me/tags/Localization.html">/Localization (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Mobile.html">/Mobile (1)</a> </div><div class="tag"><a href="//phyks.me/tags/OpenAccess.html">/OpenAccess (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Phyks.html">/Phyks (3)</a> </div><div class="tag"><a href="//phyks.me/tags/RaspberryPi.html">/RaspberryPi (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Science.html">/Science (2)</a> </div><div class="tag"><a href="//phyks.me/tags/Selfhost.html">/Selfhost (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Smartphone.html">/Smartphone (32)</a> </div><div class="tag"><a href="//phyks.me/tags/.html">/ (1)</a> </div><div class="tag"><a href="//phyks.me/tags/TupperVim.html">/TupperVim (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Vim.html">/Vim (17)</a> </div><div class="tag"><a href="//phyks.me/tags/Webapp.html">/Webapp (1)</a> </div><div class="tag"><a href="//phyks.me/tags/Web.html">/Web (112)</a> </div><div class="tag"><a href="//phyks.me/tags/Weechat.html">/Weechat (32)</a> </div><div class="tag"><a href="//phyks.me/tags/workstation.html">/workstation (1)</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/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/2016/12/don_decembre.html">Don du mois de décembre&nbsp;: EFF</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
24
+                            <li><a href="//phyks.me/2017/04/privoxy_raspberry_pi.html">Filtering ads with your Raspberry Pi</a></li><li><a href="//phyks.me/2017/03/don_mars.html">Don du mois de mars&nbsp;: Jupyter</a></li><li><a href="//phyks.me/2017/03/don_fevrier.html">Don du mois de février&nbsp;: i3wm</a></li><li><a href="//phyks.me/2017/02/raspberry_pi_setup_checklist.html">Raspberry Pi install checklist</a></li><li><a href="//phyks.me/2017/01/don_janvier.html">Don du mois de janvier&nbsp;: Framasoft</a></li><li><a href="//phyks.me/archives.html">Archives</a></li>
25 25
                         </ul>
26 26
 
27 27
                     <h2>Liens</h2>