aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkeni7385 <andrea@andreacorsini.xyz>2022-06-04 00:09:16 +0300
committerkeni7385 <andrea@andreacorsini.xyz>2022-06-04 00:09:16 +0300
commitaa547f522941c9ba3c60dd0083305c59f717cedd (patch)
treee8ba86747892a89162288ec9be4eed738311190d
Initial commit
-rwxr-xr-xREADME.md12
-rwxr-xr-x_assets/andreacorsini-pubkey.txt52
-rwxr-xr-x_assets/css/style.css87
-rwxr-xr-x_assets/favicon.icobin0 -> 15406 bytes
-rwxr-xr-x_assets/images/camera-2-icon.pngbin0 -> 2756 bytes
-rw-r--r--_assets/images/email.svg121
-rwxr-xr-x_assets/images/feed.svg137
-rwxr-xr-x_assets/images/me.jpgbin0 -> 71380 bytes
-rwxr-xr-x_assets/images/profile-cut.jpgbin0 -> 15943 bytes
-rwxr-xr-x_assets/images/under_construction.gifbin0 -> 7298 bytes
-rwxr-xr-x_assets/rss.xml15
-rwxr-xr-x_footer.t.html9
-rw-r--r--_header.t.html42
-rwxr-xr-x_pages/computing.html98
-rwxr-xr-x_pages/email.html10
-rw-r--r--_pages/index.html21
-rw-r--r--_pages/notes/a-simple-static-website-generator.html307
-rwxr-xr-x_pages/notes/index.html14
-rw-r--r--_pages/privacy-policy.html18
-rwxr-xr-x_pages/travels/index.html65
-rwxr-xr-x_pages/travels/pictures/index.html27
-rwxr-xr-xsswg.sh50
22 files changed, 1085 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100755
index 0000000..634efbb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,12 @@
+# Website
+
+## Generate static content
+``` sh
+./sswg.sh
+```
+
+## Run locally
+``` sh
+cd _static
+python -m http.server
+```
diff --git a/_assets/andreacorsini-pubkey.txt b/_assets/andreacorsini-pubkey.txt
new file mode 100755
index 0000000..f6b0858
--- /dev/null
+++ b/_assets/andreacorsini-pubkey.txt
@@ -0,0 +1,52 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+P9Y/V1CBCw==
+=iuKW
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/_assets/css/style.css b/_assets/css/style.css
new file mode 100755
index 0000000..d5ca676
--- /dev/null
+++ b/_assets/css/style.css
@@ -0,0 +1,87 @@
+body {
+ margin: 2em auto;
+ max-width: 650px;
+ line-height: 1.6;
+ font-size: 18px;
+ color: #f0efd1;
+ background-color: rgba(10,10,10);
+ padding: 0 10px;
+}
+
+h1, h2, h3, a, dt {
+ color: #cfba58;
+}
+
+h1, h2, h3 {
+ line-height: 1.2;
+}
+
+dt {
+ line-height: 2;
+}
+
+
+h1 {
+ text-align: center;
+}
+
+a {
+ text-decoration: underline;
+ font-style: italic;
+}
+
+a:hover, a:active {
+ color: #f2e091;
+}
+
+a:active {
+ text-decoration: none;
+}
+
+small {
+ font-size: 13px;
+}
+
+header {
+ text-align: center;
+}
+
+header nav {
+ text-align: center;
+}
+
+img#profile {
+ float: left;
+}
+
+main {
+ margin-top: 5px;
+ background-color: rgba(20,20,20);
+ padding: 0.5em 1em;
+ border-radius: 5px 5px 0px 0px;
+ border: 1px solid rgb(40, 40, 40);
+}
+
+footer {
+ border: 1px solid rgb(40, 40, 40);
+ border-top: 1px solid #cfba58;
+ font-size: 13px;
+ padding: 0.5em 1em;
+ background-color: rgba(15, 15, 15);
+}
+
+pre, samp {
+ padding: 0.25rem 1rem;
+ max-width: 100%;
+ overflow-x: auto;
+ font-family: monospace;
+ font-size: 14px;
+}
+
+pre {
+ background-color: rgb(40, 40, 40);
+}
+samp {
+ display: block;
+ line-height: 115%;
+}
diff --git a/_assets/favicon.ico b/_assets/favicon.ico
new file mode 100755
index 0000000..90afb7f
--- /dev/null
+++ b/_assets/favicon.ico
Binary files differ
diff --git a/_assets/images/camera-2-icon.png b/_assets/images/camera-2-icon.png
new file mode 100755
index 0000000..f88cabd
--- /dev/null
+++ b/_assets/images/camera-2-icon.png
Binary files differ
diff --git a/_assets/images/email.svg b/_assets/images/email.svg
new file mode 100644
index 0000000..41e5c93
--- /dev/null
+++ b/_assets/images/email.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="16"
+ height="16"
+ id="RSSicon"
+ viewBox="0 0 32 32"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata
+ id="metadata34">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs17">
+ <linearGradient
+ x1="30.059999"
+ y1="30.059999"
+ x2="225.94"
+ y2="225.94"
+ id="RSSg"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.125)">
+ <stop
+ offset="0.0"
+ stop-color="#E3702D"
+ id="stop2"
+ style="stop-color:#000eff;stop-opacity:1" />
+ <stop
+ offset="0.1071"
+ stop-color="#EA7D31"
+ id="stop4"
+ style="stop-color:#0040ff;stop-opacity:1" />
+ <stop
+ offset="0.3503"
+ stop-color="#F69537"
+ id="stop6"
+ style="stop-color:#0095ff;stop-opacity:1" />
+ <stop
+ offset="0.5"
+ stop-color="#FB9E3A"
+ id="stop8"
+ style="stop-color:#00c6ff;stop-opacity:1" />
+ <stop
+ offset="0.7016"
+ stop-color="#EA7C31"
+ id="stop10"
+ style="stop-color:#0095ff;stop-opacity:1" />
+ <stop
+ offset="0.8866"
+ stop-color="#DE642B"
+ id="stop12"
+ style="stop-color:#0040ff;stop-opacity:1" />
+ <stop
+ offset="1.0"
+ stop-color="#D95B29"
+ id="stop14"
+ style="stop-color:#000eff;stop-opacity:1" />
+ </linearGradient>
+ </defs>
+ <rect
+ width="32"
+ height="32"
+ rx="6.875"
+ ry="6.875"
+ x="0"
+ y="0"
+ fill="#cc5d15"
+ id="rect19"
+ style="stroke-width:0.125;fill:#000eff;fill-opacity:1" />
+ <rect
+ width="30.75"
+ height="30.75"
+ rx="6.25"
+ ry="6.25"
+ x="0.625"
+ y="0.625"
+ fill="#f49c52"
+ id="rect21"
+ style="stroke-width:0.125;fill:#00c6ff;fill-opacity:1" />
+ <rect
+ width="29.5"
+ height="29.5"
+ rx="5.875"
+ ry="5.875"
+ x="1.25"
+ y="1.25"
+ fill="url(#RSSg)"
+ id="rect23"
+ style="fill:url(#RSSg);stroke-width:0.125" />
+ <g
+ id="g5267"
+ transform="translate(-1.2291659,-1.0132171)">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 7.1799193,9.2180961 H 27.175884 l -9.889143,6.9897799 z"
+ id="path1391" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6.2291657,10.072429 7.9702233,5.636069 -7.8984483,8.272084 z"
+ id="path1657" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 28.229166,10.072429 -7.970216,5.636069 7.898537,8.272084 z"
+ id="path1805" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 7.1167087,24.808338 H 27.453173 l -8.150532,-8.426429 -2.079948,1.390812 -2.028251,-1.431584 z"
+ id="path1859" />
+ </g>
+</svg>
diff --git a/_assets/images/feed.svg b/_assets/images/feed.svg
new file mode 100755
index 0000000..9caf37f
--- /dev/null
+++ b/_assets/images/feed.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="16"
+ height="16"
+ id="RSSicon"
+ viewBox="0 0 32 32"
+ sodipodi:docname="feed.svg"
+ inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)">
+ <metadata
+ id="metadata34">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1600"
+ inkscape:window-height="835"
+ id="namedview32"
+ showgrid="false"
+ inkscape:zoom="5.25"
+ inkscape:cx="64"
+ inkscape:cy="58.225126"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="RSSicon"
+ inkscape:document-rotation="0" />
+ <defs
+ id="defs17">
+ <linearGradient
+ x1="30.059999"
+ y1="30.059999"
+ x2="225.94"
+ y2="225.94"
+ id="RSSg"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.125)">
+ <stop
+ offset="0.0"
+ stop-color="#E3702D"
+ id="stop2" />
+ <stop
+ offset="0.1071"
+ stop-color="#EA7D31"
+ id="stop4" />
+ <stop
+ offset="0.3503"
+ stop-color="#F69537"
+ id="stop6" />
+ <stop
+ offset="0.5"
+ stop-color="#FB9E3A"
+ id="stop8" />
+ <stop
+ offset="0.7016"
+ stop-color="#EA7C31"
+ id="stop10" />
+ <stop
+ offset="0.8866"
+ stop-color="#DE642B"
+ id="stop12" />
+ <stop
+ offset="1.0"
+ stop-color="#D95B29"
+ id="stop14" />
+ </linearGradient>
+ </defs>
+ <rect
+ width="32"
+ height="32"
+ rx="6.875"
+ ry="6.875"
+ x="0"
+ y="0"
+ fill="#cc5d15"
+ id="rect19"
+ style="stroke-width:0.125" />
+ <rect
+ width="30.75"
+ height="30.75"
+ rx="6.25"
+ ry="6.25"
+ x="0.625"
+ y="0.625"
+ fill="#f49c52"
+ id="rect21"
+ style="stroke-width:0.125" />
+ <rect
+ width="29.5"
+ height="29.5"
+ rx="5.875"
+ ry="5.875"
+ x="1.25"
+ y="1.25"
+ fill="url(#RSSg)"
+ id="rect23"
+ style="fill:url(#RSSg);stroke-width:0.125" />
+ <circle
+ cx="8.5"
+ cy="23.625"
+ r="3"
+ fill="#ffffff"
+ id="circle25"
+ style="stroke-width:0.125" />
+ <path
+ d="M 20,26.625 H 15.75 A 10.25,10.25 0 0 0 5.5,16.375 v -4.25 a 14.5,14.5 0 0 1 14.5,14.5 z"
+ fill="#ffffff"
+ id="path27"
+ style="stroke-width:0.125" />
+ <path
+ d="M 23,26.625 A 17.5,17.5 0 0 0 5.5,9.125 V 4.75 a 21.875,21.875 0 0 1 21.875,21.875 z"
+ fill="#ffffff"
+ id="path29"
+ style="stroke-width:0.125" />
+</svg>
diff --git a/_assets/images/me.jpg b/_assets/images/me.jpg
new file mode 100755
index 0000000..44a766c
--- /dev/null
+++ b/_assets/images/me.jpg
Binary files differ
diff --git a/_assets/images/profile-cut.jpg b/_assets/images/profile-cut.jpg
new file mode 100755
index 0000000..0e13e88
--- /dev/null
+++ b/_assets/images/profile-cut.jpg
Binary files differ
diff --git a/_assets/images/under_construction.gif b/_assets/images/under_construction.gif
new file mode 100755
index 0000000..09bf635
--- /dev/null
+++ b/_assets/images/under_construction.gif
Binary files differ
diff --git a/_assets/rss.xml b/_assets/rss.xml
new file mode 100755
index 0000000..d092b9b
--- /dev/null
+++ b/_assets/rss.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+ <channel>
+ <title>Updates from Andrea</title>
+ <description>Latest changes from Andrea Corsini's website.</description>
+ <link>https://andreacorsini.xyz</link>
+ <language>en-uk</language>
+ <image>
+ <title>Updates from Andrea</title>
+ <link>https://andreacorsini.xyz</link>
+ <url>https://andreacorsini.xyz/images/profile-cut.jpg</url>
+ </image>
+ <atom:link href="https://andreacorsini.xyz/rss.xml" rel="self" type="application/rss+xml" />
+ </channel>
+</rss>
diff --git a/_footer.t.html b/_footer.t.html
new file mode 100755
index 0000000..7a6f0d6
--- /dev/null
+++ b/_footer.t.html
@@ -0,0 +1,9 @@
+ </main>
+ <footer>
+ <p><a href="/rss.xml"><img src="/images/feed.svg"> Feed RSS</a> |
+ <a href="/email.html"><img src="/images/email.svg"> Email</a></p>
+ <p>Copyright &copy; 2020-2022 Andrea Corsini -
+ <a href="/privacy-policy.html">Privacy policy</a></p>
+ </footer>
+ </body>
+</html>
diff --git a/_header.t.html b/_header.t.html
new file mode 100644
index 0000000..1b4d3bf
--- /dev/null
+++ b/_header.t.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <meta charset="utf-8">
+ <title>TITLE</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="DESCRIPTION">
+ <link rel="stylesheet" type="text/css" href="/css/style.css" media="screen">
+ <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+ </head>
+
+ <body>
+ <header>
+ <img src="/images/profile-cut.jpg" id="profile">
+ <h1><big>Andrea Corsini</big> <small>https://andreacorsini.xyz</small></h1>
+
+ <div>
+ <aside>I believe in personal digital freedom</aside>
+ <nav>
+ <a href="/index.html">Home</a> |
+ <a href="/notes">My notes</a> |
+# <a href="/computing.html">Computing</a> |
+ <a href="/travels">Travels</a> |
+ <a href="/email.html">Email</a>
+ </nav>
+ </div>
+
+# <div>
+# <hr>
+# <h3>WIP - Under Coding</h3>
+# <img src="/images/under_construction.gif" style="float:right;width:64px">
+# <p><small>Hey visitor! The whole website is still
+# under <strike>construction</strike> coding. Check out the
+# <a href="/rss.xml">RSS feed</a> for updates. Currently, I am
+# finishing to upload some photos from my
+# past <a href="/travels">travels</a>.</small>
+# </p>
+# <hr>
+# </div>
+ </header>
+ <main>
diff --git a/_pages/computing.html b/_pages/computing.html
new file mode 100755
index 0000000..4ed6960
--- /dev/null
+++ b/_pages/computing.html
@@ -0,0 +1,98 @@
+TITLE="Andrea Corsini's computing"
+DESCRIPTION="List and comments about my daily personal computing, softwares and hardware I use."
+---
+<h2>My Computing</h2>
+<p>You can find a short list of the main softwares I use daily on
+ my personal drives. My personal daily computing regards browsing
+ the internet, checking my emails, occasional coding and
+ writing.</p>
+
+<p>Although I do nothing fancy and complicated, I do have some
+ requirements. The main concerns are about <b>control</b>
+ and <b>lightweightness</b>. I want to be in charge of the
+ computations that happen on my machine, what is running and what
+ is not. I want to control which software is using bandwidth. I
+ want to be able to check the behaviour of any of my software,
+ and potentially change it to confomr it to my needs. I want to
+ be the user, not to be used. These thoughts are pretty much what
+ the <a href="https://www.fsf.org/">Free Software Foundation
+ (FSF)</a> and the <a href="">GNU project</a> is advocating.</p>
+
+<p>Not as important as the freedom on computing, I wish, whenever
+ possible, that the softwares I use are unbloated. I prefer
+ lightweight over fancy. That is why I don't mind to
+ use <em>Terminal User Interfaces (TUI)</em> over GUI when is
+ convinient to do so.</p>
+
+<dl>
+ <dt>Operative System</dt>
+ <dd>I normally run
+ <a href="https://www.archlinux.org">Arch</a>-based
+ distributions, because once installed, they contains only
+ essential softwares to get started, no unwanted bloat and I
+ can build my personal desktop directly. In particular I
+ run <a href="">Parabola GNU/Linux-libre</a>, an FSF-approved
+ 100% free (<a href="https://www.gnu.org/philosophy/free-sw">as
+ in: freedom</a>) operating system. Not any computer can run a
+ 100% free distribution, due to nonfree firmware blobs (more
+ about it in the <a href="#hardware">hardware section</a>
+ below). So in other secondary laptops that cannot run
+ Parabola, my fallback is plain Arch Linux.</dd>
+ <dt>Window Manager/Desktop Environment</dt>
+ <dd>I don't have a desktop environment, except for the
+ collection of scripts, softwares and configurations that I have
+ put together. I run
+ the <a href="https://suckless.org/">Suckless</a> window
+ manager
+ called <a href="https://dwm.suckless.org/">dwm</a> with
+ several patches applied on it. Apart from the keybings for
+ main
+ programs, <a href="https://tools.suckless.org/dmenu/">dmenu</a>
+ helps me to execute the other software installed. dmenu is
+ very dynamic and easy to be integrated with other scripts and
+ utility. For instance, I use it to select wireless
+ connections, device mounts, integration with the password
+ manager and so forth.</dd>
+ <dt>Shell and Terminal</dt>
+ <dd>I use Zsh as interactive shell. I normally run the shell
+ interpreter within <a href="https://st.suckless.org/">st - simple
+ terminal</a>. I applied some reasonable patches from
+ the <a href="https://st.suckless.org/patches/">Suckless
+ collection</a>, such as scrolling, transparency, background color
+ change on focus, solarized dark theme, boxdraw and so forth. If
+ emacs is already running, I will probably use the integrated
+ terminal, instead of st.</dd>
+ <dt>Email</dt>
+ <dd>I read my emails within emacs throught mu4e, an email client
+ based on
+ <a href="https://www.djcbsoftware.nl/code/mu/">mu</a>. Its message
+ filter is super powerful, it helps me to find any message really
+ quickly. The account configurations took me time to get it right,
+ but the effort was worth.</dd>
+ <dt>Editor</dt>
+ <dd><a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>
+ for any task that goes further than 1 minute. Some features that
+ changed my life are org-mode (org-agenda, org-...), magit, dired,
+ tramp. I found the out-of-the-box experience really inconvinient,
+ the configuration tooks me really a lot of time, but now is tailored
+ to any task I need. For the sake of learning, I still configured
+ emacs personally, I could have gone with an Emacs distribution
+ instead? Now I am trying Emacs Doom for curiosity. For small changes
+ I go for vim. I keep my vim as simple and unpolished as possible,
+ so I can have a similar experience when I occasionally </dd>
+ <dt>Writings</dt>
+ <dd>LaTeX, Libre Office with others</dd>
+ <dt>Browser</dt>
+ <dd>IceCat or Firefox based. I like surf but is so slow</dd>
+ <dt>Passwords</dt>
+ <dd>The standard Unix pass</dd>
+ <dt>RSS reader</dt>
+ <dd>emacs ...</dd>
+ <dt>PDF reader</dt>
+ <dd>zathura, which benefits?</dd>
+ <dt>Screen eye protection</dt>
+ <dd>redshift</dd>
+</dl>
+
+<h2 id="hardware">Hardware</h2>
+<p>TP T60, libreboot, open WiFi card.</p>
diff --git a/_pages/email.html b/_pages/email.html
new file mode 100755
index 0000000..6b31665
--- /dev/null
+++ b/_pages/email.html
@@ -0,0 +1,10 @@
+TITLE="Andrea Corsini's email contacts"
+DESCRIPTION="Andrea Corsini's email contacts"
+---
+<h2>Email</h2>
+<p>You can reach me by email:</p>
+<ul>
+ <li><b>andrea</b> <code>at</code> <b>andreacorsini</b> <code>period</code> <b>xyz</b></li>
+ <li>My GPG key: <a href="andreacorsini-pubkey.txt"><code>F6E3 24C4 BB4E 8C87 9DBE
+ 463A D998 38F5 E246 2789</code></a></li>
+</ul>
diff --git a/_pages/index.html b/_pages/index.html
new file mode 100644
index 0000000..62ea2dd
--- /dev/null
+++ b/_pages/index.html
@@ -0,0 +1,21 @@
+TITLE="Andrea Corsini's Personal Site"
+DESCRIPTION="Andrea Corsini's personal website"
+---
+<h2>Welcome to my website</h2>
+
+<img src="/images/me.jpg" width="100%">
+
+<p>Hi, I am Andrea, Italian graduate student, passionate for Linux technologies,
+ rollerskating and, recently, baking.</p>
+
+<p>Currently, I am exploring color image
+ quantization errors, and deep learning methods for signal inverse
+ problems.</p>
+
+<p>This website gathers <a href="/notes">my notes</a>,
+ <a href="/travels/pictures">photos</a>, and personal self-hosted services,
+ such as email, <a href="https://git.andreacorsini.xyz">git server</a>,
+ <a href="https://meet.andreacorsini.xyz">Jitsi</a> instance, calendar, Matrix
+ and others to come.</p>
+
+<p>Browse it <i>freely</i>!</p>
diff --git a/_pages/notes/a-simple-static-website-generator.html b/_pages/notes/a-simple-static-website-generator.html
new file mode 100644
index 0000000..e5399a8
--- /dev/null
+++ b/_pages/notes/a-simple-static-website-generator.html
@@ -0,0 +1,307 @@
+TITLE="Andrea Corsini's Notes - A simple static website generator"
+DESCRIPTION="I share and explain my simple static website generator, written in SHell scriptng from scratch."
+---
+<article>
+ <header>
+ <h2>A simple static website generator (sswg)</h2>
+ <time>June 3, 2022</time>
+ </header>
+ <nav class="toc">
+ TOC
+ </nav>
+
+ <p>Why bother creating another static website generator? There are so many
+ awesome projects out in the open source community, such as Jekyll, Hugo,
+ just to name few of them. Well, I wanted to have something dead simple, but
+ also flexible enough to be easily customized. So I wrote my own simple
+ static website generator (sswg) using SHell scripting.</p>
+
+
+ <p>This is possible because I don't need many features yet. In the future, I
+ could end up in switching to a proper generator. Anyway, for the time being I
+ can just use mine and share it here. Hopefully, it could be useful for other
+ folks that want to practice shell scripting, and/or want to implement their
+ website generator.</p>
+
+ <p>Here, you will find the original version and its rationale. Most likely,
+ the generator will change to cope with my website needs. You can find the
+ current version in my <a href="https://git.andreacorsini.xyz/sswg">git
+ repository</a>.</p>
+
+ <h3>Features</h3>
+ <p>At the time of writing, I am a simple person. I just want to:
+ <ul>
+ <li>Invoke the content generation with a simple command, such as <code>./sswg.sh</code>.</li>
+ <li>The generation should be <i>idempotent</i>.</li>
+ <li>Copy the header and footer templates in every page.</li>
+ <li>Support some simple macro substitution, to allow different title and description for each page.</li>
+ <li>Support the insertion of verbatim source code.</li>
+ </ul>
+ </p>
+
+ <p>Anything more than that is not necessary at the moment. For example, I
+ don't need Markdown or other languages to write pages, plain HTML is good
+ enough. In the future, it would be nice to have some extra features, like
+ automatic generation of RSS and Table of Content (TOC).</p>
+
+ <h3>Folder structure</h3>
+ <p>My sswg is just a tiny shell script to include in the website root. In this
+ way, it can be versioned along all the other website code. The script expect
+ to find a folder tree similar to</p>
+
+ <samp>
+ <b>├── _assets</b><br>
+ │    ├── style.css<br>
+ │    ├── favicon.ico<br>
+ │    ├── images<br>
+ │    │     └── picture.png<br>
+ │    └── rss.xml<br>
+ <b>├── _footer.t.html</b><br>
+ <b>├── _header.t.html</b><br>
+ <b>├── _pages</b><br>
+ │     ├── email.html<br>
+ │     ├── index.html<br>
+ │     ├── my-notes.html<br>
+ │     ├── notes<br>
+ │     │     └── a-simple-static-website-generator.html<br>
+ │     └── privacy-policy.html<br>
+ <b>└── sswg.sh</b>
+ </samp>
+
+ <p>Only the elements in <b>bold</b> are mandatory. The other files and folders
+ are there to showcase. Once the script is invoked with <code>./sswg.sh</code>,
+ sswg will regenerate the website to the output folder, named <code>_static</code>.
+ Any content of the direcorty <code>_asset</code> will be copied to the root
+ of <code>_static</code>. The content of template
+ files <code>_header.t.html</code> and <code>_footer.t.html</code> are preposed
+ and appended to each HTML page, respectively. The sswg will copy to the output
+ folder all the HTML files contained in <code>_page</code>, as well as
+ sub-directories and images.</p>
+
+ <p>The output folder <code>_static</code> for this example will result in</p>
+
+ <samp>
+ ├── style.css<br>
+ ├── favicon.ico<br>
+ ├── images<br>
+ │     └── picture.png<br>
+ ├── rss.xml<br>
+ ├── email.html<br>
+ ├── index.html<br>
+ ├── my-notes.html<br>
+ ├── notes<br>
+ │     └── a-simple-static-website-generator.html<br>
+ └── privacy-policy.html<br>
+ </samp>
+
+
+ <h3>Add a webpage</h3>
+ <p>Each HTML page in the directory <code>_page</code> only contains the main
+ content, while header and footer are shared in every page. Thus we don't need
+ to copy them every time.</p>
+
+ <p>So, adding a page is very easy. Save every new page within the
+ folder <code>_page</code>, or in one of its subfolders. Start with the first
+ two lines by defining the title and description for this page, by using the
+ macro T&#8205;ITLE and D&#8205;ESCRIPTION from sswg custom syntax. Then
+ separate the macro from the rest of the page with 3 dashes "<code>---</code>".
+ For example:</p>
+
+ |<pre>
+ |T&#8205;ITLE=&quot;My new web page&quot;
+ |D&#8205;ESCRIPTION=&quot;This page contains information about...&quot;
+ |---
+ |&lt;h2&gt;TI&#8205;TLE&lt;/h2&gt;
+ |# This is a sswg comment.
+ |&lt;p&gt;A page can contain whatever valid HTML code.&lt;/p&gt;
+ |</pre>
+
+# Test comment.
+ <p>The example also shows comments syntaxt. Every line which starts with a
+ hash mark # is considered as a source comment. Hence, it won't be copied in
+ the final static HTML page.</p>
+
+ <h3>Header and Footer templates</h3>
+ <p>Inside <code>_header.t.html</code> write the page content from the DOCTYPE
+ tag, to the navigation of your page, until the beginning of your main content.
+ Use the macros <code>TI&#8205;TLE</code> and <code>D&#8205;ESCRIPTION</code> for HTML title
+ and meta description. The generator will overwrite them with the value specified
+ within the HTML page. Here an example of header templete:</p>
+
+ |<pre>
+ |&lt;!DOCTYPE html&gt;
+ |&lt;html&gt;
+ | &lt;head&gt;
+ | &lt;title&gt;TI&#8205;TLE&lt;/title&gt;
+ | &lt;meta name=&quot;description&quot; content=&quot;DE&#8205;SCRIPTION&quot;&gt;
+ | &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/css/style.css&quot; media=&quot;screen&quot;&gt;
+ | &lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon.ico&quot; type=&quot;image/x-icon&quot;&gt;
+ | &lt;/head&gt;
+ |
+ | &lt;body&gt;
+ | &lt;header&gt;
+ | &lt;h1&gt;Generic website title&lt;/h1&gt;
+ | &lt;div&gt;
+ | &lt;aside&gt;I believe in personal digital freedom&lt;/aside&gt;
+ | &lt;nav&gt;
+ | &lt;a href=&quot;/index.html&quot;&gt;Home&lt;/a&gt; |
+ | &lt;a href=&quot;/my-notes.html&quot;&gt;My notes&lt;/a&gt; |
+ | &lt;a href=&quot;/email.html&quot;&gt;Email&lt;/a&gt;
+ | &lt;/nav&gt;
+ | &lt;/div&gt;
+ | &lt;/header&gt;
+ | &lt;main&gt;
+ |</pre>
+
+ <p>Similarly to the header, <code>_footer.t.html</code> contains all the rest
+ of the website to be inserted at the end of each page. No macro substitution
+ is needed in this file. Here an example:</p>
+
+ |<pre>
+ | &lt;/main&gt;
+ | &lt;footer&gt;
+ | &lt;p&gt;&lt;a href=&quot;/rss.xml&quot;&gt;&lt;img src=&quot;/images/feed.svg&quot;&gt;Feed RSS&lt;/a&gt;.
+ | &lt;p&gt;Copyright &amp;copy; 2020-2021 Acme -
+ | &lt;a href=&quot;/privacy-policy.html&quot;&gt;Privacy policy&lt;/a&gt;&lt;/p&gt;
+ | &lt;/footer&gt;
+ | &lt;/body&gt;
+ |&lt;/html&gt;
+ |</pre>
+
+ <h3>Inserting verbatim source code</h3>
+ <p>I would like the HTML code assembled by sswg to maintain a proper
+ indentation. Therefore, the script takes care about indenting the page
+ contents between the header and footer templates. However, this is an issue
+ for the verbatim source code.</p>
+
+ <p>Indeed, any sort of white-spaces indentation added to the content of the
+ code block tags (<code>&lt;pre&gt;...&lt;/pre&gt;</code>) is interpreted by
+ browsers as white-space characters of the verbatim code. Therefore, the
+ white-space characters will appear in the code blocks, resulting in unwanted
+ spaces.</p>
+
+ <p>To solve this issue, I decided to prepose every code block with a pipe
+ character |. The sswg script will take care in removing the pipe and
+ white-space characters. For example, the code</p>
+
+ |<pre>
+ | |&lt;pre&gt;
+ | |cd
+ | |ls -la
+ | |&lt;/pre&gt;
+ |</pre>
+
+ <p>will be transformed into the HTML source code</p>
+
+ |<pre>
+ |&lt;pre&gt;
+ |cd
+ |ls -la
+ |&lt;/pre&gt;
+ |</pre>
+
+ <h3>Code step by step</h3>
+ <p>By the time you will read this article, the code might have changed. So you
+ will find the current version in the
+ repository <a href="https://git.andreacorsini.xyz/sswg">git.andreacorsini.xyz/sswg</a>.</p>
+
+ <p>For what concern the early static website generator script, it starts by
+ setting constants for folders and template elements:</p>
+
+ |<pre>
+ |#!/bin/sh
+ |
+ |SSWG_OUTPUT_DIR="_static"
+ |SSWG_ASSETS_DIR="_assets"
+ |SSWG_PAGES_DIR="_pages"
+ |SSWG_HEADER_TEMPLATE="_header.t.html"
+ |SSWG_FOOTER_TEMPLATE="_footer.t.html"
+ |</pre>
+
+ <p>Second, the output folder <code>_static</code> is cleaned:</p>
+
+ |<pre>
+ |rm -rf "$SSWG_OUTPUT_DIR"
+ |mkdir "$SSWG_OUTPUT_DIR"
+ |</pre>
+
+ <p>So, be careful if you copied something inside it. It is wiser to copy
+ external files into <code>_assets</code>, as they will be automatically copied
+ back into <code>_static</code>:</p>
+
+ |<pre>
+ |cp -r "$SSWG_ASSETS_DIR"/* "$SSWG_OUTPUT_DIR"/.
+ |</pre>
+
+ <p>Then, we can finally generate each HTML page:</p>
+ |<pre>
+ |for page in $(find "$SSWG_PAGES_DIR" -iname '*.html' -o \
+ | -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png');
+ |do
+ | filename="$SSWG_OUTPUT_DIR/${page##$SSWG_PAGES_DIR/}"
+ | mkdir -p "`dirname $filename`"
+ |
+ | if [ "${filename##*.}" = "html" ]; then
+ |</pre>
+
+ <p>Prepose the header template:</p>
+ |<pre>
+ | cat "$SSWG_HEADER_TEMPLATE" >> "$filename"
+ |</pre>
+
+ <p>Indentation in the page content to match the header level:</p>
+ |<pre>
+ | cat "$page" | awk '
+ | BEGIN {print ""}
+ | FNR>3 {print " " $0}
+ | END {print ""}' >> "$filename"
+ |</pre>
+
+ <p>Append the footer template:</p>
+ |<pre>
+ | cat "$SSWG_FOOTER_TEMPLATE" >> "$filename"
+ |</pre>
+
+ <p>To perform the macro substitution, firstly shell-evaluate the first two
+ lines of the page. They are supposed to contain a shell-like declaration of the
+ variables TI&#8205;TLE and DES&#8205;CRIPTION. Secondly, each macro can be
+ substituted in the whole document.</p>
+ |<pre>
+ | eval `cat "$page" | awk 'FNR<3'`
+ | sed -i'' "s@TI&#8205;TLE@$TIT&#8205;LE@g" "$filename"
+ | sed -i'' "s@DES&#8205;CRIPTION@$DES&#8205;CRIPTION@g" "$filename"
+ |</pre>
+
+ <p>We can now remove comments and pipe + white-spaces:</p>
+ |<pre>
+ | sed -i'' "/^[ \t]*#/d" "$filename"
+ | sed -i'' "s/^[ \t]*|//g" "$filename"
+ |</pre>
+
+ <p>Continue with the rest of the script. If we are not reading an HTML file,
+ it could be either an image or a folder. Just copy it to its destination
+ in <code>_static</code>:</p>
+
+ |<pre>
+ | else
+ | cp $page $filename
+ | fi;
+ |done;
+ |</pre>
+
+ <hr>
+ <h3>Conclusion</h3>
+ <p>Static website generators are valid lightweight alternatives to more
+ complicate and larger content management systems (CMS), such as Wordpress.
+ They are normally simple to use, requires no databases, neither complicated
+ install procedures. Users are in control throught text files.</p>
+
+ <p>This post showed how to write a simple static website generator (sswg) to get our
+ web pages started. So far, the generator script has only bare-bones
+ functionalities, but it is simple enough to be extended with additional
+ features.</p>
+
+ <p>I hope you found this post useful and interesting. Don't hesitate to
+ contact me for any questions or comments.</p>
+
+</article>
diff --git a/_pages/notes/index.html b/_pages/notes/index.html
new file mode 100755
index 0000000..dca7b9f
--- /dev/null
+++ b/_pages/notes/index.html
@@ -0,0 +1,14 @@
+TITLE="Andrea Corsini's Personal Notes"
+DESCRIPTION="Posts about anything I want to share, such as ideas, thoughts, learning"
+---
+<h2>My Notes</h2>
+<p>
+ <time datetime="2022-06-03">June 3, 2022</time>
+ <br>
+ <a href="/notes/a-simple-static-website-generator.html">A simple static website generator (sswg)</a>
+</p>
+
+# <ul>
+# <li>Why <em>&#8220;I have nothing to hide&#8221;</em> is not a reasonable excuse for personal digital freedom</li>
+# <li>On the importance of donations to Libre and Open Source software.</li>
+# </ul>
diff --git a/_pages/privacy-policy.html b/_pages/privacy-policy.html
new file mode 100644
index 0000000..2264187
--- /dev/null
+++ b/_pages/privacy-policy.html
@@ -0,0 +1,18 @@
+TITLE="Privacy policy in andreacorsini.xyz"
+DESCRIPTION="A very easy privacy policy: no data is collected in this website."
+---
+<h2>Privacy policy</h2>
+<p>This website is proud to be free from <q>BloatScripts</q>, advertising,
+ cookies, tracking/telemtry systems and other nasty non-free garbage that we are
+ sadly used to experience nowadays on the web. Hence, no data is collected
+ directly.</p>
+
+<p>If you use my <a href="/email.html">email</a> to contact me, you
+ implicitely agree to be contacted back in order to receive an answer.</p>
+
+<p>Currently, your IP and requests are recorded in the logs of my webserver
+ for security reasons. Logs are cleared every 5 days. The records are processed only
+ by free and open source security tools, such as <var>fail2ban</var>. Your IP
+ might be automatically recorded in the <i>deny list</i> for longer time or
+ permanently, in case you are conducting malicious activity towards my server
+ instances.</p>
diff --git a/_pages/travels/index.html b/_pages/travels/index.html
new file mode 100755
index 0000000..8755893
--- /dev/null
+++ b/_pages/travels/index.html
@@ -0,0 +1,65 @@
+TITLE="Andrea Corsini's travels"
+DESCRIPTION="Andrea Corsini's travels and photos"
+---
+<h2>Travels</h2>
+<p><a href="/travels/pictures"><img src="/images/camera-2-icon.png" /></a> Browse
+ my photos in the <a href="/travels/pictures">travel pictures</a> folder.
+ Although I'm not an expert photographer, I like to share some pictures from my
+ trips.</p>
+<br/>
+<p>How I like to travel:</p>
+<ul>
+ <li>Prefer journeys over vacations, backpacks over suitcases, active over
+ comfy.</li>
+ <li>Look for something different, seek the unexpected. Don't try to replace what you have elsewhere.</li>
+ <li>Experience characteristic coucines and trust the locals.</li>
+ <li>Come back home with your spirit enriched (probably not the wallet).</li>
+</ul>
+
+<h2>Journeys</h2>
+
+<p>I have recognised the importance of travelling only during my
+ undergraduate and graduate studies. I was lucky to have the possibility to
+ combine studies and new cultural experiences.</p>
+
+<p>Beside the usual good time spent in vacations with my family, I had
+ experienced three very intense long journeys. I will share more about each of
+ them in a separate blog post. So far, I summarise them here.</p>
+
+<h3>Journey to the East</h3>
+<p>This chapter of my life started with my exchange in the mainland China.
+ Between 2015 and 2016, I have spent the second grade of my bachelor's in
+ Shanghai. For a young western in his 20s, that was quite a shock initially,
+ but it slowly transitioned to a melting pot of fantastic memories and people.
+ During the various national holidays, I had the chance to travel around China
+ and south-east Asia. In 2017/2018, I came back to Shanghai, to experience the
+ working-life in the metropolis.</p>
+
+<h3>Balkan flavours</h3>
+<p>Two weeks in the middle of 2018's summer. I started this trip by visiting
+ Hungary and Slovenia in the Central Europe. Then the trip proceeded down to
+ the Southeastern Europe, passing through Croatia and finally reaching
+ Sarajevo. The culture in Bosnia and Herzegovina was fascinating, a real
+ authentic bridge between western and middle-east traditions. I want to explore
+ more this corner of Europe, since this was just a taste.</p>
+<p>Before this trip, I was ignoring most of the countries in this region. Of
+ course we learnt about them in our education, but you know, names and
+ geographical position easily fade away when you only experience them in few
+ hours during classes.</p>
+
+<h3>Europe Rediscovery</h3>
+<p>The long time spent in Asia amazed me, but also made me re-appreciate what we
+ have here in Europe. For example, it's easy to travel around with a simple ID
+ card, by trains, ferries and cheap flights.</p>
+<p>Because of this and many other reasons, during my master's degree, I enrolled
+ in the <a href="https://masterschool.eitdigital.eu">EIT Digital master
+ school</a>. This programme fosters the entrepreneurial spirit of ICT students,
+ beside their technical major courses. It also lets us studying in two
+ different University around Europe, to experience different environments. In
+ my case, I chose Milano (Italy) and Helsinki (Finland). What's more, the
+ master school organises other side events, such as the
+ programme <i>kick-off</i> in Paris and a summer school in Stockholm (Sweden).
+ Thanks to this project, I could join an exciting network of like-minded
+ students. This is definitely a <i>plus</i>, which enriched the overall
+ experience. Unfortunately, near the end of my programme, a world-wide pandemic
+ stroke all over the globe.</p>
diff --git a/_pages/travels/pictures/index.html b/_pages/travels/pictures/index.html
new file mode 100755
index 0000000..e1cfdc6
--- /dev/null
+++ b/_pages/travels/pictures/index.html
@@ -0,0 +1,27 @@
+TITLE="Listing of Pictures"
+DESCRIPTION="Listing of Pictures"
+---
+<h2>Listing of Picture Thumbnails</h2>
+<p>
+<!-- Generated by thumbnail_page.pl by jcv http://www.netpurgatory.com/ -->
+<a href="../">Go back</a><br /><br />
+<a href="./index2.html">./</a>
+<br />
+<a href="./china/index.html">china</a>
+<br />
+<a href="./estonia/index.html">estonia</a>
+<br />
+<a href="./estonia/tallin/index.html">estonia/tallin</a>
+<br />
+<a href="./finland/index.html">finland</a>
+<br />
+<a href="./finland/porvo/index.html">finland/porvo</a>
+<br />
+<a href="./finland/tampere/index.html">finland/tampere</a>
+<br />
+<a href="./taiwan/index.html">taiwan</a>
+<br />
+<a href="./taiwan/jiufeng/index.html">taiwan/jiufeng</a>
+<br />
+<a href="./taiwan/taipei/index.html">taiwan/taipei</a>
+<br />
diff --git a/sswg.sh b/sswg.sh
new file mode 100755
index 0000000..6e7b42d
--- /dev/null
+++ b/sswg.sh
@@ -0,0 +1,50 @@
+# SSWG - Simple Static Website Generator
+#!/bin/sh
+
+SSWG_OUTPUT_DIR="_static"
+SSWG_ASSETS_DIR="_assets"
+SSWG_PAGES_DIR="_pages"
+SSWG_HEADER_TEMPLATE="_header.t.html"
+SSWG_FOOTER_TEMPLATE="_footer.t.html"
+
+rm -rf "$SSWG_OUTPUT_DIR"
+mkdir "$SSWG_OUTPUT_DIR"
+
+# Copy static assets
+cp -r "$SSWG_ASSETS_DIR"/* "$SSWG_OUTPUT_DIR"/.
+
+# Generate HTML pages
+for page in $(find "$SSWG_PAGES_DIR" -iname '*.html' -o \
+ -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png');
+do
+ filename="$SSWG_OUTPUT_DIR/${page##$SSWG_PAGES_DIR/}"
+ mkdir -p "`dirname $filename`"
+
+ if [ "${filename##*.}" = "html" ]; then
+ # prepose header
+ cat "$SSWG_HEADER_TEMPLATE" >> "$filename"
+
+ # Fix indentation in the generated source
+ cat "$page" | awk '
+ BEGIN {print ""}
+ FNR>3 {print " " $0}
+ END {print ""}' >> "$filename"
+
+ # append footer
+ cat "$SSWG_FOOTER_TEMPLATE" >> "$filename"
+
+ # macro substitution
+ eval `cat "$page" | awk 'FNR<3'`
+ sed -i'' "s@TITLE@$TITLE@g" "$filename"
+ sed -i'' "s@DESCRIPTION@$DESCRIPTION@g" "$filename"
+
+ # remove comments
+ sed -i'' "/^[ \t]*#/d" "$filename"
+
+ # remove indentation before whitespaces+pipe
+ # useful e.g. with <pre> tags
+ sed -i'' "s/^[ \t]*|//g" "$filename" # remove
+ else
+ cp $page $filename
+ fi;
+done;