Bulma: sticky footer (flexbox solution)

Bulma is nice. I was looking for a way to get a sticky footer, though. Like many others, I was a little surprised that it’s not built-in: https://github.com/jgthms/bulma/issues/47

It’s of course doable. I have created a demo / minimal working example based on the solution proposed here.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Footer at the bottom / sticky footer</title>
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"
    />
    <style type="text/css" media="screen">
      body {
        display: flex;
        min-height: 100vh;
        flex-direction: column;
      }
 
      #wrapper {
        flex: 1;
      }
    </style>
  </head>
  <body>
    <div id="wrapper">
      <section class="hero is-medium is-primary is-bold">
        <div class="hero-body">
          <div class="container">
            <h1 class="title">
              The footer is at the bottom. Seriously. 🦠
            </h1>
            <h2 class="subtitle">
              By <a href="https://gehrcke.de">Jan-Philip Gehrcke</a>
            </h2>
          </div>
        </div>
      </section>
    </div>
    <footer class="footer">
      <div class="content has-text-centered">
 
          I am down here.
 
      </div>
    </footer>
  </body>
</html>

I posted this in the GH thread, too: https://github.com/jgthms/bulma/issues/47#issuecomment-603547213

COVID-19-Fallzahlen: bitte zitiert nicht die JHU. Sondern die Landesministerien.

Liebe ARD Tagesschau/Tagesthemen und liebes ZDF heute journal: Ihr macht einen fantastischen Job in der COVID-19-Berichterstattung. Danke dafĂĽr!

Aber eine Bitte habe ich an Euch und an viele andere deutsche Medien: bitte zitiert nicht die Johns Hopkins University (JHU), wenn Ihr die aktuellen Fallzahlen von bestätigten COVID-19-Infektionen für Deutschland berichtet.

Die Zahlen selbst sind gut. Die Quelle “JHU” jedoch sorgt fĂĽr ziemlich viel Verwirrung. Bitte zitiert stattdessen unsere Gesundheitsämter und Landesministerien: gleiche Zahlen, korrekte Quelle, weniger Verwirrung. Das versuche ich in diesem Beitrag zu erklären.

Dass viele Bürger sich fragen woher die Diskrepanz zwischen den JHU-Zahlen und den vom Robert Koch-Institut (RKI) veröffentlichten Zahlen kommt, wisst Ihr selbst.

Auch ich habe mich gefragt, warum das heute journal die JHU und nicht das RKI zitiert. In Anbetracht der Unterschiedlichkeit der Zahlen wollte ich das gerne von Euch erklärt bekommen.

Das heute journal ist darauf mit einem Beitrag in der Sendung vom 19.03. eingegangen (kann man in diesem Tweet noch einmal sehen). Aber ich wurde enttäuscht: uns wurde gesagt, dass die JHU sich auf Quellen wie “WHO, CDC, ECDC, NHC, DXY, …” beziehen wĂĽrde. Wir blieben ratlos. Das war keine plausible Erklärung fĂĽr die Diskrepanz der Datensätze und fĂĽr die Entscheidung JHU statt RKI zu zitieren.

Kurzer Exkurs zur genannten Diskrepanz, am Beispiel vom 21. März. Der RKI Situationsbericht zum 21.03.2020 sagt: 16.662 bestätigte Fälle. Die JHU behauptet am heutigen Abend des 21. März: etwa 22.000 bestätigte Fälle. Vergleichbar? Im RKI Situationsbericht steht, dass er dem Datenstand vom 21.03.2020 um 0:00 Uhr entsprechen soll. Also sollte man diese Zahl mit dem letzten Stand der JHU-Daten vom 20.03. vergleichen. Schauen wir nach: time_series_19-covid-Confirmed.csv, Zeile 13, im git repository CSSEGISandData/COVID-19 auf GitHub. Da steht für den 20.03. die Zahl 19.848.

Eine faire Frage ist also: “Warum berichtet das RKI fĂĽr das Ende des Tages des 20. März etwa 16.600 Fälle, während die JHU fĂĽr den gleichen Zeitpunkt etwa 19.800 Fälle berichtet?”

Darauf gibt es meiner Meinung nach eine klare und zufriedenstellende Antwort: die JHU-Daten entsprechen aktuellen und offiziellen Daten der Landesministerien. Die RKI-Daten sind geprüfte und verzögert veröffentlichte Daten der selben Landesministerien.

jeder von uns kann sich zu jedem Zeitpunkt des Tages die kleine Mühe machen und die jeweils aktuellen COVID-19-Fallzahlen der einzelnen 16 Bundesländer nachlesen. Ich mache das hier mal vor, mit aktuellen Zahlen von sechs Bundesländern (während ich diesen Text schreibe):

