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.
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).
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.
Thomas Hawk posted a photo:
handwritten on slide, “Belle of Louisville" date stamped on slide July 1973
Thomas Hawk posted a photo:
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.
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
]);
}
}
}
}
}
}
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
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:
https://developer.overheid.nl/blog/2026/08/26/graphql-3-schema-ontwerp
Read more of this story at Slashdot.
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.
BONGURI has added a photo to the pool:
地蔵川に架かる橋。橋の上は少し涼しいの。
Photo taken Samegai stage, Maibara city, Shiga pref.
OPINIE - een gastbijdrage van Mihai Martoiu Ticu
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.’”
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.
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.
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.
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.
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.
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.
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.
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...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...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...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...