Pull to refresh

Comments 16

UFO just landed and posted this here
Потому что они издалека увидели нечто напоминающее родной язык. Oh, wait! Это же не оно! Но к этому моменту ловушка уже захлопнулась.
Потому, что туда ломанулись RoR-гуру, тот же Хосе Валим.

Но почему они туда ломанулись?

Как рассказывал сам Валим:
Could you tell us more about it? How did this happen?

It is a long story, but I will try to make it short and sweet. Back in 2010, I was working on improving Rails performance when working with multi-core systems, as our machines and production systems are shipping with more and more cores. However, the whole experience was quite frustrating as Ruby does not provide the proper tool for solving concurrency problems. That’s when I started to look at other technologies and I eventually fell in love with the Erlang Virtual Machine.

I started using Erlang more and more and, with experience, I noticed that I was missing some constructs available in many other languages, including functional ones. That’s when I decided to create Elixir, as an attempt to bring different constructs and excellent tooling on top of the Erlang VM.
нет миграций и их нужно как-то отдельно запускать, например, из дев.окружения через проброс порта к БД (или через eDeliver, который сделает примерно то же самое).


Можно и без проброса портов и прочих хаков с помощью Distillery. И рантайм на сервер ставить не придется. habr.com/post/331598 – тут и про миграции и про webpack.

Про миграции интересно, спасибо. А про рантайм не нашёл. Можете подробнее рассказать? Я всегда мыслил, что при сборке пакета на ОС, отличной от продакшена, рантайм нужен либо cross compile, либо без рантайма и на прод его отдельно ставить… или я ошибаюсь?


А про Distillery… честно говоря, не пользуюсь им особо. Баш скрипт на 10 строк для деплоя и всё.

Ну, Distillery больше не про деплой как таковой, а про сборку релизов и пакетирование (если оно есть). Проблем с отличиями ОС особо нет, т.к. собирается все равно приложение на CI, на котором такой же Линукс, как и на проде (и других окружениях). CI постоянно гоняет сборки с тестами для всех веток, деплой тоже делается с помощью него (+ Ansible). Цепочка выглядит как собираем релиз (c ERTS) -> заворачиваем в rpm/deb пакет -> кладем в Artifactory, который подключен как репозиторий на энвах -> на энве ставим из пакета, миграции и прочие скрипты запускаются как пост-хуки системного пакетного менеджера (%post для RPM, например). Ну и интеграция с systemd соотв. Еще можно «запекать» сразу образы, AMI для Амазона того же. Не уверен, конечно, что такая машинерия всем нужна и подходит. У меня какое-то время крутилось свое маленькое приложение (для нужд семьи) на Фениксе — деплоил я его тоже с помощью баша, закидывая архив релиза, полученный с помощью Distillery, на сервак, распаковывая и передергивая systemd.
В эликсире нет колбэков.

Это не совсем верно. В эликсире есть колбэки, например, Enum.map/2. В эликсире нет блоков в том же смысле, в каком они есть в рубях. Зато есть макросы, через которые можно организовать похожее поведение при помощи quote/unquote.

Так как состояние не хранится в куче разных объектов, его приходится таскать за собой в одном объекте

И в этом есть определённый смысл, в отличие от всяких там JS, куда функциональщину тянут просто потому, что так модно. Elixir — это конруррентро-ориентированный язык, каждый вызов функции может отрабатывать не только в разных потоках или процессах, но даже на разных машинах. Для связывания всего этого существуют специальные инструменты, которые, собственно, и составляют основную мощь BEAM/OTP.

Он вообще другой, по сравнению с рельсой.

Самое интересное начинается тогда, когда пытаешься развернуть в кластере т.н. umbrella application. Это что-то вроде мета-проекта, который является обёрткой над кучей мелких сервисов.

В Elixir есть Pry и работает аналогично рубям.

А ещё есть классический дебаггер Erlang, который ко всему прочему показывает деревья процессов.

До максосов руки ещё не дошли, но уже предчувствую веселье. А вот про амбрелу ни разу ничего хорошего не слышал и даже связываться не охото. Можете что-нибудь более предметное из практики про неё рассказать?

Для веб-разработки это скорее всего не пригодится. Ну, и вообще, использование Elixir только для веба — стрельба из пушки по воробьям.

Пример: прокси-граббер. Одна часть собирает ссылки и ставит их в очередь на обработку парсеру списков, парсер ставит адреса в очередь чеккера, который уже перенаправляет проверенные прокси в базу. В дополнение сбоку присобачивается сетевой сканнер и брутфорсер. Это всё отдельные части одного проекта, которые, очевидно, есть смысл размещать на машинах разной конфигурации.

Про импорт модулей в iex. Добавьте в корень проекта файлик .iex.exs и в него что-то типа вот этого:


import Ecto.Query
alias Opm.Repo
alias Opm.Origin
alias Opm.FormField

Сильно облегчит жизнь в консоли :)

У такого файлика есть один маленький недостаток — попытка запустить iex вместо iex -S mix из корня проекта заканчивается CompileError'ом.


Если вдруг кого-то это так же раздражает как меня, и если такой файлик используется только в корне mix-проектов, то вот баш-скрипт который решает эту проблему небольшим костылем:


iex() {
  iex_executable=$(which iex)
  if [ -f .iex.exs ] && [ "$1" == "-S" ] && [ "$2" == "mix" ]
  then
    $iex_executable "$@"
  else
    $iex_executable --dot-iex "" "$@"
  fi
}
Спасибо за статью, отличное сравнение. Недавно сам перешел с Rails на Phoenix. Из классного, что вы не упомянули это Context. По дефолту в рельсе бизнес логика размазана по контроллерам и моделям(даже в скаффолде). Потом люди начинают думать головой и выносить все это в сервисы. В эликсире же с версии 1.3 ввели Context которые по факту просто модули с функциями внутри. Это позволяет сразу всю бизнес логику заворачивать в Context и в контроллере просто его вызывать. И самое приятно, что при генерации скаффолдов сразу генерируется правильная структура, а не бизнес логика в контроллере.

Справедливости ради, Context не спасает от бизнес-логики в контроллере, он её умеренно локализует. В крайнем варианте можно не проникнуться и начать использовать один контекст внутри другого. Вот тут веселье начинается… Но в общем случае да — отличная штука.


И тут же мне любопытно, кто у кого идею контекстов спёр? Фаулера не предлагать, с ним и так всё понятно. Просто в начале был MVC, потом на него начали накидывать разные сервисные классы, а потом начали появляться trailblazer'ы с аналогами контекста. Они до одной и той же идеи параллельно с эликсиром дошли или одни у других утащили? Или там есть кто-то третий, откуда все вдохновение черпают?

Sign up to leave a comment.

Articles

Change theme settings