Как стать автором
Обновить
0.8

Elixir/Phoenix *

Хаб про Elixir/Phoenix

Сначала показывать
Порог рейтинга
Уровень сложности

Выбор технологического стека для digital-продукта в 2024 году

Уровень сложности Средний
Время на прочтение 12 мин
Количество просмотров 2.3K

Стек технологий для запуска нового продукта в компании обычно выбирается исходя из того, с чем команда работала до этого и сколько наработок уже имеется.

Однако если вы свободны от необходимости использования какого-либо наследия (набираете новую команду или ищете актуальные технологии для изучения), то эта статья поможет вам выбрать, что стоит использовать для запуска продукта или сервиса. 

Меня зовут Евгений Корнеев и я постараюсь дать разностороннюю оценку с точки зрения зрелости технологии, популярности, доступности специалистов и вакансий, а также того, для каких целей лучше применять конкретный стек.

Читать далее
Всего голосов 12: ↑8 и ↓4 +4
Комментарии 1

Новости

От Ericsson к WhatsApp: история Erlang

Уровень сложности Простой
Время на прочтение 12 мин
Количество просмотров 8.6K

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

Сегодня эта технология играет ключевую роль в сервисах, используемых миллиардами людей по всему миру.

Речь идёт о языке программирования Erlang.
Читать дальше →
Всего голосов 53: ↑50 и ↓3 +47
Комментарии 15

Как и когда пора начинать коммитить в OSS

Уровень сложности Сложный
Время на прочтение 5 мин
Количество просмотров 1.8K

По долгу службы, мы много работаем с деньгами. Складываем, вычитаем, считаем проценты. Любому школьнику известно, что для этих расчетов не подходят обычные встроенные в язык типы: флоаты не сойдутся у финансовых аудиторов, большие целые принесут кучу проблем при конвертации (например, йены обходятся без дробных единиц, а в одном оманском риале — 1000 баиз, а не сто, как у всяких плебейских долларов и евро), и так далее. Существуют целые комитеты, определяющие стандарты (ISO 4217 — коды валют и ISO 24165 — идентификаторы цифровых токенов). Во всех более-менее современных языках есть библиотеки для работы с денежными суммами, реализующие стандарты и скрывающие от нас адовую арифметику без потерь точности.

В мире эликсира, почти всем, что связано с имплементацией комитетских стандартов, занимается Кип Коул. Удобной работе с деньгами мы обязаны тоже его библиотекам: ex_money — для собственно арифметики и money_sql для персистенса.

Читать далее
Всего голосов 6: ↑4 и ↓2 +2
Комментарии 9

berry-lang — новый язык для BEAM со статической типизацией

Уровень сложности Средний
Время на прочтение 4 мин
Количество просмотров 2.1K

На этих выходных я написал статью о том, что хочу сделать новый язык для BEAM со статической типизацией. И получил объёмный фидбэк - большая часть его содержалась, как обычно, между строк. Теперь хочу вам представить издание 2е, полностью переработанное.

Новый план состоит в том, чтобы использовать синтаксис Elixir как он есть (да!) Ну, разве что, типы в него добавить. Также, нужно сделать соответствие модулей и физических файлов 1:1.

UPDATE: berry будет поддерживать макросы, но только импортируемые. use поддерживаться не будет.

import Ecto, macros: [from]

Таким образом, фанатам Ecto беспокоиться не о чём. Вы хотите спросить, не хочу ли я поделиться этой идеей с более широким сообществом? Я уже сделал это! А вот, какая была реакция - об этом читайте под катом.

Читать
Всего голосов 5: ↑2 и ↓3 -1
Комментарии 14

Истории

Erlang больше не в моде. berry-lang — новый язык для BEAM со статической типизацией

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 2.7K

Привет! Сегодня хочу поделиться идеей нового языка для платформы BEAM: читатели хабра всё должны узнавать из первых рук! Планируется, что он будет транслироваться в эрланг source-to-source, и семантически будет тоже максимально совместим с эрлангом.

berry-lang поддерживает статическую типизацию, однако типы в нём - не главное. Главное - это приятный синтаксис, о чём свидетельствует его ягодное название. Кстати, о названии: помимо того, что оно созвучно слову Erlang, у него есть и другая подоплёка.

Дело в том, что berry-lang крадёт весь свой синтаксис у языка Сyber (слышали о таком?) Получается - кибер-тема. А чем заняты в кибер-городе? Выращиванием ягод, конечно! Скриншот - из последней Матрицы, на нём генерал Найоби угощает Нео клубникой и говорит, не без гордости - "Zion could have never made something like this!".

Статья содержит много коротких примеров с кодом! Будет интересна всем поклонникам языка эрланг и платформы BEAM. А если о языке Сyber ничего не слышали, то вообще - must-see.

