neděle 4. září 2022

Parsing XML with missing namespace

Today I needed to parse some JUnit reports, generated from some old code, so they are missing namespaces. I created a trivial XSD file, but it could not validate the XML as it did not contain matching namespace.

Just a side note - if you need current XSD file, you can find it here.

This is able to parse JUnit-like reports from old Ant-based Jakarta EE 10 tests, so I can integrate the TCK to more modern build in GlassFish (another part of my "army of zombies" which ensures I will not do any mistakes in GlassFish refactoring; these TCK tests are waiting to be refactored too).

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Unmarshaller;
import java.io.File;
import java.io.FileInputStream;
import javax.xml.XMLConstants;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import xxx.generated.Testsuite;
public class JUnitResultsParser {

public Testsuite parse(final File xml) {
    try (FileInputStream inputStream = new FileInputStream(xml)) {
        JAXBContext context = JAXBContext.newInstance(Testsuite.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(getClass().getResource("/junit-results.xsd"));
        unmarshaller.setSchema(schema);
        unmarshaller.setAdapter(new ClassAdapter());
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = new NamespaceURIFixer(xif.createXMLStreamReader(inputStream));
        Testsuite testSuite = (Testsuite) unmarshaller.unmarshal(xsr);
        return testSuite;
    } catch (Exception e) {
        throw new IllegalArgumentException("Could not process the XML file: " + xml, e);
    }
}


private static class NamespaceURIFixer extends StreamReaderDelegate {
    public XsiTypeReader(XMLStreamReader reader) {
        super(reader);
    }

    @Override
    public String getNamespaceURI() {
        String uri = super.getNamespaceURI();
        if (uri == null) {
            // same as in xsd
            return "urn:org:junit:results";
        }
        return uri;
    }
}
}

Oh, and if you want to see how I generated remaining classes, it is this:
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <id>xjc</id>
                <goals>
                    <goal>xjc</goal>
                </goals>
                <configuration>
                    <addGeneratedAnnotation>true</addGeneratedAnnotation>
                    <clearOutputDir>true</clearOutputDir>
                    <locale>en</locale>
                    <sources>
                        <source>src/main/resources/junit-results.xsd</source>
                    </sources>
                    <xjbSources>
                        <xjbSource>src/main/resources/junit-results.xjb</xjbSource>
                    </xjbSources>
                    <packageName>xxx.generated</packageName>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

Ok, ok, you wanna know what I did in that XJB file ... I noticed there are Class values and I don't want to get just String. So I created a trivial XmlAdapter<String, Class<?>> using Class.forName() and Class.getName() to convert String and Class, and that's it! Btw I found a minor bug - to my surprise I could use generics in the XML, but in generated code there's missing space after the class name. And when I added it to the XML, it remained even in the generated source code. Perhaps I should create an issue for that ...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="3.0"
    xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    jaxb:extensionBindingPrefixes="xjc"
>
    <jaxb:bindings schemaLocation="junit-results.xsd" node="/xsd:schema">
        <jaxb:bindings node="//xsd:simpleType[@name='javaClassName']">
            <xjc:javaType name="java.lang.Class<?> " adapter="org.glassfish.main.tests.tck.ant.xml.ClassAdapter" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

The javaClassName is defined this way in XSD:
    <xsd:simpleType name="javaClassName">
        <xsd:restriction base="xsd:string" />
    </xsd:simpleType>

And now comes the cake - I can run the TCK tests against GlassFish snapshot right from the Eclipse. Yeah, it is not without issues, they simply cannot run one after another as they leave some garbage behind ... but still - I can easily reproduce some issue locally, configure logging, or even attach debugger (I did not try yet, maybe it would need some settings).


Last note: it was rather for fun, because my side doesn't see test classes inside the TCK, so obviously javaClassName cannot be converted to a Class<?>, because the required class is not on my classpath. However - I did not do any XJB customizations for several years, so I had to try it :-)

středa 10. srpna 2022

Asciidoc Cleanup in GlassFish Documentation

