• Можно ли приостановить функцию до "приёма сигнала"?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Сделать то можно, например так:
    const moveQueue = {
      queue: [],
      index: 0,
      create() {
        let endMoveCallback;
        // создаём висячий промис и присваиваем его разрешение в endMoveCallback
        const movePending = new Promise(resolve => endMoveCallback = resolve);
        // index чисто для лога
        endMoveCallback.index = this.index++; 
        // добавляем в очередь
        this.queue.push(endMoveCallback);
        // возвращаем проис ждущий вызова endMoveCallback
        return movePending;
      },
      last() {
        // забираем из очереди последнее добавленное
        return this.queue.pop();
      }
    }
    
    async function turn() {
      await startMove();
      await startShoot();
    }
    
    function startMove() {
      console.log('startMove', moveQueue.index);
    
      return moveQueue.create();
    }
    
    function endMove() {
      const activeMoveEnd = moveQueue.last();
      if (activeMoveEnd) {
    
        console.log('endMove', activeMoveEnd.index)
    
        activeMoveEnd();
      } else {
        onsole.error('`endMove` called when there are no active moves')
      }
    }
    
    function startShoot() {
      console.log('startShoot');
    }
    
    turn();
    setTimeout(() => endMove(), 1000)

    Но скорее всего у тебя что-то не то с архитектурой, и тебе лучше будет почитать книжки по геймдеву.
    Ответ написан
    Комментировать
  • Как в линукс проверить, запущено ли net приложение?

    jamakasi666
    @jamakasi666 Куратор тега Linux
    Просто IT'шник.
    Тупо при запуске программы создай /tmp/procname.pid в которой впиши pid .
    При запуске проверяешь наличие файла, смотришь в него и убеждаешься что по такому pid процесс живой.
    При закрытие программы удаляешь файл.
    Другими приложениями просто смотри наличии файла и то что процесс живой.
    Ответ написан
    2 комментария
  • Можно ли без Js сделать все остальные ссылки серыми при наведении на одну из них?

    develx
    @develx Куратор тега CSS
    Web developer
    Можно
    https://codepen.io/xdevelx/pen/rNoWmWX

    если устраивает поддержка браузеров :has

    Только почему меню без ссылок, зачем ему фиксированная ширина и grid-gap не во всех браузерах для display flex будет работать (для flex используйте gap). И зачем justify-content: space-between и gap одновременно?

    Вариант без :has по мотивам коммента Ankhena
    https://codepen.io/xdevelx/pen/dywOWJW

    Но в этом варианте, если навести курсор между пунктами меню, у всех пунктов цвет станет серым. А это косяк, хоть и небольшой.
    Ответ написан
    7 комментариев
  • Как правильно выбрать фреймворк и яп для проекта, если ты заказчик?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Никак. Выбор инструмента - это задача тимлида и/или техлида. Т.е. ведущего/главного разработчика, отвечающего за принятие ключевых технических решений. Ваша задача, как заказчика, четко оформить требования, ограничения и сформировать начальное ТЗ и описание, что вам требуется от проекта, прототипы интерфейса, например. Без вникания в технические детали. Т.е., "хочу чтобы были фичи такие-то и работил они так-то, ограничения такие-то, требования такие-то". Далее уже задача найти разработчика/команду с большим или достаточным для данного проекта опытом. Далее из начального ТЗ формируется полноценное техническое задание: описывается весь требуемый функционал, рисуется дизайн, прописываются требования, ограничения и прочие хотелки. И на основе ТЗ, тим/тех лид уже подбирает/подбирают наиболее оптимальные и конкретные инструменты и решения, основываясь на собственном опыте и знаниях для конкретно этой задачи. Например, если человек хорошо знает несколько разных инструментов и есть достаточный опыт их использования - он может реализовать проект используя любой из них как одинаково хорошо, так и одинаково плохо. У разных ЯП и фреймворков свои плюсы и минусы. Далее из ТЗ формируется более детальное ЧТЗ и происходит разработка проекта.

    Вот вы говорите:
    Нужно будет выполнять много запросов к БД

    Важная быстрая скорость работы нашего сайта

    Много/быстро это сколько? 100 запросов в час? 1000 в минуту? 1М в секунду? Загрузка страницы за 30/10/1с или даже 100мс? А к какой именно БД? Какая характеристика самих данных и какого типа запросы? На какое количество соединений? В каком регионе? Есть ли там тяжелые или еще какие-то вычисления? Медиа файлы - картинки, видео? Тут очень много нюансов. В идеале следует определиться с конкретными значениями/параметрами и их описать в ТЗ. Ну или определить примерное, а фактическое значение определить на стадии прототипа/MVP и/или провести какое-то исследование/тестирование. Можно потратить десяток лямов на написание крутого кода на го/расте/С++/ассемблере в течении года и все будет летать на простейшем сервере. А можно купить свой сервер за лям (ну, условно, конечно), нанять питонщика или PHP-ника за 300к и он за пару-тройку недель добьется такого же результата. Большинство веб-задач сегодня достаточно просто или с минимальными усилиями решаются абсолютным большинством решений для веба. Да, у всех решений есть свои плюсы и минусы.

    Безопасность от всяческих XSS и SQL атак.

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

    А так - уже правильно посоветовали сразу брать дот-нет, т.к. у вас требование к использованию конкретной библиотеки для дот-нета.
    Ответ написан
    1 комментарий
  • В чем отличие ngnix от golang?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На самом деле эта путаница по-человечески очень понятна и объяснима.
    Вы, как фронтендер, воспринимаете "веб-сервер" как такой черный ящик, "то место, откуда фронт запрашивает данные".

    В то время как этот термин может означать несколько разных понятий.
    1. Веб-сервер в вашем, широком понимании. Бэкенд целиком.
    2. Также веб-сервером может называться и сам компьютер, на котором все это крутится.
    3. В более узком смысле - это программа, которая принимает НТТР запросы. Вот это nginx и есть. Но сам по себе, без помощи других программ, он не может полностью представлять услуги веб-сервера. Например, в нем нет базы данных. Это, скорее, как правильно написали в соседнем ответе - такой прокси-сервер, который частично обрабатывает запросы сам (например к статическим файлам), а частично - проксирует запросы на другие программы.

    И вот на Го (или РНР, Питоне, JS, C#) как раз и пишется эта программа, которая, к примеру, обращается в БД, получает нужные данные и отдает их Nginx-у, который уже и возвращает их клиенту
    Ответ написан
    14 комментариев
  • Нужно ли писать суффиксы литералов?

    @res2001
    Developer, ex-admin
    Однако с точки зрения оптимизации, эстетики и/или стандартов, как писать все-таки лучше

    Как хотите.

    На самом деле опциями компилятора можно задать выдавать предупреждения (или даже ошибку) на подобное не явное приведение типов. Тогда это будет "не красиво" или даже вообще ошибка компиляции, и тут вам придется исправлять ситуацию добавив суффикс.
    Но подобные опции используют не часто. На сколько помню для gcc это опции -Wsign-conversion и/или -Wconversion но могу ошибаться. И, по моему, они даже не включаются через -Wall -Wextra -pedantic - обычно используют этот набор опций, когда хотят заставить компилятор выполнять больше проверок кода.
    Немного модифицировав опции можно добиться не предупреждения, а ошибки.

    Если вы пишите исполняемый файл, то вы контролируете опции сборки в makefile (или чем вы там пользуетесь) и вас этот вопрос может не парить вообще.
    Если вы пишете библиотеку, которую распространяете в исходниках, то есть вероятность, что пользователь при сборке захочет добавить своих опций и тогда ошибки/предупреждения могут проявится. Можете расставить суффиксы для обхода потенциальных проблем, а можете забить и оставить на усмотрение конечного пользователя библиотеки.
    Ответ написан
    Комментировать
  • Почему в linux подобных системах нет привычных установщиков программ?

    @pfg21
    ex-турист
    все есть :)
    те же deb rpm и иже с ними есть аналог msi (точнее наоборот :) сколь знаю в msi аккурат и слизали систему пакетов линухи)
    пример выкладывания в виде отдельного пакета rclone

    exe -установщики есть и много, к примеру https://makeself.io
    пример самоустанавливающегося исполняемого файла под линуху смотри в virtualbox ссылка ​All distributions

    просто это неудобно и топорно :)
    гораздо эффективнее сформировать репозиторий в формате соответствующей системы, который можно подключить и автоматически устанавливать все обновления ПО в родном менеджере пакетов.
    пример стороннего репозитория для разных менеджеров смотри в nginx. при этом вся доставка автоматизирована и подписана ключами команды nginx - левак не проскочит.

    а вот систему сторонних репозиториев некрософтеры так и не стырили, а зря.

    многие поступают более хитро, установленный с оф.сайта deb пакет chrome установит в систему ссылку на репозиторий гугла и ключ подписи в систему. и последующие обновления менеджер будет брать с репозитория гугла.

    в *никсе все привыкли к репозиториям - они удобнее и на порядок защищеннее скачиваний exe-шников инсталяков. потому отдельных exe-шников практически нет - они не нужны.
    Ответ написан
    3 комментария
  • Почему в linux подобных системах нет привычных установщиков программ?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Чтобы отсеивать любителей ШИНДОВС ))

    А если серьёзно, то программы прекрасно ставятся из того же *.deb файла, типа *.exe в ШИНДОВС.
    Ответ написан
    4 комментария
  • Как правильно типизировать переменную?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Поменяй: props.item.office на 'office' in props.item.
    Ты не можешь обращаться к свойству которого нет сразу во всех типах union'a. Но ты можешь проверить его наличие, а дальше ts, в зависимости от результата, сузит тип до того, в котором оно присутствует.
    Ответ написан
    Комментировать
  • Как можно, и вообще можно ли хранить фото и видео в базе данных mongo?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если человек ничего не понимает в какой-то теме, он никогда не должен выступать с заявлениями вида "у меня возникла потребность". Потому что такие заявления базируются не на реальных потребностях, а на неграмотности, фантазиях и путанице в голове. И получаются вопросы вида "У меня возникла потребность забивать гвозди микроскопом. Я обыскал весь интернет но ничего понятного не нашел, только понял то что это делается на кухне. "

    Вместо таких заявлений он должен подробно изложить исходную задачу.
    Про которую ему подробно расскажут, как её решать нормально.

    Хранить фото и видео в БД - это как надевать штаны на голову.
    Хранить фото и видео в монге - как надевать на голову помойное ведро.

    Файлы надо хранить в файловой системе.
    Структурированные данные надо хранить в Базе Данных.
    Монгу не нужно использовать ни для чего. Это вообще не база данных, а просто хранилище по типу "куча мусора", которое используется исключительно в стильных модных молодёжных стартупах, в которых не нашлось ни одного специалиста по базам данных. Это была тупиковая ветвь, поднявшаяся на отсутствовавшей на тот момент поддержке JSON в базах данных и хайпе
    Ответ написан
    1 комментарий
  • Как можно, и вообще можно ли хранить фото и видео в базе данных mongo?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Попробую объяснить плюсы и минусы хранения файлов в БД.

    Плюсы:
    * 1 точка бэкапа - база данных
    Минусы:
    * огромный размер бэкапа, долгое время его создания, долгое время восстановления из него
    * картинки кэшируются в горячем наборе страниц бд и вытесняют данные, то есть не эффективно используется память, да и данные не используются оптимально
    * постоянная нагрузка на процессор и дисковую систему для преобразования из набора байтов в файл
    * веб сервер не может закэшировать этот результат
    * веб сервер не может просто стримить этот файл, так как файла нет
    * больше дискового пространства
    Ответ написан
    Комментировать
  • Может ли Раст полноценно заменить Джаву в сфере финансовых технологий?

    vabka
    @vabka
    Токсичный шарпист
    На Java пишется очень много разных вещей, в тч не требовательных к утилизации ресурсов и задержкам так что предположу, что многие вещи просто нецелесообразно переписывать.

    Кроме Java в финтехе вообще много разных языков используется. Даже такая экзотика как Haskell и F# бывает.

    Могу сказать, что сейчас работаю в большой корпорации и мы как раз пишем на Rust штуки, которые отвечают за работу с платёжными системами.

    Раньше примерно то же самое писалось на плюсах.

    На Java такое не писалось, тк авторизация транзакций должна меньше чем за секунду происходить после того как покупатель приложил карту к терминалу, и при этом нужно много разных проверок произвести.
    При этом многомиллионную ораву клиентов спокойно обслуживает не самый мощный сервер (емнип всего 32гб оперативки) с минимальным количеством сбоев.
    Ответ написан
    5 комментариев
  • Получаю в ответе NaN, хочу не Nan. Как исправить?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Первый и самый важный шаг вы сделали — идите дальше. Смотрите что у вас в document.getElementById('id').value, потом что в document.getElementById('id'), если в value пусто.
    Это называется "отладка" или "дебаг" и это примерно половина работы программиста.

    выводит новую форму
    Вангую, что в итоге у вас куча одинаковых форм и, соответственно, куча инпутов с id="id", что, естественно, недопустимо.
    Ответ написан
    1 комментарий
  • Как найти работу со сложными и комплексными проектами если нету опыта работы в таких проектах?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    У большинства программистов первое рабочее место - это унылая маленькая компания с примитивными технологиями и простыми задачами. Следующая работа немного лучше. Следующая ещё лучше. И так пока не заберëшься на максимально доступную тебе высоту. Потолок и скорость развития у всех разные, зависят в основном от того, на сколько сильно стараешься. Некоторые так никогда и не выбираются из эникейщиков и крутильщиков cms'ок. Немало тех, кто выбирается лет десять.
    Ответ написан
    Комментировать
  • Не работает простой код хотя он правильный в чем может быть проблема?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Цифр больше 9 в десятичной системе не бывает.
    А ваш код выдаёт числа от 1 до 10, как вы в нём и написали.
    Ответ написан
    1 комментарий
  • Как сделать явное применение блокировок на уровне строк?

    petermzg
    @petermzg
    Самый лучший программист
    select for update
    Ответ написан
  • Как получать в переменную значение из консоли и буфера обмена?

    vabka
    @vabka
    Токсичный шарпист
    Это уже и так из коробки работает в терминале. Не нужно усложнять своё приложение этим.
    Попробуй использовать shift+insert или ctrl+shift+v, если у тебя в терминале на ctrl+v пишется ^V.
    Либо посмотри настройки.
    Ответ написан
    Комментировать
  • Как накинуть условие на длину массива в типе?

    @StiflerProger
    export interface ContextMenuListProps {
        title?: string;
        items: [ContextItemsProps, ...ContextItemsProps[]];
    }


    playground
    Ответ написан
    3 комментария
  • Зачем нужен третий параметр array для обратной функции в forEach, map, filter...?

    @Kostik_1993
    Web Developer
    Когда вы используете только одну функцию то кажется что он не нужен. Но что будет если вы используете цепочку методов? К какому массиву вы будете обращаться например в фильтре после трансформации массива?
    arr.map(mapper).filter(filter).reduce(reducer)
    Ответ написан
    3 комментария