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.
První poznatek o Pieterovi. Jakožto editor verze 0.9 amqp měl potřebu svoje poznatky vtělovat do podoby RFC, čili specifikací. Stejně je tomu tak i v případě CLASS, neboli C language style for scalability.
A protože je jazyk C starý a jeho standardní knihovnu a posixová rozhraní tvořilo mnoho nezávislých týmů. Tohle všechno společně s tendencí C programátorů pro mikrooptimalizace a existence preprocesoru vede k tomu, že průměrný C kód je velmi špatně čitelný.
Základní poznatek je
If the code isn't readable on a grey Monday morning before coffee, chuck it out and start again
Ten rules of good code @hintjens
struct addrinfo hints, *res; int sockfd; // first, load up address structs with getaddrinfo(): memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // fill in my IP for me getaddrinfo(NULL, "3490", &hints, &res); // make a socket: sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); // bind it to the port we passed in to getaddrinfo(): bind(sockfd, res->ai_addr, res->ai_addrlen);A podobný kód v czmq
zsock_t *socket = zsock_new_router ("tcp://*:3490"); ... zsock_destroy (&socket);Pochopitelně se nejedná o ekvivalentní kód, kdy v jednom případě tvoříme klasický socket a ve druhém jeho zeromq abstrakci. Ale ilustruje to princip čitelnosti kódu, o kterém CLASS je. Mimochodem všechne kód je jak je, s přesvědčením, že půjde i zkompilovat.
#include <czmq.h> struct _globdom_t { size_t counter; bool kaboom; char *name; }; typedef struct _globdom_t globdom_t;Nutno podotknout, že globdom je neprůhledná (opaque) struktura, která není deklarována v hlavičkovém souboru.
globdom_t * globdom_new () { globdom_t *self = (globdom_t*) zmalloc (sizeof (globdom_t)); assert (self); self->counter = 0; self->kaboom = false; self->name = strdup (""); assert (self->name); return self; }Konstruktor je zodpovědný za alokaci paměti a nastavení výchozích hodnot.
void globdom_print (globdom_t *self) { assert (self); zsys_debug ("globdom:\n\tcounter=%zu\n\tkaboom=%s\n\tname=%s", self->counter, self->kaboom ? "true" : "false", self->name); }Print metoda není přesně vzato potřeba, ale velice usnadňuje ladění programu. Jelikož se czmq (a CLASS) obvykle používá na psaní asynchroního serverového kódu, ladění pomocí metody print je jediný použitelný způsob.
void globdom_destroy (globdom_t **self_p) { assert (self_p); if (*self_p) { globdom_t *self = *self_p; zstr_free (&self->name); free (self); *self_p = NULL; } }Destruktor je specifický tím, že očekává ukazatel na ukazatel. To proto, že zavolání destroy vyNULLuje ukazatel v nadřazeném kontextu. A díky tomu je možné jej volat vícekrát aniž by kód spadnul na double free chyby. Srovnejte s libc funkcí free a nechvalně známou double free error.
const char* globdom_name (globdom_t *self) { assert (self); return (const char*) self->name; } char* globdom_get_name (globdom_t *self) { assert (self); return strdup (self->name); }Metody pro přístup k položkám. Obvykle se vrací ukazatel zevnitř struktury. Klíčové slovo const se používá ke zdůraznění faktu, že se nepředává vlastnictví objektu. Nicméně existuje i druhá možnost a to vracet nový objekt. Dokumentace potom musí zmiňovat, že je volající zodpovědný za zrušení vráceného objektu.
void globdom_set_name (globdom_t *self, const char* name) { assert (self); assert (name); zstr_free (&self->name); self->name = strdup (name); }Nastavení nové hodnoty je triviální. Obvykle chceme daný objekt vlastnit, na což je ideální funkce strdup. A ano, v položce mohou být nějaká data, takže je vhodné je zrušit.
void globdom_test (bool verbose) { printf (" * myp_myclass: "); // Conduct tests of every method globdom_t *self = globdom_new (); assert (self); assert (streq (globdom_name (self), "")); globdom_set_name (self, "NAME"); assert (streq (globdom_name (self), "NAME")); globdom_destroy (&self); globdom_destroy (&self); printf ("OK\n"); }A nakonec by každá třída měla mít unit test. Vzhledem k tomu, že se jedná o C, je vhodné unit test pustit i pod valgrind.
Pozorní čtenáři si jistě všimli zvláštní konstrukce strdup ("") v konstruktoru. Typický C programátor nechce zbytečně plýtvat cykly CPU, takže by napsal self->name = NULL. Což je možné, ale potom je potřeba to všech metod třídy naprogramovat kód pro obsluhu NULL. Použití strdup vede na jednodušší kód bez zbytečných podmínek. A jednodušší kód je lepší, než ten komplikovaný.
Příště se podíváme na generování kódu a zproject.
Edit: jenom dodatek k C++ dole. Sice je mi trapné postoval "slovo" Boží, nicméně velkou Pietrovou předností bylo to, jak dokáže formulovat myšlenky.
7. Technology is a tool, not a tribal affiliation.
Never turn pragmatic choice of tools into a belief system. I have written editors and code generators in COBOL 74. The language matters little.
Ten habits of good programmer @hintjens
Cheap is important. Learn to use Linux, and a cheap or second-hand PC. Learn the command line. Stick with small languages like C, instead of massive languages like C++. Learning a larger language does not make you a better programmer. Ten Tips for Young Programmers @hintjens
Tiskni
Sdílej:
Tohle znáš? O objektu, struktuře a gotu.Ehh, to je zas ptákovina. Zas se někdo potřebuje cítit na výši nad ostatními. Někteří k tomuto účelu využívají svou znalost dizajn paternů a entrprajs Javy, jiní zase zalost embedded přístupu. U někoho, kdo pracuje s embedded mě tenhle postoj trochu zamrzel, čekal bych u těhle lidí větší nadhled...
Už se ti někdy stalo že se ti nevešel program do Arduina?Stalo a nikdy za to nemohlo použití objektů. Jinak tohle je argument jako prase. Už se ti někdy stalo že se ti nevešel program do arduina? Tak bys měl používat všude assembler, i když píšeš na desktopu, protože všechno je zlo a všichni jsou neschopní, jen já vím jak na to.
Už se ti někdy stalo že se ti nevešel program do Arduina?To, že někdo nerozumí objektům, resp. jak fungují pod kapotou, a v důsledku toho je nemůže úspěšně použít pro embedded, není úplně důvod, proč by na tom ostatní museli být nutně stejně.
Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++.
Chtěl jsem napsat, že jste si naběhl na vidle, protože za tohle vás místní vyznavači zásady "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool" rozcupují na kousky. Ale jak vidím, už je pozdě. Tak příjemnou zábavu… :-)
Chtěl jsem napsat, že jste si naběhl na vidle, protože za tohle vás místní vyznavači zásady "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool" rozcupují na kousky. Ale jak vidím, už je pozdě. Tak příjemnou zábavu…Ono hlavně C++ není skutečně objektový jazyk ani omylem. Objekty jsou tam naroubované jak rakovina na C.
"žádný jazyk, který používá víc než deset lidí, nemůže být dost cool"Hlavně žádný jazyk není skutečně objektový
Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++C++ má svoje výhody, zejména práce s kolekcemi (až na odporné STL API). Na druhou stranu i spoustu nevýhod, jako komplexní pravidla (rule of five), pomalá kompilace, nutnost dávat implementaci do hlavičkových souborů, neexistující ABI, ... Obvykle je to tak, že než já vyšperkuju třídu v C++, tak v C už mám dávno implementaci hotovou
Hele on zije
Pozorní čtenáři si jistě všimli zvláštní konstrukce strdup ("") v konstruktoru. Typický C programátor nechce zbytečně plýtvat cykly CPU, takže by napsal self->name = NULL. Což je možné, ale potom je potřeba to všech metod třídy naprogramovat kód pro obsluhu NULL. Použití strdup vede na jednodušší kód bez zbytečných podmínek. A jednodušší kód je lepší, než ten komplikovaný.No, je pravda, že použít
strdup("")
na inicializace řetězce dělá věci jedodušší, nicméně osobně bych raději udělal nějaký chytrý wrapper (možná by stačilo i makro), který obsahuje test na NULL (něco jako realloc()
, ale pro řetězce), protože mít na haldě spousty pidiřetězců velkých jeden byte mi případá jako velmi neelegantní řešení.
A i když test na NULL je podmínka a tudíž skok, ve výsledku se přeloži jako jedna instrukce, zatímco ten kód, který následuje při dealokaci objektu z haldy, bude určitě obsahovat mnohem více skoků (například kvůli implementaci scelování) a navíc sahání do paměti, která nemusí být zrovna nacachované.