Tim Cook po 15 letech opustí post generálního ředitele americké technologické společnosti Apple. Od 1. září ho vystřídá John Ternus, který byl dosud odpovědný za hardware. Cook se stane předsedou představenstva. Cook vedl Apple od roku 2011, kdy funkci převzal od zesnulého spoluzakladatele společnosti Stevea Jobse.
Evropská aplikace na ověřování věku uživatelů lze hacknout během dvou minut, navzdory tvrzením předsedkyně Evropské komise Uršuly von der Leyenové, že je tato aplikace 'technicky připravená pro ostré nasazení' a 'splňuje nejvyšší standardy ochrany osobních údajů na světě'. Zdrojové kódy aplikace byly Bruselem zveřejněny v repozitářích na GitHubu.
Po 26 letech od protiprávního policejního zásahu, který byl spuštěn na základě podnětu společnosti Microsoft, Obvodní soud pro Prahu 2 rozsudkem potvrdil, že Mironet prokázal významnou část svého nároku na náhradu škody vůči Ministerstvu spravedlnosti ČR. Soudem nyní přiznaná část nároku znamená rekordní odškodné, jaké kdy české soudy přiznaly za nesprávný postup státu. Spor byl rozdělen na několik škod, u pravomocně uzavřených částí
… více »Lehké desktopové prostředí LXQt bylo vydáno ve verzi 2.4.0. Jde o převážně opravné vydání s drobnými vylepšeními podpory Waylandu.
Počítačová hra Kingdom Come: Deliverance 2 českého studia Warhorse získala cenu BAFTA v kategorii nejlepší příběh. V konkurenci pěti dalších nominovaných děl porazila i úspěšnou francouzskou hru Clair Obscur: Expedition 33, která v letošním ročníku získala cenu za nejlepší hru roku.
Projekt KDE oslaví v říjnu 30 let. Matthias Ettrich poslal 14. října 1996 do diskusní skupiny comp.os.linux.misc zprávu, která započala historii projektu. Důležité milníky jsou zobrazeny na časové ose KDE.
Byly vyhlášeny výsledky letošní volby vedoucí/ho projektu Debian (DPL, Wikipedie). Poprvé povede Debian žena. Novou vedoucí je Sruthi Chandran. Letos byla jedinou kandidátkou. Kandidovala již v letech 2020, 2021, 2024 a 2025. Na konferenci DebConf19 měla přednášku Is Debian (and Free Software) gender diverse enough?
Byla vydána nová verze 10.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přidána byla podpora Orange Pi 4 LTS. Přibyl balíček Prometheus.
Implementace VPN softwaru WireGuard (Wikipedie) pro Windows, tj. WireGuard pro Windows a WireGuardNT, dospěly do verze 1.0.
V Pekingu dnes proběhl 2. ročník půlmaratonu humanoidních robotů. První 3 místa obsadili roboti Honor Lightning v různých týmech. Nový rekord autonomního robota je 50 minut a 26 sekund. Operátorem řízený robot to zvládl i s pádem za 48 minut a 19 sekund. Řízení roboti měli časovou penalizaci 20 %. Před rokem nejrychlejší robot zvládl půlmaraton za 2 hodiny 40 minut a 42 sekund. Aktuální lidský rekord drží Jacob Kiplimo z Ugandy s časem 57 minut a 20 sekund [𝕏].
Jasně, nejedná se o nic převratného a tato technika se používa běžně. I tak si myslím že si zaslouží článek, už jen proto že jsem si k ní sám přišel přes JSON a až poté si uvědomil že se o nic převratného nejedná
.
Python přímo v základní distribuci obsahuje knihovny pro práci s ini (ConfigParser), JSON (json), balíčky pro yaml (pyYaml) jsou snad v každé distribuci. Já se pro konfiguraci našeho projektu rozhodl použít JSON, kvuli pokročilejší struktuře než jednoduché ini a také protože json modul je součástí standardní python distribuce. Ukázalo se to jako špatná volba, protože jednoduše naimportovat soubor jako python kód vyjde prakticky nastejno a navíc umožňuje používat callbacky, reference atd. Ukázalo se to jako dobrá volba, protože přejít z JSON na import python kódu je až drasticky jendoduché 
Předvedu na jednoduchém příkladu s vymyšlenou konfigurací jednoduchého serveru:
Json config:
{
"name":"lucifer",
"listen_ip":"127.0.0.1",
"listen_port":"666",
"requests" : {
"/A":"filepath",
"/B":"filepath"
}
}
Použití z pythonu
import json
conf = json.load(open('config_file'))
conf['name']
conf['requests']['/A']
# ...
Využijme toho, že JSON dictionary je vlastně validní python, takže stačí přidat název proměnné před JSON dictionary a nahradit json za imp a získame všechny výhody (a nevýyhody - musíme teď více duveřovat configum) loadováni přímo python kódu místo JSONu.
config:
config = {
"name":"lucifer",
"listen_ip":"127.0.0.1",
"listen_port":"666",
"requests" : {
"/A":"filepath",
"/B":"filepath"
}
}
Použití z pythonu
import imp
conf = imp.load_source("config","config_file").config
conf['name']
conf['requests']['/A']
# ...
Takto budou configy mnohem mocnější a jednoduše omezíme zbytečnou duplikaci.
Pokud například chceme pustit server jěšte na jednom extra portu a s jiným jménem
Druhý config:
import prvni_config config = prvni_config.config config["listen_port"] = "777" config["name"] = "inferno"
Tiskni
Sdílej:
. Tady se jedna o konfiguraci pro jednoduche skripty, pro ktere editor konfigurace nebude pouzit nikdy. A proste za danych podminek to je zajimavy reseni
Oproti tomu s programovanou konfigurací neexistuje (tedy alespoň není znám) způsob jak sestavit z načtené konfigurace zpět zdrojový soubor a při tom mít jistotu, že je stejný jako původní (s tolerancí na formátování). Takže případný editor konfigurace nemůže nic, než vygenerovat zcela nový konfigurační soubor a zahodit vše, čemu v předloze nerozuměl.Hm, dumam tady jiz chvili nad nevyhodou reseni obycejneho rekurzivniho pruchodu strukturou, serazeni polozek napr. podle abecedy a ulozeni (v pripade kolekce samozrejme nic neradit a zachovat stavajici poradi). V ukladani a nacitani a pripadnem pouzivani diffu na takoveto konfiguraky by nemely nastat zadne problemy, takze vidim problem akorat v tom, ze se v konfiguraku muze objevit nejaky skodlivy kod nestatickeho (spustitelneho) charakteru jako velke bezpecnostni riziko. Celkovy prinos tohoto jednodussiho reseni imho ale prevazi pred nedostatky.
# prvni config
config = {
"name":"lucifer",
"listen_ip":"127.0.0.1",
"listen_port":"666",
"requests" : {
"/A":"filepath",
"/B":"filepath"
}
}
# druhy config import prvni_config config = prvni_config.config config["listen_port"] = "777" config["name"] = "inferno"A chceš udělat grafický nástroj pro editaci takové konfigurace, aby to měl uživatel jednodušší. Zní to lehce. Načteš config, zobrazíš dialog s pár políčky, uživatel něco upraví a výsledek zas uložíš. S prvním configem problém není. Je to celkem jednoduchá datová struktura – pár vnořených hash tabulek, žádný problém. Ale co ten druhý config? Když ho načteš, dostaneš tohle:
config = {
"name":"inferno",
"listen_ip":"127.0.0.1",
"listen_port":"777",
"requests" : {
"/A":"filepath",
"/B":"filepath"
}
}
To je snadné. Ale hádej, co se stane, když to uložíš? A co se stane, když pak změníš první config?
config = {
"name":"inferno",
"listen_ip":"127.0.0.1",
"listen_port":"777",
"requests" : {
"/A":"filepath",
"/B":"filepath"
}
}
A nejak nepobiram proc bych mel menit prvni config. Rekneme, ze ho zmenim na nasledujici:
# prvni config
config = {
"name":"lucifer",
"surname":"the_big_boss",
"listen_ip":"127.0.0.1",
"listen_port":"666",
"requests" : {
"/A":"filepath",
"/B":"filepath",
"/C":"some_new_filepath"
}
}
Kdyz tohle nactu do GUI, nic divneho se nestane a bude to v poradku upravitelne. Kdyz na to postvu diff, bude to krasne citelny patch a tedy se take nic hrozneho nestane.
Ano, spatne jsem se vyspal, takze muzu pekne placat, ale proste mi porad nedochazi v cem je problem
.
.
Nebylo by lepší používat třídy/instance + mapování na nějaký serializační formát.Co by tím získal, kromě pár set řádků zbytečného kódu navíc?
"listen_port", "requests" a další) se obecně nedoporučuje (nejen) kvůli překlepům a je tedy vhodné použít místo toho konstanty. Pak se mi to ale rozpadne a rozplizne – někde mám definované konstanty stylem:
CONFIG_NAME = "name"; CONFIG_LISTEN_IP = "listen_ip";a všude možně v kódu roztroušená volání
config[CONFIG_NAME]. A nikde není na jednom místě definovaná ta struktura – v konfiguráku bude zase jen nějaká ukázka, v dokumentaci možná výčet parametrů… ale víme, jak to chodí s dokumentací – jednak není strojově čitelná a jednak se někdy zapomíná na její aktualizaci. Proto považuji za užitečné mít někde (definice třídy/tříd) definovanou celou strukturu konfigurace.
Pak když někde ty konfigurační volby používáš, tak je taky příjemné, když napíšeš instance.vlastnost a IDE ti napovídá, jaké vlastnosti tam jsou + jejich dokumentaci, místo abys střílel od boku nějaké config[KONSTANTA_NEBO_LITERÁL] a doufal, že tam taková vlastnost bude a že bude mít význam, který předpokládáš, doufat, že jsi neudělal překlep nebo nepoužil konstantu patřící do jiného rozsahu (to se sice dá řešit přes různé předpony – ale při větší strukturovanosti je to odporně dlouhé…). Proč vlastně nepoužít OOP, když ho máme k dispozici?
Přijde mi, že jedna třída s pár „zbytečnými“ řádky navíc dokáže ušetřit spoustu dokumentace, příkladů, zbytečného kódu jinde a hlavně nervů a nejistoty (např. překlepy v literálech nezřídka vedou k tomu, že program sice nespadne, ale funguje špatně a na chybu je obtížné přijít).
class Config(object): pass config = Config() config.__dict__ = literal_eval(read(config_path))a mas ze slovniku udelanej (uplne zbytecnej) objekt. Bum.
.
V takovych pripadech se uvedene "problemy" resi konvencemi.
Ono pak taky budeš chtít napsat dokumentaci, takže nějaká struktura, která popíše přípustné volby, jejich hodnoty a jejich význam je celkem potřeba.No právě. Použil bych třídu + anotace a dalo by se z toho vygenerovat XML schéma a docela slušná dokumentace.
Asi bych takovou strukturu dal parseru a přihodil do ní i funkce… Takže vše bude pohromadě a přehledné.Můžeš napsat nějakou ukázku? Zajímalo by mne, jak by se tohle řešilo v Pythonu.
json_encode(json_decode(json)), tak dostaneš přesně to samé jako na vstupu (až na nevýznamné bílé znaky). To hodně zjednodušuje práci s takto uloženými daty. Přidání komentářů tohle buď rozbije, nebo neskutečně zesložití práci. Takže vlastně nevýhoda JSONu je jeho výhodou.
Ale na ručně upravovanou konfiguraci se to opravdu moc nehodí. Naopak na konfiguraci upravovanou z nějakého GUI to je super, neboť to zůstává snadno upravovatelné i bez GUI, ale přitom se nic neztratí.
To hodně zjednodušuje práci s takto uloženými daty. Přidání komentářů tohle buď rozbije, nebo neskutečně zesložití práci. Takže vlastně nevýhoda JSONu je jeho výhodou.V XML je komentář uzlem a není problém je uložit zpět stejně jako ostatní druhy uzlů (textové, elementy atd.).
http://docs.python.org/2/library/pickle.html
>>> pickle.dump({'x':'y'},open('/tmp/yodawg','w') )
>>> d = pickle.load(open('/tmp/yodawg'))
>>> print (d)
Ale jasne, jestli tam je pozadavek na rucni editaci, tak bych sel do JSONu.
Ano pickle znám, problém je s tím, že nezapíšete to co máte ve slovníku.? Vždyť to v pohodě funguje. Na složitější věci je ale asi lepší shelve.
).