Comments 9
Немного юмора: в те далёкие времена некие товарищи делали вид что писали на эрланге опердени.
А что не так с Эликсиром? Эрланг, допустим, требует определенных усилий для понимания. А вот "Эликсир недалеко ушел" — вы на основании чего мнение основываете? Ну, и "беднейших тулкит" — это о чём? Что такое "язык общего назначения" с вашей точки зрения, и почему Эрланг (и, тем более, эликсир) не соответствует этому определению?
Что же до интереса: как раз Эликсир активно развивается, всё больше крупных компаний ищет людей на эти вакансии. Из близких примеров: Wargaming это направление развивает и набирает людей.
Насчет вакансий — зашел на мойкруг поискал по elixir, аж целых 9 вакансий, из них в половине elixir идет факультативом, это несерьезно. Для сравнения python — 177, js — больше 300, Java — почти 500.
Да, с графическими интерфейсами всё не очень хорошо, но они не особо и нужны в данном случае. Есть биндинги для wxWidgets, по-умолчанию Erlang собирается с их поддержкой, и даже внутренние утилиты мониторинга их поддерживают. Например, можно запустить iex (оболочку Elixir) и набрать :observer.start(), это выведет примерно следующее окно:
Это, конечно, очень бедная визуально штука, и не очень красивая. Можно сделать свои биндинги и использовать любой UI-framework.
Некоторое время назад был анонсирован Scenic — это специальный фреймворк для GUI во встроенных приложениях. Очень рекомендую потратить немного времени и посмотреть видео — крайне любопытная концепция. К примеру, каждый элемент — это процесс, встроенный в дерево супервизоров. Если у вас возникнет ошибка в любом слое — этот слой будет мгновенно перезапущен и перерисован, а не умрёт или подвиснет всё приложение, как это часто бывает с GUI. Другая особенность: благодаря особенностям BEAM можно подключиться к ноде, на которой запущен интерфейс, и получить полную 100% копию всего, что на ней происходит, локально. Представьте себе embedded-систему, которая стоит, скажем, в грузовике или на какой-нибудь удалённой заправке (привет, Газпромнефть!). В ней что-то происходит, а пользователь с этим разобраться не может. Или его вообще нет рядом. Подключаетесь, смотрите, нажимаете кнопочки, решаете проблему. Ну, там и прочие всякие интересные фишки есть. Это, конечно, не совсем то, о чём вы говорите, но штука крайне интересная.
Писать "какие-то части ОС", т.е., я подозреваю, утилиты на Erlang\Elixir довольно бессмысленно, поскольку его имеет смысл использовать в statefull-режиме в первую очередь. Но сервисов и ресурсов много на BEAM написано:
- SimpleDB от Amazon, которая является частью Amazon Elastic Compute Cloud (EC2)
- Backend чатов Facebook, 100 миллионов активных сессий
- WhatsApp, причём в 2015 году они говорили, что система, имеющая 900 миллионов пользователей, поддерживаются командой из 50 инженеров, включая разработку
- RabbitMQ, AMQP-мессенджер, который, мне кажется, сейчас вообще в любой дырке затычка (не в качестве критики RabbitMQ, а как иллюстрация популярности: вообще везде пихают, даже туда, куда не стоило бы)
- CouchDB, документо-ориентированная база данных
- Riak, горизонтально масштабируемая NoSQL база данных
- Ejabberd, xmpp-сервер
- Lonely Planet
Я уже не говорю о куче телекомов, которые используют Erlang, а теперь и Elixir для внутренних систем.
Кстати, просто в качестве ремарки о возможностях: году в 2017 проводили тест Phoenix Channels (это такое средство для постоянного соединения с backend'ом на phoenix из любых клиентов, например, от веб-сервиса; скажем, я их активно использую в качестве транспорта для того, чтобы пушить события со стороны сервера, а не заствлять клиента долбиться периодически на сервер в поисках чего-нибудь новенького; реализуется поверх websockets). Так вот, один (!) сервер смог выдержать 2 миллиона соединений. Пришлось использовать три или четыре мощных сервера, чтобы на них сэмулировать клиентскую нагрузку. А на backend с этим справился только один сервер.
О фреймворках: вы много знаете фреймворков для Ruby, кроме Rails? Ведь они есть. Так же и для Elixir. Но при этом эликсир совершенно не обязательно использовать с Phoenix, последний — это web-фреймворк. Если у вас не веб-приложение, то он не нужен. Кроме того, если вы будете следовать нормальным практикам, то воспользуетесь им только в одном OTP-приложении из нескольких в вашей системе, а остальные будут заниматься другими вещами.
Что касается Hello, world
. Ну, вот я ради интереса сейчас создал новую виртуалку на Ubuntu 18.04.
Можно пойти тремя путями:
- Поставить elixir из системных пакетов, но он там старый, как говно мамонта. Сам эликсир ставится одной командой в этом случае:
sudo apt install -y elixir
- Поставить elixir из внешнего репо:
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb rm -f erlang-solutions_1.0_all.deb sudo apt-get update sudo apt-get install -y esl-erlang sudo apt-get install -y elixir
- Рекомендуемый мной способ с помощью менеджера пакетов asdf, он дольше, поскольку erlang будет собираться из исходников, но как раз сам Erlang можно (и стоит) поставить из пакетов (см. п 2), а elixir и nodejs с помощью пакетного менеджера, причём можно использовать любые комбинации версий по желанию:
# зависимости для сборки Erlang
sudo apt-get install -y build-essential git wget libssl-dev libreadline-dev libncurses5-dev zlib1g-dev m4 curl wx-common libwxgtk3.0-dev autoconf
# пакетный менеджер asdf
cd
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.0
# подключение и автодополнение для bash
# для bash on mac, zsh или fish можно посмотреть варианты тут:
# https://asdf-vm.com/#/core-manage-asdf-vm
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
# злесь нужно перелогинится или просто выполнить:
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
# установка erlang
# довольно долгий процесс, так как сборка из исходников
# на Ubuntu из-за утечек памяти нужно много памяти, иначе падает на сборке wx
# asdf plugin-add erlang
# asdf install erlang 21.2.7
# asdf global erlang 21.2.7
# установка elixir
asdf plugin-add elixir
asdf install elixir 1.8.1
asdf global elixir 1.8.1
# установка nodejs
asdf plugin-add nodejs
# ключи для nodejs
bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
asdf install nodejs 11.11.0
asdf global nodejs 11.11.0
# для поддержки отслеживания изменений код и живой перезагрузки кода рекомендую поставить inotify-tools
sudo apt install -y inotify-tools
А теперь Hello, world!
# Ставим Phoenix Framework
mix local.hex
mix archive.install hex phx_new 1.4.1
# создаём или переходим куда-нибудь, где будет создан проект
mkdir src
cd src
# Создаём новый проект без поддержки баз данных, тут она нам не нужна
mix phx.new hello_world --no-ecto
# На вопрос Fetch and install dependencies? [Yn] отвечаем Y или жмём Enter
# Затем
cd hello_world
mix phx.server
# На вопрос Shall I install rebar3? (if running non-interactively, use "mix local.rebar --force") [Yn] нажмите Enter, этот вопрос будет задан только один раз
# После этого уже можно зайти браузером на http://localhost:4000/ и увидеть картинку ниже
# если нужно, чтобы с другой машины можно было зайти в режиме dev, то сначала: sed -i -e 's/url: \[host: "localhost"\]/url: [host: "0.0.0.0"]/g' config/config.exs
Теперь добавим контроллер, который будет обрабатывать запрос, шаблон и вьюху:
cat << 'EOF' > lib/hello_world_web/controllers/hello_controller.ex
defmodule HelloWorldWeb.HelloController do
use HelloWorldWeb, :controller
def index(conn, _params) do
render conn, "index.html"
end
end
EOF
mkdir lib/hello_world_web/templates/hello
cat << 'EOF' > lib/hello_world_web/templates/hello/index.html.eex
<div class="jumbotron">
<h2>Hello World, from Phoenix!</h2>
</div>
EOF
cat << 'EOF' > lib/hello_world_web/views/hello_view.ex
defmodule HelloWorldWeb.HelloView do
use HelloWorldWeb, :view
end
EOF
И последнее: нужно отредактировать файл с маршрутами lib/hello_world_web/router.ex
и добавить в него после строки get "/", PageController, :index
строку get "/hello", HelloController, :index
.
Теперь введите в браузере адрес http://localhost:4000/hello и сразу увидите результат без перезагрузки сервера:
Всяких туториалов в сети море, в том числе и свежих. Правда не понимаю, о каких протухших мануалах вы говорите? Вот, например.
Вообще масса крайне интересных материалов выходит по Elixir'у в последнее время, даже читать некогда, каждый день Medium присылает по 2-3 статьи в анонсах.
Насчёт красоты wxWidgets можно ещё добавить, что он подстраивается под нативный look-n-feel, поэтому скриншот одной и той же формы будет выглядеть по-разному в разных OS и DE. Например, на MacOS X такой вид:
Так что для кросс-платформенного GUI wxWidgets — практически идеальный вариант.
Дзен Эрланга [и Эликсира — прим. переводчика]