• Golang в чём смысл?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, любой бенчмарк можно написать так, что визуально будет выглядеть очень похоже, но на деле у одной технологии будут использоваться сильные стороны, а у другой нет (понятно кто выиграет). Притом это можно сделать как специально, дабы превознести одну из технологий, так и ненамеренно, просто потому-что человек писавший бенчмарк очень хорошо знает одну технологию и посредственно другую.
    Например, я вполне умею написать многие вещи на C, C# и Go, но знаю эти языки очень поверхностно, с другой стороны я очень хорошо знаю JS (в том числе достаточно много копался в кишках v8) и Rust, как думаете, кто победит, если я начну писать бенчмарки для сравнения этих 5 языков?

    хотя Golang изначально и задумывался, как яп для хайлоада
    Go изначально задумывался как ЯП, который сможет быстро освоить любой, кто базово знаком с программированием, дабы Google мог нанять тысячу джунов и они быстро прототипировали идеи без заморочек C/C++.

    А еще вся супер-пупер параллельность - на самом деле асинхронщина, работающая на небольшом пуле реальных потоков ОС. Притом без вариантов. Асинхронный рантайм - это тоже не бесплатно. На всяких I/O штуках асинхронщина показывает себя очень хорошо, но на сугубо вычислительных задачах - все ее преимущества становятся минусами. На шарпе есть контроль, где использовать асинхронщину, а где вынести вычисления в настоящий поток. На Go такой возможности нет.

    P.S. а вообще, в реальном мире Вы практически никогда не упретесь в производительность языка, ну разве что будете всюду втыкать самые неоптимальные алгоритмы. На деле бутылочным горлышком окажутся сеть и диски. И даже в сугубо вычислительных штуках Вы скорее упретесь в оперативку и процессорные кэши, а не в ЯП.
    Ответ написан
    2 комментария
  • Как завершить прослушку bot.on?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://nodejs.org/dist/latest-v16.x/docs/api/even...
    Функция отдаваемая в .off должна быть той же самой, что отдали в .on
    Ответ написан
    Комментировать
  • Как повысить свои навыки в построении архитектуры сложных приложений?

    bingo347
    @bingo347
    Crazy on performance...
    Если по теории, то мне в свое время вот эта книга помогла:
    https://www.litres.ru/robert-s-martin/chistaya-arh...

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

    Через несколько месяцев прочел еще раз, анализируя все затупы, что записал за это время в блокнот. После прочтения начал потихоньку рефакторить в существующих проектах места, которые уж очень жить мешали.

    Еще через пол года прочел третий раз, опять же с оглядкой на личный опыт. И тут я кажется уже совсем въехал. По крайней мере многие проблемы с организацией взаимодействия между компонентами стали разрешаться. И вообще появилось достаточно четкое понимание, как структурировать приложение и где разбивать его на компоненты.
    Ну и после 3 прочтения еще помог момент: мне дали с нуля проектировать новое, достаточно крупное приложение на Rust. Притом заказчик кричал "микросервисы - это круто, хочу, хочу, хочу", а тимлид мне сказал "давай монолит, но так чтоб потом легко было распилить, а то все сроки про**ем". Вот тут прямо вообще понимание пришло. Ну и плюс в Rust архитектурные компоненты очень хорошо ложатся на отдельные крейты (это такая единица компиляции в Rust), а компилятор в принципе не дает делать циклические зависимости между крейтами.

    Ну и недавно решил освежить память и перечитать еще раз. И на этот раз уже были мысли вроде "так если делать по другому, потом проблемы вылезут тут и тут".
    Ответ написан
    1 комментарий
  • Являются ли промисы асинхронными?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    new Promise(resolve => {
      // здесь код выполняется синхронно
      resolve();
    }).then(() => {
      // здесь уже асинхронно, в ближайшем микротаске после вызова resolve выше
    });
    
    Promise.resolve().then(() => {
      // здесь тоже асинхронно, в ближайшем микротаске
    });


    много вычислений
    Это не про асинхронность.
    Асинхронность - это про кооперативную многозадачность, то есть промис может только отложить вычисления на потом, но они все равно заблокируют поток, который у JS всего один.
    А для "много вычислений" без блокирования основного потока, эти "много вычислений" нужно выносить в отдельный поток. В JS для этого есть воркеры. А вот уже результат от воркера можно ждать асинхронно.
    Ответ написан
    Комментировать
  • Как исправить ошибку Vue + TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    А что Вам не понятно из описания ошибки?
    Вы пытаетесь присвоить объект ComputedRef<number>, возвращаемый функцией computed в поле объекта объявленное как number.
    Нужно или поменять тип у поля, или обновлять поле через watch.
    Ответ написан
    5 комментариев
  • Что означает данное ниже определение в Typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Тип Record - это утилити тип из стандартной библиотеки TS, который описывает объект, у которого ключи - первый аргумент дженерика, а значения - второй.
    Тип string[] | Record<string, any>[] - это или массив строк или массив объектов (ключ - любая строка, значение любого типа). Данный тип не позволит смешивать строки и объекты в одном массиве, либо то либо другое.
    Как верно подметил WbICHA в комментарии к вопросу, для приведенных данных корректный тип - это (string | Record<string, any>)[] (массив из строк или объектов в перемешку).

    Ну и вместо any лучше использовать unknown, any - это тип без проверки типов, unknown - это тип который включает в себя все другие типы, в него как и в any тоже можно записать значение любого типа, но в отличии от any при использовании unknown нужно делать либо явное приведение типов, либо рантайм проверки типов.
    Ответ написан
    5 комментариев
  • Бесплатные API крупных магазинов, где найти?

    bingo347
    @bingo347
    Crazy on performance...
    Ответ написан
    Комментировать
  • Почему не работает child_process electron?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Скорее всего проблема с путями для 'easyvk.js'.
    Во-первых, лучше всегда вычислять абсолютный путь до файла.
    Во-вторых, electron-packager пакует приложение в asar, и если require пропатчен для работы с ним, то child_process скорее всего нет и нужен анпакинг файла перед запуском.
    Ответ написан
  • Вопросы по REST API?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, REST - это не стандарт, не строгие правила, это рекомендации.
    Вся суть этих рекомендаций сводится к двум вещам:
    - Каждый ресурс (документ, данные о сущности) имеет свой собственный URI
    - Для каждого действия с ресурсом предлагается в соответствие свой HTTP метод запроса

    Теперь по вопросам:
    1. Если данные json и html - это просто разные представления одного ресурса, то они вполне могут жить на одном URI. Например разное представление отдается в зависимости от HTTP заголовка Accept.
    2. REST никак не регламентирует, как Вам строить приложение. Это может быть отдельный запрос к сущности "роль" или быть частью сущности "пользователь", решать Вам.
    3. Опять же, REST тут вообще не причем. В REST нет никаких БД, сессий или еще чего либо, что Вы там под капотом используете инкапсулировано от клиента.
    4. CSRF делается как и в любом другом случае. Вот статья есть: https://habr.com/ru/post/318748/
    Ответ написан
    4 комментария
  • Почему не происходит перерисовка в самописном react-redux?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    state.firstname = action.payload.firstname;тут Вы мутируете предыдущий стейт, что потенциально может привести к невозможности сравнить стейты.

    reducer(state, action);возвращаемый стейт никуда не записывается

    callback();А вот тут может быть потенциально ошибка, так как callback может быть undefined
    Ответ написан
    1 комментарий
  • Как отключить синхронизацию темы оформления в VS Code?

    bingo347
    @bingo347
    Crazy on performance...
    settingsSync.ignoredExtensions
    В нем массив id расширений, которые не нужно синхронизировать, пропишите там id обоих тем
    Ответ написан
  • Как прописать тип для клонированного объекта, чьи значения были изменены рекурсивно?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Можно добавить такой тип:
    type RulersMap<R extends Record<string, unknown>> = {
      [K in keyof R]: R[K] extends number
        ? `${R[K]}px`
        : R[K] extends Record<string, unknown>
          ? RulersMap<R[K]>
          : R[K];
    };
    и привести результат к типу RulersMap<typeof rulers>
    Проблема в том, что у либы map-obj не очень то хорошо типы для deep варианта написаны, хотя можно свои написать при желании.
    Ответ написан
    Комментировать
  • Как изменить значение обьекта на имя?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Object.keys(object[key]) = newobject[key];
    Вот на этой строчке у Вас ошибка, в JS нельзя присвоить что-то любому выражению, только переменной или полю объекта.
    Ответ написан
    Комментировать
  • Почему в объекте Response нет самого ответа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Промис возвращаемый fetch() не ждет завершения всего запроса, он резолвится когда получены все заголовки.
    На этом месте их можно обработать и решить что делать дальше, например читать json, текст или бинарные данные из тела, или вообще не обрабатывать тело и прервать запрос.
    Так же можно читать тело ответа в виде потока, как уже указал в своем ответе Надим Закиров

    Второй промис из response.text() и response.json() нужен чтоб дождаться считывания всего тела ответа, притом response.json() еще и позволяет браузеру парсить json из ответа потоково прямо во время скачивания, опять же не блокируя поток js/ui.
    Ответ написан
    5 комментариев
  • Как выглядел Си до K&R?

    bingo347
    @bingo347
    Crazy on performance...
    Книга по языку не является стандартом языка.
    Первым стандартом для C является ANSI C (C89), до него язык был не стандартизирован и сильно зависел от конкретного компилятора (хотя кое-где, особенно в embedded, это и сейчас можно встретить).
    Ответ написан
    1 комментарий
  • Как преобразовать curl с параметром --data в fetch с методом get?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если данные передаются в url в виде GET параметров:
    const url = new URL('http://127.0.0.1:8000/api/feed/posts/');
    url.searchParams.append('page', 1);
    
    fetch(url, {
      headers: {
        Authorization: 'Token a96a3545bb566272f0fdfb405a0cccb7173da660',
      },
    });
    Ответ написан
    Комментировать
  • Как переписать промис через async/await?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Код на then ждет промис из wait, а код на await нет
    await wait(2);
    Ответ написан
  • Почему сообщения в консоль выводятся не по порядку массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Promise.all(arr.map(p => {
        const link = `http://195.112.117.82:5080/photo?tov_code_internet=${encodeURIComponent(p)}`;
        return new Promise(resolve => {
            $.get(link, resolve);
        });
    })).then(dataArr => {
        for (const data of dataArr) {
            const $obj = $(data);
    
            const content = $obj[19].innerHTML;
            const title =   $obj[7].innerText;
    
            // по хорошему регулярки надо вынести наверх,
            // чтобы они компилировались 1 раз
            const text = content
                .replace(/[\n\r]/g, ' ')
                .replace (/\s{2,}/g, ' ');
    
            console.log(text + " " + title);
        }
    }).catch(err => {
        console.error(err);
    });
    Ответ написан
    Комментировать
  • Как из строки получить данные в виде массива?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    1. Нужно распарсить документ, например с помощью https://www.npmjs.com/package/parse5
    2. Вытащить из html текст нужного скрипта.
    3. Запустить этот скрипт в новом контексте, подсунув ему в глобальный объект функцию под именем sms_row_insert
    https://nodejs.org/dist/latest-v16.x/docs/api/vm.h...
    4. В подставленную функцию 2 аргументом придут нужные данные, их можно собрать в массив и обработать после выполнения скрипта либо обрабатывать на каждый вызов функции.
    Ответ написан
  • Почему не могу запушить изменения на страницу в гитхабе?

    bingo347
    @bingo347
    Crazy on performance...
    А Вы читать ошибку пробовали? Там же все расписано...
    Нужно сделать git pull перед git push, чтобы получить изменения, которых у Вас нет локально.
    Ответ написан
    4 комментария