Vývojári z distribúcie Artix, ktorá je postavená na Arch Linuxe, alebo skôr jeho forkom, už skôr prešli na Open-RC init systém, stále však niektoré projekty ako GNOME boli závislé na systemd. Teraz pretiekol pohár trpezlivosti a počnúc GNOME 49, kvôli ktorému komponenta gnome-session je úplne závislá na systemd-init, padlo rozhodnutie na odstránenie GNOME z repozitárov Artixu. Táto zmena sa podľa všetkého týka viac než 90 distribúcií, ktoré tiež nepoužívajú systemd. Viac v príspevku na DistroWatch.
Magazín IEEE Spectrum opět po roce publikoval svůj žebříček programovacích jazyků. Vedou Python, Java, C++, SQL a C#.
Repozitáře pro spolupráci v rámci projektu Fedora se přesunou z Pagure na nově vzniklý Fedora Forge. Ten stejně jako třeba Codeberg běží na softwaru Forgejo, které bylo už před časem vybráno jako náhrada za Pagure. Pagure pochází z dílny Fedory, ale mimo ni se příliš neuchytil. Jeho vývoj a údržba byly náročné a Fedora se rozhodla jít cestou úspěšnějšího projektu, který má větší základnu přispěvatelů.
Byla vydána (𝕏) nová verze 2025.3 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení na blogu.
V IT4Innovations národním superpočítačovém centru byl dnes slavnostně spuštěn první český kvantový počítač VLQ disponující 24 fyzickými qubity s unikátní hvězdicovou topologií. Systém dodala společnost IQM Quantum Computers a jeho celková pořizovací cena činila přibližně 125 milionů korun.
Výrobce čipů Nvidia chce investovat až 100 miliard dolarů (přes dva biliony Kč) do společnosti zaměřené na umělou inteligenci OpenAI. Firmy o tom informují v tiskové zprávě. Oznámené partnerství přichází v době, kdy se mezi technologickými giganty a start-upy zostřuje konkurence o zajištění přístupu k energii a čipům potřebným pro rozvoj umělé inteligence (AI).
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 157 (pdf).
Společnost Cloudflare oznámila, že sponzoruje nezávislý webový prohlížeč Ladybird a linuxovou distribuci pro vývojáře Omarchy (Arch Linux s dlaždicovým správcem oken Hyprland).
Společnost XTX Markets zabývající se algoritmickým obchodováním pro své potřeby vyvinula a dnes představila a otevřela souborový systém TernFS. Zdrojové kódy jsou k dispozici na GitHubu. Vývoj TernFS začal počátkem roku 2022. Od léta 2023 jej XTX Markets používá v produkčním prostředí.
Byl spuštěn předprodej linuxového telefonu FLX1s od Furi Labs. Výroba by měla být dokončena ke konci října.
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:
// Túto triedu nedá dokopy nikto! /// @todo Otestujte niekto prosím túto funkciu, ja sa jej bojím.to me pripomelo...