Читать
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 10

POP-lang — воображаемый функциональный язык, основанный на Dependency injection

Время на прочтение 7 мин
Количество просмотров 1.5K

Вы когда‑нибудь замечали, что pattern matching и Dependency Injection чем‑то похожи? Я — да. Вообще, pattern matching, характерный для функциональных языков, матчит значения только по структуре и содержимому. Вызовы функций не разрешаются. Я подумал — что, если разрешить вызовы функций? В этом случае, мы получим нечто близкое к Dependency Injection.

MiddleAges(status, lifespan) = hipster

Вот так можно попробовать сматчить хипстера, отправив его в средневековье — чтобы узнать социальный статус, который он там займёт, а также его время жизни там. MiddleAges — это некоторая функция. Можно оставить слева только status или только lifespan, хотя, конечно, всем любопытно узнать и то, и другое. Похоже ведь на Dependency Injection?

В этой статье я попытался представить себе, как бы мог выглядеть функциональный язык, основанный на таких конструкциях. Спойлер: в нём есть оператор pop.

Читать
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 3

Сегодня я для себя открыл: язык программирования gleam

Время на прочтение 5 мин
Количество просмотров 5.5K

gleam - это новый язык со статической типизацией для платформы BEAM (Erlang). Уверен, что Вас он тоже заинтересует - в том случае, если Вы эрлангист, эрланговед или что-то в этом роде. Язык очень любопытный: например, в нём есть зарезервированное слово todo - для мотивации программистов. И, наоборот - отсутствует ключевое слово if.

В целом, gleam - пример того, как эрланг можно переделать для использования с типами. Мы с вами знаем, что есть функциональные языки, такие как Haskell и OCaml, которые работают с типами хорошо. Однако, языки ML-семейства выглядят совсем по-другому. gleam же имеет C-подобный синтаксис.

В этой статье я постарался описать основные черты языка gleam. Также, в конце читателя ждёт увлекательный мастер-класс о том, как (не) нужно превращать обычный императивный язык в функциональный. На примере Python.

И да, поросёнок - не совсем официальный mascot языка gleam. Но я позволил себе немного пофантазировать - надеюсь, попал в цветовую гамму плюс-минус :)

Читать
Всего голосов 18: ↑15 и ↓3 +12
Комментарии 17

3 попытки и 8 лет перехода с Ruby на Elixir

Время на прочтение 6 мин
Количество просмотров 2.9K

Привет, это очередной доклад Ruby Russia 2022. В нём наш разработчик Дмитрий Клейменов рассказывает, как он восемь лет пытался сменить Ruby на Elixir, благодаря чему ему все же это удалось, и жалеет ли он о переходе в другой стек.

Читать далее
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 3

Трудности перехода: каков Elixir на вкус после Ruby

Время на прочтение 14 мин
Количество просмотров 6.9K

Привет! Меня зовут Наталья. В Каруне я пишу в команде высоконагруженные сервисы на Elixir.

Это третья компания, в которой я работаю на Elixir. До этого я писала на Ruby. Если посмотреть свежее исследование Хабр Карьеры по зарплатам, можно увидеть — зарплаты рубистов растут, а Elixir там нет. Более того, есть истории о том, как люди возвращались с Elixir обратно на Ruby. Я считаю, что на это сильно влияет вход в язык. Elixir классный, но в первые месяцы знакомства с ним мне самой так не казалось. Настолько классный, что я не хочу назад. В этой статье я расскажу про трудности перевода перехода.

Читать далее
Всего голосов 21: ↑19 и ↓2 +17
Комментарии 4

Создаем облако на Elixir

Время на прочтение 9 мин
Количество просмотров 4.9K

Облачные сервисы уже давно стали неотъемлемой частью нашей жизни. На данный момент существует большое количество сервисов от разных компаний. Так давайте разберемся в принципах работы простейшего облачного сервиса, подтянем навыки проектирования систем. Данный проект можно постоянно развивать на протяжении длительного времени, и может стать отличным pet project. Созданное облако может пригодится для управления домашними файлами, достаточно его развернуть в локальной сети и с легкостью получать доступ к файлам с разных устройств.

Прыгайте под кат за подробностями.

*Прыг*
Всего голосов 6: ↑6 и ↓0 +6
Комментарии 0

Стреляем себе в ногу с помощью GenServer'а, или как мы фиксили неуловимый баг в Elixir проекте

Время на прочтение 4 мин
Количество просмотров 2.9K

Привет, Хабр! Меня зовут Иван, я — техлид в Каруне.

В команде мы активно используем Elixir в одном из самых нагруженных проектов.

Мы уделяем особое внимание тому, что за код выполняется в коллбеках GenServer'а, особенно если это код третьесторонних библиотек.

