Pull to refresh

Comments 9

Спасибо, помогло по-новому взглянуть на Elixir

Я рад, если оказалось полезно или хотя бы интересно.

Когда то начиная с Erlang я открыл для себя list comprehensions или по русски генерацию списков, что было удивительно для меня.
Немного юмора: в те далёкие времена некие товарищи делали вид что писали на эрланге опердени.
Писал на эрланге 10 лет назад. И это очень хороший язык в основе которого лежат очень правильные концепции, но он все никак не обретет популярность как и эликсир. То есть за эти 10 лет жаваскрипт сожрал мир, питон выбился в топ языков, джава крутится в каждой кредитке, даже консервативный С++ сильно изменился. В эти языки добавилось куча функциональщины — ленивые вычисления, lists comprehension итд итп. А современный тренд — все пихать в докер и колоть все на микросервисы, все это было в эрланге уже тогда из коробки с его автоматической балансировкой, модуль как процесс, упало — перзапусти, изоляция процессов, обмен сообщениями между процессами, итд. А в итоге — эрланг как был языком на котором пишут 1.5 человека так и остался. Наверное, все потому что он не язык общего назначения, у него беднейший тулкит, он требует особого мышления которое непривычно людям которые никогда не писали в функциональном стиле. Эликсир в этом плане недалеко ушел. С тех пор я видел десятки если не сотни статей о том какой эрланг крутой, а воз и ныне там. Никто не хочет связываться с этим зверем, потому что банально тяжело найти человека знающего этот язык, это очень большой риск для продукта. И непохоже, что ситуация изменится в ближайшем будущем.

А что не так с Эликсиром? Эрланг, допустим, требует определенных усилий для понимания. А вот "Эликсир недалеко ушел" — вы на основании чего мнение основываете? Ну, и "беднейших тулкит" — это о чём? Что такое "язык общего назначения" с вашей точки зрения, и почему Эрланг (и, тем более, эликсир) не соответствует этому определению?


Что же до интереса: как раз Эликсир активно развивается, всё больше крупных компаний ищет людей на эти вакансии. Из близких примеров: Wargaming это направление развивает и набирает людей.

На эликсир еще 2 года назад смотрел, даже поковырял немного, с тех пор как не было по нему статей на хабре так и нет, и это, как минимум, я считаю, показатель популярности. Язык общего назначения означает то что на языке можно писать от системных тулов и распределенных систем до пользовательских программ. Есть на элексире какие-то тулы с UI? Может быть на нем написаны какие-то части ос как сейчас на питоне/js? Сколько стабильных веб фреймворков имеется кроме phoenix? (Я честно не знаю может там что-то случилось). Кстати, когда я пробовал что-то изобразить на phoenix уткнулся в классическую проблему — как оказалось, чтобы банально запустить простейший хелло-ворлд сервер надо вложить кучу усилий и прошерстить кучу протухших мануалов которых аж целых 5 штук, в отличие от той же ноды, например, которую просто поставил одной командой и сел писать код. Это ли не показатель бедноты и незрелости тулкита? В современной разработке которая нацелена на какой-либо результат никто эти проблемы не будет решать без особой необходимости, люди просто пойдут и возьмут более стабильную технологию.

Насчет вакансий — зашел на мойкруг поискал по elixir, аж целых 9 вакансий, из них в половине elixir идет факультативом, это несерьезно. Для сравнения python — 177, js — больше 300, Java — почти 500.

Да, с графическими интерфейсами всё не очень хорошо, но они не особо и нужны в данном случае. Есть биндинги для wxWidgets, по-умолчанию Erlang собирается с их поддержкой, и даже внутренние утилиты мониторинга их поддерживают. Например, можно запустить iex (оболочку Elixir) и набрать :observer.start(), это выведет примерно следующее окно:


System observer

Observer screen


Это, конечно, очень бедная визуально штука, и не очень красивая. Можно сделать свои биндинги и использовать любой 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-сервер
  • Pinterest
  • Lonely Planet

Я уже не говорю о куче телекомов, которые используют Erlang, а теперь и Elixir для внутренних систем.


Кстати, просто в качестве ремарки о возможностях: году в 2017 проводили тест Phoenix Channels (это такое средство для постоянного соединения с backend'ом на phoenix из любых клиентов, например, от веб-сервиса; скажем, я их активно использую в качестве транспорта для того, чтобы пушить события со стороны сервера, а не заствлять клиента долбиться периодически на сервер в поисках чего-нибудь новенького; реализуется поверх websockets). Так вот, один (!) сервер смог выдержать 2 миллиона соединений. Пришлось использовать три или четыре мощных сервера, чтобы на них сэмулировать клиентскую нагрузку. А на backend с этим справился только один сервер.


О фреймворках: вы много знаете фреймворков для Ruby, кроме Rails? Ведь они есть. Так же и для Elixir. Но при этом эликсир совершенно не обязательно использовать с Phoenix, последний — это web-фреймворк. Если у вас не веб-приложение, то он не нужен. Кроме того, если вы будете следовать нормальным практикам, то воспользуетесь им только в одном OTP-приложении из нескольких в вашей системе, а остальные будут заниматься другими вещами.


Что касается Hello, world. Ну, вот я ради интереса сейчас создал новую виртуалку на Ubuntu 18.04.


Можно пойти тремя путями:


  1. Поставить elixir из системных пакетов, но он там старый, как говно мамонта. Сам эликсир ставится одной командой в этом случае: sudo apt install -y elixir
  2. Поставить 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
  3. Рекомендуемый мной способ с помощью менеджера пакетов 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

Phoenix Fresh start

Phoenix Fresh Start Page


Теперь добавим контроллер, который будет обрабатывать запрос, шаблон и вьюху:


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 и сразу увидите результат без перезагрузки сервера:


Phoenix Hello, World

Phoenix Hello, World


Всяких туториалов в сети море, в том числе и свежих. Правда не понимаю, о каких протухших мануалах вы говорите? Вот, например.


Вообще масса крайне интересных материалов выходит по Elixir'у в последнее время, даже читать некогда, каждый день Medium присылает по 2-3 статьи в анонсах.

Большое спасибо!

Насчёт красоты wxWidgets можно ещё добавить, что он подстраивается под нативный look-n-feel, поэтому скриншот одной и той же формы будет выглядеть по-разному в разных OS и DE. Например, на MacOS X такой вид:



Так что для кросс-платформенного GUI wxWidgets — практически идеальный вариант.

Sign up to leave a comment.

Articles