Na konferenci LinuxDays 2025 byl oficiálně představen nový router Turris Omnia NG.
Přímý přenos (YouTube) z konference LinuxDays 2025, jež probíhá tento víkend v Praze v prostorách FIT ČVUT. Na programu je spousta zajímavých přednášek.
V únoru loňského roku Úřad pro ochranu osobních údajů pravomocně uložil společnosti Avast Software pokutu 351 mil. Kč za porušení GDPR. Městský soud v Praze tuto pokutu na úterním jednání zrušil. Potvrdil ale, že společnost Avast porušila zákon, když skrze svůj zdarma dostupný antivirový program sledovala, které weby jeho uživatelé navštěvují, a tyto informace předávala dceřiné společnosti Jumpshot. Úřad pro ochranu osobních údajů
… více »Google Chrome 141 byl prohlášen za stabilní. Nejnovější stabilní verze 141.0.7390.54 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 21 bezpečnostních chyb. Za nejvážnější z nich (Heap buffer overflow in WebGPU) bylo vyplaceno 25 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.
eDoklady mají kvůli vysoké zátěži technické potíže. Ministerstvo vnitra doporučuje vzít si sebou klasický občanský průkaz nebo pas.
Novým prezidentem Free Software Foundation (FSF) se stal Ian Kelling.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za září (YouTube).
Vyšla kniha Počítačové programy a autorské právo. Podle internetových stránek nakladatelství je v knize "Významný prostor věnován otevřenému a svobodnému softwaru, jeho licencím, důsledkům jejich porušení a rizikům „nakažení“ proprietárního kódu režimem open source."
Red Hat řeší bezpečnostní incident, při kterém došlo k neoprávněnému přístupu do GitLab instance používané svým konzultačním týmem.
Immich byl vydán v první stabilní verzi 2.0.0 (YouTube). Jedná se o alternativu k výchozím aplikacím od Googlu a Applu pro správu fotografií a videí umožňující vlastní hosting serveru Immich. K vyzkoušení je demo. Immich je součástí balíčků open source aplikací FUTO. Zdrojové kódy jsou k dispozici na GitHubu pod licencí AGPL-3.0.
priklad.ui
je stejný jako minule.
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>98</width> <height>46</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"> <widget class="QPushButton" name="pushButton"> <property name="geometry"> <rect> <x>9</x> <y>9</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>PushButton</string> </property> <property name="checkable"> <bool>true</bool> </property> </widget> </widget> </widget> <resources/> <connections/> </ui>Příklad bude trochu jiný, než minule. Za prvé jsem přešel na Python 3.2 (takže musím psát print jako funkci, ale to je jen kosmetická změna kódu), za druhé jsem na objekt jsem přidal jednu vlastnost (
property
).
#!/usr/bin/env python import sys from PyQt4 import QtGui, QtCore, uic class MyApplication(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) uic.loadUi("priklad.ui", self) def run(self): self.show() self.app.exec_() @QtCore.pyqtSlot(bool, name="on_pushButton_clicked") def method_with_some_weird_name(self, value): print ("Clicked {}".format(value)) @QtCore.pyqtSlot(bool) # without this line the slot catches two signals: clicked() and clicked(bool) def on_pushButton_clicked(self, value): print ("Clicked2 {}".format(value)) def closeEvent(self, event): print ("Close event") event.accept() @property def something(self): print("Property get something called") @something.setter def something(self, value ): print("Property set something called with value {}".format(value)) def main(): app = QtGui.QApplication(sys.argv) MyApp = MyApplication() MyApp.app = app MyApp.run() if __name__ == '__main__': main()
Property get something calledcož není úplně to, co by člověk chtěl. V tomto případě je to neškodné, ale pokud se za vyčtením vlastnosti skrývá něco jiného, než přeposlání atributu (
attribute
) objektu, může to způsobit potíže. Toto chování nezáleží na tom, jestli je vlastnost zapsaná pomocí dekorátoru nebo pomocí funkce property()
.
Pokud bude vyčtení vlastnosti například zahrnovat delší výpočet, máme na krku výkonostní problémy. Pokud vyčtení vlastnosti mění stav objektu, může to působit velké potíže v aplikaci a mnoho šedin programátorovi (kdybyste si třeba chtěli počítat, kolikrát byla vyčtena vlastnost, falírovala by tam jednička). Pokud by nedej Bože vyčtení vyžadovalo výpočet s něčím, co není v tu chvíli inicializované (například nastavení něčeho, co se nastavuje z venku přes setter
), máme na krku velký problém.
QtCore.QMetaObject.connectSlotsByName
, která se volá ve funkci createConnections v souboru uicparser.py (v mé verzi Pyqt 4.8.5 to je řádek 861). Dokumentace k tomu píše:
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form ...
Nezkoumal jsem to až tak do podrobna, ale myslím si, že to rekurzivní hledání způsobí zavolání všech vlastností.
Tiskni
Sdílej:
... PS / 2 konektor pro vytvoření rovnováhy dědictví s nadstandardními funkcemi.PS/2 je technicky lepší než USB, teda aspoň pro klávesnice.
PyQt4.uic.loadUi
. Takže v tomto případě nemá smysl obě knihovny porovnávat.
I ten původní problém je způsoben Pythonem samotným. V C++ se nedá za vyčtění atributu schovat volání funkce, takže tam to problémy neudělá. Ale je možné, že PyQt tam dělá něco, co by mělo být programátorovi skryto.