Pull to refresh
26
0
Dmitry Rubinstein @Virviil

Software Developer

Анонс онлайн митапа русскоязычного Elixir community

Reading time 2 min
Views 1.2K
Functional Programming *Conferences Elixir/Phoenix *

Мы очень рады и счастливы анонсировать уже второй онлайн митап по Elixir. Митап пройдет уже в эту пятницу, 10 июля, в 19:00 по московскому времени. Цель — как и в прошлый раз: обьединить все международное (но русскоязычное) сообщество программистов на Elixir/Erlang/OTP на одном мероприятии, послушать про тренды и конечно же нетворкинг не оставить в стороне.

Быстрее покажите подробности!
Total votes 7: ↑7 and ↓0 +7
Comments 0

Функциональный Rust: Готовим говядину

Reading time 6 min
Views 8.9K
Abnormal programming *ООP *Functional Programming *Rust *
Tutorial

image


Попался мне на глаза Brainfuck-оподобный язык Cow. И решил я написать для него интерпретатор на новомодном Rust. А так как Rust — мультипарадигменный язык, то стиль написания программы будет функциональный. Чтобы узнать что получилось — прошу под кат.

Читать дальше →
Total votes 22: ↑21 and ↓1 +20
Comments 30

Elixir: делаем код расширяемым с помощью Behaviour

Reading time 9 min
Views 5.4K
Erlang/OTP *Functional Programming *Elixir/Phoenix *
Tutorial
Translation

Итак, определим диспозицию… Вы написали кусочек кода, который вы хотите использовать с большим количеством разных "вещей" — звучит не очень научно, но всё же. Эти разные вещи объединяет какое-то общее свойство, через которое они достигают одинакового результата на высоком уровне абстракции; только вот пути достижения результата могут быть совершенно разными.


Часто ваш код должен использовать только одну такую вещь за раз, но вы же не хотите делать ваш код настолько узким? Это просто отвратительно. Разве не замечательно, когда другие люди смогут создать новые "вещи" и расширить ваш код, в то время как вы даже не кассаетесь клавиатуры?


Но разве я не могу выбрать конкретную реализацию и использовать её? Мне больше ничего и не надо....

Вы конечно можете. Но что случится, если вы поменяете своё мнение о "вещи", которую вы используете. Вдруг ваша конфетка без обёртки окажется не тем, чем кажется? А вдруг ещё хуже — вашу дивную "штучку" перестанут поддерживать? В этаких ужасных условиях было бы круто, если бы вы могли быстро поменять одно на другое, не меняя при этом вообще всё что мы написали. Прально?

Прально!
Total votes 24: ↑22 and ↓2 +20
Comments 5

Elixir: Готовим парсинг правильно — yecc и leex

Reading time 9 min
Views 11K
Erlang/OTP *Functional Programming *Elixir/Phoenix *
Tutorial
Translation

Лексический анализ (токенизация) и парсинг — одни из наиболее важных концепцпий в информатике и программировании. Эти концепции базируются на огромном количестве теоретических знаний, но сегодня мы о них не будем говорить, потому что их действительно много. Кроме того, подход к парсингу через "науку" может вызвать жёсткое отвращение и напугать. Между тем, практическое применение очень простое и прямолинейное. Если хотите знать больше о теории — идите в Википедию (лексический анализ и парсинг), или читайте восхитительную книгу дракона (рекомендовано к прочтению вообще всем программистам).


Обычный человек боится использовать лексеры и парсеры, а вместо них пишет велосипед на регулярных выражения. Мне кажется, что кажущаяся сложность является этому причиной. В этом посте я пострараюсь развенчать её!

Читать дальше →
Total votes 20: ↑20 and ↓0 +20
Comments 21

Elixir: Развёртывание приложений с помощью Edeliver

Reading time 4 min
Views 4.8K
Erlang/OTP *Functional Programming *
Tutorial
Translation

Мы уже обсуждали сборку и развёртывание приложений Elixir(перев: с помощью exrm): как осуществлять миграции поверх релиза или как работать с переменными среды. Пришло время открыть для себя ещё один инструмент, который поможет развёртывать Elixir приложения.


