Rijnmond - Nieuws

Het laatste nieuws van vandaag over Rotterdam, Feyenoord, het verkeer en het weer in de regio Rijnmond

Defensie legt uit: dit is waarom de gevechtshelikopters al om 05.00 uur boven de regio vlogen

Donderdagochtend vroeg werd de regio Rijnmond opgeschrikt door een militaire oefening met helikopters. Het ging om een anti-terreuroefening van de luchtmacht, waarbij onder meer een gijzeling werd nagebootst. "Bij schemering zitten mensen in hun diepste slaap, ook de vijand."

Aanhanger schiet los van bestelbus, snelweg deels dicht

Een ongeval met een losgeschoten aanhanger zorgt voor een lange file op de A29.

Wel.nl

Minder lezen, Meer weten.

Advies aan kabinet: pas handelsbeleid aan voor concurrentie China

DEN HAAG (ANP) - Nederland en Europa zouden hun handelsbeleid moeten veranderen nu landen als de Verenigde Staten en China hun economische macht steeds vaker inzetten als geopolitiek wapen. Dat vindt de Wetenschappelijke Raad voor het Regeringsbeleid (WRR). In een rapport aan het kabinet adviseert de WRR donderdag dat Nederland en Europa bijvoorbeeld veel strengere voorwaarden aan China zouden moeten stellen voor handel met de EU en Chinese bedrijven dezelfde eisen en verboden moeten opleggen die dat land oplegt aan Europese bedrijven.

Zonder veranderingen in het handelsbeleid lopen Nederland en Europa het risico een belangrijk deel van de Europese industrie kwijt te raken, nog afhankelijker te worden van andere landen en belangrijke kwesties als privacy en milieubescherming op het spel te zetten, stelt het adviesorgaan.

Europa en Nederland moeten daarnaast beter beleid rond innovatie voeren, vindt de WRR. Nu opereren Europese landen nog te los van elkaar. Zet in op meer samenhang, aldus de adviseurs.


Qantas boekt laagste winst in 4 jaar door hoge brandstofprijzen

CANBERRA (ANP/AFP/BLOOMBERG) - De Australische luchtvaartmaatschappij Qantas heeft de winst in het afgelopen boekjaar zien dalen tot het laagste niveau in vier jaar. De winstdaling werd veroorzaakt door hogere brandstofkosten door de sterke stijging van de olieprijzen vanwege de oorlog in het Midden-Oosten.

De oudste en grootste luchtvaartmaatschappij van Australië verwacht dat de brandstofprijzen tot eind dit jaar hoog zullen blijven. Hogere ticketprijzen op sommige routes en het schrappen van een aantal vluchten waren volgens Qantas niet voldoende om de gestegen brandstofkosten volledig op te vangen.

Ondanks de geopolitieke onrust is de vraag naar reizen volgens Qantas veerkrachtig gebleven. Zo blijft de vraag naar internationale routes en naar vluchten van Jetstar, de budgetmaatschappij van Qantas, sterk door reizigers die routes via het Midden-Oosten vermijden.

In het boekjaar, dat liep tot eind juni, daalde de nettowinst met bijna 20 procent tot 1,29 miljard Australische dollar (800 miljoen euro).


Dalai Lama betuigt medeleven na overstromingen Nepal en Tibet

DHARAMSHALA (ANP/AFP) - De Dalai Lama heeft zijn medeleven betuigd na de overstromingen in Nepal en Tibet. "Ik bid voor iedereen die het leven heeft verloren en betuig mijn medeleven en oprechte deelneming aan de nabestaanden en iedereen die door deze tragedie is getroffen", aldus de spirituele leider van Tibetaanse boeddhisten in een verklaring.

De enorme overstromingen van woensdag in het grensgebied tussen Nepal en Tibet hebben zeker 165 mensen het leven gekost. Er zijn bijna 1400 vermisten gemeld. In zowel Nepal als Tibet vinden nog reddingsacties plaats. Door het natuurgeweld zijn onder meer bruggen verwoest, dammen beschadigd en huizen bedolven onder de modder.

De Dalai Lama (91) woont in India sinds hij Tibet in 1959 ontvluchtte na een mislukte opstand tegen de Chinese autoriteiten. Beijing beschouwt hem als een separatist en wil een rol bij het bepalen wie zijn opvolger wordt. De Dalai Lama roept zijn volgelingen juist op een door Beijing aangewezen opvolger af te wijzen.


Found Ektachrome Slide

Thomas Hawk posted a photo:

Found Ektachrome Slide

handwritten on slide, “Belle of Louisville" date stamped on slide July 1973

You know I dreamed about youfor twenty-nine years beforeI saw you

Thomas Hawk posted a photo:

You know I dreamed about youfor twenty-nine years beforeI saw you

Frontaal Naakt

Fundamentalistisch-hedonistisch webmagazine voor de hele familie

ANP zegt je dacht toch niet echt dat we dat meenden, van die redelijkheid, sukkel

Peter Breedveld Het ANP maakt niet alleen jacht op bloggers die foto’s pikken om die een poot uit te draaien. Ook als je in het kader van je citaatrecht een screenshot plaatst waarop per ongeluk een ANP-foto figureert, ben je de pineut. Ik let altijd heel scherp op dat ik niet zonder toestemming foto’s waar auteursrecht op rust op Frontaal Naakt zet. Blijkbaar niet altijd scherp genoeg, want ik kreeg onlangs een mail van het ANP dat ik zijn copyright had geschonden. Of ik even 377 euro wilde aftikken om een licentie aan te schaffen én die foto’s meteen wilde verwijderen. Het bleek onder andere om een jaren oude foto te gaan waarop Hitler-groupie Joost Niemöller zijn complotboek over de MH17 overhandigt aan Harry van Bommel en Pieter Omtzigt. Die foto ging overal rond op sociale media en ik had er geen seconde bij stilgestaan dat het een foto van een persfotograaf was. Dom en slordig van mij, mijn fout, moet ik voor betalen. Terecht, geen discussie hierover. Auteursrecht moet worden beschermd en gehandhaafd. Citaatrecht Maar daarnaast bleek het om een aantal screenshots te gaan die ik had gemaakt van de ankeilers van nieuwsberichten over vrouwen die aangifte wilden doen […]

Het bericht ANP zegt je dacht toch niet echt dat we dat meenden, van die redelijkheid, sukkel verscheen eerst op Frontaal Naakt.

The Daily WTF

Curious Perversions in Information Technology

CodeSOD: The Big Family

Some time ago, Charles shared with us some awful PHP, aka the most common sort. Today's code sample is maybe a little too big to sum up, but I'll let Charles take a crack at it.

It's so bad that even analyzing and laughing at it feels impossible. But it’s so bad, I couldn’t not share it.

