Сова пишет…
3.14K subscribers
345 photos
37 videos
5 files
417 links
Frontend Senior Fullstack Backend Lead и прочие слова.
Изучаю самые современные технологии.
Обучаю разработчиков как стать сильнее — https://frontend.vision.

По коллаборациям и сотрудничеству пишите в сообщения канала!
Download Telegram
За что я не люблю экосистему React.

Сборка проекта разваливается после установки react testing library, которая никаким образом типы роутера и реакта не обновляла.

Ещё и как чинить не понятно
¯\_(ツ)_/¯
Я сижу на BigSur с бета теста для разработчиков. Утекло очень много всяких багов и к релизе пофиксили почти все, что я нашел.

Но вот этот, лично у меня самый частый баг новой ОС
НАКОНЕЦ-ТО!
ГОСПОДИ!
Не прошло и трех лет
This media is not supported in your browser
VIEW IN TELEGRAM
У меня две претензии:
- Почему гугл решил не писать "Day 1" и "Day 2" в локальной таймзоне? Че это за прикол.

- Имя докладчика? Неее, зачем вообще такое надо.
Сейчас немного постримлю livecoding.
Буду подключать аутентификацию через accesso к cardbox.
https://youtu.be/ffRthDqp1sI
LiveCoding #2 уже на Youtube
Я покрываю тестами страницу login в Accesso, стараюсь объяснять что и зачем делаю, попутно решаю возникающие проблемы.

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

https://youtu.be/Ozg6mV8Grlw
Второй Talkstream!

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

https://youtu.be/iC_uJ2XYUdM
Сегодня отмечается католическое рождество. Этот праздник вызывает у меня сильнейший прилив ностальгии. В связи с этим мы подготовили рождественский выпуск подкаста, в котором я подвожу итоги 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
Уже совсем скоро наступит новый 2021 год!
Хочется написать много красивых слов, но я сомневаюсь, что это будет искренне.
Хочется пожелать, чтобы новый год стал проще. Не хочу через полгода вспоминать 2020 год добрым словом, потому что стало хуже!

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

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

param-case решает все проблемы: 1) регистронезависимые фс, 2) компонент или нет
На выходных провел несколько часов погрузившись в 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.
Я использую парную тему Bluloco для iTerm2 и VSCode.

Для VSCode тема есть в Extensions Marketplace. А Color presets для iTerm скину в комментарии
This media is not supported in your browser
VIEW IN TELEGRAM
Казалось бы, NPM

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

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

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

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

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

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

contract({ page, model })
Разница в типах весьма очевидна