Size: a a a

Сова пишет…

2020 December 16
Сова пишет…
LiveCoding #2 уже на Youtube
Я покрываю тестами страницу login в Accesso, стараюсь объяснять что и зачем делаю, попутно решаю возникающие проблемы.

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

https://youtu.be/Ozg6mV8Grlw
YouTube
[LiveCoding] #2 — Тестирование React и Effector
В этом видео я покрываю тестами страницу логина и попутно разбираюсь с возникающими проблемами.

Содержание:
00:00 — Введение
01:03 — Разделение страницы и модели
06:52 — Начинаю писать тесты
11:45 — bus в index.ts
15:50 — Контракты модели и страницы
24:18 — Исправляю типизацию jest-dom в тестах
28:36 — Ползаю по типам testing-library
33:25 — store not found in forked scope
36:16 — Исправление effector-reflect
53:15 — Возвращаюсь к тестам страницы
1:02:15 — Селекторы в тестах
1:08:15 — Тестирую состояния страницы
1:23:20 — Исправляю Typescript в докере Accesso
1:26:18 — Думаю как запускать тесты в CI
1:28:10 — Тестирую события страницы
1:31:20 — Как очищать вотчеры после теста
1:34:25 — Проверяю сабмит формы
1:41:18 — Сабмичу форму по клику на кнопку
1:42:44 — Проверяю testing library без своего кода
1:44:46 — Not implemented HTMLFormElement.prototype.submit
1:47:42 — Пытаюсь сабмитнуть форму через Enter в input
1:49:49 — Почему не работает моя форма
2:01:30 — Вотчеры не работают после форка
2:03:56 — Не удается…
источник
2020 December 17
Сова пишет…
Сколько у вас лет трудового стажа?
Анонимный опрос
8%
Нет стажа
6%
До года
25%
До трех лет
26%
До пяти лет
14%
До семи лет
8%
До девяти лет
14%
Больше девяти лет
Проголосовало: 345
источник
2020 December 19
Сова пишет…
Второй Talkstream!

Обсудили Server-push, performance, загрузку данных на фронтенде и менеджеры состояний

https://youtu.be/iC_uJ2XYUdM
источник
2020 December 25
Сова пишет…
Сегодня отмечается католическое рождество. Этот праздник вызывает у меня сильнейший прилив ностальгии. В связи с этим мы подготовили рождественский выпуск подкаста, в котором я подвожу итоги 2020 года, вспоминаю все интересные события и новости.

Послушать можно на всех платформах:
- https://podcast.sova.dev
- https://go.sova.dev/podcast/soundcloud
- https://go.sova.dev/podcast/vk
- https://go.sova.dev/podcast/apple
- https://go.sova.dev/podcast/yandex

Мне очень важно узнать ваши ощущения от прошедшего года, какие эмоции мне удалось вызвать рассказывая о собственных впечатлениях? Пишите в чат или в личные сообщения.

Меня можно поддержать в ВК и на Patreon, а в благодарность почитать полный текст выпуска:
- patreon.com/sergeysova
- vk.com/sovadev
источник
2020 December 31
Сова пишет…
Уже совсем скоро наступит новый 2021 год!
Хочется написать много красивых слов, но я сомневаюсь, что это будет искренне.
Хочется пожелать, чтобы новый год стал проще. Не хочу через полгода вспоминать 2020 год добрым словом, потому что стало хуже!

Пожелайте близким людям здоровья!
источник
2021 January 11
Сова пишет…
Сколько ещё нужно аргументов, чтобы перестать называть файлы в разных регистрах?

(На системе с фс независимой от регистра этот код работает, с регистрозависимой фс код падает, приятного дебага)

param-case решает все проблемы: 1) регистронезависимые фс, 2) компонент или нет
источник
2021 January 12
Сова пишет…
На выходных провел несколько часов погрузившись в Rust.
В свободное время стараюсь изучать чужие open-source проекты, в этот раз я изучал lemmy — распределенный аналог Reddit.

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

Задача: у меня есть несколько больших сервисов в виде апишек разного уровня: public, internal, private, admin, у них у всех равный доступ к БД, но некоторые находятся в разных подсетях и хост базы отличается, а также сервисы имеют разные настройки http-сервера, плюс к этому, нужно легко настраивать каждый сервис для локальной разработки.

Раньше: использовался dotenv и длинный список env переменных, при старте приходилось установить весь список переменных, либо вынуждать разработчика клонировать .env.sample и править под себя.

Сейчас: я создаю базовый конфиг в директории config сразу для всех апишек, ещё один базовый конфиг для разных окружений и наконец по ещё одному конфигу для каждой апишки. Могу создать отдельный конфиг для апишки в определенном окружении.
Выглядит так:
config/default.toml — базовый конфиг для всех
config/default-development.toml — конфиг для всех апишек во время разработки
config/internal.toml — конфиг для внутренней апишки
config/public.toml — для публичной апишки
config/private-production.toml — для приватной апи в продакшене