I’m the only one handling all the IT-related tasks at my company, and I don’t have anyone here to vent or laugh about this kind of thing with. So, I figured, why not share it here? I’m hoping it’ll provide at least a little bit of catharsis or some dark humor.

To make sure the confidentiality of the codebase was respected, I took the liberty of generalizing it. You might notice some inconsistencies, but that’s just me trying to keep things neutral while protecting the original structure and functionality. Apologies if it looks a bit patchy – the goal was to avoid revealing any specific details or sensitive code.

The whole block is north of 400 lines, and it's doing a lot. Or well, maybe it's not, as you'll see.

Let's star with the outermost layer.

$resm_data = $data_source->fetchData("group=" . $item_id);
foreach ($resm_data as $key => $value) {
// rest of the code here
}

We fetch data from a data source, presumably a database, passing our condition as a string, which reeks of probable SQL injection, but I don't know what library they're using. I also note they're using the key/value style of array iteration, but never actually check the key.

    $option_id = $value->option_id;
    $resm_details = $detail_source->fetch($option_id);
    if ($resm_details) {
        $label = $resm_details->{"label$lang"};
        $description = $resm_details->{"description$lang"};
        $category = $resm_details->category;

Nice little bit of "meta" programming to get their localization working, it'll fetch labelen or labelde as needed. Definitely not a horrible, dangerous way to solve that problem.

We use that again to get our currency figured out. That lets us do number formatting. So much number formatting code.

        if ($category == 0) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = $resm_details->{"child_cost" . $currency};
            $cost_info =
                $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol . " - " .
                $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 1) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 2) {
            $cost = 0;
            $child_cost = $resm_details->{"child_cost" . $currency};
            $cost_info = $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 4) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[500] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        } elseif (
            $resm_details->{"cost" . $currency} == 0 and
            $resm_details->{"child_cost" . $currency} == 0
        ) {
            $cost = 0;
            $child_cost = 0;
            $cost_info = "";
        } else {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[200] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        }

What is the $mot array? Why am I jumping to seemingly random locations in that array? Clearly it contains some headers for our output.

Anyway, there's plenty of HTML string munging happening too, don't you worry.

        if ($location == 1) {
            $quantity_block =
                '<div class="quantity-container">
                    <input type="text" value="1" id="quantity-' . $option_id . '" class="qty-control" name="quantity" min="1" max="1">
                    <div class="increase button">+</div>
                    <div class="decrease button">-</div>
                </div>';
            $quantity = 1;
        } else {
            $quantity_block = "";
            $quantity = "all";
        }

And then there's this little treat for parsing the time stored in our database: $time_data = json_decode($resm_details->time_data); That tells me they're storing date times as strings, so that's fun.

There are also a couple more bon mots as they build a drop down list:

            $departure_select = '<option value="-1">' . $mot[300] . '</option>';
            $arrival_select = '<option value="-1">' . $mot[301] . '</option>';

And then there's this monstrosity:

        // Add the main option to the template
        $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS", [
            "ID" => $option_id,
            "QUANTITY" => $quantity,
            "LABEL_CLASS" => $label_class,
            "ACTION_CLASS" => $action_class,
            "LABEL" => $label,
            "DESCRIPTION" => $description,
            "QUANTITY_BLOCK" => $quantity_block,
            "COST_INFO" => $cost_info,
            "HOST_COST_DISPLAY" => $host_cost_display,
            "COST" => $cost,
            "CHILD_COST" => $child_cost,
            "LOCATION" => $location,
            "CATEGORY" => $category,
            "HOST_CLASS" => $host_class,
            "EXTRA" => $extra,
            "HOST_EXTRA" => $host_extra,
            "TIME_CHECKED" => ($has_times == 1) ? 'selected="' . $option_id . '" checked="true"' : '',
            "TIME_BLOCK" => $time_block
        ]);

All the nonsense that we concatenate together above gets shoved into some sort of template. And after that, that's where the good stuff starts. Because guess what? We have to do the same thing for child items.

        $resm_children_data = $data_source->fetchData("parent=" . $option_id);
        foreach ($resm_children_data as $child_key => $child_value) {
            $child_option_id = $child_value->option_id;
            $resm_child_details = $detail_source->fetch($child_option_id);

That's right, it's the same block of code, not quite copy/pasted, since they needed to put the word child in everything.

                // Add the child option to the template
                $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [
                    "ID" => $child_option_id,
                    "QUANTITY" => $child_quantity,
                    "LABEL_CLASS" => $child_label_class,
                    "ACTION_CLASS" => $child_action_class,
                    "LABEL" => $child_label,
                    "DESCRIPTION" => $child_description,
                    "QUANTITY_BLOCK" => $child_quantity_block,
                    "COST_INFO" => $child_cost_info,
                    "HOST_COST_DISPLAY" => $child_host_cost_display,
                    "COST" => $child_cost,
                    "CHILD_COST" => $child_extra_cost,
                    "LOCATION" => $child_location,
                    "CATEGORY" => $child_category,
                    "HOST_CLASS" => $child_host_class,
                    "EXTRA" => $child_extra,
                    "HOST_EXTRA" => $child_host_extra,
                    "TIME_CHECKED" => ($child_has_times == 1) ? 'selected="' . $child_option_id . '" checked="true"' : '',
                    "TIME_BLOCK" => $child_time_block
                ]);

And now, if you liked the child record, guess what? Those children have got siblings. What can I say, it's a big family.

                $resm_sibling_data = $data_source->fetchData("parent=" . $parent_option_id);
                foreach ($resm_sibling_data as $sibling_key => $sibling_value) {
                    $sibling_option_id = $sibling_value->option_id;
                    $resm_sibling_details = $detail_source->fetch($sibling_option_id);

And that means, yes, we also use that template thing again:

                        // Add the sibling option to the template
                        $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [
                            "ID" => $sibling_option_id,
                            "QUANTITY" => $sibling_quantity,
                            "LABEL_CLASS" => $sibling_label_class,
                            "ACTION_CLASS" => $sibling_action_class,
                            "LABEL" => $sibling_label,
                            "DESCRIPTION" => $sibling_description,
                            "QUANTITY_BLOCK" => $sibling_quantity_block,
                            "COST_INFO" => $sibling_cost_info,
                            "HOST_COST_DISPLAY" => $sibling_host_cost_display,
                            "COST" => $sibling_cost,
                            "SIBLING_COST" => $sibling_extra_cost,
                            "LOCATION" => $sibling_location,
                            "CATEGORY" => $sibling_category,
                            "HOST_CLASS" => $sibling_host_class,
                            "EXTRA" => $sibling_extra,
                            "HOST_EXTRA" => $sibling_host_extra,
                            "TIME_CHECKED" => ($sibling_has_times == 1) ? 'selected="' . $sibling_option_id . '" checked="true"' : '',
                            "TIME_BLOCK" => $sibling_time_block
                        ]);

