Задать вопрос
  • Правильность использование GraphQL?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Я уже устал открывать тайну человечества людям, но graphql был создан для оркестрации микросервисного ландшафта, а не чтобы ходить в базу.
    Ответ написан
    4 комментария
  • Какие еще преимущества у юнит-тестов, кроме того, что они отлично обеспечивают регрессионное тестирование?

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

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

    Но да, с тем, что автотестами нужно покрывать не всё, я лично полностью согласен. Вдобавок, часто высокоуровневые функциональные или end-to-end тесты писать проще, а для проекта они полезнее. Тут надо искать баланс для себя. И еще в это уравнение добавить ручное тестирование. Какой-то общей формулы, понятно, нет.

    А вопрос-то ваш в чём? Пока выглядит как «вы тут меня поуговаривайте писать тесты, а я вам буду объяснять, почему не буду этого делать». Не хотите — не пишите. Если для вашего проекта и для вашей команды тесты не несут большой пользы, то и не пишите их.
    Судя по вашим прошлым вопросам, вы считаете, что всё знаете лучше других, соответственно, вопрос нужен, чтобы потешить ЧСВ? Ну или вы нарвались на какой-то карго-культ-секты-стопроцентного-кавереджа? В таком случае — сочувствую.
    Ответ написан
  • Человекопонятные даты в js на русском языке?

    btd
    @btd
    moment.js. Там подключается сама либа и ее локализация (на главной странице щелкните Russian). В доках подробнее о i18n. (Правда не уверен нужна ли вам все либа если только для вывода).
    Ответ написан
    Комментировать
  • Как изучить wordpress?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Документация, кодекс.
    Из более-менее адекватных каналов на ютубе например вот
    https://www.youtube.com/channel/UCml9k9gl6NwWxsqHQ...
    https://www.youtube.com/channel/UCiTDv6q1XYwZnAm2E...
    Ответ написан
    Комментировать
  • Как правильно отправить на сервер и сохранить буфер загружаемого файла?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, строки в JS в памяти хранятся в виде utf-16, а значит сохранение произвольного бафера в строку может сломать данные.

    Вот тут Ваши данные ломаются:
    let chunks = '';
    
    req.on('data', chunk => {
        chunks += chunk;
    });


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

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

    Отправка:
    const filePath = `../source/archive.zip`;
    const reader = fs.createReadStream(filePath);
    const options = {
        hostname: url.hostname,
        port: 443,
        path: url.pathname,
        method: 'PUT',
        headers: {
            'Content-Type': 'application/zip',
            'Content-Length': fs.statSync(filePath).size
        }
    };
    const req = https.request(options, res => {
        res.on('error', err => console.log('ошибка:', err));
        res.on('end', () => console.log('отправлено'));
    });
    reader.pipe(req);

    Получение:
    router.put('/', (req, res, next) => {
        const pathToFile = path.join(__dirname, '../public/uploads/archive.zip');
        const writer = fs.createWriteStream(pathToFile);
        req.pipe(writer).once('error', next).once('finish', () => {
            res.send('файл сохранён');
        });
    });
    Ответ написан
    4 комментария
  • Какой инструмент использовать для синхронной очереди задач?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Так понимаю сами задачи асинхронные, но их последовательно надо выполнять.
    Обычного массива функций и промисов хватит за глаза:

    Вариант 1:
    function series(tasks) {
        return tasks.reduce((p, task) =>
            p.then(() =>
                task()), Promise.resolve());
    }
    
    series([
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
    ]);


    Вариант 2:
    async function series(tasks) {
        for (const task of tasks) {
            await task();
        }
    }
    
    series([
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
    ]);
    Ответ написан
    Комментировать
  • Как работает сборщик мусор с колбеками Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • Есть ли нормальные курсы/книги по Docker на русском?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    По запросу книги по Docker на русском гугл выдал 90000+ результатов. Неужели из всего многообразия вы одну не смогли выбрать?
    Ответ написан
    1 комментарий
  • Берут ли на стажировки перваков?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Интересно узнать, возможно ли будет стажироваться с первого курса?

    Зачем?

    Рассмотрим вас со стороны бизнеса - вам 18 лет, за вами нужно следить, денег вы не приносите, а скорее всего еще и обходитесь компании в копейку.

    Почему берут на стажировку 4-5 курс = потому что они потенциальные наемные сотрудники. И проходя бесплатную(или нет) стажировку, компания уже берет в штат "знакомого" человека, который на выходе даст неплохой профит за меньшие деньги на старте.

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

    Этот вариант был бы самым идеальным для вас, так как студент заочник, дает фору студенту очнику в 4-5 годах корпоративной разработки, что на Российском рынке означает что возьмут 99% вас, а не очника.
    Ответ написан
    Комментировать
  • Термины и определения Парсинга?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Граббер - который ТОЛЬКО ЗАБИРАЕТ И СКЛАДИРУЕТ данные
    Парсер - который ТОЛЬКО РАЗБИРАЕТ уже полученные массивы данных
    Скрапер - это комплекс обработки публичных данных с максимальной структуризацией и с использованием многочисленных правил и шаблонов, позволяющий поддерживать актуальную репликацию таких данных на своей стороне любому желающему. https://en.wikipedia.org/wiki/Web_scraping
    Ответ написан
    Комментировать
  • Как получить разрешение экрана node.js?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Нода работает на сервере размер экрана можно получит только на клиенте. Так что либо встраивайте клиентский скрипт либо составляйте базу юзерагентов и пытайтесь их соотносить с мобилками. Для десктопа это кстати не сработает
    Ответ написан
    9 комментариев
  • Ресурсы похожие на metanit и learn.js?

    Ответ написан
    Комментировать
  • Как очистить localStorage после закрытия всех вкладок с сайтом?

    Так это нужен session а не local, это у него такое поведение
    Ответ написан
    4 комментария
  • Как посчитать количество функций в коде JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Такие задачи однозначно решаются обходом AST. Возьмите общеизвестный парсер и инструмент для обхода его дерева, например связка из @babel/parser и @babel/traverse подойдет.
    Так же можно посмотреть в какие ноды что парсится с помощью https://astexplorer.net/ - в нем несколько языков, а для js/ts на выбор есть несколько парсеров.
    Вам по сути нужно найти FunctionDeclaration содержащий в body ReturnStatement и извлечь из него Identifier соответствующий имени. А для второй части - FunctionDeclaration с ArgumentsList не нулевой длины.
    Ну и так как в условии сказано, что внутрь не заходить, то можно пройтись лишь по верхнему уровню, тогда @babel/traverse и не нужен даже
    Ответ написан
    3 комментария
  • Что использовать в back-end для дипломной работы?

    @antonwx
    Опыт: что проще для вас, то и берите. На код смотреть никто не будет - только на красивые презентации под вашу речь.
    Ответ написан
    Комментировать
  • Почему работодатели заостряют внимание на теории?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Чтобы сразу отсеивать слабых соискателей, не знающих даже элементарных основ.
    Ответ написан
    3 комментария
  • Как перехватить трафик сети в Kali?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    Как перехватить трафик сети в Kali?

    Снести Kali, поставить винду, вернуть на место майнкрафт и перестать отнимать время у взрослых дядь :)
    Ответ написан
  • Какую профессию выбрать для девятиклассника не знающего что такое IT?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Автослесарь, или столяр, как раз в ПТУ после 9-го класса идут.
    Я серьёзно, сам путягу заканчивал в конце 90х, и не жалею что "пощупал" реальную профессию. Всегда успеешь вкатиться вайти.
    успешное трудоустройство — это главное,
    - ложь. Можно легко находить работу по профессии и в тоже время ненавидеть её.
    Ответ написан
    2 комментария