• Как получить список полей из интерфейса?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    const credTester: Record<keyof Credentials, RegExp> = {
            login: /^[0-9a-zA-Z]*$/,
            password: /^[0-9a-zA-Z@#.]*$/
    };
    Ответ написан
    Комментировать
  • Что выбрать grpc или graphql?

    bingo347
    @bingo347
    Crazy on performance...
    Для внутреннего апи (например когда все клиенты пишутся в той же компании, что и апи) различные RPC протоколы (например тот же grpc) будут эффективнее.
    гибко задавать список необходимых полей сущностей
    Нормально спроектированное RPC в принципе не отдает ничего лишнего, при этом минимизирует потребность нескольких вызовов за раз. Это позволяет делать апи с минимально возможными издержками.
    С GraphQL же придется сильно запарится, чтоб вот те данные из разных таблиц дергались через JOIN, а не через N запросов с постобработкой.

    С другой стороны, если апи публичное, то общепринятые вещи типа GraphQL или REST будут предпочтительнее.
    Ответ написан
    1 комментарий
  • Как получить данные из emit во Vue 3?

    bingo347
    @bingo347
    Crazy on performance...
    Ответ написан
    Комментировать
  • Для каких примерно целей программисту нужен computer science?

    bingo347
    @bingo347
    Crazy on performance...
    Ну начнем с того, что computer science - это очень широкое понятие, которое включает в себя множество различных областей, как теоретических так и практических. Вопрос "нужен ли программисту computer science?" из той же оперы, что и "нужна ли программисту математика?", кому-то и арифметики хватает (а это тоже математика как не странно), а кому-то нужен углубленный бэкграунд в мат.анализе, тер.вере и мат.статистике. Так же и с computer science, кому-то хватит базового понимания, почему 0.1 + 0.2 != 0.3, а кому-то нужен углубленный бэкграунд в алгоритмы, в теорию типов и в слабые модели памяти. Все сугубо индивидуально и сильно зависит от сферы, для которой ведется разработка.
    Многим совсем не обязательно знать как реализуются те или иные алгоритмы или структуры данных, вполне можно пользоваться готовыми. Но вот иметь представление, какие вообще бывают алгоритмы и структуры данных, какая у них алгоритмическая сложность - это полезно всем, просто чтобы знать что гуглить и какие вообще есть возможности решить ту или иную задачу. Так же полезно уметь считать ту самую алгоритмическую сложность из составных частей произвольного алгоритма и понимать чем отличается нотация O-большое от нотации Ω-большое. Какая от этого практическая польза? Для самого программиста - это возможность решать задачи проще и быстрее, выдавая при этом более оптимальные решения. Для бизнеса - это деньги, от банального "ускорив некое действие в N раз мы повысили конверсию в M раз", до насущного "сократив потребление ресурсов на N в прошлом месяце мы заплатили за облако на M млн. рублей меньше в этом месяце при той же нагрузке".
    Та же архитектура, всем не обязательно уметь строить огромные решения с запасом прочности на десятки лет. Но понимать базовые принципы и паттерны, какие у них плюсы и минусы, где и что применять - полезно. К сожалению здесь все плохо в большинстве своем, порой доходит до того что стоимость поддержки небольшого проекта вырастает в 300-500 раз всего лишь за год поддержки. Для бизнеса это опять таки деньги, и если бизнес не планирует через год-другой либо продаться либо свернуться, как делают многие стартапы, то бизнес будет это оптимизировать. А на программистах такая оптимизация скажется на прямую, те кто умеет писать код на года будет получать выше рынка, иногда значительно. Хотя и те кто вообще в архитектуре не шарит без работы не останутся, так как работодателей с принципом "продали и забыли" просто банально больше.
    Ответ написан
    Комментировать
  • В чем ошибка с типами User?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    useState<User[] | null>(null);
    Здесь Вы пишите, что в стейте у Вас либо null либо массив юзеров.
    const _user = (await response.json()) as User;
    setItem(_user);
    а здесь Вы уговорили TS что ответ - это 1 юзер и пытаетесь передать его в стейт.

    interface IUserInfoProps {
      user: User;
    }
    а вот здесь у Вас компонент так же принимает только одного юзера, но передаете Вы ему
    <UserInfo user={item} />
    значение из стейта с типом User[] | null
    Ответ написан
  • Как Vue JS находит зависимости computed?

    bingo347
    @bingo347
    Crazy on performance...
    Все реактивные свойства объекта Vue оборачивает в геттеры и сеттеры.
    Computed - это тоже по сути геттер, правда Vue его еще и своим кодом оборачивает.
    Перед кажым запуском computed Vue помещает в особую переменную функцию для инвалидации текущего computed, а перед выходом восстанавливает значение, которое там было до.
    Каждый геттер вызванный внутри computed просто запоминает себе в массив функцию инвалидации, а в сеттере дергает ее, сообщая тем самым computed свойству, что его зависимость изменилась.
    Это очень упрощенная схема, так как на деле все немного сложнее. Но в общих чертах, Vue просто знает какие геттеры были вызваны при последнем вызове computed и при вызове соответствующих этим геттерам сеттеров пересчитывает computed.
    Ответ написан
  • Как заставить вебпак делать стили в виде .css, а не .js?

    bingo347
    @bingo347
    Crazy on performance...
    "style-loader", // 3. Inject styles into DOM
    вот тут тоже должен быть MiniCssExtractPlugin.loader
    Ответ написан
  • Безопасно ли хранить токен в Session Storage браузера?

    bingo347
    @bingo347
    Crazy on performance...
    HttpOnly Cookie доступна только серверу, который доступен по домену, который прописан в этой куке и никому больше.
    Storage доступен любому скрипту на странице. Соответственно содержимое Storage может угнать любой скрипт подключенный извне.
    Ответ написан
    Комментировать
  • Как использовать winapi в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    Ответ написан
    Комментировать
  • 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 комментарий