Das Prinzip ist klar. Diese Fallzahlen-Portale und Statistiken der einzelnen Länder sind schon recht gut gemacht. Danke, liebe Landesministerien! Hier verlinke ich noch ein paar mehr davon.

Wenn ich jetzt die Bevölkerung über den aktuellen Stand der bestätigten COVID-19-Fallzahlen in den genannten sechs genannten Ländern informieren wollte, dann könnte ich doch einfach aufsummieren und schreiben: etwa 17.400 Fälle, Stand 21.03. (vormittags/mittags). Quelle: Gesundheitsministerien der Bundesländer.

Oder nicht? Eine plausible, vertrauenswĂĽrdige Quelle. Im Gegensatz zur mysterischen, nicht direkt plausiblen Quelle “JHU”.

Wenn man jetzt noch die 10 anderen Länder dazurechnet kommt man auf den derzeitigen Stand (während ich schreibe) von etwa 22.000 bestätigten Fällen (weiter oben haben wir die Zahl schon gesehen: das ist das was die JHU derzeit berichtet während ich das hier schreibe).

Meines Wissens nach ist das genannte Vorgehen (Konsultation der Ländesbehörden) genau das, was ZEIT ONLINE und Berliner Morgenpost akribisch mehrfach am Tag tun. Die erhaltenen Daten pflegen sie sofort in ihre Visualisierungen ein:

Und die Zahlen des RKI? Es schreibt selbst:

“Zwischen dem Bekanntwerden eines Falls vor Ort, der Meldung an […], der Eingabe der Daten in […] und von dort an das RKI liegt eine gewisse Zeitspanne. Die kann gemäß den Vorgaben im Infektionsschutzgesetz zwei bis drei Arbeitstage lang sein.”

Schlussfolgerung 1: Die Landesministerien veröffentlichen, gut aufbereitet, zu jedem Zeitpunkt ihren aktuellen Datenstand. Aggregiert von den ihnen jeweils unterstellten Gesundheitsämtern. Das sind offizielle Zahlen. Und wahrscheinlich auch ganz gute (belastbare) Zahlen. Aber auch diese Zahlen sind natürlich schon verzögert gegenüber den Meldungen der Gesundheitsämter!

Schlussfolgerung 2: Ich denke, dass wir die Zahlen von ZEIT ONLINE und Berliner Morgenpost jeweils guten Gewissens benutzen können. Denn sie repräsentieren meinen Stichproben nach exakt die Veröffentlichung der Landesministerien.

Schlussfolgerung 3: das RKI prozessiert die Daten langsam und erzeugt gegenüber den Landesministerien eine Verzögerung in der Veröffentlichung der Daten von weiteren 1 bis 2 Tagen. Warum das so ist: unklar. Eine eingehende Prüfung der Daten? Vielleicht. Dafür hätte ich gerne eine bessere Erklärung!

Schlussfolgerung 4: Tagesschau und heute journal: bitte nennt als Quelle für die aktuellen Fallzahlen die Landes(gesundheits)ministerien bzw. die Gesundheitsämter. Das ist korrekt und stiftet weniger Verwirrung.

Vielleicht könntet Ihr auch noch zusätzlich ZEIT ONLINE oder die Berliner Morgenpost zitieren, die die Konsultation für uns vornehmen und die jeweils aktuelle Summe für uns bereithalten.

Danke.

Randnotiz 1: ich hatte darĂĽber schon vor ein paar Tagen geschrieben und versucht die Gedanken hier ein bisschen klarer zu sortieren.

Randnotiz 2: ich arbeite an https://github.com/jgehrcke/covid-19-germany-gae. Eine konsolidierte und automatisiert konsumierbare Datenquelle der aktuellen Fallzahlen in Deutschland, der individuellen Bundesländer, inkl. Zeitverlauf in der Vergangenheit.

Covid-19 HTTP API: case numbers as time series, for individual German states

I have built an HTTP API for providing the confirmed case numbers of Covid-19 infections in Germany, resolved by time as well as spatially — by the individual states.

To my knowledge that is the only data source providing this kind of information for automated consumption. That’s why I built it.

Here is the corresponding GitHub repository: https://github.com/jgehrcke/covid-19-germany-gae

The API is served by Google App Engine in Europe.

Of course this project is based on the shoulders of giants. Feel free to ask questions below. Thank you!

The primary concerns are:

  • convenience (easy to consume for you in your tooling!)
  • interface stability
  • data credibility
  • availability

Here is how to use that API:

For the history (time series) information for a specific German state:

First, construct the URL based on this pattern:

https://covid19-germany.appspot.com/timeseries/<state>/<metric>

For <state> use a ISO 3166 code, for <metric> use “cases” or “deaths”.

For example, to fetch the time evolution of the number of confirmed cases for Bayern (Bavaria):

