The Guardian

Latest news, sport, business, comment, analysis and reviews from the Guardian, the world's leading liberal voice

The Browns are still the Browns. And Deshaun Watson is still Deshaun Watson

After three straight game-winning drives, Cleveland’s quarterback was sacked eight times in a dismal defeat that punctured the hype surrounding his revival

I guess the New York Jets didn’t get the memo. This was supposed to be a Deshaun Watson lovefest kind of day. A day where, much to the chagrin of those of us with a moral compass and a functional memory, football fans worldwide could declare Watson was “so back” and that the Browns were in some blinkered, alternate universe, a Super Bowl contender. No such luck, as the Browns looked like the Browns – reminding an otherwise jubilant city of Cleveland that they are trapped in the sports equivalent of the Backrooms.

Limping along for 155 passing yards and one touchdown, Watson fell to Earth harder than David Bowie in a Nicolas Roeg film (yes, I just watched the Dennis Miller Monday Night Football documentary on HBO). He completed fewer than 50% of his passes and ended the day with a 69.6 QBR. I should also probably mention he got sacked eight times. Yes, eight times. EIGHT TIMES. He only completed seven more passes than he received punishing hits behind the line of scrimmage. It was a performance NBC NFL writer Patrick Daugherty called “unspeakably bad.” Actually, I think the performance was very much speakable, as I’ve demonstrated here. Stick around for another 400 words.

Continue reading...

Premier League: 10 talking points from the weekend’s action

Manchester City unrepentant in victory, Spurs make progress of a sort and Noni Madueke meets the moment

The manner of Manchester City’s victory at Liverpool was an article of both vindication and vilification. Those gleefully wielding inflatable bananas in the Anfield away end could thumb their noses. Why not enjoy the dances of defiance until the music stops? The same went for City players, asked to perform under the darkest of clouds, able to focus, at last, on football, rather than legal argument and uncertain futures. Beyond City, the sight of a club found guilty of 100-plus charges laying waste to such rivals as Liverpool was deeply uncomfortable. The Premier League season and product are badly damaged until the matter is somehow resolved. What happened at Anfield should double the haste for a resolution. Chants of “cheat” whenever City players, the game already won, slipped the ball around, are bound to be repeated at other stadiums. Enzo Maresca has described his club’s plight as “noise” but his team’s victory did absolutely nothing to turn the volume down. John Brewin

Match report: Liverpool 0-3 Manchester City

Match report: Crystal Palace 3-1 Nottingham Forest

Match report: Hull City 2-2 Everton

Continue reading...

Is it true that … muscle turns into fat if you stop working out?

If you take a break from the gym you may lose muscle and gain fat, but it isn’t as simple as one turning into the other

‘This is not true,” says Prof Leigh Breen, a specialist in muscle physiology at the University of Leicester. But it’s a statement he hears a lot, particularly from people who have taken a long break from exercise. “They’ll often refer to the notion that their muscles have ‘softened’ or don’t feel as toned.”

The reality is that there’s no biochemistry linking the two types of tissue. Muscle and fat are distinct. “There’s no known process in the human body that would support muscle turning into fat, or vice versa,” says Breen.

Continue reading...

Roman fort found in Wales could prove myth of emperor’s camp is real

Exclusive: Finds suggest account in medieval folklore of a camp near Frenni Fawr hill was rooted in reality

Magnus Maximus, the Roman emperor who ruled Britain in the fourth century, led his troops against the Picts and Scots, but a theory that he also established a military camp near Frenni Fawr hill in Wales has so far been based on folklore.

Now fourth-century coins, among other finds at a newly identified Roman fort in Pembrokeshire, suggest the medieval tale was rooted in reality, to the excitement of archaeologists.

Continue reading...

Reclaimed

Stueyman has added a photo to the pool:

Reclaimed

Beach stairs at Halls Head

Found Slide 1969

Thomas Hawk posted a photo:

Found Slide 1969

Mangos Table Dance

Thomas Hawk posted a photo:

Mangos Table Dance

VK: Voorpagina

Volkskrant.nl biedt het laatste nieuws, opinie en achtergronden

Drie doden en 25 gewonden door Russische raketaanval op Charkiv

Wel.nl

Minder lezen, Meer weten.

Duitse minister van Arbeid stapt op om persoonlijke redenen

BERLIJN (ANP) - De Duitse minister van Arbeid en Sociale Zaken, Bärbel Bas, legt haar functie neer om persoonlijke redenen. Dat heeft ze haar partij maandagochtend laten weten, melden Duitse media. Naast minister is Bas ook medevoorzitter van de sociaaldemocratische SPD.

