Asociace repair.org udělila anticeny těm nejhorším produktům představeným na veletrhu CES 2026. Oceněnými jsou například šmírující kamery Amazon Ring AI, chytrý běžecký pás od společnosti Merach, která otevřeně přiznává, že nedokáže zabezpečit osobní data uživatelů, případně jednorázové lízátko, které rozvibrovává čelisti uživatele a tak přehrává hudbu. Absolutním vítězem je lednička od Samsungu, která zobrazuje reklamy a kterou lze otevřít pouze hlasovým příkazem přes cloudovou službu.
Íránští protirežimní aktivisté si všímají 30% až 80% ztráty packetů při komunikaci se satelity služby Starlink. Mohlo by se jednat o vedlejší důsledek rušení GPS, kterou pozemní přijímače Starlinku používají k výpočtu polohy satelitů a kterou se režim rovněž snaží blokovat, podle bezpečnostního experta a iranisty Amira Rashidiho je ale pravděpodobnější příčinou terestrické rušení přímo satelitní komunikace Starlinku podobnou
… více »Evropská komise (EK) zvažuje, že zařadí komunikační službu WhatsApp americké společnosti Meta mezi velké internetové platformy, které podléhají přísnější regulaci podle unijního nařízení o digitálních službách (DSA). Firmy s více než 45 miliony uživatelů jsou podle DSA považovány za velmi velké on-line platformy (Very Large Online Platforms; VLOP) a podléhají přísnějším pravidlům EU pro internetový obsah. Pravidla po
… více »Tržní hodnota technologické společnosti Alphabet poprvé v historii přesáhla čtyři biliony dolarů (83 bilionů Kč). Stalo se tak poté, co Apple oznámil, že bude na poli umělé inteligence (AI) spolupracovat s dceřinou firmou Alphabetu, společností Google.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 161 (pdf).
Po delší době vývoje vyšla nativní linuxová verze virtuálního bubeníka MT-PowerDrumKit 2 ve formátu VST3. Mezi testovanými hosty jsou Reaper, Ardour, Bitwig a Carla.
Desktopové prostředí Budgie bylo vydáno ve verzi 10.10. Dokončena byla migrace z X11 na Wayland. Budgie 10 vstupuje do režimu údržby. Vývoj se přesouvá k Budgie 11. Dlouho se řešilo, v čem bude nové Budgie napsáno. Budgie 10 je postaveno nad GTK 3. Přemýšlelo se také nad přepsáním z GTK do EFL. Budgie 11 bude nakonec postaveno nad Qt 6.
OpenChaos.dev je 'samovolně se vyvíjející open source projekt' s nedefinovaným cílem. Každý týden mohou lidé hlasovat o návrzích (pull requestech), přičemž vítězný návrh se integruje do kódu projektu (repozitář na GitHubu). Hlasováním je možné změnit téměř vše, včetně tohoto pravidla. Hlasování končí vždy v neděli v 9:00 UTC.
Byl vydán Debian 13.3, tj. třetí opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.13, tj. třináctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
Na stránkách Evropské komise, na portálu Podělte se o svůj názor, se lze do 3. února podělit o názor k iniciativě Evropské otevřené digitální ekosystémy řešící přístup EU k otevřenému softwaru.
No článkov o MVC v Qt je pomerne dosť. Neviem, či by som bol schopný priniesť tu niečo nové o čom ešte nikto nepísal.
Všetky články, ktoré som o implementácii vlastných modelov v Qt čítal sa zaoberali jednoducho riešiteľnými problémami. Buď sa vôbec nezaoberali stromovými štruktúrami, alebo stromy boli vždy priamo v pamäti a nebol teda problém urobiť cast na interný pointer. Existuje ale celá trieda problémov pri ktorých nie je možné všetky dáta udržiavať v pamäti a práve s takýmto problémom som sa ja stretol.
Rád by som tento blog upravil a urobil z neho článok, ale chýba mi naň pár zásadných vecí. V prvom rade hovorím o probléme, ktorý viem vyriešiť len veľmi mizerne nehovoriac o tom, že toto moje "riešenie" nie je vôbec univerzálne a na mnoho problémov vôbec fungovať nemôže. Nechcel by som si vziať na svoju zodpovednosť to, že naučím nových potenciálnych programátorov robiť zlé rýchlo zbastlené riešenia.
Stále ale verím, že sa nájde niekto, kto tomu rozumie viacej ako ja, napíše jeho správne rieštenie do diskusie, ja sa chytím za hlavu a pôjdem sa rovno zakopať ;)
QFileSystemModel keeps a cache with file information. The cache is automatically kept up to date using the QFileSystemWatcher.
static_cast<QFileSystemModelPrivate::QFileSystemNode*>(index.internalPointer());
QFileSystemModel nenačítat data na vyžádání (canFetchMore() a fetchMore()) a nepoužívaná data (tj. jedn. větvě stromu) neodmazávat z modelu dle potřeby. Proto, že by znovu načtená data měla jiný identifikátor/ukazatel? Čemu to ale vadí - k datům přistupuje přímo pouze model a ten už se postará, aby jedn. položky měly platné indexy.
Co se týče fragmentu kódu, tak přesně pro tento účel se internalPointer ve stromové struktuře používá, nevidím na tom nic špatného - IMHO ho ale klidně můžete použít pro ukazatel na rodiče.
Proč podobně jako QFileSystemModel nenačítat data na vyžádání (canFetchMore() a fetchMore()) a nepoužívaná data (tj. jedn. větvě stromu) neodmazávat z modelu dle potřeby.
Vymazanie by zneplatnilo indexy a program by padol. Preto nemôžem použiť internalPointer, ale musím mať identifikátor, pomocou ktorého sa jednoznačne dajú nájsť dáta v databáze (internalId).
Čemu to ale vadí - k datům přistupuje přímo pouze model a ten už se postará, aby jedn.
Ak by sa už cache vymazala a ja by som dostal požiadavku na vrátenie dát k položke QModelIndex s neplatným interným pointrom tak môžem maximálne tak zhodiť aplikáciu. Nemám absolútne žiadnu informáciu o tom, ktoré dáta by som mal vrátiť. QModelIndex má akurát riadok, stĺpec a už neexistujúci interný pointer, takže v stromovej štruktúre neexistuje spôsob nájdenia správnych dát.
IMHO ho ale klidně můžete použít pro ukazatel na rodiče.
To viem, ale pre zjednodušenie som popisoval ako vytvoriť index z aktuálneho prvku. Bežne je ale pre mňa praktickejšie keď na prvej úrovni mám internalId 0 a zvyšné podľa rodičov. Stále to ale nie je riešenie, lebo ani rodičia sa do RAM nezmestia ;). S už zmazaným rodičom si teda tiež nijako nepomôžem.
Vymazanie by zneplatnilo indexy a program by padol. Preto nemôžem použiť internalPointer, ale musím mať identifikátor, pomocou ktorého sa jednoznačne dajú nájsť dáta v databáze (internalId).Ano, vymazání položek by zneplatnilo indexy - o tom by se ale napojené pohledy a případné proxy modely dověděly. Při použití indexů si model musí sám hlídat, jestli je index platný (a mimo model by se
internalPointer, resp. internalId IMHO používat nemělo - proto už to internal v názvu). Pokud se přesto někde používají, tak ochranou proti dangling pointers by bylo použití některé z smart pointer tříd v Qt.
Použití internalId tak, jak ho používáte teď, je IMHO v rozporu s určením třídy QModelIndex. Ta by měla sloužit jako index pro model, ne jako index pro data.
Co se týče řešení problému, napadají mě tyto možnosti:
Ja si tie indexy moc neviem ustrážiť v rámci modelu, inak mimo internalPointer nepoužívam.
Takže k dynamickému vymazaniu položiek ... no je to síce teoreticky pekné (a je na to zopár tried, takže stálo by to minimálnu námahu). Takýto postup som neskúšal, možno, že by navonok aj vyzeral ako funkčný ... ale nemám rád ani teoretickú možnosť zhodenia aplikácie takouto trivialitou.
Uvažujme situáciu, že mám model, view si z neho nejako berie dáta. V cache udržiavam pár položiek + cestu k nim. Cesta sa vyhodí z cache až vtedy keď sa odstránia aj položky cache, takže nejakým hrabnutím na parent nič nezhodím. Uvažujem situáciu, že užívateľ dosť brutálne scrolluje v zozname. Udalosti sa ukladajú do fronty. Povedzme, že vyhodím časť cache, ale vo fronte bude ešte požiadavka na volanie parent s parametrom index odkazujúcim na už odstránený prvok. Viem, že situácia, že toto nastane je pomerne zriedkavá, ale nie nemožná a mať aplikáciu, ktorá sa dá zhodiť obyčajným scrollovaním práve nechcem.
implementovat vlastní model index s informací, jak se dobrat k rodiči - tady je ale třeba mít na mysli, že indexy celkem masivně vznikají a zanikají a zásadně tím ovlivňují výkon a IMHO je to celkově v rozporu s návrhem indexů
V podstate je tu viacej zaujímavých nápadov, ale u tohto mi nedá nereagovať. Situácia je skutočne taká, že indexy dosť masívne vznikajú a zanikajú. Rozmýšľal som tak nad indexom, ktorý by mal odkaz na nadradený index a tie odkazy automaticky spravovať (automatické pointre a tak). Určite je tam veľa technických prekážok, ale to je asi tak moja predstava ideálneho indexu. Pomocou indexu by sa dala získať celá cesta. Len neviem ako by som to reálne implementoval ;)
Ja pre tento účel využijem hodnotu interného id. Ak vieme, že v tabuľke nebude > 2^30 hodnôt môžeme vrchné 2 bity obetovať na identifikátor tabuľkyZase něco předpokládáme? Třeba velikost intu? Nebo jste použil něco jako qint32 (jestli to existuje)?
Tak od tohto komentáru som čakal viacej, takže pekne poporiadku ;)
Ty vole, oni indexujou intama a já ve svém modelu potřebuju 3 miliardy položek a na mém systému to má rozsah jen -+2mld+-autobus
Áno aj nie, je možné vytvárať model priamo z pointra a vtedy je veľkosť podľa platformy. Je možné vytvoriť index aj z ich 32-bitového int-u a ten zdieľa rovnaké pamäťové miesto ako pointer (klasický union, žiadna mágia). Klasický zoznam teda v žiadnom prípade nebude slabinou ich MVC architektúry. Ale stačí môj príklad s 3-úrovňovou štruktúrou a už neviem nájsť elegantné riešenie (to, ktoré som použil je len núdzové).
Zase něco předpokládáme? Třeba velikost intu? Nebo jste použil něco jako qint32 (jestli to existuje)?
createIndex(int row, int column, quint32 id) const
Ako alternatívu som mohol použiť interný pointer a správať sa k nemu nie ako k pointru, ale ako k číslu.
createIndex(int row, int column, void * ptr = 0)createIndex(int row, int column, quint32 id) constOk, vždyť já se ptal. Oni v Qt rádi používají inty či longy k přetypování z pointeru, tak jsem se chtěl ujistit, jestli tu opravdu je typ s pevnou velikostí. Jinak to s tím indexováním intem souvisí i s tím
int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) - vrací to int, takže počet řádků je daný intem - je to sice pro toho rodiče a tak by jich teoreticky mohlo víc, ale kdo ví, jak to pak Qt sčítá.
Oni v Qt rádi používají inty či longy k přetypování z pointeruOpravdu?
def index(self, row, column, parent):
if row < 0 or column < 0 or row >= self.rowCount(parent) or column >= self.columnCount(parent):
return QtCore.QModelIndex()
if not parent.isValid():
# koren
return self.createIndex(row, column, self.items[row])
else:
# deti
item = parent.internalPointer()
if item not in self._records_cache:
self._records_cache[item] = list(item.records.values())
records = self._records_cache[item]
return self.createIndex(row, column, records[row])
def parent(self, child):
data = child.internalPointer()
if isinstance(data, archive.Item):
# koren
return QtCore.QModelIndex()
elif isinstance(data, archive.Record):
# deti
record = data
item = record.item
row = self.items.index(item)
column = 0
parent = QtCore.QModelIndex() # takto se ziska index pro ktery isValid() je False, tj. rodic je korenova polozka
return self.index(row, column, parent)
else:
return QtCore.QModelIndex()
internalPointer slouží čistě k vašim potřebám. Dá se do něj uložit třeba primary key zobrazované položky, která se na tom indexu (buňce) nachází, cesta k elementu v XML, cokoli se vám zachce. V příkladu výše se do internalPointeru ukládá odkaz na SQLAlchemy položku z databáze.
Ještě jsem v komentářích viděl zmínku o neustálém vytváření a rušení QVariant - věřte, že view volá data() pouze pro položky, které má zobrazit. A na obrazovku se najednou více než pár stovek buněk nevejde. Jediné, kde to zpomaluje je pokud nastavíte přizpůsobení šířky sloupce view podle obsahu, pak to musí projít všechny indexy v daném sloupci, aby zjistilo ten nejdelší.
Tiež takto riešim implementáciu index a parent ak je to možné. V mojom príklade by to ale padlo na tomto:
self._records_cache[item] = list(item.records.values())
U mňa totiž po určitej dobe nepoužívania (neberte to ako časovo, ale počet prístupov) vymažem položku item, takže internalPointer by už ukazoval na neplatnú pamäť. Preto to riešim znásilňovaním interného id vrchnými bitmi, ktoré v tomto prípade moc nevyužijem. To, čo zostalo dole je id v databáze.
Ještě jsem v komentářích viděl zmínku o neustálém vytváření a rušení QVariant - věřte, že view volá data() pouze pro položky, které má zobrazit.
Toto tvrdenie trochu poopravím pretože nie je to celkom pravda. Pri QTreeView-u ešte musí byť nastavené uniformRowHeights na true. No a keď už o tom píšem záťaž spôsobená QVariant-om je zanedbateľná.
Tiskni
Sdílej: