<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-03-09T13:45:36+00:00</updated><id>/feed.xml</id><title type="html">Luigi Selmi</title><subtitle>Physicist and scientific software developer interested in artificial intelligence applied to geoscience and remote sensing</subtitle><entry><title type="html">Minimal Mistakes Maximal Efficacy</title><link href="/minimal-mistakes-jekyll-theme.html" rel="alternate" type="text/html" title="Minimal Mistakes Maximal Efficacy" /><published>2025-12-17T00:00:00+00:00</published><updated>2025-12-17T00:00:00+00:00</updated><id>/minimal-mistakes-jekyll-theme</id><content type="html" xml:base="/minimal-mistakes-jekyll-theme.html"><![CDATA[<p><img src="https://upload.wikimedia.org/wikipedia/commons/5/57/Dr_Jekyll_and_Mr_Hyde_poster.png" alt="Dr. Jekyll and Mr. Hyde" /></p>

<p>In a <a href="https://www.luigiselmi.eu/how_to_build_your_jekyll_website.html">previous post</a> we have seen how to create a website scaffold with <a href="https://jekyllrb.com/">Jekyll</a>, change some settings, add a page, an image, and write a post. We used the default theme <em>minima</em>. While it can be good enough for a personal website, we may want to create a site for our business, still simple but with more options for the layout of our pages and posts, and a search index to filter our posts. In order to keep everything simple we will start from scratch creating a scaffold with Jekyll and modifying the content step by step. The theme <a href="https://mmistakes.github.io/minimal-mistakes/">Minimal Mistakes</a>, created by <a href="https://mademistakes.com/about/">Michael Rose</a>, fulfills our requirements.</p>

<h2 id="the-petslovers-website">The PetsLovers website</h2>
<p>We assume we have all the required software as described in the previous post. We will create a website for pets’ lovers starting from a Jekyll scaffold. Since we want our website to be hosted on a GitHub repository we follow its naming rule. We open a bash terminal (Git Bash for MS Windows) and run the command</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll new pets-lovers.github.io
</code></pre></div></div>
<p>You should see a new directory <em>pets-lovers.github.io</em> with the standard Jekyll files: <em>_config.yml</em>, <em>Gemfile</em>, two pages <em>index.markdown</em> and <em>about.markdown</em> in the repository root folder, and a <em>_post/</em> folder with one post.</p>

<p><img src="/assets/petslovers/petslovers_folder.jpg" alt="PetLovers folder" /></p>

<p>What you have now is a Jekyll scaffold with the default <em>minima</em> theme. The first thing we have to change, before starting the Jekyll local web server, is the configuration file <strong>_config.yml</strong>. We’ll change the title as well as the theme. We will fetch the theme from <a href="&quot;https://rubygems.org&quot;">RubyGems</a> so we won’t need to write the list of Ruby plugins (aka gems) that are used by the theme <em>Minimal Mistakes</em> in the Gemfile. We can select one of the skins available for the theme by setting the <code class="language-plaintext highlighter-rouge">minimal_mistakes_skin</code> attribute. We also need to add the <code class="language-plaintext highlighter-rouge">jekyll-include-cache</code> plugin in the configuration file. We will use a Ruby package to enable a superset of Markdown called kramdown adding the <code class="language-plaintext highlighter-rouge">markdown:kramdown</code> attribute. We add the attribute <code class="language-plaintext highlighter-rouge">search: true</code> to enable the search index and we tell Jekyll to look for the <em>_pages/</em> folder that we will create soon to host our website pages.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>title: PetsLover
email: your-email@example.com
description: &gt;- # this means to ignore newlines until "baseurl:"
  Write an awesome description for your new site here. You can edit this
  line in _config.yml. It will appear in your document head meta (for
  Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
remote_theme: "mmistakes/minimal-mistakes@4.27.3"
minimal_mistakes_skin: contrast # "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
markdown: kramdown

plugins:
  - jekyll-feed
  - jekyll-include-cache

search: true

include:
  - _pages

</code></pre></div></div>

<p>We replace the content of our <strong>Gemfile</strong> to just these few lines</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source "https://rubygems.org"

gem "github-pages", group: :jekyll_plugins
gem "jekyll-include-cache", group: :jekyll_plugins
</code></pre></div></div>
<p>In order to download all the required plugins we run the command</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle
</code></pre></div></div>
<p>Before restarting the Jekyll server with the new configuration we have to</p>

<ol>
  <li>create a new directory <em>_pages/</em></li>
  <li>move the <em>about.markdown</em> and <em>index.markdown</em> files in <em>_pages/</em> folder</li>
  <li>change the <em>layout</em> attribute in all post and page files to <code class="language-plaintext highlighter-rouge">layout: single</code></li>
  <li>add the <code class="language-plaintext highlighter-rouge">permalink: /</code> attribute in the <em>index.markdown</em> file that we moved to the <em>_pages/</em> folder</li>
  <li>create a new directory <em>_data/</em> with the <em>navigation.yml</em> file for the menu in it</li>
  <li>create a new page <em>year-archive.md</em> in the <em>_pages/</em> folder that will contain the list of posts</li>
</ol>

<p>Assuming the first four steps are completed we create the configuration file <em>navigation.yml</em> for the website navigation with the following settings</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>main:
  - title: "Posts"
    url: /posts/
  - title: "About"
    url: /about/
</code></pre></div></div>
<p>The page <em>year-archive.md</em> that will contain the list of post in temporal order is the following</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
title: "Posts by Year"
permalink: /posts/
layout: posts
author_profile: false
---
</code></pre></div></div>

<p>Now the structure of your repository should look like this</p>

<p><img src="/assets/petslovers/petslovers_folder_2.jpg" alt="PetLovers folder" /></p>

<p>If we restart our Jekyll server</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle exec jekyll serve
</code></pre></div></div>

<p>your landing page should look like this: a blank landing page with links to the Posts and About pages and to a search box.</p>

<p><img src="/assets/petslovers/petslovesr_index_page_1.jpg" alt="PetLovers index page" /></p>

<p>You should be able to see the posts by clicking on <em>Posts</em>, the <em>About</em> page, and also to filter the posts by keywords, even though so far there is only one post.</p>

<h2 id="layouts">Layouts</h2>
<p>A layout defines look and position of a page elements, such as text and pictures. We use only three <a href="https://mmistakes.github.io/minimal-mistakes/docs/layouts/">layouts</a> available with the theme <em>Minimal Mistakes</em>:</p>

<ul>
  <li>single</li>
  <li>posts</li>
  <li>splash</li>
</ul>

<h3 id="single-layout">Single layout</h3>
<p>We use the two columns <a href="https://mmistakes.github.io/minimal-mistakes/docs/layouts/#single-layout">single</a> layout for posts and pages.</p>

<h3 id="posts-layout">Posts layout</h3>
<p>We use the <a href="https://mmistakes.github.io/minimal-mistakes/docs/layouts/#layout-posts">posts</a> layout only for the <em>year-archive.md</em> page that contains the list of posts ordered by year of publication.</p>

<h3 id="splash-layout">Splash layout</h3>
<p>We will use the <a href="https://mmistakes.github.io/minimal-mistakes/docs/layouts/#splash-page-layout">splash</a> layout for <em>index.markdown</em>, the landing page of our website. This layout allows us to split the page in rows and each row in blocks of elements.</p>

<h2 id="assets">Assets</h2>
<p>Before updating the landing page we want to use some pictures of cats and dogs that will be shown in it. We create a new folder <em>assets/</em> where we will copy some pictures. In this folder we can organize the media content that we will add to our future pages and posts. Let’s say we have already copied the pictures we want to show in our landing page <em>index.markdown</em>, two dogs and two cats. We copy also a picture for our logo and an overlay image with hippos. The structure of your repository should look something like this</p>

<p><img src="/assets/petslovers/petslovers_folder_3.jpg" alt="PetLovers folder" /></p>

<h2 id="the-landing-page">The landing page</h2>
<p>So far our landing page is a blank one. We have to change its layout from <em>single</em> to <em>splash</em> with all the elements in the right place. Assuming the <em>assets/</em> folder has been created and the files copied, we can replace the content of the landing page with the following</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
layout: splash
permalink: /
title: "PetsLovers"
date: 2025-12-16

#-------------------------------- header -------------------------
header:
  overlay_color: "#000"
  overlay_filter: "0.1"
  overlay_image: /assets/images/hippos.jpg
  actions:
    - label: "Download"
      url: "https://github.com/mmistakes/minimal-mistakes/"
  caption: "Photo credit: [**Luigi Selmi**](https://www.luigiselmi.eu)"
excerpt: "The website for all pets lovers"

#-------------------------------- intro -------------------------
intro:
  - excerpt: 'Dogs, cats and other pets'

#-------------------------------- 1st feature row -------------------------
feature_row1:
  - image_path: /assets/images/cat_1.jpg
    alt: "Cat 1"
    title: "Cat 1"
    excerpt: "This is some sample content about a cat that goes here with **Markdown** formatting."

  - image_path: /assets/images/dog_1.jpg
    image_caption: "Image courtesy of [Unsplash](https://unsplash.com/)"
    alt: "Dog 1"
    title: "Dog 1"
    excerpt: "This is some sample content about a dog that goes here with **Markdown** formatting."
    url: "#test-link"
    btn_label: "Read More"
    btn_class: "btn--primary"

  - image_path: /assets/images/cat_2.jpg
    width: 158
    title: "Cat 2"
    excerpt: "This is some sample content about a cat that goes here with **Markdown** formatting."

#-------------------------------- 2nd feature row -------------------------
feature_row2:
  - image_path: /assets/images/dog_2.jpg
    alt: "Dog 2"
    title: "Dog image Left Aligned"
    excerpt: 'This is some sample content about a dog that goes here with **Markdown** formatting. Left aligned with `type="left"`'
    url: "#test-link"
    btn_label: "Read More"
    btn_class: "btn--primary"

#-------------------------------- 3rd feature row -------------------------
feature_row3:
  - image_path: /assets/images/cat_1.jpg
    alt: "Cat 1"
    title: "Cat Image Right Aligned"
    excerpt: 'This is some sample content about a cat that goes here with **Markdown** formatting. Right aligned with `type="right"`'
    url: "#test-link"
    btn_label: "Read More"
    btn_class: "btn--primary"
---
{% include feature_row id="intro" type="center" %}
{% include feature_row id="feature_row1" %}
{% include feature_row id="feature_row2" type="left" %}
{% include feature_row id="feature_row3" type="right" %}
</code></pre></div></div>

<p>It should be easy to follow the Markdown file. There is an overlay image in the header block with a link for download, an intro block, and three feature rows below. The first feature row contains three elements, each element contains an image, some text, and a link. The elements in the other two feature rows have the same structure. Be sure that the link to the images are correct.</p>

<h2 id="logo-and-social-networks">Logo and social networks</h2>
<p>We add to the <em>_config.yml</em> configuration file the path to the logo image and the links to our social networks account to be shown on the footer of each page of our website</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>title: PetsLovers
logo: "/assets/images/petlover_logo.png"
email: your-email@example.com
description: &gt;- # this means to ignore newlines until "baseurl:"
  Write an awesome description for your new site here. You can edit this
  line in _config.yml. It will appear in your document head meta (for
  Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
remote_theme: "mmistakes/minimal-mistakes@4.27.3"
minimal_mistakes_skin: contrast # "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
markdown: kramdown

plugins:
  - jekyll-feed
  - jekyll-include-cache

search: true

include:
  - _pages

footer:
  since: "2025"
  links:
    - label: "Twitter"
      icon: "fab fa-fw fa-twitter-square"
      url: "https://x.com/pets-lover"
    - label: "GitHub"
      icon: "fab fa-fw fa-github"
      url: "https://github.com/pets-lover"
    - label: "LinkedIn"
      icon: "fab fa-fw fa-linkedin"
      url: "https://www.linkedin.com/in/pets-lover"
</code></pre></div></div>
<p>Now we can restart our Jekyll server to use the updated configuration file. If everything is in the right place you should see your landing page similar to this</p>

<p><img src="/assets/petslovers/final_landing_page.jpg" alt="Landing page" /></p>

<h2 id="pushing-your-website-to-github">Pushing your website to GitHub</h2>
<p>Once you are done with your local website you need to create a repository in you GitHub account. The name of the repository on GitHub must begin with your user or organization name, in this example <strong>pets-lovers.github.io</strong>. In your GitHub account you click on the “New” button to open a page to create a new repository. You write petslovers.github.io as the repository name and click on the “Create repository” button. At this point the repository is created and you can push your local website with a few git commands (changing the user name).</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "# pets-lovers.github.io" &gt;&gt; README.md
git init
git add --all
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:pets-lover/pets-lovers.github.io.git
git push -u origin main
</code></pre></div></div>
<p>The website is immediately online at the URL <a href="https://pets-lovers.github.io/">https://pets-lovers.github.io/</a></p>
<h2 id="conclusion">Conclusion</h2>
<p>We have built a scaffold for our new PetsLovers website based on the <em>Minimal Mistakes</em> theme. We can add more pages, images, posts, and other elements by using more layouts or developing some new ones from scratch as described in the <a href="https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/">theme website</a>. The markup code and the images used to create the PetsLovers website for this post is available on <a href="https://github.com/pets-lovers/pets-lovers.github.io">Pets-Lovers repository</a>. Just clone the repository</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ git clone https://github.com/pets-lovers/pets-lovers.github.io.git
</code></pre></div></div>
<p>and start your Jekyll server. Have fun!</p>]]></content><author><name></name></author><category term="self-publishing," /><category term="GitHub," /><category term="Jekyll" /><summary type="html"><![CDATA[In a previous post we have seen how to create a website scaffold with Jekyll, change some settings, add a page, an image, and write a post. We used the default theme minima. While it can be good enough for a personal website, we may want to create a site for our business, still simple but with more options for the layout of our pages and posts, and a search index to filter our posts. In order to keep everything simple we will start from scratch creating a scaffold with Jekyll and modifying the content step by step. The theme Minimal Mistakes, created by Michael Rose, fulfills our requirements. The PetsLovers website We assume we have all the required software as described in the previous post. We will create a website for pets’ lovers starting from a Jekyll scaffold. Since we want our website to be hosted on a GitHub repository we follow its naming rule. We open a bash terminal (Git Bash for MS Windows) and run the command $ jekyll new pets-lovers.github.io You should see a new directory pets-lovers.github.io with the standard Jekyll files: _config.yml, Gemfile, two pages index.markdown and about.markdown in the repository root folder, and a _post/ folder with one post. What you have now is a Jekyll scaffold with the default minima theme. The first thing we have to change, before starting the Jekyll local web server, is the configuration file _config.yml. We’ll change the title as well as the theme. We will fetch the theme from RubyGems so we won’t need to write the list of Ruby plugins (aka gems) that are used by the theme Minimal Mistakes in the Gemfile. We can select one of the skins available for the theme by setting the minimal_mistakes_skin attribute. We also need to add the jekyll-include-cache plugin in the configuration file. We will use a Ruby package to enable a superset of Markdown called kramdown adding the markdown:kramdown attribute. We add the attribute search: true to enable the search index and we tell Jekyll to look for the _pages/ folder that we will create soon to host our website pages. title: PetsLover email: your-email@example.com description: &gt;- # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com twitter_username: jekyllrb github_username: jekyll # Build settings remote_theme: "mmistakes/minimal-mistakes@4.27.3" minimal_mistakes_skin: contrast # "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" markdown: kramdown plugins: - jekyll-feed - jekyll-include-cache search: true include: - _pages We replace the content of our Gemfile to just these few lines source "https://rubygems.org" gem "github-pages", group: :jekyll_plugins gem "jekyll-include-cache", group: :jekyll_plugins In order to download all the required plugins we run the command $ bundle Before restarting the Jekyll server with the new configuration we have to create a new directory _pages/ move the about.markdown and index.markdown files in _pages/ folder change the layout attribute in all post and page files to layout: single add the permalink: / attribute in the index.markdown file that we moved to the _pages/ folder create a new directory _data/ with the navigation.yml file for the menu in it create a new page year-archive.md in the _pages/ folder that will contain the list of posts Assuming the first four steps are completed we create the configuration file navigation.yml for the website navigation with the following settings main: - title: "Posts" url: /posts/ - title: "About" url: /about/ The page year-archive.md that will contain the list of post in temporal order is the following --- title: "Posts by Year" permalink: /posts/ layout: posts author_profile: false --- Now the structure of your repository should look like this If we restart our Jekyll server $ bundle exec jekyll serve your landing page should look like this: a blank landing page with links to the Posts and About pages and to a search box. You should be able to see the posts by clicking on Posts, the About page, and also to filter the posts by keywords, even though so far there is only one post. Layouts A layout defines look and position of a page elements, such as text and pictures. We use only three layouts available with the theme Minimal Mistakes: single posts splash Single layout We use the two columns single layout for posts and pages. Posts layout We use the posts layout only for the year-archive.md page that contains the list of posts ordered by year of publication. Splash layout We will use the splash layout for index.markdown, the landing page of our website. This layout allows us to split the page in rows and each row in blocks of elements. Assets Before updating the landing page we want to use some pictures of cats and dogs that will be shown in it. We create a new folder assets/ where we will copy some pictures. In this folder we can organize the media content that we will add to our future pages and posts. Let’s say we have already copied the pictures we want to show in our landing page index.markdown, two dogs and two cats. We copy also a picture for our logo and an overlay image with hippos. The structure of your repository should look something like this The landing page So far our landing page is a blank one. We have to change its layout from single to splash with all the elements in the right place. Assuming the assets/ folder has been created and the files copied, we can replace the content of the landing page with the following --- layout: splash permalink: / title: "PetsLovers" date: 2025-12-16 #-------------------------------- header ------------------------- header: overlay_color: "#000" overlay_filter: "0.1" overlay_image: /assets/images/hippos.jpg actions: - label: "Download" url: "https://github.com/mmistakes/minimal-mistakes/" caption: "Photo credit: [**Luigi Selmi**](https://www.luigiselmi.eu)" excerpt: "The website for all pets lovers" #-------------------------------- intro ------------------------- intro: - excerpt: 'Dogs, cats and other pets' #-------------------------------- 1st feature row ------------------------- feature_row1: - image_path: /assets/images/cat_1.jpg alt: "Cat 1" title: "Cat 1" excerpt: "This is some sample content about a cat that goes here with **Markdown** formatting." - image_path: /assets/images/dog_1.jpg image_caption: "Image courtesy of [Unsplash](https://unsplash.com/)" alt: "Dog 1" title: "Dog 1" excerpt: "This is some sample content about a dog that goes here with **Markdown** formatting." url: "#test-link" btn_label: "Read More" btn_class: "btn--primary" - image_path: /assets/images/cat_2.jpg width: 158 title: "Cat 2" excerpt: "This is some sample content about a cat that goes here with **Markdown** formatting." #-------------------------------- 2nd feature row ------------------------- feature_row2: - image_path: /assets/images/dog_2.jpg alt: "Dog 2" title: "Dog image Left Aligned" excerpt: 'This is some sample content about a dog that goes here with **Markdown** formatting. Left aligned with `type="left"`' url: "#test-link" btn_label: "Read More" btn_class: "btn--primary" #-------------------------------- 3rd feature row ------------------------- feature_row3: - image_path: /assets/images/cat_1.jpg alt: "Cat 1" title: "Cat Image Right Aligned" excerpt: 'This is some sample content about a cat that goes here with **Markdown** formatting. Right aligned with `type="right"`' url: "#test-link" btn_label: "Read More" btn_class: "btn--primary" --- {% include feature_row id="intro" type="center" %} {% include feature_row id="feature_row1" %} {% include feature_row id="feature_row2" type="left" %} {% include feature_row id="feature_row3" type="right" %} It should be easy to follow the Markdown file. There is an overlay image in the header block with a link for download, an intro block, and three feature rows below. The first feature row contains three elements, each element contains an image, some text, and a link. The elements in the other two feature rows have the same structure. Be sure that the link to the images are correct. Logo and social networks We add to the _config.yml configuration file the path to the logo image and the links to our social networks account to be shown on the footer of each page of our website title: PetsLovers logo: "/assets/images/petlover_logo.png" email: your-email@example.com description: &gt;- # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com twitter_username: jekyllrb github_username: jekyll # Build settings remote_theme: "mmistakes/minimal-mistakes@4.27.3" minimal_mistakes_skin: contrast # "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" markdown: kramdown plugins: - jekyll-feed - jekyll-include-cache search: true include: - _pages footer: since: "2025" links: - label: "Twitter" icon: "fab fa-fw fa-twitter-square" url: "https://x.com/pets-lover" - label: "GitHub" icon: "fab fa-fw fa-github" url: "https://github.com/pets-lover" - label: "LinkedIn" icon: "fab fa-fw fa-linkedin" url: "https://www.linkedin.com/in/pets-lover" Now we can restart our Jekyll server to use the updated configuration file. If everything is in the right place you should see your landing page similar to this Pushing your website to GitHub Once you are done with your local website you need to create a repository in you GitHub account. The name of the repository on GitHub must begin with your user or organization name, in this example pets-lovers.github.io. In your GitHub account you click on the “New” button to open a page to create a new repository. You write petslovers.github.io as the repository name and click on the “Create repository” button. At this point the repository is created and you can push your local website with a few git commands (changing the user name). echo "# pets-lovers.github.io" &gt;&gt; README.md git init git add --all git commit -m "first commit" git branch -M main git remote add origin git@github.com:pets-lover/pets-lovers.github.io.git git push -u origin main The website is immediately online at the URL https://pets-lovers.github.io/ Conclusion We have built a scaffold for our new PetsLovers website based on the Minimal Mistakes theme. We can add more pages, images, posts, and other elements by using more layouts or developing some new ones from scratch as described in the theme website. The markup code and the images used to create the PetsLovers website for this post is available on Pets-Lovers repository. Just clone the repository $ git clone https://github.com/pets-lovers/pets-lovers.github.io.git and start your Jekyll server. Have fun!]]></summary></entry><entry><title type="html">How to build your static website with Jekyll and GitHub Pages</title><link href="/how_to_build_your_jekyll_website.html" rel="alternate" type="text/html" title="How to build your static website with Jekyll and GitHub Pages" /><published>2025-12-15T00:00:00+00:00</published><updated>2025-12-15T00:00:00+00:00</updated><id>/how_to_build_your_jekyll_website</id><content type="html" xml:base="/how_to_build_your_jekyll_website.html"><![CDATA[<p><img src="https://upload.wikimedia.org/wikipedia/commons/5/57/Dr_Jekyll_and_Mr_Hyde_poster.png" alt="Dr. Jekyll and Mr. Hyde" /></p>
<h2 id="why-bother-">Why bother ?</h2>
<p>There are many good reasons to have your own website(s) online. For example to communicate with friends, let your enemies know you are alive and kicking, write about your last trip. Nowadays a website is not just for fun it’s somewhat similar to a bank account, or better a reputation account. If you write something interesting and useful it might represent your best investment of time: low risks and high <del>returns</del> visibility. A website or a blog is like a (human) Capital Accumulation Plan. It is a fundamental piece of your business infrastructure, whatever your business is.</p>

<h2 id="options-to-create-and-publish-a-website">Options to create and publish a website</h2>
<p>You can easily build and publish a website with <a href="https://wordpress.com/">WordPress</a>, <a href="https://sites.google.com/">Google Sites</a> or <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html">Amazon S3</a>, this last one with some more technical skill. A static website simply means that it works without a database. My opinion is that <a href="https://docs.github.com/en/pages">GitHub Pages</a> is better suited for scientists and software developers who know what a version control system is, in particular <a href="https://git-scm.com/">git</a>, and are comfortable using a command line interface.</p>

<h2 id="github-pages">GitHub Pages</h2>
<p>If you have an account on GitHub you can create a repository that will contain all the files you need for your website. The idea is to create or change the content of your website locally, commit the changes and push them on your GitHub repository. There is no need to learn HTML, CSS, JavaScript or to be a web architect to create and publish a website. You can write your content using the <strong>Markdown</strong> markup language, choose a theme among many available <a href="https://jekyllthemes.io/">online</a> for rendering, and follow the conventions used by <strong>Jekyll</strong> for the structure of your content to transform it into a website. A GitHub repository used as a website must follow some rules. The name of the repository must have the structure <strong>username.github.io</strong> where you replace username with your GitHub user name. Other rules are explained in the GitHub Pages <a href="https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/creating-a-github-pages-site-with-jekyll">documentation</a>.</p>

<h2 id="jekyll">Jekyll</h2>
<p><a href="https://jekyllrb.com/">Jekyll</a> is a framework for creating static websites and blogs. it is based on the <em>Convention over Configuration</em> design principle and on the Ruby programming language.</p>

<h2 id="software-to-install">Software to install</h2>
<p>In order to get started you have to have installed the following software</p>

<ul>
  <li>Git</li>
  <li>Ruby</li>
  <li>Bundler</li>
  <li>Jekyll</li>
</ul>

<p>Here I write a short description of the tools. For more details and information on how to install them follow the instructions on the tool’s website.</p>

<h3 id="git">Git</h3>
<p>Git is a version control system, based on a client-server architecture, that allows a team of people to share and work on documents in a consistent way. It is a fundamental tool for software developers. Git implements a workflow. You start by creating or editing one or more documents, then you use your local git client to add them to a list of documents that you want to commit in order to be shared and finally you push the commit to the server. Once a document is in the remote repository other people can clone or fork your documents, make changes and push the modified version, if they have been granted the rights to do so. The <a href="https://git-scm.com/install/">Git website</a> provides information to install a Git client in any *NIX environments equipped with terminals such as bash by default. The <a href="https://gitforwindows.org/">MS Windows version</a> comes with Git Bash, a bash terminal emulator for Windows. Once you are done installing Git you should be able to see its version by running the following command from the terminal, in this example from Git Bash for MS Windows.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ git -v
git version 2.49.0.windows.1
</code></pre></div></div>

<h3 id="ruby">Ruby</h3>
<p>Ruby is an interpreted programming language and is the language used for all the software packages, or plugins, used by Jekyll, that is itself a Ruby package. A <a href="https://www.ruby-lang.org/it/documentation/installation/">Ruby interpreter</a> must be installed locally in order to run Jekyll and all the plugins. After the installation you should see its version, something similar to the following</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ruby -v
ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [x64-mingw-ucrt]
</code></pre></div></div>
<p>With Ruby comes also a default gems management system. Check that it works properly running the command. In my case its 4.0.0, you might see a different version number</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gem -v
4.0.0
</code></pre></div></div>

<h3 id="bundler">Bundler</h3>
<p><a href="https://bundler.io/">Bundler</a> is a software packages management system for Ruby. It is used to install, update, and execute Ruby packages, aka gems. If a Ruby gem is not already installed in your local environment Bundler will download it from <a href="https://rubygems.org/">RubyGems</a> and install in your local environment. Bundler can be used instead of gem, the default system. It is itself a Ruby package and can be installed using the command</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gem install bundler

</code></pre></div></div>

<p>Checking its version after the installation you should see something similar to this</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle -v
4.0.1
</code></pre></div></div>
<h3 id="jekyll-1">Jekyll</h3>
<p>Jekyll is a Ruby gem that contains a web server that you can use to create and test your website during its development. It can be installed using the default Ruby gems management system</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gem install jekyll

</code></pre></div></div>
<p>If you check its version after the installation you should see something similar to this</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll -v
jekyll 4.4.1

</code></pre></div></div>
<p>For more commands available with Jekyll see also <a href="https://jekyllrb.com/docs/usage/">here</a></p>

<h2 id="the-text-editor">The text editor</h2>
<p>You don’t need a full fledged Integrated Development Environment such as Visual Studio Code to write your markdown files but a text editor with some features like syntax highlighting can help. I still use <a href="https://atom-editor.cc/">Atom</a>, originally developed for Git users and now replaced by VS Code. Any bash terminal provides <em>nano</em> that is also available in Git Bash for Windows.</p>

<h2 id="lets-get-started">Let’s get started</h2>
<p>We are now ready to build the scaffold for a first version of our website. We only have to open a terminal, e.g. Git Bash for MS Windows, and run Jekyll with the name of your website repository. Let’s say your user name on GitHub is <em>mrhyde</em>, the command to create your local repository is</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll new mrhyde.github.io
</code></pre></div></div>
<p>If you are not Mr. Hyde you will replace the <em>mrhyde</em> part with your user name on GitHub. It can also be the name of an organization that you have created on GitHub. The default theme is <em>minima</em>. You have just created a directory mrhyde.github.io. If you move inside it</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> $ cd mrhyde.github.io
</code></pre></div></div>
<p>you will see some files and folders but before that you can already start Jekyll and see the result with a browser</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle exec jekyll serve
</code></pre></div></div>
<p>The default port number of the Jekyll local web server is 4000 . You can use a different port number, e.g. 4001</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle exec jekyll serve -P 4001
</code></pre></div></div>

<p>If you open your web browser pointing to http://localhost:4000 you should see something similar to <a href="https://jekyll.github.io/minima/">this</a>.</p>

<h2 id="themes">Themes</h2>
<p>A theme is a collection of templates and stylesheets that control the look and layout of a website. There are several themes for Jekyll available online that can be used with GitHub Pages. Each theme is based on one or more Ruby gems. In this post we will only look at the default one, <em>minima</em>.</p>

<h3 id="minima">Minima</h3>
<p>This theme is supported by GitHub Pages and is very simple to configure and manage. It is the default theme of the web site you have just created with Jekyll.</p>

<h3 id="the-structure-of-a-jekyll-website">The structure of a Jekyll website</h3>
<p>A Jekyll-based site must contains some mandatory files and folders. The two main types of resources are pages and posts. Posts are kept in a separate folder while pages can be found in the repository root folder. The structure of a Jekyll website depends on the theme. This is the structure of the website based on the <em>minima</em> theme, version 2.5 or newer, that you have just created with Jenkins:</p>

<ul>
  <li>_posts/</li>
  <li>_site/</li>
  <li>_config.yml</li>
  <li>Gemfile</li>
  <li>index.md</li>
  <li>about.md</li>
</ul>

<h4 id="the-configuration-file">The configuration file</h4>
<p><strong>_config.yml</strong> is the only configuration file and, depending on the chosen theme, contains information such as the title of the website, a short description, its base URL, the theme, and the plugins, aka Ruby gems used to build the website with that theme.</p>

<h4 id="the-plugins-file">The plugins file</h4>
<p><strong>Gemfile</strong> contains a list of Ruby plugins, called gems, to be installed and run in order to build the website. The main gems are <em>jekyll</em> that implements the commands to be used to start a local web server for our web site, and <em>minima</em> that implements the default theme.</p>

<h4 id="the-index-page">The index page</h4>
<p><strong>index.md</strong> is the landing page of your website. Written in simple markdown, is the page visitors will see when they follow the URL of your GitHub repository. You can add other pages, such as the default <em>About</em> page, by adding a markdown file in the root folder.</p>

<h4 id="the-_posts-folder">The _posts/ folder</h4>
<p>A Jekyll website usually contains blog posts and the <strong>_posts</strong> folder is there exactly for that purpose. The name of a post file starts with a date in the form YYYY-MM-DD-.</p>

<h4 id="the-_site-folder">The _site/ folder</h4>
<p>This folder contains the HTML and CSS files created by Jekyll from the original markdown files. It is created locally from scratch every time you start the Jekyll’s local web server so there is no need to edit or change anything in this folder. You do not need to push this folder to your GitHub repository. The GitHub Pages workflow will use Jekyll to create the HTML and CSS files for your website exactly in the same way you do it locally with your Jekyll gem.</p>

<h3 id="configuring-your-website">Configuring your website</h3>
<p>The first thing you may want to change is the name shown on the upper left-hand of the website landing page. You only need to open the <em>_config.yml</em> file and update the title, e.g. to <em>Mr. Edward Hyde</em>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>title: Mr. Edward Hyde
email: your-email@example.com
description: &gt;- # this means to ignore newlines until "baseurl:"
  Write an awesome description for your new site here. You can edit this
  line in _config.yml. It will appear in your document head meta (for
  Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
theme: minima
plugins:
  - jekyll-feed
</code></pre></div></div>
<p>In order to see a change made in the configuration file to take effect you have to restart Jekyll.</p>

<h3 id="adding-a-page">Adding a page</h3>
<p>Adding a page to the <em>minima</em> scaffold is just about creating a new markdown file in the root folder. For example it can be your resume, e.g. resume.md, with a content like this</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
layout: page
title: Resume
permalink: /resume/
---
I am a part-time medical doctor based in Soho, in London's West End, United Kingdom.
</code></pre></div></div>
<p>You don’t have to restart Jekyll to see the effect when you create or change a page or a post. You should see the link to the new <em>Resume</em> page on the website menu, next to the default <em>About</em> page.</p>

<h3 id="adding-a-picture">Adding a picture</h3>
<p>You may want to add a picture to a page or post, for example in your website landing page, e.g. <em>mrhyde.jpg</em>. You have just to create an <strong>assets/</strong> folder, put the image there, and add a link to it in the <em>index.md</em> file.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
layout: home
---
&lt;img src="assets/mrhyde.jpg" alt="Mr. Hyde"&gt;
</code></pre></div></div>

<h3 id="writing-a-post">Writing a post</h3>
<p>As said before the file name for a post must begin with a date otherwise it will not be shown. Let’s say you are Mr. Hyde and want to write your opinion about Dr. Jekyll and publish your post on December 25th 2025. You create a markdown file, e.g. <em>2025-12-15-dr.-jekyll.md</em>. The - sign is used as a space. Then you add the following content and save the file.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
layout: post
title:  "The evil Dr. Jekyll!"
date:   2025-12-15
categories: jekyll website blogs
---
I really can’t stand Dr. Jekyll.
</code></pre></div></div>
<p>If you refresh your local website you should see a new post added to the list shown in the landing page. If you are not sure about when you will publish your post and just want to get started with a first draft you may create a <strong>_drafts</strong> folder and create your draft file there. In this case there is no need to put a date at the beginning of the file name. If you want to see your draft when you run Jekyll you have to start it using the <em>–drafts</em> option</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle exec jekyll serve --drafts
</code></pre></div></div>

<h3 id="pushing-your-website-to-github">Pushing your website to GitHub</h3>
<p>Once you are done with your local website you need to create a repository in you GitHub account. As said before the name of the repository must begin with your user name. For instance let’s say your user name is <em>mrhyde</em>. In your GitHub account you click on the “New” button to open a page to create a new repository. You write <em>mrhyde.github.io</em> as the repository name and click on the “Create repository” button. At this point the repository is created and you can push your local website with a few git commands.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git remote add origin git@github.com:mrhyde/mrhyde.github.io.git
git branch -M main
git push -u origin main
</code></pre></div></div>

<p>Now you should be able to see your website on GitHub with the same pages and posts that you see locally using the URL <em><a href="https://mrhyde.github.io">https://mrhyde.github.io</a></em>.</p>

<h2 id="conclusion">Conclusion</h2>
<p>There is a lot of information out there about how to build a website with Jekyll and GitHub pages, maybe too much with a lot of details that might be confusing. In this post I wrote a recipe with the ingredients that you have to <del>buy</del> install and what is their role in achieving the result. I hope it will also be useful to someone else. In one of the next post I will write about using other Jekyll themes, e.g. <a href="https://www.luigiselmi.eu/minimal-mistakes-jekyll-theme.html">Minimal Mistakes</a></p>]]></content><author><name></name></author><category term="self-publishing," /><category term="GitHub," /><category term="Jekyll" /><summary type="html"><![CDATA[Why bother ? There are many good reasons to have your own website(s) online. For example to communicate with friends, let your enemies know you are alive and kicking, write about your last trip. Nowadays a website is not just for fun it’s somewhat similar to a bank account, or better a reputation account. If you write something interesting and useful it might represent your best investment of time: low risks and high returns visibility. A website or a blog is like a (human) Capital Accumulation Plan. It is a fundamental piece of your business infrastructure, whatever your business is. Options to create and publish a website You can easily build and publish a website with WordPress, Google Sites or Amazon S3, this last one with some more technical skill. A static website simply means that it works without a database. My opinion is that GitHub Pages is better suited for scientists and software developers who know what a version control system is, in particular git, and are comfortable using a command line interface. GitHub Pages If you have an account on GitHub you can create a repository that will contain all the files you need for your website. The idea is to create or change the content of your website locally, commit the changes and push them on your GitHub repository. There is no need to learn HTML, CSS, JavaScript or to be a web architect to create and publish a website. You can write your content using the Markdown markup language, choose a theme among many available online for rendering, and follow the conventions used by Jekyll for the structure of your content to transform it into a website. A GitHub repository used as a website must follow some rules. The name of the repository must have the structure username.github.io where you replace username with your GitHub user name. Other rules are explained in the GitHub Pages documentation. Jekyll Jekyll is a framework for creating static websites and blogs. it is based on the Convention over Configuration design principle and on the Ruby programming language. Software to install In order to get started you have to have installed the following software Git Ruby Bundler Jekyll Here I write a short description of the tools. For more details and information on how to install them follow the instructions on the tool’s website. Git Git is a version control system, based on a client-server architecture, that allows a team of people to share and work on documents in a consistent way. It is a fundamental tool for software developers. Git implements a workflow. You start by creating or editing one or more documents, then you use your local git client to add them to a list of documents that you want to commit in order to be shared and finally you push the commit to the server. Once a document is in the remote repository other people can clone or fork your documents, make changes and push the modified version, if they have been granted the rights to do so. The Git website provides information to install a Git client in any *NIX environments equipped with terminals such as bash by default. The MS Windows version comes with Git Bash, a bash terminal emulator for Windows. Once you are done installing Git you should be able to see its version by running the following command from the terminal, in this example from Git Bash for MS Windows. $ git -v git version 2.49.0.windows.1 Ruby Ruby is an interpreted programming language and is the language used for all the software packages, or plugins, used by Jekyll, that is itself a Ruby package. A Ruby interpreter must be installed locally in order to run Jekyll and all the plugins. After the installation you should see its version, something similar to the following $ ruby -v ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [x64-mingw-ucrt] With Ruby comes also a default gems management system. Check that it works properly running the command. In my case its 4.0.0, you might see a different version number $ gem -v 4.0.0 Bundler Bundler is a software packages management system for Ruby. It is used to install, update, and execute Ruby packages, aka gems. If a Ruby gem is not already installed in your local environment Bundler will download it from RubyGems and install in your local environment. Bundler can be used instead of gem, the default system. It is itself a Ruby package and can be installed using the command $ gem install bundler Checking its version after the installation you should see something similar to this $ bundle -v 4.0.1 Jekyll Jekyll is a Ruby gem that contains a web server that you can use to create and test your website during its development. It can be installed using the default Ruby gems management system $ gem install jekyll If you check its version after the installation you should see something similar to this $ jekyll -v jekyll 4.4.1 For more commands available with Jekyll see also here The text editor You don’t need a full fledged Integrated Development Environment such as Visual Studio Code to write your markdown files but a text editor with some features like syntax highlighting can help. I still use Atom, originally developed for Git users and now replaced by VS Code. Any bash terminal provides nano that is also available in Git Bash for Windows. Let’s get started We are now ready to build the scaffold for a first version of our website. We only have to open a terminal, e.g. Git Bash for MS Windows, and run Jekyll with the name of your website repository. Let’s say your user name on GitHub is mrhyde, the command to create your local repository is $ jekyll new mrhyde.github.io If you are not Mr. Hyde you will replace the mrhyde part with your user name on GitHub. It can also be the name of an organization that you have created on GitHub. The default theme is minima. You have just created a directory mrhyde.github.io. If you move inside it $ cd mrhyde.github.io you will see some files and folders but before that you can already start Jekyll and see the result with a browser $ bundle exec jekyll serve The default port number of the Jekyll local web server is 4000 . You can use a different port number, e.g. 4001 $ bundle exec jekyll serve -P 4001 If you open your web browser pointing to http://localhost:4000 you should see something similar to this. Themes A theme is a collection of templates and stylesheets that control the look and layout of a website. There are several themes for Jekyll available online that can be used with GitHub Pages. Each theme is based on one or more Ruby gems. In this post we will only look at the default one, minima. Minima This theme is supported by GitHub Pages and is very simple to configure and manage. It is the default theme of the web site you have just created with Jekyll. The structure of a Jekyll website A Jekyll-based site must contains some mandatory files and folders. The two main types of resources are pages and posts. Posts are kept in a separate folder while pages can be found in the repository root folder. The structure of a Jekyll website depends on the theme. This is the structure of the website based on the minima theme, version 2.5 or newer, that you have just created with Jenkins: _posts/ _site/ _config.yml Gemfile index.md about.md The configuration file _config.yml is the only configuration file and, depending on the chosen theme, contains information such as the title of the website, a short description, its base URL, the theme, and the plugins, aka Ruby gems used to build the website with that theme. The plugins file Gemfile contains a list of Ruby plugins, called gems, to be installed and run in order to build the website. The main gems are jekyll that implements the commands to be used to start a local web server for our web site, and minima that implements the default theme. The index page index.md is the landing page of your website. Written in simple markdown, is the page visitors will see when they follow the URL of your GitHub repository. You can add other pages, such as the default About page, by adding a markdown file in the root folder. The _posts/ folder A Jekyll website usually contains blog posts and the _posts folder is there exactly for that purpose. The name of a post file starts with a date in the form YYYY-MM-DD-. The _site/ folder This folder contains the HTML and CSS files created by Jekyll from the original markdown files. It is created locally from scratch every time you start the Jekyll’s local web server so there is no need to edit or change anything in this folder. You do not need to push this folder to your GitHub repository. The GitHub Pages workflow will use Jekyll to create the HTML and CSS files for your website exactly in the same way you do it locally with your Jekyll gem. Configuring your website The first thing you may want to change is the name shown on the upper left-hand of the website landing page. You only need to open the _config.yml file and update the title, e.g. to Mr. Edward Hyde. title: Mr. Edward Hyde email: your-email@example.com description: &gt;- # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname &amp; protocol for your site, e.g. http://example.com twitter_username: jekyllrb github_username: jekyll # Build settings theme: minima plugins: - jekyll-feed In order to see a change made in the configuration file to take effect you have to restart Jekyll. Adding a page Adding a page to the minima scaffold is just about creating a new markdown file in the root folder. For example it can be your resume, e.g. resume.md, with a content like this --- layout: page title: Resume permalink: /resume/ --- I am a part-time medical doctor based in Soho, in London's West End, United Kingdom. You don’t have to restart Jekyll to see the effect when you create or change a page or a post. You should see the link to the new Resume page on the website menu, next to the default About page. Adding a picture You may want to add a picture to a page or post, for example in your website landing page, e.g. mrhyde.jpg. You have just to create an assets/ folder, put the image there, and add a link to it in the index.md file. --- layout: home --- &lt;img src="assets/mrhyde.jpg" alt="Mr. Hyde"&gt; Writing a post As said before the file name for a post must begin with a date otherwise it will not be shown. Let’s say you are Mr. Hyde and want to write your opinion about Dr. Jekyll and publish your post on December 25th 2025. You create a markdown file, e.g. 2025-12-15-dr.-jekyll.md. The - sign is used as a space. Then you add the following content and save the file. --- layout: post title: "The evil Dr. Jekyll!" date: 2025-12-15 categories: jekyll website blogs --- I really can’t stand Dr. Jekyll. If you refresh your local website you should see a new post added to the list shown in the landing page. If you are not sure about when you will publish your post and just want to get started with a first draft you may create a _drafts folder and create your draft file there. In this case there is no need to put a date at the beginning of the file name. If you want to see your draft when you run Jekyll you have to start it using the –drafts option $ bundle exec jekyll serve --drafts Pushing your website to GitHub Once you are done with your local website you need to create a repository in you GitHub account. As said before the name of the repository must begin with your user name. For instance let’s say your user name is mrhyde. In your GitHub account you click on the “New” button to open a page to create a new repository. You write mrhyde.github.io as the repository name and click on the “Create repository” button. At this point the repository is created and you can push your local website with a few git commands. git remote add origin git@github.com:mrhyde/mrhyde.github.io.git git branch -M main git push -u origin main Now you should be able to see your website on GitHub with the same pages and posts that you see locally using the URL https://mrhyde.github.io. Conclusion There is a lot of information out there about how to build a website with Jekyll and GitHub pages, maybe too much with a lot of details that might be confusing. In this post I wrote a recipe with the ingredients that you have to buy install and what is their role in achieving the result. I hope it will also be useful to someone else. In one of the next post I will write about using other Jekyll themes, e.g. Minimal Mistakes]]></summary></entry><entry><title type="html">Gli esami di fisica del semestre aperto per il corso di laurea in medicina</title><link href="/esami_fisica_semestre_aperto_medicina_2025.html" rel="alternate" type="text/html" title="Gli esami di fisica del semestre aperto per il corso di laurea in medicina" /><published>2025-12-07T00:00:00+00:00</published><updated>2025-12-07T00:00:00+00:00</updated><id>/esami_fisica_semestre_aperto_medicina_2025</id><content type="html" xml:base="/esami_fisica_semestre_aperto_medicina_2025.html"><![CDATA[<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {
    inlineMath: [['$','$'], ['\\(','\\)']],
    processEscapes: true
  }
});
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>

<p><img src="../assets/semestre_aperto.jpg" alt="Sentinel-2" /></p>

<h2 id="il-numero-chiuso">Il numero chiuso</h2>
<p>L’iscrizione al corso di laurea in medicina nelle universita’ italiane e’ a numero chiuso dal 1987, confermato con decreto ministeriale nel 1999. Fino al 2024 per l’ammissione occorreva superare un test unico (<a href="https://www.cisiaonline.it/">TOLC</a>) di matematica, fisica, chimica e biologia. Superato il test, con un punteggio sufficiente per rientrare nel numero dei posti disponibili, si era ammessi a seguire i corsi.</p>

<h2 id="il-semestre-aperto">Il semestre aperto</h2>
<p>Dal 2025 il test e’ stato sostituito con il <a href="https://www.universitaly.it/medicina2025">semestre aperto</a> che prevede la libera ammissione ai corsi di fisica, chimica, e biologia del primo semestre con due appelli per gli esami, il 20 novembre e il 10 dicembre. Per essere ammessi ai corsi del secondo semestre occorre aver superato tutti e tre gli esami, con un punteggio minimo di 18/30, e rientrare nella graduatoria per i posti disponibili. Chi supera gli esami ma non rientra nella graduatoria conserva i crediti formativi e puo’ scegliere di passare ad un’altra facolta senza numero chiuso.</p>

<h2 id="il-flop-degli-esami">Il flop degli esami</h2>
<p>I risultati del primo appello non sono stati incoraggianti. Solo circa il 20% degli studenti è riuscito a superare gli esami di chimica e biologia mentre per fisica si può parlare di un vero e proprio flop con solo il 12% degli studenti che hanno superato l’esame. Volendo esaminare le possibili cause di questi risultati, in particolare per la fisica, possiamo subito considerare il poco tempo a disposizione per lo studio. I corsi sono iniziati a settembre quindi per il primo appello gli studenti hanno avuto meno di tre mesi per la preparazione. Un altro dettaglio utile è il tempo a disposizione per rispondere alle <a href="https://iscrizioni-semestre-aperto.mur.gov.it/files/esami_1/fisica.pdf">domande dell’esame</a>: <strong>45 minuti per 31 domande</strong>.</p>

<h2 id="linsegnamento-di-fisica">L’insegnamento di fisica</h2>
<p>Secondo il <a href="https://www.mur.gov.it/sites/default/files/2025-06/Decreto%20Ministeriale%20n.%20418%20Syllabus_fisica%20errata%20corrige%2024.06.2025.pdf">syllabus del Ministero dell’Università e della Ricerca (MUR)</a>, l’insegnamento di fisica per il corso di medicina comprende sette unità didattiche, dalla meccanica, all’elettromagnetismo. E’ importante sottolineare che <strong>il MUR assume conoscenze da parte degli studenti di matematica, fisica, chimica e biologia, a livello degli insegnamenti impartiti nei licei e negli istituti tecnici e professionali</strong>. Le domande dell’esame sono in effetti a livello della fisica che si studia alle superiori quindi gli studenti si possono preparare utilizzando gli stessi testi o anche online per esempio consultando su Wikipedia le voci riportate nel sillabo. Di seguito sono riportate sommariamente le materie per ciascuna unità didattica.</p>

<h3 id="1-introduzione-ai-metodi-della-fisica">1. Introduzione ai metodi della fisica</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Grandezza_fisica">Grandezze fisiche</a>, dimensione ed unità di misura, <a href="https://it.wikipedia.org/wiki/Sistema_internazionale_di_unit%C3%A0_di_misura">Sistema Internazionale delle unità di misura</a>.</li>
  <li>Conversioni tra unità di misura e stima dell’ordine di grandezza. Grandezze estensive ed intensive.</li>
  <li>Grandezze scalari e <a href="https://it.wikipedia.org/wiki/Grandezza_vettoriale">vettoriali</a></li>
</ul>

<h3 id="2-meccanica">2. Meccanica</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Cinematica">Cinematica</a> del punto materiale</li>
  <li><a href="https://it.wikipedia.org/wiki/Dinamica">Dinamica</a> del punto materiale, <a href="https://it.wikipedia.org/wiki/Legge_di_gravitazione_universale">forza gravitazionale</a>, <a href="https://it.wikipedia.org/wiki/Forza_elastica">forza elastica</a>, legge di Hooke per molle ideali, forze di contatto e <a href="https://it.wikipedia.org/wiki/Attrito">forza di attrito</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Lavoro_(fisica)">Lavoro</a> ed <a href="https://it.wikipedia.org/wiki/Energia">energia</a>, principio di conservazione dell’energia</li>
  <li><a href="https://it.wikipedia.org/wiki/Quantit%C3%A0_di_moto">Quantità di moto</a> e <a href="https://it.wikipedia.org/wiki/Impulso_(fisica)">impulso</a>, <a href="https://it.wikipedia.org/wiki/Legge_di_conservazione_della_quantit%C3%A0_di_moto">principio di conservazione della quantità di moto</a> e del momento</li>
  <li>Sistemi di punti materiali, <a href="https://it.wikipedia.org/wiki/Corpo_rigido">corpi rigidi</a> e <a href="https://it.wikipedia.org/wiki/Elasticit%C3%A0">elastici</a></li>
</ul>

<h3 id="3-meccanica-dei-fluidi">3. Meccanica dei fluidi</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Fluidostatica">Idrostatica</a>: principio di Archimede, principio di Pascal, legge di Stevino</li>
  <li><a href="https://it.wikipedia.org/wiki/Fluidodinamica">Idrodinamica</a>: equazione di continuità e conservazione della massa, <a href="https://it.wikipedia.org/wiki/Equazione_di_Bernoulli">teorema di Bernoulli</a>, <a href="https://it.wikipedia.org/wiki/Legge_di_Torricelli">teorema di Torricelli</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Fluido">Fluidi reali</a> e <a href="https://it.wikipedia.org/wiki/Viscosit%C3%A0">viscosità</a>: legge di Poiseuille</li>
  <li>Fenomeni di superficie: <a href="https://it.wikipedia.org/wiki/Tensione_superficiale">tensione superficiale</a>, <a href="https://it.wikipedia.org/wiki/Capillarit%C3%A0">capillarità</a></li>
</ul>

<h3 id="4-onde-meccaniche-acustica">4. Onde Meccaniche (Acustica)</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Moto_armonico">Oscillatore armonico</a>, propagazione delle <a href="https://it.wikipedia.org/wiki/Onda_sonora">onde acustiche</a>, onde trasversali e longitudinali</li>
  <li><a href="https://it.wikipedia.org/wiki/Principio_di_sovrapposizione">Principio di sovrapposizione</a> e <a href="https://it.wikipedia.org/wiki/Interferenza_(fisica)">interferenza</a></li>
  <li>Energia trasportata dalle onde</li>
  <li>Onde acustiche: propagazione del suono nei diversi mezzi materiali e percezione sonora</li>
  <li><a href="https://it.wikipedia.org/wiki/Effetto_Doppler">Effetto Doppler</a></li>
</ul>

<h3 id="5-termodinamica">5. Termodinamica</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Termodinamica">Variabili di stato</a>, <a href="https://it.wikipedia.org/wiki/Gas_ideale">gas ideale</a>, <a href="https://it.wikipedia.org/wiki/Teoria_cinetica_dei_gas">teoria cinetica dei gas</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Calore">Calore</a>, <a href="https://it.wikipedia.org/wiki/Calore_specifico">calore specifico</a> e <a href="https://it.wikipedia.org/wiki/Capacit%C3%A0_termica">capacità termica</a>, <a href="https://it.wikipedia.org/wiki/Transizione_di_fase">cambiamenti di stato</a></li>
  <li>Meccanismi di trasmissione del calore: <a href="https://it.wikipedia.org/wiki/Conduzione_termica">conduzione termica</a>, <a href="https://it.wikipedia.org/wiki/Convezione">convezione</a> e <a href="https://it.wikipedia.org/wiki/Irraggiamento">irraggiamento</a>, <a href="https://it.wikipedia.org/wiki/Legge_di_Wien">legge di Wien</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Primo_principio_della_termodinamica">Primo principio della termodinamica</a>, <a href="https://it.wikipedia.org/wiki/Trasformazione_termodinamica">trasformazioni termodinamiche</a> reversibili e irreversibili</li>
  <li><a href="https://it.wikipedia.org/wiki/Secondo_principio_della_termodinamica">Secondo principio della termodinamica</a>, <a href="https://it.wikipedia.org/wiki/Entropia">entropia</a>, <a href="https://it.wikipedia.org/wiki/Ciclo_di_Carnot">ciclo di Carnot</a></li>
</ul>

<h3 id="6-elettricità-e-magnetismo">6. Elettricità e magnetismo</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Carica_elettrica">Cariche elettriche</a>, legge di Coulomb, moto di una carica in un campo elettrico uniforme</li>
  <li><a href="https://it.wikipedia.org/wiki/Teorema_del_flusso#Campo_elettrico">Legge di Gauss</a></li>
  <li>Energia e <a href="https://it.wikipedia.org/wiki/Potenziale_elettrico">potenziale elettrico</a>, <a href="https://it.wikipedia.org/wiki/Dipolo_elettrico">dipolo elettrico</a> e momento di dipolo</li>
  <li><a href="https://it.wikipedia.org/wiki/Corrente_elettrica">Corrente elettrica</a>, <a href="https://it.wikipedia.org/wiki/Legge_di_Ohm">legge di Ohm</a>, <a href="https://it.wikipedia.org/wiki/Resistenza_elettrica">resistenza elettrica</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Condensatore_(elettrotecnica)">Condensatori</a> in serie e in parallelo</li>
  <li><a href="https://it.wikipedia.org/wiki/Campo_magnetico">Campo magnetico</a>, <a href="https://it.wikipedia.org/wiki/Forza_di_Lorentz">forza di Lorentz</a>, moto di una carica elettrica in un campo magnetico uniforme</li>
  <li><a href="https://it.wikipedia.org/wiki/Induzione_elettromagnetica">Induzione elettromagnetica</a>, <a href="https://it.wikipedia.org/wiki/Legge_di_Faraday">legge di Faraday</a></li>
</ul>

<h3 id="7-radiazioni-elettromagnetiche">7. Radiazioni elettromagnetiche</h3>
<ul>
  <li><a href="https://it.wikipedia.org/wiki/Radiazione_elettromagnetica">Onde elettromagnetiche</a>, lunghezza d’onda, frequenza, velocità di propagazione, energia</li>
  <li><a href="https://it.wikipedia.org/wiki/Spettro_elettromagnetico">Spettro della radiazione elettromagnetica</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Quantizzazione_del_campo_elettromagnetico">Quantizzazione dell’energia</a></li>
  <li><a href="https://it.wikipedia.org/wiki/Radioattivit%C3%A0">Radioattività</a> e decadimento radioattivo</li>
  <li><a href="https://it.wikipedia.org/wiki/Radiazioni_ionizzanti">Radiazioni ionizzanti</a> e non ionizzanti</li>
  <li><a href="https://it.wikipedia.org/wiki/Ottica_geometrica">Ottica</a>, leggi della riflessione e della rifrazione della luce, <a href="https://it.wikipedia.org/wiki/Lente">lenti</a> convergenti e divergenti</li>
</ul>

<h2 id="le-domande-dellesame-di-fisica">Le domande dell’esame di fisica</h2>
<p>Veniamo ora alle <a href="https://iscrizioni-semestre-aperto.mur.gov.it/files/esami_1/fisica.pdf">domande dell’esame di fisica</a> del primo appello pubblicate sul sito del MUR per verificare come sono distribuite tra le sette unità didattiche e quali difficoltà matematiche possono presentare. Come detto, sono 31 domande, 15 a risposta multipla e 16 a completamento. Il tempo a disposizione è 45 minuti. Il punteggio è attribuito come segue:</p>

<ul>
  <li>1 punto per ogni risposta esatta;</li>
  <li>0 punti per ogni risposta omessa;</li>
  <li>meno 0,10 (- 0,10) punti per ogni risposta errata.</li>
</ul>

<p>La risposta corretta è una sola.</p>

<p>Sia le domande a risposta multipla che quelle a completamento possono richiedere come risposta una parola o un numero. Nel primo caso è sufficiente ricordare quanto appreso per completare il testo della domanda con la parola corretta. Nel secondo caso occorre anche svolgere semplici calcoli aritmetici o algebrici al livello delle scuole superiori per ottenere la risposta corretta.</p>

<h3 id="distribuzione-delle-domande-per-unità-didattiche">Distribuzione delle domande per unità didattiche</h3>
<p>Vediamo il numero di domande per ciascuna unità didattica, senza distinzione tra domande a risposta multipla o a completamento</p>

<ol>
  <li>Introduzione ai metodi della fisica: 4</li>
  <li>Meccanica: 6</li>
  <li>Meccanica dei fluidi: 5</li>
  <li>Onde meccaniche: 3</li>
  <li>Termodinamica: 3</li>
  <li>Elettricità e magnetismo: 6</li>
  <li>Radiazioni elettromagnetiche: 4</li>
</ol>

<p>Non c’è stata quindi una grande differenza tra le unità didattiche a parte per meccanica e elettromagnetismo a cui corrispondono anche il maggiore numero di crediti formativi (cfu), rispettivamente 1.5 e 1.25.</p>

<h2 id="conclusione">Conclusione</h2>
<p>Contrariamente a quanto riportato da molti, non è certamente la matematica la causa del flop nell’esame di fisica dato che, come detto sopra, si è trattato sempre di semplici calcoli algebrici e aritmetici. La causa è certamente nel poco tempo a disposizione per assimilare tutta la fisica classica, dalla meccanica all’elettromagnetismo, passando per la termodinamica e la meccanica dei fluidi, particolarmente rilevanti per chi si appresta alla carriera medica. Chi non è arrivato già all’inizio dei corsi a settembre con solide basi in tutte le unità didattiche previste dal sillabo ha avuto scarse probabilità di farcela. Quindi da una parte gli studenti devono anticipare la preparazione senza attendere l’inizio dei corsi dato che il livello di conoscenze fisiche e matematiche non è superiore a quello acquisito negli istituti superiori. Per rispondere velocemente alle domande occorre anche, da parte degli studenti, molta pratica, non solo la teoria. D’altra parte 45 minuti per rispondere a tutte le domande sembrano onestamente pochi. A volte una piccola modifica alle procedure, come dare più tempo a disposizione per lo svolgimento dell’esame, può risolvere il problema senza dover inventare di nuovo la ruota.</p>]]></content><author><name></name></author><category term="fisica," /><category term="medicina," /><category term="universita" /><summary type="html"><![CDATA[Il numero chiuso L’iscrizione al corso di laurea in medicina nelle universita’ italiane e’ a numero chiuso dal 1987, confermato con decreto ministeriale nel 1999. Fino al 2024 per l’ammissione occorreva superare un test unico (TOLC) di matematica, fisica, chimica e biologia. Superato il test, con un punteggio sufficiente per rientrare nel numero dei posti disponibili, si era ammessi a seguire i corsi. Il semestre aperto Dal 2025 il test e’ stato sostituito con il semestre aperto che prevede la libera ammissione ai corsi di fisica, chimica, e biologia del primo semestre con due appelli per gli esami, il 20 novembre e il 10 dicembre. Per essere ammessi ai corsi del secondo semestre occorre aver superato tutti e tre gli esami, con un punteggio minimo di 18/30, e rientrare nella graduatoria per i posti disponibili. Chi supera gli esami ma non rientra nella graduatoria conserva i crediti formativi e puo’ scegliere di passare ad un’altra facolta senza numero chiuso. Il flop degli esami I risultati del primo appello non sono stati incoraggianti. Solo circa il 20% degli studenti è riuscito a superare gli esami di chimica e biologia mentre per fisica si può parlare di un vero e proprio flop con solo il 12% degli studenti che hanno superato l’esame. Volendo esaminare le possibili cause di questi risultati, in particolare per la fisica, possiamo subito considerare il poco tempo a disposizione per lo studio. I corsi sono iniziati a settembre quindi per il primo appello gli studenti hanno avuto meno di tre mesi per la preparazione. Un altro dettaglio utile è il tempo a disposizione per rispondere alle domande dell’esame: 45 minuti per 31 domande. L’insegnamento di fisica Secondo il syllabus del Ministero dell’Università e della Ricerca (MUR), l’insegnamento di fisica per il corso di medicina comprende sette unità didattiche, dalla meccanica, all’elettromagnetismo. E’ importante sottolineare che il MUR assume conoscenze da parte degli studenti di matematica, fisica, chimica e biologia, a livello degli insegnamenti impartiti nei licei e negli istituti tecnici e professionali. Le domande dell’esame sono in effetti a livello della fisica che si studia alle superiori quindi gli studenti si possono preparare utilizzando gli stessi testi o anche online per esempio consultando su Wikipedia le voci riportate nel sillabo. Di seguito sono riportate sommariamente le materie per ciascuna unità didattica. 1. Introduzione ai metodi della fisica Grandezze fisiche, dimensione ed unità di misura, Sistema Internazionale delle unità di misura. Conversioni tra unità di misura e stima dell’ordine di grandezza. Grandezze estensive ed intensive. Grandezze scalari e vettoriali 2. Meccanica Cinematica del punto materiale Dinamica del punto materiale, forza gravitazionale, forza elastica, legge di Hooke per molle ideali, forze di contatto e forza di attrito Lavoro ed energia, principio di conservazione dell’energia Quantità di moto e impulso, principio di conservazione della quantità di moto e del momento Sistemi di punti materiali, corpi rigidi e elastici 3. Meccanica dei fluidi Idrostatica: principio di Archimede, principio di Pascal, legge di Stevino Idrodinamica: equazione di continuità e conservazione della massa, teorema di Bernoulli, teorema di Torricelli Fluidi reali e viscosità: legge di Poiseuille Fenomeni di superficie: tensione superficiale, capillarità 4. Onde Meccaniche (Acustica) Oscillatore armonico, propagazione delle onde acustiche, onde trasversali e longitudinali Principio di sovrapposizione e interferenza Energia trasportata dalle onde Onde acustiche: propagazione del suono nei diversi mezzi materiali e percezione sonora Effetto Doppler 5. Termodinamica Variabili di stato, gas ideale, teoria cinetica dei gas Calore, calore specifico e capacità termica, cambiamenti di stato Meccanismi di trasmissione del calore: conduzione termica, convezione e irraggiamento, legge di Wien Primo principio della termodinamica, trasformazioni termodinamiche reversibili e irreversibili Secondo principio della termodinamica, entropia, ciclo di Carnot 6. Elettricità e magnetismo Cariche elettriche, legge di Coulomb, moto di una carica in un campo elettrico uniforme Legge di Gauss Energia e potenziale elettrico, dipolo elettrico e momento di dipolo Corrente elettrica, legge di Ohm, resistenza elettrica Condensatori in serie e in parallelo Campo magnetico, forza di Lorentz, moto di una carica elettrica in un campo magnetico uniforme Induzione elettromagnetica, legge di Faraday 7. Radiazioni elettromagnetiche Onde elettromagnetiche, lunghezza d’onda, frequenza, velocità di propagazione, energia Spettro della radiazione elettromagnetica Quantizzazione dell’energia Radioattività e decadimento radioattivo Radiazioni ionizzanti e non ionizzanti Ottica, leggi della riflessione e della rifrazione della luce, lenti convergenti e divergenti Le domande dell’esame di fisica Veniamo ora alle domande dell’esame di fisica del primo appello pubblicate sul sito del MUR per verificare come sono distribuite tra le sette unità didattiche e quali difficoltà matematiche possono presentare. Come detto, sono 31 domande, 15 a risposta multipla e 16 a completamento. Il tempo a disposizione è 45 minuti. Il punteggio è attribuito come segue: 1 punto per ogni risposta esatta; 0 punti per ogni risposta omessa; meno 0,10 (- 0,10) punti per ogni risposta errata. La risposta corretta è una sola. Sia le domande a risposta multipla che quelle a completamento possono richiedere come risposta una parola o un numero. Nel primo caso è sufficiente ricordare quanto appreso per completare il testo della domanda con la parola corretta. Nel secondo caso occorre anche svolgere semplici calcoli aritmetici o algebrici al livello delle scuole superiori per ottenere la risposta corretta. Distribuzione delle domande per unità didattiche Vediamo il numero di domande per ciascuna unità didattica, senza distinzione tra domande a risposta multipla o a completamento Introduzione ai metodi della fisica: 4 Meccanica: 6 Meccanica dei fluidi: 5 Onde meccaniche: 3 Termodinamica: 3 Elettricità e magnetismo: 6 Radiazioni elettromagnetiche: 4 Non c’è stata quindi una grande differenza tra le unità didattiche a parte per meccanica e elettromagnetismo a cui corrispondono anche il maggiore numero di crediti formativi (cfu), rispettivamente 1.5 e 1.25. Conclusione Contrariamente a quanto riportato da molti, non è certamente la matematica la causa del flop nell’esame di fisica dato che, come detto sopra, si è trattato sempre di semplici calcoli algebrici e aritmetici. La causa è certamente nel poco tempo a disposizione per assimilare tutta la fisica classica, dalla meccanica all’elettromagnetismo, passando per la termodinamica e la meccanica dei fluidi, particolarmente rilevanti per chi si appresta alla carriera medica. Chi non è arrivato già all’inizio dei corsi a settembre con solide basi in tutte le unità didattiche previste dal sillabo ha avuto scarse probabilità di farcela. Quindi da una parte gli studenti devono anticipare la preparazione senza attendere l’inizio dei corsi dato che il livello di conoscenze fisiche e matematiche non è superiore a quello acquisito negli istituti superiori. Per rispondere velocemente alle domande occorre anche, da parte degli studenti, molta pratica, non solo la teoria. D’altra parte 45 minuti per rispondere a tutte le domande sembrano onestamente pochi. A volte una piccola modifica alle procedure, come dare più tempo a disposizione per lo svolgimento dell’esame, può risolvere il problema senza dover inventare di nuovo la ruota.]]></summary></entry><entry><title type="html">The scientific worker</title><link href="/science/the_scientific_worker.html" rel="alternate" type="text/html" title="The scientific worker" /><published>2023-05-01T00:00:00+00:00</published><updated>2023-05-01T00:00:00+00:00</updated><id>/science/the_scientific_worker</id><content type="html" xml:base="/science/the_scientific_worker.html"><![CDATA[<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="../assets/science/francesco_selmi_lab_small.jpg" alt="Francesco Selmi" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><em>The Italian chemist Francesco Selmi in his laboratory, a XIX century scientific worker</em></td>
    </tr>
  </tbody>
</table>

<p>Today May 1st, the international workers’ day, is the perfect day to reflect on the role of the worker, that is, of the one who lives from his or her work, operating on the environment and on society, more and more often through a computer. My thesis is that to survive and thrive in the current and future world, under the impacts of climate change, and the technological disruptions brought by artificial intelligence and quantum computers, the worker must transform herself into a scientific worker. The main activity of this new kind of worker is to learn, in order to act in a conscious, rational and effective manner, in harmony with the society and the environment. In the followings, after a short premise, I have reported a list of topics that I consider fundamental to master for the scientific worker (naturally among these there is also English). I have put the adjective “scientific” in parentheses in the title because every worker will have to be a scientist, and continuously learn, so that there should be no need to use the adjective.</p>

<h2 id="the-new-worker">The new worker</h2>
<p>The modern worker must be able to read and interpret the data coming from the environment: physical, social, economical and financial environment. The data must be available in digital format, open and easily usable by computing machines. The worker must be able to read, transform, interpret, and produce data. In order to possess these skills the worker must have a good and actionable knowledge of  mathematics, physics, biology, finance, and computer science. Here follows a list of topics that, according to my experience, a scientific worker should grasp.</p>

<h3 id="mathematics">Mathematics</h3>
<ul>
  <li>Propositional and predicate calculus</li>
  <li>Real and complex analysis</li>
  <li>Calculus</li>
  <li>Linear Algebra</li>
  <li>Geometry</li>
  <li>Probability distributions</li>
  <li>Differential equations</li>
  <li>Graph theory</li>
  <li>Optimization and linear programming</li>
  <li>Data assimilation, transforms, inversion and interpolation</li>
</ul>

<h3 id="physics">Physics</h3>
<ul>
  <li>Classical Mechanics (Newtonian, Lagrangian, Hamiltonian)</li>
  <li>Electromagnetism and matter-radiation interaction</li>
  <li>Quantum Mechanics</li>
  <li>Statistical Physics</li>
</ul>

<h3 id="biology">Biology</h3>
<ul>
  <li>Anatomy and physiology</li>
  <li>Genetics</li>
</ul>

<h3 id="computer-science">Computer science</h3>
<ul>
  <li>Computer architecture</li>
  <li>Computer programming</li>
  <li>Algorithms and data structures</li>
  <li>Neural networks</li>
  <li>Computational complexity</li>
  <li>Parallel computing</li>
  <li>Cryptography</li>
  <li>Information theory</li>
  <li>Digital Signal Processing</li>
</ul>

<h3 id="finance">Finance</h3>
<ul>
  <li>Fixed income securities</li>
  <li>Random cash flows</li>
  <li>Portfolio selection</li>
</ul>

<p>This knowledge is fundamental, independently of the economy in which the (scientific) worker operates, that is, market or socialist economy.</p>

<h2 id="education-and-culture">Education and culture</h2>
<p>Open and machine readable data is not enough. The cost of education should be kept at its minimum and I appreciate those who publish their scientific work freely online. I publish a collection of high quality textbooks made freely available by their authors <a href="/bookshelf">here</a> on my website.  One more important characteristic of the (scientific) worker is a knowledge sharing culture. For this reason I have organized the PyData Rome group on Meetup.</p>

<h2 id="conclusion">Conclusion</h2>
<p>If you see yourself as a (scientific) worker you are invited to join the <a href="https://www.meetup.com/pydata-rome/">PyData Rome</a> group today. <strong>Happy international workers’ day!</strong></p>]]></content><author><name></name></author><category term="science," /><category term="work" /><summary type="html"><![CDATA[The Italian chemist Francesco Selmi in his laboratory, a XIX century scientific worker Today May 1st, the international workers’ day, is the perfect day to reflect on the role of the worker, that is, of the one who lives from his or her work, operating on the environment and on society, more and more often through a computer. My thesis is that to survive and thrive in the current and future world, under the impacts of climate change, and the technological disruptions brought by artificial intelligence and quantum computers, the worker must transform herself into a scientific worker. The main activity of this new kind of worker is to learn, in order to act in a conscious, rational and effective manner, in harmony with the society and the environment. In the followings, after a short premise, I have reported a list of topics that I consider fundamental to master for the scientific worker (naturally among these there is also English). I have put the adjective “scientific” in parentheses in the title because every worker will have to be a scientist, and continuously learn, so that there should be no need to use the adjective. The new worker The modern worker must be able to read and interpret the data coming from the environment: physical, social, economical and financial environment. The data must be available in digital format, open and easily usable by computing machines. The worker must be able to read, transform, interpret, and produce data. In order to possess these skills the worker must have a good and actionable knowledge of mathematics, physics, biology, finance, and computer science. Here follows a list of topics that, according to my experience, a scientific worker should grasp. Mathematics Propositional and predicate calculus Real and complex analysis Calculus Linear Algebra Geometry Probability distributions Differential equations Graph theory Optimization and linear programming Data assimilation, transforms, inversion and interpolation Physics Classical Mechanics (Newtonian, Lagrangian, Hamiltonian) Electromagnetism and matter-radiation interaction Quantum Mechanics Statistical Physics Biology Anatomy and physiology Genetics Computer science Computer architecture Computer programming Algorithms and data structures Neural networks Computational complexity Parallel computing Cryptography Information theory Digital Signal Processing Finance Fixed income securities Random cash flows Portfolio selection This knowledge is fundamental, independently of the economy in which the (scientific) worker operates, that is, market or socialist economy. Education and culture Open and machine readable data is not enough. The cost of education should be kept at its minimum and I appreciate those who publish their scientific work freely online. I publish a collection of high quality textbooks made freely available by their authors here on my website. One more important characteristic of the (scientific) worker is a knowledge sharing culture. For this reason I have organized the PyData Rome group on Meetup. Conclusion If you see yourself as a (scientific) worker you are invited to join the PyData Rome group today. Happy international workers’ day!]]></summary></entry><entry><title type="html">The PyData Rome Chapter: Ideas and Commitments</title><link href="/pydata/pydata-rome-chapter" rel="alternate" type="text/html" title="The PyData Rome Chapter: Ideas and Commitments" /><published>2023-01-27T00:00:00+00:00</published><updated>2023-01-27T00:00:00+00:00</updated><id>/pydata/pydata-rome-chapter</id><content type="html" xml:base="/pydata/pydata-rome-chapter"><![CDATA[<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="../assets/pydata_rome/pydatarome_logo.jpg" alt="PyData Rome" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"> </td>
    </tr>
  </tbody>
</table>

<h2 id="what-is-pydata-">What is PyData ?</h2>
<p><a href="https://pydata.org/">PyData</a> is an educational program of NumFocus, a nonprofit charity promoting open practices in research, data, and scientific computing. It provides a forum for the international community of users and developers of data analysis tools to share ideas and learn from each other. The forum is organized on the Meetup platform and currently, in January 2023, there are 215 groups in 73 countries.</p>

<h2 id="the-rome-pydata-chapter">The Rome PyData Chapter</h2>
<p>The Rome PyData chapter started in September 2022 and had its first meeting in December 2022 thanks to the support of <a href="https://binariof.fb.com/en/">Binario F</a>, an innovation laboratory managed by Facebook in the center of Rome that provided us with the facility for our meeting. The PyData Rome chapter was started out of a lack of events related to computational science, open source software development, and open data in our city. Our aim is to contribute to change the landscape of the city for what is related to open science and awareness of new technologies and the opportunities they bring.</p>

<h2 id="changing-the-landscape">Changing the landscape</h2>
<p>There are many Italian newspaper articles and blog posts that talk about machine learning and artificial intelligence but not many opportunities to learn to become an active user and not just a passive or even unaware consumer of such technologies. We want to fill that gap. Rome has almost 4 million inhabitants, three universities with a total of more than 100k students, and many research institutions. Furthermore, many large private, public and international organizations, that deal with increasing amounts of complex data, have their headquarters here. We need more people able to work on these data sets and more opportunities to learn and share ideas. If we look at other PyData chapters in Europe we see a correlation between the numbers of their members and events that they organize and the country’s leadership in innovation, open science, and technology.</p>

<h2 id="ambitions">Ambitions</h2>
<p>The PyData chapters in London, Berlin, Amsterdam, and Paris are leading the ranking in Europe by their number of members (4k to 11k) and events they have organized in 2022 but others such as Copenhagen and Madrid are performing well too. We think Rome has everything it needs to be in this group and we have committed ourselves to have at least one meeting per month to help our city to move up.</p>

<table>
  <thead>
    <tr>
      <th>PyData Meetup</th>
      <th>Members</th>
      <th>Events (2022)</th>
      <th>Attendees</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>London</td>
      <td>11756</td>
      <td>5</td>
      <td>832</td>
    </tr>
    <tr>
      <td>Berlin</td>
      <td>7139</td>
      <td>8</td>
      <td>817</td>
    </tr>
    <tr>
      <td>Amsterdam</td>
      <td>4659</td>
      <td>6</td>
      <td>496</td>
    </tr>
    <tr>
      <td>Paris</td>
      <td>4109</td>
      <td>7</td>
      <td>297</td>
    </tr>
    <tr>
      <td>Copenhagen</td>
      <td>2165</td>
      <td>9</td>
      <td>499</td>
    </tr>
    <tr>
      <td>Madrid</td>
      <td>1092</td>
      <td>9</td>
      <td>278</td>
    </tr>
    <tr>
      <td>Rome</td>
      <td>52</td>
      <td>1</td>
      <td>12</td>
    </tr>
  </tbody>
</table>

<h2 id="open-to-contributions">Open to contributions</h2>
<p>If someone in Rome shares our same ideas and is willing to support our efforts by hosting our meetings or contributing to an event with a proposal, let’s get in contact on <a href="https://www.meetup.com/pydata-rome/">our page</a> on Meetup or meet directly in one of our next events!</p>]]></content><author><name></name></author><category term="deep" /><category term="learning," /><category term="earth" /><category term="observation," /><category term="copernicus" /><summary type="html"><![CDATA[  What is PyData ? PyData is an educational program of NumFocus, a nonprofit charity promoting open practices in research, data, and scientific computing. It provides a forum for the international community of users and developers of data analysis tools to share ideas and learn from each other. The forum is organized on the Meetup platform and currently, in January 2023, there are 215 groups in 73 countries. The Rome PyData Chapter The Rome PyData chapter started in September 2022 and had its first meeting in December 2022 thanks to the support of Binario F, an innovation laboratory managed by Facebook in the center of Rome that provided us with the facility for our meeting. The PyData Rome chapter was started out of a lack of events related to computational science, open source software development, and open data in our city. Our aim is to contribute to change the landscape of the city for what is related to open science and awareness of new technologies and the opportunities they bring. Changing the landscape There are many Italian newspaper articles and blog posts that talk about machine learning and artificial intelligence but not many opportunities to learn to become an active user and not just a passive or even unaware consumer of such technologies. We want to fill that gap. Rome has almost 4 million inhabitants, three universities with a total of more than 100k students, and many research institutions. Furthermore, many large private, public and international organizations, that deal with increasing amounts of complex data, have their headquarters here. We need more people able to work on these data sets and more opportunities to learn and share ideas. If we look at other PyData chapters in Europe we see a correlation between the numbers of their members and events that they organize and the country’s leadership in innovation, open science, and technology. Ambitions The PyData chapters in London, Berlin, Amsterdam, and Paris are leading the ranking in Europe by their number of members (4k to 11k) and events they have organized in 2022 but others such as Copenhagen and Madrid are performing well too. We think Rome has everything it needs to be in this group and we have committed ourselves to have at least one meeting per month to help our city to move up. PyData Meetup Members Events (2022) Attendees London 11756 5 832 Berlin 7139 8 817 Amsterdam 4659 6 496 Paris 4109 7 297 Copenhagen 2165 9 499 Madrid 1092 9 278 Rome 52 1 12 Open to contributions If someone in Rome shares our same ideas and is willing to support our efforts by hosting our meetings or contributing to an event with a proposal, let’s get in contact on our page on Meetup or meet directly in one of our next events!]]></summary></entry><entry><title type="html">1st PyData Rome Meeting</title><link href="/eo/1st-pydata-rome-meeting.html" rel="alternate" type="text/html" title="1st PyData Rome Meeting" /><published>2022-12-01T00:00:00+00:00</published><updated>2022-12-01T00:00:00+00:00</updated><id>/eo/1st-pydata-rome-meeting</id><content type="html" xml:base="/eo/1st-pydata-rome-meeting.html"><![CDATA[<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="../assets/pydata_rome/binariof.jpg" alt="Meeting room at Binario F" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><em>The meeting room at Binario F</em></td>
    </tr>
  </tbody>
</table>

<p>So we managed to have our 1st PyData Rome meeting. We started the Rome chapter of the <a href="https://pydata.org/">PyData community</a> in September. <a href="https://www.meetup.com/pydata-rome/">The group on Meetup</a> counts 31 members right now. There were 12 members that subscribed to participate and 3 of them eventually found their way to the meeting room hosted at <a href="https://binariof.fb.com/en/">Binario F</a>, an initiative by Facebook to provide a physical space for business and individual development in Rome. You may say that was a failure, as only three people came to the meeting. No, I say it was a success: 25% of those who subscribed came, and two others wrote to me thinking it was online (sorry guys!).</p>

<h2 id="numbers-are-not-the-most-important-metric-for-a-meeting">Numbers are not the most important metric for a meeting</h2>
<p>First of all, I had fun in preparing the presentation and meeting with other like-minded people. We had an interesting talk before the beginning of the presentation, during its delivery and after it. Beyond the technical discussion about Deep Learning and satellite imagery we had a very interesting conversation about the lack of opportunities for developers interested in data science to meet and share ideas outside of an academic environment in Rome. That is exactly what we want to address with the PyData Rome chapter. Rome is not San Francisco but there are three universities with data science departments full of smart people and one of this, the <a href="https://en.wikipedia.org/wiki/Sapienza_University_of_Rome">Sapienza University of Rome</a> is one of the largest European universities. So it’s not the lack of people, it’s the culture, the idea hidden in our mind that participating in these events after you leave your academic institution and start to work doesn’t really matter anymore.</p>

<h2 id="participation-matters">Participation matters</h2>
<p>We are here to say it does matter. It matters because we have to be lifelong learners if we want to make contributions to society and keep control of our working life. One other important aspect is that science is too much a relevant enterprise to be left exclusively to academic institutions. There must be a collaboration between academic institutions and people, citizens, and private organizations that are interested in science, not a wall or a border that cannot be crossed. There are several critical problems to be addressed for which our societies need people able to invent and apply algorithms to make sense of the data coming from satellites and other sensors. This is the mission of the PyData community and the reason for which we joined.</p>

<h2 id="learning-is-fun">Learning is fun</h2>
<p>Last but not least, learning is fun and using what we learn for things that matter with other people is even more fun. In conclusion, I want to thank the participants, Binario F, the people who helped to set up the room for the presentation, and in particular <a href="https://www.utopialab.it/utopia-team/matteo-franza/">Matteo Franza</a> who manages the space and provided us an excellent room for our meeting.</p>

<p>(The slides used for the presentation with links to code and other materials are available <a href="../assets/pydata_rome/Deep_Learning_for_LULC_Classification_PyData_Rome_Meeting_30_Nov.2022.pdf">here</a>)</p>]]></content><author><name></name></author><category term="deep" /><category term="learning," /><category term="earth" /><category term="observation," /><category term="copernicus" /><summary type="html"><![CDATA[The meeting room at Binario F So we managed to have our 1st PyData Rome meeting. We started the Rome chapter of the PyData community in September. The group on Meetup counts 31 members right now. There were 12 members that subscribed to participate and 3 of them eventually found their way to the meeting room hosted at Binario F, an initiative by Facebook to provide a physical space for business and individual development in Rome. You may say that was a failure, as only three people came to the meeting. No, I say it was a success: 25% of those who subscribed came, and two others wrote to me thinking it was online (sorry guys!). Numbers are not the most important metric for a meeting First of all, I had fun in preparing the presentation and meeting with other like-minded people. We had an interesting talk before the beginning of the presentation, during its delivery and after it. Beyond the technical discussion about Deep Learning and satellite imagery we had a very interesting conversation about the lack of opportunities for developers interested in data science to meet and share ideas outside of an academic environment in Rome. That is exactly what we want to address with the PyData Rome chapter. Rome is not San Francisco but there are three universities with data science departments full of smart people and one of this, the Sapienza University of Rome is one of the largest European universities. So it’s not the lack of people, it’s the culture, the idea hidden in our mind that participating in these events after you leave your academic institution and start to work doesn’t really matter anymore. Participation matters We are here to say it does matter. It matters because we have to be lifelong learners if we want to make contributions to society and keep control of our working life. One other important aspect is that science is too much a relevant enterprise to be left exclusively to academic institutions. There must be a collaboration between academic institutions and people, citizens, and private organizations that are interested in science, not a wall or a border that cannot be crossed. There are several critical problems to be addressed for which our societies need people able to invent and apply algorithms to make sense of the data coming from satellites and other sensors. This is the mission of the PyData community and the reason for which we joined. Learning is fun Last but not least, learning is fun and using what we learn for things that matter with other people is even more fun. In conclusion, I want to thank the participants, Binario F, the people who helped to set up the room for the presentation, and in particular Matteo Franza who manages the space and provided us an excellent room for our meeting. (The slides used for the presentation with links to code and other materials are available here)]]></summary></entry><entry><title type="html">10th Annual SISC Conference: Governing the Future</title><link href="/climate-change/sisc_conference_2022.html" rel="alternate" type="text/html" title="10th Annual SISC Conference: Governing the Future" /><published>2022-10-24T00:00:00+00:00</published><updated>2022-10-24T00:00:00+00:00</updated><id>/climate-change/sisc-conference</id><content type="html" xml:base="/climate-change/sisc_conference_2022.html"><![CDATA[<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {
    inlineMath: [['$','$'], ['\\(','\\)']],
    processEscapes: true
  }
});
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="/assets/climate-change/roman_forum_sisc2022.jpg" alt="Roman Forum" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><em>The Roman Forum close to the Capitolium, venue of the 3rd day of the Conference</em></td>
    </tr>
  </tbody>
