Dict, set, list!

Przy okazji niedawnego code review dostałem pytanie, czemu w skrypcie napisanym w Pythonie nie korzystam z obiektu typu set, tylko z dict. Chodziło o cache na kilka tysięcy elementów, odpytywany kilkaset tysięcy razy. Z przyzerowym hit ratio. Zdziwiłem się, bo kojarzyłem, że czytelna konstrukcja wykorzystująca in dla obiektu typu list

data = [x for x in range(1000)]
y = 1001
if y in data:
    print("Hit")

jest raczej wolna. Zwłaszcza w porównaniu z nieco mniej czytelnym wariantem z użyciem dict:

data = {x: True for x in range(1000)}
y = 1001
if data.get(y):
    print("Hit")

Odpisałem o co chodziło i usłyszałem, że przecież set jest szybki. Coś mi zaświtało. Bo niby set jest bardziej podobny w użyciu do listy, ale pod spodem ma parę ciekawych właściwości. Zresztą, gdy poprosimy LLM o optymalizację pod kątem szybkości, otrzymamy coś w stylu[1]:

data = {x for x in range(1000)} # Converted 'data' to a set
y = 1001
if y in data:  # Checking membership still works the same way
    print("Hit")

Różnice w czasie wykonania możemy zgrubnie i niezbyt elegancko sprawdzić w następujący sposób:

Jak już jesteśmy przy tego typu ciekawostkach. A co jeśli mamy w cache ciągi znaków i chcemy sprawdzić, czy nasz ciąg znaków nie kończy się jednym z ciągów z cache? LLM poproszony o optymalizację znowu podpowiada, że lepszy jest set. Ale nieoczekiwanie sugeruje też wykorzystanie regexpów. I co? Ku mojemu zaskoczeniu regexp w stylu

