Promise.race
Всем привет, на связи Марго @devmargooo и сегодня я расскажу вам про Promise.race.🏎 Promise.race принимает в качестве аргумента массив промисов и возвращает результат того промиса, который завершится первым. Значит ли это, что после завершения Promise.race можно просто забыть про те промисы, которые проиграли гонку? Оказывается, нет. В 2017 году была описана интересная утечка памяти в Promise.race https://github.com/nodejs/node/issues/17469#issuecomment-685216777. Эта утечка интересна не сама по себе (мне кажется, Promise.race не так часто используют), а тем, что она представляет собой очень показательный пример утечки памяти в js через замыкания. Рассмотрим следующие тезисы.
1. Промис сохраняет свой результат все время, которое он живет.
Некоторые разработчики считают, что если мы не используем результат, который вернул промис, то он освободит память сразу после того, как промис завершится. Это не так! Результат промиса сохраняется в его внутреннем свойстве result все время, пока живет (= ссылочно доступен) сам промис.
2. Также, если промис зарезолвился, это еще не значит, что данные внутри его функции-исполнителя (функция, которую передали в конструктор промиса) больше не удерживаются в памяти. Нет, они могут удерживаться в памяти, например, если внутри исполнителя был setTimeout.
3. Рассмотрим следующий код и попробуем память, когда из памяти будет удален “super string”.
В данном случае neverResolve завис в памяти, а с ним и весь родительский промис p. Результат промиса resolveString сохранился как внутренее свойство result объекта p. Если “super string” - это тяжелые данные, то мы получим существенную утечку памяти. По всей видимости, механизм утечки памяти в Promise.race аналогичен вышеизложенному.
Всем привет, на связи Марго @devmargooo и сегодня я расскажу вам про Promise.race.🏎 Promise.race принимает в качестве аргумента массив промисов и возвращает результат того промиса, который завершится первым. Значит ли это, что после завершения Promise.race можно просто забыть про те промисы, которые проиграли гонку? Оказывается, нет. В 2017 году была описана интересная утечка памяти в Promise.race https://github.com/nodejs/node/issues/17469#issuecomment-685216777. Эта утечка интересна не сама по себе (мне кажется, Promise.race не так часто используют), а тем, что она представляет собой очень показательный пример утечки памяти в js через замыкания. Рассмотрим следующие тезисы.
1. Промис сохраняет свой результат все время, которое он живет.
Некоторые разработчики считают, что если мы не используем результат, который вернул промис, то он освободит память сразу после того, как промис завершится. Это не так! Результат промиса сохраняется в его внутреннем свойстве result все время, пока живет (= ссылочно доступен) сам промис.
2. Также, если промис зарезолвился, это еще не значит, что данные внутри его функции-исполнителя (функция, которую передали в конструктор промиса) больше не удерживаются в памяти. Нет, они могут удерживаться в памяти, например, если внутри исполнителя был setTimeout.
3. Рассмотрим следующий код и попробуем память, когда из памяти будет удален “super string”.
const resolveString = new Promise((resolve) => resolve("super string"));
const neverResolve = new Promise(() => {});
const promises = [resolveString, neverResolve];
const p = new Promise((resolve, reject) => {
for (const promise of promises) {
Promise.resolve(promise).then(resolve, reject);
}
});
В данном случае neverResolve завис в памяти, а с ним и весь родительский промис p. Результат промиса resolveString сохранился как внутренее свойство result объекта p. Если “super string” - это тяжелые данные, то мы получим существенную утечку памяти. По всей видимости, механизм утечки памяти в Promise.race аналогичен вышеизложенному.
GitHub
`Promise.race` lead to memory leak · Issue #17469 · nodejs/node
Version: v9.2.0 and v8.9.1, probably other version also affected Platform: linux Subsystem: - I run this code inside docker with -m 100m --memory-swap 100m , and then the program crash after few se...
👍49🤡12❤4🙏2
В дополнение ко вчерашнему стриму рекомендую посмотреть статью про стратегии репликации и объединения данных
Часть идей могут использоваться при объединении пользовательских стейтов на стороне бэкенда
Часть идей могут использоваться при объединении пользовательских стейтов на стороне бэкенда
Хабр
CRDT: Conflict-free Replicated Data Types
Как считать хиты страницы google.com? А как хранить счётчик лайков очень популярных пользователей? В этой статье предлагается рассмотреть решение этих задач с помощью CRDT (Conflict-free Replicated...
👍26🤡1
Привет, друзья! Сегодня мы поговорим о личной мотивации.
Как часто вы чувствуете, что у вас нет сил и желания продолжать работу над проектом? Как часто вы задаетесь вопросом, зачем все это нужно?
В такие моменты очень важно найти внутреннюю мотивацию. Что вас вдохновляет? Что заставляет вас двигаться вперед?
Для меня, как для технического специалиста, мотивация - это возможность создавать что-то новое и полезное. Когда я вижу, что мой код работает и помогает людям решать их проблемы, это дает мне огромное удовлетворение.
Но не только это. Личная мотивация - это еще и возможность постоянно учиться и развиваться. Каждый день мы сталкиваемся с новыми вызовами и задачами, которые помогают нам расти как профессионалам.
И конечно же, не стоит забывать о команде. Работа в коллективе - это еще один источник мотивации. Когда вы работаете вместе с единомышленниками, вы можете обмениваться опытом, делиться идеями и находить новые решения.
В заключение хочу сказать, что личная мотивация - это то, что помогает нам преодолевать трудности и достигать поставленных целей. Найдите свою мотивацию и не останавливайтесь на достигнутом!
Спасибо за внимание!
P.s. угадай какой gpt это написал и какой примерно был промпт! )
Как часто вы чувствуете, что у вас нет сил и желания продолжать работу над проектом? Как часто вы задаетесь вопросом, зачем все это нужно?
В такие моменты очень важно найти внутреннюю мотивацию. Что вас вдохновляет? Что заставляет вас двигаться вперед?
Для меня, как для технического специалиста, мотивация - это возможность создавать что-то новое и полезное. Когда я вижу, что мой код работает и помогает людям решать их проблемы, это дает мне огромное удовлетворение.
Но не только это. Личная мотивация - это еще и возможность постоянно учиться и развиваться. Каждый день мы сталкиваемся с новыми вызовами и задачами, которые помогают нам расти как профессионалам.
И конечно же, не стоит забывать о команде. Работа в коллективе - это еще один источник мотивации. Когда вы работаете вместе с единомышленниками, вы можете обмениваться опытом, делиться идеями и находить новые решения.
В заключение хочу сказать, что личная мотивация - это то, что помогает нам преодолевать трудности и достигать поставленных целей. Найдите свою мотивацию и не останавливайтесь на достигнутом!
Спасибо за внимание!
P.s. угадай какой gpt это написал и какой примерно был промпт! )
👍38🤡16🤓5👎3🐳1
Вас тоже взбудоражила новость о том, что сломался DNSSEC?
Лично меня нет, я опять все проспал и узнал все постфактум.
Помните, здоровый сон бережёт вашу нервную систему!
https://habr.com/ru/news/790188/
Лично меня нет, я опять все проспал и узнал все постфактум.
Помните, здоровый сон бережёт вашу нервную систему!
https://habr.com/ru/news/790188/
👍80😁26💯22🐳4✍2👎1👾1
Субботний стрим 03.02 10:00
Начинаю сбор вопросов на стрим, напоминаю, что у нас будет четыре секции:
- Зачем это надо? (ЗЭН)
- анализирую это (разбираем этапы работы javascript runtime)
- Сплетни нашего ютуба
- Донаты решают
В комментарии к этому посту скиньте вопросы на ЗЭН, они должны касаться АйТи.
Так же можно скинуть ссылки на свои репо, которые я могу посмотреть в прямом эфире и сказать мнение о коде и архитектуре, так же можно скинуть новость или ссылку на ютуб ролик, который можно обсудить в Сплетнях.
Начинаю сбор вопросов на стрим, напоминаю, что у нас будет четыре секции:
- Зачем это надо? (ЗЭН)
- анализирую это (разбираем этапы работы javascript runtime)
- Сплетни нашего ютуба
- Донаты решают
В комментарии к этому посту скиньте вопросы на ЗЭН, они должны касаться АйТи.
Так же можно скинуть ссылки на свои репо, которые я могу посмотреть в прямом эфире и сказать мнение о коде и архитектуре, так же можно скинуть новость или ссылку на ютуб ролик, который можно обсудить в Сплетнях.
👍20❤1👎1🔥1
Если вы разогнались и хотите еще какой-нибудь стрим посмотреть, то прямо сейчас стримит HollyJS ) - https://www.youtube.com/watch?v=GJOVUGL5v0I
YouTube
Тяжелое утро с HolyJS и Ольгой Булашовой #55: рекрутинг в IT
Подробнее о конференции HolyJS: https://jrg.su/EM4wwV
— —
Как устроен рекрутинг «у нас» и «у них»? Какие особенности у релокантских сообществ? Почему вам обязательно надо побывать в Нижнем Новгороде и зачем вести публичную деятельность?
Ответить на эти…
— —
Как устроен рекрутинг «у нас» и «у них»? Какие особенности у релокантских сообществ? Почему вам обязательно надо побывать в Нижнем Новгороде и зачем вести публичную деятельность?
Ответить на эти…
👍9👎1
Со мной часто спорят, когда я говорю, что онлайн банкинг штука очень небезопасная, мол действия мошенников возможны только если клиент ошибся и сам передал информацию злоумышленнику. Вот статья на хабре где 200 килорублей увели без действий со стороны пользователя
🤯31👍8🤡4😢2😱1
Разделение ответственности в UI компонентах
Привет, на связи @devmargooo и сегодня я хотела бы рассказать свои мысли насчет разделения ответственности в UI компонентах. В своей “Чистой архитектуре” Р. Мартин пишет, что принцип единственной ответственности (SRP) является следствием закона Конвея и определяет, что лучшей является такая структура программной системы, при котором каждый модуль может быть изменен только вследствие удовлетворения интересов одного единственного актора. На мой взгляд, при разработке библиотеки UI компонентов удобно использовать схожий принцип, который можно сформулировать следующим образом: каждая логическая зона UI может менять свое состояние вследствие изменения конфигурации одного и только одного компонента в коде. Под “логической зоной” я пониманию небольшой кусочек UI, который несет полезную нагрузку для пользователя и может находится в разных состояниях. Разберем на примере текстового инпута. В нем я выделяю следующие логические зоны: поле ввода (возможные состояния - пустое, непустое, задизабленное, с ошибкой), крестик возле инпута (возможные состояния - присутствует, отсутствует), иконка возле поля ввода, подпись под полем ввода. Библиотеки UI компонентов часто разрабатывают таким образом, что в них есть “самые базовые компоненты” (например, Input), и компоненты, которые построены на основе этих “самых базовых компонентов” (ErrorInput, LabelInput, IconInput etc) по принципу “матрешки”. Таким образом, нам нужно следить, чтобы в этой иерархии изменять состояние каждой логической зоны мог только компонент! Например, возможность рендера иконки рядом с полем ввода должен иметь только один компонент - или Input, или IconInput, и тд. Рассмотрим следующий пример реализации Input и ErrorInput на React:
При таком подходе возможна ситуация, когда в ErrorInput будут одновременно переданы пропсы
Привет, на связи @devmargooo и сегодня я хотела бы рассказать свои мысли насчет разделения ответственности в UI компонентах. В своей “Чистой архитектуре” Р. Мартин пишет, что принцип единственной ответственности (SRP) является следствием закона Конвея и определяет, что лучшей является такая структура программной системы, при котором каждый модуль может быть изменен только вследствие удовлетворения интересов одного единственного актора. На мой взгляд, при разработке библиотеки UI компонентов удобно использовать схожий принцип, который можно сформулировать следующим образом: каждая логическая зона UI может менять свое состояние вследствие изменения конфигурации одного и только одного компонента в коде. Под “логической зоной” я пониманию небольшой кусочек UI, который несет полезную нагрузку для пользователя и может находится в разных состояниях. Разберем на примере текстового инпута. В нем я выделяю следующие логические зоны: поле ввода (возможные состояния - пустое, непустое, задизабленное, с ошибкой), крестик возле инпута (возможные состояния - присутствует, отсутствует), иконка возле поля ввода, подпись под полем ввода. Библиотеки UI компонентов часто разрабатывают таким образом, что в них есть “самые базовые компоненты” (например, Input), и компоненты, которые построены на основе этих “самых базовых компонентов” (ErrorInput, LabelInput, IconInput etc) по принципу “матрешки”. Таким образом, нам нужно следить, чтобы в этой иерархии изменять состояние каждой логической зоны мог только компонент! Например, возможность рендера иконки рядом с полем ввода должен иметь только один компонент - или Input, или IconInput, и тд. Рассмотрим следующий пример реализации Input и ErrorInput на React:
interface InputProps {
value: string;
setValue: (newValue: string) => void;
icon?:string;
}
const Input = ({value, setValue, icon}:InputProps) => (
<div className="input">
{icon && <div className="icon">{icon}</div>}
<input type="text" value={value} onChange={(e) => setValue(e.target.value)}/>
</div>
)
interface ErrorInputProps extends InputProps {
is_error?: boolean;
}
const ErrorInput = (props:ErrorInputProps) => (
<div className="error_input">
{props.is_error && <div className="error_icon">X</div>}
<Input {...props}/>
</div>
)
При таком подходе возможна ситуация, когда в ErrorInput будут одновременно переданы пропсы
is_error
и icon
и в одной и той же логической зоне иконки будет отрендерено сразу две иконки, одна поверх другой. Следовательно,важно следить за тем, чтобы логическую зону иконки мог изменять только один компонент - в нашем случае это компонент Input. В своей практике я видела достаточно много багов, попавших на продакшн вследствие нарушения этого принципа.🤔25👎17👍7❤5🤨3❤🔥2🎅1
V набор NarisApp
Начинаю набор в V сезон. Информацию о проекте и порядке участия можно посмотреть здесь - https://s0er.ru/documents/article/6008
Коротко: NarisApp это OpenSource приложение которое мы делаем с командой SOER.PRO, подать заявку на участие может каждый желающий. Каждый раз мы набираем 30 человек, из которых до конца доходит 5-7 человек. Все очень весело и хардкорно.
Начинаю набор в V сезон. Информацию о проекте и порядке участия можно посмотреть здесь - https://s0er.ru/documents/article/6008
Коротко: NarisApp это OpenSource приложение которое мы делаем с командой SOER.PRO, подать заявку на участие может каждый желающий. Каждый раз мы набираем 30 человек, из которых до конца доходит 5-7 человек. Все очень весело и хардкорно.
SOER.MEDIA
404
Запрошенный ресурс не найден
👍15💩4❤3🔥3🤔2
В работе над новыми проектами есть свой вайб.
Особенно люблю момент, когда наступает "кристализация" идей в виде кода. Это когда из области "неосязаемого" проект переходит в рабочее состояние и становится понятно как реально "бегают" данные, нарабатываются шаблоны повторного использования, есть что править, результат можно измерить и сравнить.
Очень хочется, чтобы инженеров, которые понимают о чем я говорю, становилось больше. Ведь в этом и состоит кайф работы в профессии. Иначе смысл протирать штаны, дожидаясь пятницы и выходных?
Особенно люблю момент, когда наступает "кристализация" идей в виде кода. Это когда из области "неосязаемого" проект переходит в рабочее состояние и становится понятно как реально "бегают" данные, нарабатываются шаблоны повторного использования, есть что править, результат можно измерить и сравнить.
Очень хочется, чтобы инженеров, которые понимают о чем я говорю, становилось больше. Ведь в этом и состоит кайф работы в профессии. Иначе смысл протирать штаны, дожидаясь пятницы и выходных?
👍107💯23❤8✍3👎1
Залетайте на стрим. Сегодня будет просто разговор о том как прошла неделя, какие новости, какие интересные вещи делали. Ответы на вопросы.
👍12👎1 1