</table>

<p>The 10th annual SISC conference on climate change, <a href="https://www.sisclima.it/conferenza-annuale-2022/">SISC2022: Governing the Future</a> is over. Friday 21st was the 3rd and last day of the conference held at the Protomoteca hall at the Rome’s Capitolium. This is the 1st year I participate in the conference with a work about land use and classification using satellite optical images and a convolutional neural network. Climate change is not only a scientific topic. As everyone is experiencing or witnessing its consequences on the environment, a lot of studies and research are dedicated on how to address its impacts on health, food production, the economy and society in general at different scale, from a global perspective to a local one and in particular on urban areas. This is the first time the conference was held offline since 2019. In three days I had the opportunity to learn about the research work that is being pursued in  areas in which I have little or no knowledge at all, such as food production in ocean waters and policies studies for adaption and mitigation actions. I had also the opportunity to meet many people that work on different issues related to climate change. I’d like to mention <a href="https://www.cmcc.it/people/valentini-riccardo">Riccardo Valentini</a>, professor of Forest Ecology at the Tuscia University, a leading author of the 5th IPCC report and winner of the 2007 Nobel Prize for Peace as a member of the IPCC board; <a href="http://pasini-lescienze.blogautore.espresso.repubblica.it/">Antonello Pasini</a>, climate change scientist at the Institute of Atmospheric Pollution Research of the National Research Council, author of several books on climate change and its impacts on our planet, blogger at the Le Scienze and speaker in many broadcasting services; Mita Lapi, coordinator of the Sustainable Development Department at the <a href="https://flanet.org/">Lombardy Foundation for the Environment</a>. Mita took part on a field work on the Adamello glacier that was presented at the conference and told me how the Italian Society for Climate Sciences was born as a place for researchers and institutions working on the many different facets of climate change to meet, share their knowledge and collaborate. A side event that was held at the Capitolium was about Cities and Climate and had as invited speakers <a href="https://en.wikipedia.org/wiki/Francesco_Rutelli">Francesco Rutelli</a>, former mayor of Rome, journalists and current administrators of the city. Rutelli made many sensible statements, one particularly relevant and not always mentioned was that if we want to move away from a fossil fuels based economy, governments and industries have to foster the kind of productions that are inevitably going to replace the old ones and take into account the social impacts of such changes for example by re-training the people that will loose their jobs in the old economy in order to be able to work in the new one. There is a strong need to adapt cities like Rome to the climate change and one is to replace fossil fuels with renewable sources such as solar panels. Rome has 245 $Km^2$ of built areas, 19% of its territory, of which 45.5 $Km^2$ are buildings so I asked one of the city’s administrators if there is any study to assess the feasibility of installing solar panels on the roofs of such buildings. He told me there is not yet such study. I think this is one of the many tasks in which satellite images and machine learning algorithms can help citizens and decision makers to make the best decisions on our path to a new world. This might be my inspiration for some future work on Deep Learning.<br />
In conclusion, this was my first conference in the city in which I was born and it was a great experience. I do believe that Rome is a very good place to work on climate change issues, not only because international organizations such as The <a href="https://www.fao.org/home/en">UN-FAO</a>, the <a href="https://www.wfp.org/">World Food Programme</a>, and <a href="https://www.esa.int/About_Us/ESRIN">ESA-ESRIN</a> have here their headquarters, but also because Rome can be a laboratory for governing the future instead of being passively brought to adverse and unpleasant scenarios.</p>]]></content><author><name></name></author><category term="climate" /><category term="change" /><summary type="html"><![CDATA[The Roman Forum close to the Capitolium, venue of the 3rd day of the Conference The 10th annual SISC conference on climate change, SISC2022: Governing the Future is over. Friday 21st was the 3rd and last day of the conference held at the Protomoteca hall at the Rome’s Capitolium. This is the 1st year I participate in the conference with a work about land use and classification using satellite optical images and a convolutional neural network. Climate change is not only a scientific topic. As everyone is experiencing or witnessing its consequences on the environment, a lot of studies and research are dedicated on how to address its impacts on health, food production, the economy and society in general at different scale, from a global perspective to a local one and in particular on urban areas. This is the first time the conference was held offline since 2019. In three days I had the opportunity to learn about the research work that is being pursued in areas in which I have little or no knowledge at all, such as food production in ocean waters and policies studies for adaption and mitigation actions. I had also the opportunity to meet many people that work on different issues related to climate change. I’d like to mention Riccardo Valentini, professor of Forest Ecology at the Tuscia University, a leading author of the 5th IPCC report and winner of the 2007 Nobel Prize for Peace as a member of the IPCC board; Antonello Pasini, climate change scientist at the Institute of Atmospheric Pollution Research of the National Research Council, author of several books on climate change and its impacts on our planet, blogger at the Le Scienze and speaker in many broadcasting services; Mita Lapi, coordinator of the Sustainable Development Department at the Lombardy Foundation for the Environment. Mita took part on a field work on the Adamello glacier that was presented at the conference and told me how the Italian Society for Climate Sciences was born as a place for researchers and institutions working on the many different facets of climate change to meet, share their knowledge and collaborate. A side event that was held at the Capitolium was about Cities and Climate and had as invited speakers Francesco Rutelli, former mayor of Rome, journalists and current administrators of the city. Rutelli made many sensible statements, one particularly relevant and not always mentioned was that if we want to move away from a fossil fuels based economy, governments and industries have to foster the kind of productions that are inevitably going to replace the old ones and take into account the social impacts of such changes for example by re-training the people that will loose their jobs in the old economy in order to be able to work in the new one. There is a strong need to adapt cities like Rome to the climate change and one is to replace fossil fuels with renewable sources such as solar panels. Rome has 245 $Km^2$ of built areas, 19% of its territory, of which 45.5 $Km^2$ are buildings so I asked one of the city’s administrators if there is any study to assess the feasibility of installing solar panels on the roofs of such buildings. He told me there is not yet such study. I think this is one of the many tasks in which satellite images and machine learning algorithms can help citizens and decision makers to make the best decisions on our path to a new world. This might be my inspiration for some future work on Deep Learning. In conclusion, this was my first conference in the city in which I was born and it was a great experience. I do believe that Rome is a very good place to work on climate change issues, not only because international organizations such as The UN-FAO, the World Food Programme, and ESA-ESRIN have here their headquarters, but also because Rome can be a laboratory for governing the future instead of being passively brought to adverse and unpleasant scenarios.]]></summary></entry><entry><title type="html">Spatial Relations in GeoPandas</title><link href="/geoscience/spatial-relations_in_geopandas.html" rel="alternate" type="text/html" title="Spatial Relations in GeoPandas" /><published>2022-10-04T00:00:00+00:00</published><updated>2022-10-04T00:00:00+00:00</updated><id>/geoscience/spatial-relations</id><content type="html" xml:base="/geoscience/spatial-relations_in_geopandas.html"><![CDATA[<p>Humans have the ability to figure out the spatial relations of objects in their visual field without any effort. It is certainly an evolutionary characteristic that has been embedded in our brain because of its importance in many common reasoning tasks. Since objects can be represented in computer systems, algorithms have been developed over the years to support the same functions.</p>

<p><img src="../assets/geoscience/polygons.jpg" alt="Polygons" /></p>

<p>In many applications of geoscience, for example in emergency management or risk assessment, one wants to know the spatial context of the area in which a certain event occurred and link the spatial information to external data sources through a named entity. For example, it is not enough to know the extent of a flooded area, we want to know in which administrative region it lies, or we might want to know the distance of a wildfire from a real estate or a populated area. In other words, we want to know the spatial relation between the area in which an event occurred and the area that belongs to or is run by a owner or authority. This post describes the notebook that I have developed on the implementation of spatial relations in GeoPandas. The reader can go directly to the <a href="https://nbviewer.org/github/luigiselmi/geoscience/blob/main/topological_operators.ipynb">Jupyter notebook</a> in case she or he wants to see the code. We will deal only with topological relations, a subclass of spatial relations that don’t need a metric, that is a way to compute the distance between two spatial objects. The notebook starts by creating some simple spatial objects, points and polygons, to see what kind of topological relations can be established between them. Finally, the topological relations will be tested between our abstract layers, blue, red, orange and green, and the geometry of Marche, one of the 20 regions of Italy, and of its administrative units, i.e. the municipalities.</p>

<h2 id="python-packages">Python packages</h2>
<p>Spatial objects such as points, lines and polygons, may have one or more topological relationships such as <em>contains</em>, <em>overlap</em>, <em>within</em>, <em>touches</em>. The Python package <a href="https://github.com/shapely/shapely">Shapely</a>, included in GeoPandas, implements such functions for points, lines and polygons. Shapely is a Python port of <a href="https://libgeos.org/">GEOS</a>, the C++ port of the <a href="https://github.com/locationtech/jts/">Java Topology Suite (JTS)</a>, a Java implementation of topological relations. We start by importing the Python packages we are going to use. We use the minimum set of packages to get the job done.</p>

<h2 id="coordinate-reference-systems">Coordinate reference systems</h2>
<p>Even if establishing the topological relationship between two spatial objects doesn’t involve a metric, objects must be represented using the same coordinate reference system (CRS). We will create some spatial objects using the unprojected reference system WGS84 <a href="https://epsg.io/4326">EPSG:4326</a>. We will also import two datasets: the border of the Marche region and the borders of its administrative units, the municipalities of the region. We will see what spatial relations exists between our abstract layers and the Marche region and its administrative units. The two datasets have their own CRS whose ESPG code is <a href="https://epsg.io/32632">EPSG:32632</a>. This CRS is projected on a 2D surface using the Transverse Mercator projection and the unit of measure is the meter so, in order to use the spatial relationships between the spatial objects of our layers and the polygons of the Marche region and its administrative units we will have to change the CRS of our layers to be the same as that used for the region and its municipalities and transform the coordinates of points and polygons accordingly.</p>

<p><img src="../assets/geoscience/polygons_with_frame.jpg" alt="Polygons" /></p>

<h2 id="spatial-joins">Spatial joins</h2>
<p>Spatial relations are used to merge two spatial datasets A and B in which each row of A and B contains spatial objects. The merge can be based on one topological relation such as “contains”, so that if object <em>i</em> of A contains object <em>i</em> of B, the value in one or more columns of B will be added to the object in A. We will not deal with spatial joins here since it’s an application of the topological relations.</p>

<h2 id="spatial-objects-areas-of-interest-and-layers">Spatial objects, areas of interest, and layers</h2>
<p>We will use spatial objects such as Points, Lines and Polygons for which a set of coordinate pairs will be assigned. A layer is a collection of one or more spatial objects that describes a certain event that occurred over an area of interest. In GeoPandas a layer is built using a GeoDataFrame. A GeoDataFrame is a subclass of the DataFrame class of the Pandas Python library that has a column with geometry.</p>

<h2 id="topological-relations">Topological relations</h2>
<p>We apply the topological relations: <em>within</em>, <em>intersects</em> and <em>touch</em> between the polygons that we have defined. We will not use <em>contains</em> since it’s the inverse of <em>within</em>. We will apply the topological relations to pairs of polygons from two different layers. The methods take the left operand from a polygon of one layer and the right operand from the corresponding polygon of the other layer. By “corresponding” we mean the polygons have the same index value in the two GeoDataFrame used to implement our layers.</p>

<h3 id="within">within</h3>
<p>From the <a href="https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoSeries.within.html">relation definition</a> in Geopandas: “An object is said to be within another if at least one of its points is located in the interior and no points are located in the exterior of the other.”</p>

<h3 id="intersects">intersects</h3>
<p>From the <a href="https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoSeries.intersects.html">relation definition</a> in GeoPandas: “An object is said to intersect another if its boundary and interior intersects in any way with those of the other.”</p>

<h3 id="touches">touches</h3>
<p>From the <a href="https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoSeries.touches.html">relation definition</a>: “An object is said to touch another if it has at least one point in common with other and its interior does not intersect with any part of the other. Overlapping features therefore do not touch.”</p>

<h2 id="projections">Projections</h2>
<p>When we want to apply the topological relations to spatial objects from different layers (GeoDataFrame) we have to check that the coordinate reference system (CRS) used in the two layers is the same. In the following sections we will use two datasets that use the Transverse Mercator projection (EPSG:32632). Since our colored layers use the WGS84 unprojected CRS (EPSG:4362) we will have to change it and use the EPSG:32632. When we change the CRS GeoPandas transforms the coordinates of the points automatically. The coordinate units in the Transverse Mercator projection is in meters instead of degrees.</p>

<h2 id="spatial-relations-in-the-real-world">Spatial relations in the real world</h2>
<p>Our points and polygons in the blue, red, orange and green layers are not completely abstract. They represent towns and areas in the Marche region. We want to find out which spatial relationships between them, the Marche region and its administrative units, the municipalities, hold true and which do not.</p>

<p><img src="../assets/geoscience/polygons_marche_region.jpg" alt="Marche region" /></p>

<h2 id="municipalities-of-the-marche-region">Municipalities of the Marche region</h2>
<p>We want to see which municipality lies within the polygon of the blue layer. We start by opening the dataset of the municipalities of the Marche region. This dataset has been extracted from the dataset of the Italian municipalities from ISTAT, the Italian National Institute of Statistics and it is available in the data folder of the repository.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="../assets/geoscience/marche_municip_within_blue_layer.jpg" alt="Municip within" /></th>
      <th style="text-align: center"><img src="../assets/geoscience/marche_municip_intersect_blue_layer.jpg" alt="Municip intersect" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><em>Municipalities of Marche within the blue layer</em></td>
      <td style="text-align: center"><em>Municipalities of Marche intersecting the blue layer</em></td>
    </tr>
  </tbody>
</table>

<h2 id="further-logic-operations-with-masks">Further logic operations with masks</h2>
<p>As we can see the <em>within</em> relationship is stronger than <em>intersects</em>. We might want to see only the municipalities that intercept the blue area but are not completely within it. With GeoPandas such logic operation can be done with one line of code.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>border_intersects = intersects &amp; ~within

</code></pre></div></div>

<p><img src="../assets/geoscience/marche_municip_intersect_border_blue_layer.jpg" alt="Polygons" /></p>

<h2 id="conclusion">Conclusion</h2>
<p>We have seen some examples of spatial relations between polygons in GeoPandas. We have applied such relations to geometries of the municipalities of the Marche region in Italy. We have changed the coordinate reference system of our example layers to be the same as that used for the Marche region and its administrative units. We have also performed a further logical operation dividing the geometries of the municipalities that strictly intersect one of our fictional layer from those that lie completely in our layer using logical operators on the result of the spatial relations. Spatial relations are fundamental to perform spatial analysis over multiple layers. We want to underline that they also provide a mean to integrate the information about events, such as flooded areas, with contextual information from external data sources by using the name or identifier of a named entity whose geometry has a spatial relation with the event. As said in the introduction the Jupyter notebook with the Python code used for this post is available on my <a href="https://nbviewer.org/github/luigiselmi/geoscience/blob/main/topological_operators.ipynb">GitHub repository</a>.</p>

<h2 id="references">References</h2>
<ol>
  <li><a href="https://en.wikipedia.org/wiki/Spatial_relation">Wikipedia - Spatial relation</a></li>
  <li><a href="https://www.istat.it/it/archivio/222527">ISTAT - Administrative Boundaries (updated to January 1st 2022</a></li>
</ol>]]></content><author><name></name></author><category term="python," /><category term="jupyter" /><category term="notebook," /><category term="spatial" /><category term="relation," /><category term="geopandas" /><summary type="html"><![CDATA[Humans have the ability to figure out the spatial relations of objects in their visual field without any effort. It is certainly an evolutionary characteristic that has been embedded in our brain because of its importance in many common reasoning tasks. Since objects can be represented in computer systems, algorithms have been developed over the years to support the same functions. In many applications of geoscience, for example in emergency management or risk assessment, one wants to know the spatial context of the area in which a certain event occurred and link the spatial information to external data sources through a named entity. For example, it is not enough to know the extent of a flooded area, we want to know in which administrative region it lies, or we might want to know the distance of a wildfire from a real estate or a populated area. In other words, we want to know the spatial relation between the area in which an event occurred and the area that belongs to or is run by a owner or authority. This post describes the notebook that I have developed on the implementation of spatial relations in GeoPandas. The reader can go directly to the Jupyter notebook in case she or he wants to see the code. We will deal only with topological relations, a subclass of spatial relations that don’t need a metric, that is a way to compute the distance between two spatial objects. The notebook starts by creating some simple spatial objects, points and polygons, to see what kind of topological relations can be established between them. Finally, the topological relations will be tested between our abstract layers, blue, red, orange and green, and the geometry of Marche, one of the 20 regions of Italy, and of its administrative units, i.e. the municipalities. Python packages Spatial objects such as points, lines and polygons, may have one or more topological relationships such as contains, overlap, within, touches. The Python package Shapely, included in GeoPandas, implements such functions for points, lines and polygons. Shapely is a Python port of GEOS, the C++ port of the Java Topology Suite (JTS), a Java implementation of topological relations. We start by importing the Python packages we are going to use. We use the minimum set of packages to get the job done. Coordinate reference systems Even if establishing the topological relationship between two spatial objects doesn’t involve a metric, objects must be represented using the same coordinate reference system (CRS). We will create some spatial objects using the unprojected reference system WGS84 EPSG:4326. We will also import two datasets: the border of the Marche region and the borders of its administrative units, the municipalities of the region. We will see what spatial relations exists between our abstract layers and the Marche region and its administrative units. The two datasets have their own CRS whose ESPG code is EPSG:32632. This CRS is projected on a 2D surface using the Transverse Mercator projection and the unit of measure is the meter so, in order to use the spatial relationships between the spatial objects of our layers and the polygons of the Marche region and its administrative units we will have to change the CRS of our layers to be the same as that used for the region and its municipalities and transform the coordinates of points and polygons accordingly. Spatial joins Spatial relations are used to merge two spatial datasets A and B in which each row of A and B contains spatial objects. The merge can be based on one topological relation such as “contains”, so that if object i of A contains object i of B, the value in one or more columns of B will be added to the object in A. We will not deal with spatial joins here since it’s an application of the topological relations. Spatial objects, areas of interest, and layers We will use spatial objects such as Points, Lines and Polygons for which a set of coordinate pairs will be assigned. A layer is a collection of one or more spatial objects that describes a certain event that occurred over an area of interest. In GeoPandas a layer is built using a GeoDataFrame. A GeoDataFrame is a subclass of the DataFrame class of the Pandas Python library that has a column with geometry. Topological relations We apply the topological relations: within, intersects and touch between the polygons that we have defined. We will not use contains since it’s the inverse of within. We will apply the topological relations to pairs of polygons from two different layers. The methods take the left operand from a polygon of one layer and the right operand from the corresponding polygon of the other layer. By “corresponding” we mean the polygons have the same index value in the two GeoDataFrame used to implement our layers. within From the relation definition in Geopandas: “An object is said to be within another if at least one of its points is located in the interior and no points are located in the exterior of the other.” intersects From the relation definition in GeoPandas: “An object is said to intersect another if its boundary and interior intersects in any way with those of the other.” touches From the relation definition: “An object is said to touch another if it has at least one point in common with other and its interior does not intersect with any part of the other. Overlapping features therefore do not touch.” Projections When we want to apply the topological relations to spatial objects from different layers (GeoDataFrame) we have to check that the coordinate reference system (CRS) used in the two layers is the same. In the following sections we will use two datasets that use the Transverse Mercator projection (EPSG:32632). Since our colored layers use the WGS84 unprojected CRS (EPSG:4362) we will have to change it and use the EPSG:32632. When we change the CRS GeoPandas transforms the coordinates of the points automatically. The coordinate units in the Transverse Mercator projection is in meters instead of degrees. Spatial relations in the real world Our points and polygons in the blue, red, orange and green layers are not completely abstract. They represent towns and areas in the Marche region. We want to find out which spatial relationships between them, the Marche region and its administrative units, the municipalities, hold true and which do not. Municipalities of the Marche region We want to see which municipality lies within the polygon of the blue layer. We start by opening the dataset of the municipalities of the Marche region. This dataset has been extracted from the dataset of the Italian municipalities from ISTAT, the Italian National Institute of Statistics and it is available in the data folder of the repository. Municipalities of Marche within the blue layer Municipalities of Marche intersecting the blue layer Further logic operations with masks As we can see the within relationship is stronger than intersects. We might want to see only the municipalities that intercept the blue area but are not completely within it. With GeoPandas such logic operation can be done with one line of code. border_intersects = intersects &amp; ~within Conclusion We have seen some examples of spatial relations between polygons in GeoPandas. We have applied such relations to geometries of the municipalities of the Marche region in Italy. We have changed the coordinate reference system of our example layers to be the same as that used for the Marche region and its administrative units. We have also performed a further logical operation dividing the geometries of the municipalities that strictly intersect one of our fictional layer from those that lie completely in our layer using logical operators on the result of the spatial relations. Spatial relations are fundamental to perform spatial analysis over multiple layers. We want to underline that they also provide a mean to integrate the information about events, such as flooded areas, with contextual information from external data sources by using the name or identifier of a named entity whose geometry has a spatial relation with the event. As said in the introduction the Jupyter notebook with the Python code used for this post is available on my GitHub repository. References Wikipedia - Spatial relation ISTAT - Administrative Boundaries (updated to January 1st 2022]]></summary></entry><entry><title type="html">Sentinel-6 Altimetry Measurements</title><link href="/eo/sentinel6-altimetry-measurements.html" rel="alternate" type="text/html" title="Sentinel-6 Altimetry Measurements" /><published>2022-10-01T00:00:00+00:00</published><updated>2022-10-01T00:00:00+00:00</updated><id>/eo/sentinel6-altimetry</id><content type="html" xml:base="/eo/sentinel6-altimetry-measurements.html"><![CDATA[<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {
    inlineMath: [['$','$'], ['\\(','\\)']],
    processEscapes: true
  }
});
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>

<p>This post contains my notes from the webinar “<a href="https://training.eumetsat.int/course/view.php?id=445">Recent Development in S6 Altimetry Measurement</a>” organized by EUMETSAT the 29th September 2022 with Ben Loveday, Vinca Rosmorduc, Christine Traeger Chatterjee and Hayley Evers-King. The webinar took place on Zoom. Q&amp;A on <a href="https://www.slido.com/">Slido</a> (code #EUMSC33). The training provided by EUMETSAT is fundamental to those who want to use the data that is made available by the ESA under an open data policy.</p>

<h2 id="sentinel-6-radar-altimetry">Sentinel-6 Radar Altimetry</h2>
<p><a href="https://www.eumetsat.int/sentinel-6">Sentinel-6</a> is a satellite dedicated to the measurement of the sea level and significant wave height. The first satellite was launched in November 2020, a second satellite is expected to be launched in 2025. The Sentinel-6 altimeter is an improved version of the SRAL altimeter on board the Sentinel-3 satellites. The technique used for the observations is radar altimetry. The technique can  also be used to monitor the level of natural and artificial water bodies (i.e. lakes and dams), snow and ice sheets. The webinar focused on the marine domain. The main payload of Sentinel-6 is a Poseidon-4 synthetic aperture radar looking at nadir that works on two bands: Ku band (13.575 GHz, or 2.2 cm wavelength) and C band (5.41 GHz, or 5.5 cm wavelength). A very simplified idea of the technique can be gained from what follows. The radar on board of the satellite sends electromagnetic pulses that after a certain amount of time reach the sea surface from which are reflected backwards, and after an equal amount of time hit the radar antenna.  The distance, or range, of the satellite from the sea surface can be computed knowing the speed of light</p>

\[range = \frac{c * \tau }{2}\]

<p>where $\tau$ is the travel time of the pulse from the radar to the sea surface and back, and $c$ is the speed of light. Once we have the range between the satellite and the sea surface, we can compute the height of the sea surface from the reference ellipsoid, the mathematical model that represents the shape of the Earth, from the difference between the altitude of the satellite, that is its distance from the same reference ellipsoid, and the range</p>

\[sea\text{ }surface\text{ }height = altitude - range\]

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="../assets/sentinel-6/sentinel-6-altimetry.png" alt="radar altimetry" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><em>Sea-surface height measurement, (Credits: Vinca Rosmorduc, CLS)</em></td>
    </tr>
  </tbody>
</table>

<p>The satellite also hosts a GNSS system for precise orbit and altitude determination, and a microwave radiometer used to determine the error on the measure of the path of the radar signal due to the water vapor in troposphere. The (goal) resolution in height measurement is 0.5 cm, the resolution achieved so far is 0.62 cm. The along-track resolution is 50 cm. The along-track resolution is relevant for coastal sea level measurements, less relevant in the open sea. The sea level rise that has been observed so far is <strong>3.53 mm/year</strong>, that is more than 1 cm every three years, an alarming value that tells us a lot about the relevancy of these observations.</p>

<h2 id="data-products-and-service-with-python-client-and-examples">Data Products and Service with Python Client and Examples</h2>
<p>The Sentinel-6 products are released through the <a href="https://data.eumetsat.int/">EUMETSAT Data Service</a>. By searching for “Altimetry” on the user interface the Sentinel-6 products can be found and downloaded. A web service is also available for programmatic access to the data. Examples on how to access the service using the EUMDAC Python client are given on the <a href="https://gitlab.eumetsat.int/eumetlab">EUMETlab</a> platform with examples on how to use the Sentinel-6 products. The documentation is available on <a href="https://eumetsatspace.atlassian.net/wiki/spaces/EUMDAC/overview">EUMETSAT JIRA</a> platform</p>

<h2 id="qa-session">Q&amp;A Session</h2>
<p>Questions have been written on slido.com and the answers are available in the video recording of the webinar.</p>

<h2 id="resources">Resources</h2>
<p>A good resource to learn about radar altimetry, in addition to the <a href="https://training.eumetsat.int/pluginfile.php/45283/course/section/4540/Vinca%20Rosmorducs%20presentation.pdf">slides</a> by Vinca Rosmorduc presented in the webinar, is the book by Iain H. Woodhouse, <a href="https://www.amazon.com/Introduction-Microwave-Remote-Sensing-Woodhouse-ebook/dp/B00U4D8EJM">Introduction to Microwave Remote Sensing</a>, that dedicates 16 pages to radar altimeters. Other resources are available on the <a href="http://www.altimetry.info/">altimetry.info</a> website with a <a href="http://www.altimetry.info/filestorage/Radar_Altimetry_Tutorial.pdf">tutorial</a> about the applications of radar altimetry.</p>]]></content><author><name></name></author><category term="earth" /><category term="observation," /><category term="remote" /><category term="sensing," /><category term="radar" /><category term="altimetry," /><category term="sea" /><category term="level" /><summary type="html"><![CDATA[This post contains my notes from the webinar “Recent Development in S6 Altimetry Measurement” organized by EUMETSAT the 29th September 2022 with Ben Loveday, Vinca Rosmorduc, Christine Traeger Chatterjee and Hayley Evers-King. The webinar took place on Zoom. Q&amp;A on Slido (code #EUMSC33). The training provided by EUMETSAT is fundamental to those who want to use the data that is made available by the ESA under an open data policy. Sentinel-6 Radar Altimetry Sentinel-6 is a satellite dedicated to the measurement of the sea level and significant wave height. The first satellite was launched in November 2020, a second satellite is expected to be launched in 2025. The Sentinel-6 altimeter is an improved version of the SRAL altimeter on board the Sentinel-3 satellites. The technique used for the observations is radar altimetry. The technique can also be used to monitor the level of natural and artificial water bodies (i.e. lakes and dams), snow and ice sheets. The webinar focused on the marine domain. The main payload of Sentinel-6 is a Poseidon-4 synthetic aperture radar looking at nadir that works on two bands: Ku band (13.575 GHz, or 2.2 cm wavelength) and C band (5.41 GHz, or 5.5 cm wavelength). A very simplified idea of the technique can be gained from what follows. The radar on board of the satellite sends electromagnetic pulses that after a certain amount of time reach the sea surface from which are reflected backwards, and after an equal amount of time hit the radar antenna. The distance, or range, of the satellite from the sea surface can be computed knowing the speed of light \[range = \frac{c * \tau }{2}\] where $\tau$ is the travel time of the pulse from the radar to the sea surface and back, and $c$ is the speed of light. Once we have the range between the satellite and the sea surface, we can compute the height of the sea surface from the reference ellipsoid, the mathematical model that represents the shape of the Earth, from the difference between the altitude of the satellite, that is its distance from the same reference ellipsoid, and the range \[sea\text{ }surface\text{ }height = altitude - range\] Sea-surface height measurement, (Credits: Vinca Rosmorduc, CLS) The satellite also hosts a GNSS system for precise orbit and altitude determination, and a microwave radiometer used to determine the error on the measure of the path of the radar signal due to the water vapor in troposphere. The (goal) resolution in height measurement is 0.5 cm, the resolution achieved so far is 0.62 cm. The along-track resolution is 50 cm. The along-track resolution is relevant for coastal sea level measurements, less relevant in the open sea. The sea level rise that has been observed so far is 3.53 mm/year, that is more than 1 cm every three years, an alarming value that tells us a lot about the relevancy of these observations. Data Products and Service with Python Client and Examples The Sentinel-6 products are released through the EUMETSAT Data Service. By searching for “Altimetry” on the user interface the Sentinel-6 products can be found and downloaded. A web service is also available for programmatic access to the data. Examples on how to access the service using the EUMDAC Python client are given on the EUMETlab platform with examples on how to use the Sentinel-6 products. The documentation is available on EUMETSAT JIRA platform Q&amp;A Session Questions have been written on slido.com and the answers are available in the video recording of the webinar. Resources A good resource to learn about radar altimetry, in addition to the slides by Vinca Rosmorduc presented in the webinar, is the book by Iain H. Woodhouse, Introduction to Microwave Remote Sensing, that dedicates 16 pages to radar altimeters. Other resources are available on the altimetry.info website with a tutorial about the applications of radar altimetry.]]></summary></entry><entry><title type="html">Wekeo Jupyter Notebook Competition</title><link href="/copernicus/wekeo_jupyter_notebook_competition.html" rel="alternate" type="text/html" title="Wekeo Jupyter Notebook Competition" /><published>2022-08-04T00:00:00+00:00</published><updated>2022-08-04T00:00:00+00:00</updated><id>/copernicus/wekeo-jupyter-notebook-competition</id><content type="html" xml:base="/copernicus/wekeo_jupyter_notebook_competition.html"><![CDATA[<p><img src="/assets/copernicus/datiaperti_small.png" alt="datiaperti logo" />
<img src="/assets/copernicus/LogoWekeo_Copernicus_RGB_0.png" alt="Logo EU Copernicus EUMETSAT" align="right" width="20%" /></p>

<p>I have submitted three notebooks to the <a href="https://notebook.wekeo.eu/">Wekeo Jupyter Notebook Competition</a>.</p>

<ul>
  <li><a href="https://github.com/luigiselmi/wekeo_jnc/blob/main/air_quality_forecasts.ipynb" target="_blank">Nitrogen Dioxide Forecast over Italy using the Copernicus Atmosphere Monitoring Service</a></li>
  <li><a href="https://github.com/luigiselmi/wekeo_jnc/blob/main/era5_temperature.ipynb" target="_blank">Near surface air temperature from the ERA5-Land dataset</a></li>
  <li><a href="https://github.com/luigiselmi/wekeo_jnc/blob/main/solar_radiation.ipynb" target="_blank">Solar radiation</a></li>
</ul>

<p>Notebooks, where working code is mixed with text and visualizations, are powerful tools to test and share ideas with a quantitative approach in mind. <a href="https://www.wekeo.eu/">Wekeo</a> is one of the European Data and Information Access Service (DIAS) that provides computing resources and easy access to the Copernicus data, services and satellite imagery. It is extremely important for Europe to provide such services and be competitive with US companies in exploiting the value of the Copernicus data released under an open data policy. In my notebooks I use three datasets from the Copernicus services to extract three essential climate variables: the near surface air temperature, the solar radiation and the nitrogen dioxide. The air temperature is a key indicator of climate change, is the heat we feel and that, as we all know, is increasing because of the global warming. The solar radiation is the energy that hits the Earth surface after it goes through the atmosphere and the clouds. It is useful to decide what should be the size of a solar power plant to produce enough energy or hot water to support the consumption of a family or community in a sustainable way. Finally, the nitrogen dioxide is an indicator of the air pollution. I hope my notebooks will be helpful to those who are interested in using the Copernicus data.</p>

<h2 id="19th-oct-2022-solar-radiation-notebook-awarded-the-3rd-prize-of-the-wekeo-jnc">19th Oct. 2022 Solar Radiation Notebook Awarded the 3rd Prize of the Wekeo JNC</h2>
<p>I am glad to say that one of my notebooks, the one on solar radiation, won the 3rd place of the Wekeo Jupyter Notebook competition. Thanks to <a href="https://twitter.com/HayleyEversKing">Dr. Hayley Evers-King</a>, <a href="https://twitter.com/ChrisStewartEO">Christopher Stewart</a> and the team from Copernicus, EUMETSAT, ECMWF, Mercator Ocean for the nice award ceremony (video from 8:05) and <a href="../assets/cv/Wekeo_JNC_2022_Luigi_Selmi.pdf">certificate</a>.</p>

<p><a href="https://youtu.be/5_gvn1NMbo0?t=480"><img src="../assets/wekeo/award_ceremony.jpg" alt="Award Ceremony" /></a></p>]]></content><author><name></name></author><category term="python," /><category term="jupyter" /><category term="notebook," /><category term="Copernicus," /><category term="climate" /><category term="change" /><summary type="html"><![CDATA[I have submitted three notebooks to the Wekeo Jupyter Notebook Competition. Nitrogen Dioxide Forecast over Italy using the Copernicus Atmosphere Monitoring Service Near surface air temperature from the ERA5-Land dataset Solar radiation Notebooks, where working code is mixed with text and visualizations, are powerful tools to test and share ideas with a quantitative approach in mind. Wekeo is one of the European Data and Information Access Service (DIAS) that provides computing resources and easy access to the Copernicus data, services and satellite imagery. It is extremely important for Europe to provide such services and be competitive with US companies in exploiting the value of the Copernicus data released under an open data policy. In my notebooks I use three datasets from the Copernicus services to extract three essential climate variables: the near surface air temperature, the solar radiation and the nitrogen dioxide. The air temperature is a key indicator of climate change, is the heat we feel and that, as we all know, is increasing because of the global warming. The solar radiation is the energy that hits the Earth surface after it goes through the atmosphere and the clouds. It is useful to decide what should be the size of a solar power plant to produce enough energy or hot water to support the consumption of a family or community in a sustainable way. Finally, the nitrogen dioxide is an indicator of the air pollution. I hope my notebooks will be helpful to those who are interested in using the Copernicus data. 19th Oct. 2022 Solar Radiation Notebook Awarded the 3rd Prize of the Wekeo JNC I am glad to say that one of my notebooks, the one on solar radiation, won the 3rd place of the Wekeo Jupyter Notebook competition. Thanks to Dr. Hayley Evers-King, Christopher Stewart and the team from Copernicus, EUMETSAT, ECMWF, Mercator Ocean for the nice award ceremony (video from 8:05) and certificate.]]></summary></entry></feed>