Конфиги не перетирают друг друга, а мержатся с учетом структуры(не проверял на массивах). Крейт config поддерживает сразу несколько форматов(toml, hjson, json, ini, yaml), можно писать в удобном формате или даже в разных.

Помимо этого я могу определить локальные конфиги, которые в .gitignore и не попадут в репозиторий. Это удобно, когда нужно запустить сразу все апишки без докера на разных портах, или дать им разные параметры http-сервера, чтобы поймать ошибку. Получается вот такое:
.config.toml
.config-production.toml
.config-internal.toml
.config-internal-production.toml


При этом не обязательно создавать все конфиги из списка, достаточно иметь config/default.toml и любой конфиг из списка по необходимости.

Реализовать такое оказалось делом 10 строк. Поглядеть можно здесь. Большинство строк файла — определение структур для конфига, в методе Settings::new загружаются конфиги в определенном порядке.

И конечно же, можно любой параметр конфига переопределить через переменные окружения. Например, server.keep_alive устанавливается через переменную ACCESSO_SERVER__KEEP_ALIVE.

На Youtube есть канал по Rust, есть видео про Actix, который я использую для бекенда Accesso.
источник
Сова пишет…
Я кому-то скидывал файлы темы для iTerm2, напишите пожалуйста мне в ЛС.
источник
2021 January 13
Сова пишет…
sergeysova
Я кому-то скидывал файлы темы для iTerm2, напишите пожалуйста мне в ЛС.
Я использую парную тему Bluloco для iTerm2 и VSCode.

Для VSCode тема есть в Extensions Marketplace. А Color presets для iTerm скину в комментарии
источник
Сова пишет…
sergeysova
Я кому-то скидывал файлы темы для iTerm2, напишите пожалуйста мне в ЛС.
источник
2021 January 14
Сова пишет…
Казалось бы, NPM

Но прям кривущий интерфейс
источник
2021 January 16
Сова пишет…
sergeysova
Хотелось бы написать, что я на этом остановился, но нет.
Писать пачку forward в index.tsx оказалось несколько утомительно. К тому же, пришлось группировать forward по ивентам и сторам, чтобы случайно не перепутать порядок:
сторы — из модели в страницу
ивенты — из страницы в модель

Поэтому поковырявшись в Typescript я написал функцию bus(), типизировать которую оказалось задачей не из легких, решить которую мне помог @uid11, отдельное большое спасибо за это.

Фактически, функция делает forward за меня, сразу в несколько target. То есть позволяет просто и наглядно соединить пары ивентов и пары сторов.

Практиковать этот подход я начал на проекте Accesso, а pull request с изменениями можно посмотреть здесь — go.sova.dev/effector/split-page-and-model

Как писать тесты покажу позже, сразу с практическими примерами и практиками.
Продолжаю упрощать соединение модели и страницы.

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

Работает так: берем всё что есть в page, фильтруем сущности эффектора и назначаем им соответствия из model.

Я пока не уверен, что лучше:  брать page как основу контракта или model. На что это влияет?

Как видим на порядок применения prepend в событиях и map в сторах, а также на имена пропертей. В случае page как основы, назначаются сущности из model в имена из page.

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

contract({ page, model })
источник
Сова пишет…
Разница в типах весьма очевидна
источник
Сова пишет…
источник
Сова пишет…
Код функции bus выложу позже.
А пока наглядное сравнение исходников.

Если есть предложения или критика пишите в комментариях
источник
Сова пишет…
sergeysova
Код функции bus выложу позже.
А пока наглядное сравнение исходников.

Если есть предложения или критика пишите в комментариях
источник
2021 January 19
Сова пишет…
Attribute-Based Access Control

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

Почему не готовое решение? Большинство готовых решений монструозны и реализованы на XML.

Нам требуется простая, но в то же время мощная реализация на Kotlin и JavaScript. В идеале, чтобы можно было её визуализировать и собирать вручную.

На данный момент родился такой proof of concept. Если он пройдет battle testing, возможно выпустим в open source.
источник
2021 January 24
Сова пишет…
sergeysova
Код функции bus выложу позже.
А пока наглядное сравнение исходников.

Если есть предложения или критика пишите в комментариях
Типы для метода contract слегка усложнились.

Всё ради большей типобезопасности. В новом варианте появились настоящие гарантии реализации полного API страницы. В прошлой версии можно было передать любой объект без ошибок со стороны typescript.

Сейчас же корректно проверит все поля и не позволит передать больше чем нужно, при этом любые не effector сущности в API страницы будут проигнорированы.
источник
Сова пишет…
Типы для новой реализации
источник
Сова пишет…
Ошибка при неправильной реализации контракта
источник