This blogpost is a continuation of the previous post: Coroutines Flow, and goes deeper into coroutine streams. In this article, I’m going to explore hot streams called Channel. What is it? What does it do? How does it work? How to create and handle it? How does it compare with the cold streams? And finally, is there a place for both hot and cold streams? Let’s find out!
- 1 Transfering values
- 2 Producer-Consumer
- 3 Pipeline
- 4 Fan
- 5 Buffer
- 6 Hot and cold
- 7 Broadcast
- 8 Hot Flow
- 9 Conclusion
Transferring a single value between coroutines can be done by the Deferred object (the result of async job). But when you need to transfer a stream of values between multiple coroutines, there could be a place for channels. Channel easily allows to transfer a stream of values (very …
This blogpost is a continuation of the previous post: Coroutines Basics, and covers more advanced mechanisms than basic coroutines have to offer. In this article, I'm going to present an idea of coroutine streams called Flow. Why and when do we need it? What can be achieved by using it? How to create and manage it? And how does it affect and cooperate with coroutines? I hope you will find all the answers below.
- 1 Multiple values problem
- 2 Flow to the rescue
- 3 Builders
- 4 Launching
- 5 Cancellation
- 6 Context
- 7 Operators
- 8 Buffering
- 9 Composing and flattening
- 10 Exception
As far as we already know from the previous article, a suspending function can return a single value. What if there is a need to return multiple asynchronously calculated values? Let's make it clear w…
UI tests are a great way to verify if your application is working correctly. Using them, you can verify if certain actions cause certain effects. However, you usually don’t want your application to send any data to production services, especially when the application is doing requests that modify the data on the server. In case when we know what request and response bodies should look like, it’s not a big problem. We can mock all the requests that the application makes and stub the responses.
However, it’s harder if you want to mock requests that are sent to analytics, which is very often handled by some third party provider like Google Firebase. Doing it the same way would require you to intercept requests sent to the third party provider …
- 1 AWS S3 - Disaster
recovery using versioning and objects metadata
- 1.1 General Procedure for disaster recovery using S3 versioning and objects’ metadata
- 1.2 Warning!
- 1.3 OK, let’s do this!
- 1.4 Summary
AUTHOR: Jacek Małyszko, Data Egnineering
Accidental removal of data on S3 is something that no Data Engineer on AWS wants to be involved in. Unfortunately, sometimes it may happen; storage of data on S3 may be expensive so from time to time you may need to get rid of some terabytes here and there. Such data deletions may be performed automatically or manually. As we’re “only humans”, some mistakes may occur. For example, once I had this sad situation; instead of removing all files under 2020/05/01 prefix, I removed 2020/01.
Fortunately, the buck…
We developers are constantly on a lookout for new solutions, the best approaches so no wonder the world is changing and asynchronous programming is changing with it. At Fandom we do the same: we want to follow and apply the best solutions for specific problems. And that's what we did for one of our latest projects. We decided to use Kotlin Coroutines in our Android app, not only because they are native (less dependencies, loosely coupled) but especially their usage has certain benefits.
It doesn't matter if you write mobile or desktop or even server-side applications, there could be a place for Kotlin Coroutines in your code. But what actually are they? How do they work? What problem do they solve? Where and when should they be used? In thi…
At Fandom Data Engineering team, we are responsible for not only
building internal analytics capabilities, but also delivering
features such as recommendations and Analytics Dashboard for
In total, we are custodians of ~170 TB Data Warehouse.
Internally, we are using Apache Airflow to build and
manage ~35 ETLs (Extract-Transform-Load), making it
This is a challenging task, no matter what technology is used.
Based on our experience, here are some questions we consider essential before anyone writes a data pipeline.
The world of data is alluring to almost anyone in a modern
Especially if it can be automated.
Most of our processes expose their results as tables on Amazon Athena, available for later consumption by to…
Is using AWS cloud cool? Definitely! What is not so cool about
using those kinds of services is quite a limited way to keep track
of how much it costs or avoid surprising bills at the end of the
month. Working on-premise does not make you concerned about those
matters, but on the other hand, you have to give up on benefits
that the cloud serves, like flexibility, auto-scaling, short
time-to-market, robustness, easy research, and development,
The aforementioned end of the month comes, and after receiving a receipt, you are thinking only about two things: how is it possible that I burned so much money on this and how to make the next receipt less painful. Answer six questions below and find out how much you can save.
- 1 Am I still using it…
This blog post is a follow-up of Enhancing XcodeGen for simpler maintenance of dependencies in modular iOS app . In the mentioned article I showed you how we enhanced XcodeGen format so only direct dependencies of modules are needed to be specified in project definitions. In this article I would like to present to you a solution that made our PR checks faster, as we run them only for modules that need it. It’s best if you first read the mentioned article to fully understand the issues that we faced. Anyway, I’ll start with a quick recap of the problem.
In the sample setup we had 3 projects defined with XcodeGen:
- "ModularApp" application
- “FeatureModule” dynamic framework imported by the application
- “ApiModule” dynamic framework imported by the …
Remote work is quickly becoming the norm in the tech industry, but that was definitely not the case pre-2020. At D&D Beyond, we’ve always had some remote staff, but the vast majority of our team has been collocated at our office in Huntsville, Alabama. Historically, there were two main concerns around embracing more remote work - communication and culture.
As I mentioned, we were already working with some remote folks, but that certainly had some challenges. Most of our important communication happened in-office and in a lot of cases required you to be in close proximity to the conversation or else you’d probably miss out. Even having a desk on the opposite side of the office presented problems, let alone on the other side of the country or…
- 1 Breaking the monolith
- 2 What’s the problem?
- 3 What’s the solution?
- 4 Summary
Developers that take the challenge of breaking the monolith in their iOS codebase and splitting it into separate modules face another problem: How to best manage multiple .xcodeproj files and potential conflict resolution on them? Fortunately, there’s a really convenient tool called XcodeGen that makes it quite easy – it generates the .xcodeproj files based on the YAML files stored in the codebase. Using YAML files greatly simplifies conflict resolution since you no longer need to version control .xcodeproj files. Instead, you can define your project with a much simpler syntax.
However, when you have a bunch of dynamic framework targets with dependencies between them and…