Задать вопрос
  • Как сделать уменьшение склада в СУБД безопасными правильным?

    @Vitsliputsli
    Александр Рублев, простой счетчик, как уже писали: balance = balance - 1.
    Но, когда реальный остаток и остаток в БД не сойдутся, нужно будет искать ошибку, а без "лишних" таблиц искать негде, у вас только одно число и все. Если есть логи в приложении, то можно по ним, если в них удобно.
    Написано
  • Как анализировать рынок IT, чтобы помочь ребенку с выбором направления?

    @Vitsliputsli
    Сергей Горностаев, с одной стороны как бы да, баланс нужен, но так можно быстро начать выбирать только "практичное". И зачастую только кажется что оно практично. Когда не интересно, очень быстро начнет воротить от выбора, и тогда не сможешь развиваться, а значит не сможешь и зарабатывать. И никакой практичности уже нет.
    А когда интересно, то найдешь свой путь и среди не сильно "практичного".
    Так мне кажется... Ведь если не интересно, зачем оно вообще тогда нужно.
    Написано
  • Как анализировать рынок IT, чтобы помочь ребенку с выбором направления?

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

    @Vitsliputsli
    Ипатьев, Алексей Уколов, закинул вариант, по-моему более читабельный, причем рекурсия там не сильно сложнее выглядит чем перебор массивов, а array_slice гарантирует выход.
    Написано
  • Как получить данные в виде текста на русском языке из базы данных Paradox 4.5?

    @Vitsliputsli
    Adamos,
    Vitsliputsli, вот когда ТС завалит ту элементарщину, с которой сюда явился - зовите его к себе и снабжайте документацией, погружайте во флоу... и вообще, благотворительность - это похвально, конечно.

    А почему именно мне нужно его звать к себе? Это же вы агитируете за метод, не на собеседовании решать подходит ли человек, а взять на работу и дать бессмысленное не связанное с работой задание.
    Работать на работе - это не благотворительность. А вот заниматься на работе отвлеченными бесполезными заданиями очень сомнительная вещь, скорее всего никому не нужная.
    Написано
  • Как получить данные в виде текста на русском языке из базы данных Paradox 4.5?

    @Vitsliputsli
    Adamos,
    а вы мальку сразу дадите рабочую задачу, чтобы сначала нужно было недельку поразбираться в проекте и документации?

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

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

    @Vitsliputsli
    nokimaro,
    1. производительности при переиспользовании подготовленного выражения
    2. безопасности. в случае с EMULATE_PREPARES=true получаем не настоящее подготовленное выражение, а лишь экранирование, что-то близкое к использованию mysqli_real_escape_string() вокруг параметров
    3. более корректной работы с типами данных

    А на практике? Тут всегда нужно рассматривать в разрезе СУБД, например с PostgreSQL все хорошо, а вот с MySQL все плохо, поэтому PDO и использует эмуляцию вместо реальных prepared statements для MySQL (с PostgreSQL по-умолчанию идут реальные).
    1. Производительность ниже. Варианта повторных запросов с кешированным планом практически не бывает (к тому же оно только на сессию в MySQL). 3 запроса вместо 1го не должны быть быстрее, хотя у PostgreSQL получается одинаково както. В MySQL медленнее, да еще и жрет много памяти сервера.
    2. Безопасность - да. Хотя, конечно, эмуляцию отладили хорошо, теоретически гарантии нет, в отличии от реальных.
    3. Корректная работа с типами вещь надуманная, на мой взгляд, т.к. типы в приложении и в СУБД все равно разные.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake, если непонятно то, что предлагается, то не стоит этому следовать. Не только потому что это может быть чушь, а скорее потому, что не понимая выгоды можно все равно наворотить не того, что подразумевалось.
    Кажется, что лучше так, делайте. Но, хорошо бы помнить, что есть и другие варианты, и когда столкнетесь с теми или иными сложностями, вспомните про них.
    Но лучше тогда, когда реально будете понимать зачем это вам. К примеру, если не пишите юнит-тесты, если код сугубо специализирован как внутри проекта (т.е. не сильно важны зависимости глобальные), так и по работе с модулями (т.е. хранилище конретная СУБД и вряд ли там появится иное чтото), то и проблем статического обращения не почувствуете, хоть с service locator, хоть напрямую к синглтонам.
    Помоему нельзя хорошо освоить чтолибо просто слепо повторяя какието best practice, нужно понимать зачем оно нужно, и понимать не теоретически, а практически. А иной раз лучше не переуслажнять, а сделать проще, пусть и не универсально.

    Про PDO::ATTR_EMULATE_PREPARES мой вопрос не что это, оно то понятно, а почему именно такой вариант выбран. Это сознательный выбор или просто следуя какомуто авторитетному источнику.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    nokimaro,
    PDO::ATTR_EMULATE_PREPARES => false
    Кстати, а почему эмуляцию отключаете? Это сознательный выбор, или просто перекочевало откудато?
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake, если не очень понятно, то может оно и не нужно пока, nokimaro правильно заметил, что всегда нужно исходить из задачи и инструментов.
    Собственно в вашем примере, DB - это Service Locator специализирующийся только на соединениях с СУБД. Service Locator - не нарушает SRP, он ничего не знает об ответственности сервисов, которыми управляет, его ответственноть только получение и возврат объекта.
    На превый взгляд может показаться, что это ненужный посредник, но именно то, что он посредник и помогает. К примеру, если взять юнит-тестирование, то в варианте со статическим вызовом конкретных классов все печально, но если сделать посредника в виде ServiceLocator и в нем прописать возможность переопределения объектов, которые возвращают методы, то можно легко подменить реальные объекты на моки. А вот с универсализацией все плохо, но примерно также как и в случае с прямыми статическими обращениями к конкретным классам.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Если уж идти по этому пути, то лучше сразу завести сервис-локатор, чтото вроде:
    class ServiceLocator
    {
        public function getDB(): DB
        {
            ...
        }
    }

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

    Второй момент, а зачем внутри класса статическое обращение? Тащить через всю вереницу классов зависимость тяжко, но не обязательно в конечном классе делать эту зависимость.
    Т.е. выносим вызов сервис-локатора, ну или там синглтона, на уровень выше. А в классе Data чистая dependency injection. В итоге, вроде все тоже самое, но когда нет статических вызовов в конечном классе, то можно на него писать юнит-тесты без проблем.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake, вместо этого
    catch(PDOException $sql_connect_e)
    {  
        echo ("Ошибка подключения к базе данных. SQL erorr: ". $sql_connect_e->getMessage() ."");
        die();
    };

    так
    catch(PDOException $sql_connect_e)
    {  
        echo ("Ошибка подключения к базе данных. SQL erorr: ". $sql_connect_e->getMessage() ."");
        throw $sql_connect_e;
    };

    Зачем здесь echo не знаю, по мне логичнее было бы в лог кидать.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake,
    Есть нюанс в том, что у меня несколько баз в колхозе и пользователю мне нужно показывать кто упал и почему упал.

    Сделайте на каждое соединение отдельный класс и будет все понятно, если только у вас не динамическое или большое кол-во соединений.
    Если очень хочется чтото вписать в лог ошибки, то пишите, но завершайте catch фразой:
    throw $sql_connect_e;
    Это выведет реальную ошибку. В варианте который вы привели в вопросе, в catch все данные об ошибке уничтожены, т.е. вы не сможете узнать, что за ошибка произошла.
    Написано
  • Как объединить 2 таблицы обращаясь к одному и тому же полю 2 раза?

    @Vitsliputsli
    survivor2005, а что именно не очевидно? Просто интересно, как взгляд со стороны, т.к. по мне наоборот все очевидно.
    Написано
  • Как учиться и практиковаться?

    @Vitsliputsli
    Максим Припадчев, у него обучающие материалы - это "в интернете полно информации", что ему там попалось и что он изучал неизвестно. Отсюда у него очень хороший вопрос "что я делаю правильно, а что нет?". А беря случайный, тем более "небольшой проект на гитхабе", вполне можно продолжить закреплять неправильные подходы.
    Написано
  • Как автоматически откатить в CI/CD миграции при помощи Goose, если их было несколько?

    @Vitsliputsli
    Станислав, если в разрезе "неких универсальных сервисов" обновляемых под нагрузкой - не откатывайте миграции, тем более автоматически. Одномоментное обновление и БД, и приложения невозможно. Поэтому любая версия приложения должна работать с ближайшими версиями БД. А значит в случае отката - возвращаете предыдущую версию приложения и не трогаете БД. Да, возможность отката БД должна быть, но в ручном режиме, на всякий случай.
    Откат миграции, в отличии от отката приложения, это не возвращение предыдущей версии БД, а новое состояние, новая версия, которая лишь теоретически должна соответствовать предыдуущей версии БД. Откатываем мы тогда, когда чтото пошло не так, чтото чего мы не предусмотрели при разработке и не проверили при тестировании. Т.е. творится невесть что, а мы не разбираясь автоматом вызываем еще дополнительные DDL операции - это плохо.
    К тому же, если ваша среда в нормальном состоянии, то вы не словите ошибку при накате миграций, а словите ее тогда, когда приложение начнет активно писать в соответствии с новой версией БД. А в таком состоянии, откат БД как правило будет сопровождаться потерей данных.
    Написано
  • Как установить русский язык в php:8.2-fpm-alpine?

    @Vitsliputsli
    Михаил, локаль здесь не при чем, вам нужны компоненты юникода ICU для всех языков, а не урезанные, которые по-умолчанию
    Написано
  • Как установить русский язык в php:8.2-fpm-alpine?

    @Vitsliputsli
    А зачем? Просто интересно
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Кот Абсолютный,

    Что я должен знать? Что бубунта лучше генты? Что systemd лучше чем sysv init? Или что-то еще, более сакральное?

    Вообще это был стеб и троллинг. Что ж, троллинг удался, да еще как! Заревом пылающего тухеса пожалуй дорогу можно вместо фораней освещать...

    Поздравляю вас дяденька, соврамши! Откуда такое сакральное знание? Брателло, ты уверен, что я никогда ничего не собирал? Как доказывать будешь?

    А чего ты так расходишься? Когда ты делал выводы ничего не зная обо мне, тебя ничего не смущало. А когда с тобой так обошлись, кричишь "а доказательства!". Так что, смотри на себя в первую очередь, и, научись не хамить людям.
    Троллинг? Да какой там, обычное хамство и тупые издевки, чтобы потешить свое чсв, профессионально самореализоваться чтоли не получается?
    Удачный? Тоже нет, удачный это когда жертва упорно доказывает, обычно какую-нибудь глупость, но не может осознать этого из-за психологических установок. Как-нибудь покажу.


    Пересборка мира - нелепое и утомительное занятие, есть способы и много собирать только то, что обновилось. Но тем, кто только слышал, что в генте есть "пересборка мира" этого конечно же не понять...

    А ты конечно 24 часа работаешь за компом и параллельно идущая сборка у тебя его жуууууутко тормозит... Постой, так может у тебя винда?

    А мир откуда изначально взялся? Ты об этом не думал?
    Отличный аргумент. Зачем чтобы комп работал для тебя, это ты должен работать на него. Ну да ладно, так и зачем автору вопроса Gentoo? Ах да, "перформанс", он же прям увеличивается в разы производительность компа, когда комп постоянно чтото собирает. Гениально.


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

    Я и не говорю, что ты. Ты опять ничего не понял и начал расходиться.


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

    А вот про это я и говорил. Зачем-то, на пустом месте, он там доказывает, ты здесь... Что у вас за общая больная тема?
    "Себя хвалить неудобно", "доказал обратное"?! Тебе что 18 лет?


    Это тоже так себе ход. Реальная оптимизация ядра займет столько времени, что борода вырастет как у гнома, обычно туда приходят с конкретной проблемой. Я наоптимизировался ядра еще на FreeBSD, где без этого просто не поедет ничего.

    Как я и писал, самый важный момент, что Gentoo здесь совсем не при чем.


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

    И вот к чему было все хамство выше, если потом соглашаешься? Ах, да, хамство с троллингом перепутал...
    Написано