Someday, I hope the person who wrote this learn about methods and function calls. Maybe they could write their own one day.

In any case, here's the whole thing:

$resm_data = $data_source->fetchData("group=" . $item_id);
foreach ($resm_data as $key => $value) {
    $option_id = $value->option_id;
    $resm_details = $detail_source->fetch($option_id);
    if ($resm_details) {
        $label = $resm_details->{"label$lang"};
        $description = $resm_details->{"description$lang"};
        $category = $resm_details->category;

        // Process cost based on category
        if ($category == 0) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = $resm_details->{"child_cost" . $currency};
            $cost_info =
                $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol . " - " .
                $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 1) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[101] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 2) {
            $cost = 0;
            $child_cost = $resm_details->{"child_cost" . $currency};
            $cost_info = $mot[102] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
        } elseif ($category == 4) {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[500] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        } elseif (
            $resm_details->{"cost" . $currency} == 0 and
            $resm_details->{"child_cost" . $currency} == 0
        ) {
            $cost = 0;
            $child_cost = 0;
            $cost_info = "";
        } else {
            $cost = $resm_details->{"cost" . $currency};
            $child_cost = 0;
            $cost_info = $mot[200] . " : +" . number_format($cost, 2, ",", " ") . $currency_symbol;
        }

        $location = $resm_details->location;
        $label_class = $location == 1 ? "has-quantity" : "no-quantity";
        $action_class = $location == 1 ? "active-with-quantity" : "active-no-quantity";
        if ($location == 1) {
            $quantity_block =
                '<div class="quantity-container">
                    <input type="text" value="1" id="quantity-' . $option_id . '" class="qty-control" name="quantity" min="1" max="1">
                    <div class="increase button">+</div>
                    <div class="decrease button">-</div>
                </div>';
            $quantity = 1;
        } else {
            $quantity_block = "";
            $quantity = "all";
        }

        $has_times = $resm_details->has_times;

        if ($has_times == 1) {
            $time_counter++;
            $time_data = json_decode($resm_details->time_data);

            $departure_select = '<option value="-1">' . $mot[300] . '</option>';
            $arrival_select = '<option value="-1">' . $mot[301] . '</option>';

            $departures = $time_data->departures;
            $arrivals = $time_data->arrivals;

            foreach ($departures as $dep_key => $departure) {
                $departure_select .= '<option value="' . $dep_key . '">' . $departure . '</option>';
            }

            foreach ($arrivals as $arr_key => $arrival) {
                $arrival_select .= '<option value="' . $arr_key . '">' . $arrival . '</option>';
            }

            $departure_block = '<div class="col-half time-select-' . $option_id . '" style="padding-right: 0;">
                <select class="form-control time-departure" style="text-align: center;">' . $departure_select . '</select>
                </div>';

            $arrival_block = '<div class="col-half time-select-' . $option_id . '" style="padding-left: 0;">
                <select class="form-control time-arrival" style="text-align: center;">' . $arrival_select . '</select>
                </div>';

            $time_block = '<div class="row time-container">
                ' . $departure_block . $arrival_block . '
            </div><small class="error-message time-error">' . $mot[302] . '</small>';
        } else {
            $time_block = '';
        }

        $host_cost_display = "";
        $extra = $resm_details->extra;
        $host_extra = $resm_details->host_extra;
        $host_class = "";

        if ($extra == 1) {
            $extra_cost_1 = $resm_details->{"cost" . $currency . "_1"};
            $extra_cost_2 = $resm_details->{"cost" . $currency . "_2"};

            $default_extra = $host_price == 0 ? $extra_cost_2 : $extra_cost_1;
            $cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_extra, 2, ",", " ") .
                "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="child-cost">0.00</span>' . $currency_symbol;

            $host_class = " extra-option";
        }
        if ($host_extra == 1) {
            $host_cost_display =
                '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol .
                "</span><br>";
        }

        // Add the main option to the template
        $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS", [
            "ID" => $option_id,
            "QUANTITY" => $quantity,
            "LABEL_CLASS" => $label_class,
            "ACTION_CLASS" => $action_class,
            "LABEL" => $label,
            "DESCRIPTION" => $description,
            "QUANTITY_BLOCK" => $quantity_block,
            "COST_INFO" => $cost_info,
            "HOST_COST_DISPLAY" => $host_cost_display,
            "COST" => $cost,
            "CHILD_COST" => $child_cost,
            "LOCATION" => $location,
            "CATEGORY" => $category,
            "HOST_CLASS" => $host_class,
            "EXTRA" => $extra,
            "HOST_EXTRA" => $host_extra,
            "TIME_CHECKED" => ($has_times == 1) ? 'selected="' . $option_id . '" checked="true"' : '',
            "TIME_BLOCK" => $time_block
        ]);

        $resm_children_data = $data_source->fetchData("parent=" . $option_id);
        foreach ($resm_children_data as $child_key => $child_value) {
            $child_option_id = $child_value->option_id;
            $resm_child_details = $detail_source->fetch($child_option_id);
            if ($resm_child_details) {
                $child_label = $resm_child_details->{"label$lang"};
                $child_description = $resm_child_details->{"description$lang"};
                $child_category = $resm_child_details->category;

                // Process cost for child category
                if ($child_category == 0) {
                    $child_cost = $resm_child_details->{"cost" . $currency};
                    $child_extra_cost = $resm_child_details->{"child_cost" . $currency};
                    $child_cost_info =
                        $mot[101] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol . " - " .
                        $mot[102] . " : +" . number_format($child_extra_cost, 2, ",", " ") . $currency_symbol;
                } elseif ($child_category == 1) {
                    $child_cost = $resm_child_details->{"cost" . $currency};
                    $child_extra_cost = 0;
                    $child_cost_info = $mot[101] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
                } elseif ($child_category == 2) {
                    $child_cost = 0;
                    $child_extra_cost = $resm_child_details->{"child_cost" . $currency};
                    $child_cost_info = $mot[102] . " : +" . number_format($child_extra_cost, 2, ",", " ") . $currency_symbol;
                } elseif ($child_category == 4) {
                    $child_cost = $resm_child_details->{"cost" . $currency};
                    $child_extra_cost = 0;
                    $child_cost_info = $mot[500] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
                } elseif (
                    $resm_child_details->{"cost" . $currency} == 0 and
                    $resm_child_details->{"child_cost" . $currency} == 0
                ) {
                    $child_cost = 0;
                    $child_extra_cost = 0;
                    $child_cost_info = "";
                } else {
                    $child_cost = $resm_child_details->{"cost" . $currency};
                    $child_extra_cost = 0;
                    $child_cost_info = $mot[200] . " : +" . number_format($child_cost, 2, ",", " ") . $currency_symbol;
                }

                $child_location = $resm_child_details->location;
                $child_label_class = $child_location == 1 ? "has-quantity" : "no-quantity";
                $child_action_class = $child_location == 1 ? "active-with-quantity" : "active-no-quantity";
                if ($child_location == 1) {
                    $child_quantity_block =
                        '<div class="quantity-container">
                    <input type="text" value="1" id="child-quantity-' . $child_option_id . '" class="qty-control" name="quantity" min="1" max="1">
                    <div class="increase button">+</div>
                    <div class="decrease button">-</div>
                </div>';
                    $child_quantity = 1;
                } else {
                    $child_quantity_block = "";
                    $child_quantity = "all";
                }

                $child_has_times = $resm_child_details->has_times;

                if ($child_has_times == 1) {
                    $child_time_counter++;
                    $child_time_data = json_decode($resm_child_details->time_data);

                    $child_departure_select = '<option value="-1">' . $mot[300] . '</option>';
                    $child_arrival_select = '<option value="-1">' . $mot[301] . '</option>';

                    $child_departures = $child_time_data->departures;
                    $child_arrivals = $child_time_data->arrivals;

                    foreach ($child_departures as $child_dep_key => $child_departure) {
                        $child_departure_select .= '<option value="' . $child_dep_key . '">' . $child_departure . '</option>';
                    }

                    foreach ($child_arrivals as $child_arr_key => $child_arrival) {
                        $child_arrival_select .= '<option value="' . $child_arr_key . '">' . $child_arrival . '</option>';
                    }

                    $child_departure_block = '<div class="col-half time-select-' . $child_option_id . '" style="padding-right: 0;">
                <select class="form-control time-departure" style="text-align: center;">' . $child_departure_select . '</select>
                </div>';

                    $child_arrival_block = '<div class="col-half time-select-' . $child_option_id . '" style="padding-left: 0;">
                <select class="form-control time-arrival" style="text-align: center;">' . $child_arrival_select . '</select>
                </div>';

                    $child_time_block = '<div class="row time-container">
                ' . $child_departure_block . $child_arrival_block . '
            </div><small class="error-message time-error">' . $mot[302] . '</small>';
                } else {
                    $child_time_block = '';
                }

                $child_host_cost_display = "";
                $child_extra = $resm_child_details->extra;
                $child_host_extra = $resm_child_details->host_extra;
                $child_host_class = "";

                if ($child_extra == 1) {
                    $child_extra_cost_1 = $resm_child_details->{"cost" . $currency . "_1"};
                    $child_extra_cost_2 = $resm_child_details->{"cost" . $currency . "_2"};

                    $default_child_extra = $host_price == 0 ? $child_extra_cost_2 : $child_extra_cost_1;
                    $child_cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_child_extra, 2, ",", " ") .
                        "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="child-cost">0.00</span>' . $currency_symbol;

                    $child_host_class = " extra-option";
                }
                if ($child_host_extra == 1) {
                    $child_host_cost_display =
                        '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol .
                        "</span><br>";
                }

                // Add the child option to the template
                $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [
                    "ID" => $child_option_id,
                    "QUANTITY" => $child_quantity,
                    "LABEL_CLASS" => $child_label_class,
                    "ACTION_CLASS" => $child_action_class,
                    "LABEL" => $child_label,
                    "DESCRIPTION" => $child_description,
                    "QUANTITY_BLOCK" => $child_quantity_block,
                    "COST_INFO" => $child_cost_info,
                    "HOST_COST_DISPLAY" => $child_host_cost_display,
                    "COST" => $child_cost,
                    "CHILD_COST" => $child_extra_cost,
                    "LOCATION" => $child_location,
                    "CATEGORY" => $child_category,
                    "HOST_CLASS" => $child_host_class,
                    "EXTRA" => $child_extra,
                    "HOST_EXTRA" => $child_host_extra,
                    "TIME_CHECKED" => ($child_has_times == 1) ? 'selected="' . $child_option_id . '" checked="true"' : '',
                    "TIME_BLOCK" => $child_time_block
                ]);

                $resm_sibling_data = $data_source->fetchData("parent=" . $parent_option_id);
                foreach ($resm_sibling_data as $sibling_key => $sibling_value) {
                    $sibling_option_id = $sibling_value->option_id;
                    $resm_sibling_details = $detail_source->fetch($sibling_option_id);
                    if ($resm_sibling_details) {
                        $sibling_label = $resm_sibling_details->{"label$lang"};
                        $sibling_description = $resm_sibling_details->{"description$lang"};
                        $sibling_category = $resm_sibling_details->category;

                        // Process cost for sibling category
                        if ($sibling_category == 0) {
                            $sibling_cost = $resm_sibling_details->{"cost" . $currency};
                            $sibling_extra_cost = $resm_sibling_details->{"sibling_cost" . $currency};
                            $sibling_cost_info =
                                $mot[101] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol . " - " .
                                $mot[102] . " : +" . number_format($sibling_extra_cost, 2, ",", " ") . $currency_symbol;
                        } elseif ($sibling_category == 1) {
                            $sibling_cost = $resm_sibling_details->{"cost" . $currency};
                            $sibling_extra_cost = 0;
                            $sibling_cost_info = $mot[101] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol;
                        } elseif ($sibling_category == 2) {
                            $sibling_cost = 0;
                            $sibling_extra_cost = $resm_sibling_details->{"sibling_cost" . $currency};
                            $sibling_cost_info = $mot[102] . " : +" . number_format($sibling_extra_cost, 2, ",", " ") . $currency_symbol;
                        } elseif ($sibling_category == 4) {
                            $sibling_cost = $resm_sibling_details->{"cost" . $currency};
                            $sibling_extra_cost = 0;
                            $sibling_cost_info = $mot[500] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol;
                        } elseif (
                            $resm_sibling_details->{"cost" . $currency} == 0 and
                            $resm_sibling_details->{"sibling_cost" . $currency} == 0
                        ) {
                            $sibling_cost = 0;
                            $sibling_extra_cost = 0;
                            $sibling_cost_info = "";
                        } else {
                            $sibling_cost = $resm_sibling_details->{"cost" . $currency};
                            $sibling_extra_cost = 0;
                            $sibling_cost_info = $mot[200] . " : +" . number_format($sibling_cost, 2, ",", " ") . $currency_symbol;
                        }

                        $sibling_location = $resm_sibling_details->location;
                        $sibling_label_class = $sibling_location == 1 ? "has-quantity" : "no-quantity";
                        $sibling_action_class = $sibling_location == 1 ? "active-with-quantity" : "active-no-quantity";
                        if ($sibling_location == 1) {
                            $sibling_quantity_block =
                                '<div class="quantity-container">
                    <input type="text" value="1" id="sibling-quantity-' . $sibling_option_id . '" class="qty-control" name="quantity" min="1" max="1">
                    <div class="increase button">+</div>
                    <div class="decrease button">-</div>
                </div>';
                            $sibling_quantity = 1;
                        } else {
                            $sibling_quantity_block = "";
                            $sibling_quantity = "all";
                        }

                        $sibling_has_times = $resm_sibling_details->has_times;

                        if ($sibling_has_times == 1) {
                            $sibling_time_counter++;
                            $sibling_time_data = json_decode($resm_sibling_details->time_data);

                            $sibling_departure_select = '<option value="-1">' . $mot[300] . '</option>';
                            $sibling_arrival_select = '<option value="-1">' . $mot[301] . '</option>';

                            $sibling_departures = $sibling_time_data->departures;
                            $sibling_arrivals = $sibling_time_data->arrivals;

                            foreach ($sibling_departures as $sibling_dep_key => $sibling_departure) {
                                $sibling_departure_select .= '<option value="' . $sibling_dep_key . '">' . $sibling_departure . '</option>';
                            }

                            foreach ($sibling_arrivals as $sibling_arr_key => $sibling_arrival) {
                                $sibling_arrival_select .= '<option value="' . $sibling_arr_key . '">' . $sibling_arrival . '</option>';
                            }

                            $sibling_departure_block = '<div class="col-half time-select-' . $sibling_option_id . '" style="padding-right: 0;">
                <select class="form-control time-departure" style="text-align: center;">' . $sibling_departure_select . '</select>
                </div>';

                            $sibling_arrival_block = '<div class="col-half time-select-' . $sibling_option_id . '" style="padding-left: 0;">
                <select class="form-control time-arrival" style="text-align: center;">' . $sibling_arrival_select . '</select>
                </div>';

                            $sibling_time_block = '<div class="row time-container">
                ' . $sibling_departure_block . $sibling_arrival_block . '
            </div><small class="error-message time-error">' . $mot[302] . '</small>';
                        } else {
                            $sibling_time_block = '';
                        }

                        $sibling_host_cost_display = "";
                        $sibling_extra = $resm_sibling_details->extra;
                        $sibling_host_extra = $resm_sibling_details->host_extra;
                        $sibling_host_class = "";

                        if ($sibling_extra == 1) {
                            $sibling_extra_cost_1 = $resm_sibling_details->{"cost" . $currency . "_1"};
                            $sibling_extra_cost_2 = $resm_sibling_details->{"cost" . $currency . "_2"};

                            $default_sibling_extra = $host_price == 0 ? $sibling_extra_cost_2 : $sibling_extra_cost_1;
                            $sibling_cost_info = $mot[101] . ' : +<span class="extra-cost">' . number_format($default_sibling_extra, 2, ",", " ") .
                                "</span>" . $currency_symbol . " - " . $mot[102] . ' : +<span class="sibling-cost">0.00</span>' . $currency_symbol;

                            $sibling_host_class = " extra-option";
                        }
                        if ($sibling_host_extra == 1) {
                            $sibling_host_cost_display =
                                '<span class="host-cost">' . $mot[500] . ' : +<span class="host-price">0.00</span>' . $currency_symbol .
                                "</span><br>";
                        }

                        // Add the sibling option to the template
                        $TEMPLATE->SET_BLOCK_VARIABLES("Block_OPTIONS.Block_OPTIONS_CHILD", [
                            "ID" => $sibling_option_id,
                            "QUANTITY" => $sibling_quantity,
                            "LABEL_CLASS" => $sibling_label_class,
                            "ACTION_CLASS" => $sibling_action_class,
                            "LABEL" => $sibling_label,
                            "DESCRIPTION" => $sibling_description,
                            "QUANTITY_BLOCK" => $sibling_quantity_block,
                            "COST_INFO" => $sibling_cost_info,
                            "HOST_COST_DISPLAY" => $sibling_host_cost_display,
                            "COST" => $sibling_cost,
                            "SIBLING_COST" => $sibling_extra_cost,
                            "LOCATION" => $sibling_location,
                            "CATEGORY" => $sibling_category,
                            "HOST_CLASS" => $sibling_host_class,
                            "EXTRA" => $sibling_extra,
                            "HOST_EXTRA" => $sibling_host_extra,
                            "TIME_CHECKED" => ($sibling_has_times == 1) ? 'selected="' . $sibling_option_id . '" checked="true"' : '',
                            "TIME_BLOCK" => $sibling_time_block
                        ]);
                    }
                }
            }
        }
    }
}
[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

Daar is: Project 2029 van Mona Keijzer

Social

Niemand liever die ons suikerbroodje mag voorzien van een dikke klodder roomboter dan Mona Keijzer. Niemand anders die we PALINGPOPULIST horen roepen terwijl we haring happen op de Dijk. De enige met wie we richting Hell & BBBack willen gaan. Mona Keijzer, wuif de palmbladeren en roep haar naam. Het logo van de nieuwe partij is een soort olijfboom, waarbij de stam staat voor rechtse politiek in het algemeen, de vertakkingen voor de stromingen (liberaal, sociaal-conservatief, wappie, populistisch, enz.) en de bladeren staan voor alle partijen en splintergroepjes van VVD tot DNA. En een van die prachtige potente bladeren aan die boom van Politiek Plezier wordt dus Project 2029 van Mona Keijzer, die gaat strijden tegen de 'kille modellenwerkelijkheid'. Wacht, een partij is er nog niet, wel een ideologie. En een beweging. En er is geld nodig. En dan wordt alles anders. Dit keer echt, dit keer echt. De hamvraag is immers: hoe groot is de kans van slagen? "Groot, er is zo’n behoefte aan verandering in dit land, geleid door nuchtere verstandige mensen, die weten hoe het werkt." Gouke Moes bijvoorbeeld. We horen het al. We zijn om.

Social

GraphQL onder de loep (deel 3): zes uitdagingen bij schema-ontwerp | developer.overheid.nl

Original Mastodon Post

Goedemorgen! De dag starten met een crashcourse GraphQL? Dan hebben wij een interessante blogpost voor je klaarstaan.

🔍 GraphQL werkt transportlayer-agnostisch. Hierdoor kan het geen gebruik maken van headers, statuscodes, media-types en andere mechanismen van HTTP die je in REST gebruikt om standaard functionaliteit te bouwen.

Meer hierover lees je in deel 3 van onze GraphQL reeks:
developer.overheid.nl/blog/202

#api #graphql #rest #http #govtech

Slashdot

News for nerds, stuff that matters

Bill Gates Proposes Major Limits On AI Development

An anonymous reader quotes a report from CNN: Microsoft co-founder Bill Gates argued on Wednesday that artificial intelligence needs significant limits or else the harm to humans will outweigh any potential good. "AI will either be the greatest equalizer ever invented, or the worst source of injustice," he said in a 6,000-word essay, entitled "The turbulent AI era is here. The choices we make now are critical." [...] "Even under the best circumstances, the transition to this new AI era will be one of the most turbulent times in human history," he said, adding that "I don't see evidence that leaders, experts, and communities are confronting the challenges adequately. There is no plan to ease the entry into the AI era." AI can provide great benefits in field like agriculture and medicine, he argued, such as breakthroughs in preventing and treating diseases. But he also noted that the transition carries big risks, like widespread unemployment, harming the educational and social development of children, or making it easier for criminals and bad actors -- or AI itself -- to cause deliberate harm.

"As the models become more powerful, they could begin to act against our interests and we could lose control," he warned. These significant risks must be controlled quickly, Gates said. "If someone had a credible plan for slowing down AI advances globally, I would likely support it," he wrote. "However, I don't think that's going to happen. The geopolitical and economic incentives are pushing too hard to go full speed ahead." In an interview with CNN's Anderson Cooper that will air on Wednesday evening, Gates said AI models have gotten dramatically more powerful at a rate faster than he expected. "They're now capable of causing cyberattack risk, bioterrorism risk, psychosocial risk," he said. "I have to say I'm kind of shocked that the exact criteria that we review these models with, and the actions we take to minimize the harms, are really completely missing."

In his essay, Gates proposed taxing AI or robots the way you would pay a human employee's payroll tax in order to slow the shift away from using human labor. He also wants to set aside some work to be done by humans only. "My message to leaders is: You have a chance to act now, before unemployment rises sharply, communities are hurting, and public trust has eroded," he said. "You can make sure AI benefits everyone. And you can work with other governments to meet this national and global challenge."

Read more of this story at Slashdot.

Ius Mentis

Internetrecht door Arnoud Engelfriet

Wat zijn nou de belangrijkste aandachtspunten voordat je AI in je bedrijf gaat inzetten?

Een lezer vroeg me:

Iedereen gebruikt inmiddels AI op de werkvloer. Wat zijn volgens jou de belangrijkste juridische aandachtspunten waar bedrijven momenteel rekening mee moeten houden voordat ze AI inzetten binnen het bedrijf?
Mijn allerbelangrijkste aandachtspunt is dat je begint met kwalificeren wat je bedoelt met “we gebruiken AI op het werk”. Dit is een wereld van opties, van “werknemers gebruiken op hun telefoon een gratis account bij OpenAI” en “Wim heeft een self-hosted Chinees model op zijn oude laptop” tot “onze workflows zijn geautomatiseerd via OpenClaw agents met een ingeregeld soeverein self-hosted taalmodel”.

In de kern heb je twee smaken AI: self-hosted en SaaS. De meeste mensen gebruiken die laatste, en dat behandel je gewoon als iedere ict-dienst die je inkoopt. Kwaliteit, aansprakelijkheid, data-toegang, veiligheid, exit zijn dan de belangrijkste aandachtspunten. Plus verwerkersovereenkomst als de dienst persoonsgegevens verwerkt.

Specifiek bij AI-diensten is het grootste aanvullend risico hoe vertrouwelijk men omgaat met je data. De klassieke zorg is dat men al je chats gebruikt om het taalmodel mee te verbeteren, dus zorg dat je inkoopt op een niveau waarbij dat contractueel uitgesloten wordt.

Daarnaast is anno 2026 soevereiniteit een aandachtspunt. Blijft de data in Europa? En zo niet, hoe makkelijk kunnen we dan mét data en al weg zodra het Hof van Justitie (of de Commissie) zegt dat de US cloud niet meer adequaat is?

Bij self-hosted AI modellen blijven kwaliteit, veiligheid en data-omgang van belang, maar vanuit een ander perspectief. Heb je je beheer op orde, wat is de uitwijkoptie als de dienst het niet doet, enzovoorts. Wie let op actualiteit en verbetering, gebruikerstraining en zulke zaken. Wederom: hetzelfde als bij andere ict-diensten.

Mocht je te maken hebben met hoogrisico-AI onder de AI-verordening, dan wordt dat vanaf december 2027 een extra aandachtspunt. Kopen wij dit in met een CE keurmerk, en hebben wij toezicht en gebruik goed ingeregeld met training en bevoegdheden voor iedereen die er mee te maken krijgt?

Bij bovenstaande ben ik uitgegaan van zakelijk afgenomen AI-diensten. Populair is de privé afgenomen dienst die dan onzichtbaar voor werk wordt ingezet. Dit is ook niet nieuw, de term “shadow IT” bestaat al 20 jaar. Maar er zijn nu ineens veel meer redenen voor individuele werknemers om zulke tools in te zetten, dus komt het veel vaker voor. Hier beleid, educatie en toezicht op hebben is wat mij betreft dus essentieel.

Arnoud

Het bericht Wat zijn nou de belangrijkste aandachtspunten voordat je AI in je bedrijf gaat inzetten? verscheen eerst op Ius Mentis.

20260808 Samegai stage 6

BONGURI has added a photo to the pool:

20260808 Samegai stage 6

地蔵川に架かる橋。橋の上は少し涼しいの。
Photo taken Samegai stage, Maibara city, Shiga pref.

Sargasso

Hopeloos Genuanceerd

De laatste niet-antisemiet moet het licht uitdoen

OPINIE - een gastbijdrage van Mihai Martoiu Ticu

Nazi-vergelijkingen met twee maten

Vorige week beschuldigde voormalig parlementariër Wim Kortenoeven de ChristenUnie en het CDA van antisemitisme. Kortenoeven, die tegenwoordig in een Israëlische nederzetting woont en zich tot het orthodoxe jodendom heeft bekeerd, richtte zich in het Reformatorisch Dagblad op twee partijen die een boycot van producten uit Israëlische nederzettingen steunen. Hij haalde daarbij zelfs de Duitse leus ‘Kauft nicht bei Juden’ aan, bekend van de landelijke boycot van Joodse winkels, artsen en advocaten die de NSDAP op 1 april 1933 organiseerde.

Thierry Baudet werd voor de rechter gesleept toen hij de coronamaatregelen met de Holocaust vergeleek en Francesca Albanese (VM Speciaal Rapporteur voor de mensenrechten in de Palestijnse gebieden) werd op verzoek van het CIDI uit de Tweede Kamer geweerd toen ze Tweede Wereldoorlog-analogieën maakte, omdat die de Holocaust zouden bagatelliseren. Dus blijkbaar mag Kortenoeven, directeur van het Netherlands-Israel Public Affairs Committee (NIPAC), een lobbyorganisatie ten behoeve van Israël (een Nederlandse variant van het Amerikaanse AIPAC), de Holocaust wél bagatelliseren, want hij doet het voor een goed doel.

Een paar dagen eerder werd ook Frans Timmermans van antisemitisme beschuldigd omdat hij rechts en extreemrechts in Israël met de nazi’s vergeleek. Trouwens, de vergelijking van Timmermans was een legitieme deductieve analogie.

Deze week kwam daar nog een voorbeeld bij. Eddo Verdoner betoogde in de Volkskrant dat een cartoon van Peter de Wit over de bezetting antisemitische beeldtaal zou gebruiken.

Mijn voorstel is om de definitie van antisemitisme te versimpelen: “Alle uitspraken over het Israëlisch-Palestijnse conflict zijn antisemitisch, behalve de uitspraak: ‘Israël heeft altijd gelijk.’”

Antony Lerman en de herdefiniëring van antisemitisme

Een uitvoerige analyse van de steeds ruimer wordende definitie van antisemitisme staat in Whatever Happened to Antisemitism? Redefinition and the Myth of the ‘Collective Jew’ van de Britse onderzoeker Antony Lerman. Hij schrijft niet alleen als academicus, maar ook vanuit tientallen jaren ervaring binnen organisaties die antisemitisme onderzochten. Hij werkte bij het Institute of Jewish Affairs, later werd hij directeur van die organisatie en van haar opvolger, het Institute for Jewish Policy Research. Hij zette ook de Antisemitism World Report op, een jaarlijks landenrapport over antisemitisme.

In die zin is Lerman ook een klokkenluider in zijn eigen vakgebied. Hij beschrijft in zijn boek conflicten binnen de organisaties waarvoor hij werkte en druk van andere instellingen. Toen hij in 1985 kritiek uitte op de neiging Arabische oppositie tegen Israël als antisemitisch te behandelen, leidde dat tot oproepen hem te ontslaan. Later verzette zijn instituut zich tegen samenwerking met een door de Mossad gefinancierd onderzoeksproject, omdat het twijfelde aan de onafhankelijkheid daarvan.

Van Jodenhaat naar ‘nieuw antisemitisme’

Lermans hoofdonderwerp is de verandering van het begrip antisemitisme sinds de jaren zeventig. Klassiek antisemitisme heeft volgens hem betrekking op vijandigheid tegen Joden als Joden: bijvoorbeeld samenzweringstheorieën over Joodse macht, bloedlaster, Holocaustontkenning en racistische karikaturen. Hij bestrijdt niet dat zulke vormen van antisemitisme nog steeds bestaan.

Daarnaast ontstond volgens Lerman geleidelijk het concept van het ‘nieuwe antisemitisme’. Daarin kwam de houding tegenover Israël en het zionisme steeds centraler te staan. De gedachte is dat Israël tegenwoordig de rol vervult van de ‘collectieve Jood onder de naties’: zoals Joden vroeger werden uitgesloten, gedemoniseerd en bedreigd, zou Israël nu als staat worden uitgesloten, gedemoniseerd en bedreigd. Boycots van Israël, anti-zionisme en bepaalde vormen van kritiek op de staat konden vanuit die gedachte als hedendaagse verschijningsvormen van antisemitisme worden beschouwd.

Lerman reconstrueert hoe deze benadering zich vanaf de jaren zeventig ontwikkelde. De verhouding tussen anti-zionisme en antisemitisme werd steeds intensiever besproken, maar lange tijd bestond daarover geen overeenstemming. Zo werd binnen Joodse en Israëlische instellingen enerzijds betoogd dat het ontkennen van Joodse nationale zelfbeschikking antisemitisch kon zijn, terwijl anderzijds werd erkend dat oppositie tegen Israëlisch beleid of ideologische kritiek op het zionisme dat niet noodzakelijk was.

Volgens Lerman kwam rond de eeuwwisseling een omslag. De tweede intifada, de Durban-conferentie en een groeiende politieke aandacht voor anti-Israëlische uitingen versterkten de opvatting dat anti-zionisme en antisemitisme nauw met elkaar verbonden waren. Onderzoeksinstellingen, Joodse organisaties en Israëlische overheidsorganen gingen zich steeds nadrukkelijker met dit ‘nieuwe antisemitisme’ bezighouden.

De ‘collectieve Jood’

Het theoretische middelpunt van Lermans boek is zijn kritiek op het beeld van Israël als ‘collectieve Jood’. Volgens hem worden daarin twee verschillende categorieën met elkaar verbonden: een bevolkingsgroep en een staat.

Een individu kan vanwege zijn Joodse afkomst of religie worden gehaat of gediscrimineerd. Een staat is daarentegen een politieke instelling die kan worden beoordeeld op haar wetgeving, grenzen, ideologie, militaire optreden en beleid. Daarom volgt volgens Lerman uit vijandigheid tegenover Israël of het zionisme niet zonder meer vijandigheid tegenover Joden.

Hij trekt daaruit niet de conclusie dat anti-Israëlische uitingen nooit antisemitisch kunnen zijn. Dat kunnen ze volgens hem wel degelijk zijn, bijvoorbeeld wanneer klassieke stereotypen over Joodse macht of samenzweringen worden gebruikt of wanneer Joden als groep verantwoordelijk worden gesteld voor het optreden van Israël. Zijn bezwaar richt zich tegen een automatische gelijkstelling: de concrete inhoud en context moeten bepalen of een uiting antisemitisch is.

Van EUMC naar IHRA

Een belangrijk deel van het boek gaat over de institutionalisering van deze nieuwe benadering. In 2005 publiceerde het European Union Monitoring Centre on Racism and Xenophobia een ‘working definition’ van antisemitisme. Die tekst was volgens het EUMC onderdeel van een lopend proces en had geen juridische status. De definitie kwam niet uitsluitend van academische onderzoekers tot stand; Lerman beschrijft hoe vertegenwoordigers van verschillende organisaties bij de ontwikkeling ervan betrokken waren.

In 2016 nam de International Holocaust Remembrance Alliance een aangepaste versie van die definitie over. Voor Lerman is vooral van belang dat veel van de bijbehorende voorbeelden betrekking hebben op Israël. Daardoor werd een ontwikkeling die eerder vooral in politieke en academische discussies plaatsvond volgens hem steeds sterker onderdeel van het beleid van regeringen, universiteiten, politieke partijen en andere instellingen.

Lerman ziet daarin de institutionele verankering van een bredere definitie van antisemitisme, waarin niet alleen vijandigheid tegen Joden, maar ook bepaalde vormen van anti-zionisme en Israëlkritiek een plaats krijgen.

Het risico van begripsvervaging

Lermans belangrijkste bezwaar is uiteindelijk conceptueel. Wanneer zeer uiteenlopende verschijnselen onder hetzelfde begrip worden gebracht, wordt het volgens hem moeilijker onderscheid te maken tussen klassieke Jodenhaat en politieke conflicten over Israël en Palestina.

Daarom verzet hij zich tegen de eenvoudige formule dat anti-zionisme gelijkstaat aan antisemitisme. De twee kunnen volgens hem overlappen, maar zijn niet identiek. Of een uitspraak over Israël antisemitisch is, moet worden vastgesteld aan de hand van wat er daadwerkelijk wordt gezegd, welke stereotypen worden gebruikt en tegen wie de vijandigheid is gericht.

Dat heeft volgens Lerman ook praktische gevolgen. Wanneer BDS, kritiek op de bezetting, discussies over een éénstaatoplossing of beschuldigingen van mensenrechtenschendingen al snel onder verdenking van antisemitisme komen te staan, kan het begrip mede gaan bepalen welke politieke standpunten nog als legitiem worden behandeld. Tegelijkertijd waarschuwt hij dat een te ruim begrip het moeilijker kan maken om antisemitisme in zijn klassieke vormen precies te herkennen en te bestrijden. Hij koppelt zijn kritiek daarom juist aan de wens het begrip analytisch scherp te houden.

Te onthouden

Antisemitisme is een vorm van racisme. Racisme is het gedrag waarbij iemand ongerechtvaardigde voordelen nastreeft, of anderen onterechte nadelen toebrengt, gebaseerd op veronderstelde biologische kenmerken. De juridische definitie omvat ook ‘rassendiscriminatie’ (discriminatie op afkomst of nationale of etnische afstamming). U moet echter onthouden dat de kern van discriminatie is dat iemand schade lijdt, of iets wordt ontnomen (of onthouden) waar hij of zij recht op heeft.

Om CDA, ChristenUnie, Frans Timmermans en de Volkskrant van antisemitisme te kunnen beschuldigen, moet men dus eerst aantonen dat zij de Joden schade toebrengen.

Over de auteur:

Dit artikel verscheen eerder bij Thrasymachus. Mihai Martoiu Ticu is afgestudeerd filosoof en heeft een master Internationaal Recht (Universiteit Utrecht). Hij schrijft op zijn persoonlijke website over politiek, filosofie, argumentatie en mensenrechten. Tevens plaats hij artikelen op zijn weblog Thrasymachus.

VK: Voorpagina

Volkskrant.nl biedt het laatste nieuws, opinie en achtergronden

Door Koerden geleide Syrische Democratische Strijdkrachten gaan op in het Syrische leger

The Guardian

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

Colony review – zombies return to the mall with a fresh and frenzied range of scares

This time the ranks of the undead have acquired a hive mind, making them even more formidable adversaries. Can a maverick academic save the day?

Here is another frenzied K-zombie action-horror from Yeon Sang-ho, the director of Train to Busan and Peninsula. Colony is frontloaded with 10 minutes of sciencey exposition and setup during which a biotech CEO mentions maze-solving slime mould and the pioneering work of the entomologist William Wheeler on the hive minds of ant colonies. Then the CEO is injected with a disgruntled former employee’s bright green liquid tech – it always needs to be bright green in such circumstances – and becomes the first victim of a bio-terror attack that traps a small cross-section of South Korean society in a tower block with hordes of fast-moving rabid flesh-munchers. An hour and three quarters of goopy, bloody mayhem ensue.

An upscale shopping mall occupies the lower floors of the tower, and it takes some nerve to give your zombie film much the same setting as Dawn of the Dead, the masterwork of the godfather of the genre George A Romero. Thankfully Colony can boast an innovation: these zombies have a hive mind, an emergent collective intelligence that makes them more formidable adversaries than your average braindead stumbler. The moment that one of the infected notices you and screams, as in Invasion of the Bodysnatchers, they all turn and attack.

Continue reading...

‘I am so tired’: Jill Edelstein’s devastating portraits of apartheid and more – in pictures

The South African photographer documented her country’s harrowing Truth and Reconciliation Commission. These pictures form part of a new exhibition – alongside intimate images of actors, artists and friends

Continue reading...

Kolkhoz by Emmanuel Carrère review – intricate portrait of an elite French family

The author of The Adversary and Yoga unearths a history that includes the Nazis, Russia, and the Académie Française

When Emmanuel Carrère’s mother, Hélène, died in 2023, at the age of 94, President Macron spoke at her memorial. She had been “perpetual secretary” of the Académie Française, in effect its head, and 200 people gathered at Les Invalides in Paris to pay tribute. Emmanuel’s father, Louis, was there too, in a wheelchair, only half aware of what was going on. This 400-page memoir, translated into English by John Lambert, is a homage to both parents and the unlikely history that brought them together. It’s also an act of reparation towards Hélène, whom Emmanuel worshipped as a child but upset as an adult by publishing a book that she’d forbidden him to write.

Hélène grew up in stateless poverty in Paris, the daughter of Georges Zourabichvili, whose parents had fled Georgia in 1921, and Nathalie von Pelken, who as a child had six governesses, one for each day excluding Sunday. Though “the magical world of the fallen Russian aristocracy” was the backdrop, conditions were tough, not least after Georges disappeared in 1944, murdered by partisans for alleged Nazi collaboration. Hélène was 15 at the time and unsuccessfully tried to hide the truth about George’s death from her younger brother, Nicolas.

Continue reading...

Architourism in France: the retro futurist seaside town near Montpellier that’s out of this world

Built in the 60s and 70s to curb a holiday exodus to Spain, with apartments inspired by Mayan pyramids and featuring ‘intergalactic curves’, La Grande-Motte is having another moment in the sun with fans of modern architecture

My dream holiday is a trip back in time. Not to see the results of seismic Pompeii or 15th-century Machu Picchu – although I love both – but somewhere created specifically between the mid 1950s and 1970s, when cities were getting weird. I love postwar architourism, exploring urban planning at its most frenzied and optimistic. I have relished trips to Niemeyer’s Brasília and Le Corbusier’s Chandigarh in India, where the monumental and visionary modernist architecture and interiors are at odds with the minimal population. So La Grande-Motte, the retro futurist folly of a resort town on the southern coast of France, a 30-minute drive from Montpellier, had long been on my “must visit” list.

The tourist board of this Occitanie seaside town likes to flag up some superficial parallels between it and the aforementioned cities, but this isn’t a high-concept capital city or administrative hub. It was built in the late 1960s and early 1970s purely to persuade the French to stop going south to the Costa Brava in Spain. As part of an initiative by the French government, a stretch of windswept mosquito-infested coast between Montpellier and Perpignan, including Gruissan and Port Leucate, was reimagined as an alternative to the Côte d’Azur with several new-build beach towns. La Grande-Motte would be the weirdest project. It was made for fun. It’s also well positioned to visit the nearby salt marshes and 13th-century walled-in town of Aigues-Mortes, for when you want to feel as if you’ve ticked a few more holiday boxes.

Continue reading...