- Agent: a simple abstraction around state
- GenServer: client-server pattern
- Supervisor: monitor other process
- Dynamic supervisors
- ETS (Erlang Term Storage)
- Mix project
- OTP: OTP stands for Open Telecom Platform, although it’s not that much about telecom anymore (it’s more about software that has the property of telecom applications, but yeah.)
- Umbrella project
- Task: Tasks are processes meant to execute one particular action throughout their lifetime, often with little or no communication with other processes. The most common use case for tasks is to convert sequential code into concurrent code by computing a value asynchronously
Mix makes a distinction between projects and applications.
When we say “project” you should think about Mix. Mix is the tool that manages your project. It knows how to compile your project, test your project and more.
When we talk about applications, we talk about OTP. Applications are the entities that are started and stopped as a whole by the runtime.
About Erlang: If half of Erlang’s greatness comes from its concurrency and distribution and the other half comes from its error handling capabilities, then the OTP framework is the third half of it.
If you’re familiar with Ruby, Mix is Bundler, RubyGems, and Rake combined.
4 supervision strategy:
Erlang Term Storage
Serveral function names
Functions to be called when some action takes.
Dependencies and umbrella projects
Two types dependencies: internal and external. Mix supports both two types.
Versions definition: Version – Elixir v1.6.4
$ mix help | grep deps mix deps # Lists dependencies and their status mix deps.clean # Deletes the given dependencies' files mix deps.compile # Compiles dependencies mix deps.get # Gets all out of date dependencies mix deps.tree # Prints the dependency tree mix deps.unlock # Unlocks the given dependencies mix deps.update # Updates the given dependencies mix hex.audit # Shows retired Hex deps for the current project mix hex.outdated # Shows outdated Hex deps for the current project
Mix and Umbrella projects
$ mix new kv_umbrella --umbrella * creating README.md * creating .formatter.exs * creating .gitignore * creating mix.exs * creating apps * creating config * creating config/config.exs Your umbrella project was created successfully. Inside your project, you will find an apps/ directory where you can create and host many apps: cd kv_umbrella cd apps mix new my_app Commands like "mix compile" and "mix test" when executed in the umbrella project root will automatically run for each application in the apps/ directory.
Create OTP application
$ mix new kv_umbrella --umbrella $ cd kv_umbrella/apps $ mix new kv_server --module KVServer --sup
- dependencies store path
- dependencies lockfile
- build output path
Quote and unquote
Domain specific languages
- Plug: It provides a specification for web application components and adapters for web servers. While not part of Elixir core, Plug is an official Elixir project.
- Ecto: Ecto is an official Elixir project providing a database wrapper and integrated query language. With Ecto we’re able to create migrations, define schemas, insert and update records, and query them.
- Mnesia: Mnesia is a heavy duty real-time distributed database management system.
- Guardian: Guardian is a widely used authentication library based on JWT (JSON Web Tokens).
- Poolboy: You can easily exhaust your system resources if you do not limit the maximum number of concurrent processes that your program can spawn. Poolboy is a widely used lightweight, generic pooling library for Erlang that addresses this issue.
- Benchee: We can’t just guess about which functions are fast and which are slow - we need actual measurements when we’re curious.
- Bypass: Bypass is described as “a quick way to create a custom plug that can be put in place instead of an actual HTTP server to return prebaked responses to client requests.” Under-the-hood Bypass is an OTP application that masquerades as an external server listening for and responding to requests.
&1 in lambda?
A: lambda function’s positional parameter.