Reden voor haar vertrek is dat Bas tijd wil nemen om het verlies van haar stiefdochter te verwerken, meldt nieuwsblad Focus op basis van haar schrijven aan de SPD. "Ik besef dat ik tijd nodig heb om mijn rouw te verwerken", schrijft Bas, die stelt dat het verlies komt in een tijd waarin zij ook politiek flink wordt aangevallen.

"Omdat het me aan de kracht ontbreekt om op korte termijn mijn overheids- en partijtaken volledig uit te voeren, heb ik besloten me terug te trekken uit beide posities", aldus Bas.

Bas is sinds mei 2025 minister, eerder was zij voorzitter van de Bondsdag. Sinds juni 2025 bekleedde ze de functie van SPD-voorzitter.


The Daily WTF

Curious Perversions in Information Technology

CodeSOD: A Type of Type Safety

For some godawful reason, people like to explain object oriented concepts via analogy to biological taxonomies. I suppose it's easy to understand an "is-a" relationship (a cat is a mammal), but the down side is you get a complex and increasingly leaky analogy that over-emphasizes the importance of inheritance.

That's not to slight Alan's choice of using it to anoymize today's code. It's just a broad frustration on my part.

In any case, Alan has been working in a C++ codebase that's written by people who maybe don't fully understand all the key object oriented concepts. That's why you get code like this:

    /*
     * If possible, steal tentacle from the given animal.
     */
    void Animal::StealTentacle(Animal *animal) {
        // only Octopus and Squid can have tentacles
        if (!IS_INSTANCE_OF(this, Octopus) && !IS_INSTANCE_OF(this, Squid)) {
            return;
        }

        Limb *limb = animal->mLimbs->GetFirstTentacle();
        if (limb) {
            limb->AttachToAnimal(this);
            // . . .

This function takes a raw pointer to an Animal object. If that pointer is not an Octopus or a Squid, we bail. Otherwise, we're going to take its tentacle, and do stuff with it.

Now, this is a pretty clear example of the type switch anti-pattern. Instead of using the type system and polymorphism to enforce restrictions, we instead do runtime type checks.

But wait a second, what's going on in that IS_INSTANCE_OF?

    // I've noticed that dynamic_cast always returns a valid result when
    // casting an "objectPointer" of type "className".
    // Try casting it to a [Organism *] to force it to work. (?)
    #define IS_INSTANCE_OF(objectPointer, className)    ((bool) (dynamic_cast<className *>(((Organism *) objectPointer)) != NULL))
    #define IS_MEMBER_OF(objectPointer, className)      IS_INSTANCE_OF(objectPointer, className)    // temporary macro alias

This code attempts to take an objectPointer and first, force it into a pointer to our base type (Organism), using a C-style cast. Now, in C++, C-style casts are a shorthand, and the compiler will, based on the context, attempt to do the best cast which fits the situation, starting with a const_cast (which only alters the constness of the type), and failing all the way up to a reinterpret_cast- which just ignores type information entirely and assumes you know what you're doing.

Which this developer clearly doesn't.

In any case, we pass the C-style cast result into the dynamic_cast function, which attempts to cast that pointer into an instance of className. If no such conversion is possible (because they're not part of the same inheritance hiercharcy), it returns NULL, which is what they're checking.

Their comment highlights their misunderstanding of the function; dynamic_cast can be used to crosscast. In other words, dynamic_cast<Dog*>(my_cat) will actually work, because (in this example) Dog* and Cat* share a common base.

From the docs:

Otherwise, if expression points/refers to a public base class subobject of the most derived object, and the type of the most derived object has an unambiguous and public base class of type Target, the result points/refers to the Target subobject of the most derived object. In other words, dynamic_cast can be used to crosscast (or side-cast) pointers/references, between two types derived from the same base.

You shouldn't be using dynamic cast to solve this problem. Hell, you sohuldn't be doing any of this in the first place!

In any case, in actual usage, the developers responsible do stuff like this:

    if (IS_INSTANCE_OF(animal, Felid)) {
        Felid *cat = (Felid *) animal; // Yes another C-style cast - this time (hopefully) devolving to the same dynamic_cast hidden inside the expansion of the previous macro.

I love when a comment says "hopefully". "This hopefully does what I think it should do".

I'll let Alan summarize the problems:

Used prudently, the dynamic dispatch facility that object oriented languages provide their users can be a valuable tool for capturing the domain model in clean, elegant code. However, as even C++'s designer Bjarne Stroustrup acknowledged, in "The Design and Evolution of C++", the introduction of support for Run-Time Type Information makes it possible to spurn such assistance and write RTTI-based code for which a verdict of "combines the syntactic elegance of C with the run-time efficiency of Smalltalk" is just "too kind".

[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.