pattern = re.compile("("+"|".join(our_set)+")"$")
return bool(pattern.search(tested_value))

okazuje się najszybszym rozwiązaniem! Nie to, że uważam regexpy za szczególnie wolne, co to, to nie. Oczywiście pattern wykonujemy raz, nie dla każdej testowanej wartości.

Dalsza lektura:
O’reily High performance Python Dictionaries and Sets

[1] Tak, różnica niezbyt rzuca się w oczy przy takim zapisie. Mało widać różnicę między dict a set. Kiedyś już o tym wspominałem. Czytelniejszy zapis – którego chyba nikt nie używa – tamże.

MacOS 14.2 – nie działa hidutil

Ja jeszcze nie zaktualizowałem MacOS do wersji Sonoma, ale znajomi zdążyli to zrobić i narzekają, że polecenie hidutil przestało działać. Nie zwraca błędu, ale nie mapuje klawiszy. W związku z tym polecane kiedyś przeze mnie mapowanie klawiszy bez użycia Karabiner Elements również nie będzie działać.

Sprawdzonego rozwiązania w tej chwili nie podam, zamiast tego odsyłam do wątku na forum Apple oraz wątku na Reddicie. Jest tam wiele pomysłów na rozwiązanie, można przymierzyć – może ktoś znajdzie satysfakcjonujące dla siebie.

Ludzie zgłaszają błąd do Apple, więc liczę, że błąd zostanie poprawiony w kolejnej aktualizacji. Mapowanie bez dodatkowych programów było eleganckie.

Ubuntu – płatne bezpieczeństwo

Ubuntu LTS kojarzy się nam z dystrybucją stabilną i bezpieczną, prawda? Otóż niezupełnie tak jest. Bowiem nie wszystkie pakiety w Ubuntu LTS (np. 20.04 LTS czy 22.04 LTS) otrzymują aktualizacje bezpieczeństwa. Przynajmniej nie za darmo. Od strony technicznej, które pakiety otrzymują aktualizacje (main), a które niekoniecznie (universe) przeczytacie w artykule na nfsec.pl, podobnie jak o genezie szumu wokół Ubuntu i repozytorium ESM (Expanded Security Maintenance).

Zarys sytuacji

Zamiast na stronie technicznej, skupię się na stronie etycznej i prawnej. Sytuacja wygląda bowiem na dość skomplikowaną. Tytułem wprowadzenia niezbędny skrót. Ubuntu w ramach Ubuntu Pro daje między innymi dostęp do repozytorium ESM, które zawiera łatki bezpieczeństwa do tych pakietów z repozytorium universe, do których zostały one przygotowane przez opłaconych przez Ubuntu maintainterów, zamiast przez maintainerów ze społeczności. Osoby fizyczne (personal) mogą bezpłatnie korzystać z Ubuntu Pro na maksymalnie 5 systemach. Natomiast firmy (enterprise) powinny zapłacić za dostęp, albo… nie korzystać z załatanych pakietów. Jest jeszcze trzecia kategoria – edukacja (education, research, and academia). Też powinni kupić, ale dostaną zniżkę w niejawnej wysokości.

Abonament na bezpieczeństwo

Mam mocno mieszane uczucia w stosunku do tego podejścia. Z jednej strony nie ulega wątpliwości, że maintainerzy, którzy wykonali na zlecenie pracę, której nikt nie chciał podjąć się za darmo, powinni otrzymać wynagrodzenie. Z drugiej strony, jest to podcinanie gałęzi, na której się siedzi i z której Ubuntu wyrasta. Bowiem maintainterzy społeczności mogą dojść do wniosku, że nie ma sensu robić za darmo tego, za co inni otrzymują wynagrodzenie. To z czasem może przełożyć się na gorsze wsparcie wolnego oprogramowania, w szczególności dystrybucji opartych o pakiety deb.

Kolejny aspekt to pewnego rodzaju szantaż w stosunku do użytkowników. Niby system i oprogramowanie są za darmo, ale jak chcesz mieć bezpiecznie, to zapłać… Płatne bezpieczeństwo to skomplikowane zagadnienie. Co powiecie na abonament na ABS, poduszki powietrzne czy pasy bezpieczeństwa w aucie? Albo jeszcze lepiej: hamulce w wersji zwykłej i pro, te drugie zapewniające krótszą drogę hamowania? I wszystko to rzecz jasna w formie abonamentu, czyli wszędzie jest zamontowane, ale trzeba zapłacić, by było aktywne.

Opłata za udostępnianie

No i ostatnia sprawa – czy Ubuntu może w ogóle brać pieniądze za udostępnianie oprogramowania na wolnych licencjach? Ograniczę się do licencji GPL. Zarówno wersja druga, jak i trzecia GPL wprost mówi, że akt udostępnienia oprogramowania może być zarówno darmowy, jak i płatny. Czyli Ubuntu może żądać wynagrodzenia za udostępnienie oprogramowania.

Jednak jednocześnie GPL zabrania zmiany licencji[1], a licencjonobiorca nabywa wszystkie prawa. W szczególności prawo do dalszej dystrybucji. Czyli czy dowolna osoba może skorzystać z Ubuntu Pro w wersji personal, pobrać z repozytorium ESM pakiety lub kod źródłowy i udostępnić je na swoim serwerze każdemu chętnemu? IANAL, ale wygląda na to, że tak. Przynajmniej te pakiety/patche wydane na licencji GPL.

O sprawie zaczęło się robić głośno dopiero teraz i sam jestem ciekaw, czy jakoś bardziej się to rozwinie i jak się ostatecznie skończy. Trzeba pamiętać, że Ubuntu Pro to znacznie więcej, niż tylko dostęp do załatanych pakietów z repozytorium universe w ramach ESM. To także możliwość aktualizacji kernela bez konieczności restartu systemu, support 24/7. Być może lepszą strategią dla Canonical byłoby udostępnienie patchy społeczności za darmo? Tym bardziej, że z prawnego punktu widzenia raczej są na przegranej pozycji, przynajmniej w kontekście licencji GPL.

[1] Pomijam tu przypadki oprogramowania wydawanego równolegle na kilku licencjach. Wówczas można wybrać, którą licencję się wybrało i modyfikować tylko kod na tej wybranej, dystrybuując go zgodnie z jej – i tylko jej – postanowieniami.