abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 12:00 | Nová verze

Po cca 3 týdnech od vydání Linux Mintu 18.3 s kódovým jménem Sylvia a prostředími MATE a Cinnamon byla oznámena také vydání s prostředími KDE a Xfce. Podrobnosti v poznámkách k vydání (KDE, Xfce) a v přehledech novinek s náhledy (KDE, Xfce). Linux Mint 18.3 je podporován do roku 2021.

Ladislav Hagara | Komentářů: 0
včera 12:55 | Nová verze

Byla vydána verze 17.12.0 KDE Aplikací (KDE Applications). Přehled novinek v kompletním seznamu změn a na stránce s dalšími informacemi. Aplikace, které nebyly dosud portovány na KDE Frameworks 5, byly z KDE Aplikací odstraněny.

Ladislav Hagara | Komentářů: 34
včera 03:00 | Komunita

Na Humble Bundle lze získat počítačovou hru Company of Heroes 2 (Wikipedie, YouTube) běžící také v Linuxu zdarma. Speciální akce končí v sobotu v 19:00.

Ladislav Hagara | Komentářů: 0
včera 02:00 | Zajímavý software

Christian Kellner představil na svém blogu projekt Bolt řešící bezpečnost rozhraní Thunderbolt 3 na Linuxu. Pomocí příkazu boltctl nebo rozšíření GNOME Shellu lze komunikovat s démonem boltd a například zakázat neznámá zařízení a předejít tak útokům typu Thunderstrike nebo DMA.

Ladislav Hagara | Komentářů: 8
včera 01:00 | Nová verze

Po půl roce vývoje od vydání verze 11.0 byla vydána verze 11.1 svobodného softwaru pro vytváření datových úložišť na síti FreeNAS (Wikipedie). Nejnovější FreeNAS je postaven na FreeBSD 11.1. Přehled novinek v příspěvku na blogu. Zdůraznit lze zvýšení výkonu OpenZFS, počáteční podporu Dockeru nebo synchronizaci s cloudovými službami Amazon S3 (Simple Storage Services), Backblaze B2 Cloud, Google Cloud a Microsoft Azure

Ladislav Hagara | Komentářů: 0
14.12. 23:55 | Nová verze

Po dvou měsících vývoje od vydání verze 235 oznámil Lennart Poettering vydání verze 236 správce systému a služeb systemd (GitHub, NEWS).

Ladislav Hagara | Komentářů: 8
14.12. 20:00 | Nová verze Ladislav Hagara | Komentářů: 0
14.12. 19:33 | Pozvánky

Pražská Fedora 27 Release Party, oslava nedávného vydání Fedory 27, se uskuteční 19. prosince od 19:00 v prostorách společnosti Etnetera (Jankovcova 1037/49). Na programu budou přednášky o novinkách, diskuse, neřízený networking atd.

Ladislav Hagara | Komentářů: 0
14.12. 18:11 | Nová verze

Byla vydána verze 2.11.0 QEMU (Wikipedie). Přispělo 165 vývojářů. Provedeno bylo více než 2 000 commitů. Přehled úprav a nových vlastností v seznamu změn.

Ladislav Hagara | Komentářů: 0
14.12. 17:44 | Komunita

Canonical oznámil dostupnost kryptografických balíčků s certifikací FIPS 140-2 úrovně 1 pro Ubuntu 16.04 LTS pro předplatitele podpory Ubuntu Advantage Advanced. Certifikace FIPS (Federal Information Processing Standards) jsou vyžadovány (nejenom) vládními institucemi USA.

Ladislav Hagara | Komentářů: 3
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (8%)
 (0%)
 (1%)
 (1%)
 (76%)
 (14%)
