Задать вопрос
  • Как правильно создается и поддерживается архитектура для микро сервисов?

    Если я правильно понял, то в микро сервисной архитектуре у каждого сервиса должен быть свой репозиторий

    Нет, не должен. Код может быть организован так, как это будет удобнее для людей, которые будут эти микросервисы поддерживать.

    Но как быть с задачами, когда она касается клиентского сервиса и одного из серверов?

    Это две разные задачи: одна на сервер и одна на клиент.
    API должен быть спроектирован так, чтобы сервер был обратно совместим с клиентом.
    Если всё-таки клиент и сервер должны будут обновляться одновременно, то тогда нужно координировать релизы - опять же к веткам в репозитории никакого отношения не имеет.
    Ответ написан
    Комментировать
  • Как найти те коммиты в которых фигурирует изменение ключевого слова?

    А зачем искать «во всех ветках»? Вам же нужно понять, откуда оно в текущей версии появилось. Следовательно, можно просто через blame найти последнее изменение и дальше по истории. Может, коммиты из других веток попали, тогда на них и переключайтесь.
    Ответ написан
    Комментировать
  • Как найти те коммиты в которых фигурирует изменение ключевого слова?

    Lynn
    @Lynn
    nginx, js, css
    Можно отфильтровать историю по коммитам в которых в изменениях встречается это слово
    git log -S user.access

    https://git-scm.com/docs/git-log#Documentation/git...
    Ответ написан
    Комментировать
  • Как найти те коммиты в которых фигурирует изменение ключевого слова?

    @fregate
    Пишу, думаю
    Или гит биссект, если предыдущие методы не помогли. Если известна точка, когда все работало правильно
    Ответ написан
    Комментировать
  • Как получить промежуточное значение между двух слов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Без регулярки:
    const url = 'www.site.ru/users/agent/512/list/france';
    const parts = url.split('/');
    const agentIndex = parts.indexOf('agent');
    const value = parts[agentIndex + 1];
    console.log(value); // 512

    с регуляркой:
    const url = 'www.site.ru/users/agent/512/list/france';
    const match = url.match(/\/agent\/(\d+)\/list/);
    const value = match ? match[1] : null;
    console.log(value); // 512
    Ответ написан
    Комментировать
  • Как вернуться к текущей ветке после git reset HEAD~1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    посмотреть в git reflog, сделать git reset <commit> с нужным хешем. Если с момента выполнения git reset HEAD~1 не было больше никаких reset/checkout, это можно записать как git reset HEAD@{1}.
    Ответ написан
    Комментировать
  • Возможно написать авто бота или кликер на JavaScript под онлаин игры по типу WoW или Lineage 2?

    TrueBers
    @TrueBers
    Гуглю за еду
    JS -- встраиваемый язык. Ему нужна среда для запуска сначала какая-то. Вам нужно сначала написать системные низкоуровневые функции, а потом уже через рантайм встроить их в JS.
    Одни словом, это бесполезная трата времени и сил. Проще написать на нормальном, для этого предназначенном языке, а не городить из говна и палок.
    Ответ написан
    Комментировать
  • Возможно написать авто бота или кликер на JavaScript под онлаин игры по типу WoW или Lineage 2?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    В онлайн играх применяются и постоянно обновляются различные механики и даже шифрование против рерверсинга клиента, написания и применения ботов, кликеров и прочего. Да, такого бота вполне возможно написать и на JS, но вот от задач обратной разработки игрового клиента и написания низкоуровневого кода на ассемблере и C/C++ вас это не спасёт. Это всё равно придется делать. И даже добавит веселья при переносе/конвертации данных между разными ЯП. Кроме того, JS - язык интерпретируемый, хоть он и обладает достаточной производительностью, он может и, скорее всего, станет узким местом в боте, которое будет не успевать за работой игрового клиента или банально не хватит скорости работы при обработке больших массивов памяти (например анализ изображения в реальном времени или сканирование памяти приложения в поисках нужных данных).
    Типовые инструменты разработчика ботов - это WireShark и другие снифферы трафика, различные утилиты для исследования и дизассемблирования скомпилированного кода типа IDA, Resource Hacker и прочее, а так же различные среды разработки, в зависимости от индивидуальных предпочтений. Вообще, софта для реверсинга много разного и всякого для различного рода задач.
    Ответ написан
    Комментировать
  • Почему нет выбора максимальной частоты экрана?

    @Drno
    Для игр нормально такое. Можно попробовать убрать верт синхронизацию и перевести игру в оконный режим. Так же убрать «снижение фпс при сворачивании» если оно есть в настройках игры
    Ответ написан
    Комментировать
  • Почему нет выбора максимальной частоты экрана?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Потому что для использования максимальной частоты экрана, нужно чтобы видеокарта могла поддерживать такую частоту на заданном разрешении, и чтобы у кабеля хватало пропускной способности для такой частоты на данном разрешении.

    Между прочим hdmi 2.1 - это вообще-то не то, что используют для высоких частот. 120 он тянет, 144 я уже даже сомневаюсь.
    Обычно для таких вещей уже используют displayport
    Ответ написан
    Комментировать
  • Как в зависимость useMemo добавить условие?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    const state = useMemo(() => {
        return Math.floor(Math.random() * 100)
    }, [value === 0 ? 0 : 1])

    Но в данном случае будет всё равно два варианта: ноль и не-ноль.

    Вы, очевидно, неправильно используете useMemo, но что нужно использовать вместо него по такому описанию задачи сказать нельзя.
    Ответ написан
    7 комментариев
  • Как переключаться между разными версиями Postgres?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На Debian-based дистрибутивах (Ubuntu, Debian, etc) есть утилита pg_ctlcluster - с помощью нее можно управлять несколькими инсталляциями postgres одновременно, учитывая версии/название кластера.
    Например, так можно
    # Запуск кластера 15 версии
    pg_ctlcluster start 15 main


    Для того, чтобы они запускались одновременно, то можно использовать разные порты - чтобы запускались на разных портах. Например, 15 версия на 5432 порту, а 13 - на 5433.
    Это сделать можно либо через postgresql.conf - конфигфайл, ищи port. Изначально он такой:
    #port = 5342                      # (change requires restart)


    раскоментируй и выстави свое значение. Подсказка - он скорее всего в директории /var/lib/postgresql//, например, /var/lib/postgresql/13/main/postgresql.conf

    Для подключения просто передай psql нужный порт:
    psql -p 5432 # 15 версия
    psql -p 5433 # 13 версия
    Ответ написан
    2 комментария
  • Как переключаться между разными версиями Postgres?

    @Everything_is_bad
    Они будут запущены на разных портах, при подключении явно укажи порт. Домашнее задание - "узнать другой порт", начнем приучать тебе к самостоятельности, раз бегаешь сюда с элементарными вопросами.
    Ответ написан
    6 комментариев
  • Как реализовать идеальный метод indexOf?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вы неверно понимаете суть О-нотации. Почитайте книги Дональда Кнута про это.
    O(3) - это то же самое, что O(1). Нет разницы. O(N), O(N+1000), O(10*N) - это тоже одно и то же.
    В таких случаях речь всегда идёт не про конкретный кейс, а про обобщенный. Вы не знаете в каком порядке элементы вашего массива, где находится искомый, сколько всего элементов будет в конкретных кейсах, поэтому определяется ряд случаев: средний (по вероятности, если входные данные рандомные), худший (чтобы понимать границы и сколько может "висеть" алгоритм теоретически). Лучшие варианты обычно никого не интересуют, потому что и вероятность их мала, и смысла никакого нет в столь малых величинах.

    У вас типичный случай компромисса в реализации структуры данных. Вы всегда балансируете между памятью и скоростью. Больших семь шапок из овцы не выкроить никак.
    То есть, вы можете сделать такую структуру данных, которая "под капотом" будет держать древовидный индекс с данными или отсортированную по ключу карту значений для бинарного поиска. Хотя эти варианты - суть одно и то же.
    Если не рассматривается вариант размена производительности на память, то в этой задаче у вас будет только O(N) без вариантов.
    Если усложнить структуру данных, то можно добиться и O(logN) при поиске, и даже O(1). Почитайте как устроен словарь в питоне.

    Да, помимо сложности поиска у вас будет сложность вставки в структуру новых элементов. И тут опять трейд-офф. Ну а что вы хотели?
    Ответ написан
    3 комментария
  • Почему корень в JS это null, а не Object.prototype?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Комментировать
  • Почему корень в JS это null, а не Object.prototype?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    А вообще ваш вопрос немного интереснее, чем кажется на первый взгляд).

    Спецификация ES описывает и значение null, и тип Null:


    null & Null
    4.4.15 null value
    primitive value that represents the intentional absence of any object value

    4.4.16 Null type
    type whose sole value is the null value


    То есть в логике спецификации вывод

    console.log(Object.getPrototypeOf(Object.prototype));
    // выводит null


    Следует читать не как "прототип объекта Object.prototype - это/равен null", а "у объекта Object.prototype прототип отсутствует (намеренно не задан)".
    Ответ написан
    3 комментария
  • Какую сложность алгоритма мы получаем при суммировании выборки из начал массива?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Каждый shift сдвигает все элементы массива, т.е. один shift - O(N), а весь обход - O(N^2)

    не используй его в цикле, если у тебя длинный массив
    Ответ написан
    7 комментариев
  • Из-за чего инкрементация в for и while срабатывает по разному?

    Обратите внимание на конструкцию for.
    Вы не замечаете, что выражения между скобками разделены не запятой, как, например, в аргументах функции, а точкой с запятой?

    Так создатели языка как бы намекают нам, что тут что-то не так, как обычно, что эти выражения выполняются в разное время, на разных этапах прохождения цикла.

    Уяснив этот момент, можно пойти в документацию, прочитать там все, а особенно обратить внимание на табличку, где расписано, когда именно выполняется каждая составная часть цикла for. И тогда вам всё станет гораздо понятнее.
    https://learn.javascript.ru/while-for

    Советы:
    1. Всегда читайте документацию, если вам что-то не понятно в конструкциях языка. Не туториалы от балбесов с Ютуба, а документацию. И желательно оригинальную на английском, потому что переводчики иногда такие же балбесы.

    2. Не используйте никаких циклов, кроме for. Он очень мощный и позволяет реализовать функциональность и while и do-while. Так вы убережёте себя от таких ситуаций. Я за много лет работы понял, что большое количество конструкций языка скорее вредно, чем полезно.
    Ответ написан
    2 комментария
  • Как в map вернуть развернутый массив?

    обязательно надо через map ? Без него всё тривиально:
    func = function (arr) {
        return [].concat( ...arr );
    };

    А с ним какой-то выверт получается:
    func = function (arr) {
        let tmp = [];
        return arr.map( (item => tmp = tmp.concat(item)) ).pop();
    };
    Ответ написан
    Комментировать
  • Как составить дерево из вложенных значений в скобки?

    Alexandroppolus
    @Alexandroppolus
    кодир
    конкретно в данном случае (только числа) можно воспользоваться парсингом JSON, предварительно доработав напильником строку
    const result = JSON.parse(
      '(1 (20 (400 5 60 (700) 108 (90)) 3))'
      .replaceAll('(', '[')
      .replaceAll(')', ']')
      .replace(/(\d|\])(?=\s+\d|\s*\[)/g, '$&,'));


    ----
    ну а если по-честному, то надо обходить строку, и либо рекурсией, либо со стеком.

    Примерно так:
    код внутри
    function getTree(str) {
        const tokens = str.match(/\d+|[()]/g);
    
        const stack = [];
        let currentArr = null;
    
        for(let i = 0; i < tokens.length; ++i) {
            const token = tokens[i];
            if (token === ')') {
                if (!stack.length) {
                    return currentArr;
                }
                currentArr = stack.pop();
            } else if (token === '(') {
                const newArr = [];
                if (currentArr) {
                    currentArr.push(newArr);
                    stack.push(currentArr);
                }
                currentArr = newArr;
            } else {
                if (currentArr) {
                    currentArr.push(parseInt(token));
                }
            }
        }
        return currentArr;
    }
    
    const result = getTree('(1 (20 (400 5 60 (700) 108 (90)) 3))');


    Сначала парсим строку, получаем токены, в нашем случае это скобки и числа. Обходим токены, имея на руках стек и текущий массив. Если очередной токен - число, добавляем его в текущий массив, если открывашка, то создаем новый массив, добавляем его в текущий, потом текущий кладем в стек, а новый назначаем текущим. Если закрывашка, то забираем массив из стека.
    То же самое можно сделать через рекурсию, попробуй сам, если интересно.
    Ответ написан
    4 комментария