 I always feel like Frankenstein when I am doing such things 🤣

When you take a look here on the pull request I created, you will perhaps understand why I did it. 

First I tried to read+search+fix everything one by one, then I tried to use regular expressions in Eclipse, but with some 15 seconds on every change ... I would spend year with that. So after several hours I resigned, time to invent the wheels.

#!/bin/bash
# each line means a set of ids of the same anchor
# the last id is usually the most descriptive and should be used
# the others should be removed
ids=$(grep -h -o -r './' --include=\*.adoc --exclude-dir=target -e '^\(\[\[[0-9A-Za-z_\\-]\+\]\]\)\+' | tr -d "[" | tr -s "]]" ",")

This found all those blocks like this one with labels. I was interested in multiple labels of the same place. Why would someone need three labels plus the implicit one? He didn't. But if some tool generated them, you simply added another. And at that time disks were slow, replacing a label by fulltext search ... eh, damn it, let's create another one.
[[ghmrf]][[GSACG00088]][[osgi-alliance-module-management-subsystem]]


for line in ${ids} ; do
IFS=','
labels=($line); 
unset IFS;
len=${#labels[@]};

  • IFS is a separator.  Don't forget to unset it, because it affects further parsing otherwise.
  • () is an array.
  • length of the array ... don't let me explain this syntax, please ...
So, what we have now:
  • number of labels on the same line
  • if the number is 1, everything is alright
  • if the number is greater, we want to choose one of them (the last one was usually the most descriptive), and get rid of the rest.
  • but how? I can't keep everything in my head, so let's give names to all variables.

if [[ $len != 1 ]]
then
correctId=${labels[$len-1]};
maxIncorrectIdIndex=$(($len-2));

Do you see that evil thing? Bash doesn't subtract 2 from len without braces, ha! It took me a while until I found what to do with that. 

for i in $(seq 0 $maxIncorrectIdIndex) ; do
redundantId=${labels[$i]};
if [[ "$redundantIds" == *",$redundantId,"* ]]; then
echo "Duplicit id must be fixed first: ${redundantId}";
grep -o -r './' --include=\*.adoc --exclude-dir=target -e '^\(\[\[[0-9A-Za-z_\\-]\+\]\]\)\+' | grep "\[${redundantId}\]";
exit 1;
fi
redundantIds="${redundantIds},${redundantId},"

This was quite funny, originally I tried to google some Set implementation for bash, but finally I came to a conclusion that all those implementations are bit overkill. I needed just a string containing all found labels and when I found a redundant label colliding with another redundant label, I forced user, myself, to resolve these conflicts first.

If I would replace them automatically with something else ... it could create invalid xrefs. 

Time for changes. Truth is that these commands could be optimized, but why would I do that? I needed just to pass it once and then commit-push-drink a beer/ice-coffee ... while script went through some 500 files, replacing redundant label usages by the usage of chosen one, and then delete all those declarations.

echo "Replacing $redundantId by $correctId and removing [[$redundantId]] labels...";
find . -type f -name '*.adoc' ! -wholename '*/target/*' -exec sed -i -- "s/#${redundantId}/#${correctId}/g" {} +;  
find . -type f -name '*.adoc' ! -wholename '*/target/*' -exec sed -i -- "s/\[\[${redundantId}\]\]//g" {} +;
done;
fi;
done;

And finally yet one thing ... replace link: by xref: where possible, because then Asciidoctor can validate these references. I found that some types of mistakes still can pass (remember those collisions?), but it is still an awesome tool.

echo "Replacing link references by xref where it is possible.";

find . -type f -name '*.adoc' ! -wholename '*/target/*' -exec sed -i -r -- 's/link:([a-zA-Z0-9\-]+)\.html#/xref:\1.adoc#/g' {} +;

find . -type f -name '*.adoc' ! -wholename '*/target/*' -exec sed -i -r -- 's/link:#/xref:#/g' {} +;

echo "Done.";

Then I started maven clean install, it failed reporting some remaining issues, so I went back to Eclipse and fixed them in an hour. And this is the result in PDF (Okular) and HTML (Opera).



úterý 2. srpna 2022

How To Find Suspend/WakeUp State Changes in Syslog

Some time ago I required to find out when my laptop "went to bed" and when it "woke up". And I have found that it is not so simple as I would expect, and even worse, I didn't find a response on StackOverflow. So I responded to a similar question.

But in Kubuntu 22.04 the log message changed, so I changed the command to the following form. The zgrep command can search also in compressed syslog files:

sudo zgrep -e 'systemd-sleep' /var/log/syslog* | grep -e "Entering sleep state\|System returned from sleep"

The output is not ordered, but I am lazy to implement it, it would be also much more than I needed.



středa 13. července 2022

Native2ascii Maven Plugin Is Still Used

This will be rather a short message - today I spent some time with the plugin as someone created a security issue related to obsoleted dependencies. So I did a bit more ...

  • Migrated from Travis to GitHub Actions
  • Excluded obsoleted Velocity and Struts transitive dependencies (unused, however ...)
  • Replaced deprecated usages of commons-lang3 classes
  • Replaced "closeSilently" by try-with (do you remember years where there weren't suppressed exceptions?)
Despite you can use property files with UTF-8 now, more usual is still Latin1+escapes. Then is better to write property files in human language and use this plugin to convert them to the "language of machines". Eclipse integration with this plugin works well too.

See https://github.com/mojohaus/native2ascii-maven-plugin

sobota 20. února 2021

Pohled do zpětného zrcátka - jak si s eskalací epidemie poradily úspěšné země?

Proč selhává Česká republika

Pokusím se v tomhle textu vyhýbat hledání viníků - epidemie je společenská záležitost, ne jen individuální, jelikož společnost sestává z jednotlivců. Každý jednotlivec je zodpovědný za bezpečnost společnosti svým malým dílem, leč pokud se chová nezodpovědně, jeho podíl výrazně roste a celou společnost ohrožuje.

Z toho v důsledku vyplývá i svoboda ve společnosti - pokud se lidé chovají nezodpovědně v domnění, že je to jejich svobodou, v důsledku tím ohrožují i svobodu společnosti, která tak může dospět až ke kolapsu; svoboda všech jednotlivců tím skončí.

Proč tedy jako celek selháváme? Obecně protože reagujeme pozdě a neúměrně situaci.


První graf je víceméně samovysvětlující. Byť si tyto země nechaly rozběhnout epidemii podobně jako my, žádná stejnou chybu neudělala opakovaně v takové míře a každá ji dostala do takových čísel, kdy již byla schopná udržet ji pod kontrolou. 

Po chvíli prohlížení jsem si řekl, že si "po selsku" určím hranici eskalace epidemie na sedmidenní incidenci 150 nakažených na 100 tisíc obyvatel. Jako zvládnutí epidemie pak budu brát to, že se země zvládne dostat opět pod tuto hranici. Samozřejmě, tato mez je čistě subjektivní, leč ...

Ve druhém grafu jsem barevnými čárami označil nějaký bod zlomu ve zdravotní péči - o něm víme, že následuje až po několika týdnech od zavedení opatření, nicméně nejde o příčinu a důsledek - opatření mají vliv na poměrně dlouhé období. 

Zajímavý je ale i obrat zpět k horšímu. Čili - co nejvíce pomohlo a nejvíce uškodilo v ČR?

Červená čára, jarní vlnka

Co se dělo v okolí červené čáry, tj. vyznačeného maxima obsazení jednotek JIP? 

  • 11. až 19. 3. 2020 
    • výrazné omezení prodeje, omezení cestování, uzavření škol
    • omezení pohybu (se značnou benevolencí)
    • povinné nošení roušek
    • některé výrobní provozy omezily výrobu
    • testování zdarma pro lidi s příznaky.
    • k eskalaci dle mého kritéria vůbec nedošlo
  • 7. 4. 2020 
    • začátek uvolňování restrikcí
    • epidemie i po uvolnění restrikcí dále oslabuje

Je vidět, že pokud byla opatření zavedena včas, byla velice účinná. Též upozorňuji na to, že jsme šli "jaru naproti", čili přírodní podmínky též hrály v náš prospěch dokonce i naše prosperita byla zachráněna, byli jsme "best in covid".

Modrá čára, září a říjen

Již letmý pohled na poslední třetinu roku nutí k zamyšlení, zda tlaky některých organizací i jednotlivců, které se snažily přimět vládu k co nejdřívějšímu rozvolnění, byly vedeny snahou udržet ekonomiku funkční ... nebo ji naopak co nejvíc poškodit. Nebo zkrátka hloupostí, naivní představou, že "už to máme za sebou".

  • srpen 2020
    • Jaroslav Flégr v médiích varuje před rizikem eskalace a další evoluce viru s návratem dětí do škol a příchodem podzimu. Sklízí výsměch, stejně jako řada dalších expertů i z jiných oborů. 
    • pomalu - leč viditelně - začíná stoupat počet nakažených
  • 1. 9. 2020 
    • spuštění školní výuky bez omezení
  • 30. 9. - 5. 10. 2020
    • vyhlášení nouzového stavu
    • omezení společenského života, kulturních a sportovních akcí
    • vrací se nošení roušek 
  • 2. - 10. 10. 2020
    • volby 
  • 12. - 22. 10. 2020
    • sekvence polovičatých velmi detailních opatření den za dnem, zatímco epidemie stále nabírá tempo
    • zákaz prezenční výuky ve školách kromě mateřských škol a dalších výjimek
    • zákaz hromadných akcí
    • omezení pohybu (opět se značnou benevolencí) 
    • zákaz maloobchodu kromě výjimek 
  • 28. 10. - 7. 11. 2020
    • vrchol epidemie je poměrně dlouhý, což je pravděpodobně způsobeno extrémním rozšířením viru, který se šíří v rodinách i kolektivech.
  • 8. 11. 2020
    • epidemie začíná výrazně zpomalovat
  •  25. 11., 30. 11., 3. 12. 2020
    • návrat žáků do škol
    • otevření obchodů

Leč co se nestalo ... pokles se zastavil a obrátil se k další eskalaci. Jen tato do konce nedotažená vlna epidemie trvala zhruba od poloviny září do poloviny prosince, čili dlouhé tři měsíce. Jestli tohle někomu přijde výhodné z jakéhokoliv pohledu, je blázen.

Ponaučili jsme se? Vůbec ne!

Zelená čára, Vánoce

Jak jsem již řekl, předchozí vlna ve skutečnosti neskončila, protože předčasná rozvolnění, odůvodněná vánočními nákupy odstartovala další eskalaci. Šťastné a veselé vůbec nebyly šťastné ani veselé, spíše stresující a opatrné, nicméně nenechali jsme si je ujít. Výsledek se brzy dostavil.

  • 9. 12. 2020
    • začíná prudký obrat průběhu epidemie a pokles je okamžitě nahrazen prudkým růstem
  • 16. 12. 2020
    • spuštěno antigenní testování (zpětně se ukazuje, že pro zvládnutí epidemie je naprosto bezzubé, jelikož pozitivní jsou jen zjevně příznakové osoby).
  • 21. 12. 2020
    • zákaz prezenční výuky
  • 4. 1. 2021
    • návrat žáků 1. a 2. tříd ZŠ a speciálních škol
  • 10. 1. 2021
    • vrchol epidemie je tentokrát krátký a ostrý
    • počet pacientů v nemocnicích je ale vyšší než ve vlně minulé - ukazuje se, že ze statistik jsou vyřazování pacienti, kteří již nejsou pozitivní, ale léčí se z následků nákazy, někteří zůstávají ve vážném stavu.
  • 20. 1. 2021
    • útlum epidemie začíná zpomalovat
    • média a politikové napříč spektrem se baví o uvolnění restrikcí, obzvlášť o otevření obchodů a spuštění prezenční výuky, na varování expertů z různých oborů neslyší
  •  30. 1. 2021
    • pokles se opět pozvolna obrátil do nárůstu
    • destabilizační vliv má agresivnější varianta viru a pravděpodobně i silné mrazy (suchý vzduch), výrazně usnadňující jeho šíření

Děsivá prognóza čtvrté vlny

  • stav k 20. 2. 2021
    • od 1. 10. 2020 jsme se nedostali na zvladatelnou úroveň
    • redistribuce pacientů zkolabovala
    • přeplněné nemocnice odmítají pacienty, nedoléčené propouští do domácí péče
    • prudce roste denní počet mrtvých
    • česká koruna ztrácí stabilitu
  • bez včasné radikální reakce 
    • se dostaneme za hranice zdravotní péče
    • jak bylo vidět v předchozích vlnách, i tato vlna bude trvat měsíce
    • hrozí další mutace, obzvlášť přizpůsobení viru jarnímu a letnímu počasí
    • ekonomické škody nebude možné napravit ani za 10 let
    • škody na vzdělání ovlivní nikoliv jeden ročník života studenta, ale několik
    • škody na zdraví obyvatelstva z nás učiní zemi bez perspektivy, nezajímavou pro investory
  • s opožděnou, ale odpovídají reakcí
    • včasnou reakci již nestihneme, je pozdě.
    • alespoň minimalizujeme škody - a to ve všech úhlech pohledu

úterý 16. února 2021

Lockdown - celorepublikový a ihned

Co je to "lockdown"

  • česky uzamčení
  • princip: výrazně omezit mobilitu lidí, tím i počet kontaktů a rychlost šíření viru
  • nouzové řešení - má zásadní negativní vliv na ekonomiku, školství, veškerý život v oblasti
  • důrazný lockdown v délce trvání obvyklé inkubace+doby léčby efektivně zastavuje eskalaci epidemie
  • čím dříve je zaveden, tím kratší může být, musí na něj však navázat velice dobře nastavená opatření

České verze

  • dosud spíše napodobeniny
  • všechny vedly spíše ke zkomplikování života obyvatel než k efektivnímu omezení epidemie, nicméně i tak zabraly
  • při jejich včasném nasazení by měly výrazně lepší výsledek i bez "výjimek z výjimek"
  • vlny:
    • I. vlna: omezení nebyla až tak silná, výrazně převážila riziko, které však tehdy nebylo známé. 
    • II. dvojvlna: omezení zavedená o zhruba tři týdny pozdě, chybně nastavená pravidla, měnící se den za dnem. Soustředění se na ekonomickou pomoc, nikoliv na zdravotní, předčasné uvolnění i tak chybně nastavených pravidel.
    • III. vlna: začíná teď velmi pozvolna, ale velmi pravděpodobně bude horší než předchozí. Rizikem je prakticky plné obsazení nemocnic a zároveň extrémní rozšíření nákazy.
  • pozor na zkušenosti ze stability počítačových systémů (i jiných) - při překročení určitě meze zátěže jen samotný management redistribuce zátěže je tak náročný, že systém již nutně musí zkolabovat a není jiná možnost.
    • psal jsem diplomovou práci, která se věnovala včasné diagnostice bodu, kdy toto hrozí, a rozhodování, zda lze vůbec riskovat další iteraci s tím, že se vývoj může s určitou pravděpodobností obrátit
    • není těžké si domyslet, že tak jako nechceme, aby nám havaroval stroj za několik milionů, nechceme ani skládat mrtvé na chodbách a do mrazáků; kapacita každého takového kritického systému musí být tudíž výrazně vyšší než jeho provozní stav - překročení 50% lze brát jako velmi zásadní varovný signál.

https://www.covdata.cz/evropa.php#cz,il,de

Že prý lockdowny nefungují?

  1. Pokud by nefungovaly, nikdo by je nedělal. Jak a s jakým nastavením je ta která země nebo oblast dělala, se můžete podívat tady
  2. WHO varuje před dlouhodobými lockdowny, nikoliv před lockdowny jako takovými
  3. Objevují se fake news o Izraeli, vývoj v Izraeli máte ale v grafu nahoře. Izrael teprve nyní otevírá školky a první dva ročníky základních škol, ale pouze v zónách, kde je nejméně 70% lidí očkovaných.
  4. Piráti si v jednu chvíli velmi oblíbili jako vzor Belgii, bohužel si za příklad vzali jen to, co dobře znělo. Podobně jsou na tom i ostatní opoziční strany, zatímco Babišova vláda více slibuje než jedná a prakticky udržuje zemi v chybně nastaveném lockdownu už měsíce.
  5. Můžete si zkusit najít libovolnou zemi a sami posoudit, jaká opatření v nich vedla k výraznému útlumu rozběhnuté epidemie - vždy v tom hrají roli velice striktní pravidla.

Automatický překlad německých pravidel tak, jak se na nich dohodly spolkové vlády:

 

 Alternativy

  • udržovat míru nákazy na co nejnižších číslech tak, aby nehrozila eskalace, případnou eskalaci včas a efektivně zastavit
  • zrušit omezení emisí krematorií, šlechtit další varianty viru bez možnosti jakkoliv předpovídat jejich agresivitu, schopnosti, smrtnost, atd., pouze sbírat mrtvoly a nedůstojně je likvidovat jako odpad, neboť na důstojná rozloučení s blízkými nebudeme mít čas ani prostor.
  • nadále lavírovat a živořit a doufat, že na jaře vir možná zmizí s postupným proočkováním obyvatelstva; existují opět vážné obavy, že se to nestane a díky vysokému rozšíření viru se některé jeho varianty přizpůsobí podmínkám. Takové už dokonce existují.

Jakkoliv druhá alternativa zní cynicky, vláda tak opravdu učinila. Nyní se k ní přidává opozice s naivní představou, že za vše může jen nedodržování pravidel a pokud se pravidla změní (přesněji uvolní), lidé je opět dodržovat začnou. Nyní zpět do reality.

Realita

  • Opět pozvolna roste rozšíření nákazy
    • dva až tři týdny poté poroste i počet obětí, a to i pokud se zdravotní péče nezhroutí
    • prudký nárůst z už tak vysokých čísel právem vzbuzuje obavy
  • Opět jako stát nereagujeme, resp. reagujeme po eskalaci, ne na varování před ní.
    • to se zdaleka netýká jen vlády, ale i opozice, hygieniků, praktiků, ředitelů škol, atd.
  • Převažuje agresivnější varianta.
  • Nemocnice jsou plné pacientů
  • Pozitivita dětí je stejná jako u dospělých, bývají déle infekční, ale s menší intenzitou, což paradoxně ztěžuje jejich detekci antigenními i PCR testy.
  • Leden a únor činí pravidelně problémy i při chřipkových epidemiích, pravděpodobně v důsledku nedostatku vitamínu D, suchého vzduchu, atd.
  • https://onlinelibrary.wiley.com/doi/epdf/10.5694/mja2.50823

 



 Řešení - tady a teď

Překvapivě je už celou dobu zpracované a ověřené v několika zemích. Řešení je přijatelné i pro obyvatelstvo, protože dává smysl, přestože je rozhodně nepříjemné. Dobrá vláda pak udělá vše pro to, aby už k podobnému řešení pokud možno nemusela sahat, v opačném případě v demokratické zemi končí.

  1. Skutečný striktní lockdown úměrný katastrofě - u nás by odpovídající dobou byly dva až čtyři týdny.
  2. Zajistit přežití všem obyvatelům - finance, zásobování, teplo, pomoc
  3. Uvolňovat opatření postupně podle nastavených kritérií po krajích nebo okresech.
  4. Držet si zdravý pesimismus - v krizi vede k mnohem lepším výsledkům než optimismus, který krizi umocňuje. Nevzdávat se a pracovat na zlepšení.

Podrobněji viz

Nezbývá než konstatovat, že pokud by naši politikové, hygienici a další osoby, zodpovědné za rozhodování, sáhli po vyzkoušeném systému opatření z jiné země a nepokoušeli se epidemii "nějak očůrat", mohli jsme být v mnohem lepším stavu, ne-li "best in covid". Jsme pravý opak, s vyhlídkou na další katastrofu.




 

pondělí 25. ledna 2021

Dezinformace ministra Blatného vs. věda

Nechce se mi zase strávit neděli psaním něčeho tak dlouhého, jako minule, ale asi to není od věci aspoň v rychlosti.

Předně vás odkážu na velmi propracovaný článek o historii příčin smrti na iRozhlas: Od moru ke covidu.

Autonehody

Blatný se snaží navodit, že za nárůst úmrtí mají nějaký zásadní vliv smrtelné dopravní nehody. No a teď fakta:

  • obětí dopravních nehod bylo 532 v roce 2019, ale jen 470 v roce 2020.
  • říjen 53 vs. 38 obětí
  • listopad 52 vs. 36
  • prosinec 35 vs. 32

Jinak řečeno, oběti dopravních nehod se na nadúmrtích podílí přesně naopak - snižují je. Čili - počet obětí z jiných příčin musel být naopak o rozdíl vyšší. 

Tvrzení ministra je tak absurdní, zlé a ostudné, že by měl okamžitě odstoupit.


Zdroj: https://www.irozhlas.cz/nehody#

Sebevraždy

O sebevraždách Blatný sice nemluvil, patrně protože oficiální data zatím chybí. V médiích se během roku objevovaly zprávy, že je možné i ztrojnásobení. Tomu se nelze divit, úmrtí v rodinách, deprese, pochybnosti o budoucnosti, všudypřítomný stres, to vše by k tomu mohlo přispět. Jenže ...

Toto jsou data jen ze Středočeského kraje, nic víc jsem bohužel nebyl schopen najít - podle nich se počet sebevražd překvapivě snížil. Buď to tak opravdu je, nebo data ještě nejsou úplná, jiné vysvětlení nemám, každopádně zatím nic nenasvědčuje, že by počet nějak výrazně vzrostl. Zdroj: https://www.policie.cz/soubor/tk-leden-2021-2-pdf.aspx

Celkové počty sebevražd do roku 2018 viz https://www.czso.cz/csu/czso/sebevrazdy_zaj

Nadúmrtí jiných zemí


Jednoduše procentuelně oproti předchozím pěti letům zde: https://ourworldindata.org/grapher/excess-mortality-p-scores?tab=chart&stackMode=absolute&country=BEL~BGR~HRV~CZE~DNK~England%20%26%20Wales~FRA~DEU~HUN~ISR~ITA~NLD~NOR~POL~SVK~ESP~CHE~USA&region=World

Mutace

Existují vážné obavy z toho, že bude docházet k dalším a dalším mutacím, a to přestože koronaviry nemutují tak intenzivně jako chřipka. 
Je to dáno kombinací jeho vlastností a mírou jeho rozšíření
  • dlouhá inkubační doba, takže hostitel běhá mezi dalšími "kandidáty", aniž by věděl, že je nakažený
  • hostitel je infekční už v části inkubační doby, tj. nemá příznaky, ale vydechovaný vzduch i sliny mohou nakazit další lidi.
  • dlouhá infekční doba - výjimečně až tři týdny, nejčastěji je to "jen" 7-12 dní
  • rozšíření viru po celém světě mezi ohromný počet hostitelů v různých prostředích

Více viz https://www.osel.cz/11558-nova-nebezpeci-z-bazin-covidovych-prizraku.html 

Pozor ještě na jednu věc - vir není žádný stratég ani konspirátor. Je spíše podobný miniaturnímu strojku, který se umí replikovat - prostě s pomocí lidských buněk vyrobí víc takových strojků, a občas má nějaký náhodnou "chybičku".

Strojek s takovou chybičkou se ovšem může ukázat jako ještě lepší než originál za nějakých okolností - například bude odolnější vůči mrazu a krom toho začne více zabíjet skupinu hostitelů s nějakou vlastností, třeba děti. To druhé pro něj sice není výhodné - postupem času projde populací a vyhyne, protože vyvraždí všechny své hostitele a zbytek bude imunní. Ovšem jeho obětem to nijak nepomůže.

Samozřejmě tím netvrdím, že taková varianta vznikne, je to jen jedna z mnoha možností. Jiná možnost je, že nějaká jeho varianta bude naopak méně smrtelná, postupně vytlačí ty současné, a Covid-19 se tak stane vcelku běžnou "chřipkou" (koronaviry vůbec nejsou příbuznými chřipky, je to jiný nepříbuzný druh, proto v uvozovkách). 

I z toho důvodu je třeba jednotlivé mutace a varianty viru sledovat. Mj. se tak dá zjistit i třeba která část viru se často mění a co která změna vlastně dělá s jeho vlastnostmi. Do budoucna by to mohlo vést i k tomu, že vývoj bude možné částečně předvídat.

Lockdown

Tento pojem nemá vůbec konzistentní význam - obvykle to znamená nějakou sadu velmi omezujících pravidel, jenže v každé zemi jsou úplně jiná. Vzniklo už několik studií, které se zabývají účinností takových pravidel v různých zemích, ale ve většině, které jsem četl, jsou poměrně velké nedostatky - není divu, že nic nedokazují.

Obvyklé problémy:

  • hledání lineární korelace mezi omezením a úbytku počtu nakažených do dvou týdnů
    • ignoruje možnou nelineární závislost
    • ignoruje možné tranzitivní závislosti
    • ignoruje možný multiplikační efekt více jevů
    • ignoruje načasování opatření
  •  chybí zohlednění stavu, ve kterém bylo opatření zavedeno 
    • preventivně nebo v důsledku
    • při 0,1% nebo 1% nakažených
    • letní nebo zimní měsíce
    • závěr jara nebo začátek zimy
    • podnebí
    • aglomerace nebo venkov, způsob života

Nelineární závislosti

Korelační koeficient je záležitost lineární, byť dokáže detekovat i některé nelineární závislosti, je docela omezený.

Tranzitivní závislosti

Nevím teď, jaký pojem se pro toto používá v matematické statistice, pojem tranzitivní závislost je ale dobře známý z modulárních systémů, obzvlášť architekti software si na nich často "vylámou zuby".

V principu jde o to, že tranzitivní závislost není přímo vidět, ale její vliv je "spuštěn" viditelnou závislostí, která sama o sobě žádný takový efekt nemá, nebo je zanedbatelný. Leč za nějaké vcelku nenápadné podmínky ... ajaj, z hlubin vynoří se monstrum.

Multiplikační efekt

Některé jevy násobí svůj účinek navzájem. To se hrozně špatně dokazuje, většinou je třeba opřít se ještě o jiné důkazní možnosti, i hypotetické, které samy o sobě budou vyžadovat další studium.

Načasování

Pokud vám to pořád není dost složité, ano, ještě jedna věc hraje obrovskou roli - načasování. Jarní "lockdown" v ČR byl pravděpodobně přehnaný, byť protiepidemicky efektivní. Hodí se připomenout, že tehdy jsme sice šli z velmi malých čísel, ale zároveň jsme měli oprávněné obavy, co nás vlastně čeká.

Na druhou stranu říjnový přišel příšerně pozdě - leč! - zkuste si do SEIR modelu zadat známé hodnoty a pak se podívat, co se tu mohlo stát - mrtvých mohlo být přes 100 tisíc; a pořád se to stát může, pokud uděláme nějakou katastrofální chybu. Pořád si nevedeme vůbec dobře, viz obrázek níže, vygenerovaný z oficiálních dat. Je na něm i dobře vidět, že nejen že každá chyba způsobí vlnu úmrtí, ale také to, že vlna poté neskončí a ještě dlouho po ní zůstává zvýšená úmrtnost obyvatel, tak jak postupně umírají lidé v nemocnicích po dlouhém boji s nemocí.

Matematický model různých situací s lockdowny: https://www.sciencedirect.com/science/article/pii/S0019057821000355

A tak dále. Našel jsem třeba tuhle stránku: https://www.wikiskripta.eu/w/Metodologie_v_epidemiologii

Tady se píše o lockdownech v různých zemích včetně Číny: https://www.japantimes.co.jp/news/2021/01/18/world/coronavirus-lockdown-success/

A tady je seznam: https://en.wikipedia.org/wiki/COVID-19_lockdowns#Table_of_pandemic_lockdowns 

Plošné testování

Hledal jsem hledal, studie efektivity plošného testování. A našel jsem poměrně rozsáhlou zde: 

https://cmmid.github.io/topics/covid19/Slovakia.html (odkaz v textu)
https://github.com/sbfnk/covid19.slovakia.mass.testing/pull/2

Dnes už ale nemám energii na to, abych jí celou přečetl, takže to nechám na vás - dejte vědět, co jste se dozvěděli ;-)

EDIT: Dostal jsem několik odkazů na kritiku této studie a související texty; jejím spoluautorem je ministr zdravotnictví SR; studie přehlíží další související jevy, které ovlivňují výsledek. Více viz následující odkazy:

Může jít o obrázek food a text that says '4500 Nové prípady 4000 3500 Nové prípady podl'a PCR testov Skutočné prípady podl'ap počtu hospitalizácii úmrtí nemocniciach 3000 2500 celoplošné testovanie Vianočny ockdown zatvorenie atvorenecasti predajni, kontakt kontaktvb linách celoplošnétestovaniel. celoplošné 2000. Lockdown zatvorené reštaurácie, rušené hromadné podujatie, rusko vexterié Novoročny lockdown zákaz_návštev zatvorene ubytovanie akaz ychadzania mimo okresu 1000 500 zvýšen testovania 14-tisc, tyżdnovy tyždnovypriemer priemer 2020 Výrazny pokles testovania- 9-tisíc, tyzdnovypriemer priemer 6.9.2020 2020 16.10.2020 5.11.2020 25.11.2020 15.12.2020 4.1.2021 24.1.2021 2021'

Závěr

Inu, nikdy není tak zle, aby nemohlo být hůř. A co chcete? Aby bylo líp nebo aby bylo hůř?

Pokud si pan ministr Blatný, jeho kolegové ve vládě a další podobní "výtečníci" myslí, že lhaní a nenaplněné sliby budou stále fungovat, jsou na omylu. Pokud dokonce věří tomu, co říkají, znamená to jen to, že tuto zemi vedou nezodpovědní šílenci. 

Nevím, která možnost je horší, ale nezbývá než buď tuto vládu vydržet a permanentně konfrontovat s realitou, nebo ji svrhnout, k čemuž se kupodivu obyvatelstvo nijak nemá.