-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
398 lines (328 loc) · 30.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Bob Maerten</title>
<subtitle>Humeurs, interrogations, pâtisseries, développement web, systèmes Linux et autres curiosités</subtitle>
<id>https://bobmaerten.eu/blog</id>
<link href="https://bobmaerten.eu/blog"/>
<link href="https://bobmaerten.eu/blog/atom.xml" rel="self"/>
<updated>2016-04-23T13:59:46+02:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<entry>
<title>Déploiement zero-downtime d'une application Rails</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/deploiement-zero-downtime-d-une-application-rails.html"/>
<id>https://bobmaerten.eu/blog/deploiement-zero-downtime-d-une-application-rails.html</id>
<published>2016-04-23T13:59:46+02:00</published>
<updated>2016-04-23T18:23:11+02:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Lors du dernier apéro <a href="http://ruby-nord.org">Ruby Nord</a>, j&#39;ai eu l&#39;opportunité d&#39;exposer les concepts du déploiement d&#39;application Rails sans interruption de service.</p>
<p></p>
<p><img alt="Talk Avril 2016" src="img/posts/talk_avril_2016-ff147572.jpg" /></p>
<p><a href="https://speakerdeck.com/bobmaerten/deploiment-dune-application-rails-sans-interruption-de-service">Les <em>slides</em> de ce <em>talk</em></a> se trouvent sur SpeakerDeck, et les <a href="https://gitlab.com/bobmaerten/presentation-zdd">sources</a> sont disponibles chez GitLab.</p>
</content>
</entry>
<entry>
<title>Un nouveau look pour le blog</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/un-nouveau-look-pour-le-blog.html"/>
<id>https://bobmaerten.eu/blog/un-nouveau-look-pour-le-blog.html</id>
<published>2016-03-06T14:12:07+01:00</published>
<updated>2016-03-12T08:44:02+01:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Il y avait décidément trop d&#39;images sur cette page d&#39;accueil et cela faisait quelques temps que je souhaitais rendre plus lisible le texte des billets.</p>
<p></p>
<p>C&#39;est désormais chose faite avec ce nouveau thème : <a href="http://lanyon.getpoole.com/">Lanyon</a> issu du monde &ldquo;Jekyll&rdquo; que je trouve particulièrement épuré.</p>
<p>J&#39;ai hésité (et j&#39;avoue hésiter encore) avec un autre thème épuré que j&#39;apprécie également : <a href="https://github.com/danielbayerlein/middleman-casper">Casper</a>. C&#39;est le thème de base utilisé par le CMS <a href="https://ghost.org">Ghost</a> avec la même philosophie de simplicité, mais j&#39;ai trouvé que Lanyon était plus facile à adapter à la logique existante de ma configuration de <a href="https://middlemanapp.com">Middleman 3</a>.</p>
<p>Eh non, je ne suis toujours pas passé à la version 4, le monde du CMS statique étant moins sensible à la montée en version des générateurs…</p>
</content>
</entry>
<entry>
<title>Une image docker de base légère pour rails5</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/une-image-docker-de-base-legere-pour-rails5.html"/>
<id>https://bobmaerten.eu/blog/une-image-docker-de-base-legere-pour-rails5.html</id>
<published>2016-02-06T14:38:57+01:00</published>
<updated>2016-03-06T14:26:22+01:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Une des bonnes pratiques pour la construction d&#39;images docker est de minimiser leur taille et en particulier d&#39;avoir le moins de &ldquo;couche&rdquo; possible. D&#39;ailleurs, il y a quelques jours, Docker a <a href="https://www.brianchristner.io/docker-is-moving-to-alpine-linux/">annoncé la migration de ses images officielles</a> de la distribution ubuntu à alpine-linux pour réduire au maximum le volume de données utiles. Parmi ces images, c&#39;est <a href="https://hub.docker.com/_/ruby/"><code>ruby:alpine</code></a> qui m&#39;intéresse particulièrement, et c&#39;était l&#39;occasion rêvée d&#39;expérimenter la création d&#39;une image d&#39;une application de base pour rails 5.0.0-beta2.</p>
<p></p>
<p>Il faut dire que l&#39;image officielle de rails n&#39;est pas des plus légère :</p>
<pre class="highlight plaintext"><code>$ docker images | grep rails
rails latest efa7b55d5f4d 9 days ago 826.4 MB
</code></pre>
<p>L&#39;idée est donc de partir de l&#39;image officielle ruby-alpine qui a également l&#39;avantage de fournir la version 2.3 de ruby.</p>
<pre class="highlight plaintext"><code>FROM ruby:2.3-alpine
MAINTAINER [email protected]
COPY Gemfile Gemfile.lock /app/
WORKDIR /app
RUN \
# Install ruby packages needed for runtime
apk add --no-cache \
nodejs \
postgresql-client \
libgcrypt \
libxml2 \
libxslt \
tzdata \
# Install ruby packages needed for native gems building
&amp;&amp; apk add --no-cache --virtual build-dependencies \
build-base \
postgresql-dev \
libc-dev \
curl-dev \
qt-dev \
libxml2-dev \
libxslt-dev \
linux-headers \
# Configure bundler to use system libxml libraries at compile time
&amp;&amp; bundle config build.nokogiri --use-system-libraries \
# Install default rails5 gems
&amp;&amp; bundle install --without development test \
# Remove native gem building dependencies to ease weight on docker image
&amp;&amp; apk del build-dependencies \
# Also remove cache to gain even more
&amp;&amp; rm -rf /var/cache/apk/*
ADD . /app
RUN chown -R nobody:nogroup /app
USER nobody
ENV RAILS_ENV production
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
</code></pre>
<p>Reste plus qu&#39;à construire cette image :</p>
<pre class="highlight plaintext"><code>$ docker build -t rails5-alpine-base .
</code></pre>
<p>Pour constater une jolie économie :</p>
<pre class="highlight plaintext"><code>$ docker images | grep rails
rails5-alpine-base latest fab4676a469a 2 minutes ago 216.1 MB
rails latest efa7b55d5f4d 9 days ago 826.4 MB
</code></pre>
<p>Et pourtant fonctionnelle, pour peu qu&#39;on lui associe une base postgres, comme avec ce <em>compose file</em> :</p>
<pre class="highlight plaintext"><code>postgres:
image: postgres:9.5
environment:
POSTGRES_USER: railsapp
POSTGRES_PASSWORD: railsapp
web:
image: bobmaerten:rails5-alpine-base
links:
- postgres
ports:
- '3000:3000'
environment:
RAILS_ENV: development
DATABASE_URL: "postgresql://railsapp:railsapp@postgres/railsapp?pool=5"
</code></pre>
<p>Et de lancer la <em>stack</em> avec la commande :</p>
<pre class="highlight plaintext"><code>$ docker-compose up -d
</code></pre>
<p>Et voila notre application rails de base disponible !</p>
<p><img alt="Ruby on Rails 5" src="blog/une-image-docker-de-base-legere-pour-rails5/Ruby_on_Rails-ad72eb85.png" /></p>
<p>Bon, évidemment il ne s&#39;agit là que de l&#39;application nue, et il est fort probable que pour chaque nouvelle gem ajoutée à notre <code>Gemfile</code> une <em>lib</em> manquera à l&#39;appel et il faudra spécialiser l&#39;image en reprenant le <em>process</em>.</p>
<p>Pour ce faire, il est donc possible de créer un autre <code>Dockerfile</code> qui hérite de notre image de base et reprendre l&#39;ajout de <em>packages</em> nécessaires à la compilation des gems natives, un peu comme cet exemple :</p>
<pre class="highlight plaintext"><code>FROM bobmaerten:rails5-alpine-base
MAINTAINER [email protected]
# switch to root to install packages
USER root
RUN set -x \
&amp;&amp; apk add --no-cache \
# &lt;insert packages needed for runtime here&gt; \
bash \
&amp;&amp; apk add --no-cache --virtual .gems-builddeps \
# &lt;insert packages needed for native gem buiding here&gt; \
build-base \
postgresql-dev \
libc-dev \
curl-dev \
qt-dev \
libxml2-dev \
libxslt-dev \
linux-headers \
&amp;&amp; rm -rf /var/cache/apk/*
COPY Gemfile /app/
COPY Gemfile.lock /app/
RUN bundle install
# Remove gems building packages deps
RUN apk del .gems-builddeps
# switch back to default user to run app
USER nobody
COPY . /app
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
</code></pre>
<p>Mais cela me fait poser la question de l&#39;intérêt de sous-classer plutôt que de profiter du système de cache de docker et de reprendre la création de l&#39;image quasiment à sa base (alpine:3.3).</p>
<p>Je ne pense pas avoir assez de recul ni sur cette problématique ni sur l&#39;usage au quotidien de rails avec docker pour répondre à cette question. Mais si vous avez un avis la dessus (en attendant un retour prochain des commentaires), n&#39;hésitez pas à ma le partager via les réseaux sociaux, ou par mail si vous préférez plus d&rsquo;&lsquo;intimité, après un passage sur <a href="https://keybase.io/bobmaerten">keybase.io</a>.</p>
</content>
</entry>
<entry>
<title>Un certificat Let's Encrypt toujours à jour sur le blog avec Docker</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/un-certificat-let-s-encrypt-toujours-a-jour-sur-le-blog-avec-docker.html"/>
<id>https://bobmaerten.eu/blog/un-certificat-let-s-encrypt-toujours-a-jour-sur-le-blog-avec-docker.html</id>
<published>2016-01-27T09:08:09+01:00</published>
<updated>2016-01-27T14:22:24+01:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Depuis l&#39;année dernière ce blog répond exclusivement en HTTPS grâce à un certificat valide et reconnu, issu d&#39;une <a href="https://www.wosign.com">autorité de certification chinoise</a> qui propose (proposait ?) des certificats gratuits. Mais depuis, <a href="https://letsencrypt.org">Let&rsquo;s encrypt</a> est disponible en béta publique et je cherchais depuis quelques jours un moyen de l&#39;inclure dans la <em>stack</em> d&#39;hébergement de ce blog et permettre la création et le renouvellement automatique de certificat SSL, comme il est promis dans la documentation.</p>
<p></p>
<h2>Contexte</h2>
<p>Ce blog est servi au travers de deux conteneurs Docker:</p>
<ul>
<li>un issu de l&#39;image officielle <a href="http://hub.docker.com/_/nginx">nginx</a> sur laquelle j&#39;y ajoute le <a href="http://github.com/bobmaerten/bobmaerten.eu">contenu statique</a> ;</li>
<li>un autre exécutant l&#39;image du <a href="http://hub.docker.com/r/jwilder/nginx-proxy">reverse-proxy nginx</a> de <a href="http://jasonwilder.com/">Jason Wilder</a> permettant d&#39;uniformiser la configuration des différents sites et d&#39;aiguiller vers le bon conteneur.</li>
</ul>
<p>Il ne manquait plus qu&#39;un dernier conteneur qui assurerait la gestion et le suivi des certificats issus de Let&rsquo;s Encrypt. Mais j&#39;avais beau essayer d&#39;utiliser le client officiel de différente manières, il y a toujours une étape ou le client doit se substituer au serveur web réel pour répondre au challenge proposé par les serveurs de Let&rsquo;s Encrypt, afin de valider la demande de certificat.</p>
<p>Heureusement, nous évoluons dans une sphère libre ! Il existe dès lors <a href="https://www.metachris.com/2015/12/comparison-of-10-acme-lets-encrypt-clients/">moultes implémentations</a> légèrement différentes du client officiel. Et c&#39;est avec l&#39;une de ces implémentations qu&rsquo;<a href="https://github.com/JrCs">Yves Blusseau</a> a eu l&#39;excellente idée d&rsquo;<a href="https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion">implémenter ce que je cherchais à faire</a> : un conteneur qui fait tourner un client lets-encrypt, pilotant automatiquement la configuration du reverse-proxy pour la réponse au challenge du serveur et assurant la gestion des certificats, en incluant tout cela dans la configuration de nginx.</p>
<h2>Bon et techniquement, ça donne quoi ?</h2>
<p>Donc voici les commandes qui me permettent de lancer la <em>stack</em> de ce blog</p>
<pre class="highlight shell"><code><span class="c"># Démarrage du reverse-proxy nginx</span>
docker run --name nginx-proxy <span class="se">\</span>
-p 80:80 -p 443:443 <span class="se">\</span>
-v /home/bob/certs:/etc/nginx/certs:ro <span class="se">\</span>
-v /etc/nginx/vhost.d <span class="se">\</span>
-v /usr/share/nginx/html <span class="se">\</span>
-v /var/run/docker.sock:/tmp/docker.sock:ro <span class="se">\</span>
--restart<span class="o">=</span>always <span class="se">\</span>
--detach jwilder/nginx-proxy
</code></pre>
<p>Le conteneur accède au répertoire de l&#39;hôte pour les certificats ainsi que sur le socket du <em>daemon</em> Docker, car il a besoin de récupérer les metadonnées des conteneurs (notamment la variable VIRTUAL_HOST, voir ci-dessous). Deux volumes sur <code>/etc/nginx/vhost.d</code> et <code>/usr/share/nginx/html</code> sont déclarés car ils seront utilisés par le conteneur lets-encrypt.</p>
<pre class="highlight shell"><code><span class="c"># Démarrage du conteneur de gestion des certificats et de la conf nginx</span>
docker run --name letsencrypt-companion <span class="se">\</span>
-v /home/bob/certs:/etc/nginx/certs:rw <span class="se">\</span>
--volumes-from nginx-proxy <span class="se">\</span>
-v /var/run/docker.sock:/var/run/docker.sock:ro <span class="se">\</span>
--restart<span class="o">=</span>always <span class="se">\</span>
--detach jrcs/letsencrypt-nginx-proxy-companion
</code></pre>
<p>Ici le répertoire des certificats est monté en écriture et il sera partagé (sur l&#39;hôte) avec le reverse-proxy. Ce conteneur utilise les volumes déclarés dans le reverse-proxy (<code>volumes-from</code>) ainsi que l&#39;accès au socket du <em>daemon</em> Docker également (pour lire les variables d&#39;environnement déclarées sur les conteneurs “client”).</p>
<pre class="highlight shell"><code><span class="c"># Démarrage du conteneur du blog</span>
docker run --name bobmaerten-eu <span class="se">\</span>
-e <span class="nv">VIRTUAL_HOST</span><span class="o">=</span><span class="s2">"bobmaerten.eu"</span> <span class="se">\</span>
-e <span class="nv">LETSENCRYPT_HOST</span><span class="o">=</span><span class="s2">"bobmaerten.eu"</span> <span class="se">\</span>
-e <span class="nv">LETSENCRYPT_EMAIL</span><span class="o">=</span><span class="s2">"[email protected]"</span> <span class="se">\</span>
--restart<span class="o">=</span>always <span class="se">\</span>
--detach bobmaerten/bobmaerten.eu:latest
</code></pre>
<p>Enfin, le conteneur qui sert le blog, ou je déclare les variables d&#39;environnement qui seront utilisées pour la configuration du reverse-proxy (VIRTUAL_HOST) et du client lets-encrypt.</p>
<p>Au démarrage de la <em>stack</em>, le reverse-proxy détecte le VIRTUAL_HOST <code>bobmaerten.eu</code> et crée dynamiquement l&#39;entrée <code>server</code> dans la configuration de nginx, et le client lets-encrypt modifie également dynamiquement la configuration du reverse-proxy si un certificat est échu ou renouvelé.</p>
<p>Je vous laisse le soin d&#39;aller explorer les différents dépôts respectifs à cette <em>stack</em> si vous êtes curieux du <em>comment-ça-marche-sous-le-capot</em>.</p>
</content>
</entry>
<entry>
<title>Utiliser la virtualisation native d'OSX pour Docker</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/utiliser-la-virtualisation-native-d-osx-pour-docker.html"/>
<id>https://bobmaerten.eu/blog/utiliser-la-virtualisation-native-d-osx-pour-docker.html</id>
<published>2016-01-23T15:16:10+01:00</published>
<updated>2016-03-05T09:44:10+01:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Docker est un outil linux natif et pour l&#39;utiliser sous OSX (ou Windows) il faut passer par une machine virtuelle sous linux pour faire tourner le <em>daemon</em>.</p>
<p>Pour cela, la pratique courante est d&#39;installer un hyperviseur (habituellement Virtualbox) afin de faire tourner <code>boot2docker</code>, la micro-VM fournie par Docker afin de l&#39;utiliser sous un autre système. Mais il est désormais possible de s&#39;en passer sous OSX.</p>
<p></p>
<h2>Hypervisor.framework</h2>
<p>La version 10.10 (Yosemite) d&#39;OSX a introduit un système de virtualisation natif en mode utilisateur et permet l&#39;utilisation directe des instructions VT-x des processeurs Intel. Cela permet donc de virtualiser des applications, sans extension du noyau.</p>
<p>D&#39;ailleurs, <a href="http://veertu.com/">Veertu</a>, récemment publié sur l&#39;app store permet d&#39;installer des VMs en utilisant l&#39;hyperviseur natif d&#39;OSX, explique bien cette différence.</p>
<p><img alt="Legacy Virt" src="http://veertu.com/test/wp-content/uploads/2015/10/legacy.svg" />
<img alt="OSX Virt" src="http://veertu.com/test/wp-content/uploads/2015/10/new.svg" /></p>
<p>Bien que Veertu propose l&rsquo;<a href="https://twitter.com/veertu_labs/status/687552097869533184">installation de boot2docker</a> ce n&#39;est pas de ce système dont je vais vous parler.</p>
<h2>Xhyve et son driver docker-machine</h2>
<p><a href="https://github.com/mist64/xhyve">Xhyve</a> s&#39;appuie également sur l&rsquo;<em>hypervisor.framework</em> d&#39;OSX et permet de virtualiser des systèmes linux et BSD tout comme il était possible de le faire avec Virtualbox, mais sans la lourdeur d&#39;Oracle. Son installation est on ne peut plus simple dès lors que <em>homebrew</em> est installé (<em>t&#39;es un dev sous mac et t&#39;as pas homebrew installé, nan mais all&hellip;</em> 😬) : <code>brew install xhyve</code>.</p>
<p>Mais là ou cela devient intéressant, c&#39;est qu&#39;il existe désormais un <a href="https://github.com/zchee/docker-machine-driver-xhyve">driver xhyve pour docker-machine</a> (celui de Virtualbox est utilisé par défaut si on n&#39;en précise pas). L&#39;installer est tout aussi simple : <code>brew install docker-machine-driver-xhyve</code>.</p>
<p>Cela dit, je vous recommande chaudement de tout installer avec homebrew. J&#39;avais des restes d&#39;installation de <strong>docker-toolbox</strong> et la création de la VM n&#39;a pas fonctionné. Le mieux est donc de supprimer les binaires et de les réinstaller avec homebrew :</p>
<pre class="highlight plaintext"><code>brew install xhyve docker docker-machine docker-compose docker-machine-driver-xhyve
</code></pre>
<p>Au jour de rédaction de ce billet, voici les versions installées suite à cette commande :</p>
<ul>
<li>xhyve-0.2.0</li>
<li>docker-1.9.1_1</li>
<li>docker-machine-0.5.6_1</li>
<li>docker-compose-1.5.2</li>
<li>docker-machine-driver-xhyve-0.2.1</li>
</ul>
<h2>Création et démarrage de la VM</h2>
<p>Pour installer et démarrer la VM docker, il suffit d&#39;utiliser docker-machine avec le driver xhyve.</p>
<pre class="highlight plaintext"><code>$ docker-machine create dockerhost --driver xhyve
Running pre-create checks...
Creating machine...
(dockerhost) Copying /Users/bob/.docker/machine/cache/boot2docker.iso to /Users/bob/.docker/machine/machines/dockerhost/boot2docker.iso...
(dockerhost) Creating VM...
(dockerhost) Extracting vmlinuz64 and initrd.img from boot2docker.iso...
(dockerhost) /dev/disk2 /Users/bob/.docker/machine/machines/dockerhost/b2d-image
(dockerhost) "disk2" unmounted.
(dockerhost) "disk2" ejected.
(dockerhost) Generating 20000MB disk image...
(dockerhost) created: /Users/bob/.docker/machine/machines/dockerhost/root-volume.sparsebundle
(dockerhost) Creating SSH key...
(dockerhost) Fix file permission...
(dockerhost) Generate UUID...
(dockerhost) Convert UUID to MAC address...
(dockerhost) Starting dockerhost...
(dockerhost) Waiting for VM to come online...
(dockerhost) Waiting on a pseudo-terminal to be ready... done
(dockerhost) Hook up your terminal emulator to /dev/ttys004 in order to connect to your VM
Waiting for machine to be running, this may take a few minutes...
(dockerhost) Getting to VM state...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env dockerhost
</code></pre>
<p>Il suffit ensuite de raccrocher l&#39;environnement local à la nouvelle VM docker :</p>
<pre class="highlight plaintext"><code>$ eval "$(docker-machine env dockerhost)"
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker run --rm busybox echo 'plop!
latest: Pulling from library/busybox
583635769552: Pull complete
b175bcb79023: Pull complete
Digest: sha256:c1bc9b4bffe665bf014a305cc6cf3bca0e6effeb69d681d7a208ce741dad58e0
Status: Downloaded newer image for busybox:latest
plop!
</code></pre>
<p>Et voilà, vous pouvez effacer votre stack Virtualbox ! Bon, peut-être pas tout de suite car ceci est encore plutôt expérimental, aussi je vais éprouver la solution dans les jours/semaines qui viennent, et ce sera l&#39;occasion d&#39;un prochain billet pour évalauer les performances et la fiabilité de la <em>stack</em>.</p>
<h3>Edit du 25/01/2016</h3>
<ul>
<li>La source de cet essai est un blog post d&rsquo;<a href="https://allysonjulian.com/setting-up-docker-with-xhyve/">Allyson Julian</a></li>
<li>Si vous voulez utiliser des volumes partagés avec l&#39;hôte (pas la VM, mais bien l&#39;hôte OSX), il faut ajouter à l&#39;installation de la VM le flag <code>--xhyve-experimental-nfs-share</code>, sinon ça ne fonctionne pas.</li>
</ul>
<p>Bon <em>hacking</em> !</p>
</content>
</entry>
<entry>
<title>Comportement des touches Home et End du pavé numérique sous OSX</title>
<link rel="alternate" href="https://bobmaerten.eu/blog/comportement-des-touches-home-et-end-du-pave-numerique-sous-osx.html"/>
<id>https://bobmaerten.eu/blog/comportement-des-touches-home-et-end-du-pave-numerique-sous-osx.html</id>
<published>2015-06-26T17:23:10+02:00</published>
<updated>2015-11-08T12:29:14+01:00</updated>
<author>
<name>Bob Maerten</name>
</author>
<content type="html"><p>Le truc qui me rendait fous depuis mon passage sous OSX c&#39;était le comportement des touches <code>Home</code> et <code>End</code> du pavé numérique. En tant que développeur, dans mon éditeur de texte, le comportement est d&#39;aller respectivement en début et en fin de ligne. Or dans le navigateur et en particulier dans les <em>textarea</em> de GitHub, le comportement des touches en question est rattaché au <em>viewport</em> du navigateur. Si bien que lorsque naturellement j&#39;appuie sur <code>Home</code> pour revenir en début de ligne, mon navigateur me renvoyait en début de page.</p>
<p></p>
<p><img alt="Rage" src="http://media.giphy.com/media/wvQIqJyNBOCjK/giphy.gif" /></p>
<p>Mais en fouillant un peu, ce comportement ne semble pas naturel pour pas de gens, qui pour le coup installent un outil appelé <a href="https://pqrs.org/osx/karabiner/">Karabiner</a>, permettant de modifier le comportement du clavier en général.</p>
<p>Cependant le comportement modifié rentrait en conflit avec ma configuration sous iTerm2, ce n&#39;était donc pas mieux.</p>
<p>Au final, c&#39;est dans <a href="http://www.evansweb.info/2005/03/24/mac-os-x-and-home-end-keys/">un billet</a> du <a href="http://www.evansweb.info/">blog de Jon Evans</a> datant de plus de 10 que je trouve une solution simple, rapide, parfaitement adaptée et toujours valide&nbsp;! Le site ne semble plus alimenté depuis quelques années mais est toujours dispo, chapeau bas <a href="https://twitter.com/burmasauce">@burmasauce</a>.</p>
<p>Toujours est-il que la solution est de créer un fichier <code>~/Library/KeyBindings/DefaultKeyBinding.dict</code> contenant&nbsp;:</p>
<pre class="highlight json"><code><span class="p">{</span><span class="w">
</span><span class="err">/*</span><span class="w"> </span><span class="err">Remap</span><span class="w"> </span><span class="err">Home</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="err">End</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">be</span><span class="w"> </span><span class="err">correct</span><span class="w"> </span><span class="err">:-)</span><span class="w"> </span><span class="err">*/</span><span class="w">
</span><span class="nt">"\UF729"</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="nt">"moveToBeginningOfLine:"</span><span class="err">;</span><span class="w"> </span><span class="err">/*</span><span class="w"> </span><span class="err">Home</span><span class="w"> </span><span class="err">*/</span><span class="w">
</span><span class="nt">"\UF72B"</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="nt">"moveToEndOfLine:"</span><span class="err">;</span><span class="w"> </span><span class="err">/*</span><span class="w"> </span><span class="err">End</span><span class="w"> </span><span class="err">*/</span><span class="w">
</span><span class="nt">"$\UF729"</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="nt">"moveToBeginningOfLineAndModifySelection:"</span><span class="err">;</span><span class="w"> </span><span class="err">/*</span><span class="w"> </span><span class="err">Shift</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="err">Home</span><span class="w"> </span><span class="err">*/</span><span class="w">
</span><span class="nt">"$\UF72B"</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="nt">"moveToEndOfLineAndModifySelection:"</span><span class="err">;</span><span class="w"> </span><span class="err">/*</span><span class="w"> </span><span class="err">Shift</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="err">End</span><span class="w"> </span><span class="err">*/</span><span class="w">
</span><span class="err">}</span><span class="w">
</span></code></pre>
<p>et de redémarrer une nouvelle session afin de retrouver un niveau de santé mentale viable.</p>
</content>
</entry>
</feed>