teleren/devto huggingface dataset:
JavaScript Closures
Tags: javascript, webdev, programming, closure
Published: 2023-01-23 17:16:39

JavaScript function closures are a powerful feature that allows you to create private variables and methods within a function.

This can be useful for encapsulating logic, data, and behavior, and preventing them from being accessed or modified by external code.

A closure is created when a function is defined inside another function. The inner function has access to the variables and parameters of the outer function, even after the outer function has returned.

Here is an example of a closure in JavaScript:

![an example of a closure in JavaScript](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/adu7ty114vtf20m10nrl.png)

In this example, the _outerFunction_ takes a single parameter **x** and assigns it to a variable _privateVariable_. It then returns the _innerFunction_, which has access to _privateVariable_ and can return its value.

When we call _outerFunction(**10**)_, it returns the _innerFunction_ with _privateVariable_ set to **10**. We assign the returned function to a variable _closure_. Then we call the closure function which will give us the output **10**.

Closures can also be used to create private methods. For example:

![Closures can also be used to create private methods](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ig16t6izt8tny9nhox1.png)

In this example, _increment_ and _getValue_ are private methods that can only be accessed via the returned object. This allows you to hide implementation details and control how the data and methods are used.

**Closures** are a powerful feature in JavaScript, and are often used in object-oriented programming, functional programming, and other design patterns. 

They allow you to create encapsulated and reusable code, and can help to improve the structure and maintainability of your application.
6- Data types in Python Programming
Tags: python, tutorial, programming, beginners
Published: 2023-01-23 17:12:08

--- series: Python for scientific research ---

#### Variables in Python

* Variables dynamically typed in Python.
    
* Python is case sensitive; it differentiates between capital (Erbil) and small letters (erbil).
    
* The first letter of variables cannot start with digits (i.e. 3Erbil).
    

#### Main data types in Python

1- Integers: int

```python
Age = 55 
type(Age) # class 'int'
```

2- Float:

```python
x = 22.5
type(x) # class ‘float’
```

3- Complex:

```python
z = 5 + 10j
type(z) # class 'complex'
```

4- Boolean: bool is true or false

```python
isFactor = False
type(isFactor) # class 'bool'
```

5- Strings: str

```python
name = "Anas"
type(name) class 'str'
```

6- Nothing: NoneType

```python
precipitation = None
type(precipitation) # class 'NoneType'
```

#### Container data types in Python:

1- tuple:

```python
color = ("red", "blue", "green")
type(color) # class 'tuple'
```

2- list:

```python
Color = [“red”, “blue”, “green”]
type(Color) # class 'list'
```

3-set:

```python
food = set(["rice" , "egg", "yogurt"])
type(food) # class 'set'
```

4- dict: dictionary

```python
age = {'Anas': '8', 'Aviar': '6', 'Muhammad': '5'}
type(age) # class 'dict'
```

5- range:

```python
y = range(100)
type(y) # class 'range'
```