Практика развёртывания Elixir приложений и дальнейшее отслеживание их работы на нодах с помощью Exrm позволяет нам чувствовать себя гораздо увереннее в вопросах управления релизами в production. Однако возникает следующий вопрос: как управлять самим процессом развёртывания? Конечно, мы можем воспользоваться Capistrano, особенно если в мир Elixir мы пришли из Rails. Но посмотрим на цитату из Edeliver README:


edeliver основан на доставке и предоставляет bash-скрипт для сборки и развёртывания Elixir и Erlang приложений, а так же позволяет совершать "горячее" обновление кода.

Пытаться организовать весь процесс развёртывания вручную — это жёсткая головная боль с кучей повторяющегося кода. А вот использование Edeliver для развёртывания оказалось очень простым с первой же попытки! В конце концов, весь процесс развёртывания уместился в один меленький bash-скрипт:


#!/bin/bash -ex

BRANCH=${1:-master};

mix edeliver build release --branch=BRANCH --verbose
mix edeliver deploy release to production --verbose
mix edeliver start production --verbose
mix edeliver migrate production up --verbose

Скорее всего Вам придётся подкрутить этот скрипт под собственные нужды. Мы используем его только для развёртывания в production, но Вы так же можете использовать его и для staging развёртываний. Описание того, как всё это работает — под катом.

Читать дальше →
Total votes 20: ↑20 and ↓0 +20
Comments 26

Elixir: Регистрируем процессы — практическое руководство

Reading time 12 min
Views 7.9K
Erlang/OTP *Functional Programming *
Tutorial
Translation

Процессы в Elixir (ну и в Erlang конечно же) идентифицируются с помощью уникального идентификатора процессаpid.
Мы используем их, чтобы взаимодействовать с процессами. Сообщения посылаются как бы в pid, а виртуальная машина сама заботится о доставке этих сообщений в правильный процесс.
Иногда, впрочем, чрезмерное доверие к pid может приводить к значительным проблемам.
К примеру, мы можем хранить pid уже мёртвого процесса, или мы можем использовать Supervisor, который абстрагирует создание процессов от нас, поэтому мы даже не знаем, какой у них pid (пер: а ещё Supervisor можете перезапустить упавший процесс с другим pid, и мы об этом не узнаем никак).
Давайте создадим простое приложение и посмотрим: с какими проблемами мы можем столкнуться и как мы эти проблемы будем решать.

Читать дальше →
Total votes 17: ↑17 and ↓0 +17
Comments 13

Elixir: начинаем работу с Plug

Reading time 5 min
Views 8.8K
Erlang/OTP *Functional Programming *Elixir/Phoenix *
Tutorial
Translation

В мире Elixir, Plug представляет собой спецификацию, позволяющую различным фреймворкам общаться с различными web-серверами, работающими в Erlang VM.
Если вы знакомы с Ruby, то можете провести аналогию с Rack: Plug пытается решать те же проблемы, но только другим способом. Понимание основ работы Plug позволит лучше разобраться как с работой Phoenix, так и других web-фреймворков, созданных на языке Elixir.



Читать дальше →
Total votes 29: ↑29 and ↓0 +29
Comments 10

Traits из коробки

Reading time 7 min
Views 7.6K
Rust *
Sandbox
В стандартной библиотеке языка Rust есть несколько трейтов, которые можно объявить "на халяву" с помощью derive. Эти трейты обязательно пригодятся при объявлении собственных структур, они очень часто встречаются в различных open-source библиотеках, но их реализация генерируется компилятором и может вызывать вопросы.
Часто видите:

#[derive(RustcEncodable, RustcDecodable, Clone, Eq, Default)]
struct Foo {
}

и не понимаете, что это и где?
Тогда вам под кат!
Total votes 24: ↑24 and ↓0 +24
Comments 3

Information

Rating
3,957-th
Location
Тель-Авив, Тель-Авив, Израиль
Date of birth
Registered
Activity

Specialization

Backend Developer
Lead
From 900,000 ₽