Fandom Developers Wiki
Fandom Developers Wiki

Ritaly-dev Ritaly-dev 23 April

Auto linking Jira ticket in PR description via Github Action

I was looking for an easy way to generate a URL to a Jira ticket in the pull request description or as the first comment. The ticket number/code should be automatically extracted from the branch name.

Neat, automated solutions, but unfortunately, all the top articles from Google led me to the opposite problem - how to see PRs or commits from GitHub in Jira.

The final solution is really simple, so maybe someone will use it.

(or any other project management tool)

First things first - What is Github Action?

GitHub Action is a tool added to Github that allows you to automate your entire software development workflow such as CI/CD, custom steps, E2E testing, etc.

There is a lot of things you can just drop into GitHub Action and not have to worry about…

Read Full Post
MadjerFd MadjerFd 16 December 2020

Coroutines Channel

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 …

Read Full Post
MadjerFd MadjerFd 3 December 2020

Coroutines Flow

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…

Read Full Post
Kviatkovsky Kviatkovsky 9 November 2020

Verifying tracking events in XCUITest

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 …

Read Full Post
Jmalyszko Jmalyszko 5 November 2020

AWS S3 - Disaster recovery using versioning and objects metadata

  • 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

June 2020

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…

Read Full Post
MadjerFd MadjerFd 3 November 2020

Coroutines basics

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…

Read Full Post
MikolajFromDataEngineering MikolajFromDataEngineering 9 October 2020

Before you build your next ETL, answer these!

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 our community.
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 all possible.
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 organisation.
Especially if it can be automated.

Most of our processes expose their results as tables on Amazon Athena, available for later consumption by to…

Read Full Post
JacekThePie2 JacekThePie2 24 September 2020

How to save some $$$ using Amazon Web Services?

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, etc. 
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…

Read Full Post
Kviatkovsky Kviatkovsky 19 August 2020

Faster pull request checks for modular iOS app

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 …

Read Full Post
IrTriskit IrTriskit 17 July 2020

Beyond Remote

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…

Read Full Post