Dnes a zítra probíhá vývojářská konference Google I/O 2025. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).
V Bostonu probíhá konference Red Hat Summit 2025. Vybrané přednášky lze sledovat na YouTube. Dění lze sledovat na síti 𝕏 (#RHSummit).
Společnost Red Hat oficiálně oznámila vydání Red Hat Enterprise Linuxu 10. Vedle nových vlastností přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.
Tuto sobotu 24. května se koná historicky první komunitní den projektu Home Assistant. Zváni jsou všichni příznivci, nadšenci a uživatelé tohoto projektu. Pro účast je potřebná registrace. Odkazy na akce v Praze a v Bratislavě.
Troy Hunt představil Have I Been Pwned 2.0, tj. nový vylepšený web služby, kde si uživatelé mohou zkontrolovat, zda se jejich hesla a osobní údaje neobjevili v únicích dat a případně se nechat na další úniky upozorňovat.
Microsoft představil open source textový editor Edit bežící v terminálu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
V Seattlu a také online probíhá konference Microsoft Build 2025. Microsoft představuje své novinky. Windows Subsystem for Linux je nově open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
Z příspěvku Turris Sentinel – co přinesl rok 2024 na blogu CZ.NIC: "Za poslední rok (únor 2024 – únor 2025) jsme zachytili 8,3 miliardy incidentů a to z 232 zemí a z jejich závislých území. Tyto útoky přišly od 6,2 milionu útočníků (respektive unikátních adres). SMTP minipot je stále nejlákavější pastí, zhruba 79 % útoků bylo směřováno na tento minipot, 16 % útoků směřovalo na minipot Telnet, 3 % útoků směřovaly na minipot HTTP a 2 % na minipot FTP. Dále jsme zaznamenali 3,2 milionu unikátních hesel a 318 tisíc unikátních loginů, které útočníci zkoušeli."
Byla vydána (Mastodon, 𝕏) nová verze 3.0.4 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.
Byla vydána nová stabilní verze 7.4 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 136. Přehled novinek i s náhledy v příspěvku na blogu.
#include <czmq.h> static void s_actor1 (zsock_t *pipe, void *args) { char *name = strdup (args); zsock_signal (pipe, 0); for (int i = 0; i != 10; i++) zsys_info ("%s:\tcount %d\n", name, i); zstr_free (&name); } int main () { zactor_t *actor = zactor_new (s_actor1, "actor1"); while (true) { char *str = zstr_recv (actor); if (str) { puts (str); zstr_free (&str); } else break; } zactor_destroy (&actor); }Každý actor funkce očekává dva parametry, zeromq socket a void ukazatel na případná další data. Obvykle se args nevyplatí používat a pokud, tak na něco jako log_prefix. Rozhodně není dobrý nápad takto předávat třeba zeromq sockety. Technicky totiž actor běží v jiném vlákně. Parametr
pipe
je potom EXPAIR socket, který což je v podstatě obousměrná asynchronní roura. Ta funguje přes inproc
transport, takže všechny funkce send/recv pouze předávají ukazatele mezi vlákny. Výhodou je, že tyto funkce akceptují actor, zeromq socket, nebo pipe. Takže je používání konzistentní ze všech stran.
Třída zactor má velmi jednoduchý protokol, actor samotný musí oznámit pomocí zsys_signal
, že dokončil inicializaci a může zpracovávat zprávy. Druhým požadavkem je, že actor musí číst ze svého socketu a v případě příkazu $TERM se ukončit.
#include <czmq.h> static void s_actor1 (zsock_t *pipe, void *args) { char *name = strdup (args); zsock_signal (pipe, 0); for (int i = 0; i != 10; i++) zsys_info ("%s:\tcount %d\n", name, i); zstr_send (pipe, "$DONE"); zstr_free (&name); } čte a int main () { .... char *str = zstr_recv (actor); if (str && streq (str, "$DONE")) break;A tady vidíme flexibilitu třídy zactor, knihovny zeromq a posílání zpráv. Je triviální zajistit komunikaci mezi hlavním vláknem a actory.
static void s_actor1 (zsock_t *pipe, void *args) { zsock_signal (pipe, 0); zpoller_t *poller = zpoller_new (pipe, NULL); while (!zsys_interrupted) { void *which = zpoller_wait (poller, -1); if (!which) break; zmsg_t *msg = zmsg_recv (pipe); char *cmd = zmsg_popstr (msg); if (!cmd || streq (cmd, "$TERM")) { zmsg_destroy (&msg); zstr_free (&cmd); break; } else if (streq (cmd, "COUNT")) { char *smax = zmsg_popstr (msg); int max = atoi (smax); for (int i = 0; i != max; i++) zsys_info ("count %d", i); zstr_send (pipe, "$END"); } zmsg_destroy (&msg); zstr_free (&cmd); } zpoller_destroy (&poller); } ... int main () { zactor_t *actor = zactor_new (s_actor1, NULL); zstr_sendx (actor, "COUNT", "42", NULL);Posílání dat do actoru je snadné. Funkce
zstr_sendx
odešle zprávu s vícero rámci (frame), která bude předána actoru. V těle actoru je zpráva zpracována a provedena.
Typický actor ovšem nekomunikuje pouze ze svým socketem pipe, ale obvykle má otevřených vícero socketů, které mpořebuje číst. Na tohle se hodí další třída zpoller
, která čeká tak dlouho, než se na jednom ze sledovaných socketů neobjeví data, která je možné číst.
libmlm.so
) a démon (malamute
), který spouští actor mlm_server
. Tento model je extrémně flexibilní, protože umožňuje snadný vývoj, testování i integraci do libovolného kódu. V zásadě je smyčka pokus/omyl je extrémně krátká a zároveň vývojář nepotřebuje znát LD_PRELOAD
hacky jako cwrap
, socket_wrapper
a podobně.
Spuštění samotného brokeru potom vypadá zhruba takto ...
#include <malamute.h> ... char *endpoint = "inproc://@/malamute"; zactor_t *server = zactor_new (mlm_server, "Malamute"); if (verbose) zstr_sendx (server, "VERBOSE", NULL); zstr_sendx (server, "BIND", endpoint, NULL); while (true) { char *str = zstr_recv (server); if (str) { puts (str); zstr_free (&str); } else { zsys_info ("Interrupted"); break; } } zactor_destroy (&server);Celý malamute potom běží jako actor, který ovšem na některé formy komunikace spouští další actory. Stejně tak klientská část je actor, takže i přes poměrně jednoduché API člověk má program, kde beží a spolupracuje několik vláken. Ovšem o malamute až nekdy příště.
Tiskni
Sdílej:
Ladit takové systémy není zrovna triviální. Jsou tu tedy nějaké doporučené postupy – jak to co nejvíc zpřehlednit a usnadnit pochopení ostatním (a svému budoucímu já)? (protože psaní takových programů se někdy nejde vyhnout)Tak zrovna ohledně zeromq a actorů, tak postup je takový, že si člověk navrhne schéma a typ zpráv. Potom se postaví prototyp, který se otestuje na očekávaný výkon. No a pak se řeší binární formáty dat a podobně. V zásadě postup je rychlá iterace pokus/omyl a unit testy. Právě actor model a zprojekt k takovému stylu vývoje přímo vybízí. Ladit takové programy v debuggeru nelze (s výjimkou code dumpu). Jediná metoda jsou ladící výpisy. Výhoda je v tom, že při rychlém iterativním vývoji člověk napáchá pár chyb na jejichž řešení si na ta správná místa musí přidat ladící výpisy. Potom jsou obecnější rady, jako mít plně dokumentované a otestované API, nesdílet stav mezi komponentami a podobně.
Ladit takové programy v debuggeru nelze (s výjimkou code dumpu).Počítám, že na tyhle věci by se dal nasadit koncept Time traveling debuggeru, to by mohlo fungovat velmi pěkně. (Ačkoli implementace by asi nebyla úplně triviální.)