• Время модерации для статьи в песочнице?

    Как правило, небольшие публикации обрабатываются в течение пары дней, большие статьи могут проверяться неделю или даже дольше — наберитесь терпения и не терроризируйте службу поддержки.
    https://habr.com/ru/docs/help/sandbox/
    Ответ написан
  • Почему показывает readme файл на github Page?

    На втором скриншоте вместо / (root) нужно выбрать /public.
    Документация

    Вообще, я ими никогда не пользовался, но судя по документации, они вообще поддерживают только Markdown: https://docs.github.com/en/pages/quickstart
    И readme.md как раз является аналогом index.html.
    Ответ написан
    Комментировать
  • Изменять пропорции аватара на стороне фронта или несколько размеров на стороне бэка?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Для такого маленького изображения я бы передавал только самый большой вариант.

    Экономия с точки зрения пользователя тут будет лишь в том случае, если везде используется 40*40, и, например, только в редакторе профиля показывается 100*100. Тогда люди в 99% случаев не будут качать лишние пиксели. Но их объём настолько мал, что заморачиваться нет смысла.
    Если же разные размеры используются повсеместно, то, делая три отдельных изображения, вы увеличите объём трафика на 21%, т.е. сделаете хуже и себе, и пользователю.
    Ответ написан
    2 комментария
  • Вывод только уникальных значений массива?

    Вы хотите чего-то странного. У вас есть регионы, к региону привязано несколько городов (если бы город был один, то не было бы дублей). Что вы в таком случае хотите видеть в data-city для каждого региона?
    Я понимаю, когда делают наоборот: выводят города и для каждого ещё сохраняют его регион, чтобы потом как-то эти данные обрабатывать. А вот какой сценарий у вас мне совершенно непонятно.

    Предположим, туда нужно передать все города региона. Тогда код будет таким:
    $locations = [];
    $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "PREVIEW_PICTURE", "PROPERTY_*");
    $arFilter = Array("IBLOCK_ID"=>1);
    $res = CIBlockElement::GetList(Array(), $arFilter, $arSelect);
    while ($ob = $res->GetNextElement()) {
        $arProps = $ob->GetProperties();
        $region = $arProps['REGION']['VALUE'];
        $city = $arProps['CITY']['VALUE'];
    
        if (!array_key_exists($region, $locations)) {
            $locations[$region] = [];
        }
    
        if (!in_array($city, $locations[$region], true)) {
            $locations[$region][] = $city;
        }
    }
    
    <? foreach ($locations as $region => $cities): ?>
        <option value="<?=$region?>" data-cities="<?=implode('|', $cities)?>">
            <?=$region?>
        </option>
    <? endforeach; ?>
    Ответ написан
  • Как настроить prettier для html чтоб не закрывал одиночные тэги?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега HTML
    Ответ написан
    Комментировать
  • Для чего Laravel-разработчики стремятся создать избыточные API ресурсы?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    если нет никакой дополнительной обработки, то ведь можно просто сделать $model->toArray()?
    Можно, но а) тогда какие-то контроллеры будут возвращать массив, а какие-то ресурс и б) когда дополнительная обработка понадобится, нужно будет искать в коде все эти $model->toArray() и заменять их на ресурс.
    Проще сразу сделать "правильно", несмотря на то, что это "избыточно" - это и называется архитектурой кода.

    P.S. Но лично мне ларавелевские ресурсы не нравятся своей перемудрёностью и я использую простые DTO для этих целей.
    Ответ написан
    Комментировать
  • Где хранить "избранное" юзера?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Я для решения аналогичной задачи сделал api-роут, в котором проверяется авторизация - если пользователь авторизован, то запрос проксируется на бэкенд, если не авторизован, то идёт работа с локальной сессией.
    Ну а на клиенте просто в компоненте кнопки добавления в избранное через RTK-Query запрашивается id всех товаров из избранного через этот роут.
    Ответ написан
    5 комментариев
  • Названия в классов: я могу раздавать их рандомно или есть некая традиция, игнорирование которой считается плохим тоном?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    В программировании есть традиция давать сущностям понятные имена.

    При этом, что такое "понятное имя", каждая команда договаривается самостоятельно. Кто-то пишет только на грамотном английском, кто-то использует колхозную транслитерацию. Один и тот же элемент на разных проектах может называться по-разному, потому что у них разная предметная область (например, menu/navigation). И так далее.

    Дополнительно, существуют и схемы наименования, самая популярная - БЭМ.

    С точки зрения же механики, браузеру совершенно всё равно, что написано у вас в классах (за исключением небольших технических ограничений, описанных в спецификации).
    Ответ написан
    Комментировать
  • Почему целесообразнее не использовать new для работы с классами, а предпочесть DI?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вот почему: PHPunit замокать класс внутри тестируемого класса?
    Бонус-раунд: DI упрощает работу с зависимостями зависимостей. Если ваш MyService принимает какой-нибудь логер в зависимостях, который в свою очередь ожидает какой-нибудь драйвер файловой системы, вы задолбаетесь собирать их через new.
    Ответ написан
    Комментировать
  • Как снять башенный кулер?

    Крепления башенных кулеров обычно располагаются с обратной стороны материнской платы. Нужно либо её снять, либо открыть заднюю стенку, если корпус позволяет.
    Ответ написан
    Комментировать
  • Почему в JS неправильно выполняются условия?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вариантов развития событий два:
    1. Вы используете неверное сравнение. Например, у вас в target.innerHTML есть пробелы по краям, или какие-то теги, или не совпадает регистр.
    2. Условие срабатывает верно, но поскольку вы меняете стиль одного и того же элемента, вы не учитываете предыдущие или последующие итерации.


    Сделайте пример в песочнице и мы вас скажем точно, в чём проблема.
    Ответ написан
    2 комментария
  • Tailwind не перетирает предыдущие стили на других(больших) медиазапросах, что не так?

    Я, конечно, в вопросах Tailwind мимокрокодил, потому что у меня от его вида волосы на разных местах шевелятся, но у вас проблема явно в том, что не применяются медиа-запросы. Скорее всего, это связано с тем, что у вас после модификатора пробел стоит. Т.е. должно быть так:
    -sm: text-[200px]
    +sm:text-[200px]

    В вашем варианте, с точки зрения браузера, HTML и CSS, два разных класса, не имеющих никакого отношения друг к другу.

    Ну а в остальном всё так и есть - браузеру неважно, в каком порядке указаны классы в HTML, он руководствуется только порядком в CSS файле, где более поздние правила перевешивают предыдущие с аналогичной специфичностью.
    Ответ написан
    1 комментарий
  • Есть ли метод в JS, чтобы подсунуть дату в требуемом формате для парсинга?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Метода нет, но полно библиотек, которые это делают. Но можно и самостоятельно вот к такой простой конструкции привести исходную строку: +new Date('2024', +'02' - 1, '01') / 1000.

    Почему строку нужно предварительно разбить на части
    Потому что парсинг всей строки зависит от локали пользователя и результат может быть неожиданным:
    65bb4cedc4dc6827351618.png
    Ответ написан
    Комментировать
  • Почему не делают табы радио-кнопками?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега HTML
    Семантично делать их ссылками.
    Радио-кнопки предполагают наличие формы, оборачивать табы в форму нелогично, так что вам кажется неправильно.
    Ответ написан
    5 комментариев
  • Как на PHP реализовать светофор?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Никакой интервал тут не нужен, достаточно знать точку отсчёта и стартовое состояние (у вас про них ничего не сказано, но за стартовое состояние по условию можно засчитать зелёный) и использовать простейшую математику, чтобы вычислить текущий сигнал.
    Хотя, если под вводимыми минутами понимается не таймстамп, а количество, прошедшее со времени включения, то в задаче есть все вводные для её решения элементарным алгоритмом.
    А сделать интерактивную смену на php вы всё равно не сможете*.

    *ну, есть, конечно, костыль с meta-тегом refresh, но это уже не про php.
    Ответ написан
    Комментировать
  • Как изменить переменную в массивоподобном объекте JS?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Никак, вы чего-то очень странного хотите. Квадратные скобки используются для работы с объектом (получение или изменение значений его свойств), через них никак нельзя изменить значение переменной, которую вы в скобках используете.
    Если вы хотите получить «50», то это делается так: info['10']['5'][propName]
    Ответ написан
  • Как залить на composer новый fork git проекта?

    Loading a package from a VCS repository
    There are a few use cases for this. The most common one is maintaining your own fork of a third party library. If you are using a certain library for your project, and you decide to change something in the library, you will want your project to use the patched version. If the library is on GitHub (this is the case most of the time), you can fork it there and push your changes to your fork. After that you update the project's composer.json. All you have to do is add your fork as a repository and update the version constraint to point to your custom branch. In composer.json only, you should prefix your custom branch name with "dev-" (without making it part of the actual branch name). For version constraint naming conventions see Libraries for more information.

    Example assuming you patched monolog to fix a bug in the bugfix branch:
    {
        "repositories": [
            {
                "type": "vcs",
                "url": "https://github.com/igorw/monolog"
            }
        ],
        "require": {
            "monolog/monolog": "dev-bugfix"
        }
    }
    https://getcomposer.org/doc/05-repositories.md#loa...

    как залить на composer
    Если вы под этим понимаете Packagist, то инструкция находится прямо на главной странице:
    Define Your Package
    Put a file named composer.json at the root of your package's repository, containing this information:
    {
        "name": "your-vendor-name/package-name",
        "description": "A short description of what your package does",
        "require": {
            "php": ">=8.2",
            "another-vendor/package": "1.*"
        }
    }

    This is the strictly minimal information you have to give.

    For more details about package naming and the fields you can use to document your package better, see the about page.

    Validate The File
    Run composer validate to check that your file has no syntax errors.

    Commit The File
    Add the composer.json to your git or other VCS repository and commit it.

    Publish It
    Log in or register on this site, then hit the submit button in the menu.

    Once you entered your public repository URL in there, your package will be automatically crawled periodically. You just have to make sure you keep the composer.json file up to date.
    Ответ написан
    Комментировать
  • Почему консоль выводит это значение?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вы пытаетесь в качестве имени свойства использовать объект, а JS разрешает там только строки.
    Объект приводится к строке и ваш код превращается в итоге вот в это:
    dwayne['[object Object]'] = 123;
    dwayne['[object Object]'] = 456;
    
    console.log(dwayne['[object Object]']);

    Думаю, тут уже понятно, почему результат именно такой.

    При этом, если бы вы использовали другой синтаксис, то и результат был бы другим:
    dwayne.daniel = 123; // аналог dwayne['daniel']
    dwayne.jason = 456; // аналог dwayne['jason']
    
    console.log(dwayne.daniel);

    Но эти daniel и jason никак не связаны с одноимёнными объектами выше.
    Ответ написан
    1 комментарий