1diff --git a/2020-08-22Moving_from_Github_to_Gitlab_pages.md b/2020-08-22Moving_from_Github_to_Gitlab_pages.md
2new file mode 100644
3index 0000000000000000000000000000000000000000..5bfa7889f5f4d42c8c3e6f77c4a5a157446235ec
4--- /dev/null
5+++ b/2020-08-22Moving_from_Github_to_Gitlab_pages.md
6@@ -0,0 +1,31 @@
7+This was quite simple, I had just to create a simple Gitlab pipeline job
8+and publish to pages this is done by:
9+
10+ image: clojure:lein-2.7.0
11+
12+ before_script:
13+ - lein deps
14+
15+ test:
16+ script:
17+ - lein test
18+
19+ pages:
20+ stage: deploy
21+ script:
22+ - lein package
23+ artifacts:
24+ paths:
25+ - public
26+ only:
27+ - master
28+
29+before~script~
30+: will download all the dependencies with `lein deps`.
31+
32+test
33+: is self explanatory.
34+
35+pages
36+: will compile the cljs into js with `lein package` and publish it
37+ into pages.
38diff --git a/Cargo.lock b/Cargo.lock
39index 92b0fe7a268e03c9dab8fdcffbcbcff9493281b4..9de7021911cc88fe02d3a8910f779d99112859bd 100644
40--- a/Cargo.lock
41+++ b/Cargo.lock
42@@ -943,6 +943,15 @@ "version_check",
43 ]
44
45 [[package]]
46+name = "getopts"
47+version = "0.2.21"
48+source = "registry+https://github.com/rust-lang/crates.io-index"
49+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
50+dependencies = [
51+ "unicode-width",
52+]
53+
54+[[package]]
55 name = "getrandom"
56 version = "0.1.16"
57 source = "registry+https://github.com/rust-lang/crates.io-index"
58@@ -1277,6 +1286,7 @@ "actix-web",
59 "cargo-watch",
60 "chrono",
61 "hyper",
62+ "pulldown-cmark",
63 "regex",
64 "rust-embed",
65 "sailfish",
66@@ -1726,6 +1736,18 @@ "unicode-xid",
67 ]
68
69 [[package]]
70+name = "pulldown-cmark"
71+version = "0.9.1"
72+source = "registry+https://github.com/rust-lang/crates.io-index"
73+checksum = "34f197a544b0c9ab3ae46c359a7ec9cbbb5c7bf97054266fecb7ead794a181d6"
74+dependencies = [
75+ "bitflags",
76+ "getopts",
77+ "memchr",
78+ "unicase",
79+]
80+
81+[[package]]
82 name = "quote"
83 version = "1.0.18"
84 source = "registry+https://github.com/rust-lang/crates.io-index"
85@@ -2399,6 +2421,15 @@ checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d"
86 dependencies = [
87 "tempfile",
88 "winapi 0.3.9",
89+]
90+
91+[[package]]
92+name = "unicase"
93+version = "2.6.0"
94+source = "registry+https://github.com/rust-lang/crates.io-index"
95+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
96+dependencies = [
97+ "version_check",
98 ]
99
100 [[package]]
101diff --git a/Cargo.toml b/Cargo.toml
102index c91eedac7db5fe4c4400127f6ea37749d0cdd35c..f01156a3ce668072fffebee49adaf7c273c914ce 100644
103--- a/Cargo.toml
104+++ b/Cargo.toml
105@@ -11,6 +11,7 @@ regex = "1.5"
106 rust-embed = "6.4.0"
107 chrono = "0.4"
108 actix-web = "4"
109+pulldown-cmark = "0.9.1"
110
111 [dev-dependencies]
112 cargo-watch = "8.1.1"
113diff --git a/content/posts/2019-03-03Welcome_to_my_blog.html b/content/posts/2019-03-03Welcome_to_my_blog.html
114deleted file mode 100644
115index 10b1f05fea6422809c15e0f9f3a234f52d461122..0000000000000000000000000000000000000000
116--- a/content/posts/2019-03-03Welcome_to_my_blog.html
117+++ /dev/null
118@@ -1,6 +0,0 @@
119-<section>
120- <p>
121- On this blog, I'll be posting some personal projects that I'm working on
122- or just logging stuff that I don't want to forget.
123- </p>
124-</section>
125diff --git a/content/posts/2019-03-03Welcome_to_my_blog.md b/content/posts/2019-03-03Welcome_to_my_blog.md
126new file mode 100644
127index 0000000000000000000000000000000000000000..a0ec118305f8afcf8deac63c0c619b621cccc3af
128--- /dev/null
129+++ b/content/posts/2019-03-03Welcome_to_my_blog.md
130@@ -0,0 +1,8 @@
131+On this blog, I\'ll be posting some personal projects that I\'m working
132+on or just logging stuff that I don\'t want to forget.
133+
134+*Disclaimer*: English it\'s not my native language so if you find
135+something that you don\'t understand I\'d love you to open an
136+[issue](https://gitlab.com/gabrielgio/homestation/-/issuess), or if you
137+have something to add open a
138+[MR](phttps://gitlab.com/gabrielgio/homestation/-/merge_requests)
139diff --git a/content/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.html b/content/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.html
140deleted file mode 100644
141index d06a648c3793c6d13fbaae4ac818d84787731e6f..0000000000000000000000000000000000000000
142--- a/content/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.html
143+++ /dev/null
144@@ -1,94 +0,0 @@
145-<section>
146- <p>
147- Every time that I do a clean install on my machine it takes a few hours till I
148- get to point where I was before formatting it, install all packages, select
149- themes, icons, fonts, install IDEs, extensions and so on. After doing it a few
150- times I came to the conclusion that I would save time by spending time
151- automating this chore, and as a result, I could tinker a little more with my
152- system and not worry about spending a weekend re-installing everything (which
153- have happened more time that I'd like to remember).
154- </p>
155- <p>
156- So after a few attempts using python and bash I ended with many files and
157- keep everything organized and concise turned out to be more tedious than the
158- setup itself. So there comes <a href="https://www.ansible.com/">Ansible</a>.
159- It is an enterprise-graded software used to automate tasks. It has A LOT OF
160- features and it can be really helpful if you're a sysadmin but for now we're
161- going to focuson
162- <a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#ansible-pull">
163- Ansible Pull
164- </a>
165- and
166- <a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks.html">
167- Playbooks
168- </a>. As better described:
169- <blockquote>
170- [Ansible-Pull] is used to up a remote copy of ansible on each managed
171- node, each set to run via cron and update playbook source via a source
172- repository. This inverts the default push architecture of Ansible into a
173- pull architecture, which has near-limitless scaling potential.
174-
175- Playbooks are Ansible’s configuration, deployment, and orchestration
176- language. They can describe a policy you want your remote systems to
177- enforce, or a set of steps in a general IT process.
178- (<a href="https://docs.ansible.com/ansible/latest/cli/ansible-pull.html">source</a>)
179- </blockquote>
180- </p>
181- <p>
182- The goal is to pull and run a playbook remotely using a git repository. The
183- playbook will describe the tasks needed to setup our machine from scratch.
184- <br/>
185- But first lets tinker a bit a with playbooks locally with ansible-playbook,
186- to do so we need to add localhost to ansible's hosts list. Add it to
187- /etc/ansible/hosts:
188-<pre><code>[all]
189-localhost</code></pre>
190- </p>
191- <p>
192- As an experiment we're going to write a asks to install vim. Currently, I'm
193- using Fedora thus we going to use dnf modeule to install packages, but if
194- you're using another distribution look for a equivalent module like apt
195- module for Ubuntu.
196-
197- The playbook to install is quite simple:
198-
199-<pre><code># main.yaml
200-- hosts: all
201- tasks:
202- - name: install vim
203- dnf:
204- name: vim
205- state: latest</code></pre>
206- <dl>
207- <dt>host</dt>
208- <dd>it is required and it has to match our hosts otherwise the playbook won't run.</dd>
209- <dt>taks</dt>
210- <dd>
211- it is the list of tasks that the playbook will perform, in this case
212- will be dnf install vim.
213- </dd>
214- </dl>
215- </p>
216- <p>
217- To run a playbook use the command ansible-playbook commando to run main.yml
218- direct from disk, do to so just run the following command:
219-<pre><code>sudo ansible-playbook --connection=local main.yml</code></pre>
220- </p>
221- <p>
222- After a few seconds, vim will be installed on your machine.
223-<pre><code>PLAY [all] *************************************************************
224-
225-TASK [Gathering Facts] *************************************************
226-ok: [localhost]
227-
228-TASK [install vim] *****************************************************
229-ok: [localhost]
230-
231-PLAY RECAP *************************************************************
232-localhost : ok=2 changed=0 unreachable=0 failed=0</code></pre>
233- </p>
234- <p>
235- This is the first step, next part we shall create a more complex playbook and
236- setup repository to run it remotely using ansible-pull.
237- </p>
238-</section>
239diff --git a/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-1.md b/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-1.md
240new file mode 100644
241index 0000000000000000000000000000000000000000..58ecb0d968cd83861137909b183a96677e5a5eae
242--- /dev/null
243+++ b/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-1.md
244@@ -0,0 +1,97 @@
245+Every time that I do a clean install on my machine it takes a few hours
246+till I get to point where I was before formatting it, install all
247+packages, select themes, icons, fonts, install IDEs, extensions and so
248+on. After doing it a few times I came to the conclusion that I would
249+save time by spending time automating this chore, and as a result, I
250+could tinker a little more with my system and not worry about spending a
251+weekend re-installing everything (which have happened more time that
252+ I\'d like to remember).
253+
254+So after a few attempts using python and bash I ended with many files
255+and keep everything organized and concise turned out to be more tedious
256+than the setup itself. So there comes
257+[Ansible](https://www.ansible.com/). It is an enterprise-graded software
258+used to automate tasks. It has A LOT OF features and it can be really
259+helpful if you\'re a sysadmin but for now we\'re going to focus on
260+[Ansible
261+Pull](https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#ansible-pull)
262+and
263+[Playbooks](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html).
264+As better described:
265+
266+> \[Ansible-Pull\] is used to up a remote copy of ansible on each
267+> managed node, each set to run via cron and update playbook source via
268+> a source repository. This inverts the default push architecture of
269+> Ansible into a pull architecture, which has near-limitless scaling
270+> potential.
271+>
272+> Playbooks are Ansible's configuration, deployment, and orchestration
273+> language. They can describe a policy you want your remote systems to
274+> enforce, or a set of steps in a general IT process.
275+>
276+> [source](https://docs.ansible.com/ansible/latest/cli/ansible-pull.html)
277+
278+The goal is to pull and run a playbook remotely using a git repository.
279+The playbook will describe the tasks needed to setup our machine from
280+scratch.
281+
282+But first lets tinker a bit a with playbooks locally with
283+`ansible-playbook`, to do so we need to add `localhost` to ansible\'s
284+hosts list. Add it to `/etc/ansible/hosts`:
285+
286+``` service
287+[all]
288+localhost
289+```
290+
291+As an experiment we\'re going to write a asks to install vim. Currently,
292+ I\'m using [Fedora](https://getfedora.org/) thus we going to use [dnf
293+ modeule](https://docs.ansible.com/ansible/latest/modules/dnf_module.html)
294+ to install packages, but if you\'re using another distribution look for
295+ a equivalent module like [apt
296+ module](https://docs.ansible.com/ansible/latest/modules/apt_module.html)
297+ for [Ubuntu](https://ubuntu.com/).
298+
299+ The playbook to install is quite simple:
300+
301+ ``` yaml
302+# main.yaml
303+ - hosts: all
304+ tasks:
305+ - name: install vim
306+ dnf:
307+name: vim
308+state: latest
309+```
310+
311+`hosts:` is required and it has to match our hosts otherwise the
312+playbook won\'t run.
313+
314+`tasks:` is the list of tasks that the playbook will perform, in this
315+case will be `dnf install vim`.
316+
317+To run a playbook use the command `ansible-playbook` commando to run
318+`main.yml` direct from disk, do to so just run the following command:
319+
320+
321+``` bash
322+sudo ansible-playbook --connection=local main.yml
323+```
324+
325+After a few seconds, vim will be installed on your machine.
326+
327+``` bash
328+PLAY [all] *************************************************************
329+
330+TASK [Gathering Facts] *************************************************
331+ok: [localhost]
332+
333+TASK [install vim] *****************************************************
334+ok: [localhost]
335+
336+PLAY RECAP *************************************************************
337+localhost : ok=2 changed=0 unreachable=0 failed=0
338+```
339+
340+This is the first step, next part we shall create a more complex
341+playbook and setup repository to run it remotely using `ansible-pull`.
342diff --git a/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.html b/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.html
343deleted file mode 100644
344index 707ba7d59d5329790642bdbea36cc0b4edcd6102..0000000000000000000000000000000000000000
345--- a/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.html
346+++ /dev/null
347@@ -1,70 +0,0 @@
348-<section>
349- <a href="/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.html">See part 1</a>
350- <p>
351- Now we're going to setup ansible to work with a git repository. The process is
352- quite similar to ansible-playbook, the only difference is that the source for
353- the playbook will be a remote repository and not a local file. Following the
354- previous example we'll get vim setup automated.
355- </p>
356- <p>
357- Create a git repository wherever you see
358- fit, <a href="https://about.gitlab.com/">gitlab</a>
359- and <a href="https://github.com/">github</a> offer free repositories. For
360- this task we need to add only two file: one for the yml file describing the
361- tasks and the .vimrc file.
362- </p>
363- <p>
364- In the .vimrc add your own configuration, you can see
365- mine
366- <a href="https://gitlab.com/gabrielgio/homestation/-/blob/debcf3458df511aef9f7dca0cb73f6cf6baddd5d/.vimrc">
367- over here
368- </a>, it is pretty simple as I don't use it but for simple text editing
369- (like this post) so you can start with that if you don't have one.
370- </p>
371- <p>
372- The yml file will have two tasks, one is to install vim, just like we did in the part 1.
373-<pre><code># main.yml
374----
375-- name: install vim
376- dnf:
377- name: vim
378- state: latest</code></pre>
379- </p>
380- <p>
381- To copy .vimrc file to your $HOME we going to
382- use <a href="https://docs.ansible.com/ansible/latest/modules/copy_module.html">copy
383- module</a>:
384- </p>
385- <p>
386- After we've added those two files to repository you will have be something
387- <a href="https://gitlab.com/gabrielgio/homestation/-/tree/debcf3458df511aef9f7dca0cb73f6cf6baddd5d">
388- like this.
389- </a>
390- <br/>
391- Parms:
392- <ul>
393- <li><strong>-i</strong> is a list of hosts</li>
394- <li><strong>-U</strong> is the get repository url</li>
395- </ul>
396- </p>
397- <p>
398- Remember man is your best friend, take a look at <code>man ansible-pull</code> to know
399- more about its parameters.
400- </p>
401- <p>
402- The best part you can quickly test and see the result by running my sample:
403-<pre><code>ansible-pull \
404- -U https://gitlab.com/gabrielgio/homestation.git \
405- -C debcf3458df511aef9f7dca0cb73f6cf6baddd5d \
406- -i all \
407- main.yml</code></pre>
408- </p>
409- <p>
410- The idea here is to keep your repository as a source of truth when comes to
411- configuration, you can add ansible-pull to a CRON tab, so you just need to
412- push something to your repository and after a few minutes not only your
413- machine but all the machines that have it setup will run the playbooks. You
414- can use this method as a simple way to install software, update machines or
415- even distribute tooling company-wise.
416- </p>
417-</section>
418diff --git a/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.md b/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.md
419new file mode 100644
420index 0000000000000000000000000000000000000000..2e5646353b8010f974f37ec41838f89262f47641
421--- /dev/null
422+++ b/content/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.md
423@@ -0,0 +1,68 @@
424+Now we\'re going to setup ansible to work with a git repository. The
425+process is quite similar to `ansible-playbook`, the only difference is
426+that the source for the playbook will be a remote repository and not a
427+local file. Following the previous example we\'ll get vim setup
428+automated.
429+
430+Create a git repository wherever you see fit,
431+[gitlab](https://about.gitlab.com/) and [github](https://github.com/) offer
432+free repositories. For this task we need to add only two file: one for the
433+`yml` file describing the tasks and the `.vimrc` file.
434+
435+In the `.vimrc` add your own configuration, you can see mine [over
436+here](https://gitlab.com/gabrielgio/homestation/-/blob/debcf3458df511aef9f7dca0cb73f6cf6baddd5d/.vimrc),
437+it is pretty simple as I don\'t use it but for simple text editing (like this
438+post) so you can start with that if you don\'t have one.
439+
440+The `yml` file will have two tasks, one is to install vim, just like we did in
441+the part 1.
442+
443+```yaml # main.yml ---
444+- name: install vim dnf: name: vim state: latest
445+```
446+
447+To copy `.vimrc` file to your `$HOME` we going to use [copy
448+module](https://docs.ansible.com/ansible/latest/modules/copy_module.html):
449+
450+``` yaml
451+# main.yml
452+---
453+- name: copy vimrc file
454+ copy:
455+ src: config/.vimrc
456+ dest: ~/
457+ mode: 0644
458+```
459+
460+After we\'ve added those two files to repository you will have be something
461+[like
462+this](https://gitlab.com/gabrielgio/homestation/-/tree/debcf3458df511aef9f7dca0cb73f6cf6baddd5d).
463+
464+And now we just need to run `ansible-pull` command
465+
466+``` shell
467+# you may need run it as a sudo
468+ansible-pull -U $YOUR_REPO -i all main.yml
469+```
470+
471+Params:
472+
473+- **`-i`** is a list of hosts.
474+- **`-U`** is the git repository URL.
475+
476+Remember `man` is your best friend, take a look at `man ansible-pull` to
477+know more about its parameters.
478+
479+The best part you can quickly test and see the result by running my
480+sample:
481+
482+``` shell
483+ansible-pull -U https://gitlab.com/gabrielgio/homestation.git -C debcf3458df511aef9f7dca0cb73f6cf6baddd5d -i all main.yml
484+```
485+
486+The idea here is to keep your repository as a source of truth when comes to
487+configuration, you can add `ansible-pull` to a CRON tab, so you just need to
488+push something to your repository and after a few minutes not only your machine
489+but all the machines that have it setup will run the playbooks. You can use
490+this method as a simple way to install software, update machines or even
491+distribute tooling company-wise.
492diff --git a/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.html b/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.html
493deleted file mode 100644
494index f47040fac0e8f2ee68dc286124ea78ce81384abe..0000000000000000000000000000000000000000
495--- a/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.html
496+++ /dev/null
497@@ -1,31 +0,0 @@
498-<section>
499-<p>
500- Compiling emacs from source and installing on fedora.
501-</p>
502-<h3>Installing packages</h3>
503-<p>
504- Install the following packages:
505-<pre><code>sudo dnf install git autoconf make gcc texinfo \
506- gnutls-devel giflib-devel ncurses-devel \
507- libjpeg-turbo-devel giflib-devel gtk3-devel \
508- libXpm-devel libtiff-devel libxml2-devel -y</code></pre>
509-</p>
510-<h3>Cloning Repository</h3>
511-<p>
512- Clone repository
513- <a href="http://savannah.gnu.org/projects/emacs/">savannah.gnu.org</a>
514-<pre><code>git clone -b master git://git.sv.gnu.org/emacs.git</code></pre>
515-</p>
516-<h3>Compiling</h3>
517-<p>
518- Navigate to the emacs folder <code>cd emacs</code> and execute the following
519- steps:
520-<pre><code>./autogen.sh
521-./configure
522-make -j$(nproc)
523-sudo make install
524-</code></pre>
525- After verify version with <code>./emacs --version</code>, it
526- should be equal or higher than <strong>28.0.50</strong>.
527-</p>
528-</section>
529diff --git a/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.md b/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.md
530new file mode 100644
531index 0000000000000000000000000000000000000000..d316f404d2fc4c4166846e254508831eb3d61961
532--- /dev/null
533+++ b/content/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.md
534@@ -0,0 +1,31 @@
535+Compiling emacs from source and installing on fedora.
536+
537+# Installing Packages
538+
539+Install the following packages:
540+
541+ sudo dnf install git autoconf make gcc texinfo \
542+ gnutls-devel giflib-devel ncurses-devel \
543+ libjpeg-turbo-devel giflib-devel gtk3-devel \
544+ libXpm-devel libtiff-devel libxml2-devel -y
545+
546+# Cloning Repository
547+
548+Clone repository
549+[savannah.gnu.org](http://savannah.gnu.org/projects/emacs/):
550+
551+ git clone -b master git://git.sv.gnu.org/emacs.git
552+
553+# Compiling
554+
555+Navigate to emacs folder (`cd emacs`) and execute the following steps
556+
557+```shell
558+./autogen.sh
559+./configure
560+make -j$(nproc)
561+sudo make install
562+```
563+
564+After verify version with `emacs --version`, it should be equal or
565+higher than `28.0.50`{.verbatim}.
566diff --git a/content/posts/2020-07-12Road_to_local_K8S.html b/content/posts/2020-07-12Road_to_local_K8S.html
567deleted file mode 100644
568index 52820b3a59f6fcff401ca6c19b6990cf0a36c485..0000000000000000000000000000000000000000
569--- a/content/posts/2020-07-12Road_to_local_K8S.html
570+++ /dev/null
571@@ -1,101 +0,0 @@
572-<section>
573- <h3>Goal</h3>
574- <p>
575- The goal is to deploy kubernetes on my local networks, and keep everything
576- as reproducible as possible.
577- </p>
578- <h3>Stack</h3>
579- <p>
580- I'll use Fedora Core OS, Matchbox and Terraform
581- <sup><a href="#footnotes">1</a></sup>, a match the requirements for
582- Tectonic<sup><a href="#footnotes">2</a></sup>.</p>
583- <h3>Steps</h3>
584- <ul>
585- <li>Network Setup DHCP/TFTP/DNS<sup><a href="#footnotes">3</a></sup></li>
586- <li>Matchbox<sup><a href="#footnotes">4</a></sup></li>
587- <li>PXE nextwork boot evnrionment</li>
588- <li>Terraform Tectonic<sup><a href="#footnotes">5</a></sup></li>
589- </ul>
590- <h3>Network Setup DHCP/TFTP/DNS</h3>
591- <p>First learning the basics</p>
592- <ul>
593- <li>
594- <a href="https://linuxhint.com/install_dhcp_server_ubuntu/">
595- https://linuxhint.com/install_dhcp_server_ubuntu/
596- </a>
597- </li>
598- <li>
599- <a href="https://www.youtube.com/watch?v=XQ3T14SIlV4">
600- https://www.youtube.com/watch?v=XQ3T14SIlV4
601- </a>
602- </li>
603- </ul>
604- <p>
605- To check open ports
606- <pre><code>lsof -Pni | grep LISTEN</code></pre>
607- </p>
608- <p>
609- Run the provided<sup><a href="#footnotes">6</a></sup> image with dnsmasq and
610- PXE toolkit
611- <pre><code>docker run --rm --cap-add=NET_ADMIN --net=host quay.io/coreos/dnsmasq \
612- -d -q \
613- --dhcp-range=192.168.1.3,192.168.1.254 \
614- --enable-tftp --tftp-root=/var/lib/tftpboot \
615- --dhcp-match=set:bios,option:client-arch,0 \
616- --dhcp-boot=tag:bios,undionly.kpxe \
617- --dhcp-match=set:efi32,option:client-arch,6 \
618- --dhcp-boot=tag:efi32,ipxe.efi \
619- --dhcp-match=set:efibc,option:client-arch,7 \
620- --dhcp-boot=tag:efibc,ipxe.efi \
621- --dhcp-match=set:efi64,option:client-arch,9 \
622- --dhcp-boot=tag:efi64,ipxe.efi \
623- --dhcp-userclass=set:ipxe,iPXE \
624- --dhcp-boot=tag:ipxe,http://matchbox.example.com:8080/boot.ipxe \
625- --address=/matchbox.example/192.168.1.2 \
626- --log-queries \
627- --log-dhcp</code></pre>
628- </p>
629- <h3>Matchbox</h3>
630- <p>...</p>
631- <h3>PXE network boot enviroment</h3>
632- <p>...</p>
633- <h3>Terraform Tectonic</h3>
634- <p>...</p>
635- <h3 id="footnotes">Links</h3>
636- <div >
637- <sup>1</sup>
638- <a href="https://coreos.com/tectonic/docs/latest/install/bare-metal/metal-terraform.html">
639- https://coreos.com/tectonic/docs/latest/install/bare-metal/metal-terraform.html
640- </a>
641- <div>
642- <div>
643- <sup>2</sup>
644- <a href="https://coreos.com/tectonic/docs/latest/install/bare-metal/requirements.html">
645- https://coreos.com/tectonic/docs/latest/install/bare-metal/requirements.html
646- </a>
647- <div>
648- <div>
649- <sup>3</sup>
650- <a href="https://coreos.com/matchbox/docs/latest/network-setup.html">
651- https://coreos.com/matchbox/docs/latest/network-setup.html
652- </a>
653- <div>
654- <div>
655- <sup>4</sup>
656- <a href="https://coreos.com/matchbox/docs/latest/deployment.html">
657- https://coreos.com/matchbox/docs/latest/deployment.html
658- </a>
659- <div>
660- <div>
661- <sup>5</sup>
662- <a href="https://coreos.com/tectonic/releases/">
663- https://coreos.com/tectonic/releases/
664- </a>
665- <div>
666- <div>
667- <sup>6</sup>
668- <a href="https://github.com/poseidon/matchbox/tree/v0.7.0/contrib/dnsmasq">
669- https://github.com/poseidon/matchbox/tree/v0.7.0/contrib/dnsmasq
670- </a>
671- <div>
672-</section>
673diff --git a/content/posts/2020-07-13Road_to_local_K8S.md b/content/posts/2020-07-13Road_to_local_K8S.md
674new file mode 100644
675index 0000000000000000000000000000000000000000..a3ca5307c716d7c03e02a6602cddb52861514e90
676--- /dev/null
677+++ b/content/posts/2020-07-13Road_to_local_K8S.md
678@@ -0,0 +1,73 @@
679+# Goal
680+
681+The goal is to deploy kubernetes on my local networks, and keep
682+everything as reproducible as possible.
683+
684+# Stack
685+
686+I\'ll use Fedora Core OS, Matchbox and Terraform [^1], a match the
687+requirements for Tectonic [^2]
688+
689+## Steps
690+
691+- Network Setup DHCP/TFTP/DNS [^3]
692+- Matchbox [^4]
693+- PXE network boot environment
694+- Terraform Tectonic [^5]
695+
696+## Network Setup DHCP/TFTP/DNS
697+
698+First learning the basics again:
699+
700+- <https://linuxhint.com/install_dhcp_server_ubuntu/>
701+- <https://www.youtube.com/watch?v=XQ3T14SIlV4>
702+
703+To check open ports
704+
705+``` {.bash org-language="sh"}
706+lsof -Pni | grep LISTEN
707+```
708+
709+Run the provided [^6] image with `dnsmasq` and PXE toolkit
710+
711+``` {.bash org-language="sh"}
712+docker run --rm --cap-add=NET_ADMIN --net=host quay.io/coreos/dnsmasq \
713+ -d -q \
714+ --dhcp-range=192.168.1.3,192.168.1.254 \
715+ --enable-tftp --tftp-root=/var/lib/tftpboot \
716+ --dhcp-match=set:bios,option:client-arch,0 \
717+ --dhcp-boot=tag:bios,undionly.kpxe \
718+ --dhcp-match=set:efi32,option:client-arch,6 \
719+ --dhcp-boot=tag:efi32,ipxe.efi \
720+ --dhcp-match=set:efibc,option:client-arch,7 \
721+ --dhcp-boot=tag:efibc,ipxe.efi \
722+ --dhcp-match=set:efi64,option:client-arch,9 \
723+ --dhcp-boot=tag:efi64,ipxe.efi \
724+ --dhcp-userclass=set:ipxe,iPXE \
725+ --dhcp-boot=tag:ipxe,http://matchbox.example.com:8080/boot.ipxe \
726+ --address=/matchbox.example/192.168.1.2 \
727+ --log-queries \
728+ --log-dhcp
729+```
730+
731+## Matchbox
732+
733+## PXE network boot environment
734+
735+## Terraform Tectonic
736+
737+------------------------------------------------------------------------
738+
739+# Links
740+
741+[^1]: <https://coreos.com/tectonic/docs/latest/install/bare-metal/metal-terraform.html>
742+
743+[^2]: <https://coreos.com/tectonic/docs/latest/install/bare-metal/requirements.html>
744+
745+[^3]: <https://coreos.com/matchbox/docs/latest/network-setup.html>
746+
747+[^4]: <https://coreos.com/matchbox/docs/latest/deployment.html>
748+
749+[^5]: <https://coreos.com/tectonic/releases/>
750+
751+[^6]: <https://github.com/poseidon/matchbox/tree/v0.7.0/contrib/dnsmasq>
752diff --git a/content/posts/2020-07-14Friz_box_turned_off_DHCP.html b/content/posts/2020-07-14Friz_box_turned_off_DHCP.html
753deleted file mode 100644
754index 3ee5dafa5ea3e288538cc315eee4e12337379850..0000000000000000000000000000000000000000
755--- a/content/posts/2020-07-14Friz_box_turned_off_DHCP.html
756+++ /dev/null
757@@ -1,19 +0,0 @@
758-<section>
759- <p>
760- If you turned off your DHCP server follow these steps to connect to
761- FritzBox settings. <br/>
762- <ul>
763- <li>
764- Set your computer IP to 170.254.1.2 and your mask to 255.255.0.0
765- </li>
766- <li> Then go to 169.254.1.1, login and re-enable the DHCP server:</li>
767- </ul>
768- </p>
769- <p>
770- On gnome turn the wired connection off on again to apply the settings.
771- </p>
772- <p>
773- <strong>Note</strong>: why in the hell does FritzBox 7490 require a
774- land-line telephone to be physically factory reset?
775- </p>
776-</section>
777diff --git a/content/posts/2020-07-14Friz_box_turned_off_DHCP.md b/content/posts/2020-07-14Friz_box_turned_off_DHCP.md
778new file mode 100644
779index 0000000000000000000000000000000000000000..865067fb7388b427c11e4f5e604040d9058a4d45
780--- /dev/null
781+++ b/content/posts/2020-07-14Friz_box_turned_off_DHCP.md
782@@ -0,0 +1,10 @@
783+If you turned off your DHCP server follow these steps to connect to
784+FritzBox settings.
785+
786+- Set your computer IP to `169.254.1.2` and your mask to `255.255.0.0`
787+- Then go to `169.254.1.1`, login and re-enable the DHCP server.
788+
789+On gnome turn the wired connection off on again to apply the settings.
790+
791+Note: why in the hell does FritzBox 7490 require a land-line telephone
792+to be physically factory reset?
793diff --git a/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.html b/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.html
794deleted file mode 100644
795index 5fb1d7897fb4b28d23a4178706c8151bc624ad25..0000000000000000000000000000000000000000
796--- a/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.html
797+++ /dev/null
798@@ -1,38 +0,0 @@
799-<section>
800- <p>
801- This was quite simple, I had just to create a simple Gitlab pipeline job and
802- publish to pages this is done by:
803- </p>
804- <pre><code>image: clojure:lein-2.7.0
805-
806-before_script:
807- - lein deps
808-
809-test:
810- script:
811- - lein test
812-
813-pages:
814- stage: deploy
815- script:
816- - lein package
817- artifacts:
818- paths:
819- - public
820- only:
821- - master</code></pre>
822- <dl>
823- <dt>before_script</dt>
824- <dd>will download all the dependencies with <code>lein deps.</code></dd>
825- <dt>test</dt>
826- <dd>it is self explanatory</dd>
827- <dt>pages</dt>
828- <dd>
829- it will compile cljs into js with <code>lein package</code> into
830- <code>public</code> folder to later be published into gitlab pages. Take a
831- look at the <code>artifacts</code> property, it is used to say wich will
832- will be collected.
833- </dd>
834- </dl>
835-
836-</section>
837diff --git a/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.md b/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.md
838new file mode 100644
839index 0000000000000000000000000000000000000000..f971a7507150c43e577b7cdf1fa87945e069f59f
840--- /dev/null
841+++ b/content/posts/2020-08-22Moving_from_Github_to_Gilab_pages.md
842@@ -0,0 +1,34 @@
843+--- title: \"Moving from Github to Gitlab pages\" date: 2020-08-22 tags:
844+\[\'gitlab\'\] ---
845+
846+This was quite simple, I had just to create a simple Gitlab pipeline job
847+and publish to pages this is done by:
848+
849+ image: clojure:lein-2.7.0
850+
851+ before_script:
852+ - lein deps
853+
854+ test:
855+ script:
856+ - lein test
857+
858+ pages:
859+ stage: deploy
860+ script:
861+ - lein package
862+ artifacts:
863+ paths:
864+ - public
865+ only:
866+ - master
867+
868+before~script~
869+: will download all the dependencies with `lein deps`.
870+
871+test
872+: is self explanatory.
873+
874+pages
875+: will compile the cljs into js with `lein package` and publish it
876+ into pages.
877diff --git a/content/posts/2020-12-28K8S_private_gitlab_registry_using_podman.md b/content/posts/2020-12-28K8S_private_gitlab_registry_using_podman.md
878new file mode 100644
879index 0000000000000000000000000000000000000000..c72e9ac4c6458ef3406b174ae00425873e43f244
880--- /dev/null
881+++ b/content/posts/2020-12-28K8S_private_gitlab_registry_using_podman.md
882@@ -0,0 +1,49 @@
883+This is based on [Log in to Docker
884+Hub](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/).
885+It is just a bit different to use podman
886+
887+First we should take a look at podman-login man page:
888+
889+``` bash
890+man podman login
891+```
892+
893+It will give some valueable information like the location of auth.json
894+file. Now we can login using podman:
895+
896+``` bash
897+podman login registry.gitlab.com
898+```
899+
900+Then check the `auth.json` file located at
901+`${XDG_RUNTIME_DIR}/containers/auth.json` (as described by the manual).
902+
903+``` bash
904+cat "${XDG_RUNTIME_DIR}/containers/auth.json"
905+```
906+
907+It will print your auth config:
908+
909+``` json
910+{
911+ "auths": {
912+ "registry.gitlab.com": {
913+ "auth": "..."
914+ }
915+ }
916+}
917+```
918+
919+Now copy that file over to the server and register it in k8s with the
920+following command:
921+
922+``` bash
923+kubectl create secret generic regcred \
924+ --from-file=.dockerconfigjson=auth.json \
925+ --type=kubernetes.io/dockerconfigjson
926+```
927+
928+Once you have created you can list by `kubectl get secret`:
929+
930+ NAME TYPE DATA AGE
931+ regcred kubernetes.io/dockerconfigjson 1 53s
932diff --git a/content/posts/2021-12-26Enable_NFS_on_K3S.html b/content/posts/2021-12-26Enable_NFS_on_K3S.html
933deleted file mode 100644
934index 22ddf3331353303480fec1892b4f4904135635ba..0000000000000000000000000000000000000000
935--- a/content/posts/2021-12-26Enable_NFS_on_K3S.html
936+++ /dev/null
937@@ -1,61 +0,0 @@
938-<section>
939- <p>
940- By default <a href="https://k3s.io/">K3S</a> comes only
941- with <a href="https://github.com/rancher/local-path-provisioner">local-path</a>
942- storage class, and if you are running with more than one node in your
943- cluster you may want to use a more “distributed” solution.
944- For may case I opted for NFS.
945- </p>
946- <p>
947- To check the current storage class you can run:
948- </p>
949- <pre><code>k3s kubectl get storageclasses</code></pre>
950- <p>
951- And it will print something like:
952- </p>
953- <pre><code>NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
954-local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 154d</code></pre>
955- <p>
956- To start adding First you need to
957- install <a href="https://github.com/helm/helm">helm</a> on your server.
958- To do so you may run:
959- </p>
960-
961- <pre><code>curl -sSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash</code></pre>
962- <p>
963- Be careful when running scripts directly into bash always check the
964- source Sometimes is also recommended to do not pipe directly to bash
965- </p>
966- <p>
967- Once it is installed we need to add
968- the <a href="https://kubernetes.io/docs/concepts/storage/storage-classes/#nfs">NFS
969- storage classes</a>. It has two providers, I have
970- chose <a href="https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner">NFS
971- Subdir External Provisioner</a>.
972- </p>
973- <p>
974- Add the helm repo
975- </p>
976-
977- <pre><code>helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/</code></pre>
978- <p>
979- Then we need to actually install the provider
980- </p>
981- <div class="org-src-container">
982-<pre><code>helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner
983---set nfs.server=x.x.x.x
984---set nfs.path=/exported/path</code></pre>
985- </div>
986- <p>
987- Set the <code>nfs.server</code> and <code>nfs.path</code> accordingly
988- with your setup.
989- </p>
990- <p>
991- After that if we run <code>k3s kubectl get storageclasses</code> it will
992- now print another NFS provider:
993- </p>
994-
995- <pre><code>NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
996-local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 154d
997-nfs-client cluster.local/nfs-subdir-external-provisioner Delete Immediate true 76m</code></pre>
998-</section>
999diff --git a/content/posts/2021-12-26Enable_NFS_on_K3S.md b/content/posts/2021-12-26Enable_NFS_on_K3S.md
1000new file mode 100644
1001index 0000000000000000000000000000000000000000..426bf3dbb2063385f7d166289ac246841ffde717
1002--- /dev/null
1003+++ b/content/posts/2021-12-26Enable_NFS_on_K3S.md
1004@@ -0,0 +1,56 @@
1005+By default [K3S](https://k3s.io/) comes only with
1006+[local-path](https://github.com/rancher/local-path-provisioner) storage
1007+class, and if you are running with more than one node in your cluster
1008+you may want to use a more \"distributed\" solution. For may case I
1009+opted for NFS.
1010+
1011+To check the current storage class you can run:
1012+
1013+``` bash
1014+k3s kubectl get storageclasses
1015+```
1016+
1017+And it will print something like:
1018+
1019+ NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
1020+ local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 154d
1021+
1022+To start adding First you need to install
1023+[helm](https://github.com/helm/helm) on your server. To do so you may
1024+run:
1025+
1026+``` bash
1027+curl -sSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
1028+```
1029+
1030+**Be careful when running scripts directly into bash always check the
1031+source** **Sometimes is also recommended to do not pipe directly to
1032+bash**
1033+
1034+Once it is installed we need to add the [NFS storage
1035+classes](https://kubernetes.io/docs/concepts/storage/storage-classes/#nfs).
1036+It has two providers, I have chose [NFS Subdir External
1037+Provisioner](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner).
1038+
1039+Add the helm repo
1040+
1041+``` bash
1042+helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
1043+```
1044+
1045+Then we need to actually install the provider
1046+
1047+``` bash
1048+helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
1049+ --set nfs.server=x.x.x.x \
1050+ --set nfs.path=/exported/path
1051+```
1052+
1053+Set the `nfs.server` and `nfs.path` accordingly with your setup.
1054+
1055+After that if we run `k3s kubectl get storageclasses` it will now print
1056+another NFS provider:
1057+
1058+ NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
1059+ local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 154d
1060+ nfs-client cluster.local/nfs-subdir-external-provisioner Delete Immediate true 76m
1061diff --git a/content/posts/2021-12-28K8S_private_gitlab_registry_using_podman.html b/content/posts/2021-12-28K8S_private_gitlab_registry_using_podman.html
1062deleted file mode 100644
1063index 470965c9cb2bdbed6e743a91b0e36e7d2af31f52..0000000000000000000000000000000000000000
1064--- a/content/posts/2021-12-28K8S_private_gitlab_registry_using_podman.html
1065+++ /dev/null
1066@@ -1,38 +0,0 @@
1067-<section>
1068- <p>
1069- This is based on <a
1070- href="https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/">Log in to
1071- Docker Hub</a>. It is just a bit different to use podman.
1072- </p>
1073- <p>
1074- First we should take a look at podman-login man page:
1075-<pre><code>man podman login</code></pre>
1076- </p>
1077- <p>
1078- It will give some valueable information like the location of auth.json file. Now we can login using podman:
1079-<pre><code>podman login registry.gitlab.com</code></pre>
1080- </p>
1081- <p>Then check the <code>auth.json</code> file located at <code>${XDG_RUNTIME_DIR}/containers/auth.json</code> (as described
1082- by the manual). It will contain your auth config:
1083-<pre><code>{
1084- "auths": {
1085- "registry.gitlab.com": {
1086- "auth": "..."
1087- }
1088- }
1089-}</code></pre>
1090- </p>
1091- <p>
1092- Now copy that file over to the server and register it in k8s with the following command:
1093-<pre><code>
1094-kubectl create secret generic regcred \
1095- --from-file=.dockerconfigjson=auth.json \
1096- --type=kubernetes.io/dockerconfigjson</code></pre>
1097- </p>
1098- <p>
1099- Once you have created you can list by kubectl get secret:
1100-<pre><code>
1101-NAME TYPE DATA AGE
1102-regcred kubernetes.io/dockerconfigjson 1 53s</code></pre>
1103- </p>
1104-</section>
1105diff --git a/contrib/locust/locustfile.py b/contrib/locust/locustfile.py
1106index ca7f8f3b7e911333bacd1123451bb2ca6c340fe8..fd22508250b19f058764dfaa3804f95ad8e49b67 100644
1107--- a/contrib/locust/locustfile.py
1108+++ b/contrib/locust/locustfile.py
1109@@ -7,12 +7,12 @@ self.client.get("/")
1110
1111 @task
1112 def posts(self):
1113- self.client.get("/posts/2021-12-28K8S_private_gitlab_registry_using_podman.html")
1114- self.client.get("/posts/2021-12-26Enable_NFS_on_K3S.html")
1115- self.client.get("/posts/2020-08-22Moving_from_Github_to_Gilab_pages.html")
1116- self.client.get("/posts/2020-07-14Friz_box_turned_off_DHCP.html")
1117- self.client.get("/posts/2020-07-12Road_to_local_K8S.html")
1118- self.client.get("/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.html")
1119- self.client.get("/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.html")
1120- self.client.get("/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.html")
1121- self.client.get("/posts/2019-03-03Welcome_to_my_blog.html")
1122+ self.client.get("/posts/2021-12-28K8S_private_gitlab_registry_using_podman.md")
1123+ self.client.get("/posts/2021-12-26Enable_NFS_on_K3S.md")
1124+ self.client.get("/posts/2020-08-22Moving_from_Github_to_Gilab_pages.md")
1125+ self.client.get("/posts/2020-07-14Friz_box_turned_off_DHCP.md")
1126+ self.client.get("/posts/2020-07-12Road_to_local_K8S.md")
1127+ self.client.get("/posts/2019-11-16Compiling_emacs_from_source_code_on_fedora.md")
1128+ self.client.get("/posts/2019-04-22Automating_desktop_setup_with_ansible-pull_part-2.md")
1129+ self.client.get("/posts/2019-03-07Automating_desktop_setup_with_ansible-pull_part-1.md")
1130+ self.client.get("/posts/2019-04-22Ansible_part_2.md")
1131diff --git a/src/blog.rs b/src/blog.rs
1132index 0fa9543d0587f6369870ffe56a30084a0beec241..c87730374672bbcc6fc8158177b0229644dc5fd8 100644
1133--- a/src/blog.rs
1134+++ b/src/blog.rs
1135@@ -1,4 +1,5 @@
1136 use chrono::NaiveDate;
1137+use pulldown_cmark::{html, Options, Parser};
1138 use regex::Regex;
1139 use rust_embed::RustEmbed;
1140 use sailfish::TemplateOnce;
1141@@ -60,8 +61,11 @@ }
1142
1143 fn get_file_content(path: &str) -> String {
1144 let buffer = PostAsset::get(path).unwrap().data.into_owned();
1145-
1146- return String::from_utf8(buffer).unwrap();
1147+ let md = String::from_utf8(buffer).unwrap();
1148+ let parser = Parser::new_ext(&md, Options::empty());
1149+ let mut html_output = &mut String::new();
1150+ html::push_html(&mut html_output, parser);
1151+ return html_output.to_string();
1152 }
1153
1154 pub fn render_post_page(path: &String) -> String {
1155diff --git a/tests/test_blog.rs b/tests/test_blog.rs
1156index 31d572595116f4fd3c078eb07360904c1f9e5fbb..b72f80014b9514a502450953c506968c5c53360c 100644
1157--- a/tests/test_blog.rs
1158+++ b/tests/test_blog.rs
1159@@ -5,7 +5,7 @@
1160
1161 #[test]
1162 fn test_create_blog_entry() {
1163- let asset_filename = String::from("2021-12-03Enable_NFS_on_K3S.html");
1164+ let asset_filename = String::from("2021-12-03Enable_NFS_on_K3S.md");
1165 let post_date = NaiveDate::from_ymd(2021, 12, 03);
1166
1167 let blog_entry = BlogEntry::new(&asset_filename);
1168@@ -23,7 +23,7 @@ }
1169
1170 #[test]
1171 fn test_render_post_page() {
1172- let path = &String::from("2020-07-14Friz_box_turned_off_DHCP.html");
1173+ let path = &String::from("2020-07-14Friz_box_turned_off_DHCP.md");
1174 let page = render_post_page(path);
1175 assert!(!page.is_empty());
1176 }