\


 Monday, 04 October 2021
Tip na knihu: Crafting Interpreters od Roberta Nystroma

Crafting Interpreters by Robert NystromKniha Crafting Interpreters od Roberta Nystroma, kterou jsem o víkendu dočetl, je dílem, které by se mohlo stát klasikou.

Pro koho kniha je? Chtěli jste někdy vytvořit svůj vlastní programovací jazyk, nebo mít jednoduchý "embedovaný" skriptovací jazyk v aplikaci ? Moc ambiciózní a vy jste spokojeni se stávajícími jazyky? Hráli jste si třeba s C# Roslyn SDK, nebo jste použili C# generators a zhrozili jste se, jak amatérsky a nevzhledně vypadá generátor kódu? Samozřejmě ne ten váš generátor, ale generátor kolegy? Tedy generátor zní pořád až příliš vznešeně, co jsem tak různě viděl, spíš spojování stringů na steroidech, u pokročilejších s využitím StringBuilderu? Smile

V knize Crafting Intepreters Robert Nystrom navrhne jazyk Lox. Lox je taková mini-Java (mini-C#, prostě jazyk s C like syntaxí), ale i přes nehezké přízvisko mini, které jsem použil v předchozí větě, LOX podporuje i OOP nebo closures - funkce, které zachytí proměnné ve svém okolí.

V první části knihy autor nejprve napíše jednoduchý parser, lexer a interpreter Loxu v Javě.

V druhé a pro mě zajímavější části autor napíše pro LOX (stack based) virtuální stroj v jazyce C včetně jednoduchého, ale plně funkčního garbage collectoru (jednovláknový, nekonkurenční, "stop the world"). A vytvoříte všechny instrukce pro virtuální stroj včetně vlastního disassembleru. A když když máte VM v C, portování Loxu na další HW platformy je hračka.

Je poněkud tragické vidět vývojáře, kteří třeba intermediate language (IL) a VM v .NET považují za černé skříňky, kterým nemusejí vůbec rozumět. Do určité míry je to pravda, ale u každé netriviální aplikace potřebujete znát trochu více než syntaxi zvoleného programovacího jazyka a pár knihoven. A někdy ani nestačí, že jako firemní vývojářské eso rozpoznáte, kde je vyhledávací pole na StackOverflow, kam posléze vložíte své zoufalé a bezradné skřeky.

Na knize je skvělé, že obsahuje kompletní zdrojový kód. Ne útržky, ne odkazy na github. Veškerý výklad je prokládán kódem a je docela úleva číst knihu, ve které nejsou jen neoptimalizované fragmenty kódu, ale autor si dá práci, aby před vámi neskrýval žádné kroky, svůj kód před vámi vyladil a upozornil na typické chyby, kterých se dopustí asi každý, pokud píše třeba parser poprvé.

Zvláštní cenu autor dostává za to, že nepoužívá trapné věty typu "tuto funkci už psát nebudeme, ponecháme ji jako cvičení pro bystré čtenáře." Moudří vědí, že jako cvičení pro čtenáře se často nechávají úlohy, které autor knihy nezvládne. Tento otravný a trapný trik asi autoři knih převzali od přednášejících mdlého ducha, kteří mají času dost, ale stejně ve stanoveném čase nestihnou vykoktat penzum znalostí, které si sami čerstvě osvojili den před svou přednáškou na konferenci, a s chutí přehazují povinnosti na posluchače.

Také oceňuji, že kniha pro Kindle má všechny výpisy kódu čitelné. Pořád nejde o samozřejmost. Sami jste asi také narazili na odbornou eknihu, která byla formátována tak, že zdrojový kód nebo tabulky nebylo možné přečíst bez opičích chvatů (podržením prstu zvětším grafický objekt a skroluji tam a zpátky).

Za tuhle knihu si autor zaslouží zaplatit, ale kdybyste byli i po mé nadšené anotaci na vážkách, nebo máte zrovna hluboko do kapsy, kniha je na webu zdarma.

Monday, 04 October 2021 18:08:50 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  


 Wednesday, 01 September 2021
Verze 2.0.0.0 extenze ConfigureAwaitEnforcer i pro Visual Studio 2022 (preview).


Extenze/Analyzér ConfigureAwaitEnforcer , která ohlídá, že jste nezapomněli u ‘await’  výrazu v knihovně použít ConfigureAwait(false), má novou verzi 2.0.0.0.


Změny:

  • Podpora pro VS 2022 (Preview).
  • Podpora ‘await foreach’ výrazů. (Podpora byla už přes rok rok v betě 2.0.0.0, v této “ostré” verzi lepší analýza výrazů).
  • Podpora ‘await using’ výrazů. (Podpora byla už přes rok rok v betě 2.0.0.0, v této “ostré” verzi lepší analýza výrazů).

Extenzi lze nainstalovat přímo z Visual Studia. Analyzér můžete stáhnout pomocí NuGetu.

Přímé odkazy:

Extenze pro VS 2022 (Preview) - https://marketplace.visualstudio.com/items?itemName=Rene-Stein.ConfigureAwaitEnforcer2022.

Extenze pro VS 2019 - https://marketplace.visualstudio.com/items?itemName=Rene-Stein.ConfigureAwaitEnforcer

NuGet balíček - https://www.nuget.org/packages/ConfigureAwaitEnforcer/

Zdrojový kód - https://github.com/renestein/ConfigureAwaitEnforcer



Wednesday, 01 September 2021 11:57:17 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C#


 Friday, 23 April 2021
Život (a blogposty o něm) jsou už jinde…

Jak asi sami víte a vidíte, tento blog je technicky zaostalá zombie a neměl jsem zatím čas ani chuť přenést příspěvky na moderní blog engine s https.
Nedávno se ke mně od jednoho starého fanouška donesla stížnost, že na blogu se objevovalo nejen více technických příspěvků, ale také články s jinými tématy.
Kdyby moje výplody “de profundis” a z ještě temnějších míst chyběly i někomu dalšímu, kdo sem ještě zabloudí, vězte, že:

Už někdy v roce 2010 jsem netechnické články přenesl na blogovací platformu Posterous. Psal jsem o Posterous API i tady, dokonce jsem si prozřetelně s využitím Posterous API napsal nástroj, který mi zazálohoval všechny příspěvky na Posterous blogu. Asi jsem měl nějaké tušení, jak nablýskaný Posterous dopadne. Posterous totiž po krátké a těžké nemoci zesnul, budiž mu digitální země lehká. Pokračovatelem mého blogu na Posterous se stal blog “Život po Posterous” (nemusím vysvětlovat proč) s podtitulem “Parerga a paralipomena – apage vemena” (nechci vysvělovat proč, laskavý čtenář pochopí). Smile

https://renesteinposterous.wordpress.com/
RSS: https://renesteinposterous.wordpress.com/feed/

Na blog někdy přidávám delší příspěvky z FB.
https://www.facebook.com/renestein/

Twitter cca od roku 2015 nepoužívám. To, že v panelu vpravo na tomto blogu můžete vidět vloženou timeline z Twitteru, je jen důkaz, jak dlouho se mi už nechce tento blog po technické stránce upravovat. Mea culpa, mea maxima culpa, pravidelně si trhám šat a sypu popel na hlavu, ale co se dá dělat, ani tyhle bohulibé aktivity nepomáhají a jsou zajímavější činnosti než úklid bordelu na starém DasBlogu.

P. S. Jsem také na Goodreads.
https://www.goodreads.com/user/show/4224377-rene-stein





Friday, 23 April 2021 10:21:46 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Ostatní


 Thursday, 08 April 2021
Nová .NET Standard 2.0 knihovna RStein.HDO (Hromadné dálkové ovládání).

TL;DR

Jestli někdo chcete/potřebujete pracovat s HDO rozpisem, můžete použít mou novou .NET Standard 2.0 knihovnu pro snadné získání rozpisu HDO (hromadné dálkové ovládání - laicky řečeno, chcete znát a ve svém programu pracovat s časy, kdy je aktivní takzvaný nízký tarif elektřiny).

Nyní se data stahují z ČEZu.

https://github.com/renestein/RStein.HDO

Konec TL;DR


Nedávno jsem psal na FB o chytrých zásuvkách, které bych chtěl automaticky synchronizovat s HDO rozpisem od ČEZu.

Přes Velikonoce jsem pokročil a nyní už mi stačí u "chytré" zásuvky (chytrého zařízení):

1) Po zakoupení a přidání zásuvky nastavit, že se řídí podle HDO rozpisu. Pokud takový příznak nastaven není, v zásuvce můžete mít jakákoli jiná ručně zadaná pravidla pro vypínání a zapínání zařízení a tato pravidla nebudou nikdy přepsána pravidly z HDO rozpisu.

2) Můj nový agent pro Smart Home pravidelně stáhne HDO data z Čezu, porovná stávající pravidla v zásuvkách, u kterých je nastaveno, že se řídí HDO rozpisem, s pravidly v HDO rozpisu u ČEZu, a jestliže se pravidla liší, změní pravidla v zásuvkách tak, aby byla shodná s aktuálním ČEZ HDO rozpisem.

Vedlejším výsledkem je .NET Standard 2.0 knihovna RStein.HDO, kterou jsem oddělil od hlavního a neveřejného projektu, protože jsem si říkal, že knihovnu já a možná i někdo jiný využijeme i pro jiné účely.

Základní funkce:

1) Stáhne data z ČEZu a vytvoří z nich rozpis (scheduli).

2) Schedule může být cachována (doporučuju, aby nás ČEZ neblokl, stahovat data maximálně jednou denně - rozpis HDO se zase tak často nemění).

3) Schedule se snadno dotážete, jestli je HDO v daném čase aktivní.

4) Kdyby vám nestačila vystavená strukturovaná data, dostanete se jednoduše i k nezpracovaným původním JSON datům z ČEZu a k objektovému modelu, který jim odpovídá.

Pár poznámek na závěr.

1) Pull requesty pro jiné distributory elektřiny jsou vítány.

2) Paskvily v enumeraci CezRegion - např. CezRegion.stred (čeština, neidiomatické malé písmeno na začátku názvu) jsou moje - název přesně odpovídá vyžadované reprezentaci hodnoty ve stringu.

3) Česko-anglické patvary v původním modelu (SAZBA, VALID_FROM) jsou dílem vývojářů v ČEZu.

A jeden jeden postřeh nakonec. GitHub actions pro CI/CD jsou mnohem lépe zdokumentovány než Azure pipelines. I když si odmyslím dokumentaci, přijdou mi GitHub actions intuitivnější a logičtější než Azure pipelines. Popularitu YAMLu ale stejně pořád nechápu.

Thursday, 08 April 2021 07:47:07 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  .NET Framework | C#


 Friday, 26 February 2021
Knihovna RStein.AsyncCpp (Task Parallel Library for C++) dospěla do verze 0.0.0.7 a najdete ji ve vcpkg katalogu

Knihovna RStein.AsyncCpp (Task Parallel Library for C++) je ve verzi 0.0.7 a dá se snadno nainstalovat pomocí Microsoft vcpkg.

vcpkg install rsasynccpp rsasynccpp:x64-Windows

(Včera mi Microsoft udělal radost a mergnul PR do masteru - https://github.com/microsoft/vcpkg/pull/16380)

Detaily k instalaci různých verzí knihovny jsou zde.

https://github.com/renestein/Rstein.AsyncCpp#Build-Library

Jestli někdo používáte UWP, tak vás potěší, že triplet UWP ve vcpkg je také podporován a všechny testy prošly.

Jestli nechcete používat vcpkg, můžete buildovat z příkazové řádky a pořád samozřejmě také i z Visual Studia 2019.

Dále knihovna podporuje coroutines ze standardu C++ 20 a stále podporuje i "legacy" coroutines.(https://devblogs.microsoft.com/.../c-coroutines-in.../)

Kromě kompilátoru MSVC cl knihovna nyní podporuje i Clang.

Třešničkou je, že na konci aplikace už není třeba volat metodu Scheduler::StopDefaultScheduler().

Parsování celého Shakespearova díla a vypsání 50 nejfrekventovanějších slov za cca 1,2 s. (Clang a (neoptimalizovaní) map/reduce aktoři na obyčejném Lenovo ThinkPadu z roku 2016).
clang_Shakespeare_Top_Words

v0.0.7

  • Added new solution configurations with static CRT (/MT, MTd). (primary consumer of these configurations is vcpkg manager)


v0.0.6



Friday, 26 February 2021 10:12:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C++


 Wednesday, 02 September 2020
RStein.AsyncCpp v. 0.5.0.0 (20200901) – threadless actors

https://github.com/renestein/Rstein.AsyncCpp

PR, stars, opinions, issues are more than welcome! Thanks!

Added threadless actors:

Planned features:

  1. Dynamic proxy for simplified creation of actors from classes with an interface that contains only void returning or/and Task<T> returning methods. AFAIK C++ does not have support for the "dynamic" proxy. "Classic" smart proxy may be used only for pre-processing and post-processing of the method call in the "real" subject.

  2. Asynchronous logic (support for co_await/co_return) in "OOP style" actors.

  3. The context for messages (a reference to a sender, a reply address, etc.)

  4. FSM actors.

  5. "Supervisors".

  6. More samples.

* What is an actor? https://en.wikipedia.org/wiki/Actor_model

Wednesday, 02 September 2020 11:18:57 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C++


 Wednesday, 03 June 2020
RStein.AsyncCpp (06-03-2020) - C++ Task Parallel Library

https://github.com/renestein/Rstein.AsyncCpp

Changes:

- Added AsyncMutex synchronization primitive.

https://github.com/renestein/Rstein.AsyncCpp#AsyncMutex

- TaskFactory.Run automatically unwraps nested Task (e.g. scheduled lambda-coroutine returns Task). Very convenient and prevents some hard-to-debug, but easy to introduce bugs in C++ coroutines.

https://github.com/renestein/Rstein.AsyncCpp#TaskFactory-Unwrap-Nested-Task

- Task has the Unwrap method ((Unwrap Task<Task<T> and returns Task<T>) and corresponding Fjoin method.

https://github.com/renestein/Rstein.AsyncCpp#Task-Fjoin

- Added SynchronizationContext - provides a mechanism to queue work to a specialized context. (useful for marshaling calls to UI thread, event loop, etc.)

https://github.com/renestein/Rstein.AsyncCpp#synchronizationcontext

- Added SynchronizationContextScope - RAII class for SynchronizationContext. An instance of this class captures the current synchronization context in the constructor (now 'old' context), installs new synchronization context provided by the user, and restores 'old' synchronization context in the destructor.)

https://github.com/renestein/Rstein.AsyncCpp#SynchronizationContextScope

- Added ConfigureAwait method (for the Task awaiter) - configures if the 'co_await continuation' is resumed in the specific synchronization context.

https://github.com/renestein/Rstein.AsyncCpp#ConfigureAwait

- Added GlobalTaskSettings::UseOnlyConfigureAwaitFalseBehavior configuration key - set the key to true if you want to enforce the equivalent of the 'co_await someTask.ConfigureAwait(false)' for all 'co_await someTask{anything}' expressions in the application - synchronization context is then never used when resuming the 'co_await continuation'.

https://github.com/renestein/Rstein.AsyncCpp#GlobalTaskSettings-UseOnlyConfigureAwaitFalseBehavior

- Task.ContinueWith method has new overloads with CancellationToken argument.



Wednesday, 03 June 2020 10:43:27 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C++ | Nativní kód


 Monday, 04 May 2020
C++ Task Parallel Library (TPL)

Příspěvek nejen pro ty, kteří se od března do června nedočkají kvůli COVIDu C++ kurzu. Kdyby se někdo nudil, nebo mu lezly na mozek ty neustále se opakující zprávy o Babišovi, rouškách a další variace na mem "všichni tady chcípnem, když ne na COVID, tak na sucho", dovolím si upozornit na jednu poměrně čerstvou (neoptimalizovaná alfa) asynchronní švestičku ze své zahrádky. Švestičky i optimisticky naznačují roční období, kdy se snad uvidíme, jestliže macecha příroda nereleasne implementaci zmutované specifikace COVID++.

RStein.AsyncCpp používající coroutine z C++ 20 je knihovna, ve které se rychle zorientuje každý, kdo zná Task Parallel Library (.NET, C#).

V knihovně najdete nejen:

Task (tedy něco jako std:future) - tásky jsou narozdíl od knihovny cppcoro, kterou asi znáte, 'hot' - tedy přes TaskFactory je Task rovnou nastartován a naschedulován k vyřízení.
Task má API, které čekáte. A narozdíl od std::future má metodu ContinueWith (then).

Task se dá "co_awaitovat", protože podporuje concept "Awaiter". A můžete ho samozřejmě použít jako návratovou hodnotu z coroutine metody ("coroutine promise type").

Dále jsou v knihovně jednoduché metody pro vytvoření dokončeného Tasku z předpřipravené hodnoty (TaskFromResult), z výjimky (TaskFromException), nebo lze vrátit Task ve stavu Canceled (TaskFromCanceled).

Jednoduché DataFlow. ("flat", "fork-join" a a další typy).

Kombinátory pro Task:
WaitAll.
WaitAny.

TaskCompletionSouce - std:: promise bez těch otravných věcí, které určitě znáte sami.

Funkcionální kompozice tasku.
Fbind (alias bind, SelectMany, flatMap, mapMany)
Fmap (map, Select)

Asynchronní primitivy.
AsyncSemaphore.

Kooperativní storno pomocí tříd CancellationTokenSource a a CancellationToken.

AsyncProducerConsumerCollection.

Více zde:
https://github.com/renestein/Rstein.AsyncCpp
-------------------------------------------------------------------------------

Dear friends/followers,
maybe the result of my experimentation with coroutines may be interesting for someone else.
The RStein.AsyncCpp library (early unoptimized alpha) is a set of types that should be familiar for anyone who knows the Task Parallel Library (TPL) for .NET (C#). In addition, this library contains simple DataFlow, functional combinators for the Task class, useful async primitives (AsyncSemaphore, AsyncProducerConsumerCollection, CancellationToken, CancellationTokenSource ...).
The library is my playground for testing coroutine support in C++.
The library supports compilation in the VS 2019. Support for other compilers is planned.
More info.
https://github.com/renestein/Rstein.AsyncCpp



Monday, 04 May 2020 09:24:33 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C++ | Nativní kód


 Wednesday, 13 February 2019
ConfigureAwaitEnforcer – extenze pro Visual Studio

I když je tento blog nechutná a technicky zaostalá zombie, která vede k úvahám, jak konečně tuhle bestii zabít, aby mě už nestrašila, dá se přesto, nebo možná právě proto :), využít k šíření ConfigureAwait infekce v cizím kódu.  I tady by snad ještě někoho mohla zajímat moje extenze pro Visual Studio, která zkontroluje:

1) Jestli jste při použití ‘await someTask’ nezapomněli na ConfigureAwait(false).

Když jste tuhle chybu udělali, extenze dotyčný řádek jako prototypická labilní nervní učitelka červeně podtrhne a:

a) Nabídne úpravu výrazu přidáním ConfigureAwait(false).

b) Nabídne úpravu výrazu přidáním ConfigureAwait(true).

Nejlepší je extenzi vidět v akci.
yDitj9JOJh

Ve verzi 1.1 si můžete zvolit i závažnost diagnostiky (Error, Warning, Info, Hidden).

Analyzér je dostupný i na nugetu.
https://www.nuget.org/packages/ConfigureAwaitEnforcer/

Zdrojové kódy.

Bitbucket
https://bitbucket.org/renestein/configureawaitenforcer/src/master/

Github

https://github.com/renestein/ConfigureAwaitEnforcer



Wednesday, 13 February 2019 12:45:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  C#


 Friday, 03 October 2014
Materiály z přednášky TPL - konkurenční, paralelní a asynchronní kód pro náročné pro WUG Praha

Prezentace:

Ad hoc příklady

https://bitbucket.org/renestein/wugtplex.ref.p/src

Knihovna Rstein.Async

https://bitbucket.org/renestein/rstein.async/src

Seriál o knihovně Rstein.Async

http://jdem.cz/ba8kp3

Cesta k příkladům s aktory v knihovně Rstein.Async

https://bitbucket.org/renestein/rstein.async/src/93fe127f35ac3b37d7ff31aa2a25d6a80fc1ce0b/RStein.Async.Examples/?at=master



Friday, 03 October 2014 11:23:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]