Записи с темой: кодерастия (56)
22:10

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

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

@темы: плач Ярославны, кодерастия

15:52

Ваша Всратость
Кстати, кажется, я придумал, как назвать ведущую головную боль энтерпрайз-разработки - toolbox-hell. Следующий этап config hell, когда основные усилия разработчика направлены на то, чтобы подружить 100500 задействованных инструментов для развертывания, тестирования, линтеров вместе со всеми их зависимостями и совместимостями.

А то я тут смотрю на Cypress, вижу в списке зависимостей jQuery(в конце 2025 года), и вот-это-вот-все как-то само в моск заходит


@темы: кодерастия

23:36

Ваша Всратость
Опытным путем выяснилось, что в Jest для корректной работы мока fetch через подмену global.fetch нужно производить подмену непосредственно в блоке it, а не expect.

@темы: кодерастия

Ваша Всратость
Сдал финишную версию проекта для курсов. Теперь можно подвести итоги


  1. Это не сколько React, сколько разработка enterprise-grade интерфейсов. Разбивка на компоненты, построение модели данных, работа со справочниками, словарями и все такое

  2. Теоретические задачи - это семечки. Они простые. Иногда кажутся сложными из-за некорректно сформулированных подсказок или впадающего в жесткий затуп "ИИ-консультанта"

  3. Практическое задание. Большой массив, который из-за специфики подачи материала необходимо трижды рефакторить. Сначала с переходом от локальных стейтов к Redux, потом с переносом компонентов на ТайпСкрипт, потом с переносом логики хуков и стора на тот же Тайпскрипт

  4. И поскольку курс охватывает все аспекты React, то проскочить этапы рефактора и сделать все с самого начала в чистовом ключе не получится. Программа требует вникания на практике и в работу со стором, и с локальным стейтом, и с хуками useState

  5. Да, это полезно и круто, но на ближайшую пару-тройку месяцев я пас. Сдам-ка я головной моск в аренду маленьким роботам из зубной пасты



Вот он, ЙАААЗь. Все это написано ручками (ну кроме пекейдж-джысонов, бггг)

@темы: кодерастия

00:56

Ваша Всратость
Я тут долго думал™ и наконец понял, какая метафора лучше всего подходит для применения ИИшницы - это не кнопка "сделать ЗБС", это резиновая уточка с непредсказуемой обратной связью.

Хотя бы потому, что объем рабочего контекста ограничен, а решения часто обусловлены не best practices из прилизанного обучающего сета, а совершенно рандомной хотелкой заказчика, связанной с замысловатой бизнес-логикой приложения. В которую дядя Робот, само собой, не посвящен.

Кстати, отсюда еще одна мысль. Используемый при написании прилаги фреймворк, будто то Вью, Реакт или (не к ночи будь упомянут) Ангуляр - это не самоцель, это просто способы некоторого ускорения при создании настоящего фреймворка, описывающего объекты доменной области как готовое к употреблению лего. Контролы, менеджеры запросов и очередей подгрузки, еще более всратые сущности (у нас есть специальный селектор для хранения и актуализации сведений о судимости водителей, например)

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

@темы: горбота, кодерастия

13:36

Ваша Всратость
Курсы. Главы по роутингу и TS прошли одновременно (потому что перед завершением главы роутинга я отвел от нее ветку следующей главы, не дожидаясь вливания в мастер). Впереди глава по webSocket и финишная прямая сдачи. Главное - защитив итоговую главу, не впасть в соблазн и не записаться сразу же на следующие курсы (по "крестам", ноде или "ржавчине", например)

Надеюсь, что я не ошибаюсь, и знание одного реактивного фреймворка (не считая React, которым я баловался 7-мь лет назад, после чего до июня этого года не прикасался) - это 30-40% знания всех подобных реактивных фрейморков. Которых сейчас, к счастью, поубавилось по сравнению с серединой 10-ых.

@темы: бытовуха, кодерастия

01:58

Ваша Всратость
Завершаю домашку по второму этапу курсов, перебиваю локальные стейты с пробросом через пропсы на redux (точнее - redux-toolkit, потому что "родной" редукс очень многословен)
В процессе понял, что на первом этапе меня вымораживал даже не сам реакт, а, скорее, та система хранения данных с локальными стейтами, прокидкой методов(методов, Карл!) через пропсы и отсутствием внятной точки отсчета.

И что в моем понимании основа веб-приложения - это его структура данных. Flux с заданным стейтом и набором экшнов, остальное - просто отражение изначальной структуры на интерфейс. Иногда - простой вывод текста, иногда - нечто хитрое и динамическое. Но вторичное по отношению к тем данным, которые обитают в стейте

@темы: кодерастия

15:49