If you like the content, please [SUBSCRIBE](https://www.youtube.com/channel/UCpbWlHEqBSnJb6i4UemXQpA?sub_confirmation=1) to my channel for the future content.

To get full video tutorial and certificate, please, enroll in the course through this link: [https://www.udemy.com/course/python-for-researchers/?referralCode=886CCF5C552567F1C4E7](https://www.udemy.com/course/python-for-researchers/?referralCode=886CCF5C552567F1C4E7)
Testing custom repositories (NestJS/TypeORM)
Tags: nestjs, jest, typeorm, testing
Published: 2023-01-23 16:52:53

---
title: Testing custom repositories (NestJS/TypeORM)
published: true
tags: ['nestjs', 'jest', 'typeorm', 'testing']
canonical_url: https://sevic.dev/notes/testing-custom-repositories/
---

Custom repositories extend the base repository class and enrich it with several additional methods. This post covers the unit and integration testing.

```typescript
// user.repository.ts
@Injectable()
export class UserRepository extends Repository<UserEntity> {
  constructor(private dataSource: DataSource) {
    super(UserEntity, dataSource.createEntityManager());
  }

  async getById(id: string) {
    return this.findOne({ where: { id } });
  }
  // ...
}
```

### Setup

Inject a custom repository into the service.

```typescript
// user.service.ts
export class UserService {
  constructor(private readonly userRepository: UserRepository) {}

  async getById(id: string): Promise<User> {
    return this.userRepository.getById(id);
  }
  // ...
}
```

Pass entity class to the `forFeature` method.

```typescript
// user.module.ts
@Module({
  imports: [
    TypeOrmModule.forFeature([UserEntity])],
    // ...
  ],
  providers: [UserService, UserRepository],
  // ...
})
export class UserModule {}
```

### Unit testing

To properly unit-test the custom repository, mock some methods.

```typescript
// user.repository.spec.ts
describe('UserRepository', () => {
  let userRepository: UserRepository;
  const dataSource = {
    createEntityManager: jest.fn()
  };

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UserRepository,
        {
          provide: DataSource,
          useValue: dataSource
        }
      ]
    }).compile();

    userRepository = module.get<UserRepository>(UserRepository);
  });

  describe('getById', () => {
    it('should return found user', async () => {
      const id = 'id';
      const user = {
        id
      };
      const findOneSpy = jest
        .spyOn(userRepository, 'findOne')
        .mockResolvedValue(user as UserEntity);

      const foundUser = await userRepository.getById(id);
      expect(foundUser).toEqual(user);
      expect(findOneSpy).toHaveBeenCalledWith({ where: user });
    });
  });
});
```

### Integration testing

Integration testing is more suitable when working with databases. Read more about it on [Integration testing Node.js apps post](https://sevic.dev/notes/integration-testing-nodejs/)

### Boilerplate

Here is the [link](https://sevic.dev/nestjs-starter?ref=devto-testing-custom-repositories) to the boilerplate I use for the development. It contains the examples mentioned above with more details.
7- What is control flow in Python?
Tags: python, programming, tutorial, beginners
Published: 2023-01-23 17:10:58

--- series: Python for scientific research ---

The control flow in Python is set by loops, conditional statements, and function calls.

#### if ... else

```python
a = 50
b = 100
if a > b: 
    print('a is greater than b')
elif a < b:
    print('a is smaller than b')
else:
    print ('a is equal to b')
# a is smaller than b
```

Tip: In Python, spaces are the preferred indentation method, not tabs.

#### while loops

```python
i = 4
while i < 10:
  print(i)
  i += 2
# 4
# 6
# 8
```

#### for loops

```python
for x in "Python":
  print(x)
# P
# y
# t
# h
# o
# n
```

Tip: for loops preferred over while loops.

If you like the content, please [SUBSCRIBE](https://www.youtube.com/channel/UCpbWlHEqBSnJb6i4UemXQpA?sub_confirmation=1) to my channel for the future content.

To get full video tutorial and certificate, please, enroll in the course through this link: [https://www.udemy.com/course/python-for-researchers/?referralCode=886CCF5C552567F1C4E7](https://www.udemy.com/course/python-for-researchers/?referralCode=886CCF5C552567F1C4E7)
PhpStorm Plugin Picks
Published: 2023-01-23 17:10:39

Hi everyone,  since July 30, 2022, I have 818 hours logged programming with the latest version of Laravel, and PhpStorm spending an average of 7 hours 9m per day. Exlcuding weekends, my daily average is around 8 hours per day.

During this time, I have come across several PhpStorm plugins that make my programming day a delight, and would like to share some of them with you. Today, I will share a few of them, and will do a follow up post with more.

[1) WakaTime](https://plugins.jetbrains.com/plugin/7425-wakatime)
Wakaktime is an INDISPENSABLE tool for time tracking.
What I love about it is that it tracks how much time you spend in each branch, per project.  I do love RescueTime as well, but RescueTime does not track time per branch.  Branch time tracking really helps when reporting how much time you spent on each feature / bug fix.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e41msfrgpl3sunzj0qby.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gt3c0xg9opzp1u5tym6v.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2s3a53ncosmbukouvujj.png)




[2) Inspection Lens](https://plugins.jetbrains.com/plugin/index?xmlId=com.chylex.intellij.inspectionlens&utm_source=product&utm_medium=link&utm_campaign=PS&utm_content=2022.3)

This plugin is great, as it prints code error inspections right within your editor in red. This can helps save time by identifying problems while coding in a very direct and clear manner. 
 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/geho9jrxdqjscfv1ibdn.png)

[3) Quick Notes](https://plugins.jetbrains.com/plugin/4456-quick-notes)
Quick Notes is another plugin I love, as it provides a very useful and available note pad you can use while you are programming. This is especially useful during Team meetings when talking to a PM, or another team mate.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4501i5hwnq775in20c2n.png)

4) [PHPHammer](https://plugins.jetbrains.com/plugin/index?xmlId=net.rentalhost.plugins.php.hammer&utm_source=product&utm_medium=link&utm_campaign=PS&utm_content=2022.3)

PhpHammer provides 47 inspections to help identify problem areas in your code which are not available natively in PHPStorm.  It will suggest ways to optimize and clean up 
your code, as your write logic in real time.

5) [Project Label](https://plugins.jetbrains.com/plugin/index?xmlId=com.drinchev.projectlabel&utm_source=product&utm_medium=link&utm_campaign=PS&utm_content=2022.3) is also a neat plugin that adds a Colored Textual Label at the bottom of PHPStorm with the name of your project. This is handy when when switching between multiple projects within your organization. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1r88nab73yw2r18cwga.png)

I hope these help, more to come!
Found an amazing device that can ease our life!!!
Tags: technology, usb, amazon
Published: 2023-01-23 16:59:14


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ih8lq1zc42wn23goryd1.jpg)
Guys seriously this could be the best device that can save us. In this online world we have to attend meetings/classes and in that case, we have to keep our screen awake all the time. So, the problem is even if we don't have much work, or we are free for a while our screen automatically gets off. And please don't think of keeping the display on all the time by changing its power settings as this can decrease the battery life of our laptops!
[Read More](https://quizzeum.com/blogs/usb-that-keeps-screen-awake)
How to Switch to Particular Network using Window.Ethereum
Tags: blockchain, javascript, web3, webdev
Published: 2023-01-23 16:56:15

In Web3, Almost Every Dapps were connected to a Particular Network. For Example, Beginners and Learning based projects are mostly connected to a Test Network.

When a Transaction triggered by the user, the Metamask will be connected and Perform the Transaction.In this, the user needs to manually Switch to a Particular Network to perform the Transaction.

Suppose, if the user is new to web3, he doesn't know! What network he need to switch.

So for that Coming up with the solution. Switch Network/chain in Metamask.

Here is a JavaScript Program to Switch from one Network or chain to other:

```
const SwitchNetwork = async (_chainId) => {
    let chainId = _chainId;
    await window.ethereum
      .request({
        method: "wallet_switchEthereumChain",
        params: [{ chainId: chainId }],
      })
      .then(() => console.log("Successfully! Connected to the requested Network"))
      .catch((err) => {
        if (err.message.startsWith("Unrecognized chain ID")) {
          addNewNetwork();
        }
      });
  };
```

From the above in **catch()** block, you can find **addNetwork()**. This will help the user to add Automatically connected to the Network,Which doesn't exist in his Metamask.

To know addNetwork(), Follow this!

**https://dev.to/0x24karthick/how-to-add-custom-network-in-metamask-using-windowethereum-3mg**


                            Happy Coding!
#014 𝗠𝗲𝗲𝘁𝗶𝗻𝗴s for Engineers
Tags: meeting, engineers, tesla
Published: 2023-01-23 16:48:02


## 𝗘𝗳𝗳𝗶𝗰𝗶𝗲𝗻𝘁 𝗠𝗲𝗲𝘁𝗶𝗻𝗴 Meaning

> In general, we engineers don't like meetings, they break our flow and reduce our productivity. 
BUT, meetings are something that we all need to do.

Meetings should exist for bounding, problem-solving, and decision-making.

Yet, we can do something about this to improve our meetings, always refactoring it and here are some tips: 

*  𝗔𝗹𝘄𝗮𝘆𝘀 𝗰𝗵𝗲𝗰𝗸 𝘀𝗵𝗼𝘂𝗹𝗱 𝘁𝗵𝗶𝘀 𝗺𝗲𝗲𝘁𝗶𝗻𝗴 𝗰𝗼𝘂𝗹𝗱 𝗯𝗲 𝗮𝗻 𝗲-𝗺𝗮𝗶𝗹

*  𝗦𝗲𝗻𝗱 𝗮 𝗽𝗿𝗲-𝗿𝗲𝗮𝗱 𝗳𝗼𝗿 𝗮𝗻𝘆 𝗺𝗲𝗲𝘁𝗶𝗻𝗴 𝗰𝗼𝗺𝗺𝘂𝗻𝗶𝗰𝗮𝘁𝗶𝗼𝗻 (𝟮𝟰𝗵 𝗶𝗻 𝗮𝗱𝘃𝗮𝗻𝗰𝗲)

*  𝗘𝘃𝗲𝗿𝘆 𝗺𝗲𝗲𝘁𝗶𝗻𝗴 𝘀𝗵𝗼𝘂𝗹𝗱 𝗵𝗮𝘃𝗲 𝗮𝗻 𝗮𝗴𝗲𝗻𝗱𝗮 𝗮𝗻𝗱 𝗰𝗹𝗲𝗮𝗿 𝗴𝗼𝗮𝗹

*  𝗖𝗮𝗹𝗹 𝗼𝗻𝗹𝘆 𝘁𝗵𝗼𝘀𝗲 𝗽𝗲𝗼𝗽𝗹𝗲 𝘄𝗵𝗼 𝗻𝗲𝗲𝗱 𝘁𝗼 𝗯𝗲 𝗶𝗻 𝗮 𝗺𝗲𝗲𝘁𝗶𝗻𝗴

*  𝗔𝘁 𝘁𝗵𝗲 𝘀𝘁𝗮𝗿𝘁 𝗼𝗳 𝗮 𝗺𝗲𝗲𝘁𝗶𝗻𝗴 𝗶𝗻𝘁𝗿𝗼𝗱𝘂𝗰𝗲 𝗲𝘃𝗲𝗿𝘆𝗼𝗻𝗲, 𝗲𝘃𝗲𝗿𝘆𝗯𝗼𝗱𝘆 𝗻𝗲𝗲𝗱𝘀 𝘁𝗼 𝗸𝗻𝗼𝘄 𝗲𝘃𝗲𝗿𝘆𝗼𝗻𝗲

*  𝗗𝘂𝗿𝗶𝗻𝗴 𝘁𝗵𝗲 𝗺𝗲𝗲𝘁𝗶𝗻𝗴 𝘁𝗿𝘆 𝘁𝗼 𝘀𝘁𝗮𝘆 𝗼𝗻 𝘁𝗼𝗽𝗶𝗰

*  𝗦𝘁𝗮𝗿𝘁 𝗮𝗻𝗱 𝗲𝗻𝗱 𝘁𝗶𝗺𝗲𝘀 𝗼𝗳 𝗺𝗲𝗲𝘁𝗶𝗻𝗴𝘀 𝘀𝗵𝗼𝘂𝗹𝗱 𝗯𝗲 𝗼𝗻 𝘁𝗶𝗺𝗲

*  𝗦𝗼𝗺𝗲𝗼𝗻𝗲 𝘀𝗵𝗼𝘂𝗹𝗱 𝘁𝗮𝗸𝗲 𝗻𝗼𝘁𝗲𝘀 𝗮𝗻𝗱 𝘀𝗲𝗻𝗱 𝗮 𝗿𝗲𝗰𝗮𝗽 𝗮𝗳𝘁𝗲𝗿 𝗮 𝗺𝗲𝗲𝘁𝗶𝗻𝗴

*  𝗜𝗳 𝘁𝗵𝗲𝗿𝗲 𝗮𝗿𝗲 𝗮𝗰𝘁𝗶𝗼𝗻 𝗻𝗼𝘁𝗲𝘀 𝗮𝗳𝘁𝗲𝗿 𝘁𝗵𝗲 𝗺𝗲𝗲𝘁𝗶𝗻𝗴, 𝗜 𝗲𝘅𝗽𝗲𝗰𝘁 𝟭𝟬𝟬% 𝗼𝗳 𝘁𝗵𝗲𝗺 𝘁𝗼 𝗯𝗲 𝗿𝗲𝘀𝗼𝗹𝘃𝗲𝗱 𝗼𝗿 𝗻𝗼𝘁𝗶𝗳𝗶𝗲𝗱 𝘄𝗵𝘆 𝘁𝗵𝗲𝘆'𝗿𝗲 𝗻𝗼𝘁.

*  𝗡𝘂𝗺𝗯𝗲𝗿 𝗼𝗳 𝗽𝗲𝗼𝗽𝗹𝗲 𝗮𝘁 𝗺𝗲𝗲𝘁𝗶𝗻𝗴𝘀 𝘀𝗵𝗼𝘂𝗹𝗱 𝗳𝗼𝗹𝗹𝗼𝘄 𝘁𝘄𝗼 𝗽𝗶𝘇𝘇𝗮 𝗿𝘂𝗹𝗲

*  𝗦𝗰𝗵𝗲𝗱𝘂𝗹𝗲 **45** 𝗺𝗶𝗻𝘂𝘁𝗲𝘀 𝗺𝗲𝗲𝘁𝗶𝗻𝗴𝘀, 𝗶𝗻𝘀𝘁𝗲𝗮𝗱 𝗼𝗳 **50** 𝗮𝗻𝗱 **𝟮𝟱 ** 𝗶𝗻𝘀𝘁𝗲𝗮𝗱 𝗼𝗳 **𝟯𝟬** etc.

From time to time try to revisit your calendar and especially recurring meetings. Get rid of the ones that are no longer serving a valuable purpose.

From time to time try to revisit your calendar and especially recurring meetings. Get rid of the ones that are no longer serving a valuable purpose.



> And at the end of this post we must give a space for Elon Musk :)

##Elon's three clear meeting rules

**In 2018, Musk sent an email to Tesla employees that outlined, among other things, three clear meeting rules to follow:
**
  1."Please get [rid] of all large meetings, unless you're certain they are providing value to the whole audience, in which case keep them very short."

  2."Also get rid of frequent meetings, unless you are dealing with an extremely urgent matter. Meeting frequency should drop rapidly once the urgent matter is resolved."

  3."Walk out of a meeting or drop off a call as soon as it is obvious you aren't adding value. It is not rude to leave, it is rude to make someone stay and waste their time."

Thanks, 
Kemal Cholovich
How to start a business
Published: 2023-01-23 16:37:16

Many of us dream of starting our own business. When looking around, it’s tempting to think, “Hey, anyone can do this!” But it’s important to remember that there’s a difference between merely starting a business on paper and setting yourself up for success. Done correctly, it takes careful planning, investment, and motivation. Going in blind and starting a business without knowing what you’re getting into can lead to costly failure.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59fadzezwk9l2sd4jksb.jpg)

In this article, we’ll attempt to take as much of the guesswork out of the process as possible by showing you how to start a business in 13 general steps. Some of these steps will be slightly different based on the region you live in. For example, the “legal stuff” in this article specifically focuses on the US.

That said, no matter where you reside we recommend checking with a local lawyer and your local government to determine any legal requirements for starting a business in your area. Nothing in this article should be considered legal advice.

With that caveat out of the way, let’s talk about what you need to do to not only start your business but set yourself up for success!

1. Start with You
Don’t just jump in. Make sure you have what it takes to run your own business. Don’t limit yourself, but evaluate yourself to know who you’re dealing with. Know your strengths, weaknesses, likes, dislikes, tastes, and interests. Know your skills, passions, the lifestyle you’re after, how much you can spend, how much you can afford to risk, and the types of work you want to do.

Not everyone can be their own boss. It takes motivation and discipline to see the project through and it’s difficult to stick with something you don’t like. It’s okay if you don’t know much about business itself at first. Take courses if you need to. The important thing is that you’re completely invested in (and a good fit for) the work required for the business you choose to create.

2. The Business Idea
It pays to spend some time on the business idea. Here are a few things to ponder:

Maybe you have a better solution to an annoying problem. What problems can you solve?

Look at what’s coming soon in various industries such as technology, health, entertainment, etc. Ask how it will change life or business in general and what you can do to position yourself (and your business) to capitalize on that change.

How can you apply your skills to a different industry? For example, do you have a unique skill set or way of thinking learned in one industry that has yet to be applied to another? Perhaps there’s opportunity there?

Can you provide something better or cheaper than it’s currently being provided? Can you provide something to a location that doesn’t have access to it?


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jeg83gm093hb0kso23wn.jpg)
#013 AI Tools 2023
Tags: ai, productivity
Published: 2023-01-23 16:36:35