В этой статье я расскажу, почему это настолько важно, и продемонстрирую, как с помощью простейших механизмов, которые предоставляют нам Elixir и Erlang, мы можем сломать поведение GenServer'a и породить трудноуловимые баги. Ещё расскажу, как мы боролись с таким багом в реальной жизни.

Поехали!

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Комментарии 6

To spawn, or not to spawn?

Время на прочтение 16 мин
Количество просмотров 3.3K

Вот в чём вопрос! Что лучше - держать всё в одном процессе, или создавать отдельный процесс на каждый кусок состояния, которым нам нужно управлять? В этой статье я немного расскажу об использовании или неиспользовании процессов. Я также расскажу, как отделить сложную логику с отслеживанием состояния от таких проблем, как временное (темпоральное) поведение и межпроцессное взаимодействие.

Но перед тем, как начать, т. к. статья будет длинной, я хотел бы обозначить основные моменты:

Используйте функции и модули для разделения мыслительных сущностей.

Используйте процессы для разделения сущностей времени выполнения.

Не используйте процессы (даже агентов) для разделения сущностей мышления.

Конструкция "мыслительные сущности" здесь относится к идеям, которые есть в нашем разуме, таким как "заказ", "позиция в заказе", "продукт" и т. д. Если эти концепции слишком сложны, то стоит реализовать их в отдельных модулях и функциях для разделения различных сущностей и держать каждую часть нашего кода сфокусированной и целостной.

Использование для этого процессов (например агентов) - это ошибка, которую люди часто допускают. Такой подход существенно упускает функциональную составляющую Elixir и вместо этого пытается имитировать объекты процессами. Реализация, скорее всего, будет хуже, чем простой функциональный подход (или даже эквивалент на языке объектно-ориентированного программирования). Поэтому стоит обращаться к процессам, только когда есть ощутимые выгоды от этого. Организация кода не входит в число этих преимуществ, так что это не лучший повод для использования процессов.

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 0

5 альтернатив Node.js — и есть ли в этом смысл

Время на прочтение 7 мин
Количество просмотров 19K


Node.js — не безупречный продукт, у него есть недостатки (использование JS?), некоторые из них тянулись еще с раннего этапа разработки из-за ошибочных решений, принятых Райаном Далем, о которых немного вспомнили в статье Как создатель node.js сам разочаровался в нем. Как это часто бывает, в некоторых случаях альтернативу этой системе найти сложно или невозможно, особенно в секторе энтерпрайза. Но если не требуется поддержки большого легаси-кода, который еще много лет будут снабжать работой программистов, то можно взглянуть в сторону других решений. Про “убийцу Node.js” можно почитать в статье, указанной выше, о некоторых других будет рассказано в этой статье.
Читать дальше →
Всего голосов 51: ↑33 и ↓18 +15
Комментарии 29

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн

Отправляем SMS из Erlang/Elixir. Короткая инструкция

Время на прочтение 6 мин
Количество просмотров 5.5K


Photo by Science in HD


Если вам когда-либо приходилось решать задачу отправки SMS из кода вашего приложения, скорее всего, вы использовали готовое REST API поставщика дополнительных услуг. Но что происходит после того, как поставщик получит ваш запрос? Какие протоколы используются и какой путь проходит текст сообщения, прежде чем оказаться на экране мобильного терминала пользователя?


В этой статье вы найдёте:


  1. Немного теории и терминологии SMPP-протокола: SMSC, ESME, PDU, MO/MT SM.
  2. Краткий обзор существующих библиотек для работы с SMPP в Erlang/Elixir.
  3. Пример реализации асинхронного клиента при помощи библиотеки SMPPEX. Возможно, он будет полезен тем, кто ещё не использовал Elixir-библиотеки в Erlang-проектах.
  4. Информацию по обработке deliver_sm, MO SM.

Чего тут точно нет, так это информации по отправке коротких сообщений через SIGTRAN.

Читать дальше →
Всего голосов 11: ↑11 и ↓0 +11
Комментарии 3

Типы в рантайме: глубже в кроличью нору

Время на прочтение 4 мин
Количество просмотров 1.3K

Когда я начинал писать заметку «Типы, где их не ждали», мне казалось, что я осилил принести эрланговские типы в рантайм и теперь могу их использовать в клиентском коде на эликсире. Ха-ха, как же я был наивен.


Все, что предложено по ссылке, будет работать для явных определений типа по месту использования, наподобие use Foo, var: type(). К сожалению, такой подход обречен, если мы хотим определить типы где-нибудь в другом месте: рядом в коде при помощи атрибутов модуля, или, там, в конфиге. Например, для определения структуры мы можем захотеть написать что-то типа такого:


# @fields [foo: 42]
# defstruct @fields

@definition var: atom()
use Foo, @definition