Ваша Всратость
Еще раз понял, чем меня React напрягает.

Тем, что для подключения глобального стейта нужно отдельно прописать имена вызываемых событий, отдельно замапить к кажому событию обработчик, потом из этого безобразия отдельно собрать инстанса стора, затем не забыть обернуть нужный кусок приложения в Provider, а затем в каждом отдельном компоненте сделать mapStateToProps/mapDispatchToProps. А потом - обернуть полученный компонент в отдельный connect.

Тогда как в Pinia можно в одном файле описать стейт, как методы стейта - события, а потом через экспорт функции запуска хранилища use<Имя сущности, описанной в сторе>Store или обращаться к нужным полям и экшнам напрямую, или обернуть в storeToRefs. И будет всем щастье.

@музыка: Вещие Ослы - Игра на выживание

@темы: кодерастия

00:23

Ваша Всратость
Насчет курсов - не сожалею.

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

Да, есть странные позиции вроде использования CRA там, где нужен Vite, но вероятно, что авторы учебных материалов перенесли на него свой опыт ежедневной борьбы с легаси. Это анахронизм, но он есть в существующем коде, и мы привыкли к нему. Позиция досадная, но вполне объяснимая.

А теперь - дождаться итоговых резалтов проверки.

Также - немного субъективного. Разделение отображения, структуры и поведения, говорили они. А потом - jsx, где можно в заголовке импортнуть стили (причем в лучшем духе css-in-js в виде объекта, заботливо свернутого Babel из исходного *.module.js), вернуть немного html-разметки в теле функции и продолжить нарушать все ранее озвученные принципы разделения. В этом ключе Реакт с одной стороны куда более гибкий, чем Vue, но и возможностей качественно прострелить себе коленку в нем больше

@темы: бытовуха, кодерастия

16:53

Ваша Всратость
Насчет реактовских курсов. useMemo - это же близнец вьюшного computed со все тем же механизмом кэширования резалта до момента, когда обновятся входящие в зависимость переменные. А разговоров то было… Но есть надежда сегодня полностью добить все задачи по первому этапу курса и оставить 6-ть дней на практическое задание.
P.S.
Ментальная усталость существует, а те, кто считает выгорание зумерской блажью, пусть возьмут долгий и сложный проект, начнут его с нуля, защитят и выкатят в эксплуатацию, а потом столкнутся со сменой руководства, которое уволит своих предшественников и открыто заявит, что у них нет планов дольше, чем на неделю вперед, но они всерьез намерены спустя "год" и "туман войны и неизвестности" поднять выручку проекта в 10 раз.

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

@темы: бытовуха, кодерастия

15:22

Ваша Всратость
К вопросу о курсах. Зачем create-react-app, если есть Vite, который умеет делать все то же самое, но намного более гибко и с возможностью работы с нативкой или Vue?
Ладно, будем считать, что нас морально готовят к погружению в пучины легаси
P.S.
Единственный плюс в том, что он из коробки поднимает девсервер на православном 3000-ом порту. Бгггг

@темы: кодерастия

22:54

Ваша Всратость
Двигаюсь по реакту. Реакт кажется жертвой эволюционного развития, который сначала был просто средством для превращения джсонов в верстку, а затем постепенно оброс управлением стейта, хуками и прочими тентаклями. В результате чего useEffect (местный аналог вьюшного watch) превратился в триединую сущность. Если в useEffect прокинуть переменную, то он будет вести себя как нормальный, здоровый вотчер и запускать коллбек на изменение отслеживаемой переменной.

А если пробросить пустой массив - то коллбек выстрелит на маунте компонента в тело страницы (импровизированный componentDidMount/onBeforeMount). Но на этом чудеса не заканчиваются. Если внутри коллбека возвращать функцию, то эта функция будет запускаться на демонтаж компонента (как componentDidUnmount/onUnmounted).

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

@темы: кодерастия

00:38

Ваша Всратость
Продолжаю тыкать в воркеры.
Для подключения SharedArrayBuffer на стороне клиента нужна определенная магия с заголовками, которую не подделаешь через http-equiv (а вот на бэке/в ноде—заводится из коробки).
Альтернатива - обычные воркеры, которые получают копию кусочка общего массива данных. А это значит, что резалты надо потом сшивать заново. И начался поиск самой быстрой альтернативы.

Спред-оператор с присваиванием (arr = [...arr, ...subarray]) отъехал сразу. Да, это максимально простое и чистое с т.з кодстайла решение, но чудовищно медленное. Где-то в 50-70 раз более тормознутое, чем оптимальный вариант.

Затем были последовательно push со спредом (arr.push(...subarray)), concat и splice. Почти одинаковая производительность, замедлялись по сравнению с оптимумом в 8-10 раз. Не фатально, но и не айс.

