Задать вопрос
  • Как получить данные с контейнера Postgresql в код бота C#?

    Никакого "коннекта к контейнеру" прописывать не нужно.
    Если у тебя настроена сеть в docker compose, то всё и так должно работать.
    Подключайся сразу к постгресу
    Ответ написан
  • Как правильно добавить взаимодействие с сервисом на Rust через MassTransit?

    vabka
    @vabka Куратор тега Rust
    Вроде пишут, что формат сообщений предопределён:
    https://stackoverflow.com/questions/49558358/masst...

    Раз так, то берёшь serde, amqprs и пишешь
    Ответ написан
  • Ошибка при открытие проекта на asp.net mvc в Visual Studio, как исправить?

    Судя по использованию System.Data.Entity и owin - проект духом явно старше, чем 2021.
    Это раз :)

    Два - у тебя не установлен .net Framework devpack - узнавай на какую версию нацелен этот проект и устанавливай.
    Я бы попробовал 4.6
    Ответ написан
    Комментировать
  • Есть ли язык программирования с GC, но в котором сложно восстановить исходный код?


    а в Java или C# он практически в открытом виде, почему так?

    Потому что у C# и Java есть ещё одно важное свойство: у них есть виртуальная машина и они компилируются сначала в промежуточный код. А в машинный уже делается через JIT-компиляцию.

    C# с недавнего времени поддерживает ещё и FullAOT - в таком режиме тоже код будет нечитабельный/нативный, как и в случае с Go.

    Есть ещё F# из мира дотнета, который хоть и компилируется в промежуточный код, но там компилятор такой код генерирует, что в принципе это не далеко от обфускации будет.


    Вот например в Go или Haskell не посмотришь исходный код

    Если ты уже нашёл ответ на свой вопрос, то зачем задаёшь?
    Ответ написан
  • Возможно ли использовать esp32+nrf24l01 в качестве репитера для передачи wi fi сигнала с эхолота?

    1. Не факт, что у nrf-ки радиус действия будет больше, чем у встроенной антенны эхолота
    2. Не факт, что esp32 в принципе на такое способна - нужно по факту прозрачно повторить весь wifi-сигнал, чтобы подключение к повторителю выглядело идентично подключению к самому эхолоту, как со стороны приложения, так и со стороны эхолота.

    3. Скорее всего, замена антенны на эхолоте будет эффективнее.

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

    vabka
    @vabka Куратор тега Веб-разработка
    Начнём с того что то что у тебя - это какие-то непонятные фигуры и стрелочки которые отражают непонятно что и непонятно зачем и для кого.

    А в реальном мире уже всё давно придумано:

    • Sequence diagram, если хочешь показать, в каком порядке и куда пойдут данные
    • Use case diagram, если хочешь показать варианты использования твоей системы разными авторами.
    • Нотация C4, если хочешь деконструировать свою систему.
    • Целая куча других диаграмм в рамках стандарта UML.



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

    Вот пара примеров диаграмм, как бы ты мог всё изобразить:
    Картинки

    Sequence:
    6466fad769376519395834.png
    Ответ написан
    2 комментария
  • Как заменить строку в скомпилированном .exe?

    Если строка длиннее - тогда всё что находится после такой строки будет сдвинуто и тогда поедут все указатели.
    Если строка короче, но ты не удалял байты, а просто занулил их - должно работать, но может быть нюанс:
    1. Строка может храниться не просто как её байты, а как длина + байты. Тогда тебе длину тоже надо поправить (например если это не си, где строки нуль-терминированные)
    2. Тк строка эта константная - компилятор может при компиляции заинлайнить все проверки на длину, да и саму длину тоже.

    Именно по этому нельзя менять длину строки. Ни в байтах, ни в символах.

    В теории, программа может поломаться даже если ты поменяешь, например, текст на английском на текст на русском, если используется utf-8, тк разработчик, надеясь на то что строка его неизменна, может заслайсить такую строку по байтам, тк он знает точное расположение каждого символа, а после твоей манипуляции получится невалидный utf8, из-за которого может поломаться в другом месте, где эта валидность проверяется.
    Ответ написан
    Комментировать
  • Программа не работает так, как должна (ошибки в логике, которые не могу найти)?

    Ты не сказал, как именно ошибка проявляется, так что сложно сказать.

    ошибки в логике, которые не могу найти

    Для этого:
    1. Рефактори код, чтобы с ним легче было работать.
    2. Покрывай код автотестами
    3. Тестируй нормально, а не наобум, чтобы понятно было, как проявляется ошибка, какое поведение ты ожидал от программы, а какое фактически произошло.
    Ответ написан
    5 комментариев
  • Как дать WSL2 больше процессора?

    1. Ты можешь при помощи команды wsl залезть непосредственно в тот WSL-образ, который используется докером.
    Там в /etc есть ещё один wsl.conf, в котором параметры из .wslconfig могут переопределяться.

    2. После изменения настроек нужно остановить WLS при помощи команды wsl --shutdown и подождать какое-то время.

    3. Если у тебя Pro-версия винды, то ты можешь через Hyper-V посмотреть, какие реально настройки по ресурсам выделены на виртуалку с WSL2
    Ответ написан
    Комментировать
  • Можно ли отключить LED-индикатор веб-камеры ноутбука?

    Зависит от конкретного ноутбука.
    Где-то этой лампочкой можно управлять программно (например она управляется чипом в камере), а где-то она включена в электрическую цепочку так, что если лампочка не горит - камера тоже не работает.

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

    Мне кажется, такой вариант вам может подойти:
    function generateJsonPatch(obj1, obj2) {
      const patch = [];
    
      // Рекурсивно обходим все свойства первого объекта
      for (const prop in obj1) {
        if (obj1.hasOwnProperty(prop)) {
          // Если свойство отсутствует во втором объекте, удаляем его
          if (!obj2.hasOwnProperty(prop)) {
            patch.push({op: "remove", path: `/${prop}`, oldVal: obj1[prop]});
          } else {
            // Если свойство является объектом или массивом, рекурсивно обходим его
            if (typeof obj1[prop] === "object") {
              patch.push(...generateJsonPatch(obj1[prop], obj2[prop]).map(p => {
                p.path = `/${prop}${p.path}`;
                return p;
              }));
            } else {
              // Если значение свойства отличается от значения во втором объекте, обновляем его
              if (obj1[prop] !== obj2[prop]) {
                patch.push({op: "replace", path: `/${prop}`, value: obj2[prop], oldVal: obj1[prop]});
              }
            }
          }
        }
      }
    
      // Обходим свойства второго объекта, которых нет в первом объекте
      for (const prop in obj2) {
        if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
          // Добавляем новое свойство
          patch.push({op: "add", path: `/${prop}`, value: obj2[prop], oldVal: undefined});
        }
      }
    
      return patch;
    }

    Вот что он выдаёт в вашем случае:
    [ { op: 'replace', path: '/colorQty', value: 1, oldVal: 0 } ]


    Код генерировал не я. Я попросил ChatGPT:
    prompt и оригинальный ответ



    Напиши функцию на javascript, которая принимает в себя два js-объекта или массива, на выходе я должен получить jsonpatch, который можно применить к первому объекту, чтобы получился объект идентичный второму

    ... вариант без oldValue ...

    добавь ещё в каждую операцию jsonpatch и старое значение, чтобы при чтении было понятно, что на что заменяется

    Вот обновлённый код функции generateJsonPatch с добавлением старого значения в каждую операцию jsonpatch:

    function generateJsonPatch(obj1, obj2) {
      const patch = [];
    
      // Рекурсивно обходим все свойства первого объекта
      for (const prop in obj1) {
        if (obj1.hasOwnProperty(prop)) {
          // Если свойство отсутствует во втором объекте, удаляем его
          if (!obj2.hasOwnProperty(prop)) {
            patch.push({op: "remove", path: `/${prop}`, oldVal: obj1[prop]});
          } else {
            // Если свойство является объектом или массивом, рекурсивно обходим его
            if (typeof obj1[prop] === "object") {
              patch.push(...generateJsonPatch(obj1[prop], obj2[prop]).map(p => {
                p.path = `/${prop}${p.path}`;
                return p;
              }));
            } else {
              // Если значение свойства отличается от значения во втором объекте, обновляем его
              if (obj1[prop] !== obj2[prop]) {
                patch.push({op: "replace", path: `/${prop}`, value: obj2[prop], oldVal: obj1[prop]});
              }
            }
          }
        }
      }
    
      // Обходим свойства второго объекта, которых нет в первом объекте
      for (const prop in obj2) {
        if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
          // Добавляем новое свойство
          patch.push({op: "add", path: `/${prop}`, value: obj2[prop], oldVal: undefined});
        }
      }
    
      return patch;
    }


    Каждая операция jsonpatch теперь содержит поле `oldVal`, которое хранит старое значение свойства, которое было изменено. Если свойство было удалено или добавлено, то `oldVal` будет иметь значение `undefined`.

    Пример использования:

    const obj1 = {a: {b: "hello"}, c: [1, 2, 3]};
    const obj2 = {a: {b: "world", d: "foo"}, c: [1, 2, 4, 5], e: "bar"};
    
    const patch = generateJsonPatch(obj1, obj2);
    
    console.log(patch);
    // Output:
    // [
    //   {"op":"replace","path":"/a/b","value":"world","oldVal":"hello"},
    //   {"op":"add","path":"/a/d","value":"foo","oldVal":undefined},
    //   {"op":"remove","path":"/c/2","oldVal":3},
    //   {"op":"add","path":"/c/3","value":5,"oldVal":undefined},
    //   {"op":"add","path":"/e","value":"bar","oldVal":undefined}
    // ]


    Обратите внимание, что поле oldVal в jsonpatch содержит информацию только о тех свойствах, которые были изменены или удалены. Если свойство не было изменено, то его oldVal будет иметь значение undefined.



    PS: сам удивился, на сколько он хорош в подобных задачах. Можно было бы написать и самому, точно также рекурсивно обойдя объекты, но эта шняга сэкономила достаточно много времени.
    Ответ написан
    3 комментария
  • Luajit и его портабельность?

    Все официально поддерживаемые платформы перечислены на официальном сайте проекта:
    https://luajit.org/install.html
    x86, x64, arm, arm64, ppc32, ppc/e500, mips32, mips64, risc-v (планируется)

    DynASM - это часть проекта luajit и вроде нет каких-то платформ, где он официально работает, но не работает luajit.
    Видел только всякие давно заброшенные эксперименты.
    Ответ написан
    Комментировать
  • Как сделать систему очков в телеграмм боте?

    Сохраняй в базу данных идентификатор члена группы и количество очков у него.
    При наступлении события, когда надо количество очков изменить - изменяй.
    Ответ написан
    Комментировать
  • Обязательно ли всем маршрутизаторам в сети иметь подключение в WAN порт, которое выходит в интернет?

    Не особо понимаю, так как в моей схеме 2 маршрутизатора и один имеет выход в интернет, нужен ли другому тоже? Будет ли он работать без него?

    Ну у тебя на схеме компьютер тоже напрямую в интернет не воткнут.
    Почему у тебя не возник такой вопрос по поводу роутера, но не возник по поводу компьютера?
    И зачем тебе два свича на схеме?

    Домашний "Беспроводной роутер" - это несколько устройств в одном:
    1. Роутер
    2. Коммутатор
    3. Точка доступа

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

    Если беспроводной роутер должен создать новую подсеть - настраивай его как обычно.

    Кабель от свича втыкай в WAN-порт в обоих случаях (как правило)

    В любой непонятной ситуации - читай мануалы. Если мануал противоречит ответу - верь мануалу.
    Перед тем как идти настраивать - проверь мануал.
    Ответ написан
  • Берут ли на работу в IT с психическим расстройством?

    1. Просто при найме на работу не болтай о своих диагнозах - это создаст лишнее предвзятое отношение, которое тебе точно не нужно.
    Благо при найме на работу справку от врача предъявлять не нужно ;)

    "ПРЛ" и "ОКР" для не-психиатра - это непонятные слова и это ожидаемо, что люди тут ориентируются на стереотипы.

    2. Если умственной работе это не мешает, приступы в середине рабочего дня у тебя не происходят, конфликтов с коллегами на этой почве у тебя не (можешь себя контролировать, помогает медикаментозная/поведенческая терапия или просто очень слабо проявляется), то всё будет ок.
    Если вас что-то беспокоит - лучше проконсультируйтесь со специалистом, а не с родственниками/знакомыми.

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

    можно что-то типа такого:
    SELECT d.id, name, p.type, pp.price_b, pp.price_c, pp.price_d FROM device d
    INNER JOIN (SELECT device_id, MAX(type) as "type" FROM price GROUP BY device_id) p ON p.device_id = d.id
    INNER JOIN price pp ON pp.type = p.type AND pp.device_id = d.id

    Но он не выдаёт товары без цены. Можно попробовать сделать LEFT JOIN, чтобы выводило товары без цены.

    Версия от ChatGPT

    Выглядит страшно, но работает
    SELECT d.id, 
        CASE 
            WHEN p3.type IS NOT NULL THEN p3.type 
            WHEN p2.type IS NOT NULL THEN p2.type 
            WHEN p1.type IS NOT NULL THEN p1.type 
        END AS type, 
        CASE 
            WHEN p3.type IS NOT NULL THEN p3.price_b 
            WHEN p2.type IS NOT NULL THEN p2.price_b 
            WHEN p1.type IS NOT NULL THEN p1.price_b 
        END AS price_b, 
        CASE 
            WHEN p3.type IS NOT NULL THEN p3.price_c 
            WHEN p2.type IS NOT NULL THEN p2.price_c 
            WHEN p1.type IS NOT NULL THEN p1.price_c 
        END AS price_c, 
        CASE 
            WHEN p3.type IS NOT NULL THEN p3.price_d 
            WHEN p2.type IS NOT NULL THEN p2.price_d 
            WHEN p1.type IS NOT NULL THEN p1.price_d 
        END AS price_d 
    FROM device d 
    LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d 
               FROM price WHERE type = 3) p3 ON d.id = p3.device_id 
    LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d 
               FROM price WHERE type = 2) p2 ON d.id = p2.device_id 
    LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d 
               FROM price WHERE type = 1) p1 ON d.id = p1.device_id

    Ответ написан
  • Как бесплатно разместить бота?

    В Яндекс облаке есть free tier для serverless containers - просто упаковываешь своего бота в docker-котейнер. Не помню сколько там CPU минут бесплатно даётся, но для чего-то мелкого должно хватить.

    Ещё где-то порядка 50 копеек в месяц нужно будет выложить за container registry (по началу)
    Ответ написан
    Комментировать
  • Как перевести значение "1 день" в секунды? А еще как перевести значение "1 день" например в 19.05.2023 1:42?

    Простейшая арифметика из третьего класса школы + немного гуглежа по поводу работы со временем в js.
    function getTimerEndFromNow(prompt) {
     return getTimerEndFrom(new Date(), prompt);
    }
    
    function getTimerEndFrom(start, prompt) {
      return new Date(start.valueOf() + getSecondsByPrompt(prompt) * 1000);
    }
    
    function getSecondsByPrompt(prompt) {
      const [count, measure] = prompt.split(' ');
      return count * getSecondsByMeasure(measure);
    }
    
    function getSecondsByMeasure(measure) {
      switch(measure.toLowerCase()) {
        case 'день': return 60 * 60 * 24;
        case 'час': return 60 * 60;
        case 'минута': return 60;
        default: throw new Error(`Unknown measure ${measure}`);
      }
    }


    С ЭТИМ БЛИН ДАЖЕ БЕСПЛАТНЫЙ БОТ НА ОСНОВЕ GPT СПРАВЛЯЕТСЯ

    Запрос:

    /gpt
    Мне нужно перевести значение "1 день"/"1 час"/"1 минута" в секунды для таймера. А точнее функция, но я вообще не знаю как это сделать. И еще одну функцию для того что бы например таймер получил сегодня а пишется во сколько он закончится, точнее например в 19.05.2023 1:42

    Напиши функции на js

    Ответ:

    Для перевода "1 день"/"1 час"/"1 минута" в секунды можно использовать следующую функцию:

    function convertToSeconds(time) {
      const timeArr = time.split(' ');
      const value = parseInt(timeArr[0]);
      const unit = timeArr[1];
    
      switch (unit) {
        case 'день':
          return value * 24 * 60 * 60;
        case 'час':
          return value * 60 * 60;
        case 'минута':
          return value * 60;
        default:
          return 0;
      }
    }


    Пример использования:

    const secondsInDay = convertToSeconds('1 день'); // 86400
    const secondsInHour = convertToSeconds('1 час'); // 3600
    const secondsInMinute = convertToSeconds('1 минута'); // 60


    Для форматирования даты в строку можно использовать объект `Date` и методы `getFullYear()`, `getMonth()`, `getDate()`, `getHours()`, `getMinutes()`, `getSeconds()`:

    function formatDate(date) {
      const year = date.getFullYear();
      const month = addLeadingZero(date.getMonth() + 1);
      const day = addLeadingZero(date.getDate());
      const hours = addLeadingZero(date.getHours());
      const minutes = addLeadingZero(date.getMinutes());
      const seconds = addLeadingZero(date.getSeconds());
    
      return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;
    }
    
    function addLeadingZero(value) {
      return value < 10 ? '0' + value : value;
    }


    Пример использования:

    const endDate = new Date(2023, 4, 19, 1, 42, 0);
    const formattedDate = formatDate(endDate); // '19.05.2023 01:42:00'


    Ответ написан
    7 комментариев
  • Как перевести деньги с иностранной карты на российскую?

    Можно на банковский счёт.
    Вроде с грузии в тинькофф должно нормально переводить денежки (спроси в поддержке на всякий случай, особенно по поводу комиссий).

    Ещё можно через p2p обменники.
    Сначала покупаешь монеты за деньги с payoneer или bank of georgia, а потом покупаешь рубли на тинькофф за эти моненты.
    Ответ написан
  • Что происходит с Xbox Series X?

    Диск медленный видимо.
    Например он может замедлиться из-за того что почти заполнен на полную.
    Емнип, из коробки в xsx SSD стоит не самый быстрый - можно попробовать заменить.
    Ответ написан
    Комментировать