$ curl -s https://covid19-germany.appspot.com/timeseries/DE-BY/cases | jq
{
  "data": {
    "2020-03-10T12:00:00+01:00": "314",
    "2020-03-11T12:00:00+01:00": "366",
    "2020-03-12T12:00:00+01:00": "500",
    "2020-03-13T12:00:00+01:00": "558",
    "2020-03-14T12:00:00+01:00": "681",
    "2020-03-15T12:00:00+01:00": "886",
    "2020-03-16T12:00:00+01:00": "1067",
    "2020-03-17T21:00:00+01:00": "1352",
    "2020-03-18T23:00:00+01:00": "1798"
  },
  "meta": {
    "info": "https://gehrcke.de/2020/03/covid-19-http-api-german-states-timeseries",
    "source": "Official numbers published by public health offices (Gesundheitsaemter) in Germany"
  }
}

The points in time are encoded using localized ISO8601 time string notation. Any decent datetime library can parse that into timezone-aware native timestamp representations.

For a current snapshot for all of Germany (no time series information):

$ curl -s https://covid19-germany.appspot.com/now | jq
{
  "current_totals": {
    "cases": 12223,
    "deaths": 31,
    "recovered": 99,
    "tested": "unknown"
  },
  "meta": {
    "contact": "Dr. Jan-Philip Gehrcke, jgehrcke@googlemail.com",
    "source": "ZEIT ONLINE (aggregated data from individual ministries of health in Germany)",
    "time_source_last_consulted_iso8601": "2020-03-19T03:47:01+00:00",
    "time_source_last_updated_iso8601": "2020-03-18T22:11:00+01:00"
  }
}

The data

Original data source: Gesundheitsämter

All data is exclusively based on official numbers published by public health offices in Germany (the Gesundheitsämter).

Attribution for collection and aggregation: RKI, ZEIT ONLINE

Numbers from the individual (hundreds of) health offices are first collected and aggregated on the state level, by the individual state health ministries. From here, they are further collected and published by the Robert Koch-Institut (yielding the data points in my database before March 17), but also by ZEIT ONLINE (yielding the data points in my database from March 17 on).

The time evolution detail of the data on the individual state level however gets lost in this publishing process, and I am carefully re-adding this aspect in hindsight.

Deutschlands Covid-19 Fallzahlen des RKI (und der WHO) haben inzwischen 2-3 Tage Verzögerung zu den Daten der Gesundheitsämter

Die einzelnen Schritte des Datenflusses:

  1. Bekanntwerden eines Falls
  2. Meldung an das Gesundheitsamt
  3. Eingabe der Daten in eine Software
  4. Übermittlung an die zuständige Landesbehörde
  5. Ăśbermittlung an das RKI
  6. Ăśbermittung an die WHO.

Alle Schritte bis auf den Letzten sind vom RKI so dokumentiert.

Jeder dieser Schritte involviert eine Brieftaube und braucht ein bisschen Zeit :-).

So steht im Situationsbericht 58 der WHO, dass wir am 18.03. etwa 7100 bestätigte Covid-19 Fälle in Deutschland hatten.

Die Gesundheitsämter hatten aber schon am 17.03. mehr als 9000 Fälle registriert, am 18.03. deutlich über 12000. Konkret heißt das, dass die von der WHO veröffentlichte Zahl für den 18.03. eher der bekannten Zahl vom 16.03. entspricht.

Ich denke nicht, dass die Daten solange geprüft werden müssen. Ich denke, dass wir den Zahlen der Landesbehörden trauen können (das sind offizielle Zahlen; Beispiel einer Pressemitteilung des Landes Berlin vom 18.03.). Warum werden diese Daten so lange prozessiert?

Wenn diese daten wirklich so lange prozessiert werden müssen — warum werden sie dann nicht rückdatiert? Das wäre den Konsumenten der Zahlen gegenüber nur fair.

In der jetzigen Phase des exponentiellen Wachstums ist es sehr wichtig zu wissen, dass die Deutschland-Zahlen des RKI und der WHO eine erhebliche Verzögerung aufweisen. Eine Verzögerung von 2-3 Tagen entspricht der derzeitigen Verdopplungszeit der gemessenen Zahl der Covid-19 Fälle in Deutschland (Plot).

Das RKI sagt ĂĽbrigens “In der aktuellen Lage erfolgt die Ăśbermittlung deutlich schneller als im Routinebetrieb”.

Und:

“Zwischen dem Bekanntwerden eines Falls vor Ort, der Meldung an […], der Eingabe der Daten in […] und von dort an das RKI liegt eine gewisse Zeitspanne. Die kann gemäß den Vorgaben im Infektionsschutzgesetz zwei bis drei Arbeitstage lang sein.

(https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html)

Update: eine hilfreiche Diskussion zu diesem Thema findet ihr in https://github.com/CSSEGISandData/COVID-19/issues/1008.

 