И теперь - оптимум. Тупой последовательный прогон по длине массивов, из которых мы склеиваем результат с последовательным наращиванием смещения по мере того, как мы заканчиваем читать один массив и переключаемся на другой.

Вывод - все этим новомодные map, forEach, спред и т.д синтаксически очень красивы, делают код намного чище и понятнее, и если производительность не критична, то ими можно и нужно пользоваться. Но если нужно вдарить по газам - нет ничего лучше старого for(let i = 0; i < i1; i++). С-style, тксзть.

P.S.
Параноидальный яндех трет вложения с жабоскриптом, даже если засунуть его в архив. Так что слайды будут завтра

Upd. оператор .flat немного превосходит по производительности сплайс/конкат, но все еще уступает прямому переносу. Также. Создание Uint8Array обладает некоторым оверхэдом, зато запись/чтение с него идет чуть быстрее, чем из нативного Array

@музыка: Dynatron - Wormhole

@темы: кодерастия

11:23

Ваша Всратость
MirekCellebration умер, но осталось зеркало на web.archive (тыц). Досадно.
Еще один повод продолжить запиливание собственого мини-проджекта с генерацией КА на воркере (proof-of-concept, нужно нарастить контролами)


@темы: кодерастия, Conway's Legacy

00:21

Ваша Всратость
Возможный способ поиска потенциальных рейсконов - в девтулзах выставить профиль со скоростью, заниженной до <500кБит/с.

Так сегодня удалось поймать "гонку" между запросом на получение профиля организации сотрудника и запросом на правила перевозок, этим сотрудником выставленные (последний использует ограничения на доступ к прогнозам, которые даются не только лишь всем)

@темы: горбота, кодерастия

15:08

Ваша Всратость
Наверное, хорошо, что я вчера не порвался говнокодить придуманное решение.
Потому что есть вариант еще изящнее, реализуемый через - private static и нативный жабоскриптовый Class.
На первом обращении вызывает конструктор класса, а в самом классе отводим приватное статическое поле, куда кидаем созданный инстанс
И потом, если у нас уже есть инстанс, просто тянем из него затребованное поле по ключу

@темы: кодерастия

22:36

Ваша Всратость
Из обнаруженного опытным путем.
Корневой компонент App.vue и точка монтирования main.ts/index.ts обычно выстреливают последними. Если нужно на самом запуске SPA, еще до авторизации и запроса разных служебных данных (словари, например) получить состояние среды, лучше отвести для этого отдельный модуль, который только и делает, что цепляет из внешнего источника (cookie, get-параметры и т.д) нужные параметры.

И импортить его в тех местах, где эти параметры применяются. (После 9-и часов плодоношения скудоумием до меня дошло, что тут срабатывает такой паттерн предание старины глубокой как Singleton). По принципу

environmentStore = {key1: val1, key2: val2..., isReady: false }

initStore() {
if (environmentStore.isReady) return;
// Вот взяли и откуда надо прочитали параметры любым известным способом
environmentStore.isReady = true;
}

getKey(key) {
if (!environmentStore.isReady) initStore()
return environmentStore[key]
}


@темы: горбота, кодерастия

15:35

Ваша Всратость
Вот интересно, jQuery в 2к24 (с учетом давно ушедшего в небытие IE и поддерживаемых каждым утюгом стандартов ES6/CSS3) - это из нежелания разбираться в "этой погребени©" и актуализировать догнивающий и перегнивающий проджект. Или кто-то является очень тонким эстетом и ценителем изысканных ментальных удовольствий?

@темы: кодерастия

21:10

Ваша Всратость
Наш бэкенд классный.
Придумать менять id/primary_key сущности после любой операции обновления - это надо еще постараться. Причем как сама операция правки сущности реализована - отдельная песня. Мы не будем просто менять старые поля, заполняя их новыми значениями. Нет, мы создадим новый элемент, скопируем в него поля из старого, затем обновим актуальными значениями, а старый элемент удалим.

Благо, что и до этого момента я вовсю пользовался временными id(которые сам и генерил на клиенте) для склеивания нескольких мутаций GQL в один запрос (там нужно обеспечить уникальность каждой уезжающей пачки исходных данных, как в этом примере). Так вот, теперь эти временные id пригодились для опознания телрезультатов обращений к бэку.

@темы: горбота, кодерастия

14:27

Ваша Всратость
Теперь я ± представляю как управлять квадриком. Заодно попрактиковался в Python и уже без поддержки от ИИ-шницы (это прекрасный термин, Alice-chan, спасибо тебе)закончил переводить свой первичный скрипт с жабоскрипта на змеюку.

@музыка: Палево - Древесина

@темы: птички, кодерастия