5 powerful tools you must have in 2023:

1.- https://cleanup.pictures/

Remove unwanted objects from
photos, people, text, and defects from any picture.

2.- www.resumeworded.com

Online resume and Linkedln grader instantly scores your resume and Linkedln profile and gives you detailed feedback on how to get more opportunities and interviews.

3.- https://soundraw.io/

Soundraw is a music generator for creators.
Select the type of music you want genre, instruments, mood, length, etc and let Al generate beautiful songs for you.

4.- www.looka.com

Design a Logo, make a website, and create a brand identity you'll love with the power of Al.

5.- www.copy.ai

Get a great copy that sells. Copy.ai is an Al-powered copywriter that generates high-quality copy for your business.
Convert Luos engine information into JSON objects
Tags: opensource, startup, news, luos
Published: 2023-01-23 16:30:00

**Did you know** that you can use gate services to convert Luos engine information into JSON objects?

This allows other programming languages to **easily interact with your device** and makes it simple for developers to integrate their systems with yours. 

⏩ [Learn more](https://www.luos.io/docs/tools/api-json)
#012 AI Tools 2023
Tags: ai, blog
Published: 2023-01-23 16:34:57

These are 5 websites I have discovered last week and you must know too.

1.- Kafkai: Al Writer Assistant that helps you create unique SEO-friendly articles for cents instead of dollars.

https://kafkai.com/en/

2.- Jokelub: Turn your writing into a joke at the click of your hand. Make people smile.

https://jokelub.com/

3.- GoCharlei: The Content Creator's
New Best Friend! Charlie helps create UNLIMITED Full Blogs, Ads, Influencers posts.

https://gocharlie.ai/

4.- Get Dost: Create safe, bias-free, microaggressions-free, inclusive messages with Dost’s AI-powered Slack and MSTeams app.

https://getdost.com/

5.- BlogNPL: the AI blog writing tool that helps you craft captivating content quickly and easily.

https://www.blognlp.com/

Artificial Intelligence is changing our reality. More tools are helping us in a our daily life.
I've just created simple frontend Todo app with clean architecture
Tags: javascript, typescript, architecture
Published: 2023-01-23 16:31:17

↓ detail here
https://github.com/kazoogon/frontend_with_cleanArchitecture

As I've written in title, I've just created frontend simple Todo app with clean architecture.

While I was creating this app, I thought like that

> 🤔 There is no absolute answer about architecture, even though I use clean architecture, there would be a lot of way

So It's happy if somebody improves my code / structure or just talks about it

---

By the way, if you want to learn about it, I recommend you to learn about SOLID principle at first, specially **Dependency Inversion**

{% link https://dev.to/kaziusan/solid-dependency-inversion-399h %}

---

After trying to make this one, honestly I thought **clean architecture** is too complicated, because we don't use often **useCase** and **repository** effectively.

So [presentational and container pattern](https://www.patterns.dev/posts/presentational-container-pattern/) might be simpler and better way.

simply put, this pattern is that separating business login component and UI component.
Substation: Data Pipeline and Transformation Toolkit Written in Go
Tags: go, aws, security, opensource
Published: 2023-01-23 16:10:00

Hello fellow Gophers, data enthusiasts, and security engineers! I'm excited to share a project that I've been leading for multiple years with the DEV community: [Substation is an open-source data pipeline and transformation toolkit written in Go](https://github.com/brexhq/substation).

With Substation you can:
* Deploy serverless data pipelines or microservices to AWS in minutes using infrastructure as code (Terraform)
* Evaluate, process, and deliver data in real-time using configurations as code (Jsonnet)
* Create custom data processing applications written in Go

Substation is an affordable alternative to products like [Cribl](https://cribl.io/) (~10x cost savings) and is easier to manage than similar open-source projects such as [Logstash](https://www.elastic.co/logstash/) and [fluentd](https://www.fluentd.org/). It's been used in production by the security team at Brex for 2+ years and is ready for any scale, even beyond 100,000 events per second!

If you'd like to learn more, then please [read the documentation](https://substation.readme.io/docs), [try the recipes](https://substation.readme.io/recipes), and let me know if you have any questions!