• Как правильно реализовать проверку соприкосновения координат у PictureBox'ов?

    ayazer
    @ayazer
    Sr. Software Engineer
    судя по тегу winforms - у ваших объектов уже есть координата вверхнего правого угла + размеры (т.е. высота и ширина). По сути - вам надо проверить не что совпадают 2 координаты, а что 2 прямоугольника (вокруг персонажа и вокруг пули) пересекаются.

    как вариант, можете взять https://github.com/MonoGame/MonoGame/blob/7b2d69d6... и подправить под себя. единственно различие - у вас вместо Rectangle будет какой-то PictureBox (честно, лет 10 не трогал винформс, не помню как оно называется там)

    UPD:
    public bool bulletBorderCheck(){
    
       return bullet.Location.X < character.Location.X + character.Width
          && character.Location.X < bullet.Location.X + bullet.Width
          && bullet.Location.Y < character.Location.Y < character.Height
          && character.Location.Y < bullet.Location.Y + bullet.Height
    
    }
    Ответ написан
    1 комментарий
  • Как вызвать все методы класса и передать параметр?

    ayazer
    @ayazer
    Sr. Software Engineer
    не совсем понимаю что вы пытаетесь решить, но в конкретно данном примере можно как-то так:

    class ReflectMethod
        {
            public static class Methods
            {
                public static void Bye(string parameter) => Console.WriteLine("Bye:parameter={0}", parameter);
                public static void Hello(string parameter) => Console.WriteLine("Hello:parameter={0}", parameter);
                public static void Welcome(string parameter) => Console.WriteLine("Welcome:parameter={0}", parameter);
            }
    
            public static void InvokeMethod(string[] array)
            {
                Type instance = typeof(Methods);
                MethodInfo[] methods = instance.GetMethods(BindingFlags.Static | BindingFlags.Public);
    
                var currentArgNumber = 0;
                foreach (MethodInfo method in methods)
                {
                    method.Invoke(instance, new[] { array[currentArgNumber++] });
                }
            }
        }
    Ответ написан
    Комментировать
  • Как организовать поиск по названиям продуктов, по части названия?

    ayazer
    @ayazer
    Sr. Software Engineer
    в принципе вариантов несколько тут: solr (который использует lucene), elastic (который использует lucene), lucene (и самому дописать весь функционал который добавляет elastic\solr) и внутренний полнотекстовый поиск в постгреса (когда нужен полнотекстовый поиск, но не настолько чтоб ради него поднимать solr/elastic).

    любой с этих вариантов умеет выполнять все пункты что вам нужны (т.е. нечеткий поиск, поиск по синонимам, ранджирование результатов и выставление весов)

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

    перепроверьте как вы запрос составляете. для solr я бы ожидал увидеть поиск по "греч*", для постгреса - поиск по "греч:*"

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

    словари с синонимами настраиваются везде

    проблема с ранжированием: хотелось, чтобы если искомое слово(или словоформа) ближе к началу строки(название продукта), то такой результат выше в поиске. Сейчас выходит как-то вперемешку: например, поиск по слову "гречневая"

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

    UPD: ну и таки да, в комментариях подсказывают что это решается и гуглить документацию по "TF-IDF"
    Ответ написан
  • Наткнулся на ошибочное поведение в регулярных выражениях?

    ayazer
    @ayazer
    Sr. Software Engineer
    нет, поведение абсолютно правильное. "/s" говорит что перенос строк будет матчится как ".", потому регулярка успешно матчит все после первого дива

    UPD: такое через negative lookahead достать можно
    (\bdiv\b.*)(?!.*\1)$ (! без /s флага)

    вернет нужное div></body></html>
    Ответ написан
    3 комментария
  • Как перед/после каждого теста вывести сообщение используя pytest?

    ayazer
    @ayazer
    Sr. Software Engineer
    самый простой способ:
    https://docs.pytest.org/en/stable/xunit_setup.html

    def setup_method(self, method):
        """ setup any state tied to the execution of the given method in a
        class.  setup_method is invoked for every test method of a class.
        """

    и дальше по списку.

    но идейно правильней будет все-же использовать fixtures.
    @pytest.fixture
    def my_service():
        # some setup logic
        service  = Mock()
        ...
        return service
    
    
    def some_test(my_service):
        ...
    Ответ написан
    Комментировать
  • Как преобразовать byte[] в List?

    ayazer
    @ayazer
    Sr. Software Engineer
    в формулировке "Как преобразовать byte[] в List?" это невозможно сделать однозначно т.к. нет информации ни про кодировку, ни про разделитель строк. Для ютф8 + системный перенос это будет выглядеть так:

    var arr = new byte[] { 50, 51, 52, 13, 10, 53, 54, 55};
    var s = Encoding.UTF8.GetString(arr);
    
    var sArr = s.Split(Environment.NewLine);


    но т.к. данные сериализованы - действительно нужно их просто десериализовать
    Ответ написан
    Комментировать
  • Как записать это в строку?

    ayazer
    @ayazer
    Sr. Software Engineer
    string gg = "{\"CGetSetLogType\":\"Manual\"}";
    Ответ написан
    4 комментария
  • Как можно сократить instance?

    ayazer
    @ayazer
    Sr. Software Engineer
    эм.. ну да

    var music = DataStorage.instance.AudioMusic;
    
    if (music.isPlaying){
       music.Stop();
    }


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

    public class DataStorage : MonoBehaviour{
      private AudioSource _audioSource;
    
      public static DataStorage instance;
    
      public AudioSource AudioMusic => instance._audioSource;
    
      ...


    и тогда использовать можно будет
    if (DataStorage.AudioMusic.isPlaying){
      DataStorage.AudioMusic.Stop();
    }
    Ответ написан
    4 комментария
  • Отключить предупреждение CS8618 для конструктора при инициализации через отдельную функцию?

    ayazer
    @ayazer
    Sr. Software Engineer
    используйте ! в каждом месте где вы уверены что нулла точно не будет (https://docs.microsoft.com/en-us/dotnet/csharp/lan...)

    upd: ну или явно помечать их через MemberNotNull, т.е.

    [MemberNotNull(nameof(_name))]
    private Init() {
    _name = string.Empty;
    }
    Ответ написан
    3 комментария
  • В чём принцип работы STUN?

    ayazer
    @ayazer
    Sr. Software Engineer
    tcp для p2p требует еще одного stun\turn\ice сервера для проведения хендшейка. иначе никак.

    чтоб было чуть понятней в чем проблема - если второй клиент за натом, то внутри адрес у него какой-то 192.168.22.88, а наружу он идет через нат с ипшником 172.22.20.20. проблема в том, что за этим натом может быть еще несколько сотень других компов, каждый с которых (снаружи) виден под этим ипшником. Именно по этой причине попытке законнектится к ипшнику вашего друга заканчивается провалом. нат просто не понимает что с этим запросом делать, потому отбрасывает его.
    Ответ написан
    2 комментария
  • Перенос таблиц из одной бд в другую в postgresql?

    ayazer
    @ayazer
    Sr. Software Engineer
    итак, вопрос на самом деле можно привести к "как построить процесс внесения изменений в базу, чтоб все случайно не угробить и не было больно".

    1. можно использовать тулзы для генерации дифоф а-ля https://github.com/djrobstep/migra

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

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

    3. в момент когда данных становится много - оно теряет актуальность т.к. на практике все миграции все-равно выполняется ручками (т.е. не запустил-и-забыл). (дальше мой опыт касается больше майскля, т.к. в постгресе у нас нет многотерабайтных таблиц) основная проблема тут - изменения таблицы = лок = аутейдж, чего допускать нельзя. потому для того, чтоб внести изменения - надо создать новую таблицу с новой схемой, перелить в нее все старые данные, синхронизировать все новые данные, поменять таблицы местами и дропнуть старую. тут помогает тулкит перконы и гитхаба (pt-online-schema-change и gh-ost), которые это все автоматизируют. Но обе они заточены под майскл, для постгреса надо искать и тестировать (ну или может кто-то уточнит)
    Ответ написан
    Комментировать
  • Алгоритм для минимизации стоимости товаров от разных поставщиков, какие ресурсы изучить?

    ayazer
    @ayazer
    Sr. Software Engineer
    угу. вы на своем примере поняли почему жадные алгоритмы не работают и практически пришли к branch-and-bound. "достаточно неплохое" решение можно получить эвристиками, лучшее - только перебором (правда, не полным, но иногда весьма длительным т.к. надо доказать что это действительно лучшее решение).

    у вас задача о рюкзаке (наполнить рюкзак необходимым кол-вом товаров при условии минимизации общей цены).

    вот тут я даже набрасывал пример решения такого типа задач с использованием готовых солверов (модель у вас другая, но принцип тот-же): Какие есть достойные альтернативы жадному алгоритму (greedy)?. По крайней мере там есть все ключевые слова чтоб понять что надо искать дальше

    (ну и да, это далеко не единственный способ решения, я просто ленивый и описать модель для мип солвера у меня выходит быстрее всего. Илья Николаевский и Сергей Соколов смогут еще много интересного добавить)
    Ответ написан
    Комментировать
  • Как к имени типа данных добавлять числа?

    ayazer
    @ayazer
    Sr. Software Engineer
    никак (если я правильно понял что вы хотите динамически имена переменных создавать). и есть подозрение что вам на самом деле надо вот это:
    https://docs.microsoft.com/en-us/dotnet/csharp/pro...
    Ответ написан
    1 комментарий
  • Название алгоритма для генерации не похожих смиволов?

    ayazer
    @ayazer
    Sr. Software Engineer
    вам нужен альфанумерик без похожих символов. например DEC Alphabet:

    A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V
    Ответ написан
    Комментировать
  • Как лучше приводить целое число к отрицательному дробному ((-1.0*x) или ((double)-x))?

    ayazer
    @ayazer
    Sr. Software Engineer
    чистая вкусовщина, разницы нет. я бы вообще
    -b / (2.0 * a)
    написал.
    Ответ написан
    Комментировать
  • Как найти повторяющиеся элементы в списке?

    ayazer
    @ayazer
    Sr. Software Engineer
    судя по описанию и тегам вопрос все-же "как найти индексы повторяющихся элементов используя linq"

    var lst = new List<int>() { 1, 2, 3, 5, 1, 6, 5 };
    
                var result = lst.Select((el, idx) => (el, idx))
                    .GroupBy(c => c.el)
                    .Where(g => g.Count() > 1)
                    .SelectMany(g => g.Select(c => c.idx).ToList())
                    .ToList();  // [0, 4, 3, 6]
    Ответ написан
    Комментировать
  • Docker как передать файлы с пк на docker через -v?

    ayazer
    @ayazer
    Sr. Software Engineer
    -v просто маунтит папку (а не копирует данные) с хоста в докер. судя по тому что я вижу - такая папка в докере существует, потому примаунтить не выйдет

    можете сделать /internalDB:/data/internalDB и потом просто скопировать куда надо
    Ответ написан
  • Что делает функция dev.off()?

    ayazer
    @ayazer
    Sr. Software Engineer
    Могли бы вы точно указать на правильный ответ, и написать: почему?


    2. потому что


    выключает указанное (по умолчанию текущее) устройство. Если текущее устройство выключено, а все остальные открыты, следующее открытое устройство становится текущим.
    (с) гугльтранслейт
    Ответ написан
    2 комментария
  • Объект экземпляр класса?

    ayazer
    @ayazer
    Sr. Software Engineer
    1) объявление объекта (без инициализации)
    2) объявление объекта с инициализацией
    3) синтаксическая ошибка

    upd: (в случае с шарпом)
    Ответ написан