• Как парсить сайты на JS?

    w3bsmes
    @w3bsmes
    Куратор тега «Глупые вопросы»
    1 комментарий
  • Почему не выходит получить данные запроса GET в request, в консоли пустая переменная?

    KickeRocK
    @KickeRocK
    FrontFinish
    const request = require('request');
    
    var cards;

    бе
    По теме, это асинхронная операция, у вас значение выводится до её выполнения, даже если оно занимает крайне мало времени, выведите после(по нажатию на кнопку или в callback'e функции запроса)
    Ответ написан
    Комментировать
  • Почему планировщик задач Laravel сильно грузит процессор?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    1. У ларавел нет никакого особого планировщика, используется cron.
    2. Ты каждую минуту запускаешь неизвестно что делающие задания. Может, ты там триллион знаков числа Пи считаешь.
    3. Провидцев и предсказателей тут нет.

    P.S. Команды, запускающие методы контроллера — ужас.
    Ответ написан
    Комментировать
  • Подготовка к работе frontend?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Если нормальная компания то при абординге вам дадут документ с курсами и кастами
    Будете тупо впитывать
    Ваш куратор будет с вами на связи так что не тупите спрашивайте
    Недели через две три вас посадят на боевой проект притретесь и через месяц будете нормально работать
    Ответ написан
    1 комментарий
  • Как ускорить загрузку страницы с фильтром по товарам?

    New_Horizons
    @New_Horizons
    Бред:
    Считать фильтры по крону и кешировать.
    Ещё вот интересно: https://habr.com/ru/post/261137/
    Ответ написан
    Комментировать
  • Функции по "Чистому коду" - нужно ли это?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Читайте дальше. В книге доходчиво описывается, что все парадигмы и практики в программировании направлены на управление сложностью изменений. Вы не можете знать, как ваш код должен будет измениться завтра, но точно то, что маленькие функции будет легче перекомпоновать. Естественно, всё это имеет смысл, если у вас что-то сложнее hello world'а.
    Ответ написан
    2 комментария
  • Сервер который выступает шлюзом для вебсеров?

    vabka
    @vabka Куратор тега Веб-разработка
    Токсичный шарпист
    Гугли "reverse proxy".
    Реализовать можно на nginx - на него будут приходить все запросы, а он уже по каким-то правилам будет их перенаправлять на внутренние сервисы.
    Можно реализовать и на апаче, но не вижу в этом смысла.
    Ответ написан
    Комментировать
  • На какую JS-библиотеку перейти с JQuery?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Библиотека выбирается под задачи. Собственно сейчас все то что делает джиквери можно сделать на винильном джиэс. Мне например нравится vue чуть меньше реакт.
    Ответ написан
    5 комментариев
  • Что нужно для защиты локальной сети банка?

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

    @Kladislav
    $products = MasterProduct::where('published',1)->whereNUll('group_id')->where('available',1)->with('offers')
                ->chunk(5, function ( $mps,  $name1 ) use ($var1, $var2, etc...) {
                    echo $name1;
                });
    Ответ написан
    Комментировать
  • Как получить элементарные общеинформационные знания, не прикасаясь к учебникам по информатике?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Дональд Кнут.
    Там ни слова о принтерах, зато всё об информатике
    Ответ написан
    3 комментария
  • В чем превосходство Typescript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Как бы это странно не звучало, но одно из главных преимуществ TypeScript - это ускорение разработки в несколько раз. Да, когда еще ничего нет - разработка незначительно замедлится, так как помимо логики нужно описать еще и типы. Но это только в начале. И это не только возможность писать большую часть кода с помощью автодополнения. Поддержка существующего кода занимает в десятки раз больше времени, чем его начальное написание. Стоит ли вложить несколько лишних часов на старте, чтоб сэкономить в последствии месяцы? Как по мне стоит.

    Еще одним огромным плюсом является возможность проектировать на типах. Познав дзен TypeScript'а я перестал пользоваться UML, так как типы дают мне ту же наглядность, но при этом еще и сокращают время, так как типы - это уже код. Ну и источник правды остается один. Бизнес требования выраженные в типах не дают отклонится от них при написании логики, исключая возможность неправильной трактовки задачи. Перенеся задачу в типы, я могу обсудить ее с коллегами и исправить неточности еще до написания кода, что опять же сильно экономит время.

    Ну и отвчечу на некоторые Ваши сомнения:
    TSLint в VSCode прям жутко тугой
    TSLint официально deprecated, вместо него стоит использовать плагин к eslint, заодно можете мой конфиг попробовать.

    Типы? Есть JSDOC
    JSDoc в плане типов не умеет и 10% того, что умеет TypeScript. Кроме того, никто в здравом уме не пишет JSDoc на приватную логику, а значит проверки типов там не будет. JSDoc не гарантирует корректность рефакторинга, а вот благодаря TypeScript я, опять таки, точно не забуду обновить JSDoc.

    многие библиотеки nodejs не имеют типов
    может лет 5 назад так и было, но сейчас встретить библиотеку без типов - скорее исключение. Если библиотека популярная, но не предоставляет типов, скорее всего их уже написал кто-то другой, достаточно просто установить одноименный модуль из npm скоупа types и все будет работать само.

    Поддержка браузерами скомпилированного кода? Да какбы почти весь JS имеет поддержку 95%+, тот же Babel уже забыл когда использовал.
    Вообще это не основная задача компилятора TypeScript, а опциональная возможность. И babel + preset-env с ней справляются гораздо лучше. И никто не мешает использовать их вместе. А еще думаю вопрос времени, когда кто-то напишет оптимизатор кода использующий информацию о типах из TS.

    Примерно в каждой второй есть инстансы, на которые смотришь - и чешешь репу - а как называется тип этой переменной в @types/?
    import {someObject} from 'some-library';
    
    type TypeFromValue = typeof someObject;
    const valueCopy: TypeFromValue = {
        ...someObject,
        type: 'overrides',
        with: 'type check',
    };
    и кстати, вот пример того что JSDoc типы не умеют.

    //@ts-check
    и почти везде останется бесполезный any.

    P.S. удачи такие типы на JSDoc описывать
    P.P.S. Еще прелести современного TypeScript невозможные у...
    Ответ написан
    8 комментариев
  • Правильность использование 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 комментария