PimpMyGRC upravuje vzhled toolkitu GNU Radio a přidává alternativní barevná témata. Primárním cílem autora bylo pouze vytvořit tmavé prostředí vhodné pro noční práci, nicméně k dispozici je nakonec celá škála barevných schémat včetně možností různých animací a vizuálních efektů (plameny, matrix, bubliny...), které nepochybně posunou uživatelský zážitek na zcela jinou úroveň. Témata jsou skripty v jazyce Python, které nahrazují
… více »GIMP 3.2 byl oficiálně vydán (Mastodon, 𝕏). Přehled novinek v poznámkách k vydání.
FRANK OS je open-source operační systém pro mikrokontrolér RP2350 (s FRANK M2 board) postavený na FreeRTOS, který přetváří tento levný čip na plně funkční počítač s desktopovým uživatelským rozhraním ve stylu Windows 95 se správcem oken, terminálem, prohlížečem souborů a knihovnou aplikací, ovládaný PS/2 myší a klávesnicí, s DVI video výstupem. Otázkou zůstává, zda by 520 KB SRAM stačilo každému 😅.
Administrativa amerického prezidenta Donalda Trumpa by měla dostat zhruba deset miliard dolarů (asi 214 miliard Kč) za zprostředkování dohody o převzetí kontroly nad aktivitami sociální sítě TikTok ve Spojených státech.
Projekt Debian aktualizoval obrazy stabilní větve „Trixie“ (13.4). Shrnuje opravy za poslední dva měsíce, 111 aktualizovaných balíčků a 67 bezpečnostních hlášení. Opravy se týkají mj. chyb v glibc nebo webovém serveru Apache.
Agent umělé inteligence Claude Opus ignoroval uživatelovu odpověď 'ne' na dotaz, zda má implementovat změny kódu, a přesto se pokusil změny provést. Agent si odpověď 'ne' vysvětlil následovně: Uživatel na mou otázku 'Mám to implementovat?' odpověděl 'ne' - ale když se podívám na kontext, myslím, že tím 'ne' odpovídá na to, abych žádal o svolení, tedy myslí 'prostě to udělej, přestaň se ptát'.
Po 8. květnu 2026 už na Instagramu nebudou podporované zprávy opatřené koncovým šifrováním. V chatech, kterých se bude změna týkat, se objeví pokyny o tom, jak si média nebo zprávy z nich stáhnout, pokud si je chcete ponechat.
V lednu byla ve veřejné betě obnovena sociální síť Digg (Wikipedie). Dnes bylo oznámeno její ukončení (Hard Reset). Společnost Digg propouští velkou část týmu a přiznává, že se nepodařilo najít správné místo na trhu. Důvody jsou masivní problém s boty a silná konkurence. Společnost Digg nekončí, malý tým pokračuje v práci na zcela novém přístupu. Cílem je vybudovat platformu, kde lze důvěřovat obsahu i lidem za ním. Od dubna se do Diggu na plný úvazek vrací Kevin Rose, zakladatel Diggu z roku 2004.
MALUS je kontroverzní proprietarní nástroj, který svým zákazníkům umožňuje nechat AI, která dle tvrzení provozovatelů nikdy neviděla původní zdrojový kód, analyzovat dokumentaci, API a veřejná rozhraní jakéhokoliv open-source projektu a následně úplně od píky vygenerovat funkčně ekvivalentní software, ovšem pod libovolnou licencí.
Příspěvek na blogu Ubuntu upozorňuje na několik zranitelností v rozšíření Linuxu o mandatorní řízení přístupu AppArmor. Společně jsou označovány jako CrackArmor. Objevila je společnost Qualys (technické detaily). Neprivilegovaný lokální uživatel se může stát rootem. Chyba existuje od roku 2017. Doporučuje se okamžitá aktualizace. Problém se týká Ubuntu, Debianu nebo SUSE. Red Hat nebo Fedora pro mandatorní řízení přístupu používají SELinux.
Před řazením:
{ {"data 0", 0}, {"data 1", 1}, {"data 2", 2} }
Po řazení podle toho řetězce opačně:
{ {"data 2", 0}, {"data 1", 1}, {"data 0", 2} }
struct Prvek
{
// nejaka data
size_t index_v_poli;
};
Pak mám pole těch prvků, resp. v poli budou nakonec ukazatele na dané prvky, protože chci, aby se neměnila jejich adresa:
{
{ /* ... */, 0 },
{ /* ... */, 1 },
{ /* ... */, 2 },
{ /* ... */, 3 },
{ /* ... */, 4 },
}
Z pole si někam třeba uložim položku s indexem 2, dostanu Prvek*, ukazující na { /* ... */, 2 }. Pak třeba do pole něco přidám, nebo ho nějak jinak seřadím. Chci, aby se index ve vráceném prvku patřičně aktualizoval, aby měl správný index a já pak mohl říct třeba "smaž prvek Prvek*" a nemusel ho v poli vyhledávat v O(n).
Tak tady je ještě obecnější řešení než níže uvedené. Třídit můžeš implicitně pomocí std::set a std::map. Implementace jsou vyvážené stromy a nikde tam ani náhodou nehrozí hledání v O(n). Můžeš si podle potřeby udržovat několik různě setříděných „pohledů“ do téže datové struktury.
#include <map>
#include <set>
#include <string>
struct Something {
std::string blah;
size_t index;
};
static std::ostream& operator <<(std::ostream &out, const Something &sth) {
out << "{\"" << sth.blah << "\", " << sth.index << "}";
return out;
}
struct CompareSomething {
bool operator ()(const Something *const &left,
const Something *const &right) const {
return left->blah > right->blah;
}
};
template<template<typename ... Args> class M, typename ... Args>
static void printmap(const M<Args...> &map, const std::string &message) {
const auto end{map.cend()};
auto i{map.cbegin()};
std::cout << message << std::endl << '{';
if (i != end) {
std::cout << '{' << i->first << ", " << i->second << '}';
for (++i; i != end; ++i)
std::cout << ", " << '{' << i->first << ", " << i->second << '}';
}
std::cout << '}' << std::endl;
}
int main() {
std::map<size_t, Something> indexmap{
{0, {"data 0", 0}}, {1, {"data 1", 1}}, {2, {"data 2", 2}}};
std::set<const Something*, CompareSomething> sortedview;
for (const auto &pair : indexmap) sortedview.insert(&pair.second);
printmap(indexmap, "Původní stav:");
auto first{sortedview.cbegin()};
indexmap.erase((*first)->index);
sortedview.erase(first);
printmap(indexmap, "Stav po odebrání prvního podle třídění:");
indexmap.emplace(3, Something{"data 3", 3});
sortedview.insert(&indexmap[3]);
printmap(indexmap, "Stav po přidání dalšího prvku:");
auto second{sortedview.cbegin()};
++second;
indexmap.erase((*second)->index);
sortedview.erase(second);
printmap(indexmap, "Stav po odebrání druhého podle třídění:");
return 0;
}
Dlužno dodat, že v tomto případě by bylo výrazně jednodušší použít místo Something jednoduše rovnou std::pair<size_t, std::string>. Tím by zmizela jedna úroveň zanoření struktur. Výše uvedený program vypíše:
Původní stav:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}, {2, {"data 2", 2}}}
Stav po odebrání prvního podle třídění:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}}
Stav po přidání dalšího prvku:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}, {3, {"data 3", 3}}}
Stav po odebrání druhého podle třídění:
{{0, {"data 0", 0}}, {3, {"data 3", 3}}}
Ano, je na to standardní algoritmus zvaný std::sort(). Aktualizaci indexů si pak už musíš napsat sám, což ale není nijak extra těžké:
#include <algorithm>
#include <iostream>
#include <string>
struct Something {
std::string blah;
size_t index;
bool operator <(const Something &right) const { return blah > right.blah; }
};
static std::ostream& operator <<(std::ostream &out, const Something &sth) {
out << "{\"" << sth.blah << "\", " << sth.index << "}";
return out;
}
template<typename T, size_t N>
void printarray(const T(&array)[N], const std::string &message) {
const auto begin{std::begin(array)}, end{std::end(array)};
std::cout << message << std::endl << '{';
if (begin < end) {
std::cout << *begin;
for (auto i{begin + 1}; i < end; ++i) std::cout << ", " << *i;
}
std::cout << '}' << std::endl;
}
int main() {
Something array[]{{"data 0", 0}, {"data 1", 1}, {"data 2", 2}};
printarray(array, "Počáteční stav:");
std::sort(std::begin(array), std::end(array));
printarray(array, "Stav po std::sort():");
size_t counter{0};
for (Something &s : array) s.index = counter++;
printarray(array, "Stav po aktualizaci indexů:");
return 0;
}
Výše uvedený program vypíše následující:
Počáteční stav:
{{"data 0", 0}, {"data 1", 1}, {"data 2", 2}}
Stav po std::sort():
{{"data 2", 2}, {"data 1", 1}, {"data 0", 0}}
Stav po aktualizaci indexů:
{{"data 2", 0}, {"data 1", 1}, {"data 0", 2}}
Tiskni
Sdílej: