{
    "componentChunkName": "component---src-pages-index-js",
    "path": "/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Solid Abstractions","description":"A website about technology, software craftsmanship and the exhilaration of designing abstract structures for concrete use.","siteUrl":"https://solidabstractions.com","twitterId":291334023,"author":{"fullName":"Julien Hartmann","profileHtml":"I am an open-source de­vel­op­er, for­mer IT con­sul­tant with a pas­sion for new tech­nol­o­gies. I be­lieve the role of an en­gi­neer is to em­pow­er peo­ple, by as­sem­bling sim­ple, re­fined de­signs.\n","links":[{"url":"https://github.com/spectras/","name":"github","title":"GitHub"},{"url":"https://stackoverflow.com/users/3212865/spectras","name":"stackoverflow","title":"StackOverflow"},{"url":"https://www.linkedin.com/in/julienhartmann/","name":"linkedin","title":"LinkedIn"}],"profilePicNode":{"original":{"src":"/static/profile-pic-301a9cbe7b572c3e7910c9717d2b3bcd.jpg"}}}}},"allMarkdownRemark":{"edges":[{"post":{"excerpt":"After the theory, a quick review of common runtime error handling techniques.\nMost ecosystems focus on one, but knowing the others might come in handy in some situations.","fields":{"slug":"/2019/error-handling-techniques"},"frontmatter":{"title":"Error Handling part 3: Techniques","date":"2021-04-03T00:00:00.000Z","formattedDate":"03 April, 2021"},"tags":[{"name":"code","slug":"/tag/code"}]}},{"post":{"excerpt":"A C++ smart unique_ptr uses exactly the same amount of memory as a\nregular pointer, and has zero runtime cost. That is what we love about C++. But what if I need a custom deleter for my pointer? Can I get it at zero cost too?","fields":{"slug":"/2019/zero-cost-unique_ptr"},"frontmatter":{"title":"Zero-cost unique_ptr deleters","date":"2019-03-05T00:00:00.000Z","formattedDate":"05 March, 2019"},"tags":[{"name":"code","slug":"/tag/code"},{"name":"c++","slug":"/tag/c"}]}},{"post":{"excerpt":"We cover the basics of correct error handling, so it is no longer an afterthought.\nIn previous post, we left some crucial questions unanswered, such as\n“What exactly makes an error recoverable?”. In this post, we dive into levels of abstraction and what they mean for error handling.","fields":{"slug":"/2019/error-handling-levels"},"frontmatter":{"title":"Error Handling part 2: Abstractions","date":"2019-02-28T00:00:00.000Z","formattedDate":"28 February, 2019"},"tags":[{"name":"code","slug":"/tag/code"}]}},{"post":{"excerpt":"","fields":{"slug":"/2019/error-handling-introduction"},"frontmatter":{"title":"Error Handling part 1: Introduction","date":"2019-02-19T00:00:00.000Z","formattedDate":"19 February, 2019"},"tags":[{"name":"code","slug":"/tag/code"}]}},{"post":{"excerpt":"In the previous post we designed our testing infrastructure to work with aiohttp.\nWe will now put that testing infrastructure through a baptism by fire.","fields":{"slug":"/2018/testing-aiohttp-client-part-2"},"frontmatter":{"title":"Unit Testing aiohttp Clients - part 2","date":"2018-11-30T00:00:00.000Z","formattedDate":"30 November, 2018"},"tags":[{"name":"code","slug":"/tag/code"},{"name":"testing","slug":"/tag/testing"}]}},{"post":{"excerpt":"Asynchronous code is the new paradigm in python those last years.\nTesting it, though, is significantly harder.\nLet's see how to test asynchronous HTTP client code written with aiohttp.","fields":{"slug":"/2018/testing-aiohttp-client"},"frontmatter":{"title":"Unit Testing aiohttp Clients","date":"2018-11-25T00:00:00.000Z","formattedDate":"25 November, 2018"},"tags":[{"name":"code","slug":"/tag/code"},{"name":"testing","slug":"/tag/testing"}]}},{"post":{"excerpt":"Remaining ports are much simpler in their scope, and in the fact they do not manage\ndynamic subscriptions. We will review them quickly for completeness.","fields":{"slug":"/2018/cryptomate/other-strategy-ports"},"frontmatter":{"title":"Other Strategy Ports","date":"2018-11-13T00:00:00.000Z","formattedDate":"13 November, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"},{"name":"ports","slug":"/tag/ports"}]}},{"post":{"excerpt":"In the “modules and components” post, we defined the trading port as a gateway\nto exchanges, managing a trading account, placing and canceling orders.","fields":{"slug":"/2018/cryptomate/trading-port"},"frontmatter":{"title":"Trading Port","date":"2018-10-20T00:00:00.000Z","formattedDate":"20 October, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"},{"name":"ports","slug":"/tag/ports"}]}},{"post":{"excerpt":"So far, we have been talking about market events, orders and strategies, as\nabstract concepts, leaving details to a later point. Now, to design the core of\nthe strategy engine, we need the full picture.","fields":{"slug":"/2018/cryptomate/market-port"},"frontmatter":{"title":"Market Port","date":"2018-10-09T00:00:00.000Z","formattedDate":"09 October, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"},{"name":"ports","slug":"/tag/ports"}]}},{"post":{"excerpt":"Initial design is done. It is now time to start laying the basis of the project.\nAt this point, there are a few technical choices we can no longer defer.","fields":{"slug":"/2018/cryptomate/groundwork"},"frontmatter":{"title":"Laying the Groundwork","date":"2018-09-24T00:00:00.000Z","formattedDate":"24 September, 2018"},"tags":[{"name":"code","slug":"/tag/code"}]}},{"post":{"excerpt":"We hack together a couple of modules, do quick manual testing. Eventually, the code remains a\nhackish mess rotting away which may be fine but a little unsatisfactory.","fields":{"slug":"/2018/starting-python-project"},"frontmatter":{"title":"Starting a Python Project","date":"2018-09-14T00:00:00.000Z","formattedDate":"14 September, 2018"},"tags":[{"name":"code","slug":"/tag/code"}]}},{"post":{"excerpt":"We used most of the allocated design time, and our architecture is falling into place.\nSpending more time on upfront design will yield diminishing returns at this point.\nHere is a quick post index.","fields":{"slug":"/2018/cryptomate/the-story-so-far"},"frontmatter":{"title":"The Story So Far","date":"2018-09-12T00:00:00.000Z","formattedDate":"12 September, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"We detail critical parts of the architecture: relationships between main\ncomponents, strategy life-cycle and integration examples for both testing and production.","fields":{"slug":"/2018/cryptomate/critical-points"},"frontmatter":{"title":"Critical Points","date":"2018-09-09T00:00:00.000Z","formattedDate":"09 September, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"Event-driven, hexagonal, micro-services… we can quickly trim down the options to a few\ncandidates. We will then explore, evaluate and select one of them.","fields":{"slug":"/2018/cryptomate/exploring-patterns"},"frontmatter":{"title":"Exploring Patterns","date":"2018-08-20T00:00:00.000Z","formattedDate":"20 August, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"},{"name":"pattern","slug":"/tag/pattern"}]}},{"post":{"excerpt":"We understand the problem and can start building our high-level architecture. We will start\nwith mapping the requirements to project elements.","fields":{"slug":"/2018/cryptomate/modules"},"frontmatter":{"title":"Modules and Components","date":"2018-08-08T00:00:00.000Z","formattedDate":"08 August, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"Constraints, functional requirements, quality attributes. All of those are known as\narchitecturally significant requirements. Characterizing those is the final step\nin our initial “understand phase”.","fields":{"slug":"/2018/cryptomate/requirements"},"frontmatter":{"title":"Requirements and Quality Attributes","date":"2018-08-06T00:00:00.000Z","formattedDate":"06 August, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"We will start our job with identifying all stakeholders we can. Then, depending on how close\nto the project they are, we will get to know them and find out their goals.","fields":{"slug":"/2018/cryptomate/stakeholders"},"frontmatter":{"title":"Stakeholders and Goals","date":"2018-08-03T00:00:00.000Z","formattedDate":"03 August, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"A new project with no legacy to accommodate may either be a clean slate or a blank page,\ndepending on how one looks at it. Before we start filling it, we need to define our strategy.","fields":{"slug":"/2018/cryptomate/getting-started"},"frontmatter":{"title":"Getting Started","date":"2018-07-30T00:00:00.000Z","formattedDate":"30 July, 2018"},"tags":[{"name":"architecture","slug":"/tag/architecture"}]}},{"post":{"excerpt":"A trading bot is an amazing tool. It talks to many third parties.\nIt requires a rich, flexible toolset to empower its user.\nThis needs powerful abstractions. In short, it is the\nperfect project to start my website with.","fields":{"slug":"/2018/cryptomate/intro"},"frontmatter":{"title":"Introducing Cryptomate","date":"2018-07-29T00:00:00.000Z","formattedDate":"29 July, 2018"},"tags":[]}}]},"banner":{"childImageSharp":{"fluid":{"src":"/static/7b2a42dbb2e204f7ed09b8a904150c88/14b42/default-banner.jpg"}}}},"pageContext":{}},
    "staticQueryHashes": ["1733002695","4006707078"]}