artalog
4.23K subscribers
542 photos
40 videos
40 files
913 links
Развернутые ответы на вопросы в чатах, мысли от рабочих процессов.
Вопросы - @artalar.
Download Telegram
Монотонный.

Есть у меня микромечта - монотонный дизайн кит для интерфейсов. Подчеркну, не монохромный (с градациями насыщенности / яркости / прозрачности), а монотонный, где есть только цвет фона и инверсивный цвет контуров.
На 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
Пришла таска: падает тест на CI, после апдейта пупетира (5 -> 13).

Падает по таймауту.

Локально проблема не воспроизводится.

Понатыкал консоль.логов и отправил на CI. Тест на 20 строк, но оказалось что падает уже на goto(…).

Какой-то интуицией меняю waitUntil: ['networkidle0'] на waitForNetworkIdle(). Тест проходит.

И вот сижу и думаю. Что это, как это, почему это, куда нужно было копать (поиск по доке networkidle0 ничего не находит), создавать ли issue (их и так хватает).
Но главный вопрос. Радоваться, что проблема быстро решилась, или грустить от непонимания как.
🤔7👍5
🛑 в этом посте есть ошибки 🛑

Идемпотентность.

TLDR: не мутируйте в useEffect!

1. Реакт позволяет с помощью useEffect описать какой-то эффект в ответ на изменение данных.
2. В рамках конкурентного рендеринга эффекты могут перевызываться лишний раз, под StrictMod в дев режиме они намеренно перевызываются дважды.
3. В доке по юзЭффекту не верно указано что это апи для мутаций, см. пункт 2.

Хорошо (получение списка элементов по фильтрам):

useEffect(
() => api.getList({ filters }),
[filters]
)

Плохо (изменение состояния лайка на посте):

useEffect(
() => api.toggleLike(props.id),
[isLiked]
)

Плохо (трансформация события в состояние):

useEffect(
() => isSubmited && api.buyProducts(shopList),
[isSubmited]
)


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

Исключением может быть, например, синхронизация распределенных данных, но это уже отдельная история.

#reactive
👍15👎2
artalog
🛑 в этом посте есть ошибки 🛑 Идемпотентность. TLDR: не мутируйте в useEffect! 1. Реакт позволяет с помощью useEffect описать какой-то эффект в ответ на изменение данных. 2. В рамках конкурентного рендеринга эффекты могут перевызываться лишний раз, под StrictMod…
Строго говоря, REST или другие конвенции не могут гарантировать идемпотентность по статусу, потому что даже простой запрос товаров по фильтрам может, например, менять категорию пользователя в рекомендательной системе. Которая может сильно ломать персонализацию пользователей и всю систему их ранжирования, при избыточных запросах данных.

Поэтому, useEffect и подобные апи всегда стоит использовать с осторожностью.

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

- Стажёр Вася и его истории об идемпотентности API.
👍6
Много интересного и необычного по TypeScript можно подчерпнуть из @why_typescript_is_bad

Если у вас тоже есть находки фрикового поведения ТС пишите в @why_typescript_is_bad_chat, репостним в канал.
🤔2👍1
#reatom

Вот вам красивая (ну я надеюсь) картинка с новой архитектурой реатома. Что поменялось:

- из компьютедов (и экшенов) можно планировать новые апдейты, которые будут выполнены до(!) эффектов.
- log выделился в отдельную очередь, из него нельзя делать апдейты.

Вроде, мелочи? Или, зачем так сложно? Дело в том, что эта последовательность действий выражает самое ожидаемое поведение от реактивной системы, а точнее то, как должен работать автобатчинг и как разделять вычисления и сайд эффекты так что бы их можно было понятно дебажить.

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

Было очень больно и сложно (эдж-кейсы перфа, типизации, лимитов бандла), но я знаю, что итоговый результат будет помогать делать продукты быстрее и лучше, и стоит того.
👍71
Когда-то давно я увлекался выживанием в дикой природе. Поделюсь воспоминаниями о том как запастись провиантом и растянуть его на подольше. Надеюсь, никому не понадобится, а иначе поможет.

Человек несколько недель может жить без еды. Если есть макароны - уже хорошо, но лучше крупа. Не забывайте хранить их в сухости. Есть достаточно 1 - 2 раза в сутки, но не много. Если еда в избытке, питайтесь чуть чаще, но не наедайтесь, а лучше отдайте ее соседу.

Лучшая консервация - сушка. Рецептов и способов много. Самый тупой способ - нарезать очень тонкими ломтиками и сушить на сквозняке (подвесив) закрыв тканью от гнуса. Я бы начал с красного мяса. Потом в суп добавлять - не вкусно, но полезно. Курицу без термообработки не употреблять.

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

Финики, курага и изюм ваши лучшие друзья. Можно в кашу, можно так, тогда курагу лучше предварительно замочить на час.

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

Вода (питьевая) - самое главное что должно у вас быть. Наперед. Компоты / газировки / алкоголь и тп могут сделать только хуже. Лучше всего простая вода. Не дестилированная, но кипяченая. За раз выпивать не больше 100-150мл, за день не меньше 500мл. Без физических нагрузок можно попытаться уложиться в литр в день.
Снег обязательно кипятить. Проточную воду с улицы фильтровать через много мха и угля, тоже кипятить.
Если кипятить невозможно: марганцовка / йод / перекись.

Самый минимум аптечки: активированный уголь, йод, бинт и вата. Бф-клей, парацетамол, супрастин.

Годный контент по теме есть у Gleb Skorobogatov: ютуб, инста,
👍12🤔4😁1
Да я не могу ничего вразумительного написать по поводу военных действий в Украине. Сколько не пытался.
Надеюсь, что это скоро закончится и мирные жители перестанут страдать. Держитесь! Я молюсь о мире.

Дальше только тех. контент.
👍22👎2🤔2