Pro testování byl vydán 4. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
Ben Sturmfels oznámil vydání MediaGoblinu 0.15.0. Přehled novinek v poznámkách k vydání. MediaGoblin (Wikipedie) je svobodná multimediální publikační platforma a decentralizovaná alternativa ke službám jako Flickr, YouTube, SoundCloud atd. Ukázka například na LibrePlanet.
TerminalPhone (png) je skript v Bashi pro push-to-talk hlasovou a textovou komunikaci přes Tor využívající .onion adresy.
Před dvěma lety zavedli operátoři ochranu proti podvrženým hovorům, kdy volající falšuje čísla anebo se vydává za někoho jiného. Nyní v roce 2026 blokují operátoři díky nasazeným technologiím v průměru 3 miliony pokusů o podvodný hovor měsíčně (tzn., že k propojení na zákazníka vůbec nedojde). Ochrana před tzv. spoofingem je pro zákazníky a zákaznice všech tří operátorů zdarma, ať už jde o mobilní čísla nebo pevné linky.
Společnost Meta (Facebook) předává React, React Native a související projekty jako JSX nadaci React Foundation patřící pod Linux Foundation. Zakládajícími členy React Foundation jsou Amazon, Callstack, Expo, Huawei, Meta, Microsoft, Software Mansion a Vercel.
Samsung na akci Galaxy Unpacked February 2026 (YouTube) představil své nové telefony Galaxy S26, S26+ a S26 Ultra a sluchátka Galaxy Buds4 a Buds4 Pro. Telefon Galaxy S26 Ultra má nový typ displeje (Privacy Display) chránící obsah na obrazovce před zvědavými pohledy (YouTube).
Byla vydána grafická knihovna Mesa 26.0.1 s podporou API OpenGL 4.6 a Vulkan 1.4. Je to první stabilní verze po 26.0.0, kde se novinky týkají mj. výkonu ray tracingu na GPU AMD a HoneyKrisp, implementace API Vulkan pro macOS.
Byla vydána nová verze 4.6 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Využíván je Free Pascal Compiler (FPC) 3.2.2.
Byla vydána nová verze 3.23.0 FreeRDP, tj. svobodné implementace protokolu RDP (Remote Desktop Protocol). Opravuje 11 bezpečnostních chyb.
Španělský softwarový inženýr oznámil, že se mu podařilo na dálku ovládat sedm tisíc robotických vysavačů po celém světě. Upozornil tak na slabé kybernetické zabezpečení těchto technologií a jejich možné a snadné zneužití. Nesnažil se hacknout všechny robotické vysavače po světě, ale pouze propojil svůj nový DJI Romo vysavač se zařízením Playstation. Aplikace podle něj ihned začala komunikovat se všemi sedmi tisíci spotřebiči a on je
… více »Odkazy
Posledné dva dni som sa pustil trochu do nápravy starých hriechov. Konkrétne som začal refaktorovať jednu triedu s takto krásnymi komentármi:
// Túto triedu nedá dokopy nikto! /// @todo Otestujte niekto prosím túto funkciu, ja sa jej bojím.
No nie je to neodolateľné?
Na začiatok pár slov o tom, čo sa pomocou QAbstractProxyModel-u pokúšam dosiahnuť.
Kedysi dávno (pár mesiacov pred vydaním Qt 4.7) som začal pracovať na jednom projekte, ktorý ma užívateľské rozhranie v QML. Aplikácia vie zobrazovať skladby zoradené podľa rôznych kritérií do kategórií napr. album -> skladba, autor -> skladba …
Informácie o skladbách a ich zaradení sú získavané štandardne cez QAbstractItemModel. Zobrazovanie je riešené v užívateľskom rozhraní pomocou QML (dva samostatné ListView) a v administrátorskom rozhraní pomocou QTreeView.
Prvok ListView je schopný zobrazovať len jednoúrovňové zoznamy, nie stromové, ako je to v tomto prípade. Preto bolo potrebné vymyslieť riešenie, ako takéto dáta zobrazovať v užívateľskom rozhraní cez QML.
Proxy modely slúžia na operácie ako filtrovanie, alebo transformácia položiek. V mojom prípade som chcel vytvoriť proxy model, ktorý sprístupni len časť modelu určenú koreňovým indexom. Rozhranie TreeBrowserProxyModel má preto navyše len metódu setRootIndex.
Najväčší problém, s ktorým som pri implementácii modelu bojoval (a nebol som sám) je premapovanie indexov. Všetky riešenia, ktoré som doteraz videl si vytvárali vlastnú kópiu štruktúry pôvodného modelu, čo zahodí väčšinu výhod modelov v Qt (rýchlosť, množstvo potrebnej pamäte, …).
Okrem počiatočnej kópie štruktúry sa musí štruktúra udržiavať synchronizovaná s pôvodným modelom. To znamená, že sa musia sledovať nasledujúce signály:
dataChanged(QModelIndex, QModelIndex); headerDataChanged(Qt::Orientation, int, int); rowsAboutToBeInserted(QModelIndex, int, int); rowsInserted(QModelIndex, int, int); columnsAboutToBeInserted(QModelIndex, int, int); columnsInserted(QModelIndex, int, int); rowsAboutToBeRemoved(QModelIndex, int, int); rowsRemoved(QModelIndex, int, int); columnsAboutToBeRemoved(QModelIndex, int, int); columnsRemoved(QModelIndex, int, int); layoutAboutToBeChanged(); layoutChanged(); modelAboutToBeReset(); modelReset();
Dávnejšie som videl na internete niekoľko implementácií takéhoto proxy modelu. Všetky mali veľkosť približne 1000 riadkov a hrôzostrašný kód. Rovnako vyzerala aj moja implementácia (neprechádzala síce unit testmi, ale aspoň na väčšinu prípadov fungovala).
Pri refaktorovaní kódu som dostal perfektný nápad - namiesto zložitého mapovania indexov použiť pôvodné dáta indexov zo zdrojového modelu.
QModelIndex TreeBrowserProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
{
return createIndex(sourceIndex.row(), sourceIndex.column(), sourceIndex.internalPointer());
}
QModelIndex TreeBrowserProxyModel::mapToSource(const QModelIndex &proxyIndex) const
{
return sourceModel()->createIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer());
}
Nad týmto riešením som rozmýšľal už pri pôvodnej implementácii, ale vtedy som si nespomenul na žiaden spôsob ako prekonať obmedzenie prístupu k protected metóde createIndex.
Aby som mohol volať metódu createIndex som si vytvoril triedu deklarujúcu TreeBrowserProxyModel ako friend.
class TreeBrowsableModel: public QAbstractItemModel
{
Q_OBJECT
friend class TreeBrowserProxyModel;
};
Následne stačí v metóde mapToSource pretypovať QAbstractItemModel na TreeBrowsableModel:
reinterpret_cast<TreeBrowsableModel>(sourceModel())->createIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer());
Moje riešenie si síce porušuje zapuzdrenie, ale pri danej úspore kódu a jednoduchosti ho považujem za dobrý kompromis.
Tiskni
Sdílej:
Niekedy (vždy) to vedie k veľa kódu naviac, preto niektorí ľudia tvrdia že C++ je zbytočné keď tu máme C a na zložitejšie veci lepšie jazyky
// Túto triedu nedá dokopy nikto! /// @todo Otestujte niekto prosím túto funkciu, ja sa jej bojím.to me pripomelo...