Covid-19: HTTP API for German case numbers

Landing page: https://covid19-germany.appspot.com

The Robert Koch-Institut is certainly a cool organization, but I doubt they understand the role of (HTTP) APIs for data exchange. I believe that government institutions still vastly underestimate the power of collaboration on data.

Who would have believed that during a pandemic in 2020 we communicate current numerical data such as case counts via PDF documents or complex websites that can only be scraped with brittle tooling and headless browsers?

I closely monitored the situation for days, asked people, asked organizations. Nothing.

Now I have buit an HTTP API, providing the currently confirmed case numbers of Covid-19 infections in Germany:

https://covid19-germany.appspot.com/now

The primary concerns are:

  • convenience (easy to consume for you in your tooling!)
  • interface stability
  • data credibility
  • availability
$ curl https://covid19-germany.appspot.com/now 2> /dev/null | jq
{
  "current_totals": {
    "cases": 9348,
    "deaths": 25,
    "recovered": 72,
    "tested": "unknown"
  },
  "meta": {
    "contact": "Dr. Jan-Philip Gehrcke, jgehrcke@googlemail.com",
    "source": "zeit.de (aggregates data from individual ministries of health in Germany)",
    "time_source_last_consulted_iso8601": "2020-03-18T00:11:24+00:00",
    "time_source_last_updated_iso8601": "2020-03-17T21:22:00+01:00"
  }
}

This is served by Google App Engine in Europe. The code can be found here: https://github.com/jgehrcke/covid-19-germany-gae

I plan to

  • add time series data
  • add more localized data for individual states (Bundesländer)
  • enhance caching

Feel free to use this. Feedback welcome.

Huge shoutout to zeit.de for doing the work of aggregating the numbers published by individual ministries of health.

For historical data, by all means and purposes as of today I recommend consuming https://github.com/CSSEGISandData/COVID-19. For getting the current state, use the zeit.de data exposed via the HTTP API described above.

For now, I am sure that the current case count as provided by zeit.de is the best in terms of credibility and freshness. The actual underlying data sources are all official: these are the individual ministries of health.

The individual ministries publish their numbers usually once or twice during different times of the day. The journalists from zeit.de try to incorporate these data points as quickly as possible right after publication, also during the afternoon and evening. In contrast to that, the Robert Koch-Institut (RKI) may incorporate a specific update from a specific health ministry only after 1-2 days.

The RKI also doesn’t do what I call an atomic sum, but instead seems to sum numbers published by different health ministries at vastly different times: the RKI tries to find one number per day, and that number is not found during the evening (after “all data has come in” from the individual states), but seemingly at some unfortunate mid-day point in time where some individual ministries of health have just delivered a fresh update for the day, and others didn’t yet. Non-atomic.

This explains why, for example, the RKI’s official number for March 17 was ~7000 confirmed cases, whereas zeit.de already reported ~9300 at the same time (biggest contributor here is specifically that the last update from Nordrhein-Westfalen from March 17 didn’t make it into RKI’s sum for March 17).

 

Update: an official statement of the RKI about the delays in data processing, in German:

In Deutschland übermitteln die rund 400 Gesundheitsämter mindestens einmal täglich (in der aktuellen Lage noch häufiger) pseudonymisierte Daten zu bestätigten COVID-19-Fällen auf Grundlage des Infektionsschutzgesetzes elektronisch an die Bundesländer. Die wiederum übermitteln die Daten zu den COVID-19-Fällen elektronisch an das RKI. Für die Berichterstattung wird seit 18.03.2020 täglich der Datenstand 00:00 Uhr verwendet.

Zwischen dem Bekanntwerden eines Falls vor Ort, der Meldung an das Gesundheitsamt, der Eingabe der Daten in die Software, der Übermittlung an die zuständige Landesbehörde und von dort an das RKI liegt eine gewisse Zeitspanne. Die kann gemäß den Vorgaben im Infektionsschutzgesetz zwei bis drei Arbeitstage lang sein. In der aktuellen Lage erfolgt die Übermittlung deutlich schneller als im Routinebetrieb, weil Daten schneller verarbeitet werden. Dass einige Fälle mit etwas Verzögerung im Gesundheitsamt elektronisch erfasst werden, liegt auch daran, dass die Gesundheitsämter zunächst Ermittlungen zu den einzelnen Fällen und deren Kontaktpersonen durchführen und prioritär Infektionsschutzmaßnahmen ergreifen müssen, was die Ressourcen der Gesundheitsämter bereits stark in Anspruch nimmt. Ebenso werden die Daten am RKI validiert, um verlässliche Daten zu veröffentlichen. Auch innerhalb dieses Prozesses kann es zu geringen Verzögerungen kommen.

(source: https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html)