Задать вопрос
  • Как правильно реализовать структуру таблиц продукт и цены продуктов?

    @Vitsliputsli
    Но получаю предупреждение в консоли

    Это предупреждение не имеет никакого отношения к работе с БД.
    Прочитайте про отправку заголовков в http - и сделайте так, чтобы они устанавливались до отправки первых данных.

    Данное выделение не содержит уникального столбца...

    У вас вывод результата join нескольких таблиц, разумеется здесь не очевидно, что удалять или редактировать, т.к. это не одна таблица. Почему предупреждения в такой странной форме - это вопрос к приложению которое его выдало.
    Написано
  • Запрос на создание таблицы в clickhouse Yandex выдает ошибку 400 Bad Request, что не так с моим запросом?

    @Vitsliputsli
    Ипатьев,

    Ну щас. Прекрасно file_get_contents справляется с любыми задачами.
    Дело не в file_get_contents, а в кривых руках. А ими за что не возьмись - всё криво будет.

    ах ну да, есть же специальная опция в контексте, которая меняет поведение. Но чет ты про нее тоже забыл. А забыл потому, что есть стандартный инструмент curl и для более-менее сложных запросов используется именно он, хотя можно выкручиваться через file_get_contents.
    Вообще отправить http запрос можно множеством способов. Но делать это через curl для данной задачи это признак понимания и адекватности, а не кривых рук, в отличие от применения функции для получения содержимого файла.
    Написано
  • Что правильнее: git merge master VS git rebase?

    @Vitsliputsli
    Сергей Кузнецов, красиво, эмоционально, особенно понравилась попытка вызвать неприязнь к моему мнению через стигматизацию метафорой мумификации. Но технический спор требует технической аргументации, а не ораторских ухищрений.
    Контроль версий это бекап, и когда мы его делаем, то ожидаем, что восстановленное состояние будет тем же, какое сохранялось, не на 99%, а на все 100%. Так что это ближе к мумификации, чем к "я художник я так вижу". И когда мы пишем код, мы "коллеционируем артефакты", собранный код так и называем - артефакт. И код, который хранится в git "неприкасаем", если у вас не так, значит у вас нет контроля версий.
    Еще раз, в основных ветках, там где нужен контроль версий, ребейз запрещают (вернее любое переписывание истории), и вы это знаете, так зачем пытаетесь ввести в заблуждение?
    В личных ветках, в ветках фич и т.п. могут отходить от этого правила, там действительно могут жертвовать контролем версий для "красивой" картинки, без черновиков и т.п. И тут, как уже писал, все на вашей совести. Хотите делаете, не хотите - не делаете, особенно если работаете один. Но, нужно понимать, что вы можете "убрать шум", сделать "каждый коммит - осмысленный шаг" и т.п. (ревью делают обычно для пулреков, так что там от переписывания истории только хуже), но это не контроль версий, т.к. у вас при каждом новом ребейзе появляются все новые и новые версии, даже старых "осмысленных шагов". Так что вы правы, "не косметика, а хирургия", вы отрезали человеку руку, пришили руку от другого - и говорите, "а че, ну похоже же на то что было", только вот похожесть это не про контроль версий.
    Ваша "полезность истории" в меньшем кол-ве полосочек в графическом представлении связей. Но, чем она полезна на самом деле? А ничем, она бесполезна, потому что, как вы писали:
    "Мне трудно представить такую ситуацию, что через месяц захочется покопаться в мусоре и снова пересобрать старые косяки. Обычно проблемы видны сразу."
    Вы сознательно отказались от контроля версий, прямо об этом пишете, но при этом пытаетесь ввести в заблуждение демагогией, а не фактами.
    - Можно вернуться к версии, которую мы видели месяц назад?
    - Нет, но есть похожая версия, почти такая же (на 90% или может на 10%), зато на "картинке" она выглядит лучше. nuff said
    Так что продолжайте "делать релизы, а другие пишут...", никто ж видно кроме вас их не делает, вы один тут такой молодец... Только причем здесь релизы и контроль версий? Хватит демагогии, пожалуйста.
    Отказались и отказались, но не нужно убеждать никого, что контроль версий есть там, где его нет.
    Написано
  • Что правильнее: git merge master VS git rebase?

    @Vitsliputsli
    Сергей Кузнецов,
    Конечно же это неправда. Коммиты очень сложно уничтожить, так как это неизменяемые сущности по своей природе. Они лишь убираются с витрины и до них становится сложнее добраться.
    Но если вам так дорог мусор, то вам ничто не мешает повесить на него тег и они останутся с вами навечно.

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

    Зачем мне быть на стрёме? Гит никогда ничего не удаляет и все ходы записаны в журнале. Легким движением руки можно легко откатиться на момент до неудачного слияния и rebase.

    Сразу не удаляет, это всем понятно и уже сверху упомянуто.

    Мне трудно представить такую ситуацию, что через месяц захочется покопаться в мусоре и снова пересобрать старые косяки. Обычно проблемы видны сразу.

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

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

    Я выше описал основную проблему, то что комуто придется сделать доп действия это еще полбеды.
    Написано
  • Что правильнее: git merge master VS git rebase?

    @Vitsliputsli
    Сергей Кузнецов,
    Чтобы управлять историей, а не хранить её в виде археологических слоёв.
    Rebase не «уничтожает» историю, а переписывает её так, чтобы она оставалась линейной и читаемой.
    Git — не архив, а инструмент. И да, rebase — часть нормального рабочего процесса, если понимать, когда и зачем его применять.

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

    Старые коммиты никуда не удаляются. Если что-то пошло не так, ветка возвращается в предыдущее состояние одной командой. Не надо тут вводить в заблуждение )))

    Если вы всегда "на стреме" и записываете хеш аварийного коммита, к которому нужно вернуться, то да. За исключением ситуации, когда прошло время и неиспользуемые коммиты git уже вычистил.

    Как раз наоборот: когда вы работаете с веткой один и ленитесь причесать историю через интерактивный rebase перед отправкой в вышестоящий репозиторий — вот тогда это действительно остаётся на вашей совести. ))

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

    @Vitsliputsli
    itrushkoff,

    есть бэкенд на PHP, есть бизнес-требование перейти на JS

    Шансы, что это бизнес требование минимальны, т.к. это вопрос чисто технический.
    Так что тут серьёзная проблема, либо бизнес лезет туда куда не должен, либо технари не очень понимают, что делают (ну нельзя переписывать работающий проект на то, что никто не знает, просто так).
    Написано
  • Как сделать уменьшение склада в СУБД безопасными правильным?

    @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 все данные об ошибке уничтожены, т.е. вы не сможете узнать, что за ошибка произошла.
    Написано