Lighthouse in French Catalonia


Код выше не то, что не обработает тип так, как нам хочется — он не соберется вовсе, потому что @definition var: atom() выбросит исключение ** (CompileError) undefined function atom/0.

Но не все так плохо.
Всего голосов 8: ↑4 и ↓4 0
Комментарии 0

Типы, где их не ждали

Время на прочтение 5 мин
Количество просмотров 1.5K

Давайте представим себе реализацию модуля Scaffold, который генерирует структуру с предопределенными пользовательскими полями и инжектит ее в вызываемый модуль при помощи use Scaffold. При вызове use Scaffold, fields: foo: [custom_type()], ... — мы хотим реализовать правильный тип в Consumer модуле (common_field в примере ниже определен в Scaffold или еще где-нибудь извне).


@type t :: %Consumer{
  common_field: [atom()],
  foo: [custom_type()],
  ...
}

Было бы круто, если бы мы могли точно сгенерировать тип Consumer.t() для дальнейшего использования и создать соответствующую документацию для пользователей нашего нового модуля.


Lighthouse in French Catalonia

Генерация типа структуры без СМС
Всего голосов 15: ↑11 и ↓4 +7
Комментарии 0

«O tempora, o mores!»

Время на прочтение 3 мин
Количество просмотров 5K

Для протокола: заголовок я позаимствовал у Цицерона, в Oratio in Catilinam Prima in Senatu Habita.


Cicero Denounces Catiline, fresco by Cesare Maccari, 1882–1888




В реальной жизни мы часто имеем дело с временны́ми интервалами. Свиданки с зубным врачом, бронирование гостиничных номеров, даже ежедневный обеденный перерыв: планирование всего этого — задача подгонки временно́го интервала в ряд других временны́х интервалов.

Библиотека Tempus
Всего голосов 17: ↑12 и ↓5 +7
Комментарии 42

Перевозим волка, козу и капусту через реку без эффектов на Elixir

Время на прочтение 3 мин
Количество просмотров 3.8K

Становится уже доброй традицией — все любопытное, что появилось на Хаскеле — повторять на Эликсире.


Первой ласточкой были «Примерно 20 строк для подсчета слов», появившиеся как алаверды на «Побеждая C двадцатью строками Haskell: пишем свой wc» от 0xd34df00d — сегодня же я наткнулся на «Перевозим волка, козу и капусту через реку с эффектами на Haskell» от iokasimov и тоже не устоял.


Итак, встречайте: ленивый полный асинхронный параллельный перебор против алгебраических эффектов.

Читать дальше →
Всего голосов 20: ↑19 и ↓1 +18
Комментарии 0

Создаем конечный автомат в Elixir и Ecto

Время на прочтение 6 мин
Количество просмотров 2.6K
Существует много полезных шаблонов проектирования и концепция конечного автомата входит в число полезных шаблонов проектирования.

Конечный автомат отлично подходит в случаях, когда когда вы моделируете сложный бизнес-процесс, в котором происходит переход состояний из предопределенного набора состояний и каждое состояние должно обладать своим предопределенным поведением.

В этой публикации вы узнаете, как реализовать этот шаблон с помощью Elixir и Ecto.
Читать дальше →
Всего голосов 4: ↑3 и ↓1 +2
Комментарии 3

Vela → умный кеш для time series и не только

Время на прочтение 4 мин
Количество просмотров 1.6K

В финтехе нам часто приходится обрабатывать довольно массивные объемы данных курсов обмена валют. Мы получаем данные из разных источников, и каждый из них имеет собственное представление о том, как экстраполировать значения курсов на завтра, послезавтра, следующий месяц и даже следующие три года. Если бы кто-то умел предсказывать курсы правильно, впору было бы закрывать бизнес и просто тупо менять деньги туда-сюда. Некоторые источники пользуются бо́льшим доверием, некоторые поставляют сплошь мусор, с редкими вкраплениями почти правильных значений, но зато для экзотических пар. Наша работа заключается в том, чтобы просеять эти десятки тысяч значений в секунду и определить, что именно показать заказчикам. Нам нужно отфильтровать единственное правильное значение из тонны грязи и ила, как это делают фламинго на обеде.


Фламинго


Особым отличительным признаком фламинго является массивный выгнутый вниз клюв, с помощью которого они фильтруют пищу из воды или ила.
 — Вики

Так родилась библиотека Vela, которая хранит кеш состояния для нескольких значений в заданных временных интервалах. Под капотом она на лету отсеивает плохие и устаревшие данные, а также предоставляет доступ к последним N прошедшим валидацию значениям для каждого ключа (пары валют, в нашем случае).

Вот как это было сделано
Всего голосов 6: ↑4 и ↓2 +2
Комментарии 7

Вклад авторов