• Для чего в проектах принудительно используют use?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Часть проблем высосана из пальца, как очень смешной п.2 - разница в одну точку с запятой, а уже "гораздо длиннее", карл. При том что если класс использовать в коде хотя бы дважды, то вот тут как раз действительно получится "гораздо длинее"

    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Extension::unload([ 'vendor.module.components.cabinet.personal' ]);
    vs
    \Framework\Main\UI\Extension\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    \Framework\Main\UI\Extension\Extension::unload([ 'vendor.module.components.cabinet.personal' ]);

    и будешь постоянно спотыкаться в коде об эти палочки.

    А часть решается не просто, а очень просто: вместо того, чтобы писать код в Блокноте Виндоус, надо в кои-то веки освоить работу с нормальной IDE. Которая
    - автоматом скрывает блок use
    - по ctrl+наведение курсора показывает полный путь, а по ctrl-click сразу переходит в определение метода
    - подсвечивает неиспользуемые неймспейсы, и не проблема их удалить
    Ответ написан
  • Для чего в проектах принудительно используют use?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Минусы как бы очевидны:
    нет, не очевидны, по крайней мере миллионам разрабов

    1 Код становится трудно читаем. По месту использования не всегда понятно что имеется ввиду под Order::load() - \Framework\Sale\Order::load или \Vendor\Project\Sale\Order::load - приходится проматывать к верху файла.
    Вам как разрабу должно быть в принципе фиолетово, какой из пакетов используется, если они соблюдают один интерфейс. Если не соблюдают, при том что называются одинаково, значит все пошло не так задолго до проблем с определением пакета...

    2 Код становиться длиннее - там где было бы просто:
    \Framework\Main\UI\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    приходится писать:
    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Код становится длиннее в проектах где 2 контроллера и в них по 1 экшену. Там где Extension::load будет вызываться больше одного раза, очевидно экономия на эксплуатации клавиатуры заметно увеличивается. А в больших проектах создание объекта может (и будет) повторяться многократно.

    4 Код становиться замусоренным, так как верхушки файлов запросто превращаются во что-то вроде:
    Если не обращать внимание на отсутствие пункта 3, то... нет, не могу не обращать внимание, вот же торопыга....
    Во первых - данная портянка очень аккуратно прячется любой адекватной ИДЕ,
    Во вторых - это правильно и логично, хранить все импорты в одном месте
    В третьих - если ты пишешь неимпортированный класс в коде - ИДЕ обычно предлагает варианты внесения его в блок импорта, и все выглядит аккуратно.

    И хрен его знает используются импортированные классы ниже ещё или уже нет, ведь никто не убирает этот мусор.
    Хрен не знает, а ИДЕ замечательно знает и даже подсвечивает серым цветом неиспользуемые.
    Ответ написан
    4 комментария
  • Зачем комментарии в xml, если можно придумать свой тег для этого?

    DevMan
    @DevMan
    зачем придумывать, если уже есть комментарии?

    коменты визуально отличаются от тегов, что упрощает чтение глазами.
    коменты, в отличие от тега, автоматически пропускаются парсерами.
    с коментами даже теоретически не возникнет казуса с дублирующими тегами.
    Ответ написан
    2 комментария
  • Почему при переключении на PHP 8.1 Яндекс и Google натыкаются на 500 ошибку?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка 500 возвращается с сайта. Смотрите логи на своём сервере.
    А при чем тут версия интерпретатора?
    Что-то из статуса deprecated перешло в removed. Какие-то ошибки вместо warning начали выдавать error.
    https://www.php.net/manual/en/migration81.incompat...
    Ответ написан
    Комментировать
  • Как сравнить даты в разных форматах?

    Попробуйте так:
    $origin = new DateTime();
    $date = explode(' ', "27-07-2022 11:53:4 AM");
    $target = DateTime::createFromFormat('d-m-Y', $date[0]);
    
    echo $origin->diff($target)->format('%a days');
    Ответ написан
    Комментировать
  • Есть ли смысл использовать Git?

    @Vitsliputsli
    Можно. Но, например, когда проект начнет работать вам понадобится добавить новую фичу, а следовательно у вас появится 2 версии и нужно будет их как-то легко разделять. Пока вы будете делать эту новую фичу, нужно будет сделать еще одну побыстрее, уже 3 версии. Можно наделать отдельные директории и переключаться между ними, использовать внешние утилиты сравнения, а можно использовать git.
    Когда через год понадобится разобраться, а зачем так было сделано, можно найти коммит, в рамках которого было внесено изменение и понять зачем. Еще лучше, если коммиты связаны с тасками в системе управления проектом.
    Когда наскучит вручную таскать код на сервер. Когда устанешь копировать файлики между версиями для переноса функционала. Когда все сломал, и понимаешь, что легко бы нашел причину, если бы фиксировал предыдущее стабильное состояние. И это только то, что первое приходит в голову.
    Ответ написан
    Комментировать
  • Как проверить не изменился ли файл по ссылке?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Всем спасибо, похоже я нашел решение. На равне с типами запроса GET, POST и другими оказывается существует еще тип запроса HEAD. Этот тип запроса позволяет запросить заголовки ответа, без самого тела ответа.

    Соответственно факт изменения файла можно проверить через сверку заголовка ETag:
    (await fetch('/', { method: 'HEAD' })).headers.get('ETag');

    Заголовок HTTP ответа ETag является идентификатором специфической версии ресурса. Если ресурс по заданному URL изменился, будет сгенерированно новое значение Etag. Поэтому Etag чем-то похож на отпечаток ("fingerprints") и позволяет быстро определить являются ли два представления ресурса одними и теме же.

    https://developer.mozilla.org/ru/docs/Web/HTTP/Hea...
    Ответ написан
    1 комментарий
  • SSD разбивка на неиспользованые разделы?

    @rPman
    большинство контроллеров SSD дисков, автоматически перемещают данные с часто используемых (на запись) ячеек на менее используемые, в среднем продлевая таким образом срок жизни диска. Этот процесс прозрачный для пользователя, так как внутренние сектора мапятся на пользовательские как угодно перемещанным образом. Таким образом для пользователя нет разницы, в какой именно части диска находится 'не используемые'

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

    Если по простому считать, при использовании только половины емкости диска, должно кратно (формально не в два раза, так как для переноса 1 единицы информации записей будет произведено две) увеличить срок годности диска (с точки зрения ресурса записи ячеек)

    Но если операционная система (и настройки bios, а именно включенный режим контроллера - ahci) поддерживает команду TRIM (сообщает что сектор освободился), то не важно, в какой части диска находится неиспользуемые сектора. И в этом случае диск можно разметить весь но самостоятельно следить за наличием свободного места, результат должен получиться аналогичным. Кстати если изредка, кратковременно, количество свободного места на диске будет уменьшаться, даже в ноль, это не должно заметно повлиять на описываемое повышение срока годности, ведь значение имеет только операции записи и возможность их размазать по диску

    Поэтому повторюсь, нет нужды ограничивать себя в размерах доступного пространства такими способами, размечай весь диск и проследи чтобы в BIOS и ОС была включена поддержка TRIM.
    Ответ написан
    1 комментарий
  • Как правильно создать таблицу в которой будет храниться инфо о посте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Гугл поступает совершенно правильно. Потому что делать такую белиберду никому просто и в голову не придёт.

    Во-первых, отдельная таблица тут не нужна, это просто две колонки в той же таблице
    Во-вторых, если и делать отдельную таблицу, то пустые строки про запас в БД никогда не создают. База данных - не бумажный дневник с двойками, разлинованный на целый год. Она устроена по-другому.
    Ответ написан
    Комментировать
  • На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

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

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

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Как при достижении условного брейкпоинта ширины экрана сменить через js href у ссылки?

    @tehfreak
    Вот современный способ проверки на соответствие медиавыражению:
    if (window.matchMedia('(max-width: 700px)').matches) {
      for (const linkElement of document.querySelectorAll('.order-project__more-details-btn')) {
        linkElement.setAttribute('href', 'examples-foundation-640')
      }
    }

    А вот документация: https://developer.mozilla.org/ru/docs/Web/API/Wind...
    Ответ написан
    1 комментарий
  • Какие проблемы могут возникнуть при работе программы с файлом БД из удаленной папки?

    @Voland69
    Главная проблема - конкурентный доступ. SQLite емнип не предполагает расшаренного доступа к файлу БД.
    Вторая проблема - устройство системы разграничения доступа - или у клиента будет доступ на запись в файл (тогда он может сделать все, включая удаление файла), или доступ только на чтение.
    Третья проблема связана с главной - даже если получится конкурентный доступ, транзакций не будет уж точно, что имхо при многопользовательском режиме критично.

    В общем я бы предложил не исключать вариант с сервером БД.
    Ответ написан
    Комментировать
  • Какие проблемы могут возникнуть при работе программы с файлом БД из удаленной папки?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Разнообразные - от очень медленной работы до порчи данных. SQLite не предназначена для конкурентного доступа, используйте полноценную СУБД.
    Ответ написан
    1 комментарий
  • Почему неправильно выводит русские символы?

    karabanov
    @karabanov
    Системный администратор
    Добавь в скрипт ini_set('mssql.charset', 'UTF-8');
    Ответ написан
    3 комментария
  • Зачем нужно усложнять код?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В твоём примере последняя итерация лишняя - i выходит за пределы массива, тебе надо было написать либо так:
    function funk (arr) {
      for(let i = 0, length = arr.length - 1; i < length; i++) {
        if(arr[i] === arr[i+1]) {
          return true;
        }
      }
      return false;
    }

    либо, лучше, так:
    function funk (arr) {
      for(let i = 1; i < arr.length; i++) {
        if(arr[i - 1] === arr[i]) {
          return true;
        }
      }
      return false;
    }

    Также заметь, что в современном JS никто не использует сравнение с приведением типов(==) из-за его ненадёжности, только полноценное сравнение - ===.

    "Пример из интернета" - полная фигня. Кто-то впихнул костыль на ровном месте, решая ту самую "проблему", что имеет место быть в твоей реализации, вместо того чтоб подумать и написать один из предложенных мной выше вариантов.)
    Ну по крайней мере теперь ты знаком с профессиональным термином костыль и как его применение выглядит в коде.)
    Ответ написан
    5 комментариев
  • Разница в силе тока у зарядки ноутбука?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    Нет, не является. Зарядное устройство для ноутбука стабилизирует по напряжению, а не по току, поэтому оно будет, в рамках своих возможностей, давать столько тока, сколько берет ноутбук.
    Ответ написан
    Комментировать
  • Почему includes у массива сначала возвращает true, потом false?

    steff
    @steff Автор вопроса
    Спасибо, alexalexes. Дело было в типе данных. Первый раз функция вызывалась с конкретным номером страницы, аргументом которой было число. При последующих вызовах значение бралось из localStorage, путем преобразования в массив строковых элементов. Там-то и было несоответствие.
    Исправил всё не строки.
    Ответ написан
    Комментировать
  • Когда нужно писать имя таблицы в запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Каждый сам творец своего геморроя.

    Настоятельная рекомендация. Если источником записей запроса (всего, целиком) является только одна таблица - имена полей можно не указывать. Во всех остальных случаях - указывайте алиас таблицы для абсолютно каждого поля (включая имена обобщённых полей в USING и при NATURAL JOIN), кроме имён полей выходного набора, используемых в пост-группировочных выражениях. Это позволит гарантировать отсутствие неоднозначностей.

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

    ---

    В некоторых диалектах указание алиаса может быть обязательно и по причине интерференции имён из разных пространств.

    Например, в хранимых объектах MySQL при совпадении имени поля таблицы с именем локальной переменной обращение без указания алиаса - это всегда обращение к переменной. Поэтому для MySQL правило ещё строже - алиас указывай всегда.

    И даже такая строгость порой недостаточна. Пример. Обратите внимание на сортировку - в ней id интерпретируется как имя переменной, а не имя поля выходного набора, и потому результат "странный". Кстати, это тот случай, когда вообще ничто не поможет, кроме использования выражения выходного поля вместо его имени.
    Ответ написан
    Комментировать
  • Как проверить вхождение даты в определённый диапазон?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Перевести дату в стандартный формат YYYY-MM-DD или в unix timestamp, потом обычным сравнением.
    Ответ написан
    Комментировать