artalog
4.23K subscribers
542 photos
40 videos
40 files
913 links
Развернутые ответы на вопросы в чатах, мысли от рабочих процессов.
Вопросы - @artalar.
Download Telegram
Live stream finished (53 minutes)
Контроль доступа к рантайм данным.

При работе с данными реактивно нам нужно как-то описывать связи, на которые и осуществляется подписка. Для этого могут использоваться разные паттерны.

Selector.
Селектор - самый примитивный паттерн доступа к данным, он описывает функцию чтения данных (get / getter), которая принимает на вход какой-то объект и возвращает какую-то его часть (свойство).

const selectSome = (data) => data.some.property

Его преимущество в простоте и сильных возможностях композиции.

Lense.
Линза - это селектор, как геттер, и функция сеттер - установки значения по тому же, что и у селектора, свойству. Иногда, эффективнее отслеживать не изменение результата селектора (который может содержать вычислительную нагрузку), а сам факт изменения каких-то данных (отслеживание сеттера).


const lensSome = {
get: (data) => data.some.property,
set: (data, value) => data.some.property = value
}


Cursor.
Курсор - это более строгий паттерн, который предполагает точное указание необходимого для обработки свойтва. Это позволяет легко отслеживать входящие, исходящие и производные значению. Иногда, использование подобного подхода может показаться более вербозным, но он не накладывает ограничения как мы хотим работать с данными, а помогает лишь описать с какими данными мы хотим работать. Это может быть полезно для систем с условным использованием иммутабельных структур. Например, какие-то часто меняющиейся данные менеджер данных может мутировать, где-то использовать иммутабельные данные, где-то добавлять какие-то проверки на структуру входящих изменений, при этом приклодной API доступа к данным будет неизменным. Для удобства работы с курсорами над глубоковложенными данными можно создавать пути (path).

const data = { some: { test: 42 } }
const testPath = ['some', 'test']
const testCursor = new Cursor(data, testPath)


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

const test$ = data$.some.test
const test = test$.get()


Интересно, что ImmutableJS предполагает работу с данными через курсоры и было бы достаточно просто сделать их реактивными. Как это пытается сделать \~/ kefir.atom.

#state_management
👍12
artalog
Voice message
^ Повспоминал свой опыт администрирования десять лет назад. Совсем в общем.
Думаю что делать с этой информацией, хочется поделиться же :) Попробую в следующий раз рассказать более детально про что-то конкретное: серверные комнаты и их устройство, организация мониторинга высоконагруженной критической (дорогой по даунтайму) системы, обслуживание распределенных сетей на системном и административном уровнях и тп.
👍9
Истинность пустоты.

А вы тоже не можете запомнить что some и every возвращают для пустого массива?
Интересно, что результаты разные и основаны они на математической логике (источников на русском мне найти не удалось).

Там приводится забавный пример. Утверждение, “каждый ребенок бездетного человека овца” верно, потому что мы не можем его проверить и опревергнуть. А вот, “какой-то ребенок бездетного человека овца” не верно, потому что “какой-то” предполагает успешную проверку элемента, которго нет.

Я для себя придумал запоминать так: количество символов в “false” для “some” и “true” для “every” разное (4 != 5).

У оригинального твита можно найти интересные ответы и цитирования.
🤔16👍5
Live stream started
Live stream finished (17 minutes)
Черновик постов про лидеров мнений, большие и маленькие компании, тишейп.
2022-02-07
artalog
👍4
Монотонный.

Есть у меня микромечта - монотонный дизайн кит для интерфейсов. Подчеркну, не монохромный (с градациями насыщенности / яркости / прозрачности), а монотонный, где есть только цвет фона и инверсивный цвет контуров.
На every-layout.dev можно посмотреть как это выглядит в качественном исполнении.

Интерфейс с таким подходом разговаривает с вами не цветом, а формой и это доступней и понятней. При этом, в нем пользователь может выбрать любой понравившийся цвет. А еще это просто, и простые и эффективные решения мне кажуться элегантными, красивыми и вдохновляющими.

Но меньше слов, давайте к делу. Есть у меня некоторые наброски в excalidraw, которые нужно: 1) реализовать в css; 0) подправить профессиональным дизайнером и перенести в фигму; 2) дополнить еще какими-то компонентами.

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

#design #mono
👍14
Transient Data Structures

Я, как ярый фанат иммутабельности, прошу вас - мутируйте! Хуже не знания хороших практик только их избыточное применение.

Часто, можно встретить код редьюса в котором каждая итерация возвращает иммутабельный результат, вроде:
.reduce((acc, el) => ({ ...acc, [el.id]: el }), {})

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

Обычно, мутировать боятся, потому что не понимают когда это можно делать безопасно. Ответ - если соблюдается ссылочная прозрачность. Проще говоря, когда мутируемое значение не передается по ссылке куда-то, где эту мутацию можно обнаружить.
Изначальный пример можно переписать так:

.reduce((acc, el) => {
acc[el.id] = el;
return acc;
}, {})

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

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

#immutable #perf
👍39🤔6🔥21👎1
За гранью Intel и Linux – необычные процессоры и операционные системы – Дмитрий Завалишин

В продолжении темы иммутабельности хочется посоветовать этот наикрутейший доклад. Как же это связано, спросите вы? 🙂

Пофанатазируйте.

Во второй части доклада автор рассказывает про разрабатываемую им операционную систему Phantom, которая построенна вокруг идей иммутабельности и persistent memory.

Одно из преимуществ такого подхода заключается в безопасном распараллеливании работы с данными, что позволяет собирать мусор исключая проблему stop the world. Это то что меня впечатлило, но там еще много интересного, посмотрите доклад, он почти без слайдов, можно слушать фоном.

@Akiyamka ещё подсказал список статей по теме.

#immutable
👍7
Го войс через 10 мин
Live stream started
Live stream finished (48 minutes)
2022-02-11
artalog
👍6🤔4
clip-path.

Фича не то что бы часто нужная, но вот работая над #mono я прочувствовал на сколько она простая и мощная, в случае когда нужно решить задачу только с помощью css и не хочется / не можется лезть в html. Тогда можно обойтись одним псевдо элементом с заливкой.

А что бы быстро разобраться в этой фиче, можно воспользоваться bennettfeely.com/clippy. Особенно интересны примеры: Frame и Custom Polygon.

Стрелочки кнопок из скрина в предыдущем посте сделаны с помощью полигона.
👍13