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 13:11 | Zajímavý projekt

Novinkou v minor aktualizaci webového prohlížeče Vivaldi je podpora vyhledávače Qwant (Wikipedie). Vývojáři Vivaldi zdůrazňují, že se jedná o evropský vyhledávač respektující soukromí uživatelů.

Ladislav Hagara | Komentářů: 0
dnes 01:33 | Nová verze

Po šesti letech od vydání verze 1.0 byla vydána verze 2.0 multiplatformního editoru tagů MusicBrainz Picard (Wikipedie). Přehled novinek, vylepšení a oprav v changelogu.

Ladislav Hagara | Komentářů: 0
včera 16:22 | Nová verze Ladislav Hagara | Komentářů: 6
včera 15:00 | Komunita

Dnes končí podpora Ubuntu 17.10 Artful Aardvark. Uživatelům je doporučen přechod na Ubuntu 18.04 Bionic Beaver s prodlouženou podporou do roku 2023. Podpora standardních verzí Ubuntu je 9 měsíců. Verze 17.10 byla vydána 19. října 2017.

Ladislav Hagara | Komentářů: 11
včera 13:33 | Bezpečnostní upozornění

Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno bylo celkově 334 bezpečnostních chyb. V Oracle Java SE je například opraveno 8 bezpečnostních chyb. Všechny jsou vzdáleně zneužitelné bez autentizace. V Oracle MySQL je opraveno 31 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 7 z nich.

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

Nick Clifton zveřejnil na blogu společnosti Red Hat věnujícímu se počítačové bezpečnosti nástroj, pomocí kterého lze ověřit, zda jsou binární spustitelné soubory odolné vůči variantě 1 bezpečnostní chyby Spectre v procesorech.

Ladislav Hagara | Komentářů: 0
včera 03:00 | Nová verze

Po více než roce vývoje od vydání verze 1.12 byla vydána nová verze 1.13 Java edice počítačové hry Minecraft (Wikipedie). Kódový název nejnovější verze je Update Aquatic. Přehled novinek v oficiálním oznámení o vydání. Detailní přehled novinek na Gamepedii a na YouTube.

Ladislav Hagara | Komentářů: 4
18.7. 23:55 | Nová verze

Společnost Epic Games vydala verzi 4.20 svého proprietárního multiplatformního herního enginu Unreal Engine (Wikipedie). Přehled novinek i s celou řadou obrázků a videi v oznámení na blogu.

Ladislav Hagara | Komentářů: 0
18.7. 15:55 | IT novinky

Evropská komise uložila (pdf) společnosti Google pokutu ve výši 4,34 miliardy eur za porušení antimonopolních předpisů EU. Společnost Google ukládala od roku 2011 výrobcům zařízení Android a provozovatelům mobilních sítí protiprávní omezení, aby upevnila dominantní postavení svých produktů zaměřených na všeobecné vyhledávání na internetu.

Ladislav Hagara | Komentářů: 27
18.7. 13:55 | Zajímavý software

Byl vydán REAPER (Wikipedie) ve verzi 5.93. Jedná se o proprietární digitální pracovní stanici pro práci s audiem (DAW). Novinkou je experimentální linuxový port [reddit].

Ladislav Hagara | Komentářů: 2
Jak čtete delší texty z webových stránek?
 (77%)
 (20%)
 (5%)
 (7%)
 (2%)
 (10%)