Celkem 1001 hlasů
 Komentářů: 45, poslední 1.12. 19:00
    Rozcestník

    Co nás ph naučil 1: C a CLASS

    21.10.2016 22:13 | Přečteno: 1944× | Jen tak | Výběrový blog | poslední úprava: 23.10.2016 07:35

    Od minulého blogu o Pieterovi uplynul nějaký čas. Ten zápisek byl spíše obraz mých myšlenek v tu chvíli, ale i tak by bylo dobré se podělit o to, co nás Pieter naučil, když žil.

    Proč CLASS

    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

    CLASS

    Tak nejprve příklad na "standardní" C. Berkley socket API (z Beej's socket guide).
    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.

    Základní metody

    Každá třída poskytuje alespoň jeden konstruktor s názvem třída_new. Ten je zodpovědný za alokaci paměti a nastavení členů.
    #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.

    Shrnutí

    CLASS je styl C, který klade důrat na čitelnost a uniformní API. Naopak závislot na haldě může být pro některé aplikace problém. Ostatně nevýhody tohoto stylu jsou v RFC popsány. Nicméně z osobní zkušenosti můžu říct, že používání CLASS knihoven jako czmq, nebo malamute dělá z C poměrně rozumný a snadno použitelný jazyk.

    Grey Monday a strdup

    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
           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Bedňa avatar 21.10.2016 23:56 Bedňa | skóre: 34 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Mimo tému, ale keď som si 0MQ pozeral, tak som narazil na CurveZMQ. V akom štádiu je posielaie zašifrovaných správ vlastne dnes. Nikdy som to neskúšal, len keď tu o ňom niečo padne preklikám si to a pozriem video.
    Pokecajte si s umelou stupiditou na http://www.kernelultras.org/
    22.10.2016 07:58 sad
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Já se snad to objektové programování naučím, i když vypadá úplně šíleně, ale zřejmě by ho měl běžný programátor ovládat. Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++.

    A nebyla to zbytečná práce přepisovat unixové knihovny z procedurálního stylu do objektového?
    22.10.2016 08:26 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    "s nějakým skutečně objektovým jazykem, asi C++"

    Tak tomuhle jsem se v sobotu po ránu opravdu dobře zasmál :-D

    Tohle znáš? O objektu, struktuře a gotu.
    oryctolagus avatar 22.10.2016 12:28 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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...
    There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
    Bystroushaak avatar 22.10.2016 18:57 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    +1, taky jsem to chtěl napsat (autor se v tom doslova vyžívá i v ostatních článcích), ale pak se mi to nechtělo vysvětlovat.
    23.10.2016 09:59 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Už se ti někdy stalo že se ti nevešel program do Arduina? ;-)
    23.10.2016 10:29 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    To, že se nevejde na zásobník, se člověku snadno stane i na x86_64.
    23.10.2016 12:21 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Ne proměnné, ale kód!
    23.10.2016 14:24 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Není to jedno? Vlastně není: když se nevejde program (binárka) do paměti, přijdu na to nejpozději při pokusu spustit ho; když se nevejde na zásobník, stane se to v nějakém pseudonáhodném okamžiku za běhu, což je horší.
    Bystroushaak avatar 23.10.2016 15:17 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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.
    oryctolagus avatar 23.10.2016 23:21 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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ě.
    There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
    pavlix avatar 23.10.2016 23:24 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Bavíme se ještě pořád o místu v paměti pro uložení datové struktury nebo její části?
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    27.10.2016 04:13 hypvofxy | skóre: 5 | blog: hypvofxy
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Martin Maly je kapitola sama o sobe. Jaky je v realu netusim, ale ve svych postech ma tendence lidi kategorizovat a povysovat se nad ne. Ma docela siroky rozhled mezi obory, ale vesmes mi prijde, ze krome psani, programovani starych pocitacu a trochu webu, toho ani moc neumi a spis jen tak do kde koho rype. Sam o sobe tvrdi, ze neni programator, a dnesni programovani mu pripada zcela nezajimave, na coz si pak kladu otazku, jestli je to jeho neznalosti (a vlastne vubec nevi, co se v dnesnim programovani taky da resit), nebo celkovym nezajmem o obor jako takovy (protoze mezi konickem a praci samozrejme existuji znacne rozdily). Ty jeho caste zmeny zamestnani muzou na urcitou nestalost trochu poukazovat...
    vlk avatar 23.10.2016 22:37 vlk | skóre: 22 | blog: u_vlka
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    programujem jednocipy a niektore z mojich pravidiel su:
    - pisem v c++11 (alebo novsie) a vsetko v objektoch
    - ziadne globalne premenne (len vynimocne aby som sa dostal k objektu z preruseni)
    - ziadny heap, aloc, free, new, delete (pripadne len vynimocne na prvotnu alokaciu objektov - bez nutnosti delete, alebo nad memory poolom)
    - ziadne vynimky
    - nepouzivam #define, #if, ..., nahrazujem ich templejtami, inline funkciami a static const
    - prerusenia len v casovo kritickych situaciach, inak sa dotazujem v hlavnej smycke pripadne vyuzivam DMA
    - vyhybam sa jednocipom, ktore neumoznuju nastavit stack cez celu RAM a nemaju spolocny adresny priestor cez RAM, FLASH a vsetky registre periferii, idealne ak maju 32bit zbernicu nad adresami aj datami, takze ziadne AVR to asi nebudu
    .....

    dalej, assembler je vhodny len na casovo kriticke operacie, pisat v assembleri cely program je na hlavu a hlavne takto napisany program bude podstane menej optimalny nez kod prelozeny z vyssieho jazyka.
    You don't exist, Go away !
    22.10.2016 12:27 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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… :-)

    Bystroushaak avatar 22.10.2016 18:58 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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.
    22.10.2016 21:00 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    A už je to tady…
    23.10.2016 07:30 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool"
    Hlavně žádný jazyk není skutečně objektový :-). Možná tak Self, nebo Javascript*

    * smajlík-vyjadřující-dobrovolné-naběhnutí-si-na-vidle
    When your hammer is C++, everything begins to look like a thumb.
    Bystroushaak avatar 23.10.2016 15:22 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Smalltalk je afaik taky kompletně objektový.

    Self potom určitě, ale tam to brzí implementace v C++ a momentálně miniaturní komunita, která postupuje šnečím tempem po desíti letech v podstatě nulového posunu. Kdyby se podařilo dopsat Klein (Self v Selfu), tak je to o dost dál.

    Javascript mi přijde zprasený, sice se Selfem inspiroval, ale ten prototype based přístup převzali tak nějak úplně blbě. Například tam chybí parent sloty a teď to tak různě mutuje, že to skoro dospívá k nějakému class based OOP.
    23.10.2016 07:26 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Nikdo nic nepřepisuje, czmq je naprosto nová knihovna :-) Navíc tento pattern není nový, například libmagic, nebo libabc, nebo hormada dalšího kódu.
    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 :-)
    When your hammer is C++, everything begins to look like a thumb.
    Tomáš Bžatek avatar 22.10.2016 10:19 Tomáš Bžatek | skóre: 29 | Brno
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS

    Hele on zije :-)

    Koupim litajiciho tucnaka
    23.10.2016 19:05 Kvakor
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    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é.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.