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 00:55 | Nová verze

Po téměř 13 měsících vývoje od verze 0.11.0 byla vydána verze 0.12.0 hardwarově nenáročného desktopového prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklého sloučením projektů Razor-qt a LXDE. Přehled novinek v příspěvku na blogu.

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

Článek ne Medium představuje nejnovější stabilní verzi 2.0 svobodné decentralizované mikroblogovací platformy a sociální sítě podobné Twitteru Mastodon (Wikipedie). Detailní přehled novinek na GitHubu [Hacker News].

Ladislav Hagara | Komentářů: 0
včera 06:00 | Komunita

V Praze na půdě Elektrotechnické fakulty ČVUT dnes probíhá RT-Summit 2017 – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt. Přednášky lze sledovat online na YouTube.

Ladislav Hagara | Komentářů: 0
20.10. 14:33 | Zajímavý projekt

Blender Animation Studio zveřejnilo první epizodu z připravovaného animovaného seriálu The Daily Dweebs o domácím mazlíčkovi jménem Dixey. Ke zhlédnutí také ve 3D s rozlišením 8K.

Ladislav Hagara | Komentářů: 0
20.10. 12:34 | Komunita

Aktualizovanou počítačovou hru Warhammer 40,000: Dawn of War III v ceně 39,99 eur běžící také na Linuxu lze o víkendu na Steamu hrát zdarma a případně ještě v pondělí koupit s 50% slevou. Do soboty 19:00 lze na Humble Bundle získat zdarma Steam klíč k počítačové hře Sid Meier's Civilization® III v ceně 4,99 eur běžící také ve Wine.

Ladislav Hagara | Komentářů: 0
20.10. 00:22 | Nasazení Linuxu

Společnost Samsung oznámila, že skrze dokovací stanici DeX a aplikaci Linux on Galaxy bude možno na Samsung Galaxy S8 a S8+ a Galaxy Note 8 provozovat Linux. Distribuce nebyly blíže upřesněny.

Phantom Alien | Komentářů: 19
19.10. 23:55 | Komunita

Společnost Purism na svém blogu oznámila, že její notebooky Librem jsou nově dodávány se zrušeným (neutralized and disabled) Intel Management Engine (ME). Aktualizací corebootu na již prodaných noteboocích lze Management Engine také zrušit. Více v podrobném článku.

Ladislav Hagara | Komentářů: 0
19.10. 21:44 | Nová verze

Organizace Apache Software Foundation (ASF) na svém blogu slaví páté výročí kancelářského balíku Apache OpenOffice jako jejího Top-Level projektu. Při této příležitosti byl vydán Apache OpenOffice 4.1.4 (AOO 4.1.4). Podrobnosti v poznámkách k vydání. Dlouhé čekání na novou verzi tak skončilo.

Ladislav Hagara | Komentářů: 6
19.10. 19:22 | Pozvánky

Již příští týden - 26. a 27. října se v Praze v hotelu Olšanka odehraje OpenWRT Summit. Na webu konference naleznete program a možnost zakoupení lístků - ty stojí 55 dolarů. Čtvrtek bude přednáškový a v pátek se budou odehrávat převážně workshopy a meetingy.

Miška | Komentářů: 1
19.10. 13:44 | Nová verze

Bylo vydáno Ubuntu 17.10 s kódovým názvem Artful Aardvark. Ke stažení jsou Ubuntu Desktop a Server, Ubuntu Cloud Images, Ubuntu Netboot, Kubuntu, Lubuntu a Lubuntu Alternate, Lubuntu Next, Ubuntu Budgie, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio a Xubuntu. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 23
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (10%)
 (1%)
 (1%)
 (1%)
 (74%)
 (13%)
Celkem 168 hlasů
 Komentářů: 7, poslední 19.10. 23:06
    Rozcestník

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

    21.10.2016 22:13 | Přečteno: 1936× | 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: 33 | 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...
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    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ě.
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    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?
    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.