Celkem 370 hlasů
 Komentářů: 40, poslední 29.6. 10:21
    Rozcestník

    OctaForge - OctaSTD update

    14.6.2015 18:14 | Přečteno: 1128× | octaforge | Výběrový blog | poslední úprava: 14.6.2015 18:46

    Knihovna OctaSTD dostala poslední dobou spoustu nového kódu a přibližuje se produkční použitelnosti.

    Kromě nových kompontent se dostalo i na designové změny a vylepšení těch stávajících. Ale začnu těmi novými.

    Co je teď implementováno?

    Přidal jsem několik nových komponent. Takže aktuální seznam je:

    Kromě toho jsem upravil knihovnu tak, aby ji bylo možné používat vedle C++ standardní knihovny. Tzn. kdokoliv ji bude chtít použít, může, bez úprav svého vlastního projektu.

    Momentálně podporovanými kompilátory jsou GCC (4.8 a vyšší) a Clang (3.3 a vyšší). Podpora pro Visual Studio byla odstraněna, nejspíš napořád (vzhledem k tomu, že MS chce ve Visual Studiu povolit Clang), ale v případě potřeby ji přidám zpět. Největším blockerem pro VS 2015 je nepodpora rozšířeného SFINAE. A atomic.h momentálně nebude fungovat taky, nicméně by neměl být problém to časem přidat, v případě potřeby.

    Co se týká dokumentace, celkem dost je teď na Wiki. Velké části API jsou kompletně zdokumentované včetně příkladů.

    Jardíka by mohlo potěšit to, že prefixy __Octa a __octa byly odstraněny. Všechny interní záležitosti jsou teď implementovány v namespace octa::detail a přistupuje se k nim s celou namespace (tzn. octa::detail::Foo), což zabrání konfliktům. Pořád nicméně může dojít ke konfliktům s makry - ale to je IMHO chyba uživatele knihovny, protože taková makra by vůbec neměla existovat.

    Změny v ranges systému

    V ranges systému proběhlo několik designových změn, které dělají celý systém o něco použitelnější a flexibilnější. Systém je detailně popsaný na Wiki, takže shrnu jen to důležité.

    Range half

    Jedna výhoda iterátorů oproti ranges je ta, že se iterátory dají volně skládat. Příkladem použití je funkce find z knihovny algorithm.h. Ta najde hodnotu v range a vrátí novou range, kde nalezená hodnota je prvním prvkem. Nějak takto:

    Vector<int> x(range(20)); // pole 0, 1, 2, 3, ... 19
    auto r = find(x.each(), 15);
    

    Takže r teď bude range začínající na 15 a končící na 19. A já teď chci novou range, která bude od začátku vektoru až po začátek této nové range, tzn. hodnoty od 0 do 15 (kde 15 není součástí range). S klasickým range systémem by toto nebylo možné. S iterátory to je možné, protože když funkce find vrátí iterátor, tak se tento iterátor dá použít jako koncový.

    Proto jsem do ranges zahrnul nový koncept "polovin". Z jakékoliv range se dá vytvořit objekt typu RangeHalf, přičemž tato metoda half() je implementována jako součást InputRange, takže ji mají všechny ranges. Tento objekt je ekvivalentní C++ iterátoru. Kromě vlastního interface implementuje i interface standardního iterátoru (typ iterátoru závisí na tom, jaký je typ spojené range - tzn. random access range bude mít random access half, resp. iterátor).

    Stejně jako se dá vytvořit range half z jakékoli range, tak se dá vytvořit range ze dvou polovin. Takže příklad s find() bude vypadat takto:

    Vector<int> x(range(20)); // pole 0, 1, 2, 3, ... 19
    auto h1 = x.each().half();
    auto h2 = find(x.each(), 15).half();
    auto r = h1.each(h2); // 0, 1, 2, 3 ... 14
    

    Objekt typu RangeHalf implementuje metodu each() pro jednoduché vytvoření nové range.

    Další změny

    RandomAccessRange má teď podtyp, FiniteRandomAccessRange. Implementoval jsem spoustu nových API a utilit. Range traits API je kompletně nové a použitelnější. A přidal jsem nové typy ranges do základní knihovny.

    Popsat tady vše by bylo moc nadlouho, takže kohokoliv to zajímá, si může přečíst článek na wiki (nicméně v angličtině).

    Příklady

    Připravil jsem pár příkladů, jak s ranges pracovat.

    Funkcionální map()

    Tato klasická higher-order funkce se dá implementovat i s ranges, a je přímo v OctaSTD.

    auto r1 = range(30); // 0, 1, 2 ... 29
    auto r2 = map(r, [](int v) { return v + 20 }); // 20, 21, 22 ... 49
    for (int i: r2)
        printf("%d\n", i);
    

    Výsledný range funguje "líně"... tzn. nová hodnota se mapuje až v případě potřeby. Takže se nepoužívá místo navíc.

    Funkcionální filter()

    auto r1 = range(30); // 0, 1, 2 ... 29
    auto r2 = filter(r1, [](int v) { return !(v % 2); }); // 0, 2, 4 ... 28
    

    Filtrační range funguje taky "líně". Implementuje požadavky pro ForwardRange.

    Pokročilejší ukázka

    Dejme tomu, že máme pole, které chceme vypsat na standardní výstup po 3 prvcích. OctaSTD má standardní funkci chunks(), která vrátí novou range, která "rozkouskuje" původní range. Takže můžeme udělat něco takového:

    auto r = range(11);
    // { 0, 1, 2 }
    // { 3, 4, 5 }
    // { 6, 7, 8 }
    // { 9, 10 }
    for (auto cr: chunks(r, 3))
        printf("%s\n", to_string(cr).data());
    

    Tato ukázka využívá string interface, který hned popíšu.

    String interface

    OctaSTD teď podporuje řetězce. Spolu s řetězci knihovna podporuje i string interface. Resp. stanardní knihovna poskytuje objekt typu ToString. Tento objekt má standardní specializace pro všechny primitivní numerické typy, pointery, řetězce samotné, StringRange apod. Každopádně pokud vlastní objekt poskytuje metodu octa::String to_string() const, tak jej bude automaticky podporovat i ToString.

    Pokud objekt nepodporuje tuto metodu, ale má range interface (tzn. metodu each()), tak bude s ToString fungovat taky - ToString podporuje ranges.

    Hash a swap interface

    Podobně funguje i hash interface. Pokud objekt poskytuje metodu size_t to_hash() const, standardní objekt ToHash jej bude podporovat (v defaultu podporuje všechny skalární typy).

    Třetí interface pro vlastní objekty je swap interface. Pokud objekt poskytuje metodu void swap(decltype(*this) &), standardní funkce octa::swap ji automaticky zavolá.

    Závěr

    Mohl bych popsat daleko víc, ale změn a funkcí je tolik, že nevím, čím začít. Tak alespoň těchto pár ukázek. Wiki postupně budu rozšiřovat, takže tam bude v podstatě vše. A jakékoliv nápady, kritiku apod. můžete napsat do komentářů.

           

    Hodnocení: 90 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    14.6.2015 21:36 txzn
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    Na první pohled to vypadá dost zajímavě. (Normální C++ STL je docela sračka.)
    q66 avatar 14.6.2015 22:35 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    dost věcí ještě chybí, nicméně základní design tam je a nejdůležitější komponenty jsou už aspoň z části tam...
    14.6.2015 22:45 Ivorne | blog: Ivorne
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    V čem je STL sračka?

    Nějaké konkrétní koncepční/implementační chyby?

    O STL se zajímám, takže tohle by pro mě byla přínosná informace.
    q66 avatar 14.6.2015 22:55 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    stream API je dost hrůza třeba
    15.6.2015 16:00 Jardík
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    Stream API není nejlepší (taky je hodně staré), ale hrůza to zas není. Pokud po vytvoření objektu nezapomenete zavolat exceptions() a nastavit tak výjimky, tak se o nic nemusíte starat a jenom načítat/zapisovat.
    15.6.2015 15:09 ugh
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    Třeba v tom, že tam není nic jako filter/map z OctaSTD. Čachry s iterátorama.
    15.6.2015 16:09 Jardík
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    Za odstranění rezervovaných identifikátorů pochvala. Jenom ale pořád nechápu tu potřebu reimplementovat standardní knihovnu kvůli ranges. Budete teď mít hlavně závislosti dvě. Závislost na standardní knihovně neodstraníte (např. operátor new vyhazuje std::bad_alloc, initializer list je daný std::initializer_list, typeid() vrací std::type_info const a jistě další věci) a budete záviset na dalších věcech (OctaSTD). Ale vynechejme to, je to vaše věc.

    Jak je na tom OctaSTD s výjimkami? Garance apod. Dáváte na to pozor? Píšu-li náhradu standardní knihovny, měla by být nějak exception safe, jinak se stává prakticky nepoužitelnou.
    q66 avatar 15.6.2015 16:17 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    závislost na standardní knihovně není (mám vlastní implementace operátoru new, initializer listů apod - používají se, když se nepoužívá standardní knihovna), rtti a exceptions ignoruju (budu mít vlastní error handling pomocí option types apod.) - kód samotný by měl být většinou exception safe i tak, ale noexcept tam není (jen další věc na implementaci a dokumentaci, na což vážně nemám čas, zvlášť když to nevyužiju)
    15.6.2015 19:04 Jardík
    Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update
    Jen tak letmo procházím zdroják array.h. Pozor,
    Size max_size() const { return Size(~0) / sizeof(T); }
    
    Nemusí asi správně fungovat, když signed int není na dané platformě dvojkový doplněk (já vím, já vím, která není, že). Naopak Size(-1) bude fungovat vždy, kvůli jasně definovanému pravidlu pro převod signed na unsigned. Nebo lze použít ~Size(0)

    Založit nové vláknoNahoru

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