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

    ayazer
    @ayazer
    Sr. Software Engineer
    По сути - все верно. Возможно стоит распилить конструктор на 2 разных чтоб исключить придирку "в задании написано добавить конструктор 2 раза, а у вас он только 1"
    Ответ написан
    Комментировать
  • Как сделать выборку из таблицы Mysql по значению в поле кроме цифр?

    ayazer
    @ayazer
    Sr. Software Engineer
    www.sqlfiddle.com/#!9/4d39ea/1/0

    select * from users 
    where value NOT REGEXP "-?^[0-9]*.?[0-9]*$"
    Ответ написан
    Комментировать
  • Как сократить условие?

    ayazer
    @ayazer
    Sr. Software Engineer
    private static string[] _elementNames = new[] { "SiO2 (β-кварц)",  "and", "more"};
    
    ....
    
    if (_elementNames.Contains(name))
    {
        if (curTemp <= 846.15)
        {
            h = -217.75F; 
            s = 10F;
            a = 11.22F; 
            b = 8.2F; 
            c = -2.7F;
        }
        else if (....) { ....}
        ....
    }


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

    ayazer
    @ayazer
    Sr. Software Engineer
    async void
    вернет управление обратно, не дожидаясь выполнения асинхронного кода внутри. вам же нужно возвращать таску

    public async Task DownloadVideo1080PAsync(string path, ProgressBar progressBar, string link)
    {
        await ytClient.Videos.Streams.DownloadAsync(audioInfo, Path.Combine(newLink, $"audio.wav"));
        await ytClient.Videos.Streams.DownloadAsync(videoInfo, Path.Combine(newLink, $"video.mp4"), progressHandler);
    }
    
    public Task MergeAudioVideoAsync(string link)
    {
        return ffmpeg.ExecuteAsync($@"-i video.mp4  -i audio.wav -c:v copy -c:a aac newVideo.mp4");
    }


    ....
      await DownloadVideo1080PAsync(....);
      await MergeAudioVideoAsync(...);
    ....
    Ответ написан
    Комментировать
  • Как сравнить айди пользователя с айди в базе sqlite?

    ayazer
    @ayazer
    Sr. Software Engineer
    ну как пример:

    def is_user_banned(user_id: int) -> bool:
        cmd = "select count(user_id) from banlist where user_id = %d" % (user_id)
        c.execute(cmd)
        result = c.fetchone()[0]
        return result > 0
    Ответ написан
    4 комментария
  • Нужна помощь с решением задачи. Необходимо посчитать смену знаков. В чем моя ошибка?

    ayazer
    @ayazer
    Sr. Software Engineer
    ну так запустите дебаггер и посмотрите. тут больше чем 1 ошибка.

    1) можете начать проверять с варианта когда i==2 и j==4. тогда array[i++,j++] уже выходит за границу
    2) array[i++,j++] - вы уверены что вам нужно сравнивать значения именно по диагонали?
    3) i++ это постинкремент который изменяет значение. подозреваю что вы хотели просто сравнить со следующим
    4)
    array[i,j] < 0 && array[i++,j++] >= 0 || array[i,j] >= 0 && array[i++,j++] < 0
    запустите в дебаггере/интерактивной консоли и проверьте действительно ли это будет работать как вы думали. подозреваю что вы хотели получить все-же другой результат
    Ответ написан
    1 комментарий
  • Как работает .NET?

    ayazer
    @ayazer
    Sr. Software Engineer
    код превращается в IL, который уже будет превращаться в машинный по мере необходимости (см. JIT компиляцию). Т.е. по сути первый вызов метода будет происходить чуть дольше т.к. будет происходить оптимизация и компиляция IL кода под реальную аппаратную платформу. После чего все последующие вызовы будут выполняется быстрее. Если такой вариант по каким-то причинам не подходит - есть ngen который позволяет сразу скомпилировать код под известную платформу (выиграв на холодных запусках, по потеряв в переносимости). И в этом случае jit компиляция во время работы приложения уже выполнятся не будет.

    В CLR не входит CIL?

    не совсем понял вопрос. cil/msil/il - просто промежуточный в который превращается код на С#/F#/VN.NET/etc. Можно расценивать его как ассемблер для .нета. Мало того, никто не запрещает написать свой DSL, который будет генерировать IL, который в свою очередь будет работать везде где работает .нет

    JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?

    оба варианта нет. jit компиляция = just-in-time и запускается прямо во время работы приложения. как-раз она и превращает IL код в нужный набор машинных кодов.
    Ответ написан
    3 комментария
  • Как при селекте в mysql выводить нормальную строку?

    ayazer
    @ayazer
    Sr. Software Engineer

    result_vk_user_id = cursor.fetchall()

    Такой селект выводит вот такую ерунду:
    [(323826602,)]


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

    ну и да, нужное вам значение лежит в
    result_vk_user_id[0][0]

    upd:
    ну или можно просто избавится от кортежей и получить список значений
    result_vk_user_ids = [rec[0] for rec in cursor.fetchall()]
    Ответ написан
  • Как лучше организовать заполнение таблиц БД дефолтными данными при деплое?

    ayazer
    @ayazer
    Sr. Software Engineer
    эти данные - часть миграции базы, и соотв. лежать должны где-то там. Если используется орм - у них обычно есть механизмы для выполнения миграций. Если орм не используется и/или хочется больше контроля - Flyway или аналоги. если система глубоко в продакшене и для внесения изменений нужны многоэтапные миграции длиной в недели/месяцы - хоть папка sql_migrations где-то в корне репозитория
    Ответ написан
    Комментировать
  • Правильно ли я понимаю, как отработает индекс?

    ayazer
    @ayazer
    Sr. Software Engineer
    нет. главное чтоб в where были или первое поле, или первых два поля, или все 3 поля. в каком порядке вы их напишете в запросе - без разницы.

    т.е. where country = ?? использовать индекс не будет вообще, а where country = ?? and entityId = ?? будет использовать только первую часть составного индекса (по ентитиИд).
    Ответ написан
    4 комментария
  • Возможна ли SQL injection длиной в 4 символа или менее?

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

    но например
    select count(id)>1 from auth.users where login='admin';--' and hash=123;
    Ответ написан
    Комментировать
  • Где будет располагаться структура?

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

    если сложно - "а хрен его знает, уж очень много от чего зависит" (с) кто-то с разработчиков оптимизатора
    Ответ написан
  • На каком уровне в трехуровневой архитектуре должна находиться пагинация, фильтрация и сортирование?

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

    можно пойти и от противоположного - если репозиторий ничего не знает про пагинацию/фильтрацию то вам нужно будет каждый раз доставать все данные с базы чтоб потом выбрать только те что нужно отображать. выглядит максимально мерзко, правда?)
    Ответ написан
    Комментировать
  • Как ведет себя JOIN & WHERE?

    ayazer
    @ayazer
    Sr. Software Engineer
    Он выгребет только то что надо. А еще может поменять порядок джойнов чтоб выгребать меньше/быстрее. Но в целом план выполенения запроса будет зависеть от многих факторов (в т.ч. кол-во данных в таблицах, индексы и статистика по этим индексам), потому всегда лучше посмотреть експлейн. А вот нюансы уже могут отличатся от вендора к вендору
    Ответ написан
    2 комментария
  • Как поправить программу - змейка?

    ayazer
    @ayazer
    Sr. Software Engineer
    1) статический метод не может изменять локальную переменную. переменная тогда тоже должна быть статической
    2)
    dir = LEFT;
    ->
    dir = eDirection .LEFT;
    Ответ написан
  • Как создать триггер не позволяющий добавлять/удалять/изменять при определенных условиях?

    ayazer
    @ayazer
    Sr. Software Engineer
    create trigger <trigger_name> before insert on <table_name>
    for each row
    begin
    if new.val = '' then
    signal sqlstate '45000';
    end if;
    end;$$


    и аналогичные триггеры для before delete/before update

    но это все выглядит как весьма противный костиль чтоб подпереть систему. И подозреваю что проблему надо решать не так.
    Ответ написан
    Комментировать
  • Типы ключей в базах данных?

    ayazer
    @ayazer
    Sr. Software Engineer
    как все это разбить на конкретные сущности?

    см. ниже

    Какое общее название индексы или ключи?

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

    ForeignKey это тоже индекс/ключ?

    нет, foreign key != индекс. индекс = вообще отдельная структура которая хранится отдельно от самих данных. foreign key = просто ссылка на другую таблицу, и создание внешнего ключа это по сути создание уникального constraint (таблица1.колонка1, таблица2.колонка2). Потенциально СУБД может сама создавать индекс при создании внешнего ключа (т.к. почти всегда это имеет смысл), но это уже нюанс конкретной реализации

    В чем отличие ForeignKey от Reference?


    что такое "Reference"? если вы про конструкцию
    FOREIGN KEY (ColumnName) REFERENCES TableName(ColumnName)

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

    Unique индекс это отдельный индекс или просто флаг unique к обычному индексу?

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

    ayazer
    @ayazer
    Sr. Software Engineer

    Так вот, почему сначала в индексе надо сначала указывать age, если можно указать сначала gender и отсечь за одну операцию ~6000 строк (это примерно пол таблицы) и потом в этой половине искать уже по age что будет уже в 2 раза быстрее чем если строить индекс age_gender.


    а если сначала отфильтровать по age - то выйдет СРАЗУ откинуть не половину таблицы, а все кроме тех 200 записей. и потом используя gender - фильтровать не пол таблицы, а только этих 200 записей (а не 6000).

    т.е.
    gender, age -> по первому индексу получаем 6-8к записей, по ним фильтруем используя второй индекс
    age, gender -> по первому индексу получаем 200 записей, по ним фильтруем используя второй индекс (или в случае с low cardinality индексами может оказаться что быстрее просто просмотреть все записи)

    ну и стоить помнить что имея только комплексный индекс (gender, age) поиск по возрасту будет использовать полный перебор. в случае с индексом (age, gender) можно будет и искать по возрасту не указывая пол
    Ответ написан
    3 комментария
  • Ускорение миграции/изменения таблиц в MySQL?

    ayazer
    @ayazer
    Sr. Software Engineer
    1) гитхабовский gh-ost.
    +: работает через бинарный лог, потому может мигрировать таблицу даже если в ней есть триггеры.
    -: работает через бинарный лог, потому (относительно) медленный т.к. в какой-то момент начинает переливать данные где-то с такой-же скоростью как они появляются.

    2) перконовская pt-online-schema-change
    +: работает через триггеры (которые умеют грузить все доступные ядра)
    -: работает через триггеры, потому если триггеры уже есть - использовать перкону не выйдет.

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

    + в новых версиях Mysql можно использовать online ddl для тех-же задач.
    Ответ написан
    1 комментарий
  • Как получать сообщения от базы?

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

    https://postgrespro.ru/docs/postgresql/9.6/sql-notify
    Ответ написан
    Комментировать